14.5、redis-sentinel高可用

1、redis主从同步配置:

(0)主机配置:


服务器名称


ip地址


实例6379


实例6380


实例6381


controller-node1


172.16.1.90




(1)确定主从:

1)将redis 6379实例确定为redis主服务器;

修改redis 6379的"/data/6379/redis.conf"参数如下:

requirepass root

#redis安全保护模式认证密码设置为root;

2)将redis 6380实例和redis 6381实例确定为redis从服务器;

修改redis 6380和redis 6381实例的redis.conf文件,修改参数如下:

vim /data/6380/redis.conf | vim /data/6381/redis.conf

requirepass root

#redis安全保护模式认证密码设置为root;

replicaof 172.16.1.90 6379

#设置主从同步主库的ip和端口号;

masterauth root

#设置主从同步主库的密码;

(2)启动redis:

for nu in 79 80 81;do /data/63$nu/redis.sh start;done

START REDIS [ 确定 ]

START REDIS [ 确定 ]

START REDIS [ 确定 ]

netstat -tunlp | grep -E "6379|6380|6381"

tcp 0 0 172.16.1.90:6379 0.0.0.0:* LISTEN 1894/redis-server 1

tcp 0 0 172.16.1.90:6380 0.0.0.0:* LISTEN 1906/redis-server 1

tcp 0 0 172.16.1.90:6381 0.0.0.0:* LISTEN 1918/redis-server 1

(3)验证:

1)主6379实例:

172.16.1.90:6379> info replication

# Replication

role:master

connected_slaves:2

slave0:ip=172.16.1.90,port=6381,state=online,offset=364,lag=0

slave1:ip=172.16.1.90,port=6380,state=online,offset=364,lag=1

172.16.1.90:6379> set lc1 1

OK

172.16.1.90:6379> keys *

1) "lc1"

2)从6380实例:

172.16.1.90:6380> info replication

# Replication

role:slave

master_host:172.16.1.90

master_port:6379

master_link_status:up

172.16.1.90:6380> keys *

1) "lc1"

3)从6381实例:

172.16.1.90:6381> info replication

# Replication

role:slave

master_host:172.16.1.90

master_port:6379

master_link_status:up

172.16.1.90:6381> keys *

1) "lc1"

2、redis主从同步手动切换主从:

(1)关闭主redis 6379实例:

172.16.1.90:6379> shutdown

not connected>

172.16.1.90:6380> info replication

# Replication

role:slave

master_host:172.16.1.90

master_port:6379

master_link_status:down

172.16.1.90:6381> info replication

# Replication

role:slave

master_host:172.16.1.90

master_port:6379

master_link_status:down

(2)将redis 6380实例提升为主:

172.16.1.90:6380> slaveof no one

OK

删除"/data/6380/redis.conf"文件的参数为"replicaof 172.16.1.90 6379";

(3)修改redis 6381实例指向新的主:

172.16.1.90:6381> slaveof 172.16.1.90 6380

OK

修改"/data/6381/redis.conf"文件的参数为"replicaof 172.16.1.90 6380";

(4)验证:

1)redis 6380实例:

172.16.1.90:6380> info replication

# Replication

role:master

connected_slaves:1

slave0:ip=172.16.1.90,port=6381,state=online,offset=1102,lag=0

2)redis 6381实例:

172.16.1.90:6381> info replication

# Replication

role:slave

master_host:172.16.1.90

master_port:6380

master_link_status:up

(5)修复redis 6379实例:

修改"/data/6379/redis.conf"文件的参数为"replicaof 172.16.1.90 6380、masterauth root"

重启redis 6379实例,该实例就加入到了主从复制的集群中了;

3、redis主从同步自动切换主从:

将环境恢复到未手动切换主从前一步;

修改redis 6379实例"/data/6379/redis.conf"文件的参数为"masterauth root",并重启redis 6379实例;

(1)redis sentinel介绍:

redis sentinel是redis官方推荐的高可用解决方案,当用redis做master-slave的高可用方案时,加入master宕机了,reids本

