-----前提安装好redis,操作版本为6.2.6-------
master如果配置了requirepass参数,需要密码登陆
slave就要配置masterauth来设置校验密码否则的话master会拒绝slave的访问请求。
一、设置主从模式
ip | 端口 | 角色 |
192.168.154.129 | 7001 | master |
192.168.154.129 | 7002 | slave |
192.168.154.129 | 7003 | slave |
1、进入安装目录
cd /usr/local/redis/redis-6.2.6
2、创建集群文件夹
分别创建集群文件夹7001 7002 7003
mkdir 7001 7002 7003
3、拷贝redis.conf
拷贝redis.conf分别到7001 7002 7003目录下
cp redis.conf 7001
cp redis.conf 7002
cp redis.conf 7003
也可以一次性执行下面语句
echo 7001 7002 7003 |xargs -t -n 1 cp redis.conf
4、修改配置文件
分别修改配置文件的内容如下:(:set number 命令显示文件的序号)
daemonize yes
#允许外网访问
bind 0.0.0.0
#允许外部链接
protected-mode no
#开启RDB, 关闭AOF
# save ""
#save 3600 1
#save 300 100
#save 60 10000
# 关闭AOF
appendonly no
#设置密码
requirepass 123456
#主机密码
masterauth 123456
5、修改配置文件端口、工作目录
文件每个实例的端口、工作目录和每个实例的声明IP
5.1修改端口(分别为7001 7002 7003)
port 7001
5.2每个实例的声明IP,服务器或虚拟机的IP一个虚拟机可能会出现好几个IP,在集群时可能会出现其他虚拟机读取的数据不一致,所以指定一下比较好
replica-announce-ip 192.168.154.129
5.3将rdb文件保存位置都修改为自己所在目录
dir /usr/local/redis/redis-6.2.6/7001/
#2、 端口7002 中的配置
port 7002
dir /usr/local/redis/redis-6.2.6/7002/
replica-announce-ip 192.168.154.129
#主机密码
masterauth 123456
#3、 端口7003 中的配置
port 7003
dir /usr/local/redis/redis-6.2.6/7003/
replica-announce-ip 192.168.154.129
#主机密码
masterauth 123456
6、启动服务
(因为设置了密码)
redis-server redis.conf
7、开启主从关系
7.1、通过手动执行命令设置主从(临时:重启后就失效)
# 连接 7003,进入客户端
redis-cli -h 192.168.154.129 -p 7003 -a 123456
# 执行replicaof (主节点的Ip和端口)
replicaof 192.168.154.129 7001
#执行info replication命令查看主从关系
info replication
7.1.2、测试主从同步
在主机7001上执行,其他从机可以查询到
set hello world
7.2、通过配置文件(永久有效)
在 7002与7003的配置文件redis.cof的最后一行分别添加如下:
slaveof 192.168.154.129 7001
注意:在5.0以后新增命令replicaof,与salveof效果一致。
#执行info replication命令查看主从关系
info replication
7.3、切换主节点
在7003上切换主节点为7002,执行以下语句:
slaveof 192.168.154.129 7002
此时,在7001上写数据会同步到7002,7002的数据再同步到7003上(在7002上写数据不会同步到7003上)
二、主从问题解答
- 1、从机可以执行写命令吗?
不可以,若想可以的话,可以在配置文件中将replica-read-only设置为no;
replica-read-only no
不过,若在主服务器操作与从服务同一个key值,仍然会覆盖从服务上的相同的key
- 二、从机切入点的问题
首次连接进行全量复制,后续跟随,master写,slave跟
- 三、主机宕机后,从节点会自动上位吗?
从机不会自动上位;从机依然是从机,连接断了。原地待命等待主机复活
- 四、主机宕机后,重启主机后,主从关系还在吗,从机能否顺利复制?
关系还在的,只是从机显示主机不在线,从机可以复制
三、Redis主从数据同步原理
1、主从第一次同步
主从第一次同步是全量同步
master如何判断slave是不是第一次来同步数据?
Replication Id:简称replid,是数据集的标记,id一致则说明是同一数据集。每一个master都有唯一的replid,slave则会继承master节点的replid
offset:偏移量,随着记录在repl_baklog中的数据增多而逐渐增大。slave完成同步时也会记录当前同步的offset。如果slave的offset小于master的offset,说明slave数据落后于master,需要更新。
全量同步的流程:
1、从节点发送 psync 命令给主节点,由于是第一次进行复制,从节点没有主节点的复制偏移量,所以偏移量发送为 -1,也就是需要进行全量复制。
2、主节点根据命令,解析出要进行全量复制,返回 "fullresync" 响应,并返回主节点的runid和偏移量。
3、从节点接受主节点的响应信息并保存主节点信息.
4、主节点执行 bgsave命令 ,一定会重新生成一个新的 rdb 文件(因为已有的 rdb 文件和最新的数据可能存在较大差异),进行持久化.在创建RDB文件期间的命令将保存在缓冲区中(消耗master服务器大量的cpu、内存、磁盘I/O资源)
5、当主节点执行完bgsave后,向从节点发送 rdb 文件,从节点会将接收到的 rdb 文件保存到本地硬盘.
6、主节点将生成 rdb 到从节点接收完 rdb 文件期间执行的写命令,写入缓冲区,等从节点保存完 rdb 文件后,主节点再将缓冲区中的数据补发给从节点,从节点就会把补发的数据仍然按照二进制格式追加写入到 rdb 文件中,保证主从一致.
7、从节点清空自身的旧数据.
8、从节点加载 rdb 文件,将数据库状态更新至主节点执行bgsave时的数据库状态,保证和主节点数据一致.
如果从节点加载 rdb 文件完成后,并且开启了 aof,就会把刚刚加载数据过程中产生的 aof 日志通过 bgrewrite 操作,清楚冗余数据,并进行整理.
什么时候进行全量复制,什么时候进行部分复制呢?
全量复制:
首次和主节点进行数据同步时(判断 replication id 不一样)
在部分复制的时候,发现已经超出积压缓冲区的数据范围了(repl_baklog中的offset已经被覆盖时),也会进行全量复制.
部分复制:
从节点之前从主节点上复制过数据了,或者是有网络抖动或者从节点重启而丢失数据(slave节点断开又恢复,并且在repl_baklog中能找到offset时).
2、部分复制流程
1、当主从节点之间出现网络中断时,如果超过了 repl-timeout 时间,主节点就会认为从节点故障并中断复制连接。
2、主从连接中断期间,主节点会继续接受到 “写请求” 的命令,就会把这些命令滞留在积压缓冲区中(积压缓冲区就是内存中一个简单的队列,会记录最近一段时间修改的数据,总量是有限的,随着时间的推移,就会把之前的旧数据逐渐删除掉)。
3、当主从节点网络恢复以后,从节点会继续尝试连接主节点。
4、从节点将之前保存的 replication id(run_id) 和 偏移量offset 作为 psync 的参数发送给主节点,请求进行部分复制。
5、主节点接收到 psync 请求后,进行必要的验证,随后根据 offset 去积压缓冲区(repl_back_buffer)找合适的数据,并响应 continue 给从节点. (如果主节点的 “写请求” 过多,超出积压缓冲区的范围,就只能进行全量复制了)
主节点同步长连接,持续将积压缓冲区的数据发送给从节点,同时把写命令发送给从节点,保证一致性.