Redis主从复制实现:
Redis中的主从复制,也就是Master-Slave模型,其实现相对比较简单,一般使用在多个Redis实例间的数据同步以及Redis集群中用的比较多。
· 工作原理
· 特征说明
· 如何配置
· 验证使用
1、工作原理
在Master和Slave互通之后,首先,Slave会发送sync同步指令,当Master收到指令后,将在后台启动存盘进程,同时收集所有来自Slave的修改数据集的指令信息,当后台进程完成之后,Master将发送对应的数据库文件到对应的Slave中,以完成一次完整的同步工作。其次Slave在接受到数据库文件之后,将其存盘并加载到内存中。最后,Master继续收集修改命令和新增的修改指令,并依次发送给Slave,其将在本次执行这些数据的修改命令,从而最终达到数据同步的实现。
NOTE:
A、 当Master与Slave出现当机时,Slave会自动重新连接并一次性完成同步;
B、 当Master收到多个Slave发送sync指令时,其会在后台开启个队列来保持多个Slave可以有序高效的执行;
2、特征说明
A、一个Master可以同步多个Slave,实现主从复制;
B、一个Slave同时也可以接收其它Slaves的连接和同步请求,以缓解Master同步的压力;
C、Master Server是以非阻塞的方式为Slave提供服务,所以其在与Slave同步时,也可以接受正常的查询和修改的指令;
D、Slave Server同样也是以非阻塞方式完成数据同步,在同步期间,也可以继续接受客户端的查询请求;
E、Master可以将数据保存操作交给Slaves完成,从而避免了在Master中要有独立的进程来完成此操作;
3、如何配置
因为限于只有一台电脑设备,所以这里是在一台设备上同时启动两个Redis服务器实例,端口号分别为:6379和6380,具体如下操作:
A、创建6379和6380配置文件
redis.conf:6379为默认配置文件,作为Master服务配置;
redis_6380.conf:6380为同步配置,作为Slave服务配置;
B、配置slaveof同步指令
在Slave对应的conf配置文件中,添加以下内容:
slaveof 127.0.0.1 6379
NOTE:
添加slaveof指令,重启redis服务,生效Master-Slave同步执行;
修改该文件的port为6380,以及数据库文件存放为止dir,确保Master和Slave存放的数据不冲突和被覆盖;
4、验证使用
A、开启Master和Slave服务
$redis-server /redis/etc/redis.conf // 6379实例-Master
$redis-server /redis/etc/redis_6380.conf // 6380实例-Slave
然后,在两个客户端打开redis-cli:
$redis-cli –p 6379 // 6379实例客户端
$redis-cli -p 6380 // 6380实例客户端
B、在Master中添加mykey和mykey2键值
C、在Slave中检查mykey和mykey2是否存在
从上面的截图可以看出,Master和Slave已经同步完成,因为在Slave中没做任何的set/get操作,所有操作在Master进行,但是可以在Slave中查看到同样的操作。
D、在Master中删除mykey2,查看Slave中显示
在Master删除mykey2:
在Slave查看mykey2是否存在:
E、在Slave中新增和删除键可以吗?
默认在Slave中修改键会报错:
(error) READONLY You can't write against a read only slave.
原因是需要设置slave-read-only为no,重启服务之后生效,然后再执行set/get是可以的,但是不会同步到Master中去,因为需要在Master的redis.conf添加slaveof<server>:<port>才行,此时Master也已经变为Slave了。
好了,到这里已经使用例子总结说明了,Redis的复制原理、特性以及主从复制的使用。
(责任编辑:IT) |