身(包括它的很多客户端)都没有实现主备切换,而redis-sentinel本身也是一个独立运行的进程,它能监控多个master-slave集

群,发现master宕机后能进行自动切换,实际上这意味着你可以使用Sentinel模式创建一个可以不用人为干预而应对各种故障

的Redis部署。

(2)功能:

1)监控:

Sentinel不断的检查master和slave是否正常的运行;

2)通知:

如果发现某个redis节点运行出现问题,可以通过API通知系统管理员和其他的应用程序;

3)自动故障转移:

能够进行自动切换。当一个master节点不可用时,能够选举出master的多个slave中的一个来作为新

的master,其它的slave节点会将它所追随的master的地址改为被提升为master的slave的新地址,sentinel会

修改相应redis实例的redis.conf文件添加或删除"replicaof <master-IP> <master-port>"配置;

4)配置提供者:

哨兵作为Redis客户端发现的权威来源,客户端连接到哨兵请求当前可靠的master的地址,如果发生故

障,哨兵将报告新地址;

5)sentinel的分布式特性:

很显然,只使用单个sentinel进程来监控redis集群是不可靠的,当sentinel进程宕掉后(sentinel本身也

有单点问题,single-point-of-failure)整个集群系统将无法按照预期的方式运行。所以有必要使用sentinel

集群,这样有几个好处:即使有一些sentinel进程宕掉了,依然可以进行redis集群的主备切换;如果只有

一个sentinel进程,如果这个进程运行出错,或者是网络堵塞,那么将无法实现redis集群的主备切换

如果有多个sentinel,redis的客户端可以随意地连接任意一个sentinel来获得关于redis集群中的信息。

6)sentinel的自动发现机制:

A、sentinel集群中各个sentinel都互相连接彼此来检查对方的可用性以及互相发送消息;

B、不需要在sentinel中配置某个master的所有slave的地址,sentinel会通过询问master来得到这些slave的地址的;

C、每个sentinel发送的消息中也包含了其当前维护的最新的master配置,如果某个sentinel发现自己的配置版本低于接收到的配

置版本,则会用新的配置更新自己的master配置;

D、当检测到了新的sentinel,则将其加入到自身维护的master监控列表中;

7)通常使用sentinel集群(每个redis实例设置一个sentinel)监控reids集群;

(3)配置:

1)复制编译包中的sentinel.conf文件到各个redis实例的目录:

sed -ri.bak "/#|^$/d" /application/redis/sentinel.conf

for nu in 79 80 81;do cp -a /application/redis/sentinel.conf /data/63$nu/;done

2)修改各个参数:

A、实例6379:

vim /data/6379/sentinel.conf

bind 172.16.1.90

port 26379

daemonize yes

pidfile "/data/6379/redis-sentinel.pid"

logfile "/data/6379/redis-sentinel.log"

dir "/tmp"

sentinel monitor mymaster 172.16.1.90 6379 2

sentinel auth-pass mymaster root

sentinel parallel-syncs mymaster 1

sentinel down-after-milliseconds mymaster 30000

sentinel failover-timeout mymaster 180000

sentinel deny-scripts-reconfig yes

B、实例6380:

vim /data/6380/sentinel.conf

bind 172.16.1.90

port 26380

daemonize yes

pidfile "/data/6380/redis-sentinel.pid"

logfile "/data/6380/redis-sentinel.log"

dir "/tmp"

sentinel monitor mymaster 172.16.1.90 6379 2

sentinel auth-pass mymaster root

sentinel parallel-syncs mymaster 1

sentinel down-after-milliseconds mymaster 30000

sentinel failover-timeout mymaster 180000

sentinel deny-scripts-reconfig yes

C、实例6381:

vim /data/6381/sentinel.conf

bind 172.16.1.90

port 26381

daemonize yes

pidfile "/data/6381/redis-sentinel.pid"

logfile "/data/6381/redis-sentinel.log"

dir "/tmp"

sentinel monitor mymaster 172.16.1.90 6379 2

