## 1. 主从复制的概念
1. 主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(Master/Leader),后者称为从节点(Slave/Follower)数据的复制是单向的!只能由主节点复制到从节点(主节点以写为主、从节点以读为主)
2. 默认情况下,每台Redis服务器都是主节点,一个主节点可以有0个或者多个从节点,但每个从节点只能有一个主节点
### 1.1. 主从复制的能够解决
1. 读写分离,性能扩展(主节点负责写入、从节点负责读取)
2. 容灾快速恢复(一般建议配置一主多从的方式、当从服务器A出现问题,可以快速切换到从服务器B)
3. 如果当主服务器出现问题呢?这个时候可以配置一主多从集群模式A、B,A、B之间建立某种联系,当主A出现问题,马上可以切换到主B
![在这里插入图片描述](https://img-blog.csdnimg.cn/e21a4c1d92c7476ebcc9b6bd00517e6a.png)
## 2.注册复制的环境搭建
1. 进入redis的客户端执行`info replication`
![在这里插入图片描述](https://img-blog.csdnimg.cn/f416ab1a2552477dab5a8061c21239d6.png)
2. 既然需要启动多个服务,就需要配置多个配置文件。每个配置文件对应修改以下信息:`(端口号、pid文件名、日志文件名、rdb文件名)`;将原本解压的redis.conf保持不变,`前提给redis设置密码和支持后台启动能够远程访问的配置`,分别复制到
![在这里插入图片描述](https://img-blog.csdnimg.cn/4478178fcdec4b82bcc6dd42e30c9acb.png)
- 主节点(6380端口)
```javascript
# master文件夹 【做主节点】
port 6380
logfile "6380.log"
pidfile /var/run/redis_6380.pid
dbfilename dump6380.rdb
```
- 从节点1
```javascript
# save1文件夹 【做从节点1】
port 6381
logfile "6381.log"
pidfile /var/run/redis_6381.pid
dbfilename dump6381.rdb
replicaof 127.0.0.1 6380
masterauth "123456"
```
- 从节点2
```javascript
# save1文件夹 【做从节点2】
port 6382
logfile "6382.log"
pidfile /var/run/redis_6382.pid
dbfilename dump6382.rdb
replicaof 127.0.0.1 6380
masterauth "123456"
```
3. 进入redis的src目录下`/usr/local/java/redis-7.0.8/src`根据指定的配置文件启动redis
```javascript
./redis-server /usr/local/redis/master/redis.conf
./redis-server /usr/local/redis/slave1/redis.conf
./redis-server /usr/local/redis/slave2/redis.conf
ps -ef |grep redis
```
![在这里插入图片描述](https://img-blog.csdnimg.cn/a7ede5cde6704687984b6cb3a030d76c.png)
4. 【命令式,暂时性,重启后失效】一主二从配置,默认情况下,每台Redis服务器都是主节点,我们一般情况下只用配置从机就好了。使用SLAVEOF host port就可以为从机配置主机了
- 6381服务听从6380主节点
```javascript
# 6381
# SLAVEOF host port
# 二个从机 都 认 127.0.0.1 6380 为老大
127.0.0.1:6381> SLAVEOF 127.0.0.1 6380
OK
# Replication
role:slave # 角色:奴隶(从属)
master_host:127.0.0.1 # 老大的ip
master_port:6380 # 老大的端口
```
![在这里插入图片描述](https://img-blog.csdnimg.cn/e676d376412542fa9d02ac02fd7aaad9.png)
- 6382服务也听从6380主节点
```javascript
# 6382
# SLAVEOF host port
# 二个从机 都 认 127.0.0.1 6380 为老大
127.0.0.1:6382> SLAVEOF 127.0.0.1 6380
OK
# Replication
role:slave # 角色:奴隶(从属)
master_host:127.0.0.1 # 老大的ip
master_port:6380 # 老大的端口
```
![在这里插入图片描述](https://img-blog.csdnimg.cn/16c859d1a281492288d5d99c67ce9f8f.png)
- 此时来到6380主节点,查看下面有几个小弟
```javascript
info replication
```
![在这里插入图片描述](https://img-blog.csdnimg.cn/b48eba6dd16c43029b5a8d22da0d5191.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/c2db379d1246430cb7827548df27e354.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/03aaced2738a42e496e9ab358a69a1e3.png)
## 3. 主从复制 - 如何使用
1. 从机自动保存主机的所以数据
2. 从机只能读,不能写,主机可读可写但是多用于写
3. 当主机断电宕机后,默认情况下从机的角色不会发生变化 ,集群中只是失去了写操作,当主机恢复以后,又会连接上从机恢复原状
4. 当从机断电宕机后,若不是使用配置文件配置的从机,再次启动后作为主机是无法获取之前主机的数据的,若此时重新配置称为从机,又可以获取到主机的所有数据。这里就要提到一个同步原理
5. 第二条中提到,默认情况下,主机故障后,不会出现新的主机,有两种方式可以产生新的主机
- 从机手动执行命令`slaveof no one`,这样执行以后从机会独立出来成为一个主机
- 使用哨兵模式(自动选举)
6. 反客为主(谋朝篡位):如果主机断开了连接,我们可以使用SLAVEOF no one让自己变成主机!其他的节点就可以手动连接到最新的主节点(手动),如果这个时候老大修复了,也不能让失去的从节点回归
7. 薪火相传:上一个Slave可以是下一个slave的Master,Slave同样可以接收其他 slaves的连接和同步请求,那么该slave作为了链条中下一个的master, 可以有效减轻master的写压力,去中心化降低风险
- 用 slaveof ip port
- 风险是一旦某个slave宕机,后面的slave都没法备份
![在这里插入图片描述](https://img-blog.csdnimg.cn/b84743846c3147a697d014207342b94e.png)
## 4. 主从复制 - 原理
1. 主从复制原理解析:
- 当从连接上主服务器之后,从服务器向主服务发送进行数据同步消息 - 全量复制
- 主服务器接收到从服务器发送过来同步消息,把主服务数据进行持久化rbd文件,把rdb文件发送从服务器,从服务器拿到rdb进行读取
- 每次主服务器进行写操作之后,和从服务器进行数据同步(这里是主服务器主动) - 增量复制
2. 图解
> slave启动,同步初请
> 首次链接,全量复制
> 心跳持续,保持通信(10s)
> 进入平稳,增量复制
> 从机下线,重连续传
![在这里插入图片描述](https://img-blog.csdnimg.cn/4ecba17933ba490286181ce044611764.png)
3. 复制的缺点
- 复制延时,信号衰减
- master挂了,导致不能写入,其他从节点只能进行读取,从机并不会上位