redis 主从复制
-
master 负责写入,slave 负责读,读写分离来提高并发
-
一主多从,从服务器数量不限制,但是主服务器只能一台(如果 master 为多台,多个 master 都修改了同一个 key,不晓得以哪个为准)
-
salve 挂了会被自动剔除,master 挂了需要手动把 salve 升级为新的 master
环境搭建
在同一台 linux 服务器上部署三个 redis 服务,一主两从
-
创建一个文件夹,比如 /myredis,复制一个默认的配置文件(redis.conf)到这个文件夹中,redis.conf 将作为公共配置文件
-
在文件夹中,创建三个配置文件,比如 redis6379.conf、redis6380.conf、redis6381.conf(内容和 redis.conf 相同,可以直接复制 redis.conf 文件)
-
在三个配置配置文件中写入如下内容
# 三个配置文件中这句相同,表示都用这个公共配置文件 include /myredis/redis.conf # 三个配置文件中这句各不相同,指定 pid pidfile /var/run/redis_6379.pid # 三个配置文件中这句各不相同,指定端口 port 6379 # 三个配置文件中这句各不相同,指定持久化文件 dbfilename dump6379.rdb
-
用这三个配置文件 redis6379.conf、redis6380.conf、redis6381.conf 启动三个服务
-
此时三台服务能启动成功,但并没有主从关系,三台服务器都是独立的 master
-
可以分别登录三台 redis 使用
info replication
命令查看主从关系127.0.0.1:6379> info replication # Replication role:master # 角色是 master(三台都是 master) connected_slaves:0 master_failover_state:no-failover master_replid:f89899f38875ae46a3cae207a50be4197aceb5d3 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:0 second_repl_offset:-1 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0
-
-
配置主从关系
- 连接 6380 redis 服务,
redis-cli -p port 6380
,执行命令slaveof 127.0.0.1 6379
- 连接 6381 redis 服务,
redis-cli -p port 6381
,执行命令slaveof 127.0.0.1 6379
- 连接 6380 redis 服务,
-
此时执行命令
info replication
就会发现主从关系已经配置好了- 这时在主机中写入一条命令,到从机中是能查到数据的
- 在从机中写入命令会报错,主从模式,主才能写,从是只读的
从机挂了后重新启动,需要手动配置从机角色
当从机挂了(可以手动模拟,shutdown 或者 kill -9),再次启动从机,使用 info replication
查看会发现,当前服务并不是从机,角色是 master,所以需要再次执行命令 slave ip port 命令把当前机器加入到 redis 主从关系中
从机宕机的过程中,主机写入了数据,再次重新启动从机,这时从机会同步到宕机时主机写入的数据吗?答案是会,因为每次加入主从关系时,从机都会同步主机全量的数据到从机中
主机挂了后重新启动,自动恢复主机角色
当主机宕机,从机还是从机,不会篡位,大哥还是大哥,哪怕死了还是大哥,这时是没有主机的
主机宕机后重启,自动恢复主从关系中的主机角色,这和从机不一样,从机挂了再恢复需要重新配置,主机挂了再恢复不用配置
主机挂了,把从机升级为主机
在一台从机上执行 slaveof no one
命令即可,这台从机变成主机了
主从复制原理
全量同步(当一台新的从机加入主从关系时)
- 从机连上主机之后会发送一个消息到主机,准备进行数据同步
- 主机收到同步消息之后,主机立马进行持久化,生成 rdb 文件,然后把 rdb 文件发送给从机
- 从机接收到 rdb 文件,根据文件内容完成全量数据同步
增量同步(已经建立好了主从关系)
- 主机收到写入命令,先自己写入,然后把命令发送给从机
- 从机执行收到的命令完成单个数据同步
给从机再配置从机
当一主多从的时候,从机数量过大,同步时主机压力会很大,可以在从机下面配置从机
比如 6329 是主机,6300-6399 是从机,一主机100个从机。可以这样配置:6300-6349 作为 6350 的从机;6351-6398 作为 6399 的从机。6329 只需要同步 6350 和 6399 两台从机就行了,6350 和 6399 再去同步他们的从机。具体配置是到 6300-6349 上再次执行 slaveof 127.0.0.1 6350
,6339 同理