纸上得来终觉浅,绝知此事要躬行。
主从复制
主从复制即将master中的数据即时、有效的复制到slave中。一个master可以拥有多个slave,一个slave只对应一个master
master:
- 写数据
- 执行写操作时,将出现变化的数据自动同步到slave
- 读数据(可忽略)
slave:
- 读数据
- 写数据(禁止)
作用
- 读写分离:master写、 slave读,提高服务器的读写负载能力
- 负载均衡:基于主从结构,配合读写分离,由slave分担master负载,并根据需求的变化,改变slave的数
量,通过多个从节点分担数据读取负载,大大提高Redis服务器并发量与数据吞吐量 - 故障恢复:当master出现问题时,由slave提供服务,实现快速的故障恢复
- 数据冗余:实现数据热备份,是持久化之外的一种数据冗余方式
- 高可用:基于主从复制,构建哨兵模式与集群,实现Redis的高可用方案
连接与断开
连接
- 客户端发送命令:
slaveof <masterip> <masterport>
- 启动服务器参数:
redis-server -slaveof <masterip> <masterport>
- 服务器配置:
slaveof <masterip> <masterport>
断开
- 客户端发送命令
slaveof no one
slave断开连接后,不会删除已有数据,只是不再接受master发送的数据
授权访问
Master设置
- master客户端发送命令设置密码
requirepass <password>
- master配置文件设置密码
config set requirepass <password>
config get requirepass
Slave设置
- slave客户端发送命令设置密码
auth <password>
- slave配置文件设置密码
masterauth <password>
- slave启动服务器设置密码
redis-server –a <password>
主从复制案例
server-6379 | server-6380 | server-6381 |
---|---|---|
port 6379 pidfile /var/run/redis/redis-server.pid logfile /var/log/redis/redis/redis-server.log dbfilename dump.rdb |
port 6380 pidfile /var/run/redis/redis-server-6380.pid logfile /var/log/redis/redis/redis-server-6380.log dbfilename dump6380.rdb |
port 6381 pidfile /var/run/redis/redis-server-6381.pid logfile /var/log/redis/redis/redis-server-6381.log dbfilename dump6380.rdb |
一主二仆
server-6379(主机) | server-6380 | server-6381 |
---|---|---|
查看配置信息![]() |
查看配置信息![]() |
查看配置信息![]() |
127.0.0.1:6379> set name ydy OK 127.0.0.1:6379> set age 20 OK 127.0.0.1:6379> keys * 1) "name" 2) "age" |
127.0.0.1:6380> SLAVEOF 127.0.0.1 6379 OK |
127.0.0.1:6381> SLAVEOF 127.0.0.1 6379 OK |
127.0.0.1:6379> set gender male OK |
127.0.0.1:6380> get gender "male" |
127.0.0.1:6381> get gender "male" |
127.0.0.1:6380> get name "male" |
127.0.0.1:6381> get name "male" |
|
![]() |
![]() |
![]() |
情况一:从机设置
server-6379 | server-6380 | server-6381 |
---|---|---|
127.0.0.1:6380> set class 1 (error) READONLY You can't write against a read only replica. |
127.0.0.1:6381> set class 1 (error) READONLY You can't write against a read only replica. |
结论:主从复制中,从机不能写数据,只能提供读
情况二: 主机死亡
server-6379 | server-6380 | server-6381 |
---|---|---|
可能以下命令不起作用,可以尝试service redis stop ![]() |
![]() |
![]() |
127.0.0.1:6380> set k1 v1 (error) READONLY You can't write against a read only replica. |
127.0.0.1:6381> set k2 v2 (error) READONLY You can't write against a read only replica. |
结论:主机死亡,从机处于等待状态,同样不能写数据,也不能自我上位成Master
情况三: 主机起死回生
server-6379 | server-6380 | server-6381 |
---|---|---|
主机复活![]() |
![]() |
![]() |
结论:主机起死回生,主从之间建立连接,恢复正常
情况四: 从机死亡
server-6379 | server-6380 | server-6381 |
---|---|---|
![]() |
||
重新连接![]() |
||
127.0.0.1:6379> get money "1000" |
127.0.0.1:6380> keys * (empty list or set) |
127.0.0.1:6381> get money "1000" |
127.0.0.1:6380> SLAVEOF 127.0.0.1 6379 OK 127.0.0.1:6380> get money "1000" |
结论:从机死亡,重新恢复需要手动建立与Master的连接
薪火相传
一个Master连接多个Slave,而每个Slave又可以成为别的Slave的Master,形成链式主从。需要注意处于中间位置的服务器依旧是Slave,只能读数据,不能写数据
server-6379 | server-6380 | server-6381 |
---|---|---|
![]() |
![]() |
![]() |
127.0.0.1:6379> set kkk vvv OK 127.0.0.1:6379> get kkk "vvv" |
127.0.0.1:6380> get kkk "vvv" |
127.0.0.1:6381> get kkk "vvv" |
反客为主
一个Master连接多个Slave,当Master宕机或异常关机,Slave可以通过slave no one
指令断开与原来Master的连接,自己成为Master,让其他的Slave连接我。从而形成新的主从关系,这个过程是手动的,也可以通过配置文件设置slaveof <masterip> <masterport>
。
server-6379 | server-6380 | server-6381 |
---|---|---|
![]() |
![]() |
![]() |
127.0.0.1:6380> set k22 v22 OK |
127.0.0.1:6381> get k22 "v22" |