redis-一主二从三哨兵

Redis缓存服务采用Master-Slaver模式,Master节点负责读写操作,Slaver节点负责从Master节点上做Replication的复制。MasterSlaver节点分别部署在不同主机上,组成一组Redis服务。Redis组内采用Redis官方提供的Sentinel(哨兵)机制做failover,通过sentinel模式启动redis后,自动监控master/slave的运行状态,基本原理是:心跳机制+投票裁决。

基于Sentinel的主从切换方案,Sentinel用于管理多个Redis服务器实例,主要负责三个方面的任务:

 1. 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。每个sentinel会向其它sentinalmasterslave定时发送消息,以确认对方是否着,如果发现对方在指定时间(可配置)内未回应,则暂时认为对方已挂(所谓的主观认为宕机” 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.35master节点使用端口6379,最后一个数字表示投票需要的"最少法定人数",比如有10sentinal哨兵都在监控某一个master节点,如果需要至少6个哨兵发现master挂掉后,才认为master真正down掉,那么这里就配置为6,最小配置1master1slave,在二个机器上都启动sentinal的情况下,哨兵数只有2个,如果一台机器物理挂掉,只剩一个sentinal能发现该问题,所以这里配置成1,至于mymaster只是一个名字,可以随便起,但要保证下面使用同一个名字

sentinel monitor mymaster 10.45.47.35 6379 1  

#认证主机密码(注意 密码必须放在sentinel monitor mymaster 之后 否则启动会报错)

sentinel auth-pass mymaster ZE$soft987

 

##表示如果10smymaster没响应,就认为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 masterslave上都启用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.35redis被切回了主。启动10.45.47.36上的redis,角色转成了备。

直接down10.45.47.35主机,此时10.45.47.36又被切回主。

 

注意事项发生master迁移后,如果遇到运维需要,想重启所有redis,必须最先重启新的”master节点,否则sentinel会一直找不到master

日常运维可使用redis自带的info命令和monitor命令获取相关信息,监控redis的运行情况。也可用redis-liveredis-stat第三方工具对redis进行监控,既有命令行也有web界面。

posted @ 2018-10-13 15:38  林被熊烟岛  阅读(207)  评论(0)    收藏  举报