Redis主从复制原理和无磁盘复制分析

java技术文章

2018-10-18

66

0

主从复制由来:

因为Redis数据是存在内存中,避免数据丢失,所以提供了数据持久化到硬盘上,服务器停掉的时候可以从持久化文件中加载到内存中,但是有时候也会出现硬盘损坏的情况,所以Redis提供了数据主从复制机制,将数据分布到不同的机器上,避免机器宕掉导致数据丢失。

 

主从复制的特点:

1、一个master是否可以有多个slave?Redis的master节点可以有多个slave节点

2、slave是否可以继续拆分成多个slave?Redis的slave可以提供给其他的slave进行连接和数据同步。

3、Redis进行数据同步期间,是否可以提供数据读写服务?Master以非阻塞的方式提供数据复制,同数据同步期间,继续给client提供写服务。

4、Slave进行数据同步的时候,是否可以对外提供读服务?slave以非阻塞的方式提供数据复制,同步数据期间,slave以旧数据对外提供服务。

5、数据持久化是否可以交给slave来实现?Master提供写服务的同时,可以关闭数据持久化,由slave来进行数据持久化,避免master提供一个单独进程进行写的开销。

6、Redis是否可以实现读写分离?Master可以单独用于数据写服务,slave用于数据的读取服务。

全部复制的安全性:

如果是全部复制的话,Master必须开启数据持久化功能,如果是降低开销关闭数据持久化,那也需要禁用master的自动重启功能,因为一旦master因为故障自动重启的话,主数据丢失,从节点会将空数据复制到从节点上,从而导致数据的丢失。

 

部分复制:

主服务器会为复制流提供一个缓冲区,主从服务器都会维护一个复制偏移量和一个master run id,如果服务器断开,从服务器会向主服务器发送一个psync命令,并且将上次复制偏移量和run id发送给主服务器,主服务器验证run id和偏倚量,如果验证通过且偏移量相同,则继续从上次中断地方开始复制,如果验证不通过和偏移量不同,则选择全量同步。

 

无磁盘复制:

主从复制主要是通过传输RDB文件到从服务器,从服务器加载RDB文件实现数据同步,但是文件的读取是很好机器性能,所以从2.8.18开始尝试无磁盘复制,主要是将RDB文件直接传输到从服务器加载,不经过硬盘做中间的存储。

主从切换: 
万一主机挂了怎么办,这是个麻烦事情,所以redis提供了一个sentinel(哨兵),以此来实现主从切换的功能,类似与zookeeper。 
我们配置两个sentinel进程

vim sentinel.conf 
    port 26379
    sentinel monitor mymaster 127.0.0.1 6000 2
    sentinel auth-pass mymaster 123456
vim sentinel.conf
    port 26479
    sentinel monitor mymaster 127.0.0.1 6000 2
    sentinel auth-pass mymaster 123456

启动sentinel服务:

redis-server sentinel.conf --sentinel

查看日志:

[7014] 11 Jan 19:42:30.918 # +monitor master mymaster 127.0.0.1 6000 quorum 2
[7014] 11 Jan 19:42:30.923 * +slave slave 127.0.0.1:6002 127.0.0.1 6002 @ mymaster 127.0.0.1 6000
[7014] 11 Jan 19:42:30.925 * +slave slave 127.0.0.1:6001 127.0.0.1 6002 @ mymaster 127.0.0.1 6000

从对应的日志观察到,一个master服务,两个slave服务 
我们现在来kill master进程

[root@localhost slave1]# ps -ef|grep redis

root      6960     1  0 19:29 ?        00:00:02 redis-server *:6000    

root      6968     1  0 19:30 ?        00:00:01 redis-server *:6001     

root      6975     1  0 19:30 ?        00:00:01 redis-server *:6002     

root      7014  6570  0 19:42 pts/0    00:00:01 redis-server *:26479                 

root      7017  6789  0 19:42 pts/5    00:00:01 redis-server *:26379                 

root      7021  6729  0 19:46 pts/3    00:00:00 grep redis

[root@localhost slave1]# kill -9 6960

我们观察日志:

[7014] 11 Jan 19:43:41.463 # +sdown master mymaster 127.0.0.1 6000

[7014] 11 Jan 19:46:42.379 # +switch-master mymaster 127.0.0.1 6000 127.0.0.1 6001

master切换了,当6000端口的这个服务重启的时候,他会变成6001端口服务的slave。
因为sentinel在切换master的时候,把对应的sentinel.conf和redis.conf文件的配置修改。
期间我们还需要关注的一个问题:sentinel服务本身也不是万能的,也会宕机,所以我们还得部署sentinel集群,像我这样多启动几个sentinel。

sentinel monitor mymaster 127.0.0.1 6000 2  这个后面的数字2,是指当有两个及以上的sentinel服务检测到master宕机,才会去执行主从切换的功能。

欢迎访问:www.hongfu951.com博客,查看更多文章

发表评论

全部评论:0条

鸿福951

努力打造一个好用的webui

热评文章

推荐文章