1、redis复制是什么?
redis复制,也就是我们所说的主从复制(master/slaver机制)。根据配置和策略,主机在数据更新后,会自动同步到从机上面。master以写为主,salave以读为主。
2、能干嘛?
- 读写分离
- 容灾恢复
3、复制的原理
1.Slave启动成功连接到master后会发送一个sync命令
2.Master接到sync命令后,启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步。
3.slave连接master后,会自动进行全量复制,然后当master有数据变更时,再进行增量复制:
- 全量复制
slave服务在接收到数据库文件数据后,将其存盘并加载到内存中 - 增量复制
Master继续将新的所有收集到的修改命令依次传给slave,完成同步
4、怎么玩?
1.配置
PS.配置只需要配置从库,不需要配置主库
- 复制配置文件
redis.conf
cp - 开启后台启动:
daemonize yes
- 修改pid文件名(建议和
conf
文件名对应):pidfile /var/run/redis-xx.pid
- 修改端口(因为要启动多个redis,所以端口不能冲突):
port xxxx
- 修改log名称:
logfile "mylog-one"
- 修改rdb名称:
dbfilenmae dump-one.rdb
2.分别启动服务,检查配置是否正确
- 启动4个服务:
redis-server redis-xxx.conf
- 分别启动客户端连接对应的服务:
redis-cli -p 对应端口号
- 检查各自的身份,此时都是master:
info replication
- 检查键,此时除了6379,其它都没有key:
keys *
检查
3.一主二仆
基于步骤1和2的基础上进行
-
6380和6381的客户端,分别连接6379为master:
slaveof 主机ip:redis端口
-
检查各自的身份,此时两台变成了slave:
info replication
-
slave机检查自己的key,此时已经同步了master的key:
一主二仆keys *
-
查看日志
主机日志
4.主从复制的一些问题
-
切入点问题?比如:如果此时主机已经有k1、k2两个键,那么此时slave1从机连接主机,然后主机继续添加k3键,此时slave1的值的同步如何进行的?
答:slave1连接上master时,k1和k2同步过来;当master继续添加k3时,k3也会同步过来给slave1。也就是说,主从复制是从头开始复制master的数据到slave的,并且之后的值也会继续复制 -
从机是否可以写?
从机进行写操作报错set
是否可以进行?
答:从机不可以写,set
不可以进行
- 主机如果shutdown了,情况会如何?从机是上位还是原地待命?
答:使用info replication
看身份,从机依旧是slave
身份,也就是原地待命
-
主机shutdown,重启后,主机继续新增记录,从机还能否顺利复制?
答:可以顺利复制,一切照旧 -
其中一台从机shutdown后情况如何?如果从机重启后,它还能跟上大部队吗?
答:此时从机shutdown重启后,身份是master;因为从机和master断开了,再次启动时,除非配置到了redis.conf文件,否则它是独立的一台master。
此时它需要重新和master建立连接(slaveof 主机地址:redis端口
),只要再次连接了,那么它就变成了slave,内容依旧从头开始复制 -
如果一台从机,中途变更挂到了新的主机下面,它的数据会如何处理?
答:这台从机之前的数据会清除,然后再从新的主机那从头复制数据,以后跟它混
5.薪火相传
上一个slave可以是下一个slave的master,slave同样可以接收其他slaves的连接和同步请求,那么该slave作为了链条中下一个的master,可以有效减轻master的写压力(中间充当了master的slave,身份依旧是slave,但是它有链接它的slave)
薪火相传
6.反客为主:slaveof no one
这个是基于一主多从的时候,主机挂了,这时候可以从多个从机中,手动把其中一个从机变成新的主机。
简单来说,就是使当前数据库停止与其它数据库的同步,转成主数据库。
- 主机挂后,手动把其中一台从机变成主机
从机使用slaveof no one
命令,变成master(此时之前老大的小弟们还没挂靠这个新老大) - 之前老大的小弟们,需要手动挂靠这个新老大
slaveof 主机ip:redis端口
slaveof no one
- 如果此时之前的主机重启了,会怎么样?
答:此时之前的主机依旧是master,只不过如果之前的slave都跟了新的主机,那么此时它下面就没有slave了
5、sentinel/哨兵模式
-
是什么?
哨兵模式其实就是反客为主的自动版,根据配置,能够在后台监控主机是否故障,如果故障了,则根据配置的投票数,看哪台从机的投票数到了,则自动把该从机转成主机 -
怎么玩?
- 首先配好一主二仆模式:6379带着6380和6381
- 新增
sentinel.conf
配置文件
到放置redis.conf
文件的目录下,新建sentinel.conf文件(名字不能错):touch sentinel.conf
- 配置
sentinel.conf
(一组sentinel能同时监控多个Master)
填写内容:sentinel monitor 被监控主机名字(自己起名字) 127.0.0.1 6379 1
(1代表要达到的投票数,意思就是当主机127.0.0.1 6379挂了后,哪台从机得到1票,就接替成为新的主机) - 启动哨兵
执行命令:Redis-sentinel xxxx/sentinel.conf
(根据实际情况写路径)
下面是测试步骤
-
首先测试正常的主仆模式是否正常
-
然后让原本的主机挂掉:
主机挂掉shutdown
-
查看投票环节
投票环节 -
从机上位当主机,新的主仆关系建立,继续开工,使用
新的主仆关系info replication
查看
-
问题:如果之前的master重启回来,会不会双master冲突?
答:之前的master会成为现在主机的从机
旧master重启
6、复制的缺点
由于所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。
网友评论