sentinel auth-pass mymaster root

sentinel parallel-syncs mymaster 1

sentinel down-after-milliseconds mymaster 30000

sentinel failover-timeout mymaster 180000

sentinel deny-scripts-reconfig yes

D、参数说明:

cat /data/6379/sentinel.conf

bind 172.16.1.90

#绑定的ip;

port 26379

#sentinel监听的端口号;

daemonize yes

#sentinel以守护进程的方式运行;

pidfile /data/6379/redis-sentinel.pid

#sentinel以守护进程运行生成的pid文件路径;

logfile /data/6379/redis-sentinel.log

#sentinel日志文件;

dir /tmp

#进程工作的目录;

sentinel monitor mymaster 172.16.1.90 6379 2

#######################################################

#指定监控的master,2表示要2个sentinel认为redis

#主实例宕机才有效;

#######################################################

sentinel auth-pass mymaster root

#连接redis验证密码,该密码和redis.cof中配置的安全验证密码一致;

sentinel down-after-milliseconds mymaster 30000

#超过30000毫秒(30s)后认为redis主实例宕机;

sentinel parallel-syncs mymaster 1

########################################################

#发生主备切换时有1个slave同时对新的master进行同步,通常

#将这个值设为1来保证每次只有一个slave 处于不能处理命令请

#求的状态;

#########################################################

sentinel failover-timeout mymaster 180000

#当主从切换超过180000毫秒(180s)后认为主从切换失败;

sentinel deny-scripts-reconfig yes

#########################################################

#不允许使用SENTINEL SET设置notification-script和

#client-reconfig-script;

#########################################################

(4)配置sentinel脚本文件:

vim /data/6379/sentinel.sh

#!/bin/sh

. /etc/init.d/functions

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

IP="172.16.1.90"

PORT="6379"

SENTINEL_PORT="26379"

SENTINEL_HOME="/application/redis/src/redis-sentinel"

CONFIG="/data/$PORT/sentinel.conf"

SENTINEL_ADMIN="redis-cli -h $IP -p ${SENTINEL_PORT}"

SENTINEL_PID="/data/$PORT/redis-sentinel.pid"

[ $UID -eq 0 ] || {

echo "please use root"

exit 1

}

function usage (){

echo "USAGE:sh $0 |start|stop|restart|"

}

RETVAL=0

function check() {

RETVAL="$?"

if [ $RETVAL -eq 0 ]; then

action "$1" /bin/true

else

action "$1" /bin/false

fi

}

function start() {

if [ -f ${SENTINEL_PID} ]; then

echo "SENTINEL_${SENTINEL_PORT} IS RUNNIG......"

else

${SENTINEL_HOME} $CONFIG

check "START SENTINEL_${SENTINEL_PORT}"

fi

}

function stop() {

if [ -f ${SENTINEL_PID} ]; then

${SENTINEL_ADMIN} shutdown &>/dev/null

check "STOP SENTINEL_${SENTINEL_PORT}"

else

echo "SENTINEL_${SENTINEL_PORT} IS STOP......"

fi

}

function main(){

if [ $# -eq 1 ]; then

case "$1" in

start)

start

sleep 2

;;

stop)

stop

sleep 2

;;

restart)

stop

start

;;

*)

usage

;;

esac

else

usage

fi

}

main $*

chmod u+x sentinel.sh

说明:仿照上面的脚本,完成redis 6380实例、redis 6381实例的sentinel脚本;

(5)启动各个sentinel实例:

for nu in 79 80 81;do /data/63$nu/sentinel.sh start;done

netstat -tunlp | egrep "26379|26380|26381"

tcp 0 0 172.16.1.90:26379 0.0.0.0:* LISTEN 2475/redis-sentinel

tcp 0 0 172.16.1.90:26380 0.0.0.0:* LISTEN 2477/redis-sentinel

tcp 0 0 172.16.1.90:26381 0.0.0.0:* LISTEN 2485/redis-sentinel

(6)验证:

1)关闭主redis 6379实例:

172.16.1.90:6379> shutdown

