redis 通过主从复制可以允许多个salve server拥有和master server相同的数据库副本。
Redis主从复制的特点:
1.Master可以拥有多个Salve
2.多个Slave可以连接同一个Master外,还可以连接到其他的Slaver。(这样就有机会将Master做成主备。根据心跳当Master挂掉的时候,备用的Slaver可以迅速变为Master)
3.主从复制不会阻塞master,在同步数据时,master可以继续处理client请求
4.提高系统的伸缩性
Redis主从复制的过程:
1.Slave与Master建立连接,发送sync同步命令
2.Master收到命令后会启动一个后台进程,将数据库快照保存到文件中(RDB持久化过程),同时master 主进程会开始收集新的写命令并缓存
3.当快照完成过,Master会将快照文件和所有的缓存发送给slave
4.Slave接收到后,会载入快照文件并且执行收到的缓存的命令
5.之后,Master每当接收到写命令时就会将命令发送给Slave,从此保证数据的一致性
注: 主库接收到SYNC命令时会执行RDB持久化过程,即使在配置文件中的禁用RDB持久化也会生成。如果主库所在的磁盘的IO性能较差,那么这个复制过程就会出现瓶颈,可以开启redis的无磁盘复制功能
repi-diskless-sync yes
原理就是:Redis在与从数据库进行复制初始化时将不会将快照存储到磁盘,而是直接通过网络发送给从数据库,避免了IO性能差的问题
配置主从服务器:
配置slave服务器,只需要在slave的配置文件中加入以下配置
slaveof masterip port # 指定master的IP和port
masterauth 密码 #master的密码
或者在启动slave以后,采用redis-cli连接后执行 slaveof masterip port 这条指令
主从架构架构中出现宕机:
1.Slave宕机
Slave重新启动加入到主从架构时,自动完成同步数据。在redis2.8之前是进行的全量复制,在redis2.8之后是进行的增量复制。
2.Master宕机
1).在Salver中执行slaveof no one命令,断开主从关系。防止主库起来后冲掉从库数据
2)将主库重新启动后,执行slaveof命令,将其设置为其他的库的从库。这时数据就能更新回来。
这个过程容易出错,可以采用redis的哨兵(sentinel)来自动执行
哨兵(sentinel)的作用就是对redis的运行情况进行监控,是一个独立的进程,也就相当于守护进程。
它的功能有两个:
1.监控主数据库和从数据库是否运行正常
2.主数据库出现故障后自动将从数据库(如果有多个从,根据投票选举)升为主库