zhangxinba 发表于 2018-11-4 07:19:25

redis高可用之redis sentinel(哨兵)的搭建以及应用

  redis的sentinel可以监控redis一个和多个redis的主从复制架构。
  主要实现的功能有:

[*]  监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
[*]  提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
[*]  自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。

[*]  redis一主双从的IP信息
  master:127.0.0.1:7000
  slave1:127.0.0.1:7001
  slvae2:127.0.0.1:7002
[*]  环境
  CentOS 7.2
  redis 3.2.3
[*]  redis配置信息:
  daemonize yes
  port 7000
  pidfile "/var/run/redis/redis-7000.pid"
  logfile "/var/log/redis/redis-7000.log"
  dbfilename "dump-7000.rdb"
  上述配置是主要更改的配置信息,其余的使用默认的配置就好了
[*]  搭建redis的一主双从
  启动redis
  /usr/bin/redis-server /etc/redis/7000.conf
  /usr/bin/redis-server /etc/redis/7001.conf
  /usr/bin/redis-server /etc/redis/7002.conf
  查看redis是否启动成功
  netstat -tunlp | egrep '7000|7001|7002'
  tcp      0      0 0.0.0.0:27000         0.0.0.0:*               LISTEN      13010/redis-sentine
  tcp      0      0 127.0.0.1:7001          0.0.0.0:*               LISTEN      12952/redis-server
  tcp      0      0 127.0.0.1:7002          0.0.0.0:*               LISTEN      12958/redis-server
  搭建主从
  slave1:redis-cli -h 127.0.0.1 -p 7001 slaveof 127.0.0.1 7000
  slave2:redis-cli -h 127.0.0.1 -p 7002 slaveof 127.0.0.1 7000
  查看主从是否搭建成功
  master : redis-cli -h 127.0.0.1 -p 7000 info replication
  # Replication
  role:master
  connected_slaves:2
  slave0:ip=127.0.0.1,port=7001,state=online,offset=937723,lag=0
  slave0:ip=127.0.0.1,port=7002,state=online,offset=937723,lag=0
  测试主从是否搭建成功
  master : redis-cli -h 127.0.0.1 -p 7000 set mykey 'hello'
  slave1 : redis-cli -h 127.0.0.1 -p 7001 get mykey
  slave2 : redis-cli -h 127.0.0.1 -p 7002 get mykey
[*]  配置sentinel
  daemonize yes #后台运行
  port 27000
  pidfile "/var/run/redis/redis-sentinel27000.pid"
  logfile "/var/log/redis/redis-sentinel27000.log"
  sentinel monitor mymaster 127.0.0.1 7000 1
  #监控master的名字mymaster,IP地址127.0.0.1,端口7000.
  #1 表示只需要一个sentinel认为master属于下线状态就可以进行failover(故障转移),实验的时候
  这个值我一直设置为2,但是我只开启了一个sentinel,所以导致我人为的下线master的时候,无论如何都不能自动的故障转移,等我更改配置为1了之后,故障转移成功了。
  sentinel down-after-milliseconds mymaster 60000
  #表示master在多久返回sentinel发送个master的ping命令的回复,则认为master已经下线。单位是毫秒。60000就是60秒。
  sentinel failover-timeout mymaster 180000
  #表示故障自动转移的超时时间。
  sentinel parallel-syncs mymaster 1
  #表示故障转移成功之后,多少个从服务器向新的master服务器同步数据。这个值越小,则完成故障转移所需要的时间就越长。

[*]  启动sentinel
  在2.8.0以后redis包含了sentinel的文件。
  /usr/bin/redis-server /etc/redis/redis-sentinel27000.conf --sentinel
  /usr/bin/resis-sentinel /etc/redis/redis-sentinel27000.conf
  上述的俩个命令都可以启动sentinel,并且命令效果是相同的
[*]  检测sentinel启动成功
  命令行
  netstat -tunlp | grep '27000'
  redis-cli -h 127.0.0.1 -p 27000 info sentine
  # Sentinel
  sentinel_masters:1
  sentinel_tilt:0
  sentinel_running_scripts:0
  sentinel_scripts_queue_length:0
  sentinel_simulate_failure_flags:0
  master0:name=mymaster,status=ok,address=127.0.0.1:7000,slaves=2,sentinels=1
  日志
  tailf /var/log/redis/redis-sentinel27000.log

