保姆教程系列二、Redis高可用(主从同步+哨兵模式)

15 篇文章 0 订阅
12 篇文章 0 订阅

系列文章目录

!!!是的没错,胖友们,保姆教程系列又更新了!!!

保姆教程系列一、Redis部署 so easy
保姆教程系列二、Redis高可用(主从同步+哨兵模式)
保姆教程系列三、Redis高可用(Cluster集群模式)


前言

请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i


上篇我们介绍到 保姆教程系列一、Redis部署 so easy

提示:以下是本篇文章正文内容,下面案例可供参考

一、主从同步

什么是主从复制

主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点。master以写为主,slave以读为主

主从复制的作用

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

主从复制的原理

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

redis主从

第一步、环境准备

先准备四台服务器,并安装好redis服务,友情链接:Centos下安装redis

注意:我们需要设置一下防火墙,否则主从机之间无法同步数据,命令如下,这里根据自己设置的端口进行更改。或者关闭防火墙也可以

#查看防火墙是否开启
firewall-cmd --state 结果:not running没有运行

#关闭防火墙
systemctl stop firewalld.service

第二步、主从复制

2.1 redis环境配置

注意:修改四台机器redis安装路径下的配置文件redis.conf

#修改redis.conf
bind  0.0.0.0  #限定redis访问网卡
port 6739 # 绑定端口号
daemonize yes #用来指定redis是否要用守护进程的方式启动,默认为no
protected-mode no #设置为后台启动
logfile /usr/local/redis/log/redis_6379.log #redis日志文件
pidfile  /usr/local/redis/log/redis_6379.pid #redis以守护进程方式运行
replicaof  192.168.248.128 6379 #绑定主节点的方法,注意:主节点不需要这个配置,只配置从节点!!!
requirepass admin123  #本地redis密码
masterauth  admin123  #主节点redis密码 注意:主节点也要配置,后边哨兵容灾切换用到
slaveof 192.168.248.128 6379 #从节点所依赖的主节点ip+端口,注意:主库不需要这个配置,只配置从库!!!

2.2 启动redis服务

注意:确保四台redis进程及端口存在

#启动redis服务
redis-server /usr/local/redis/conf/redis.conf & 
#连接客户端
redis-cli -p 6379 -h 127.0.0.1
#验证密码
127.0.0.1:6379> auth admin123  
OK

redis进程

2.3 查看主从状态

info replication

主从同步
详解:

role:master/slave # 当前角色是主/从节点
master_host:192.168.248.128 #主机信息
slave0:ip=从节点0ip和端口
slave1:ip=从节点1ip和端口
slave2:ip=从节点2ip和端口

第三步、主从测试

3.1 主节点

192.168.248.128:6379> set key 123456 
OK

3.2 从节点

192.168.248.129:6379> keys *
1) "key"
192.168.248.130:6379> get key
"123456"
192.168.248.131:6379> get key
"123456"

至此redis互为主从同步已经搭建完成

主从同步说明

1、主机可以写,从机不能写,只能读。主机中的所有数据都会保存到从机中去。

2、主机断开连接,从机依旧连接到主机的,但是没有写操作,这个时候,主机如果回来了,从机依旧可以直接获取到主机写的信息!

3、如果是使用命令行,来配置的主从,这个时候如果重启了,就会变回主机!只要变为从机,立马就会从主机中获取值!

思考
此时redis主从同步只是起到了数据灾备效果,当主机挂掉,从节点只能读取数据,不能写数据。这就导致当有新数据需要写入redis存储时,redis没有主机可写导致服务不可用,如何让redis实现真正高可用呢?这就引申出redis的哨兵模式


二、哨兵模式

什么是哨兵模式

Redis Sentinel是Redis 的高可用性解决方案,由一个或多个Sentinel(哨兵)实例组成。它可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,它的主要功能如下:

监控(Monitoring):Sentinel会不断地检查你的主服务器和从服务器是否运作正常。

通知(Notification):当被监控的某个 Redis 服务器出现问题时, Sentinel可以通过API向管理员或者其他应用程序发送通知。

故障迁移:当主服务器不能正常工作时,Sentinel会自动进行故障迁移,也就是主从切换

统一的配置:管理连接者询问sentinel取得主从的地址。

哨兵模式的原理

Sentinel 使用的算法核心是 Raft算法,主要用途就是用于分布式系统,系统容错,以及Leader选举,每个Sentinel都需要定期的执行以下任务:

每个 Sentinel会自动发现其他 Sentinel 和从服务器,它以每秒钟一次的频率向它所知的主服务器、从服务器以及其他Sentinel实例发送一个 PING 命令

如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds选项所指定的值, 那么这个实例会被Sentinel标记为主观下线。 有效回复可以是: +PONG 、 -LOADING 或者 -MASTERDOWN

如果一个主服务器被标记为主观下线, 那么正在监视这个主服务器的所有Sentinel要以每秒一次的频率确认主服务器的确进入了主观下线状态。

如果一个主服务器被标记为主观下线, 并且有足够数量的Sentinel(至少要达到配置文件指定的数量)在指定的时间范围内同意这一判断,
那么这个主服务器被标记为客观下线。

在一般情况下, 每个Sentinel会以每 10 秒一次的频率向它已知的所有主服务器和从服务器发送 INFO 命令。当一个主服务器Sentinel标记为客观下线时,Sentinel向下线主服务器的所有从服务器发送 INFO 命令的频率会从 10秒一次改为每秒一次。

当没有足够数量的Sentinel同意主服务器已经下线, 主服务器的客观下线状态就会被移除。 当主服务器重新向Sentinel的 PING命令返回有效回复时, 主服务器的主管下线状态就会被移除。
哨兵模式原理

第一步、搭建哨兵

