用Docker搭建Redis主从复制的集群

1 127.0.0.1:6379> info replication

2 # Replication

3 role:master

4 connected_slaves:2

至此配置完成一主两从模式的主从模式,此时如果到两台从服务器里运行get name命令,返回是空,如果到redis-master容器所在的命令行窗口,在其中运行set name Peter后,再到两台从服务器里运行get name命令,就能看到返回值。这说明主从模式配置成功,主服务器里的数据会自动同步到各从服务器上。

3 通过配置搭建主从集群

在项目里可以用slaveof命令搭建主从模式的集群外,还可以用配置参数的方式来搭建,具体的步骤如下。

第一步,搭建主服务器redis-master的命令不变,依然用如下的命令,这里还是用6379端口。

docker run -itd --name redis-master -p 6379:6379 redis:latest

用docker inspect redis-master命令确认该Redis服务器所在容器的IP地址依然是172.17.0.2。

第二步,到C:\work\redis\redisConf目录里,创建配置文件redisSlave1.conf,并在其中编写如下内容。

port 6380

slaveof 172.17.0.2 6379

通过第1行的命令,设置该Redis的端口为6380,通过第2行的slaveof配置,把该Redis服务器设置成“从模式”,并连接到redis-master所在的主服务器上。

第三步,在新的命令窗口里运行如下的命令,创建名为redids-slave1的Redis服务器。该服务器的工作端口是6380,并且用redis-server后的参数指定在启动Redis服务器时加载redisSlave1.conf配置文件,

docker run -itd --name redis-slave1 -v C:\work\redis\redisConf:/redisConfig:rw -p 6380:6380 redis:latest redis-server /redisConfig/redisSlave1.conf

随后再通过docker exec -it redis-slave1 /bin/bash命令进入到该容器的命令行,由于这里Redis工作端口已经变成6380,所以需要通过redis-cli -h 127.0.0.1 -p 6380命令来进入Redis客户端,如果在其中运行info replication命令,能看到如下的部分结果,由此能进一步确认redis-slave1服务器已经从属于redis-master服务器。

1 root@80e7ae14a322:/data# redis-cli -h 127.0.0.1 -p 6380

2 127.0.0.1:6380> info replication

3 # Replication

4 role:slave

5 master_host:172.17.0.2

6 master_port:6379

第四步,到C:\work\redis\redisConf目录里,创建配置文件redisSlave2.conf,并在其中编写如下内容。

port 6381

slaveof 172.17.0.2 6379

这里用到了6381端口,同样也通过slaveof命令连接到redis-master服务器上。随后在新的命令窗口里运行如下的命令,创建名为redids-slave2的Redis服务器。该服务器的工作端口是6381,并且用redis-server后的参数指定在启动Redis服务器时加载redisSlave2.conf配置文件,

docker run -itd --name redis-slave2 -v C:\work\redis\redisConf:/redisConfig:rw -p 6381:6381 redis:latest redis-server /redisConfig/redisSlave2.conf

随后再通过docker exec -it redis-slave2 /bin/bash命令进入到该容器的命令行,由于这里Redis工作端口已经变成6381,所以需要通过redis-cli -h 127.0.0.1 -p 6381命令来进入Redis客户端,这里可以再通过info replication命令确认配置效果,部分运行结果如下所示。

1 root@6017108b97c4:/data# redis-cli -h 127.0.0.1 -p 6381

2 127.0.0.1:6381> info replication

3 # Replication

4 role:slave

5 master_host:172.17.0.2

6 master_port:6379

至此完成了以配置文件设置主从复制集群的设置,此时如果到主服务器redis-master所在的客户端里运行set age 18命令,再到redis-slave1和redis-slave2这两台从服务器里运行get age命令,能看到age的值,由此能再次确认主从服务器之间能同步数据。

4  配置读写分离效果

如果在上文里配置的redis-slave1和redis-slave2这两台从服务器里,运行info replication命令,还能看到“slave_read_only:1”这项配置,说明从服务器默认是“只读”的,如果到redis-slave1的Redis客户端命令行里输入set val 1,会看到如下第2行所示的错误,从而能进一步验证该Redis服务器的“只读”属性。

