十一. Redis 主从复制—>实现负载均衡(详细配置说明讲解配图超多)
@[toc]
1. Redis 主从复制概述
分析单个 Redis 存在的问题:
Redis 主从复制的示意图:
上图解读:
- 上图描述了主机数据更新后,自动同步到备机的 master/salvaer机制。
- Master{主要的} 以写为主,Slaver{仆从}以读为主(只能读不能写)。
- 好处:读写分离,提升效率(理解:读写分离后,将读和写操作分布到不同的 Redis,减少单个 Redis 的压力,提升效率)。
- 好处:容灾快速恢复(理解:如果某个 slaver ,不能正常工作了,可以切换到另外一个 slaver)。
- 主从复制:要求是1主 多从,不能有多个 Master(理解:如果有多个主服务器 Master,那么 slaver 不能确定和哪个 Master 进行同步,出现数据紊乱。)
- 要解决主服务器的高可用性,可以使用 Redis 集群。
2. 实操:Redis 搭建 一主多从(主从复制结构)
说明:
需求说明:这里我使用的是一台虚拟机,所以通过使用 XShell 工具建立三个不同的连接表示不同的服务器。
- 搭建主从复制结构
- 这里我们搭建 一主二从 ,其它 slaver 可以依次完成。
- 搭建结构图示:
- 创建目录(rainbowsea文件夹),并拷贝 redis.conf 到 rainbowsea(我们创建的目录当中)
[root@localhost /]# mkdir /rainbowsea
将 /etc/reids.conf(Redis 的配置文件) 文件拷贝到我们刚刚创建的 rainbowsea 文件夹当中。
[root@localhost rainbowsea]# cp /etc/redis.conf /rainbowsea/
- vim /rainbowsea/redis.conf , 进行如下设置
daemonize yes
appendonly no
- 创建 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
- 启动三台 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
- 连接到 3 个 Redis 服务, info replication 打印主从复制的相关信息 如图 这时三台 Redis 都是 Master
使用 info replication 命令可以查看,打印主从复制的相关信息 。
127.0.0.1:6379> info replication
- 将 6380 和 6381 配置成 slaver, 6379 作为主机,在 slaver 执行如命令 成为某个实例的从服务器。
指令说明:
slaveof <master_ip> <master_port>127.0.0.1:6380> slaveof 127.0.0.1 6379
- 在主机上写,在从机上可以读取数据, 如果你在从机上写入数据,就报错
- 到此一个基本的主从复制结构就 OK 了
3. Redis 主从复制-原理
原理示意图:
上图解图:
- Slave 启动成功连接到 master 后会发送一个 sync 命令。
- Master 接到命令启动,后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master 将传送整个数据文件到 slave ,以完成依次完全同步。
- Slave 服务在接收到数据库文件数据后,将其存盘并加载到内存中,即全量复制 。
- Master 数据变化了,会将新的收集到的修改命令依次传给 slave,完成同步,即 增量复制
- 但是只要是重新连接 master ,一次完成同步(全量复制)将被自动执行。
一主二仆:
- 如果(slave)从服务器 down 了,重新启动,仍然可以获取 Master(主机)的最新数据。
- 如果主服务器 down了,从服务器并不会抢占主服务器,当主服务器恢复后,从服务器仍然指向原来的主服务器。
4. Redis 的薪火相传
示意图:
上图解图:
-
上一个 Slave 可以是下一个 slave 的 Master,Slave 同样可以接收其他 slaves 的连接和同步请求,那么该 slave 作为了链条中下一个的 master,可以有效减轻 master 的写压力,去中心化降低风险。
-
用
slaveof <master_ip><master_port> -
风险则是一旦某个 slave 宕机了,后面的 slave 都没法同步 。
-
主机挂了,从机还是从机,无法写数据了。
实操演示:薪火相传
- 将 6381 的主机设置为 6380, 他的数据同步就是从 6380 获取
- 查看 6380 和 6379
需要注意一点的是,虽然当这里
虽然这里我们的 6380端口晋升为了 6381端口的主机(服务),但是 6380这个(主机),仍然是不可以执行 "写"操作的,因为,在 Redis 当中只有一个主机,而这个主机是最大的哪个主机(最顶端的那个主机)才可以 执行“写”操作,其他的(主机不可以执行“写”操作)
5. Redis 的反客为主
- 在薪火相传的结构下,当一个 master 宕机后,指向 Master 的 slave 可以升为 master ,其后面的 slave 不用做任何修改。
- 使用
slaveof no one将从机变为主机(特别说明:这里是手动的,但是后面可以使用哨兵模式,自动完成切换)
实操:反客为主:
- 将最顶端的 6379 端口,主机服务关闭。
- 在 6380 端口当中执行 `` 将其晋升为 master 顶端的主服务器。进行一个反客为主。
127.0.0.1:6380> slaveof no one
注意:这时候我们就算再次启动 6379 这个主机,它就自己单独为了一个master 了,和我们另外的 6380 和 6381 两个服务器就,没有任何的关系了。自己独立开来了。
6. Redis 哨兵模式(sentinel)
示意图:
- 哨兵模式(如图): 反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将
从机(从库)转换为主机(主库)。
实操演示:哨兵模式:
- 这里我们调整为一主二仆 模式,6379 带着 6380 和 6381 两个。
- 创建 /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 客户端当中,启动哨兵模式的。
- 执行
redis-sentinel /rainbowsea/sentinel.conf启动哨兵,注意哨兵的端口是26379。
[root@localhost rainbowsea]# redis-sentinel /rainbowsea/sentinel.conf
- 当主机挂掉,从机选举中产生新的主机:
这里我们关掉 主机 6379 端口。
- 如果原来的主机重启, 会自动成为从机
注意事项和细节:
- 在哨兵模式下,主机 down 后的执行流程分析:
上图解析: 哨兵如何在从机中,推选新的 Master 主机,选择的条件依次为
- 优先级在
redis.conf中默认:replica-priority 100,值越小优先级越高 。- 偏移量是指获得原主机数据的量,数据量最全的优先级高
- 每个 redis 实例启动后都会随机生成一个 40 位的 runid,值越小优先级越高。
在 redis 客户端当中执行
info命令,当中可以查看 run_id 的值127.0.0.1:6380> info
7. 最后:
“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”