redis6.0.9搭建主从复制以及哨兵模式

一、主从复制以及原理

概念
主从复制,是指将一台Redis服务器的数据,复制到其他redis服务器,前者称为主节点(master/leader),后者称为从节点(slave/follower);数据复制是单向的,只能由主节点到从节点,。Mater以写为主,Slave以读为主。
默认情况下,每台redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。
主从复制的作用包括:
1,数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式
2,故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
3,负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写redis数据时,应用连接主节点,读redis数据时连接从节点),分担服务负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
4,高可用基石:除了上述作用外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是redis高可用的基础。

一般来说,要将redis运用到项目工程中,只使用一台Redis是万万不能的,原因如下:
1,从结构上,单个redis服务器会发生单点故障,并且一台redis服务器需要处理所有的请求负载,压力较大。
2,从容量上,单个redis服务器内存容量有限,就算一台服务器内存容量为256G,也不能将所有内存用作redis存储内存。
电商网站上的商品,一般都是上传一次,无数次浏览,也就是”读多写少”,对于这种场景可以使用如下架构
在这里插入图片描述
上述架构,主从复制,读写分离!80%的情况 下,都是在进行读操作!减缓服务器压力,架构中间经常使用!一主二从或者多从

1,环境配置

只配置从库,不用配置主库
查看当前redsi信息

info replication

在这里插入图片描述
1,复制三个配置文件,然后修改对应的信息,修改端口、pid名字、log文件名字、dump.rdb。
在这里插入图片描述
修改端口、pid名字、log文件名字、dump.rdb。6381、6382和6380修改类似
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2,启动6380、6381、6382 redis服务,查看进程中三个redis服务是否运行
在这里插入图片描述
在这里插入图片描述
到此redis集群环境已搭建好

2,主从复制

默认情况下,每台redis服务器都是主节点,,一般情况下,只需要配置从机就可以了。配置一主二从。主机为6380,从机为6381和6382
1,先查看6380和6381服务的信息

info replication

6380如下,是一台主机,从机数量为0
在这里插入图片描述
6381如下 是一台主机,从机数量为0
在这里插入图片描述

2,将6381作为从机,归属于6380机器

# slaveof host port
slaveof 192.168.119.3 6380

查看6381信息
在这里插入图片描述
在查看6380信息
在这里插入图片描述

如果另外一个6382配置完成则6380就有两个从机
在这里插入图片描述

到此主从复制已完成,注意这里是命令配置的,redis重启后会主从复制会消失。真实的主从配置应该在配置文件配置,这样的话就是永久的
在这里插入图片描述

注意事项

主机可以写,从机不能写只能读,主机中所有信息和数据都会自动保存到从机中

1,主机可以写,从机不能写只能读,主机中所有信息和数据都会自动保存到从机汇总。
向主机中存入数据,主机能存也能取
在这里插入图片描述
从机6381和682中取出主机中的数据
在这里插入图片描述
在这里插入图片描述
给从机插入值时会报错
在这里插入图片描述
2,主机断开连接,从机依旧连接到主机,但是没有写操作,这个时候主机如果重启了,从机依旧可以获取到主机写的信息。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3,如果使用命令行,来配置 的主从,这个时候如果重启了,就会变成主机,此时只要变成从机,立刻会从主机中获取值。
在这里插入图片描述
在这里插入图片描述
此时将6381设置成6380的从机,再获取值,则可以获取到
在这里插入图片描述

3,主从复制原理

slave启动成功连接到master后会发送一个sync同步命令。
master接到命令,启动后台的存盘进程,同时收集所有接收到的用于修改数据集的命令,在后台程序执行完毕之后,matser将传送整个数据文件到slave,并完成一次完全同步。

全量复制: 而slave服务在接收到数据库文件数据后,将其存盘,并加载到内存汇总
增量复制:master继续将新的 所有收集到的修改命令依次传给slave,完成同步
但是只要是重新连接master,一次完全同步(全量复制)将会被自动执行,我们的数据移一定可以在从机中看到

二、哨兵模式

当主服务器宕机后,需要把一台从服务器切换为主服务器,保证redis服务的高可用。

在redis2.8之前,如果主机断开了连接(宕机),可以使用slave no one 让当前从服务器变成主服务器,其他节点就可以手动连接到最新的这个主节点。如果主机原主机恢复,则重新手动连接到原主机。
这种做法费时费力,还会造成一段时间内服务不可用

redis2.8之后开始提供sentinel(哨兵)架构来解决这个问题,Sentinel能够后台监控主机是否故障,如果故障了根据投票数**自动将从库转换为主库**
哨兵模式时一种特殊的模式,首先redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,他会独立运行,其原理是哨兵通过发送命令,等待redis服务器响应,从而监控运行的多个redis实例

在这里插入图片描述

