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、哨兵模式
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、故障迁移一致性
- Sentinel 自动故障迁移使用算法Raft来选举领头(leader)Sentinel,从而确保在一个给定的周期(epoch)里,只有一个领头产生
- 这表示在同一个周期中,不会有两个 Sentinel 同时被选中为领头,并且各个 Sentinel 在同一个及节点中只会对一个领头进行投票
- 更高的配置节点总是优于较低的节点,因此每个 Sentinel 都会主动使用更新的节点来代替自己的配置
2-9、TILT模式
当处于 TILT 模式,Sentinel 或持续监控所有状态
- 停止处理请求
- 当有实例向这个 Sentinel 发送
sentinel is-master-down-by-add
命令时,Sentinel 返回负值:因为这个Sentinel 所有进行的下线判断已经不再准确
如果TILT可以正常维持30秒钟,那么 Sentinel 退出 TILT 模式,TILT 模式是 Sentinel 的被动模式