docker搭建redis哨兵模式集群
一、搭建redis一主两从集群
1.创建docker网络,为了容器间相互通信
docker network create redis
2.运行redis容器
docker run -it -d --network redis --restart=always --name redis-master -p 6379:6379 -p 26379:26379 redis
docker run -it -d --network redis --restart=always --name redis-slave-1 -p 6380:6379 -p 26380:26379 redis
docker run -it -d --network redis --restart=always --name redis-slave-2 -p 6381:6379 -p 26381:26379 redis
3.查看master的ip地址
[root@aliyun ~]# docker inspect redis-master|grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2",
4.添加第一个slave节点
#进入redis-slave-1的容器内部
[root@aliyun ~]# docker exec -it redis-slave-1 /bin/bash
root@38493fef3e03:/data# redis-cli
127.0.0.1:6379> slaveof 172.17.0.2 6379
OK
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:172.17.0.2
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:14
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:afd4ad72b47ce253b15470232f20ae5e4f768b29
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:14
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:14
可以看到第一个slave节点添加成功
5.添加第二个slave节点
#进入第二个slave节点(添加成功)
[root@aliyun ~]# docker exec -it redis-slave-2 /bin/bash
root@7d4124eb4f7b:/data# redis-cli
127.0.0.1:6379> slaveof 172.17.0.2 6379
OK
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:172.17.0.2
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:42
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:afd4ad72b47ce253b15470232f20ae5e4f768b29
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:42
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:43
repl_backlog_histlen:0
添加成功
6.登陆master查看信息
[root@aliyun ~]# docker exec -it redis-master /bin/bash
root@fb8299058ead:/data# redis-cli
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.17.0.3,port=6379,state=online,offset=574,lag=1
slave1:ip=172.17.0.4,port=6379,state=online,offset=574,lag=1
master_replid:afd4ad72b47ce253b15470232f20ae5e4f768b29
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:574
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:574
信息中可以看到两个slave的信息(ip、端口、状态等内容)
7.测试主从同步
在master节点存数据,看slave节点是否能获取到
[root@aliyun ~]# docker exec -it redis-master /bin/bash
root@fb8299058ead:/data# redis-cli
127.0.0.1:6379> set name 12345
OK
127.0.0.1:6379> get name
"12345"
127.0.0.1:6379> exit
root@fb8299058ead:/data# exit
exit
进入slave1节点查看数据(同步成功)
[root@aliyun ~]# docker exec -it redis-slave-1 /bin/bash
root@38493fef3e03:/data# redis-cli
127.0.0.1:6379> get name
"12345"
127.0.0.1:6379> exit
root@38493fef3e03:/data# exit
exit
进入slave2节点查看数据(同步成功)
[root@aliyun ~]# docker exec -it redis-slave-2 /bin/bash
root@7d4124eb4f7b:/data# redis-cli
127.0.0.1:6379> get name
"12345"
127.0.0.1:6379>
二、搭建哨兵
1.在每个容器中安装vim,psutils
#需要进入容器中执行
apt-get update
apt-get install vim
apt-get install procps
2.在每个容器中创建哨兵文件
#sentinel.conf
port 26379
daemonize yes
logfile "sentinel.log"
sentinel monitor mymaster 172.17.0.2 6379 2
其中,sentinel monitor mymaster 172.17.0.2 6379 2配置的含义是:该哨兵节点监控172.17.0.2:6379这个主节点,该主节点的名称是mymaster,最后的2的含义与主节点的故障判定有关:至少需要2个哨兵节点同意,才能判定主节点故障并进行故障转移
启动哨兵(每个节点都需要启动)
哨兵节点的启动有两种方式,二者作用是完全相同的:
redis-sentinel sentinel.conf
redis-server sentinel --sentinel
下面可以看到redis-sentinel已经启动
root@7d4124eb4f7b:/data# ps -ef
UID PID PPID C STIME TTY TIME CMD
redis 1 0 0 06:16 pts/0 00:00:11 redis-server *:6379
root 1370 0 0 09:02 ? 00:00:01 redis-sentinel *:26379 [sentinel]
root 1380 0 0 09:03 pts/1 00:00:00 /bin/bash
root 1390 1380 0 09:10 pts/1 00:00:00 ps -ef
3.查看哨兵信息
root@7d4124eb4f7b:/data# redis-cli -p 26379
127.0.0.1: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=172.17.0.2:6379,slaves=2,sentinels=3
127.0.0.1:26379>
4.演示故障转移
[root@aliyun ~]# docker stop redis-master
redis-master
随便进入一个slave节点内部
[root@aliyun ~]# docker exec -it redis-slave-2 /bin/bash
root@7d4124eb4f7b:/data# redis-cli
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:172.17.0.2
master_port:6379
master_link_status:down(这里可以看到master状态为down)
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:149730
master_link_down_since_seconds:14
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:afd4ad72b47ce253b15470232f20ae5e4f768b29
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:149730
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:43
repl_backlog_histlen:149688
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:172.17.0.3(这里可以看到master的ip已经发生了改变)
master_port:6379
master_link_status:up(状态正常)
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:150428
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:c9bea460cf62fdc27109798770e115609594e541
master_replid2:afd4ad72b47ce253b15470232f20ae5e4f768b29
master_repl_offset:150428
second_repl_offset:149731
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:43
repl_backlog_histlen:150386
redis主节点挂掉,两个slave会进行选举,时间为30秒
再将之前的master节点start,会发现之前的master已经成为slave节点
[root@aliyun ~]# docker start redis-master
[root@aliyun ~]# docker exec -it redis-master /bin/bash
root@fb8299058ead:/data# redis-cli
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:172.17.0.3
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
进去当前的master节点看下当前信息
[root@aliyun ~]# docker exec -it redis-slave-1 /bin/bash
root@38493fef3e03:/data# redis-cli
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.17.0.4,port=6379,state=online,offset=268053,lag=1
slave1:ip=172.17.0.2,port=6379,state=online,offset=268053,lag=1
master_replid:c9bea460cf62fdc27109798770e115609594e541
master_replid2:afd4ad72b47ce253b15470232f20ae5e4f768b29
master_repl_offset:268323
second_repl_offset:149731
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:268323
127.0.0.1:6379> info sentinel
127.0.0.1:6379> exit
root@38493fef3e03:/data# redis-cli -p 26379
127.0.0.1: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=172.17.0.3:6379,slaves=2,sentinels=3
127.0.0.1:26379>
到此就结束了!!!