redis一主一从三哨兵环境搭建和springboot集成(非docker搭建)
很早之前就想着redis搭建个主从集群,因为之前redis服务器一直是单实例模式,没有做持久化,重启服务器或者redis实例后多有不便,近日,薅得一台便宜的云服务器,于是便开始了redis从节点的搭建以及最终成为一主一从三哨兵的服务模式!
之前的服务器是centos7.8,redis6.2.6,新购入的服务器我安装了debian11系统,理由是我没用过debian系统,也准备安装redis6.2.6版本!
我的系统是新装的,所以不用做卸载历史安装的操作!
步骤 1: 更新包管理器
运行以下命令更新包管理器:
sudo apt update sudo apt upgrade -y
步骤 2: 安装依赖
安装 Redis 所需的依赖包,包括编译工具:
sudo apt install build-essential tcl -y
步骤 3: 下载 Redis 6.2.6
访问 Redis 的官方 GitHub 仓库,下载 Redis 6.2.6 的源码:
cd /usr/local/src sudo wget http://download.redis.io/releases/redis-6.2.6.tar.gz
步骤 4: 解压并编译 Redis
解压下载的压缩包并进入 Redis 目录:
sudo tar xzvf redis-6.2.6.tar.gz cd redis-6.2.6
编译 Redis:
sudo make
编译完成后,运行以下命令进行测试(可选):
sudo make test
步骤 5: 安装 Redis
安装 Redis 并将 Redis 命令添加到系统路径:
sudo make install
步骤 6: 配置 Redis
在 /etc/redis
目录下创建配置文件和服务文件:
sudo mkdir /etc/redis sudo cp redis.conf /etc/redis
编辑 Redis 配置文件 /etc/redis/redis.conf
,我修改了允许远程连接(bind)和后台进程(daemonize),增加了密码(requirepass),配置了日志路径(logfile)和日志级别(loglevel)。。。
最重要的 是配置该实例成为我旧redis实例的从节点,如下:
# 设置为从服务器
replicaof MASTER_IP 6379 masterauth yourpassword # 如果主节点有密码,设置密码
MASTER_IP是主节点的ip,我配置的是之前单实例所在服务器的ip,后面是redis服务端口号,有密码就输入!
以上配置完成,再配置一个Redis 服务,systemd管理redis
vim /etc/systemd/system/redis.service
文件中添加
[Unit]
Description=Redis In-Memory Data Store
After=network.target
[Service]
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
ExecStop=/usr/local/bin/redis-server /etc/redis/redis.conf shutdown
Restart=always
User=root
Group=root
WorkingDirectory=/var/lib/redis
[Install]
WantedBy=multi-user.target
我这里配置的是root用户,因为我是自用,root方便,如果是企业生产环境一定要配置专用用户组和用户,并且记得给日志目录和工作目录授权!!!!
接下来就可以重载systemd配置和启动redis了
sudo systemctl daemon-reload
sudo systemctl start redis
设置 Redis 在系统启动时自动启动:
systemctl enable redis
验证 Redis 是否正常运行
systemctl enable redis
到此为止,Redis 6.2.6 已经安装并作为从节点成功启动在 Debian 11 上。此时已经同步了主节点的数据!
接下来配置哨兵(sentinel),我的想法是debian服务器上配置两个sentinel实例,旧服务器上配置一个sentinel实例,为什么要这样呢?因为我只有两台服务器!!!!而且我目前还不想用docker做这个集群!(因为是第一次弄哨兵,所以先从原生的来,这个弄好了再惦记docker部署)!
我先去旧服务器配置和启动第一个sentinel:
vim /etc/redis/sentinel.conf
然后编写配置
port 26379
dir "/var/lib/redis/sentinel"
#Sentinel会监控名称为 mymaster 的主节点,主节点的 IP 地址为 主节点ip,端口为 6379,2 表示至少需要 2 个 Sentinel 确认主节点不可用,才能执行故障转移。
sentinel monitor mymaster 主节点ip 6379 2
#设置主节点的认证密码。如果主节点需要密码才能访问,Sentinel 也需要提供相同的密码来验证与主节点的连接。
sentinel auth-pass mymaster 123456789
#配置 Sentinel 认为主节点不可用的阈值。这里的 5000 表示如果主节点在 5000 毫秒(即 5 秒)内没有响应,Sentinel 将认为主节点是下线的,并开始进行故障转移操作。
sentinel down-after-milliseconds mymaster 5000
#配置故障转移的超时时间。这里的 60000 表示,如果故障转移过程中,Sentinel 在 60 秒内没有完成主节点的切换操作,将认为故障转移失败。
sentinel failover-timeout mymaster 60000
# Sentinel 向其他 Sentinel 通告自己的 IP 和端口, 使用你的公网 IP 和端口
sentinel announce-ip "你的ip"
sentinel announce-port 26379
# 日志文件
logfile "/var/log/sentinel/26379.log"
# 日志级别
loglevel notice
# 设置 Sentinel 监听的 IP 地址。0.0.0.0 表示接受所有 IP 地址的连接,即允许任何主机连接到该 Sentinel 实例。对于生产环境,建议仅绑定到特定的 IP 地址,避免外部不必要的连接。通常会配置为 bind 127.0.0.1(只接受本地连接)或绑定到私有 IP。
bind 0.0.0.0
保存,然后退出编辑器,将sentinel服务加入systemd管理
vim /etc/systemd/system/redis-sentinel.service
加入如下配置
[Unit]
Description=Redis Sentinel
After=network.target
[Service]
ExecStart=/usr/local/bin/redis-sentinel /etc/redis/sentinel.conf
User=root
Group=root
Restart=always
[Install]
WantedBy=multi-user.target
这里我依然是使用的root用户,生产环境注意用户和权限问题!!!切记!
#重载systemd配置 systemctl daemon-reload #启动sentinel
systemctl start redis-sentinel #开机自启
systemctl enable redis-sentinel #查看
systemctl status redis-sentinel
终端输出如下
[root@VM-4-4-centos system]# systemctl status redis-sentinel
● redis-sentinel.service - Redis Sentinel
Loaded: loaded (/etc/systemd/system/redi-sentinel.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2024-11-05 03:55:56 CST; 12h ago
Main PID: 17029 (redis-sentinel)
Tasks: 5
Memory: 6.5M
CGroup: /system.slice/redis-sentinel.service
└─17029 /usr/local/bin/redis-sentinel 0.0.0.0:26379 [sentinel]
Nov 05 03:55:56 VM-4-4-centos systemd[1]: Started Redis Sentinel.ci
至此,第一个sentinel实例部署完成!
第二个和第三个sentinel实例我在debian服务器上部署,配置和第一个基本相同,用了不同端口号,分别启动。
在对应端口号服务终端输入如下命令
redis-cli -p 26379 SENTINEL masters
这个命令用于查看 Redis Sentinel 监控的所有主节点的信息。它返回的是当前由 Redis Sentinel 监控的主节点(master
)及其相关状态。
下面是我的输出:
[root@VM-4-4-centos system]# redis-cli -p 26379 SENTINEL masters
1) 1) "name" 监控的主节点的名称。
2) "mymaster"
3) "ip" 主节点的 IP 地址。
4) "redis的主节点的ip"
5) "port"
6) "6379"
7) "runid" Redis 主节点的唯一标识符(runid),用于区分不同的 Redis 实例。
8) "a1181f9603d292fbaebbfa8c28121ebf817cb7d1"
9) "flags" 表示当前节点的角色是 master,即这是主节点。
10) "master"
11) "link-pending-commands" Redis Sentinel 正在等待的命令数。
12) "0"
13) "link-refcount" 当前 Redis Sentinel 与主节点的连接计数。
14) "1"
15) "last-ping-sent" 上次向主节点发送 PING 命令的时间。
16) "0"
17) "last-ok-ping-reply"上次接收到来自主节点的正确响应的时间戳。
18) "638"
19) "last-ping-reply" 上次接收到来自主节点的响应的时间戳。
20) "638"
21) "down-after-milliseconds" Sentinel 认为主节点不可用的时间阈值,单位是毫秒。这里表示,若主节点 5 秒钟未响应,则 Sentinel 认为它已下线。
22) "5000"
23) "info-refresh" Sentinel 刷新该主节点信息的时间间隔。
24) "1657"
25) "role-reported" 当前主节点的角色,仍然是 "master"。
26) "master"
27) "role-reported-time" 记录上次报告该角色的时间戳。
28) "33199385"
29) "config-epoch" 当前 Sentinel 配置的 Epoch(版本号)。该值增加表明 Sentinel 配置发生了变化(例如,发生了故障转移)。
30) "1"
31) "num-slaves" 当前主节点拥有 1 个从节点。
32) "1"
33) "num-other-sentinels" 监控该主节点的其他 Sentinel 节点数。值: 2,表示有两个 Sentinel 节点在监控该主节点。
34) "2"
35) "quorum" 断主节点是否宕机的 Sentinel 节点的最小数目。值: 2,表示必须有至少 2 个 Sentinel 节点同意认为主节点宕机。
36) "2"
至此,一主一从三哨兵配置完成!接下来结合实际项目配置,未完待续。。。。。。。。。。。。。。。。。。。。。。。。
第一坑:
如果redis都配置了密码,主节点挂掉后故障转移提升某个从节点变成主节点后,需要在该挂掉后重启的从节点的配置文件中显示的配置密码!!!!!
# Generated by CONFIG REWRITE
masterauth 新的主节点的密码!!! 所以生产环境还是老实的内网通信不要密码吧!!!!
- 本文标签: Linux Java redis
- 本文链接: https://www.wangwenzhi.top/article/28
- 版权声明: 本文由王开心原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权