Redis主从复制搭建

Redis的主从复制

介绍

主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave);
数据的复制是单向的,只能由主节点到从节点。
默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点
在这里插入图片描述

主从复制的作用

数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。

故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。

负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。

主从同步服务器原理
  1. 当从连接上主服务器之后,从服务器向主服务发送进行数据同步消息。
  2. 主服务器接到从服务器发送过来同步消息,把主服务器数据进行持久化,rdb文件,把rdb文件发送从服务器,从服务器拿到rdb进行读取。
  3. 每次主服务器进行写操作之后,和从服务器进行数据同步。

搭建最基础的 一主二从

1.首先我们创建在系统根目录创建一个redis文件夹用来保存主从复制Redis配置文件。
mkdir myredis
cd myredis
2.拷贝redis.conf到myredis文件夹,并且创建需要个数的主从服务器配置文件,并且写入文件内容。
cp redis.conf /myredis/redis.conf
vi redis6379.conf 
#写入配置
#引入公共部分
include ./redis.conf 
#写入PID的文件位置
pidfile /var/run/redis_6379.pid
#修改端口号
port 6379
#设置rdb文件名
dbfilename dump6379.rdb
#---------------------------------------------
vi redis6380.conf
#写入配置
#引入公共部分
include ./redis.conf 
#写入PID的文件位置
pidfile /var/run/redis_6380.pid
#修改端口号
port 6380
#设置rdb文件名
dbfilename dump6380.rdb
#---------------------------------------------
vi redis6381.conf
#写入配置
#引入公共部分
include ./redis.conf 
#写入PID的文件位置
pidfile /var/run/redis_6381.pid
#修改端口号
port 6381
#设置rdb文件名
dbfilename dump6381.rdb
3.启动三个服务 并且检查服务是否启动成功
#启动服务
redis-server redis6379.conf
redis-server redis6380.conf
redis-server redis6381.conf
#检查服务
ps -ef | grep redis
4.检查服务运行情况
redis-cli -p 6379
info replication
# Replication
#当前角色状态 master主机 slave从机
role:master 
#当前主机下从机个数
connected_slaves:0 
#以下是一些基本信息
master_failover_state:no-failover
master_replid:6b80d4afb42ed598e2b40ecc2c5c0090370e71e1
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
5.配置6380,6381为6379的从机,并且查看状态
127.0.0.1 6380 > slaveof 127.0.0.1 6379
OK
127.0.0.1 6380 > info replication
# Replication
role:slave
# 主机信息
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:5
master_sync_in_progress:0
#从机信息
slave_read_repl_offset:168
slave_repl_offset:168
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:6903e709b5c5d7c093a4da5209e4a037395e54cf
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:168
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:168
127.0.0.1 6381 > slaveof 127.0.0.1 6379
OK
127.0.0.1 6379 > info replication
# Replication
role:master
connected_slaves:2
# 两个从机的信息
slave0:ip=127.0.0.1,port=6380,state=online,offset=112,lag=1
slave1:ip=127.0.0.1,port=6381,state=online,offset=112,lag=1
master_failover_state:no-failover
···
6.测试读写分离
#主机写入
127.0.0.1 > 6379 set a a
OK
127.0.0.1 > 6379 set b b
OK
#------------------------------------------
#从机读取
127.0.0.1 > 6380 keys *
a
b
127.0.0.1 > 6381 get a
a
#------------------------------------------
#需要注意的是 从机不能进行写操作 如果进行写操作则会报错
127.0.0.1 > 6381 set c c
(error) READONLY You can't write against a read only replica.
一主二从服务器的特点

1.当从服务器宕机重启以后,从服务器并不会直接恢复成从服务器,而是变成一台不相关的主服务器。
2.当从服务器从主服务器手动变成从服务器的时,他会自动同步主服务器中的数据。

#这里演示把6381模拟宕机
127.0.0.1 > 6381 shutdown
#主服务器打印信息
127.0.0.1:6379 > info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=3717,lag=1
master_failover_state:no-failover
...
#主服务器添加新数据 用于测试新的从服务器是否会自动同步数据
127.0.0.1:6379 > set newa newa
OK
#重新启动从服务器6381查看状态
redis-server redis6381.conf
redis-cli -p 6381
127.0.0.1:6381 > info replication
# Replication 我们可以看到重启以后 6381变为了主服务器 
role:master
connected_slaves:0
...
#重新设置6381为 6379的从服务器 并且查看数据
127.0.0.1 6381 > slaveof 127.0.0.1 6379
127.0.0.1 6381 > keys *
a 
b
newa
#读取宕机期间添加的数据成功

3.当主服务器宕机以后,对应的从服务器还是从服务器隶属于主服务器。

