Redis集群教程 官方文档
Redis集群规范官方文档
关于主从复制的redis.conf配置,详情见上面配置文件8)、REPLICATION
单机多节点方式
本地tar.gz搭建单机多节点方式。但我使用的是下面的docker方式
1 | [root@localhost redis]# cp redis.conf redis79.conf |
Docker容器方式
关于配置文件,可查看手写配置文件模式
初始化
提前给出for循环代码
1 | for n in $(seq 79 81); \ |
1 | # 1. 创建Docker自定义网络 |
主机变从机
(1)启动三个Server 79、80、81。启动后默认都是 master,并且下面都没有从机。
(2)此时,把80,81执行命令SLAVEOF 172.22.0.79 6379 # 当79的从机
(3)此时,79仍为 master,但下面跟了两个从机 80、81。注意:此时的 80、81也变成了从机 slave。
1)、先进入79容器,查看信息
1 | [root@localhost ~]# docker exec -it redis79 redis-cli |
2)、接下来,我们再开启一个xshell会话标签,连接80,把80默认的主机设置为从机
1 | [root@localhost ~]# docker exec -it redis80 redis-cli |
3)、此时,我们再对79进行查看,发现,多个一个从机80
1 | 127.0.0.1:6379> INFO replication # 查看副本信息 |
4)、同理,我们再新建一个xshell会话框,对81进行设置为从机
1 | [root@localhost ~]# docker exec -it redis81 redis-cli |
5)、此时,我们看到79下面,有了两个从机80 和 81
1 | 127.0.0.1:6379> INFO replication # 查看副本信息 |
主写从读
还是这张图,此时,只能 79 进行 set。而 80、81只能查。所以称之为:主写从读
1)、我们查看79, 80, 81 里面所有的key,发现都是空
1 | # 79 |
2)、我们对79进行set一个key,发现80, 81也能查到
1 | # 79 |
3)、我们对80 ,81从机分别进行set一个key,发现,不能设置。
结论:只有主机可写,从机只能读。
1 | # 80 |
主机挂了
主机 79 挂了,查看从机 80,81 状态,发现80、81仍然是从机,因为没有配置哨兵,所以还连接到79主机。
主机 79 回来了,并对 79 set一个key,再查看从机80、81状态,发现仍可以正常获取结果(主机恢复还会继续同步)
1)、主机 79 挂了,查看从机 80,81 状态,发现80, 81仍然是从机,因为没有配置哨兵,所以还连接到79主机。
1 | # 79 |
2)、主机 79 回来了,并对 79 set一个key,再查看从机80, 81状态,发现仍可以正常获取结果
1 | # 79 |
从机挂了
80从机挂了,79 set一个key,再启动 80。
情况1、80配置文件中指定了当 79从机,那么会以 slave方式启动,启动后会进行全量复制,则可以查看到数据。
情况2、80配置文件中未指定当 79从机,那么会以 master方式启动,启动后不进行任何复制。会选择加载自己的 RDB,或 AOF,所以此时查看不到数据。
若此时执行了命令SLAVEOF 172.22.0.79 6379 # 当79的从机
,那么也会进行全量复制,则可以查看到数据。
1)、从机80挂了
1 | # 80 |
2)、此时,对79主机,set一个key,
1 | # 79 |
3)、再次启动80,还能继续拿到刚才的key吗?答:不能
如果在配置文件指定好主人的话,启动服务端后,默认就是从,进行全量复制
如果从机进行命令行指定主人的话,重启server端,默认启动变成主机(因为命令行属于临时操作,重启不会生效)
1 | [root@localhost ~]# docker start redis80 |
4)、再把80变为79下的从机,发现79下的数据,全部被同步过来了【全量复制】
1 | 127.0.0.1:6379> SLAVEOF 172.22.0.79 6379 # 当79的从机 |
增/全量复制
slave第一次连接master时,会给master发送一个sync同步命令。(第一次建立连接也就是执行slaveof命令,或写入配置文件,第一次启动server端时)
master接收到命令之后,master启动后台的存盘进程,同时收集所有接收到用于修改数据的命令,在后台执行完毕之后,
master将传送整个数据文件给slave,并完成一次数据的同步。
全量复制:而slave接收到数据文件之后,将其存盘并加载到内存中。
增量复制:master继续将新的所有收集到的所有修改数据的命令依次传给slave,完成同步。
只要重新连接master,就会自动进行一次完全同步(全量复制)。
1)、全量复制
1 | # 80 |
2)、增量复制
1 | # 79 |
多层链路
我们让 80当79从机,81当80从机。
此时
79:主,下面有个从 80
80:从,下面有个从 81
81:主,下面无从
1 |
|
手动从变主
81 主机挂了,80从机执行
SLAVEOF no one # 自己由从机变为主机
,可以切换角色为 master。此时,可读可写,但不会进行任何增/全量复制。
即使 81主机再次启动,80从机相当于互不影响的隔离状态。
因为81主机默认master启动,底下也不会有从机。因为我们是手动进行配置的主从关系,如果想持久化,可以写入配置文件
1)、主机81挂了,从机80自己手动变为主机
1 | # 80 |
2)、主机80回来了,底下也不会有从机。因为我们是手动进行配置的主从关系,如果想持久化,可以写入配置文件
1 | [root@localhost ~]# docker start redis80 |
手写配置文件模式
1 | # 创建网络 |
未写出演示过程,再这里写一下演示总结。
1)、for循环启动容器之后,79是主, 80 ,81是从。79(可写可读),80(只读), 81(只读)
2)、SHUTDOWN关闭79容器之后,80 , 81 依旧只读。检测到79主机挂了:master_link_status:down
3)、再次启动79主机,很快,80,81检测到79主机存活:master_link_status:up
4)、如果SHUTDOWN把80或81关闭,此时给79设置set一个key,再次启动80, 81仍是79的从机,并启动时全量同步数据。