redis-一主二从三哨兵
Redis缓存服务采用Master-Slaver模式,Master节点负责读写操作,Slaver节点负责从Master节点上做Replication的复制。Master和Slaver节点分别部署在不同主机上,组成一组Redis服务。Redis组内采用Redis官方提供的Sentinel(哨兵)机制做failover,通过sentinel模式启动redis后,自动监控master/slave的运行状态,基本原理是:心跳机制+投票裁决。
基于Sentinel的主从切换方案,Sentinel用于管理多个Redis服务器实例,主要负责三个方面的任务:
1. 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。每个sentinel会向其它sentinal、master、slave定时发送消息,以确认对方是否“活”着,如果发现对方在指定时间(可配置)内未回应,则暂时认为对方已挂(所谓的“主观认为宕机” Subjective Down,简称SDOWN)。若“哨兵群”中的多数sentinel,都报告某一master没响应,系统才认为该master"彻底死亡"(即:客观上的真正down机,Objective Down,简称ODOWN)。
2. 提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
3. 自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会通过一定的vote算法,从失效主服务器的其中一个从服务器升级为新的主服务器, 并自动修改相关配置,让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。当失效的Master恢复后,Redis Sentinel会自动识别,将Master自动转换为Slave并完成数据同步。通过Redis Sentinel可以实现Redis零手工干预并且短时间内进行M-S切换,减少业务影响时间。
1.1.1.1 Redis Sentinel 安装配置
对于一组主备redis,将配置启动三个哨兵对其进行监控,以下是详细配置步骤:
先解压的安装
tar -zxvf ***.tar.gz
make
1>10.45.47.35 masterRedis.conf
先在redis根目录下创建conf子目录,把默认的redis.conf文件复制进来,重命名为redis-6379.conf,并修改以下配置信息:
|
##redis-6379.conf ##redis-35-M,默认为master bind 192.168.1.187 -------(需要修改) port 6379 ----------------(需要修改) protected-mode yes --------(需要修改) ## daemonize默认为no daemonize no ---------(不需要修改) ##Redis 默认pid 文件位置redis.pid,当运行多个 redis 服务时,需要指定不同的 pid 文件和端口 pidfile redis-35-M.pid -(需要修改) ## 设置密码 requirepass ZTE$soft987 -(需要修改) |
2>10.45.47.36 slaverRedis.conf
(备份主机配置,如果是单台机器,多个哨兵,此文件不需要)
先在redis根目录下创建conf子目录,把默认的redis.conf文件复制进来,重命名为redis-6379.conf,并修改以下配置信息:
|
##redis.conf ##redis-36-S,Slave bind 192.168.1.187 -------(需要修改) port 6379 -------(需要修改) ##Redis 默认pid 文件位置redis.pid,当运行多个 redis 服务时,需要指定不同的 pid 文件和端口 pidfile redis-36-S.pid -------(需要修改) ##从节点需要设置主节点的验证密码,否则会注册不了 masterauth "ZTE$soft6391" -------(需要修改) ##启用增量(Master禁用) appendonly yes -------(需要修改) ##设置该数据库为其他数据库的从数据库,主库无需设置,如果自动切换了主从节点,会消失 slaveof 10.45.47.35 6379 -------(需要修改) ##-----------其他配置和master保持一致-----------## |
3>10.45.47.35 sentinel.conf
先在redis根目录下创建conf子目录,把默认的sentinel.conf文件复制进来,重命名为sentinel-16379.conf,并修改以下配置信息:
|
##sentinel-16379.conf ##sentinel实例之间的通讯端口 port 16379 ------(需要修改) protected-mode no-----(需要新增) ##显示监控master节点10.45.47.35,master节点使用端口6379,最后一个数字表示投票需要的"最少法定人数",比如有10个sentinal哨兵都在监控某一个master节点,如果需要至少6个哨兵发现master挂掉后,才认为master真正down掉,那么这里就配置为6,最小配置1台master,1台slave,在二个机器上都启动sentinal的情况下,哨兵数只有2个,如果一台机器物理挂掉,只剩一个sentinal能发现该问题,所以这里配置成1,至于mymaster只是一个名字,可以随便起,但要保证下面使用同一个名字 sentinel monitor mymaster 10.45.47.35 6379 1 #认证主机密码(注意 密码必须放在sentinel monitor mymaster 之后 否则启动会报错) sentinel auth-pass mymaster ZE$soft987
##表示如果10s内mymaster没响应,就认为SDOWN sentinel down-after-milliseconds mymaster 10000 ##表示如果master重新选出来后,其它slave节点能同时并行从新master同步缓存的台数有多少个,显然该值越大,所有slave节点完成同步切换的整体速度越快,但如果此时正好有人在访问这些slave,可能造成读取失败,影响面会更广。最保定的设置为1,只同一时间,只能有一台干这件事,这样其它slave还能继续服务,但是所有slave全部完成缓存更新同步的进程将变慢。 sentinel parallel-syncs mymaster 1 ##表示如果15秒后,mysater仍没活过来,则启动failover,从剩下的slave中选一个升级为master sentinel failover-timeout mymaster 15000 |
4>10.45.47.36 sentinel.conf
先在redis根目录下创建conf子目录,把默认的sentinel.conf文件复制进来,重命名为sentinel-16379.conf,并修改以下配置信息:
|
##sentinel-16379.conf ##sentinel实例之间的通讯端口 port 16379 ##-----------其他配置和上面保持一致-----------## |
5>10.45.47.38 sentinel.conf
先在redis根目录下创建conf子目录,把默认的sentinel.conf文件复制进来,重命名为sentinel-26379.conf,并修改以下配置信息:
|
##sentinel-26379.conf ##sentinel实例之间的通讯端口 port 26379 ##-----------其他配置和上面保持一致-----------## |
以上是10.45.47.45作为主redis节点,10.45.47.36作为备redis节点的redis sentinel相关配置。
1.1.1.1.1 2启动与检测
1、启动 (先切换至redis根目录下)
##启动redis进
10.45.47.35/36机器--
nohup ./redis-server /redis/redis-3.2.12/redis6390.conf &
##启动sentinel组件
10.45.47.35/36/38机器--
nohup ./redis-sentinel /redis/redis-3.2.12/sentinel16390.conf & nohup ./redis-sentinel /redis/redis-3.2.12/sentinel26390.conf & nohup ./redis-sentinel /redis/redis-3.2.12/sentinel36390.conf &
登录:
./redis-cli -h 127.0.0.1 -p 6390
##如果配置了bind需要用以下的方法登录
./redis-cli -h 192.168.1.187 -p 6391 auth ZE$soft987(密码)
关闭redis
./redis-cli -h 127.0.0.1 -p 6390 shutdown
||
kill -9 (会导致数据丢失)
Mkdir tmp
/data/redis/src/redis-sentinel /data/redis/sentinel-16379.conf &