#模拟主服务器宕机 
127.0.0.1:6379 > shutdown
127.0.01.:6380 > info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
#这里我们可以看到从服务器依然是6379的从服务器只是主机状态断开
master_link_status:down
...
#此时我们恢复主服务器 发现从服务器依然存在
redis-server redis6379.conf
redis-cli -p 6379
127.0.0.1:6379 > 
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6381,state=online,offset=42,lag=0
slave1:ip=127.0.0.1,port=6380,state=online,offset=42,lag=1

常用模式

薪火相传 反客为主

薪火相传:主服务器的从服务器作为另一个服务器的主服务器依次传递下去。

比如在这个例子中: 6379作为6380的主服务器,6381又作为6380的从服务器。但是6379只拥有6380这一个从服务器,至于6381是隶属于6380的从服务器。就类似于我附庸的附庸不是我的附庸。

反客为主:当主服务器挂掉以后,这里模拟6379挂掉,如果不进行任何操作那么如6380依然标记为从服务器。此时使用命令 slaveof no one

127.0.0.1 > 6379 : shutdown
127.0.0.1 > 6380 : info replication
# Replication
role:slave
...
127.0.0.1:6380> slaveof no one
OK
127.0.0.1:6380> info replication
# Replication
role:master
...

此时,我们可以看到当一台主服务器挂掉以后,需要手动输入命令去对服务器进行重启,在现实场景中不可能有人一直监控服务器状态,所以此时我们就需要服务器进行自动监控,当主服务器挂掉以后他的从服务器自动晋升为主服务器。这个就是接下来要说的哨兵模式

哨兵模式

哨兵模式其实就是反客为主的自动版
首先在myredis这个目录创建 sentinel.conf 这个文件,注意名字不能错。

cd myredis
vi sentinel.conf
#里面只用输入这一句话 sentinel哨兵 monitor监控 mymaster给监控对象起的一个名称 1表示至少有多少个哨兵同意迁移的数量。就比如 如果我的6379挂了 6380 和 6381这两个哨兵 只要有一个同意就可以切换主服务器
sentinel monitor mymaster 127.0.0.1 6379 1
:wq
#启动哨兵
redis-sentinel sentinel.conf 
24584:X 21 Dec 2021 20:09:47.295 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
24584:X 21 Dec 2021 20:09:47.295 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=24584, just started
24584:X 21 Dec 2021 20:09:47.295 # Configuration loaded
24584:X 21 Dec 2021 20:09:47.296 * monotonic clock: POSIX clock_gettime
                           Redis 6.2.6 (00000000/0) 64 bit
                           Running in sentinel mode
                           Port: 26379
                           PID: 24584
24584:X 21 Dec 2021 20:09:47.303 # Sentinel ID is 8ce4e8ae646ab13525a0e3ffc64bb1565c7469f9
#这里就是提示当前设置的哨兵监控的信息
24584:X 21 Dec 2021 20:09:47.303 # +monitor master mymaster 127.0.0.1 6379 quorum 1
#当主机挂掉以后选择下面两个从机进行切换 至于具体根据什么切换后面会说到
24584:X 21 Dec 2021 20:09:47.304 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
24584:X 21 Dec 2021 20:09:47.309 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379

现在我们关闭主机 6379 然后等待哨兵反馈

127.0.0.1:6379> shutdown
not connected> exit

sentinel 
# 检测到 6379挂掉了
24584:X 21 Dec 2021 20:18:03.146 # +sdown master mymaster 127.0.0.1 6379
...
# 选择 6380作为新的主服务器 此时 6381也变为6380的从服务器
24584:X 21 Dec 2021 20:18:03.254 # +selected-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
....
#此处配置是为了当6379 恢复连接的时候 会成为6380的从服务器
24584:X 21 Dec 2021 20:18:05.264 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380
24584:X 21 Dec 2021 20:18:35.273 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380

可以这样理解 6379是皇帝 6380 和6381都是皇子,当皇帝驾崩,以后传位给6380了 那6381只能当6380的下属,如果6379皇帝他突然又复活了 但是不可能有两个皇帝,也只能当背后的幕僚实际上作为6380的下属了。

哨兵自动选取主服务器的规则

根据优先级:redis.conf配置文件中的 replica-priority 0 或者 此处不同版本可能有所差异
slave-priority 0 此处值越小优先级越高 默认为100。

根据偏移量:如果其他服务器的优先级相同,则根据偏移量进行选择,偏移量就是因为主从服务器配置中,主服务器给从服务器传递数据的时候实际上需要一定的时间。此处的偏移量就是指从服务器中
和主服务器数据最接近的哪一个。

根据runid:选择runid更小的那一个。
redis在每次启动的时候会随机生成一个40位的runid。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值