十一. Redis 主从复制—>实现负载均衡(详细配置说明讲解配图超多)

262 阅读7分钟

十一. Redis 主从复制—>实现负载均衡(详细配置说明讲解配图超多)

@[toc]

1. Redis 主从复制概述

分析单个 Redis 存在的问题:

在这里插入图片描述

Redis 主从复制的示意图:

在这里插入图片描述

上图解读:

  1. 上图描述了主机数据更新后,自动同步到备机的 master/salvaer机制。
  2. Master{主要的} 以写为主,Slaver{仆从}以读为主(只能读不能写)。
  3. 好处:读写分离,提升效率(理解:读写分离后,将读和写操作分布到不同的 Redis,减少单个 Redis 的压力,提升效率)。
  4. 好处:容灾快速恢复(理解:如果某个 slaver ,不能正常工作了,可以切换到另外一个 slaver)。
  5. 主从复制:要求是1主 多从,不能有多个 Master(理解:如果有多个主服务器 Master,那么 slaver 不能确定和哪个 Master 进行同步,出现数据紊乱。)
  6. 要解决主服务器的高可用性,可以使用 Redis 集群。

2. 实操:Redis 搭建 一主多从(主从复制结构)

说明:

需求说明:这里我使用的是一台虚拟机,所以通过使用 XShell 工具建立三个不同的连接表示不同的服务器。

  1. 搭建主从复制结构
  2. 这里我们搭建 一主二从 ,其它 slaver 可以依次完成。
  3. 搭建结构图示:

在这里插入图片描述

  1. 创建目录(rainbowsea文件夹),并拷贝 redis.conf 到 rainbowsea(我们创建的目录当中)
[root@localhost /]# mkdir /rainbowsea

在这里插入图片描述

在这里插入图片描述

将 /etc/reids.conf(Redis 的配置文件) 文件拷贝到我们刚刚创建的 rainbowsea 文件夹当中。

[root@localhost rainbowsea]# cp /etc/redis.conf /rainbowsea/

在这里插入图片描述

  1. vim /rainbowsea/redis.conf , 进行如下设置
daemonize yes

在这里插入图片描述

appendonly no

在这里插入图片描述


  1. 创建 3 个文件/rainbowsea/redis6379.conf; /rainbowsea/redis6380.conf ;/rainbowsea/redis6381.conf 并编辑

这里我们使用 include 导入共用配置的方式,导入。

在这里插入图片描述

配置如下信息:

/rainbowsea/redis6379.conf;

在这里插入图片描述

include /rainbowsea/redis.conf
pidfile /var/run/redis_6379.pid
port 6379
dbfilename dump6379.rdb
masterauth rainbowsea

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

/rainbowsea/redis6380.conf;

在这里插入图片描述

include /rainbowsea/redis.conf
pidfile /var/run/redis_6380.pid
port 6380
dbfilename dump6380.rdb
masterauth rainbowsea

在这里插入图片描述

在这里插入图片描述

/rainbowsea/redis6381.conf;

在这里插入图片描述

include /rainbowsea/redis.conf
pidfile /var/run/redis_6381.pid
port 6381
dbfilename dump6381.rdb
masterauth rainbowsea

在这里插入图片描述

在这里插入图片描述

  1. 启动三台 redis 服务器:

在这里插入图片描述

[root@localhost ~]# redis-server /rainbowsea/redis6379.conf

在这里插入图片描述

[root@localhost rainbowsea]# redis-server /rainbowsea/redis6380.conf

在这里插入图片描述

[root@localhost rainbowsea]# redis-server /rainbowsea/redis6381.conf

在这里插入图片描述

在这里插入图片描述

这里我们分别进入到各个6379 ;6380;6381 端口的 Redis进行操作。

注意:命令上的使用,这里使用 redis-cli 进入 Redis 客户端的时候,需要指明进入的时哪个端口的 Redis 服务

[root@localhost rainbowsea]# redis-cli -p 6379

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  1. 连接到 3 个 Redis 服务, info replication 打印主从复制的相关信息 如图 这时三台 Redis 都是 Master

使用 info replication 命令可以查看,打印主从复制的相关信息 。

127.0.0.1:6379> info replication

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  1. 将 6380 和 6381 配置成 slaver, 6379 作为主机,在 slaver 执行如命令 成为某个实例的从服务器。

指令说明: slaveof <master_ip> <master_port>

127.0.0.1:6380> slaveof 127.0.0.1 6379

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  1. 在主机上写,在从机上可以读取数据, 如果你在从机上写入数据,就报错

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  1. 到此一个基本的主从复制结构就 OK 了

3. Redis 主从复制-原理

原理示意图:

在这里插入图片描述

上图解图:

  • Slave 启动成功连接到 master 后会发送一个 sync 命令。
  • Master 接到命令启动,后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master 将传送整个数据文件到 slave ,以完成依次完全同步。
  • Slave 服务在接收到数据库文件数据后,将其存盘并加载到内存中,即全量复制
  • Master 数据变化了,会将新的收集到的修改命令依次传给 slave,完成同步,即 增量复制
  • 但是只要是重新连接 master ,一次完成同步(全量复制)将被自动执行。