1.1 哨兵配置

注意:在部署redis服务器上分别部署哨兵,每台服务器一个哨兵,配置方式相同,如下:

#创建工作路径
mkdir -p /usr/local/redis/sentinel

#进入安装包存放路径
cd /usr/local/redis/conf

#创建哨兵配置文件
vim sentinel.conf

sentinel.conf内容:

#端口默认为26379
port 26379
#关闭保护模式,可以外部访问。
protected-mode no
#设置为后台启动。
daemonize yes
#指定服务器IP地址和端口,并且指定当有3台哨兵认为主机挂了,则对主机进行容灾切换。  注意:三台哨兵这里的ip配置均为主节点ip和端口
sentinel monitor mymaster 192.168.248.128 6379 3
#当在Redis实例中开启了requirepass,这里就需要提供密码。
sentinel auth-pass mymaster admin123
#这里设置了主机多少秒无响应,则认为挂了。
sentinel down-after-milliseconds mymaster 3000
#主备切换时,最多有多少个slave同时对新的master进行同步,这里设置为默认的snetinel parallel-syncs mymaster 1
#故障转移的超时时间,这里设置为三分钟。
sentinel failover-timeout mymaster 180000
#进程文件
pidfile "/usr/local/redis/redis-sentinel_26379.pid"
# log日志保存位置
logfile "/usr/local/redis/log/redis-sentinel.log"
# 工作目录
dir "/usr/local/redis/sentinel"

1.2 启动哨兵

注意:分别在三台从服务器上启动各自的哨兵

#进入redis解压缩包内
cd /opt/redis-6.2.6/bin

#开启哨兵,指定哨兵配置文件
redis-sentinel /usr/local/redis/conf/sentinel.conf 

1.3 哨兵状态

#连接客户端,注意端口!!!
redis-cli -p 26379

#查看哨兵
info sentinel

哨兵已经监听到主节点IP端口和运行状态,并且有3个从节点,3个哨兵
哨兵状态

1.4 容灾切换

(1)模拟主机宕机,将主机 redis 服务关闭,来查看哨兵的作用
(2)关闭主节点之后,我们去查看哨兵日志
(3)在其它节点中查看哨兵主从切换是否成功
(4)重新连接挂掉的主节点(当主节点连接回来之后自动变成了从节点,并且成功连上了主机)
(5)再去主节点确认一下节点信息

哨兵模式的优缺点

优点

  1. 哨兵集群,基于主从复制模式,所有的主从配置优点,它全有
  2. 主从可以切换,故障可以转移,系统的可用性就会更好
  3. 哨兵模式就是主从模式的升级,手动到自动,更加健壮!

缺点

  1. Redis不好在线扩容,集群容量一旦到达上限,在线扩容就十分麻烦
  2. 哨兵模式的配置繁琐

三、下篇预告

敬请关注下篇保姆教程系列三、Redis高可用(Cluster集群模式)

总结

我是南国以南i记录点滴每天成长一点点,学习是永无止境的!转载请附原文链接!!!

参考链接参考链接

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Kubernetes上部署Redis高可用可以通过Redis Sentinel或Redis Cluster来实现。这里以Redis Sentinel为例,步骤如下: 1. 创建Redis Sentinel镜像 首先需要创建Redis Sentinel镜像,可以通过以下Dockerfile创建: ``` FROM redis:5.0.7-alpine RUN apk add --no-cache --update curl COPY sentinel.conf /etc/redis/sentinel.conf CMD ["redis-sentinel", "/etc/redis/sentinel.conf"] ``` 其中sentinel.conf是Redis Sentinel的配置文件,可以在其中设置Redis实例的地址、端口等信息。 2. 创建Redis StatefulSet 接着创建Redis StatefulSet,可以参考以下yaml文件: ``` apiVersion: v1 kind: Service metadata: name: redis spec: selector: app: redis ports: - name: redis port: 6379 targetPort: 6379 clusterIP: None --- apiVersion: apps/v1 kind: StatefulSet metadata: name: redis spec: serviceName: redis replicas: 3 selector: matchLabels: app: redis template: metadata: labels: app: redis spec: containers: - name: redis image: redis:5.0.7-alpine command: - redis-server - /etc/redis/redis.conf volumeMounts: - name: redis-config mountPath: /etc/redis - name: sentinel image: my-redis-sentinel:latest volumeMounts: - name: sentinel-config mountPath: /etc/redis volumes: - name: redis-config configMap: name: redis-config - name: sentinel-config configMap: name: sentinel-config volumeClaimTemplates: - metadata: name: data annotations: volume.beta.kubernetes.io/storage-class: "gp2" spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 1Gi ``` 其中,StatefulSet中有两个容器:一个是Redis容器,一个是Redis Sentinel容器。Redis容器使用Redis官方镜像,Redis Sentinel容器使用自己创建的Redis Sentinel镜像。同时,还需要创建两个ConfigMap,一个用于Redis配置,一个用于Redis Sentinel配置。 3. 部署Redis Sentinel 最后部署Redis Sentinel,可以参考以下yaml文件: ``` apiVersion: apps/v1 kind: Deployment metadata: name: redis-sentinel spec: replicas: 3 selector: matchLabels: app: redis-sentinel template: metadata: labels: app: redis-sentinel spec: containers: - name: redis-sentinel image: my-redis-sentinel:latest command: - redis-sentinel - /etc/redis/sentinel.conf volumeMounts: - name: sentinel-config mountPath: /etc/redis volumes: - name: sentinel-config configMap: name: sentinel-config ``` 通过部署Redis Sentinel,可以实现Redis集群的高可用。如果Redis主节点出现故障,Redis Sentinel会自动将从节点升级为主节点,从而保证Redis集群的可用性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值