Redis 主从复制与哨兵模式(Sentinel)

1、主从复制

1-1、环境搭建

节点名 IP
redis-master 192.168.86.135
redis-node01 192.168.86.136
reids-node02 192.168.86.137
# master,node01,node02 关闭防火墙,临时关闭:systemctl stop firewalld
systemctl disable --now firewalld
systemctl disable --now dnsmasq
systemctl disable --now NetworkManager

# master,node01,node02 关闭selinux
setenforce 0
sed -i ‘s#SELINUX=enforcing#SELINUX=disabled#g‘ /etc/sysconfig/selinux
sed -i ‘s#SELINUX=enforcing#SELINUX=disabled#g‘ /etc/selinux/config

# master,node01,node02 关闭分区
swapoff -a && sysctl -w vm.swappiness=0
sed -ri ‘/^[^#]*swap/s@^@#@‘ /etc/fstab

# master,node01,node02 设置hosts
[root@master /]# 
cat >> /etc/hosts << EOF
192.168.86.135 master
192.168.86.136 node01
192.168.86.137 node02
EOF

yum install cpp binutils glibc-kernheaders glibc-common glibc-devel gcc make -y
cd /opt
wget https://download.redis.io/releases/redis-6.2.4.tar.gz
tar xvf redis-6.2.4.tar.gz
cd redis-6.2.4 && make
mkdir -p /usr/local/redis
make PREFIX=/usr/local/redis install
cp redis.conf /usr/local/redis

# 启动
cd /usr/local/redis
mkdir -p logs data

vi redis.conf
# 是否以守护进程的方式启动
daemonize yes
# 默认数据库16个
databases 16
# 绑定IP
# bind 0.0.0.0
port 6379
protected-mode yes
# 配置密码
requirepass 123456
# 从节点访问主节点密码(必须和requirepass一致)
masterauth 123456
# 从节点只读模式
replica-read-only yes
# 设置日志路径
logfile "/usr/local/redis/logs/redis_6379.log"
# 设置存储数据路径
dir /usr/local/redis/data
# rdb 数据文件名
dbfilename dump.rdb
# aof模式开启和aof数据文件名
appendonly yes
appendfilename "appendonly.aof"

# 从节点添加配置
slaveof 192.168.86.135 6379
:wq!

./bin/redis-server redis.conf

## 端口查看
netstat -lntp

# 退出
pkill redis

# 配置开机启动
vim /etc/systemd/system/redis.service
[Unit]
Description=redis-server
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf
PrivateTmp=true

[Install]
WantedBy=multi-user.target

# 启动
systemctl daemon-reload && systemctl enable --now redis

# redis-master 节点查看
127.0.0.1:6379> info replication
role:master
....

# redis-node01 节点查看
127.0.0.1:6379> info replication
role:slave
....

# redis-node02 节点查看
127.0.0.1:6379> info replication
role:slave
....

1-2、故障分析与解决方案

整理中.......................


2、哨兵模式

Redis 主从复制与哨兵模式(Sentinel)

2-1、含义

Redis Sentinel 是分布式系统中监控 Redis 主从服务器,并提供主服务器下线时自动故障功能的模式。其中有四大特性:

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

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

  • 自动故障迁移(Automatic failover):当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作

  • 配置提供者(Configuration provider):客户端不需要连到主从,而是连到哨兵。哨兵给客户端提供服务发现的功能

2-2、特点

  • 保证高可用
  • 监控各个节点
  • 自动故障迁移

2-3、分布式特性

  • 降低了误报的可能性
  • 降低对客户端的影响
  • 任意 Sentinel 都可对外提供服务

2-4、优点

  • 哨兵模式是基于主从模式的,所有主从的优点,哨兵模式都有
  • 主从可以自动切换,系统更加健壮,可用性更高
  • Sentinel 会不断地检查你的主服务器和从服务器是否运作正常,当被监控的某个 Redis 服务器出现问题时,Sentinel 可以通过 API 向管理员或者其他应用程序发送通知

2-5、缺点

  • 主从切换需要时间,会丢失数据
  • 还是没有解决主节点写的压力
  • 主节点的写能力,存储能力受到单机的限制
  • 动态扩容难度复杂,对于集群,容量达到上限时在线扩容会变得很复杂

2-6、环境搭建

############ 接着上面主从复制环境搭建, 继续往下搭建 ############

# master,node01,node02 
vi /usr/local/redis/redis-sentinel.conf
# 放行所有 IP 限制
# bind 0.0.0.0
# 进程端口
port 26379
# 后台启动
daemonize yes
# 日志存储路径
logfile "/usr/local/redis/logs/redis-sentinel-26379.log"
# 数据存储路径
dir /usr/local/redis/data
# 进程编号记录文件
pidfile /var/run/redis-sentinel.pid
# 指示 Sentinel 去监视一个名为 mymaster 的主服务器
sentinel monitor mymaster 192.168.86.135 6379 2
# 访问主节点的密码
sentinel auth-pass mymaster 123456

sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes

# 配置开机启动
vim /etc/systemd/system/redis-sentinel.service
[Unit]
Description=redis-sentinel
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/redis/bin/redis-sentinel /usr/local/redis/redis-sentinel.conf
PrivateTmp=true

[Install]
WantedBy=multi-user.target

# 启动
systemctl daemon-reload && systemctl enable --now redis-sentinel

# 检查一下
[root@redis-master logs]# pwd
/usr/local/redis/logs
[root@redis-master logs]# tail -f redis-sentinel-26379.log

2-7、工作原理

定时任务

? Sentinel 内部有 3 个定时任务,分别是:

  • 每 1 秒每个 Sentinel 对其他 Sentinel 和 Redis 节点执行 PING 操作
  • 每 2 秒每个 Sentinel 通过 Master 节点的 channel 交换信息
  • 每 2 秒每个 Sentinel 会对 Master 和 Slave 执行 INFO 命令

主观下线

所谓的主观下线(Subjectively Down,简称SDOWN):指的是单个 Sentinel 实例对服务器做出的下线判断,即单个 Sentinel 认为某个服务下线

客观下线

客观下线(Objectively Down,简称ODOWN):指的是多个Sentinel 实例在对同一个服务器做出SDOWN判断,并且通过命令互相交流之后,得出的服务器下线判断,然后开启 failover

仲裁

仲裁指配置文件中的 quorum 选项

quorum 的值一般设置为 Sentinel 个数的二分之一加 1

工作原理简介

  • 每秒 PING
  • 有效回复 PING 命令的时间超过配置文件 down-after-milliseconds 选项所指定的值,被认定为主观下线
  • 确认主观下线状态
  • 满足条件,客观下线
  • 投票选举主节点,从节点复制数据
  • 当主节点标记为客观下线时,INFO 命令触发由 10s 一次改为 1s 一次
  • 若没有足够数量的 Sentinel 同意Master 已经下线,Master的客观下线状态就会被移除。若 Master 重新向 Sentinel 的 PING 命令返回有效回复,Master 的主观下线状态就会被移除

2-8、故障迁移一致性

  1. Sentinel 自动故障迁移使用算法Raft来选举领头(leader)Sentinel,从而确保在一个给定的周期(epoch)里,只有一个领头产生
  2. 这表示在同一个周期中,不会有两个 Sentinel 同时被选中为领头,并且各个 Sentinel 在同一个及节点中只会对一个领头进行投票
  3. 更高的配置节点总是优于较低的节点,因此每个 Sentinel 都会主动使用更新的节点来代替自己的配置

2-9、TILT模式

当处于 TILT 模式,Sentinel 或持续监控所有状态

  • 停止处理请求
  • 当有实例向这个 Sentinel 发送 sentinel is-master-down-by-add命令时,Sentinel 返回负值:因为这个Sentinel 所有进行的下线判断已经不再准确

如果TILT可以正常维持30秒钟,那么 Sentinel 退出 TILT 模式,TILT 模式是 Sentinel 的被动模式

Redis 主从复制与哨兵模式(Sentinel)

上一篇:opencv安装


下一篇:Docker概述