这里哨兵有两个作用
1,通过发送命令,让redis服务器返回监控其运行状态,包括住服务器和从服务器。
2,当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他从服务器,修改配置文件,让他们切换主机

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

1,单个哨兵

目前状态是单机版一主二从
1,复制sentinel.conf文件到bin/rconfig/ 目录下

cp sentinel.conf /usr/local/bin/rconfig/

2,保留一份出厂的sentinel.conf文件,然后复制一份出来

mv sentinel.conf sentinel.conf_bak
cp sentinel.conf_bak sentinel.conf

3,修改sentinel.conf文件,此处6380为主机,6381、6382为从机
在这里插入图片描述
后面会介绍sentinel.coonf的配置属性
4,启动哨兵

redis-sentinel ./rconfig/sentinel.conf

在这里插入图片描述
可以看到启动成功,并且我开始启动的时候只有一台主机(6380)一台从机(6382),当我修改6381为6380的从机时哨兵自动检测到
到此单个哨兵已经配置完成

测试:断开master主机,查看sentinel信息是否能够选出一台新主机,然后查看 6381和6382服务信息
在这里插入图片描述
sentinel日志信息如下
在这里插入图片描述
查看6381和6382信息,发现6381角色还是slave,6382变成了master
在这里插入图片描述
在这里插入图片描述
至于选择哪台服务器,redis有自己的投票算法。
此时可以看到sentinel配置文件的conf已修改
在这里插入图片描述
如果此时恢复6380机器(原来的主机)结果会如何呢?

在这里插入图片描述
结论:如果主机恢复,只能归并到新的主机下面当做从机,这就是哨兵模式的规则

2,sentinel.conf配置详解

redis版本是6.0.9

# Example sentinel.conf
#默认情况下,从不同的接口哨兵将不可达
# localhost,或者使用'bind'指令绑定到网络列表
#接口,或使用"protected-mode no" by禁用保护模式
#将它添加到这个配置文件。
#在执行此操作之前,确保该实例受到外部保护
#通过防火墙或其他方式的世界。
# bind 127.0.0.1 192.168.119.200
# protected-mode no

# 哨兵sentinel实例运行的端口 默认26379,如果是集群的话需要配置端口
port 26379
#默认情况下,Redis Sentinel不作为守护进程运行。如果你需要的话,使用“yes”。
#注意Redis会在/var/run/redis-sentinel中写入一个pid文件。pid当
#监控
daemonize no
#当运行守护进程时,Redis Sentinel写入一个pid文件
# /var/run/redis-sentinel。默认情况下pid。可以指定自定义pid文件

#位置。
pidfile "/var/run/redis-sentinel.pid"
#指定日志文件名。空字符串也可以用于强制
# Sentinel来登录标准输出。注意,如果您使用standard
#但是在后台运行时,日志将被发送到/dev/null
logfile ""

# 哨兵sentinel的工作目录
dir /tmp
 
# 哨兵sentinel监控的redis主节点的 ip port 
# master-name  可以自己命名的主节点名字 只能由字母A-z、数字0-9 、这三个字符".-_"组成。
# quorum 当这些quorum个数sentinel哨兵认为master主节点失联 那么这时 客观上认为主节点失联了
# sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel monitor mymaster 127.0.0.1 6379 2
 
# 当在Redis实例中开启了requirepass foobared 授权密码 这样所有连接Redis实例的客户端都要提供密码
# 设置哨兵sentinel 连接主从的密码 注意必须为主从设置一样的验证密码
# sentinel auth-pass mymaster MySUPER--secret-0123passw0rd
# sentinel auth-pass <master-name> <password>


# 指定多少毫秒之后 主节点没有应答哨兵sentinel 此时 哨兵主观上认为主节点下线 默认30秒
# sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds mymaster 30000
 
# 这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行 同步,
#这个数字越小,完成failover所需的时间就越长,
#但是如果这个数字越大,就意味着越 多的slave因为replication而不可用。
#可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。
# sentinel parallel-syncs <master-name> <numslaves>
sentinel parallel-syncs mymaster 1
 
 
 
# 故障转移的超时时间 failover-timeout 可以用在以下这些方面: 
#1. 同一个sentinel对同一个master两次failover之间的间隔时间。
#2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。
#3.当想要取消一个正在进行的failover所需要的时间。  
#4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了
# 默认三分钟
# sentinel failover-timeout <master-name> <milliseconds>
sentinel failover-timeout mymaster 180000
 
 
# SCRIPTS EXECUTION
 
#配置当某一事件发生时所需要执行的脚本,可以通过脚本来通知管理员,例如当系统运行不正常时发邮件通知相关人员。
#对于脚本的运行结果有以下规则:
#若脚本执行后返回1,那么该脚本稍后将会被再次执行,重复次数目前默认为10
#若脚本执行后返回2,或者比2更高的一个返回值,脚本将不会重复执行。
#如果脚本在执行过程中由于收到系统中断信号被终止了,则同返回值为1时的行为相同。
#一个脚本的最大执行时间为60s,如果超过这个时间,脚本将会被一个SIGKILL信号终止,之后重新执行。
 
