资源有限,本文使用Docker部署
🎶主从模式介绍
主从模式中,由一个主服务器和多个从服务器组成,写入主节点的数据会被复制到从节点上,这样一旦主节点出现故障,应用系统就能切换到从节点去读写数据,提升系统的可用性。
再采用主从复制模式里默认的读写分离机制,就能提升系统的缓存读写性能。
总结:
- 提高系统可用性
- 提升读写性能
主从模式简述:
当有应用向一台Redis服务器中写数据时,这个数据可以复制同步到一台或多台Redis服务器,这个数据源服务器被称为主服务器(master),其他服务器被称为从服务器(slave)。
结构图:
- 一主一从
一主多从
🎶 搭建主从模式集群
🎶 使用命令搭建主从集群
- 运行一个容器作为master节点,端口为6379
docker run -itd --name redis-master -p 6379:6379 redis:6.0
- 再运行一个容器作为slave节点,端口为6380(注意:因为在同一台宿主机,所以端口不能重复)
docker run -itd --name redis-slave -p 6380:6380 redis:6.0
- 查看master容器信息,找到该容器的IP地址,可以看出IP地址为172.17.0.2
# docker inspect redis-master | grep "IPAddress" "SecondaryIPAddresses": null, "IPAddress": "172.17.0.2", "IPAddress": "172.17.0.2",
- 进入master容器,连接客户端,查看当前主从模式状态
# docker exec -it redis-master /bin/bash root@dd22f11d3b8c:/data# redis-cli 127.0.0.1:6379> INFO replication # Replication role:master connected_slaves:0
- 只需要信息的前几行能看到集群信息即可,可以看出此容器为主服务器,并且当前没有从服务器
- 此时通过名称为从节点的容器进入查看集群状态应该是一样的,因为此时两者并没有关联
[root@localhost ~]# docker exec -it redis-slave /bin/bash root@ff390708266d:/data# redis-cli 127.0.0.1:6379> INFO replication # Replication role:master connected_slaves:0
- 在从节点输入以下命令,指定该节点为从节点
127.0.0.1:6379> SLAVEOF 172.17.0.2 6379 OK
- 再次查看集群信息,发现可以看到集群状态,该容器已成为从节点,主节点为172.17.0.2
127.0.0.1:6379> INFO replication # Replication role:slave master_host:172.17.0.2 master_port:6379 master_link_status:up
- 回到redis-master容器上查看状态,确认集群状态
[root@localhost ~]# docker exec -it redis-master /bin/bash root@dd22f11d3b8c:/data# redis-cli 127.0.0.1:6379> INFO replication # Replication role:master connected_slaves:1 slave0:ip=172.17.0.3,port=6379,state=online,offset=364,lag=1
- 至此集群搭建成功
如果还有其他的从节点,操作步骤同上
🎶 通过配置文件搭建主从模式集群
注意:将上个实验的容器删除,重新部署,所以名称相同
- 同样创建主redis容器一个
docker run -itd --name redis-master -p 6379:6379 redis:6.0
- 创建从服务器的配置文件,并启动从服务器容器指定该配置文件
[root@localhost ~]# mkdir /data/redis/redisConf -p [root@localhost ~]# vim /data/redis/redisConf/redisslave.conf [root@localhost ~]# cat /data/redis/redisConf/redisslave.conf port 6380 slaveof 172.17.0.2 6379 [root@localhost ~]# docker run -itd --name redis-slave -v /data/redis/redisConf:/redisConfig:rw -p 6380:6380 redis:6.0 redis-server /redisConfig/redisslave.conf
- 进入到slave容器连接服务器查看redis集群状态
[root@localhost redisConf]# docker exec -it redis-slave /bin/bash root@0fea9993d4e3:/data# redis-cli -h 127.0.0.1 -p 6380 127.0.0.1:6380> INFO replication # Replication role:slave master_host:172.17.0.2 master_port:6379 master_link_status:up slave_read_only:1
至此,通过配置文件的redis主从集群已经配置完成
🎶配置读写分离
从主从服务器上通过info replication
查看状态发现一行slave_read_only:1
代表是只读
的含义
在从服务器输入以下命令发现报错,也证明了是不可写的
127.0.0.1:6380> set test 100 (error) READONLY You can't write against a read only replica.
只需要在上例配置文件中加入slave-read-only no
然后删除旧容器创建新容器即可生效,效果为可读可写
🎶 用心跳机制提高主从复制的可靠性
主从模式中,从服务器会默认以一秒一次的频率向主服务器发送REPLCONF ACK命令,依次来确保两者间连接通畅。
这种定时交互命令确保连接的机制就叫“心跳”机制。
可在主服务器通过以下命令查看到查看发送“心跳”间隔时间
[root@localhost redisConf]# docker exec -it redis-master /bin/bash root@c9ced7408758:/data# redis-cli 127.0.0.1:6379> info replication # Replication role:master connected_slaves:1 slave0:ip=172.17.0.3,port=6380,state=online,offset=1666,lag=0
lag=0说明是实时的,没有数据延迟或失败情况
在配置文件中加入以下两行可增加可靠性:
min-slaves-to-write 2 min-slaves-max-lag 15
- 第一行代表从服务器至少由两个
- 第二行代表如果lag值大于15秒,则不执行主从服务
- 两者为
或
的关系
🎶 用偏移量检查数据是否一致
在主服务器中通过info replication
可查看数据偏移量的master_repl_offset
数据
master_repl_offset:1666
然后在从服务器上查看是否一致,如果一致,就说明主从服务器间的数据是同步的。
在主服务器上创建一个键值对,然后再次查看,如果主从服务器的master_repl_offset
还是相同说明数据同步成功。
本文内从整理自基于Docker的Redis入门与实践