(对于一组Redis master和slave上都启用sentinel,及另外一台机器上再额外启动一个,即最终有三个哨兵)
redis-cli -p 16379 sentinel masters 可通过该命令查看当前的master节点情况
可通过该命令查看master地址,有几个slave,有几个监控
./redis-cli -p 16379 info

停掉上面的master节点,重新查看 可以看到address变了。证明成功
至此 安装完成。下面的步骤没有尝试
/data/redis/src/redis-cli -h 10.45.47.213 -p 6379 SET Hello Redis

2、检测
(1) 在master上,redis-cli -p 6379 shutdown ,手动把master停掉,tail -f nohup.out观察sentinel的输出:
/data/redis/src/redis-cli -p 6379 shutdown
|
[9427] 28 Apr 15:59:02.976 # Sentinel runid is c6552685654378a954bfcafebb85b66e2f240665 [9427] 28 Apr 15:59:02.977 # +monitor master mymaster 10.45.47.35 6379 quorum 1 [9427] 28 Apr 15:59:03.978 * +slave slave 10.45.47.36:6379 10.45.47.36 6379 @ mymaster 10.45.47.35 6379 [9427] 28 Apr 15:59:04.432 * +sentinel sentinel 10.45.47.35:16379 10.45.47.35 16379 @ mymaster 10.45.47.35 6379 [9427] 28 Apr 16:15:23.699 # +new-epoch 1 [9427] 28 Apr 16:15:23.749 # +vote-for-leader 75baef80724fc558eaa5a418d4f179934035d00f 1 [9427] 28 Apr 16:15:23.750 # +sdown master mymaster 10.45.47.35 6379 [9427] 28 Apr 16:15:23.750 # +odown master mymaster 10.45.47.35 6379 #quorum 1/1 [9427] 28 Apr 16:15:23.750 # Next failover delay: I will not start a failover before Tue Apr 28 16:15:54 2015 [9427] 28 Apr 16:15:24.856 # +config-update-from sentinel 10.45.47.35:16379 10.45.47.35 16379 @ mymaster 10.45.47.35 6379 [9427] 28 Apr 16:15:24.856 # +switch-master mymaster 10.45.47.35 6379 10.45.47.36 6379 [9427] 28 Apr 16:15:24.856 * +slave slave 10.45.47.35:6379 10.45.47.35 6379 @ mymaster 10.45.47.36 6379 [9427] 28 Apr 16:15:34.899 # +sdown slave 10.45.47.35:6379 10.45.47.35 6379 @ mymaster 10.45.47.36 6379 [9427] 28 Apr 16:22:26.423 # -sdown slave 10.45.47.35:6379 10.45.47.35 6379 @ mymaster 10.45.47.36 6379 [9427] 28 Apr 16:22:36.385 * +convert-to-slave slave 10.45.47.35:6379 10.45.47.35 6379 @ mymaster 10.45.47.36 6379 |
从红色部分可以看出,master发生了迁移,等刚才停掉的master再重启后,可以观察到它将被当作slave加入,类似以下输出:
[9427] 28 Apr 16:22:36.385 * +convert-to-slave slave 10.45.47.35:6379 10.45.47.35 6379 @ mymaster 10.45.47.36 6379
/data/redis/src/redis-cli -p 6379 info
在10.45.47.36上执行redis-cli -p 6379 info命令可发现,该redis已被切换为主:
|
# Replication role:master connected_slaves:0 master_repl_offset:0 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 |
在10.45.47.35上执行redis-cli -p 6379 info命令可发现,该redis已被切换为备:
|
# Replication role:slave master_host:10.45.47.36 master_port:6379 master_link_status:up master_last_io_seconds_ago:1 master_sync_in_progress:0 slave_repl_offset:1311 slave_priority:100 slave_read_only:1 connected_slaves:0 master_repl_offset:0 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 |
再测试,shutdown 10.45.47.36上的redis,观察日志可看到10.45.47.35的redis被切回了主。启动10.45.47.36上的redis,角色转成了备。
直接down掉10.45.47.35主机,此时10.45.47.36又被切回主。
注意事项:发生master迁移后,如果遇到运维需要,想重启所有redis,必须最先重启“新的”master节点,否则sentinel会一直找不到master。
日常运维可使用redis自带的info命令和monitor命令获取相关信息,监控redis的运行情况。也可用redis-live、redis-stat第三方工具对redis进行监控,既有命令行也有web界面。

浙公网安备 33010602011771号