not connected>

2)通过sentinel日志查看主从接替过程:

tailf /data/6380/redis-sentinel.log

2673:X 17 May 2019 23:21:03.206 * +slave slave 172.16.1.90:6380 172.16.1.90 6380 @ mymaster 172.16.1.90 6379

2673:X 17 May 2019 23:21:33.363 * +slave slave 172.16.1.90:6381 172.16.1.90 6381 @ mymaster 172.16.1.90 6379

2673:X 17 May 2019 23:26:45.840 # +sdown master mymaster 172.16.1.90 6379

2673:X 17 May 2019 23:26:45.907 # +new-epoch 1

2673:X 17 May 2019 23:26:45.909 # +vote-for-leader 73b994f2ff6ab006c450f8c5662861ab90ee1c04 1

2673:X 17 May 2019 23:26:45.911 # +odown master mymaster 172.16.1.90 6379 #quorum 2/2

2673:X 17 May 2019 23:26:45.911 # Next failover delay: I will not start a failover before Fri May 17 23:32:46 2019

2673:X 17 May 2019 23:26:46.384 # +config-update-from sentinel 73b994f2ff6ab006c450f8c5662861ab90ee1c04 172.16.1.90 26381 @ mymaster 172.16.1.90 6379

2673:X 17 May 2019 23:26:46.384 # +switch-master mymaster 172.16.1.90 6379 172.16.1.90 6381

2673:X 17 May 2019 23:26:46.385 * +slave slave 172.16.1.90:6380 172.16.1.90 6380 @ mymaster 172.16.1.90 6381

2673:X 17 May 2019 23:26:46.385 * +slave slave 172.16.1.90:6379 172.16.1.90 6379 @ mymaster 172.16.1.90 6381

2673:X 17 May 2019 23:27:16.424 # +sdown slave 172.16.1.90:6379 172.16.1.90 6379 @ mymaster 172.16.1.90 6381

3)查看主从信息:

A、redis 6380实例:

172.16.1.90:6380> info replication

# Replication

role:slave

master_host:172.16.1.90

master_port:6381

master_link_status:up

B、redis 6381实例:

172.16.1.90:6381> info replication

#Replication

role:master

connected_slaves:1

slave0:ip=172.16.1.90,port=6380,state=online,offset=974710,lag=1

(7)将redis 6379实例启动:

启动redis 6379实例后,sentinel 3个运行进程中的一个会在"/data/6379/redis.conf"配置文件最后一行

追加"replicaof 172.16.1.90 6381" 配置,然后重启redis 6379实例,这样redis 6379实例就会被加入到集

群中作从服务器;

(8)sentinel命令:

1)SENTINEL get-master-addr-by-name <master name>:

返回给定名字的主服务器的 IP 地址和端口号。

例:

[[email protected] ~]# redis-cli -h 172.16.1.90 -p 26380

172.16.1.90:26380> sentinel get-master-addr-by-name mymaster

1) "172.16.1.90"

2) "6381"

2)PING :

返回 PONG;

3)SENTINEL masters:

列出所有被监视的主服务器,以及这些主服务器的当前状态;

4)SENTINEL master <master name>:

显示指定master的信息和状态;

5)SENTINEL slaves <master name>:

列出给定主服务器的所有从服务器,以及这些从服务器的当前状态;

6)SENTINEL reset <pattern>:

重置所有名字和给定模式 pattern 相匹配的主服务器。 pattern 参数是一个 Glob 风格的模式。 重置

操作清楚主服务器目前的所有状态, 包括正在执行中的故障转移, 并移除目前已经发现和关联的, 主

服务器的所有从服务器和 Sentinel;

7)SENTINEL failover <master name>:

当主服务器失效时, 在不询问其他 Sentinel 意见的情况下, 强制开始一次自动故障迁移(不过发起故障转

移的 Sentinel 会向其他 Sentinel 发送一个新的配置,其他 Sentinel 会根据这个配置进行相应的更新);

3、将redis和sentinel脚本加入开机自启动:

