redis主从复制

一、redis主从复制的过程

  • (1)主从redis服务器启动后,从服务器连接主服务器要求同步数据

  • (2)主服务器接到同步命令后,从当前内存中通过rdb形式导出一份数据,并把数据传输给从服务器

  • (3)从服务器把接收的rdb文件加载到内存中,同时主服务器把快照之后更改的数据缓存起来,等从服务器把rdb文件加载完后,再把这部分缓存数据传输给从服务器。

  • (4)之后都是通过replicationFeedSlaves通知从服务器来同步数据

二、redis主从复制环境搭建

假如我们有4台redis服务器

  • 主服务器(Master):192.168.18.200

  • 从服务器(slave): 192.168.18.201, 192.168.18.202, 192.168.16.203

1、分别配置各从服务器(配置项基本一致)
(1)配置从服务器201,指定它的主服务器,并开启它的RDB持久化选项

在配置文件中搜索slaveof:(redis-3.0配置文件大约在205行左右):

格式:·slaveof 主服务器IP 主服务器redis端口·

  1. slaveof 192.168.18.200 6379
(2)配置从服务器202,指定它的主服务器,并关闭它的RDB持久化选项和AOF选项
(3)配置从服务器203,指定它的主服务器,并关闭它的RDB持久化选项和AOF选项
2、配置主服务器(这个是非必须的)

关闭主服务器的RDB持久化,即将save选项注释掉

  1. #save 900 1
  2. #save 300 10
  3. #save 60 10000
3、在主服务器中写入数据,在从服务器查看数据

在主服务器写入数据:

  1. [root@192 bin]# ./redis-cli
  2. 127.0.0.1:6379> set name shixinke
  3. OK
  4. 127.0.0.1:6379> set website shixinke.com
  5. OK
  6. 127.0.0.1:6379> set city hangzhou
  7. OK

在从服务器201上查看:

  1. 127.0.0.1:6379> keys *
  2. 1) "age"
  3. 2) "website"
  4. 3) "name"
  5. 4) "city"

在从服务器202上查看:

  1. 127.0.0.1:6379> get name
  2. "shixinke"
  3. 127.0.0.1:6379> get website
  4. "shixinke.com"
  5. 127.0.0.1:6379> get city
  6. "hangzhou"

在从服务器203上查看:

  1. 127.0.0.1:6379> keys *
  2. 1) "city"
  3. 2) "website"
  4. 3) "name"
  5. 4) "age"

如果出现获取不到主服务器的数据的问题,可能是从服务器连接主服务器失败,主要原因可能是防火墙,关闭防火墙或者开放相应的端口即可(比较方便的做法是关闭防火墙,毕竟主从服务器一般都在内网,service iptables stop)

三、redis主从复制其他设置

(1)为主从服务器连接设置密码

主服务器设置密码:redismaster为此处实验用的密码

  1. requirepass redismaster

从服务器配置添加上密码:

  1. masterauth redismaster
(2)开启从服务器只读模式
  1. slave-read-only yes

四、主从复制的缺陷

当redis主服务器宕机后,那么当 Slave进行重新连接时,需要重新获取整个Master的内存快照,Slave所有数据跟着全部清除,然后重新建立整个内存表,一方面Slave恢复的 时间会非常慢,另一方面也会给主库带来压力