资源有限,本文使用Docker部署
主从模式中,由一个主服务器和多个从服务器组成,写入主节点的数据会被复制到从节点上,这样一旦主节点出现故障,应用系统就能切换到从节点去读写数据,提升系统的可用性。
再采用主从复制模式里默认的读写分离机制,就能提升系统的缓存读写性能。
总结:
主从模式简述:
当有应用向一台Redis服务器中写数据时,这个数据可以复制同步到一台或多台Redis服务器,这个数据源服务器被称为主服务器(master),其他服务器被称为从服务器(slave)。
结构图:
docker run -itd --name redis-master -p 6379:6379 redis:6.0
docker run -itd --name redis-slave -p 6380:6380 redis:6.0
# docker inspect redis-master | grep "IPAddress"
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2",
# 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
127.0.0.1:6379> INFO replication
# Replication
role:slave
master_host:172.17.0.2
master_port:6379
master_link_status:up
[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
如果还有其他的从节点,操作步骤同上
注意:将上个实验的容器删除,重新部署,所以名称相同
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
[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
或
的关系在主服务器中通过info replication
可查看数据偏移量的master_repl_offset
数据
master_repl_offset:1666
然后在从服务器上查看是否一致,如果一致,就说明主从服务器间的数据是同步的。
在主服务器上创建一个键值对,然后再次查看,如果主从服务器的master_repl_offset
还是相同说明数据同步成功。
本文内从整理自基于Docker的Redis入门与实践