一主二仆:

  1. 如果(slave)从服务器 down 了,重新启动,仍然可以获取 Master(主机)的最新数据。

在这里插入图片描述 在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  1. 如果主服务器 down了,从服务器并不会抢占主服务器,当主服务器恢复后,从服务器仍然指向原来的主服务器。

在这里插入图片描述

在这里插入图片描述 在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


4. Redis 的薪火相传

示意图: 在这里插入图片描述

上图解图:

  • 上一个 Slave 可以是下一个 slave 的 Master,Slave 同样可以接收其他 slaves 的连接和同步请求,那么该 slave 作为了链条中下一个的 master,可以有效减轻 master 的写压力,去中心化降低风险。

  • slaveof <master_ip><master_port>

  • 风险则是一旦某个 slave 宕机了,后面的 slave 都没法同步

  • 主机挂了,从机还是从机,无法写数据了。

实操演示:薪火相传

在这里插入图片描述

  1. 将 6381 的主机设置为 6380, 他的数据同步就是从 6380 获取

在这里插入图片描述

  1. 查看 6380 和 6379

在这里插入图片描述

在这里插入图片描述

需要注意一点的是,虽然当这里

虽然这里我们的 6380端口晋升为了 6381端口的主机(服务),但是 6380这个(主机),仍然是不可以执行 "写"操作的,因为,在 Redis 当中只有一个主机,而这个主机是最大的哪个主机(最顶端的那个主机)才可以 执行“写”操作,其他的(主机不可以执行“写”操作)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

5. Redis 的反客为主

  1. 薪火相传的结构下,当一个 master 宕机后,指向 Master 的 slave 可以升为 master ,其后面的 slave 不用做任何修改。
  2. 使用slaveof no one 将从机变为主机(特别说明:这里是手动的,但是后面可以使用哨兵模式,自动完成切换)

实操:反客为主:

  1. 将最顶端的 6379 端口,主机服务关闭。

在这里插入图片描述

在这里插入图片描述

  1. 在 6380 端口当中执行 `` 将其晋升为 master 顶端的主服务器。进行一个反客为主。
127.0.0.1:6380> slaveof no one

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

注意:这时候我们就算再次启动 6379 这个主机,它就自己单独为了一个master 了,和我们另外的 6380 和 6381 两个服务器就,没有任何的关系了。自己独立开来了。

6. Redis 哨兵模式(sentinel)

示意图:

在这里插入图片描述

  1. 哨兵模式(如图): 反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从机(从库) 转换为 主机(主库)

实操演示:哨兵模式:

  1. 这里我们调整为一主二仆 模式,6379 带着 6380 和 6381 两个。 在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  1. 创建 /rainbowsea/sentinel.conf , 特别注意:这个sentinel.conf 名字不能乱写 按照指定的来
[root@localhost rainbowsea]# vim sentinel.conf 

在这里插入图片描述

在 sentinel.conf 文件当中添加如下内容:

sentinel monitor redis_master 127.0.0.1 6379 1
sentinel auth-pass redis_master rainbowsea

在这里插入图片描述

sentinel monitor redis_master 127.0.0.1 6379 1 内容说明:

  • redis_master 为监控对象起的服务器名称。注意:后续也要用这个名称,名称上要保持一致。
  • -1 :表示至少有多少个哨兵同意迁移的数量,这里我配置为了 1 ,表示只要有 1 个哨兵同意迁移就可以切换(主从关系)
  • 启动哨兵,注意看哨兵的端口是 26379
  • sentinel auth-pass redis_master rainbowsea 是设置密码, rainbowsea 是我 Redis 的密码,如果没有设置密码,则不需要配置这个。

注意:不是在 Redis 客户端当中,启动哨兵模式的。

  1. 执行 redis-sentinel /rainbowsea/sentinel.conf 启动哨兵,注意哨兵的端口是26379。
[root@localhost rainbowsea]# redis-sentinel /rainbowsea/sentinel.conf 

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  1. 当主机挂掉,从机选举中产生新的主机:

这里我们关掉 主机 6379 端口。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  1. 如果原来的主机重启, 会自动成为从机

在这里插入图片描述

在这里插入图片描述

注意事项和细节:

  1. 在哨兵模式下,主机 down 后的执行流程分析:

在这里插入图片描述

上图解析: 哨兵如何在从机中,推选新的 Master 主机,选择的条件依次为

  1. 优先级在 redis.conf 中默认:replica-priority 100,值越小优先级越高
  2. 偏移量是指获得原主机数据的量,数据量最全的优先级高
  3. 每个 redis 实例启动后都会随机生成一个 40 位的 runid,值越小优先级越高。

在 redis 客户端当中执行 info 命令,当中可以查看 run_id 的值

127.0.0.1:6380> info

在这里插入图片描述

7. 最后:

“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”

在这里插入图片描述