当前位置: 首页 > news >正文

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 Masterredis01172.24.8.11Redis Server
Redis01 的 Slaveredis02172.24.8.12Redis Server
Redis01 的 Slaveredis03172.24.8.13Redis Server
Predixy 代理predixy172.24.8.14Predixy 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

015

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-ipsentinel 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

016

017

模拟故障

关闭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
http://www.dtcms.com/a/342585.html

相关文章:

  • 深度卷积神经网络AlexNet
  • 【NVIDIA-B200】生产报错 Test CUDA failure common.cu:1035 ‘system not yet initialized‘
  • Docker 搭建 Gitlab 实现自动部署Vue项目
  • NW755NW776美光固态闪存NW863NX595
  • 【永洪BI】报告脚本-JavaScript使用【完整版】
  • Vue 项目中父子传值使用Vuex异步数据不更新问题
  • Postman来做API安全测试:身份验证缺陷漏洞测试
  • 药品追溯码(溯源码)采集系统(二):门诊发药后端
  • 【Linux系统】进程信号:信号的产生和保存
  • 使用EasyExcel 导出复杂的合并单元格
  • 第四届中国高校机器人实验教学创新大赛团队参赛总结
  • selenium一些进阶方法如何使用
  • 大模型0基础开发入门与实践:第11章 进阶:LangChain与外部工具调用
  • 打破传统课程模式,IP变现的创新玩法 | 创客匠人
  • 从零开始学 Selenium:浏览器驱动、元素定位与实战技巧
  • 微服务:现代软件架构的主流范式
  • Linux mmap内存映射
  • 集中式负载均衡 vs. 分布式负载均衡
  • 【赵渝强老师】Redis Cluster分布式集群
  • #千问海报大赛
  • 订单簿动力学与深度学习模型的融合大单识别与短期市场价格波动预测
  • Java多线程编程基础篇
  • 多级缓存一致性矩阵:ABP vNext 下的旁路 / 写穿 / 写回组合实战
  • Qt的moveToThread使用
  • SQL-leetcode—3451. 查找无效的 IP 地址
  • centos常用命令
  • Visual Studio Code (VS Code) 工作区配置文件的作用
  • CentOS7安装部署NexusRepository
  • 【Spring Cloud 微服务】2.守护神网关Gateway
  • 告别人工建模:AI 自动化 ETL 工具对比,数据 pipeline 搭建时间缩短 60% 的实践