127.0.0.1:6380> set val 1

(error) READONLY You can’t write against a read only replica.

对于Redis从服务器而言,建议采用默认的“只读”配置,因为在项目里,一般不会向作为数据同步目的地的“从服务器”上写数据。如果业务上确实需要,可以通过如下的步骤设置“可读可写”的效果。

第一步,在上文提到的redisSlave2.conf配置文件里再加入一行“slave-read-only no”的配置,指定该服务器可读可写。

第二步,如果上文提到的redis-slave2容器还处于活动状态,则需要先用docker stop redis-slave2停止该容器,随后再用docker rm redis-slave2命令删除该容器,之后可以再用如下的命令再次创建redis-slave2容器。

docker run -itd --name redis-slave2 -v C:\work\redis\redisConf:/redisConfig:rw -p 6381:6381 redis:latest redis-server /redisConfig/redisSlave2.conf

在redis-server命令后所带的redisSlave2.conf配置文件里,已经用“slave-read-only no”配置项设置了“可读可写”的模式。

第三步,再通过docker exec -it redis-slave2 /bin/bash命令进入到该容器的命令行,再通过redis-cli -h 127.0.0.1 -p 6381命令进入Redis客户端, 此时如果再运行set val 1命令,就能成功写入数据。

5 用心跳机制提升主从复制可靠性

在Redis主从复制模式里,如果主从服务器之间有数据同步的情况,那么从服务器会默认以一秒一次的频率,向主服务器发送REPLCONF ACK命令,依次来确保两者间连接通畅。这种定时交互命令确保连接的机制就叫“心跳”机制。在上文开启的redis-master这个主服务器的命令行里,如果运行info replication命令,能看到它从属服务器的“心跳”状况。

1 127.0.0.1:6379> info replication

2 # Replication

3 role:master

4 connected_slaves:2

5 slave0:ip=172.17.0.3,port=6380,state=online,offset=16185,lag=1

6 slave1:ip=172.17.0.4,port=6381,state=online,offset=16185,lag=1

其中在第5行和第6行里,能通过lag表示该从属服务器发送REPLCONF ACK命令的时间,这里均是1秒,这表示两台从服务器和主服务器的连接均属通畅。

这里大家可以想象下,如果从服务器宕机,那么主从复制就没有意义了。对此,可以通过如下的步骤来关联心跳机制和主动复制的动作。

第一步,在C:\work\redis\redisConf目录里新建redisMaster.conf文件,在其中编写如下的代码。

min-slaves-to-write 2

min-slaves-max-lag 15

第1行的参数表示实现主从复制的从服务器个数最少是2台,第2行的参数表示,如果有第1行参数指定的从服务器个数(这里是2台)的心跳延迟时间(即lag值)大于15秒,不执行主从复制。

这两个条件是“或者”的关系,即只要出现从服务器个数小于2,或者2台从服务器的心跳延迟时间大于15秒,主服务器即停止主从复制的操作。

第二步,通过如下的命令启动redis-master容器,由于此时启动Redis服务器时已经加载了上述配置,所以该Redis主服务器在执行主从复制时,会检测第一步所设置的条件。从而能提升主从复制的可靠性。

docker run -itd --name redis-master -v C:\work\redis\redisConf:/redisConfig:rw -p 6379:6379 redis:latest redis-server /redisConfig/redisMaster.conf

6 用偏移量检查数据是否一致

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结

我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。

面试题多多少少对于你接下来所要做的事肯定有点帮助,但我更希望你能透过面试题去总结自己的不足,以提高自己核心技术竞争力。每一次面试经历都是对你技术的扫盲,面试后的复盘总结效果是极好的!

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
心思,如果你再不努力,差距也只会越来越大。

面试题多多少少对于你接下来所要做的事肯定有点帮助,但我更希望你能透过面试题去总结自己的不足,以提高自己核心技术竞争力。每一次面试经历都是对你技术的扫盲,面试后的复盘总结效果是极好的!

[外链图片转存中…(img-oCMIdGE7-1712490088655)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值