docker搭建redis哨兵模式集群-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>

到此就结束了!!!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值