【Redis】搭建主从复制

纸上得来终觉浅,绝知此事要躬行。

主从复制

主从复制即将master中的数据即时、有效的复制到slave中。一个master可以拥有多个slave,一个slave只对应一个master

master:

  • 写数据
  • 执行写操作时,将出现变化的数据自动同步到slave
  • 读数据(可忽略)

slave:

  • 读数据
  • 写数据(禁止)

作用

  • 读写分离:master写、 slave读,提高服务器的读写负载能力
  • 负载均衡:基于主从结构,配合读写分离,由slave分担master负载,并根据需求的变化,改变slave的数
    量,通过多个从节点分担数据读取负载,大大提高Redis服务器并发量与数据吞吐量
  • 故障恢复:当master出现问题时,由slave提供服务,实现快速的故障恢复
  • 数据冗余:实现数据热备份,是持久化之外的一种数据冗余方式
  • 高可用:基于主从复制,构建哨兵模式与集群,实现Redis的高可用方案

连接与断开

连接

  1. 客户端发送命令:
slaveof <masterip> <masterport>
  1. 启动服务器参数:
redis-server -slaveof <masterip> <masterport>
  1. 服务器配置:
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"
原文地址:https://www.cnblogs.com/ydongy/p/13229883.html