q6542125 发表于 2018-11-2 11:38:40

Redis的哨兵部署(sentinel)(实验)

  首先感谢“吧喱公路”的引导,打开了我对哨兵的理解思路,再次谢谢。
  Redis的哨兵(sentinel)
  哨兵适用于非集群结构的redis环境,比如:redis主从环境。
  关于哨兵集群,我这里就不做实验了,网上有大量的配置方法。
  哨兵集群的核心思想,就是解决哨兵的单点故障问题。
  个人认为,有做哨兵集群的经费,不如直接做个redis集群了。
  环境描述:(主从从结构)
  master:192.168.2.100:6379      #单节点sentinel运行在这个环境上
  slave:192.168.2.200:6379
  savle:192.168.2.201:6379
  redis安装路径:/usr/local/redis-3.0.6-6379
  redis.conf关键配置:(这里不絮诉基本配置了,主从配置参考:http://blog.51cto.com/13690439/2118890)
  master:
  # vim redis.conf
  requirepass "123456"      //设置连接master密码
  masterauth "123456"       //登录master时,调用该参数
  slave:
  # vim etc/redis.conf
  slaveof 192.168.2.100 6379          //指定主库IP和端口
  requirepass "123456"      //之所以3个redis都这样写,是为了故障切换后,info replication显示slave0信息
  masterauth 123456          //登录master时,调用该参数
  哨兵关键配置:(sentinel.conf)
  # vim sentinel.conf
  port 26379      //端口
  sentinel monitor mymaster 192.168.2.100 6379 1
  //master-name可以自定义、监听IP:port几个sentinel认为故障时,才算真正的故障
  sentinel down-after-milliseconds mymaster 3000
  //哨兵发送PING消息,等待PONG消息的时间,超过设定时间表示故障;毫秒
  sentinel failover-timeout mymaster 10000
  //故障转移(failover)超时时间,超过设定时间表示故障转移失败;毫秒
  sentinel auth-pass mymaster 123456          //设置连接master需要的密码
  启动master的redis:
  # redis-server redis.conf
  启动哨兵:(新开一个xshell)
  # redis-sentinel sentinel.conf
  启动slave的redis:
  # redis-server redis.conf
  哨兵的输出:
  # Sentinel runid is e49df1197325687d9a40508c00f466a8c6e596db
  //哨兵ID
  # +monitor master mymaster 192.168.2.100 6379 quorum 1
  //+monitor:增加了一个master监控,后面就是master的信息
  * +slave slave 192.168.2.200:6379 192.168.2.200 6379 @ mymaster 192.168.2.100 6379
  //+salve:增加了一个salve监控,后面是salve的信息
  * +slave slave 192.168.2.201:6379 192.168.2.201 6379 @ mymaster 192.168.2.100 6379
  //+salve:增加了一个salve监控,后面是salve的信息
  master上登录redis:
  # redis-cli -h 192.168.2.100 -p 6379 -a 123456
  192.168.2.100:6379> set name zhangsan
  OK
  192.168.2.100:6379> set age 26
  OK
  192.168.2.100:6379> set home beijing
  OK
  192.168.2.100:6379> keys *
  1) "name"
  2) "home"
  3) "age"
  salve上登录redis:(两个salve登录查看,数据同步正常)
  # redis-cli -h 192.168.2.200 -p 6379 -a 123456
  192.168.2.200:6379> keys *
  1) "name"
  2) "home"
  3) "age"
  停止master的redis:(注意观察哨兵的输出)
  # ps -ef |grep redis
  root      11467      10 17:12 ?      00:00:00 redis-server *:6379
  root      11473   46500 17:12 pts/1    00:00:00 redis-sentinel *:26379
  root      11513   43390 17:16 pts/0    00:00:00 grep --color=auto redis
  # kill 11467
  哨兵的输出:
  # +sdown master mymaster 192.168.2.100 6379
  //+sdown:master节点挂了。后面是master信息
  # +odown master mymaster 192.168.2.100 6379 #quorum 1/1
  # +new-epoch 14
  # +try-failover master mymaster 192.168.2.100 6379
  //开始恢复故障
  # +vote-for-leader e49df1197325687d9a40508c00f466a8c6e596db 14
  //投票选举节点的哨兵信息,因为我们就一个哨兵,所以就是自己 leader
  # +elected-leader master mymaster 192.168.2.100 6379
  //选举节点后替换谁
  # +failover-state-select-slave master mymaster 192.168.2.100 6379
  //开始为故障的master选举
  # +selected-slave slave 192.168.2.200:6379 192.168.2.200 6379 @ mymaster 192.168.2.100 6379
  //节点选举结果,选中192.168.2.200:6379来替换master
  * +failover-state-send-slaveof-noone slave 192.168.2.200:6379 192.168.2.200 6379 @ mymaster 192.168.2.100 6379
  //确认节点选举结果
  * +failover-state-wait-promotion slave 192.168.2.200:6379 192.168.2.200 6379 @ mymaster 192.168.2.100 6379
  //选中的节点正在升级为master
  # +promoted-slave slave 192.168.2.200:6379 192.168.2.200 6379 @ mymaster 192.168.2.100 6379
  //选中的节点已成功升级为master
  # +failover-state-reconf-slaves master mymaster 192.168.2.100 6379
  //切换故障master的状态
  * +slave-reconf-sent slave 192.168.2.201:6379 192.168.2.201 6379 @ mymaster 192.168.2.100 6379
  //
  * +slave-reconf-inprog slave 192.168.2.201:6379 192.168.2.201 6379 @ mymaster 192.168.2.100 6379
  //其他节点同步故障master信息
  * +slave-reconf-done slave 192.168.2.201:6379 192.168.2.201 6379 @ mymaster 192.168.2.100 6379
  //其他节点完成故障master的同步
  # +failover-end master mymaster 192.168.2.100 6379
  //故障恢复完成
  # +switch-master mymaster 192.168.2.100 6379 192.168.2.200 6379
  //master从192.168.2.100:6379变为 192.168.2.200:6379
  * +slave slave 192.168.2.201:6379 192.168.2.201 6379 @ mymaster 192.168.2.200 6379
  //其他节点指定新的master
  * +slave slave 192.168.2.100:6379 192.168.2.100 6379 @ mymaster 192.168.2.200 6379
  //故障master指定新的master
  # +sdown slave 192.168.2.100:6379 192.168.2.100 6379 @ mymaster 192.168.2.200 6379
  //192.168.2.100:6379宕机,待恢复
  启动master的redis(注意观察哨兵的输出)
  # redis-server redis.conf
  哨兵的输出:
  # -sdown slave 192.168.2.100:6379 192.168.2.100 6379 @ mymaster 192.168.2.200 6379
  //故障master节点已经恢复
  * +convert-to-slave slave 192.168.2.100:6379 192.168.2.100 6379 @ mymaster 192.168.2.200 6379
  //故障master节点变为salve,他的master为192.168.2.200:6379
  现在我们查看主从的状态:
  192.168.2.100上查看:
  # redis-cli -h 192.168.2.100 -p 6379 -a 123456
  192.168.2.100:6379> info replication
  # Replication
  role:slave
  master_host:192.168.2.200
  master_port:6379
  master_link_status:up
  192.168.2.100:6379> set ab 123
  (error) READONLY You can't write against a read only slave.
  192.168.2.100:6379> get name
  "zhagnsan"
  192.168.2.201上查看:
  # redis-cli -h 192.168.2.201 -p 6379 -a 123456
  192.168.2.201:6379> info replication
  # Replication
  role:slave
  master_host:192.168.2.200
  master_port:6379
  master_link_status:up
  192.168.2.201:6379> set ab 123
  (error) READONLY You can't write against a read only slave.
  192.168.2.201:6379> get name
  "zhagnsan"
  192.168.2.200上查看:
  # redis-cli -h 192.168.2.200 -p 6379 -a 123456
  192.168.2.200:6379> info replication
  # Replication
  role:master
  connected_slaves:2
  slave0:ip=192.168.2.201,port=6379,state=online,offset=24990,lag=1
  slave1:ip=192.168.2.100,port=6379,state=online,offset=24990,lag=0
  192.168.2.200:6379> set ab 123
  OK
  192.168.2.200:6379> keys *
  1) "name"
  2) "home"
  3) "age"
  4) "ab"
  总结:通过哨兵(sentinel)实现了主从从环境高可用效果。
  master在宕机后,通过哨兵自动将其中一个salve提升为master,切换过程中,数据保存完整。
  但我们也发现,原master不能继续插入key了, 而客户端连接还是会连原master,
  这时,我们就需要在数据库连接池做一些规则设置了。
  由于目前我能力有限,无法解释连接池问题,还请见谅。

页: [1]
查看完整版本: Redis的哨兵部署(sentinel)(实验)