17. Redis主从复制

17. Redis主从复制

参考文档:https://blog.csdn.net/hello_cmy/article/details/105916258

主从复制概念

主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master/leader),后者称为从节点(slave/follower);数据的复制是单向的,只能由主节点到从节点。
Master以写为主,Slave 以读为主。
默认情况下,每台Redis服务器都是主节点;
且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。

主从复制作用

1、数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
2、故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务
的冗余。
3、负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务
(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写
少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
4、高可用(集群)基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复
制是Redis高可用的基础。
一般都是使用这种架构:(主节点负责写,从节点负责读

在这里插入图片描述

环境配置

只配置从库不用配置主库

查看当前库的信息

127.0.0.1:6379> INFO replication
# Replication
role:master    # 主库
connected_slaves:0
master_replid:a1a05250aab5194ad403a73696e66d6d62290d11
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
127.0.0.1:6379> 

修改的内容为:

  1. 端口 port 6381
  2. pid 名字 pidfile /var/run/redis/redis-server-6381.pid
  3. log 名字 logfile /var/log/redis/redis-server-6381.log
  4. dump.rdb 名字 dbfilename dump-6381.rdb

配置文件

root@ubuntu:/home/lm/redis# cp myredis.conf myredis79.conf 
root@ubuntu:/home/lm/redis# cp myredis.conf myredis80.conf 
root@ubuntu:/home/lm/redis# cp myredis.conf myredis81.conf 

root@ubuntu:/home/lm/redis# ls
myredis79.conf  myredis80.conf  myredis81.conf  myredis.conf 

分别修改配置文件之后,启动服务并查看redis服务进程

root@ubuntu:/home/lm/redis# ps -ef | grep redis
root        5749    1494  0 08:38 ?        00:00:00 redis-server 127.0.0.1:6379
root        5754    1494  0 08:38 ?        00:00:00 redis-server 127.0.0.1:6380
root        5759    1494  0 08:39 ?        00:00:00 redis-server 127.0.0.1:6381
root        5766    5558  0 08:39 pts/0    00:00:00 grep --color=auto redis
root@ubuntu:/home/lm/redis# 
root@ubuntu:/home/lm/redis# ps -ef | grep redis
root        5749    1494  0 08:38 ?        00:00:00 redis-server 127.0.0.1:6379
root        5754    1494  0 08:38 ?        00:00:00 redis-server 127.0.0.1:6380
root        5759    1494  0 08:39 ?        00:00:00 redis-server 127.0.0.1:6381
root        5766    5558  0 08:39 pts/0    00:00:00 grep --color=auto redis
root@ubuntu:/home/lm/redis# 

在这里插入图片描述

一主二从

默认情况下,每台Redis服务器都是主节点; 我们一般情况下只用配置从机就好了!

配置主机命令: SLAVEOF host port
取消配置主机命令: SLAVEOF no one
主机:127.0.0.1 6379

在这里插入图片描述
从机:127.0.0.1 6380
在这里插入图片描述
从机:127.0.0.1 6381

在这里插入图片描述

注意:真实的从主配置应该在配置文件中配置,这样的话是永久的,我们这里使用的是命令,只是暂时的。

如果需要修改配置文件进行写入:

replicaof <masterip> <masterport>

在这里插入图片描述

注意:主机可以写,从机只可以读。

主机中的所有信息和数据,都会自动被从机保存。

主从测试

主机69:

127.0.0.1:6379> SET k1 v1
OK
127.0.0.1:6379> get k1
"v1"

80从机

127.0.0.1:6380> get k1
"v1"
127.0.0.1:6380>
# 从机不能添加值
127.0.0.1:6380> set k2 v2
(error) READONLY You can't write against a read only replica.
127.0.0.1:6380>

81从机

27.0.0.1:6381> get k1
"v1"
127.0.0.1:6381> 

127.0.0.1:6381> set k2 v2
(error) READONLY You can't write against a read only replica.
127.0.0.1:6381>

主机断开连接,从机依旧可以连接到主机的,但是没有写操作,这个时候,如果主机回来了,从机可以直接获取到主机写的信息。
如果是使用命令行来配置的主从,这个时候如果重启了,就会变会主机!只要变为从机,立马就会从主机中获取值!
如果主机挂了,那么谁来当老大呢?
可以手动配置,那有人要说了,有没有不用手动配置的,自动选举老大?
有,那就是哨兵模式!


哨兵模式

哨兵模式概念

主从切换技术的方法是:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预费时费力,还会造成一段时间内服务不可用。这不是一种推荐的方式,更多时候,我们优先考虑哨兵模式。Redis从2.8开始正式提供了Sentinel(哨兵)架构来解决这个问题 。

哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立行。其原理就是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。

在这里插入图片描述

这里的哨兵有两个作用:

  • 通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。
  • 当哨兵检测到master宕机,会自动将slave切换成master,然后通过发布订阅模式 通知其他的从服务器,修改配置文件,让它们切换主机。

然而一个哨兵进程对Redis服务器进行监控,可能会出现问题,为此,我们可以使用多个哨兵进行监控。各个哨兵之间还会进行监控,这样就形成了多哨兵模式。

在这里插入图片描述
假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行failover(故障转移)过程,仅仅是哨兵1主观的认为主服务器不可用,这个现象成为主观下线。当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover操作。切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线。

我们现在目前的状态是一主(6379)二从(6380、6381)。
1、我们到刚刚复制的redis.conf目录下(yueconfig)新建一个sentinel.conf文件。
配置如下 信息:
注意拼写。

哨兵模式实例

1. 配置哨兵配置文件 sentinel.conf
# sentinel monitor 被监控的名称 host port 1

sentinel monitor 127.0.0.1 6379 1
1 代表主机挂了,slave投票看让谁接替成为主机,票数最多的,就会成为主机。
2. 启动哨兵

redis-sentinel sentinel.conf

在这里插入图片描述

root@ubuntu:/home/lm/redis# redis-sentinel sentinel.conf 
37934:X 10 Apr 2022 10:16:00.453 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
37934:X 10 Apr 2022 10:16:00.453 # Redis version=5.0.7, bits=64, commit=00000000, modified=0, pid=37934, just started
37934:X 10 Apr 2022 10:16:00.453 # Configuration loaded
37934:X 10 Apr 2022 10:16:00.454 * Increased maximum number of open files to 10032 (it was originally set to 1024).
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 5.0.7 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in sentinel mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379
 |    `-._   `._    /     _.-'    |     PID: 37934
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

37934:X 10 Apr 2022 10:16:00.456 # Sentinel ID is 70773b3bcc1326aacb4810a4811a3e3f91bde6c0
37934:X 10 Apr 2022 10:16:00.456 # +monitor master myredis 127.0.0.1 6379 quorum 1
37934:X 10 Apr 2022 10:16:00.457 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ myredis 127.0.0.1 6379
37934:X 10 Apr 2022 10:16:00.457 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ myredis 127.0.0.1 6379

当主机宕机之后(手工停止),就可以看到主机由6379转移刀6381上了
在这里插入图片描述
6381现在变为主机

127.0.0.1:6381> INFO replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=98234,lag=1
master_replid:280cb273b683cc296475e6e5ebba4aac9da7eff5
master_replid2:5735e6c76b5f4b65cca6b01f536f71794a9608c0
master_repl_offset:98234
second_repl_offset:88644
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:98234
127.0.0.1:6381> 

6380还是从机

127.0.0.1:6380> INFO replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6381
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:98644
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:280cb273b683cc296475e6e5ebba4aac9da7eff5
master_replid2:5735e6c76b5f4b65cca6b01f536f71794a9608c0
master_repl_offset:98644
second_repl_offset:88644
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:98644
127.0.0.1:6380> 

如果主机此时回来了,只能归并到新的主机下,老老实实当小弟,做从机,这就是哨兵模式的规则。

127.0.0.1:6379> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6381
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:124953
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:280cb273b683cc296475e6e5ebba4aac9da7eff5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:124953
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:124403
repl_backlog_histlen:551
127.0.0.1:6379> 
3. 哨兵模式的优缺点:

优点:

  • 哨兵集群,基于主从复制模式,所有的主从配置优点,它全有。
  • 主从可以切换,故障可以转移,系统的可用性就会更好。
  • 哨兵模式就是主从模式的升级,手动到自动。
    缺点:
  • Redis不好在线扩容,集群容量一旦到达上限,在线扩容就十分麻烦。
  • 实现哨兵模式的配置其实是麻烦的,里面有很多选择。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值