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 复制replication 下)
主库ip | 172.168.18.201 6379 |
从库ip | 172.168.18.203 6379, 172.168.18.200 6379 |
二. sentinel 配置说明
2.1 启动sentinel服务方法
对于启动sentinel服务有二种方法:
(1)是使用redis-sentinel程序来启动 redis-sentinel sentinel.conf。
(2)是使用redis-server 程序来启动一个运行在sentinel模式下的redis服务器 redis-server sentinel.conf --sentinel。
启动 sentinel 实例必须指定相应的配置文件, 系统会使用配置文件来保存 sentinel 的当前状态, 并在 sentinel 重启时通过载入配置文件来进行状态还原。查看redis-sentinel程序,只是一个软链接,如下所示:
lrwxrwxrwx. 1 root root 12 12月 18 16:30 redis-sentinel -> redis-server
2.2 sentinel.conf 参数说明
下面解说sentinel.conf文件中,所需的至少配置参数描述:
-- 监控主库, 名称:mymaster可以自定义, ip端口: 127.0.0.1 6379,判断主库客观下线需要2个sentinel 同意 sentinel monitor mymaster 127.0.0.1 6379 2 -- 认为主库已经下线所需的毫秒数,例如下线状态超过60000则判定已经下线。 sentinel down-after-milliseconds mymaster 60000 -- 指定故障转移超时时间,以毫秒为单位,配置所有slaves指向新的master所需的最大时间 sentinel failover-timeout mymaster 180000 -- 在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步,这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。如果这个数字越大,就意味着越 多的slave因为replication而不可用。 parallel-syncs mymaster 1 --设置连接master的密码。 sentinel auth-pass mymaster 123456
三. sentinel高可用搭建
只使用单个sentinel进程来监控redis集群是不可靠的,当单个sentinel进程down后,整个集群系统将无法按照预期的方式运行。所以有必要将sentinel集群,在ip 200的电脑上将启动三个sentinel进程,实现集群。
3.1 添加3个sentinel.conf文件
在ip 为200的sentinel集群服务器上,在redis运行目录下,增加3个配置文件,名称分别为:sentinel_26379.conf, sentinel_26380.conf, sentinel_26381.conf。相关脚本如下:
-- sentinel_26379.conf文件配置参数 protected-mode no port 26379 sentinel monitor mymaster 172.168.18.201 6379 2 sentinel auth-pass mymaster 123456 daemonize yes logfile "/usr/local/redis/bin/sentinel_26379.log" sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 180000 -- sentinel_26380.conf文件配置参数如下,其它参数与sentinel_26379文件一样 port 26380 logfile "/usr/local/redis/bin/sentinel_26380.log" -- sentinel_26381.conf文件配置参数如下,其它参数与sentinel_26379文件一样 port 26381 logfile "/usr/local/redis/bin/sentinel_26381.log"
--增加后文件目录如下:
[root@localhost bin]# pwd /usr/local/redis/bin [root@localhost bin]# ls -l 总用量 22012 -rw-r--r--. 1 root root 92 12月 18 16:38 dump.rdb -rw-r--r--. 1 root root 57765 12月 18 16:36 redis_bak.conf -rwxr-xr-x. 1 root root 2452648 12月 18 16:30 redis-benchmark -rwxr-xr-x. 1 root root 5754888 12月 18 16:30 redis-check-aof -rwxr-xr-x. 1 root root 5754888 12月 18 16:30 redis-check-rdb -rwxr-xr-x. 1 root root 2617840 12月 18 16:30 redis-cli -rw-r--r--. 1 root root 57762 12月 20 14:22 redis.conf lrwxrwxrwx. 1 root root 12 12月 18 16:30 redis-sentinel -> redis-server -rwxr-xr-x. 1 root root 5754888 12月 18 16:30 redis-server -rw-r--r--. 1 root root 7992 12月 20 14:22 sentinel_26379.conf -rw-r--r--. 1 root root 6887 12月 20 14:23 sentinel_26379.log -rw-r--r--. 1 root root 7992 12月 20 14:22 sentinel_26380.conf -rw-r--r--. 1 root root 7081 12月 20 14:23 sentinel_26380.log -rw-r--r--. 1 root root 7992 12月 20 14:22 sentinel_26381.conf -rw-r--r--. 1 root root 8465 12月 20 14:23 sentinel_26381.log -rw-r--r--. 1 root root 7710 12月 19 14:21 sentinel.conf
3.2 启动三个sentinel服务
[root@localhost bin]# pwd /usr/local/redis/bin [root@localhost bin]# ./redis-sentinel ./sentinel_26379.conf [root@localhost bin]# ./redis-sentinel ./sentinel_26380.conf [root@localhost bin]# ./redis-sentinel ./sentinel_26381.conf
(1)查看进程信息
[root@localhost bin]# ps -ef | grep redis-sentinel root 7567 1 0 14:28 ? 00:00:00 ./redis-sentinel *:26379 [sentinel] root 7572 1 0 14:28 ? 00:00:00 ./redis-sentinel *:26380 [sentinel] root 7577 1 0 14:28 ? 00:00:00 ./redis-sentinel *:26381 [sentinel]
(2)查看主库与sentinel关联信息(连接一个sentinel客户端)
[root@localhost bin]# ./redis-cli -h 172.168.18.200 -p 26381 172.168.18.200:26381> sentinel master mymaster 1) "name" 2) "mymaster" 3) "ip" 4) "172.168.18.201" 5) "port" 6) "6379" 7) "runid" 8) "26cd40ba173490e2ceac61433211af7dc7716dda" 9) "flags" 10) "master" 11) "link-pending-commands" 12) "0" 13) "link-refcount" 14) "1" 15) "last-ping-sent" 16) "0" 17) "last-ok-ping-reply" 18) "169" 19) "last-ping-reply" 20) "169" 21) "down-after-milliseconds" 22) "30000" 23) "info-refresh" 24) "3982" 25) "role-reported" 26) "master" 27) "role-reported-time" 28) "24109" 29) "config-epoch" 30) "0" 31) "num-slaves" 32) "2" 33) "num-other-sentinels" 34) "2" 35) "quorum" 36) "2" 37) "failover-timeout" 38) "180000" 39) "parallel-syncs" 40) "1"
(3)sentinel客户端查看群集信息,可以看到此时主库ip为201。
172.168.18.200:26380> info sentinel # 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=172.168.18.201:6379,slaves=2,sentinels=3
四.sentinel高可用测试
4.1 测试主从同步
-- 主库写入一个键值对 [root@hsr bin]# ./redis-cli -h 172.168.18.201 -p 6379 -a 123456 172.168.18.201:6379> set mysentinel "hello" ok -- 从库203 读取了该键 [root@xuegod64 redis-4.0.6]# redis-cli -h 172.168.18.203 -p 6379 -a 123456 172.168.18.203:6379> get mysentinel "hello" -- 从库200 读取了该键 [root@localhost bin]# ./redis-cli -h 172.168.18.200 -p 6379 -a 123456 172.168.18.200:6379> get mysentinel "hello"
4.2 测试故障转移
(1) 首先把主库201的down掉
172.168.18.201:6379> shutdown not connected>
(2) 在sentinel客户端查看群集信息,发现此时已经实现了故障转移,已经将从库 200 升级成为了新主库。
172.168.18.200:26381> info sentinel # 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=172.168.18.200:6379,slaves=2,sentinels=3
(3) 在redis客户端,查看ip 200的复制信息,角色已成了为master
172.168.18.200:6379> info replication # replication role:master connected_slaves:1 slave0:ip=172.168.18.203,port=6379,state=online,offset=204170,lag=0 master_replid:7464817ee3337cc8f2b508577287b0f0c385a859 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:204170 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:190908 repl_backlog_histlen:13263
(4)此时ip200 的redis服务,由之前的只读,变成了可读写。
172.168.18.200:6379> set mastername "ip200" ok --此时只有203一个从库,成功读取了该键 172.168.18.203:6379> get mastername "ip200"
(5)查看其中的一个sentinel日志,下面是关于故障转移的相关信息:
[root@localhost bin]# cat sentinel_26379.log 8516:x 20 dec 14:22:31.394 # +sdown master mymaster 172.168.18.201 6379 8516:x 20 dec 14:22:31.496 # +new-epoch 1 8516:x 20 dec 14:22:31.499 # +vote-for-leader 300fd3d5b5673885c17942c465ec7a09f8f8e2ad 1 8516:x 20 dec 14:22:32.271 # +config-update-from sentinel 300fd3d5b5673885c17942c465ec7a09f8f8e2ad 172.168.18.200 26381 @ mymaster 172.168.18.201 6379 8516:x 20 dec 14:22:32.272 # +switch-master mymaster 172.168.18.201 6379 172.168.18.200 6379 8516:x 20 dec 14:22:32.272 * +slave slave 172.168.18.203:6379 172.168.18.203 6379 @ mymaster 172.168.18.200 6379 8516:x 20 dec 14:22:32.272 * +slave slave 172.168.18.201:6379 172.168.18.201 6379 @ mymaster 172.168.18.200 6379 8516:x 20 dec 14:23:02.323 # +sdown slave 172.168.18.201:6379 172.168.18.201 6379 @ mymaster 172.168.18.200 6379
总结:sentinel高可用是基于复制来实现的。在sentinel实现过程中:首先要先搭建好复制架构,并确保数据同步正常运行;最后在复制基础上,再搭建sentinel群集服务架构,并测试好故障转移切换。