#通知型脚本:当sentinel有任何警告级别的事件发生时(比如说redis实例的主观失效和客观失效等等),将会去调用这个脚本,
#这时这个脚本应该通过邮件,SMS等方式去通知系统管理员关于系统不正常运行的信息。调用该脚本时,将传给脚本两个参数,
#一个是事件的类型,
#一个是事件的描述。
#如果sentinel.conf配置文件中配置了这个脚本路径,那么必须保证这个脚本存在于这个路径,并且是可执行的,否则sentinel无法正常启动成功。
#通知脚本
# sentinel notification-script <master-name> <script-path>
# sentinel notification-script mymaster /var/redis/notify.sh
 
# 客户端重新配置主节点参数脚本
# 当一个master由于failover而发生改变时,这个脚本将会被调用,通知相关的客户端关于master地址已经发生改变的信息。
# 以下参数将会在调用脚本时传给脚本:
# <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>
# 目前<state>总是“failover”,
# <role>是“leader”或者“observer”中的一个。 
# 参数 from-ip, from-port, to-ip, to-port是用来和旧的master和新的master(即旧的slave)通信的
# 这个脚本应该是通用的,能被多次调用,不是针对性的。
# sentinel client-reconfig-script <master-name> <script-path>
# sentinel client-reconfig-script mymaster /var/redis/reconfig.sh

# SECURITY
# 默认情况下,哨兵集不能更改通知脚本

#和client-reconfig-script在运行时。这避免了一个微不足道的安全问题

#客户端可以将脚本设置为任意值,并按顺序触发故障转移

#执行程序。

sentinel deny-scripts-reconfig yes


3,多哨兵模式(集群版)

单机版集群很简单,复制多个sentinel,改下端口即可
在这里插入图片描述

redis主从配置不再以命令形式配置,以修改配置文件形式,服务器分三台,使用VMware克隆了三台服务器,分别为
192.168.119.200 (master)
192.168.119.201 (slave)
192.168.119.202 (slave)

1,redis服务主从配置

在这里插入图片描述

在这里插入图片描述

202服务配置
在这里插入图片描述
分别启动redis服务查看服务信息

../redis-server redis.conf
../redis-cli -p 6379

主机
在这里插入图片描述

从机201和203如下
在这里插入图片描述

在这里插入图片描述
2,哨兵配置,一台机器配置一个哨兵,检测主机
每台机器的哨兵检测主机
日志(可自定义目录,,这样做的话,日志不会输出再控制台,会输入到日志文件中,如果为空,则会输出到控制台)
在这里插入图片描述
检测主机

主机端口+ip,参数2是又两台哨兵检查到主机宕机后才进行选举
在这里插入图片描述

启动每台服务器上的sentinel

redis-sentinel ./rconfig/sentinel.conf

主机日志
在这里插入图片描述
从机日志
在这里插入图片描述
测试,关掉主机,查看选举结果

在这里插入图片描述
一点反应都没o(╯□╰)o,只看到了主观下线,没有客观下线
在这里插入图片描述
这里是遇到的第一个坑,在单机集群我就遇到一次,自己瞎搞就搞好了,没找到原因,查找了各种资料,最后终于找到了。

原因分析如下
1,首先确保每个哨兵都能检测到主服务器 检查配置,如下
在这里插入图片描述
2,启动是发现每个哨兵都能检测到主机服务器,但是只有主观下线,没有客观下线,说明哨兵之间无法通信,尝试着改redis.conf的bind配置属性和sentinel.conf的bind配置属性,都无效果
3,每个sentinel是一个实例,那个他们之间应该是唯一的,查看每个sentinel的myid,发现都一样,是由于我克隆centOS导致的
在这里插入图片描述
4,处理方法删掉这个myid,重启sentine服务,系统制动给每个sentinel实例分配一个唯一的id
在这里插入图片描述

处理方法已结束,再次断开主机,发现主从换已经OK了

在这里插入图片描述

哨兵模式
优点:
1、哨兵集群,基于主从复制模式,所有主从配置优点全有
2、主从可以切换,故障可以转移,系统可用性会更好
3、哨兵模式就是主从模式的升级版,手动到自动,更加健壮
缺点:
1、Redis不好在线扩容,集群容量一旦达到上限,在线扩容就十分麻烦
2、实现哨兵模式的配置其实很麻烦,里面有很多选择

主从复制以及哨兵模式都是自己边配置边写的,希望对大家有帮助!如有问题欢迎指正,遇到问题可以相互讨论!

猜你喜欢

转载自blog.csdn.net/HBliucheng/article/details/112845681