一、主从复制

  • 主从复制是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者是主服务器,后者是从服务器。
  • 一主多从:只能存在一个主服务器;可以有多个从服务器。主服务器负责写操作,从服务器负责读操作
  • 复制是单向的,只能由主服务器复制到从服务器

二、主从复制的作用

  • 读写分离:主服务器负责写操作,从服务器负责读操作。可以分担服务器压力,提高并发量
  • 高可用:主服务器出现故障时,从服务器可以升级为主服务器,迅速恢复服务

三、主从复制搭建

1、创建一个文件夹:

mkdir /myredis

2、将redis.conf 复制到myredis

cp /etc/redis.conf /myredis/redis.conf

3、在 myredis 中创建三个文件:

redis6379.conf、redis6380.conf、redis6381.conf

vi redis6379.conf
 vi redis6380.conf
 vi redis6381.conf

redis6379.conf :

include /myredis/redis.conf
 port 6379
 pidfile /var/run/redis_6379.pid
 dbfilename dump6379.rdb
 logfile “/var/log/redis/redis6379.log”

redis6380.conf :

include /myredis/redis.conf
 port 6380
 pidfile /var/run/redis_6380.pid
 dbfilename dump6380.rdb
 logfile “/var/log/redis/redis6380.log”

redis6381.conf :

include /myredis/redis.conf
 port 6381
 pidfile /var/run/redis_6381.pid
 dbfilename dump6381.rdb
 logfile “/var/log/redis/redis6381.log”

4、启动三个redis服务

redis-server /myredis/redis6379.conf
 redis-server /myredis/redis6380.conf
 redis-server /myredis/redis6381.conf

5、配置主从关系

6379作为主服务器,6380 、6381 为从服务器

进入redis 80 服务,执行 slaveof IP port 命令

redis-cli -p 6380
127.0.0.1:6380> slaveof 127.0.0.1 6379

进入redis 81 服务,执行 slaveof IP port 命令

redis-cli -p 6380
127.0.0.1:6381> slaveof 127.0.0.1 6379

6、查看当前服务的主从复制信息

info replication

三、主从复制原理

  • 当从服务器连接上主服务器器后,就会向主服务器发送一个数据同步的请求
  • 主服务器收到请求后,将所有尚未执行的修改命令通过后台执行完毕之后,将 dump.rdb 文件传送给从服务器
  • 从服务器接受到数据后将数据存到内存并进行持久化(全量复制)
  • 此后每当主服务器执行修改命令,都会依次传送给从服务器进行同步(增量复制)

当主服务器宕机后,与从服务器依旧存在主从关系
当从服务器宕机后,就不在与主服务器有主从关系,需要重新确立关系

四、薪火相传

将 6381 变为 6380 的从服务器

127.0.0.1:6381> slaveof 127.0.0.1 6380

这样就形成了6379 是 6380 的主服务器,而 6380 是 6381 的主服务器。那么 每次 6379 同步数据时只需要同步到 6380 服务器中就行了。后面的交给6380 同步给它的其他从服务器

prometheus 主从复制redis redis主从复制搭建_java


但这种方式存在一个缺点,如果 6380 宕机,就会影响其他的服务器的数据同步

五、反客为主

当主服务器出现故障时,可以在从服务器中选择一台作为主服务器

假如 6379 宕机,将 6380 作为主服务器

127.0.0.1:6380> slaveof no one

此种方式可以将 6380 变为主服务器,但 6381 依旧是 6379 的从服务器,即使 6379 已经宕机

哨兵模式

反客为主的自动版,能够后台监控主服务器是否故障;如果故障了,在从服务器中选举出新的主服务器

1、在 myredis 文件夹下创建 sentinel.conf 文件

sentinel.conf

sentinel monitor mymaster 127.0.0.1 6379 1

其中 mymaster 为 监控对象起的别名 ; 1 表示至少有一个哨兵确认主服务器出故障,然后才会对从服务器进行选举

2、启动哨兵

redis-sentinel /myredis/sentinel.conf

3、选举流程

当确认主服务器器故障时

1、在从服务器中选一个作为主服务器

选举条件为:

a、选择优先级高的服务器(replica-priority 100 :数值越小优先级越高)
b、选偏移量大的服务器(与主服务器的同步越多偏移量越大,数据越完整)
c、选runid最小的服务器(redis每次启动会随机生成40位的runid)

2、挑选出新的主服务器之后,sentinel 向剩余的从服务器 发送 slaveof 命令,从服务器变为新主服务器的 slave

3、当旧主服务器重新上线时,sentinel 会向其它从服务器发送 slaveof 命令 ,让其成为新主服务器的 slaveof