Redis主从复制
一、什么是主从复制
- 主从复制是将一台Redis服务器的数据复制到其他Redis服务器,前者叫master/leader主节点,后者成为从节点slave/follower,数据库的复制是单项的,只能由主–>从,master以写为主,slave以读为主,利用主从复制实现读写分离,最低配的主从复制也需要一主二从。
- 主从复制中,从节点只能进行读操作,如果在从节点执行写命令则会报错,主节点可以执行读写操作,但我们网网规定主节点只能进行写操作,这样也是符合了读写分离;默认情况下,每个Redis服务器都为主节点,即master。
二、主从复制的作用
- 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式
- 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速故障恢复,实际上是一种服务的冗余
- 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,从节点提供读,即写redis数据库时app连接主节点,读时连接从节点,分担服务器压力,尤其是写少读多场景下,通过多个从节点分担读的流量,可以大大提高redis服务器并发量
- 高可用基石:主从复制还是哨兵和集群能够实施的基础,因此说主从复制是redis高可用的基础
三、Redis集群搭建
使用单台电脑配置主从复制,一主二从,每个redis默认都为主节点,可以用info replication查看当前redis库信息,在配置的时候只需配置从机即可,主机不必理会
1、修改配置文件
- 复制出多份配置文件,并修改配置(修改端口、log文件名、dump.rdb)
- 修改端口号,为了保留原来的配置文件,我将红框文件复制出来了三份,集群用复制出来的三个配置文件做, 打开每个配置文件,将端口号修改,每个配置文件对应一个端口号,我就用6379、6380、6381了:
- 修改日志文件名:
- 修改dump.rdb,防止三个redis-server生成的持久化文件重名,该文件是redis的RDB方式持久化生成的数据文件:
2、启动Redis server
- 打开命令行,cd切到redis安装目录下,然后输入命令:
# redis-server.exe 不同的配置文件名.conf
redis-server.exe redis6380.conf
回车即启动成功,不同端口的redis带上不同配置文件即可。需要注意的是每个redis都要打开一个命令窗口。没有banner图也并非是失败,正常情况。我的有的也没有显示启动图标,呐,你看,这也是启动成功了:
3、命令方式配置主从复制
- 首先需要将三个Redis服务的客户端启动并连接到服务器
打开一个命令窗口,切换到redis根目录,输入命令redis-cli.exe -p 6380,-p属性为指定启动的端口号,这里我是用6379作为主机,80跟81作为从机,每个redis-cli都要打开一个命令窗口,特别强调这点是因为我女朋友想要在一个命令窗口操作三个redis-cli…如下为客户端启动了,可以输入ping命令,执行如果返回pong则为成功连接到服务端。
- 输入命令配置主从节点
在文章最开始提到说默认情况下,每台redis服务都为主节点,所以在配置主从复制时,不须配置主节点,只需要将从节点配置好即可,在从机的客户端输入命令,回车即可:
# slaveof 主机ip 主机port
slaveof 127.0.0.1 6379
如果返回OK,则配置成功,此时可以输入命令:
info replication # 查看当前库信息
4、配置文件方式配置主从复制
- 使用命令是暂时的,关机重启,配置即失效,配置文件是永久的
四、主从服务器宕机问题
1、主机宕机
- 当主机宕机后,从机是否还可正常运行?
如果采用的是命令的配置方式,那么当主机宕机,从机立马恢复这个默认主节点,即恢复成主机;如果采用的是配置文件的方式配置的主从复制,当主机宕机,从机依旧连接着主机,只是整个集群只有读操作,没有写操作,此时从机的数据不再会有更新,等采用了哨兵模式,该问题将会被解决 - 主机宕机后又重启了,主从复制的关系是否能恢复?
如果是命令配置的,自然不会恢复,如果是配置文件的方式配置,当主机宕机,从机依旧是连接主机的状态,一旦主机恢复,从机立马感应到,依旧可以从主机中继续获取数据
2、从机宕机
从机宕机后,对主机毫无影响,如果是命令配置的,那么宕机之后,重新开机需要重新配置,如果是配置文件配置的,那么宕机重启后,立马连回主机,执行全量复制,将主机中的数据一并拿过来
五、主从复制原理(全量/增量复制)
slave启动成功连接到master后会发送一个sync同步命令,master接到命令,启动后台的存盘进程,同时收集所有接收到的用于修改数据集的命令,在后台执行完毕之后,master将传送整个数据文件到slave,并完成一次全量复制,而slave服务在接收到master传来的数据库文件数据后,将其存盘并加载到内存,随后如果master服务有数据变化,则进行增量复制,master继续将新的所有收集到的修改命令依次传给slave,完成同步。需要注意的是只要是重新连接master,一次完全同步(全量复制)将自动执行