Redis 主从复制
Redis 主从复制
我在这里只记录点基本内容,不会写太深入的内容
概念
主机数据更新后根据配置和策略,自动同步到备机的 master/slaver 机制,master 以写为主,slave 以读为主
一主多从,只能有一台主服务器,可以有多台从服务器。防止多个主服务器对同一个数据进行写操作
作用
- 读写分离,性能扩展
- 容灾快速恢复,一台从服务器宕机,可以切换到其它从服务器
集群:每个集群都是一主多从,这样即使主服务器宕机也可以切换集群提供服务
配置一主多从的服务器
这里配置一主两从的服务器,这里我就用同一台虚拟机的不同端口模拟多台服务器,实际应用多个服务器时只需要修改 ip 即可
步骤
- 在 redis/bin 目录创建一个文件夹,例如 master_slave
- 复制 redis.conf 配置文件到 master_slave 文件夹,将
appendonly yes
改成appendonly no
,或者改名字,还有darmonize yes
,这个要用 yes 就行 - 创建三个配置文件
- redis_6379.conf
- redis_6380.conf
- redis_6381.conf
- 在三个配置文件中写入内容
inclued /master_slave/redis.conf
pidfile /var/run/redis_端口号.pid
port 端口号
dbfilename dump_端口号.rdb
- logfile 这里为了操作方便就不写了
- 打开终端,到 redis/bin 目录,启动三台 redis 服务器(你也可以给这个命令配置一个环境变量)
./redis-server master_slave/redis_6379.conf
./redis-server master_slave/redis_6380.conf
./redis-server master_slave/redis_6381.conf
需要注意一下,启动服务时最好使用 root 权限,不然可能会有 RDB 写入问题
在 redis-cli 中连接对应端口的redis 服务器,再使用info replication
就可以查看主机信息,role
为 master 表示这是主服务器
配置主从复制之前,这三台 redis 服务器应该都是 master
6379
6380
6381
配置主从
比如我把 6379 当主服务器,6380 和 6381 当成从服务器
步骤:
- 在 6380 和 6381 上的 redis-cli 执行
slaveof 127.0.0.1 6379
,就是slaveof ip地址 端口号
- 如果主服务器有密码,需要在从服务器的配置文件中添加
masterauth 密码
,再重启从服务器 - 再使用
info replication
查看从机信息,role
就变成 slave
6379
6380
6381
效果
先在主服务器中随便写一个数据,用主服务器可以读取到数据
6379
在从服务器也可以读取到数据
6380
6381
但是如果在从服务器写数据,那么就会报错
6380
6381
一主二从
如果从服务器宕机,重新启动从服务器,需要执行slaveof ip地址 端口号
命令,并且会自动从头开始从主服务器复制数据
如果主服务器宕机,从服务可以直到主服务器离线,但是仍然是从服务器,还是保留了主服务器的ip地址和端口号,还可以提供读取数据的服务
如果主服务器宕机并且重启,会回到主服务器的位置,仍然是主服务器
复制原理
- 当从服务器连接上主服务器之后,从服务器会向主服务器发送“进行数据同步的消息”
- 全量复制:主服务器接收到从服务器发送过来的同步消息,把主服务器数据进行持久化,也就是 RDB 文件,把 RDB 文件发送给从服务器,从服务器拿到 RDB 文件进行读取(从服务器进行存盘并加载到内存中)
- 增量复制:每次主服务器进行写操作之后,会和从服务器进行数据同步
从服务器只有第一次会主动同步数据,之后都是主服务器主动同步数据
薪火相传
从服务器执行slaveof 从服务器ip地址 端口号
命令,这样,这台从服务器同步的数据就是另外一台从服务器了,但是主服务器底下的从服务器依然是从服务器,不会变成主服务器
就是说,一个主服务器有多个从服务器,从服务器底下还有从服务器,从服务器去同步主服务器,从服务器底下的从服务器再去同步这个从服务器
缺点:如果主服务器底下的从服务器宕机,从服务器底下的从服务器都不能同步了
反客为主
比如,主服务器宕机,后边的从服务器可以成为主服务器
从服务器去执行 slaveof no one
命令,将从服务器变成主服务器,代替之前宕机的主服务器,但其它从服务器的主服务器ip地址和端口不会变成这个从服务器,即,其它从服务器无操作
先关闭 6379 的 redis server
再看两个从服务器
6380
6381
将 6380 升级为主服务器,但是从服务器数量是 0 ,所以 6381 并没有任何操作
哨兵模式
哨兵模式就是反客为主的自动版,能够后台监控主机是否故障,如果故障了,根据投票数自动将从服务器变成主服务器
步骤:
- 在 master_slave 目录下新建 sentinel.conf 文件
- 在这个配置文件中只有一句话
sentinel monitor mymaster 主服务器ip地址 主服务器端口号 1
- sentinel:哨兵
- monitor:监控
- mymaster:哨兵为主服务器的名称
- 1:表示至少有多少个“哨兵同意迁移”的数量
- 启动哨兵:在 redis/bin 目录使用
./redis-sentinel master_slave/sentinel.conf
(你也可以为这个命令写一个环境变量)
哪个从服务器会变成主机?
从服务器的选择是有规则的
选择条件依次为:
- 选择优先级靠前的
- 优先级在 redis.conf 中默认
slave-priority 100
,值越小,优先级越高
- 优先级在 redis.conf 中默认
- 选择偏移量最大的
- 偏移量是指获得原主服务器数据最全的,即,与主服务器同步率最高的
- 选择 runid 最小的从服务器
- 每个 redis 实例启动后都会随机生成一个 40 位的 runid
关闭 6379 主服务器
再看从服务器
6380 ,变成了主服务器,6381 也变成了 6380 的从服务器
原主服务器重启后会变成从服务器
复制延时
由于所有的写操作都是先在主服务器上,然后同步更新到从服务器上,所以从主服务器同步到从服务器有一定的延时,当系统很繁忙的时候,延时问题会更加严重,从服务器数量的增加也会使这个问题更加严