Redis集群部署(哨兵模式——Docker部署)

Redis集群部署(哨兵模式——Docker部署)

1、环境准备

2、开始搭建哨兵集群

2.1、启动3个redis节点

先创建如下目录,并在各个目录下配置redis.conf文件

创建文件目录
[root@node1 ~]# mkdir -p redis/rd1 redis/rd2 redis/rd3

3个redis配置文件需要调整这几个参数:

protected-mode no #关闭保护模式
bind * -::* #接受所有ip请求该redis服务

使用Docker容器启动3个redis,操作指令如下:

docker运行3个节点
[root@node1 ~]# docker run -d -v /root/redis/rd1/redis.conf:/usr/local/etc/redis/redis.conf --name redis1 redis redis-server /usr/local/etc/redis/redis.conf
[root@node1 ~]# docker run -d -v /root/redis/rd2/redis.conf:/usr/local/etc/redis/redis.conf --name redis2 redis redis-server /usr/local/etc/redis/redis.conf
[root@node1 ~]# docker run -d -v /root/redis/rd3/redis.conf:/usr/local/etc/redis/redis.conf --name redis3 redis redis-server /usr/local/etc/redis/redis.conf

查看容器运行情况
[root@node1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
a40474e05d81        redis               "docker-entrypoint.s…"   2 seconds ago       Up 2 seconds        6379/tcp            redis3
6e513af6bab0        redis               "docker-entrypoint.s…"   8 seconds ago       Up 7 seconds        6379/tcp            redis2
277780aa9cb3        redis               "docker-entrypoint.s…"   32 seconds ago      Up 32 seconds       6379/tcp            redis1


将redis2与redis3设置为redis1的从节点,查看redis1的ip地址
[root@node1 ~]# docker inspect redis1|grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.2",
                    "IPAddress": "172.17.0.2",

分别进入redis2与redis3容器,执行如下命令
[root@node1 ~]# docker exec -it redis2  redis-cli REPLICAOF 172.17.0.2 6379
OK
[root@node1 ~]# docker exec -it redis3  redis-cli REPLICAOF 172.17.0.2 6379
OK
[root@node1 ~]# 
 
查看redis1节点状态
[root@node1 ~]# docker exec -it redis1 redis-cli info Replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.17.0.3,port=6379,state=online,offset=84,lag=1
slave1:ip=172.17.0.4,port=6379,state=online,offset=84,lag=0
master_failover_state:no-failover
master_replid:46afa405f4a4444587a3f45f9d3ae7e95554fcbd
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:84
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:84
[root@node1 ~]# 

2.2、启动3个sentinel节点

哨兵主要是用来监控master节点的,当master宕机时,哨兵会先主观认为master下线(此时master还未下线),然后该哨兵会跟其他哨兵通信说“我联系不上master了你们看下”,如果其他master也联系不上,那么master就会被标记客观下线,然后其中一个哨兵就会去处理故障转移操作(谁发现水处理原则)。
哨兵判断master是否下线跟下面配置有关:

sentinel monitor mymaster 172.17.0.2 6379 2 #这里的2就是需要2个sentinel都认为master下线才是真的下线

创建3个与sentinel相关的文档,分别在这3个目录下各配置sentinel.conf的配置文件

[root@node1 ~]# mkdir -p sentinel/sn1 sentinel/sn2 sentinel/sn3 

3个sentinel的配置文件如下:

port 26379
dir /tmp
sentinel monitor mymaster 172.17.0.2 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000

使用Docker启动3个sentinel的容器

[root@node1 ~]# docker run -d --name sentinel1 -v /root/sentinel/sn1/sentinel.conf:/usr/local/etc/redis/sentinel/sentinel.conf redis redis-sentinel /usr/local/etc/redis/sentinel/sentinel.conf
[root@node1 ~]# docker run -d --name sentinel2 -v /root/sentinel/sn2/sentinel.conf:/usr/local/etc/redis/sentinel/sentinel.conf redis redis-sentinel /usr/local/etc/redis/sentinel/sentinel.conf
[root@node1 ~]# docker run -d --name sentinel3 -v /root/sentinel/sn3/sentinel.conf:/usr/local/etc/redis/sentinel/sentinel.conf redis redis-sentinel /usr/local/etc/redis/sentinel/sentinel.conf

检查哨兵集群是否搭建成功,发现已经有3台sentinel启动了,到此3个sentinel搭建完成
[root@node1 ~]# docker exec -it redis1 /bin/bash
root@1a9e87f2cd12:/data# redis-cli SUBSCRIBE __sentinel__:hello
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "__sentinel__:hello"
3) (integer) 1
1) "message"
2) "__sentinel__:hello"
3) "172.17.0.5,26379,1603492da1d237aa59d4f69f2fe49e0086b858bc,0,mymaster,172.17.0.2,6379,0"
1) "message"
2) "__sentinel__:hello"
3) "172.17.0.6,26379,c4fef119ee566ce5202b11e59e2cfb8a264108a2,0,mymaster,172.17.0.2,6379,0"
1) "message"
2) "__sentinel__:hello"
3) "172.17.0.7,26379,813076c78201fb58bb8b092b6621687c45f00d72,0,mymaster,172.17.0.2,6379,0"
^Z
[1]+  Stopped                 redis-cli SUBSCRIBE __sentinel__:hello
root@1a9e87f2cd12:/data# exit
exit
There are stopped jobs.
root@1a9e87f2cd12:/data# exit
exit

