009.Redis Predixy + Sentinel 架构
文章目录
- Predixy介绍
- Predixy概述
- Predixy特性
- Predixy配置
- 基础准备
- 环境准备
- 时钟服务
- 变量准备
- 互信配置
- Redis安装前置优化
- Redis安装
- Redis编译安装
- Redis服务单元
- Redis主从部署
- Redis 主节点配置
- Redis 从节点配置
- Redis 主从验证
- Redis哨兵部署
- 哨兵配置获取
- 哨兵模式配置
- 哨兵服务启动
- 确认验证
- Predixy代理部署
- Predixy 安装
- Predixy 配置
- predixy服务单元
- predixy服务启动
- 确认验证
- 状态验证
- 模拟故障
Predixy介绍
Predixy概述
Predixy 是一款高性能全特征redis代理,支持redis-sentinel和redis-cluster。
https://github.com/joyieldInc/predixy/blob/master/doc/config_CN.md
Predixy特性
参考:Predixy特性
Predixy配置
predixy的配置类似redis, 具体配置项的含义在配置文件里有详细解释,请参考下列配置文件:
- predixy.conf:整体配置文件,会引用下面的配置文件;
- cluster.conf:用于Redis Cluster时,配置后端redis信息;
- sentinel.conf:用于Redis Sentinel时,配置后端redis信息;
- auth.conf:访问权限控制配置,可以定义多个验证密码,可每个密码指定读、写、管理权限,以及定义可访问的健空间;
- dc.conf:多数据中心支持,可以定义读写分离规则,读流量权重分配;
- latency.conf:延迟监控规则定义,可以指定需要监控的命令以及延时时间间隔。
提示:提供这么多配置文件实际上是按功能分开了,所有配置都可以写到一个文件里,也可以写到多个文件里然后在主配置文件里引用进来。
基础准备
环境准备
- 安全预设
根据实际情况,关闭防火墙和SELinux。
[root@redis01 ~]# systemctl disable firewalld --now
[root@redis01 ~]# sed -i 's/=enforcing/=disabled/g' /etc/selinux/config
注意:以上操作需要在所有节点上执行。
- 节点规划
角色 | 主机名 | IP地址 | 软件规划 |
---|---|---|---|
Redis Master | redis01 | 172.24.8.11 | Redis Server |
Redis01 的 Slave | redis02 | 172.24.8.12 | Redis Server |
Redis01 的 Slave | redis03 | 172.24.8.13 | Redis Server |
Predixy 代理 | predixy | 172.24.8.14 | Predixy Proxy |
- 配置主机名
建议配置内部主机名解析。
[root@redis01 ~]# cat >> /etc/hosts << EOF
172.24.8.11 redis01
172.24.8.12 redis02
172.24.8.13 redis03
172.24.8.14 predixy
EOF
时钟服务
主从架构建议保证时钟服务正确,具体时钟配置参考:NTP服务器
001.Chrony时间服务器
- ntpd服务查看
[root@redis01 ~]# ntpq -npremote refid st t when poll reach delay offset jitter
==============================================================================
*116.62.13.223 100.100.61.92 2 u 28 64 377 34.750 24.098 4.261
+203.107.6.88 100.107.25.114 2 u 13 64 377 47.745 18.287 8.121
- chrony服务查看
[root@redis01 ~]# chronyc sources -v
变量准备
为实现自动化部署,自动化分发相关文件,提前定义相关主机名、IP组、变量等。
[root@redis01 ~]# vim redisnodes.sh #确认相关主机名和IP
#!/bin/bash
#***************************************************************#
# ScriptName: redisnodes.sh
# Author: xhy
# Create Date: 2025-02-22 01:44
# Modify Author: xhy
# Modify Date: 2025-02-22 01:44
# Version: v1
#***************************************************************## 集群 SENTINEL 机器 IP 数组
export ALL_IPS=(172.24.8.11 172.24.8.12 172.24.8.13)# 集群 SENTINEL IP 对应的主机名数组
export ALL_NAMES=(redis01 redis02 redis03)
互信配置
为了方便远程分发文件和执行命令,本方案配置 redis01 节点到其它节点的 ssh信任关系,即免秘钥管理所有其他节点。
[root@redis01 ~]# source redisnodes.sh #载入变量[root@redis01 ~]# wget http://down.linuxsb.com/myshell/mkpublickey.sh
[root@redis01 ~]# vim mkpublickey.sh #确认IP
#……
# 检查参数
if [ $# -ne 1 ]; thenecho "该脚本需要带上主机密码: $0 <密码>"exit 1
fi# 主机列表(直接内置)
HOSTS=(172.24.8.11172.24.8.12172.24.8.13
)
#……[root@redis01 ~]# bash mkpublickey.sh redhat123
提示:如上仅需在 redis01 节点上操作。
Redis安装前置优化
[root@redis01 ~]# chmod +x *.sh
[root@redis01 ~]# source redisnodes.sh
[root@redis01 ~]# for all_ip in ${ALL_IPS[@]}doecho -e "\n\n\033[33m[INFO] >>> ${all_ip}...\033[0m"sleep 2scp -rp /etc/hosts root@${all_ip}:/etc/hostsssh root@${all_ip} "echo 'vm.overcommit_memory=1' > /etc/sysctl.d/redis-sysctl.conf"ssh root@${all_ip} "sysctl -p /etc/sysctl.d/redis-sysctl.conf"ssh root@${all_ip} "echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.d/rc.local"done
提示:如上仅需在 redis01 上操作。
Redis安装
Redis编译安装
建议使用编译安装。
[root@redis01 ~]# source redisnodes.sh
[root@redis01 ~]# for all_ip in ${ALL_IPS[@]}doecho -e "\n\n\033[33m[INFO] >>> ${all_ip}...\033[0m"sleep 2scp -rp /etc/hosts root@${all_ip}:/etc/hostsssh root@${all_ip} "mkdir -p /tmp/redis-tmp /etc/redis/ /var/log/redis/"ssh root@${all_ip} << EOFREIDS_VER=8.0.3DOWNLOAD_URL="https://mirrors.huaweicloud.com/redis"curl -L "\${DOWNLOAD_URL}/redis-\${REIDS_VER}.tar.gz" -o "/tmp/redis-\${REIDS_VER}.tar.gz"tar xzvf "/tmp/redis-\${REIDS_VER}.tar.gz" -C /tmp/redis-tmp --strip-components=1 --no-same-ownercd /tmp/redis-tmpmake -j4make install PREFIX=/usr/local/redisecho 'PATH=/usr/local/redis/bin:\$PATH' > /etc/profile.d/redis.shsource /etc/profile.d/redis.shredis-cli -v
EOFdone
提示:所有主从节点都需要安装Redis,如上可实现所有节点循环编译完成安装。
Redis服务单元
通过服务单元的方式管理Redis是更推荐的方式,更符合最佳实践。
[root@redis01 ~]# cat > /usr/lib/systemd/system/redis-server.service <<EOF
[Unit]
Description=Redis Server Manager
After=network.target
After=network-online.target
Wants=network-online.target
Documentation=https://redis.io/documentation[Service]
ExecStart=/usr/local/redis/bin/redis-server /etc/redis/redis01_6379.conf
ExecStop=/usr/local/redis/bin/redis-cli shutdown
#Restart=on-failure
RestartSec=5
Type=forking[Install]
WantedBy=multi-user.target
EOF[root@redis01 ~]# source redisnodes.sh
[root@redis01 ~]# for redis_ip in ${ALL_IPS[@]}doecho -e "\n\n\033[33m[INFO] >>> ${redis_ip}...\033[0m"sleep 2scp -rp /usr/lib/systemd/system/redis-server.service root@${redis_ip}:/usr/lib/systemd/system/ssh root@${redis_ip} "mkdir -p /run/redis"done
提示:所有主从节点都建议使用服务单元的方式管理。
Redis主从部署
Redis 主节点配置
为了数据可靠性,同时开启AOF持久化。
[root@redis01 ~]# mkdir -p /var/lib/redis/redis01/ /var/log/redis/ #创建Redis RDB持久化文件保存路径[root@redis01 ~]# vim /etc/redis/redis01_6379.conf
# 核心配置项:
bind 0.0.0.0 -::1 # 允许所有IP连接
protected-mode no # 关闭保护模式
port 6379
daemonize yes
logfile /var/log/redis/redis01.log
dir /var/lib/redis/redis01# 主从复制相关
repl-backlog-size 64mb # 复制积压缓冲区大小(建议1-2倍内存)
repl-backlog-ttl 3600 # 缓冲区保留时间(秒)
repl-diskless-sync yes # 启用无盘复制(推荐)
repl-diskless-sync-delay 5 # 等待更多从节点加入(秒)
requirepass "StrongPassword123!" # 数据持久化
appendonly yes # 修改,启用AOF持久化
appendfilename "appendonly.aof" # 默认,AOF主文件名
appenddirname "appendonlydir" # 默认,AOF 分片文件目录
appendfsync everysec # 默认,同步策略(推荐值),每秒同步
#……[root@redis01 ~]# systemctl restart redis-server
[root@redis01 ~]# systemctl enable redis-server
Redis 从节点配置
[root@redis02 ~]# mkdir -p /var/lib/redis/redis01/ /var/log/redis/ #创建Redis RDB持久化文件保存路径[root@redis02 ~]# vim /etc/redis/redis01_6379.conf
#……
# 核心配置项:
bind 0.0.0.0 -::1 # 允许所有IP连接
protected-mode no # 关闭保护模式
port 6379
daemonize yes
logfile /var/log/redis/redis01.log
dir /var/lib/redis/redis01# 主从复制配置
replicaof 172.24.8.11 6379 # 关键配置:指定主节点
replica-read-only yes # 默认,从节点只读(推荐)
repl-diskless-load disabled # 默认,从节点禁用无盘加载(避免风险)
masterauth "StrongPassword123!" # 如果主节点有密码需配置# 数据持久化
appendonly yes # 修改,启用AOF持久化
appendfilename "appendonly.aof" # 默认,AOF主文件名
appenddirname "appendonlydir" # 默认,AOF 分片文件目录
appendfsync everysec # 默认,同步策略(推荐值),每秒同步[root@redis03 ~]# mkdir -p /var/lib/redis/redis01/ /var/log/redis/ #redis03创建相应目录[root@redis02 ~]# scp -rp /etc/redis/redis01_6379.conf root@172.24.8.13:/etc/redis/ #redis03相同配置[root@redis02 ~]# systemctl restart redis-server
[root@redis02 ~]# systemctl enable redis-server[root@redis03 ~]# systemctl restart redis-server
[root@redis03 ~]# systemctl enable redis-server
Redis 主从验证
[root@redis01 ~]# redis-cli -a "StrongPassword123!" -h redis01 -p 6379
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
redis01:6379> INFO replication
Redis哨兵部署
哨兵配置获取
从默认源码包中复制哨兵模式配置模板。
[root@redis01 ~]# cp -rp /tmp/redis-tmp/sentinel.conf /etc/redis/sentinel01_26379.conf
哨兵模式配置
- redis01配置
[root@redis01 ~]# cat > /etc/redis/sentinel01_26379.conf << EOF
protected-mode no# 默认,对外提供服务的端口
port 26379
# 开启后台运行
daemonize yes
# 设置哨兵日志文件
logfile "/var/log/redis/sentinel01.log"
# 哨兵sentinel工作目录
dir "/var/lib/redis/sentine01"# 指定Redis主节点主机IP地址和端口
sentinel monitor mymaster 172.24.8.11 6379 2
# 配置连接密码,此处的密码需要与 redis.conf里面配置的连接密码一致
sentinel auth-pass mymaster StrongPassword123!
# 设置了主机多少毫秒无响应,则认为服务异常
sentinel down-after-milliseconds mymaster 30000
# 主备切换时,最多有多少个slave同时对新的master进行同步,这里设置为默认的1
sentinel parallel-syncs mymaster 1
# 故障转移的超时时间毫秒
sentinel failover-timeout mymaster 180000
# 8.0版本后必须显式声明才能自动发现
sentinel announce-ip 172.24.8.11
# 8.0版本后必须显式声明才能自动发现
sentinel announce-port 26379
sentinel resolve-hostnames no
sentinel announce-hostnames no
EOF
- 配置服务单元
通过服务单元的方式管理Redis是更推荐的方式,更符合最佳实践。
[root@redis01 ~]# vim /usr/lib/systemd/system/redis-sentinel.service
[Unit]
Description=Redis Sentinel
After=network.target
After=network-online.target
Wants=network-online.target
Documentation=https://redis.io/documentation[Service]
ExecStart=/usr/local/redis/bin/redis-sentinel /etc/redis/sentinel01_26379.conf
ExecStop=/usr/local/redis/bin/redis-cli -p 26379 shutdown
Restart=always
RestartSec=5
Type=forking[Install]
WantedBy=multi-user.target
- 配置分发
将服务单元和配置文件分发至所有其他节点,针对sentinel announce-ip
和sentinel announce-port
每个节点单独配置。
[root@redis01 ~]# for all_ip in ${ALL_IPS[@]}doecho -e "\n\n\033[33m[INFO] >>> ${all_ip}...\033[0m"sleep 2ssh root@${all_ip} "mkdir -p /var/lib/redis/sentine01"scp -rp /etc/redis/sentinel01_26379.conf root@${all_ip}:/etc/redis/scp -rp /usr/lib/systemd/system/redis-sentinel.service root@${all_ip}:/usr/lib/systemd/system/done[root@redis02 ~]# vim /etc/redis/sentinel01_26379.conf
#……
sentinel announce-ip 172.24.8.12 # 8.0版本后必须显式声明才能自动发现
#……[root@redis02 ~]# vim /etc/redis/sentinel01_26379.conf
#……
sentinel announce-ip 172.24.8.13 # 8.0版本后必须显式声明才能自动发现
#……
#……
哨兵服务启动
所有节点相同配置,然后启动哨兵服务。
[root@redis01 ~]# for all_ip in ${ALL_IPS[@]}doecho -e "\n\n\033[33m[INFO] >>> ${all_ip}...\033[0m"sleep 5ssh root@${all_ip} "systemctl daemon-reload"ssh root@${all_ip} "systemctl enable redis-sentinel.service --now"ssh root@${all_ip} "systemctl restart redis-sentinel.service"ssh root@${all_ip} "systemctl status redis-sentinel.service"done
参考: 高可用之战:Redis Sentinal(哨兵模式)
确认验证
[root@redis01 ~]# redis-cli -h redis01 -p 26379 sentinel sentinels mymaster | grep 172
172.24.8.12
172.24.8.13[root@redis01 ~]# redis-cli -h redis01 -p 26379 sentinel ckquorum mymaster #确认仲裁节点
OK 3 usable Sentinels. Quorum and failover authorization can be reached
Predixy代理部署
Predixy 安装
当前predixy最后7.0.1版本,但配置改动较大,该手册继续保持最常用的1.0.5版本。
[root@predixy ~]# mkdir -p /var/log/predixy/ #创建predixy日志保存路径[root@predixy ~]# wget https://gh.linuxsb.com/https://github.com/joyieldInc/predixy/releases/download/1.0.5/predixy-1.0.5-bin-amd64-linux.tar.gz# 解压安装
[root@predixy ~]# tar xf predixy-1.0.5-bin-amd64-linux.tar.gz
[root@predixy ~]# mv predixy-1.0.5 /usr/local/predixy
Predixy 配置
- 主配置文件
[root@predixy ~]# vim /usr/local/predixy/conf/predixy.conf
#……
Bind 0.0.0.0:7617
WorkerThreads 4 # 建议设置为CPU核心数
Log /var/log/predixy/predixy.log # 日志文件
LogRotate 1d # 日志轮转
Include auth.conf # 引入认证文件
#Include try.conf # 注释引入认证配置
Include sentinel.conf # 引入后端sentinel节点配置
#……
- 认证配置文件
[root@predixy ~]# vim /usr/local/predixy/conf/auth.conf
#……
Authority {Auth "PredixyPassword!" { # 通过predixy连接进来的密码Mode admin}
}
- 后端节点配置
[root@predixy ~]# vim /usr/local/predixy/conf/sentinel.conf
SentinelServerPool {Databases 16# 数据库密码Password "StrongPassword123!" # Redis 实例的密码Hash crc16HashTag "{}" # Redis 集群使用的哈希标签Distribution modula# 读优先级(可调)MasterReadPriority 60 # 主节点读取优先级StaticSlaveReadPriority 50 # 静态从节点优先级DynamicSlaveReadPriority 50 # 动态发现从节点优先级RefreshInterval 1ServerTimeout 1ServerFailureLimit 10 # 后端失败阈值ServerRetryTimeout 1 # 后端重试间隔(毫秒)KeepAlive 120# 主从分组配置(Group 名称自定义即可),其中第一个为主节点Group shard001 {+ 172.24.8.11:26379+ 172.24.8.12:26379+ 172.24.8.13:26379}Group mymaster {}
}
predixy服务单元
通过服务单元的方式管理predixy是更推荐的方式,更符合最佳实践。
[root@redis01 ~]# cat > /usr/lib/systemd/system/predixy.service <<EOF
[Unit]
Description=Predixy Redis Proxy
After=network.target
After=network-online.target
Wants=network-online.target
Documentation=https://github.com/joyieldInc/predixy/blob/master/README_CN.md[Service]
ExecStart=/usr/local/predixy/bin/predixy /usr/local/predixy/conf/predixy.conf
Restart=always
RestartSec=5
Type=simple[Install]
WantedBy=multi-user.target
EOF
predixy服务启动
[root@predixy ~]# systemctl daemon-reload
[root@predixy ~]# systemctl enable predixy --now
[root@predixy ~]# systemctl status predixy
确认验证
状态验证
使用predixy连接redis。
[root@redis01 ~]# redis-cli -h 172.24.8.14 -p 7617
172.24.8.14:7617> AUTH PredixyPassword!
OK
172.24.8.14:7617> INFO
模拟故障
关闭redis01的服务进程。
[root@redis01 ~]# systemctl stop redis-server
观察故障后有没有实现自动切换的新master节点。
[root@redis01 ~]# redis-cli -a PredixyPassword! -h 172.24.8.14 -p 7617
172.24.8.14:7617> INFO
Server:172.24.8.13:6379
Role:master
Group:mymaster
DC:
CurrentIsFail:0
Connections:0
Connect:0
Requests:0
Responses:0
SendBytes:0
RecvBytes:0