chmod +x /etc/rc.d/rc.local

vim /etc/rc.d/rc.local

/data/6379/redis.sh start &>/dev/null

/data/6380/redis.sh start &>/dev/null

/data/6381/redis.sh start &>/dev/null

/data/6379/sentinel.sh start &>/dev/null

/data/6380/sentinel.sh start &>/dev/null

/data/6381/sentinel.sh start &>/dev/null

加入开机自启动在启动的时候可能由于主节点不能及时启动,可能导致主节点转换,但这都不是问题,

sentinel能做好任何故障的转移,除了sentinel选举票数(宕机较多)不够;

4、sentinel模式下主从同步集群扩容:

以redis 6381实例为主库为例;

(1)建立新的redis 6382实例:

mkdir -p /data/6382/

cp -a /data/6379/sentinel.conf /data/6382/

cp -a /data/6379/sentinel.sh /data/6382/

cp -a /data/6379/redis.conf /data/6382/

cp -a /data/6379/redis.sh /data/6382/

(2)修改sentinel.sh、redis.conf、redis.sh文件的参数为对应实例的端口号和路径并确保sedis.conf配置文件中

有以下参数:

requirepass root

#redis安全保护模式认证密码设置为root;

replicaof 172.16.1.90 6381

#设置主从同步主库的ip和端口号;

masterauth root

#设置主从同步主库的密码;

(3)修改sentinel.conf的配置文件指向新的主:

bind 172.16.1.90

port 26382

daemonize yes

pidfile "/data/6382/redis-sentinel.pid"

logfile "/data/6382/redis-sentinel.log"

dir "/tmp"

sentinel monitor mymaster 172.16.1.90 6381 2

sentinel auth-pass mymaster root

sentinel parallel-syncs mymaster 1

sentinel down-after-milliseconds mymaster 30000

sentinel failover-timeout mymaster 180000

sentinel deny-scripts-reconfig yes

(4)将新的redis 6382实例加入到开机自启动即可;

5、小结:

(1)集群有密码验证的情况下每个redis实例必须要有的参数:

requirepass root

#redis安全保护模式认证密码设置为root;

masterauth root

#设置主从同步主库的密码;

哪个redis实例为主,哪个redis实例为从,由sentinel选举,然后在各个实例redis.conf文件中增删

replicaof <master ip> <master prot>参数来决定;

(2)从节点的只读是默认的(是对从节点的一种保护,有助于主从的一致性),但是需要在redis 实例的

redis.conf文件中设置replicaof <master ip> <master prot>参数从节点只读才能生效;

(3)redis主从同步是实时异步增量同步;

原文地址:https://www.cnblogs.com/LiuChang-blog/p/12321317.html

时间: 2024-10-27 11:24:48

14.5、redis-sentinel高可用的相关文章

Redis Sentinel 高可用实现说明

背景:      前面介绍了Redis 复制.Sentinel的搭建和原理说明,通过这篇文章大致能了解Sentinel的原理和实现方法以及相关的搭建.这篇文章就针对Redis Sentinel的搭建做下详细的说明. 安装:      这里对源码编译进行一下说明,本文实例的操作系统是Ubuntu16.04,使用Redis的版本是3.2.0.安装步骤如下: 下载源码包:wget http://download.redis.io/releases/redis-3.2.0.tar.gz 安装依赖包:su

Redis Sentinel高可用架构

Redis目前高可用的架构非常多,比如keepalived+redis,redis cluster,twemproxy,codis,这些架构各有优劣,今天暂且不说这些架构,今天主要说说redis sentinel高可用架构. 它的主要功能有以下几点 不时地监控redis是否按照预期良好地运行; 如果发现某个redis节点运行出现状况,能够通知另外一个进程(例如它的客户端); 能够进行自动切换.当一个master节点不可用时,能够选举出master的多个slave(如果有超过一个slave的话)中

Redis+sentinel 高可用实践