3、哨兵集群故障转移

3.1、故障转移实战

停止掉redis1节点,然后等待30s左右

[root@node1 ~]# docker stop redis1
redis1
[root@node1 ~]# 

查看sentinel日志
[root@node1 ~]# docker logs --tail=20 sentinel1

这里保错的原因是因为挂载的配置路径没有写的权限,执行chmod 777 -R 加目录即可
1:X 29 Jun 2022 03:21:24.353 # Could not rename tmp config file (Device or resource busy)
1:X 29 Jun 2022 03:21:24.353 # WARNING: Sentinel was not able to save the new configuration on disk!!!: Device or resource busy

哨兵集群发现172.17.0.2这台机器的redis宕机了
1:X 29 Jun 2022 03:39:46.232 # +sdown master mymaster 172.17.0.2 6379
1:X 29 Jun 2022 03:39:46.313 # Could not rename tmp config file (Device or resource busy)
1:X 29 Jun 2022 03:39:46.313 # WARNING: Sentinel was not able to save the new configuration on disk!!!: Device or resource busy

纪元+1
1:X 29 Jun 2022 03:39:46.313 # +new-epoch 1
1:X 29 Jun 2022 03:39:46.314 # Could not rename tmp config file (Device or resource busy)
1:X 29 Jun 2022 03:39:46.314 # WARNING: Sentinel was not able to save the new configuration on disk!!!: Device or resource busy
1:X 29 Jun 2022 03:39:46.314 # +vote-for-leader c4fef119ee566ce5202b11e59e2cfb8a264108a2 1
1:X 29 Jun 2022 03:39:47.144 # +config-update-from sentinel c4fef119ee566ce5202b11e59e2cfb8a264108a2 172.17.0.6 26379 @ mymaster 172.17.0.2 6379

redis主从切花,提拔172.17.0.3机器作为redis服务新的master节点
1:X 29 Jun 2022 03:39:47.144 # +switch-master mymaster 172.17.0.2 6379 172.17.0.3 6379

从节点加入新的master节点
1:X 29 Jun 2022 03:39:47.145 * +slave slave 172.17.0.4:6379 172.17.0.4 6379 @ mymaster 172.17.0.3 6379
1:X 29 Jun 2022 03:39:47.145 * +slave slave 172.17.0.2:6379 172.17.0.2 6379 @ mymaster 172.17.0.3 6379

查看172.17.0.3(redis2)发现role已经从slave变成了master,说明哨兵集群运行ok
[root@node1 ~]# docker exec -it redis2 redis-cli info Replication
# Replication
role:master
connected_slaves:1
slave0:ip=172.17.0.4,port=6379,state=online,offset=361364,lag=1
master_failover_state:no-failover
master_replid:712789c9b75cca7f19529c0339c6c8bcc72f8ec9
master_replid2:d68b5f7e3366440f58fb73d94e112e21f154ad06
master_repl_offset:361364
second_repl_offset:227848
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:361364
[root@node1 ~]# 

查看redis1重启后的状态,发现redis1自动加入了redis2作为其从节点。
[root@node1 ~]# docker start redis1
redis1
[root@node1 ~]# docker exec -it redis1 redis-cli info Replication
# Replication
role:slave
master_host:172.17.0.3
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_read_repl_offset:378914
slave_repl_offset:378914
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:712789c9b75cca7f19529c0339c6c8bcc72f8ec9
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:378914
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:378487
repl_backlog_histlen:428

到此哨兵集群搭建完成。
上篇:【redis主从集群部署
下篇:【Redis集群部署(cluster模式——Docker)

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值