准备三个redis服务,命名分别为 master,slave1,slave2 .这里为在测试机上,不干扰原来的redis服务,我们master 使用6000端口。
1. master配置修改端口:
redis-6000.conf
port 6000 daemonize yes logfile "6000.log" dbfilename dump-6000.rdb dir "/data/redis/6000/" #requirepass 123456 |
2. slave修改配置:
两个从节点的配置完全一样,与主节点不一样的是加了slaveof
redis-6001.conf , redis-6002.conf port 6001 daemonize yes dbfilename "dump-6001.rdb" dir "/data/redis/data/" slaveof 127.0.0.1 6000 |
3.启动服务
启动master redis-server redis-6000.conf 启动slave redis-server redis-6001.conf redis-server redis-6002.conf |
4. 确认主从关系
[root@localhost 6000]# redis-cli -h 127.0.0.1 -p 6000 info replication # Replication role:master connected_slaves:2 ...... [root@localhost 6000]# redis-cli -h 127.0.0.1 -p 6001 info replication # Replication role:slave master_host:127.0.0.1 master_port:6000 ...... |
5. 验证下 主从复制
master
[root@demo-1 redis]# redis-cli -p 6000 127.0.0.1:6000> set test redis OK 127.0.0.1:6000> get test "redis" |
slave1
[root@demo-1 local]# redis-cli -p 6001 127.0.0.1:6001> get test "redis" |
slave2
[root@demo-1 ~]# redis-cli -p 6002 127.0.0.1:6002> get test "redis" 127.0.0.1:6002> |
可以看到主机执行写命令,从机能同步主机的值,主从复制,读写分离就实现了。
6. 部署sentinel节点
3个sentinel节点的部署方法完全是一致的(端口不同),下面以sentinel-1节点的部署为例子
配置sentinel节点
redis-sentinel-26379.conf,redis-sentinel-26380.conf,redis-sentinel-26381.conf port 26379 daemonize yes logfile "26379.log" dir "/data/redis/sent1/" sentinel monitor mymaster 127.0.0.1 6000 2 sentinel down-after-milliseconds mymaster 30000 |
sentinel monitor mymaster 127.0.0.1 6000 2
sentinel节点要监控127.0.0.1:6000这个master节点,2代表判断主节点失败至少需要2个sentinel节点同意,mymaster是主节点别名
7.启动服务
[root@localhost redis]# redis-sentinel sentine-26379.conf [root@localhost redis]# redis-sentinel sentine-26380.conf [root@localhost redis]# redis-sentinel sentine-26381.conf |
8.查看日志
18836:X 18 Apr 15:23:52.703 # Sentinel ID is 0767e28f6404076d6b46f34576f90b9efd65509b 18836:X 18 Apr 15:23:52.703 # +monitor master mymaster 127.0.0.1 6000 quorum 2 18836:X 18 Apr 15:23:59.943 * +sentinel sentinel bcf5dfc41b87b88425d8fef769fc5fc1d73ee89f 127.0.0.1 26380 @ mymaster 127.0.0.1 6000 18836:X 18 Apr 15:24:02.764 * +sentinel sentinel 5b03f4b845da7f68abc9c4353d2c4b1b2d6bf4c5 127.0.0.1 26381 @ mymaster 127.0.0.1 6000 |
9.确认
[root@localhost redis]# redis-cli -h 127.0.0.1 -p 26379 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=127.0.0.1:6000,slaves=2,sentinels=3 [root@localhost redis]# ps -ef|grep redis root 18271 1 0 14:53 ? 00:00:01 redis-server 127.0.0.1:6000 root 18278 1 0 14:53 ? 00:00:01 redis-server 127.0.0.1:6001 root 18285 1 0 14:53 ? 00:00:01 redis-server 127.0.0.1:6002 root 18649 18617 0 15:13 pts/0 00:00:00 vim redis-6000.conf root 18836 1 0 15:23 ? 00:00:00 redis-sentinel *:26379 [sentinel] root 18845 1 0 15:23 ? 00:00:00 redis-sentinel *:26380 [sentinel] root 18853 1 0 15:24 ? 00:00:00 redis-sentinel *:26381 [sentinel] root 18881 14071 0 15:25 pts/1 00:00:00 grep --color=auto redis |
10.故障切换,kill master进程
[root@localhost 6000]# kill -9 18271 [root@localhost tmp]# tail -f 26379.log 18836:X 18 Apr 15:49:33.888 # +sdown master mymaster 127.0.0.1 6000 18836:X 18 Apr 15:49:34.005 # +new-epoch 1 18836:X 18 Apr 15:49:34.006 # +vote-for-leader 5b03f4b845da7f68abc9c4353d2c4b1b2d6bf4c5 1 18836:X 18 Apr 15:49:34.259 # +config-update-from sentinel 5b03f4b845da7f68abc9c4353d2c4b1b2d6bf4c5 127.0.0.1 26381 @ mymaster 127.0.0.1 6000 18836:X 18 Apr 15:49:34.259 # +switch-master mymaster 127.0.0.1 6000 127.0.0.1 6001 18836:X 18 Apr 15:49:34.259 * +slave slave 127.0.0.1:6002 127.0.0.1 6002 @ mymaster 127.0.0.1 6001#切换到6001了 18836:X 18 Apr 15:49:34.259 * +slave slave 127.0.0.1:6000 127.0.0.1 6000 @ mymaster 127.0.0.1 6001 |
master切换成了6001 ,当6000端口的这个服务重启的时候,他会变成6001端口服务的slave。
因为sentinel在切换master的时候,把对应的sentinel.conf和redis.conf文件的配置修改。
11.查看集群信息
[root@localhost 6000]# redis-cli -h 127.0.0.1 -p 6001 info replication # Replication role:master #可以看到6001已经是master了 connected_slaves:1 ...... [root@localhost 6000]# redis-cli -h 127.0.0.1 -p 6002 info replication # Replication role:slave master_host:127.0.0.1 master_port:6001 ...... |
12.重新启动6000端口的原来的master看看效果如何
[root@localhost redis]# redis-server redis-6000.conf
18836:X 18 Apr 15:55:00.063 # -sdown slave 127.0.0.1:6000 127.0.0.1 6000 @ mymaster 127.0.0.1 6001 18836:X 18 Apr 15:55:10.024 * +convert-to-slave slave 127.0.0.1:6000 127.0.0.1 6000 @ mymaster 127.0.0.1 6001 可以看到6000启动之后变成slave了 |
[root@localhost redis]# redis-cli -h 127.0.0.1 -p 6000 info replication # Replication role:slave #6000启动之后变成slave master_host:127.0.0.1 master_port:6001 ...... [root@localhost redis]# redis-cli -h 127.0.0.1 -p 6001 info replication # Replication role:master connected_slaves:2 ...... [root@localhost redis]# redis-cli -h 127.0.0.1 -p 6002 info replication # Replication role:slave master_host:127.0.0.1 master_port:6001 ...... |
注意: 生产环境 redis sentinel所有节点应该分布在不同机器上,sentinel中的数据节点和普通的redis数据节点配置上没任何区别,只不过添加了一些sentinel节点对他们进行监控