1.环境规划 10.213.50.138(主) redis+sentinel 10.213.50.168(从) redis+sentinel 10.213.50.227  作为客户端测试插入数 2.redis部署 wget http://download.redis.io/releases/redis-3.2.9.tar.gz tar zxvf redis-3.2.9.tar.gz cd redis-3.2.9 make && make install cd utils/ ./instal

Redis Sentinel高可用配置及C#访问

本文环境如下: 操作系统:ubuntu-14.04.1-desktop-amd64 Redis:2.8.19 如果使用虚拟机则将每台的网络设置为桥接,否则他们之间能连上,局域网连不上. 系统设计如图: 一.安装Redis 可以参考之前文章,采用离线安装,本次以Sentinel配置为重,所以以联网安装为例. 呼出ubuntu终端,依次执行下面命令: wget http://download.redis.io/releases/redis-2.8.19.tar.gz tar xzf redis-2.

redis sentinel 高可用集群

redis是目前比较火爆的nosql开源软件.他因为丰富的数据类型和每秒80k+的速度对有高并发,大访问量要求的应用场景是很好的选择.我用redis主要用来做数据的cache.以及分布式系统中session的集中存储.为了解决redis的单点故障,提高redis的可靠性,以前的做法是用Keepalived来控制虚IP的浮动,来进行热备.随着redis2.8和3.0版本的诞生.目前官网支持sentinel模式的热备,sentinel是哨兵,不断监听目前redis的存活状态.整体采用一主多备的模式.

redis 系列25 哨兵Sentinel (高可用演示 下)

一. Sentinel 高可用环境准备 1.1 Sentinel 集群环境 环境 说明 操作系统版本 CentOS  7.4.1708  IP地址 172.168.18.200 网关Gateway 172.168.18.1 DNS 172.168.16.11 三个sentinel服务端口 26379,26380,26381 Sentinel密码 无 不设置 是否RDB持久化 不支持 是否 AOF持久化 不支持 1.2 Redis主库库环境,主从库搭建在(redis 系列22 复制Replicat

Redis Sentinel安装与部署,实现redis的高可用

前言 对于生产环境,高可用是避免不了要面对的问题,无论什么环境.服务,只要用于生产,就需要满足高可用:此文针对的是redis的高可用. 接下来会有系列文章,该系列是对spring-session实现分布式集群session的共享的完整阐述,同时也引伸出缓存的实现:而此篇是该系列的第一篇. github地址:https://github.com/youzhibing/redis 环境准备 redis版本:redis-3.0.0 linux:centos6.7 ip:192.168.11.202,

部署redis主从高可用集群

部署redis主从高可用集群本文部署的redis集群是一主一从,这两台服务器都设置了哨兵进程,另外再加一台哨兵做仲裁,建议哨兵数量为基数172.16.1.187    redis主+哨兵172.16.1.188    redis从+哨兵172.16.1.189    哨兵以上系统均为CentOS6 在187,188,189上部署redis过程如下:(1)redis使用编译安装方式,所以需要安装编译基本组件# yum -y install gcc gcc-c++ make cmake cpp gl

基于keepalived对redis做高可用配置---转载

关于keepalived的详细介绍,请移步本人相关博客:http://wangfeng7399.blog.51cto.com/3518031/1405785 功能 ip地址 安装软件 主redis 10.13.6.13 redis,keepalived 从redis 10.13.6.16 redis,keepalived VIP 10.13.6.17   一.redis主从搭建 1.redis安装 本文通过yum源的安装方式来安装(需要配置epel源),也可以通过源码编译的方式来安装 1 2 [

Redis的高可用(使用篇)

Redis的复制解决了单点问题,但主节点若出现故障,则要人工干预进行故障转移.先看看1主2从(master,slave-1和slave-2)的Redis主从模式下,如何进行故障转移的. 1. 主节点发生故障后,客户端连接主节点失败,两个从节点与主节点连接失败造成复制中断. 2. 需要选出一个从节点(slave-1),对其执行slaveof no one命令使其成为新的主节点(new-master). 3. 从节点(slave-1)成为新的主节点后,更新应用方的主节点信息,重新启动应用方. 4.