[*]  自动故障转移实验
  任务下线master
  redis-cli -h 127.0.0.1 -p 7000 shutdown
  查看master的redis日志信息
  tailf /var/log/redis/redis-7000.log

  在redis日志中可以看得到下线之前redis会做一个快照,将redis的数据保存到本地的磁盘中
  查看sentinel的日志信息
  tailf /var/log/redis/redis-sentinel27000.log

  在日志中我们可以看到
  +sdown master mymaster 127.0.0.1 7000
  #sentinel将master标记为主观下线
  +odown master mymaster 127.0.0.1 7000 #quorum 1/1
  #sentinel将master标记为客观下线
  +new-epoch 1
  +try-failover master mymaster 127.0.0.1 7000
  +try-failover master mymaster 127.0.0.1 7000
  +vote-for-leader cd4713bb67522a3cc34ed44d761c972f63978b97 1
  #开始投票
  +elected-leader master mymaster 127.0.0.1 7000
  +failover-state-select-slave master mymaster 127.0.0.1 7000
  +selected-slave slave 127.0.0.1:7002 127.0.0.1 7002 @ mymaster 127.0.0.1 7000
  +failover-state-send-slaveof-noone slave 127.0.0.1:7002 127.0.0.1 7002 @ mymaster 127.0.0.1 7000
  +failover-state-wait-promotion slave 127.0.0.1:7002 127.0.0.1 7002 @ mymaster 127.0.0.1 7000
  +promoted-slave slave 127.0.0.1:7002 127.0.0.1 7002 @ mymaster 127.0.0.1 7000
  +failover-state-reconf-slaves master mymaster 127.0.0.1 7000
  +slave-reconf-sent slave 127.0.0.1:7001 127.0.0.1 7001 @ mymaster 127.0.0.1 7000
  +slave-reconf-inprog slave 127.0.0.1:7001 127.0.0.1 7001 @ mymaster 127.0.0.1 7000
  +slave-reconf-done slave 127.0.0.1:7001 127.0.0.1 7001 @ mymaster 127.0.0.1 7000
  +failover-end master mymaster 127.0.0.1 7000
  +switch-master mymaster 127.0.0.1 7000 127.0.0.1 7002
  #设置新master服务器127.0.0.1 7002
  +slave slave 127.0.0.1:7001 127.0.0.1 7001 @ mymaster 127.0.0.1 7002
  +slave slave 127.0.0.1:7000 127.0.0.1 7000 @ mymaster 127.0.0.1 7002
  +sdown slave 127.0.0.1:7000 127.0.0.1 7000 @ mymaster 127.0.0.1 7002
  加入日志中出现上述红色字体信息则表明failover转移成功
  4.验证新的主从
  原slave2新master : redis-cli -h 127.0.0.1 -p 7002 info replication
  # Replication
  role:master
  connected_slaves:1
  slave0:ip=127.0.0.1,port=7001,state=online,offset=1118302,lag=1
  新master : redis-cli -h 127.0.0.1 -p 7002 set testkey "test"
  slave1 : redus-cli -h 127.0.0.1 -p 7001 get testkey
  #查看value是否存在
  5.重新拉起旧的master
  /usr/bin/redis-server /etc/redis/7000.conf
  查看sentinel日志
  tailf /var/log/redis/redis-sentinel27000.log
  -sdown slave 127.0.0.1:7000 127.0.0.1 7000 @ mymaster 127.0.0.1 7002
  +fix-slave-config slave 127.0.0.1:7000 127.0.0.1 7000 @ mymaster 127.0.0.1 7002
  查看集群信息
  redis-cli -h 127.0.0.1 -p 7002 info replication
  # Replication
  role:master
  connected_slaves:2
  slave0:ip=127.0.0.1,port=7001,state=online,offset=1130960,lag=0
  slave1:ip=127.0.0.1,port=7000,state=online,offset=1130827,lag=1

页: [1]
查看完整版本: redis高可用之redis sentinel(哨兵)的搭建以及应用