Redis 安装、多实例部署、主从复制及 Cluster 实践

一、Redis 安装

1、yum 安装

系统源自带redis软件包,通过 yum 或 dnf 安装

查看 redis 软件包信息

bash 复制代码
dnf info redis

安装 redis 软件包

bash 复制代码
dnf install -y redis

设置开机启动

bash 复制代码
systemctl enable --now redis

查看端口

bash 复制代码
netstat -anp | grep redis

测试功能

2、源码编译安装

Redis 源码包官方下载链接:http://download.redis.io/releases/

获取软件包

bash 复制代码
wget https://download.redis.io/releases/redis-8.2.2.tar.gz

解压缩,查看目录结构

bash 复制代码
 tar -zxvf redis-8.2.2.tar.gz

编译环境安装

bash 复制代码
yum groupinstall -y "Development Tools"

并行编译

bash 复制代码
make -j 2 all

安装到指定路径

bash 复制代码
make PREFIX=/apps/redis install

配置环境变量

bash 复制代码
echo 'PATH=/apps/redis/bin:$PATH' >> /etc/profile
source /etc/profile

查看目录

验证结果

bash 复制代码
redis-server --version
redis-cli --version

前台运行测试

bash 复制代码
redis-server

新开窗口查看端口

客户端连接测试

3、告警优化

内核参数overcommit_memory 实现内存分配策略,可选值有三个:0、1、2。

  • 0 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则内存申请失败,并把错误返回给应用进程

  • 1 表示内核允许分配所有的物理内存,而不管当前的内存状态如何

  • 2 表示内核允许分配超过所有物理内存和交换空间总和的内存

默认值为 0,更改为 1

bash 复制代码
vm.overcommit_memory = 1

再次前台运行 redis-server,告警消除

4、创建 Redis 相关配置

创建用户 redis,并设置目录权限

bash 复制代码
useradd -r -s /sbin/nologin redis
chown -R redis.redis /apps/redis/

创建配置文件、日志、数据等目录

bash 复制代码
mkdir /apps/redis/{etc,log,data,run}

编译安装中有范例 redis 配置文件,复制并修改相关参数值

5、创建 Redis 服务

编译安装中有范例配置文件,复制并修改相关参数值

bash 复制代码
cp redis-8.2.2/utils/systemd-redis_server.service /lib/systemd/system/redis.service

服务配置文件中修改 redis 目录,添加 redis 配置文件路径,添加用户和组

bash 复制代码
[Unit]
Description=Redis data structure server
Documentation=https://redis.io/documentation
Wants=network-online.target
After=network-online.target
[Service]
ExecStart=/apps/redis/bin/redis-server /apps/redis/etc/redis.conf --supervised systemd --daemonize no
ExecStop=/bin/kill -s QUIT $MAINPID
LimitNOFILE=10032
NoNewPrivileges=yes
Type=notify
TimeoutStartSec=infinity
TimeoutStopSec=infinity
UMask=0077
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target

6、Redis 通过服务方式启动

重载服务,并启动 redis 服务,查看状态

bash 复制代码
systemctl daemon-reload
systemctl start redis
systemctl status redis

查看端口

客户端连接测试

二、Redis 多实例实践

基于之前安装的 Redis,修改配置文件,关键文件名中加上端口标识

复制并修改配置文件,每个实例对应一个配置

复制并修改服务文件,每个实例对应一个服务文件

重载服务并启动每个实例

查看端口

各实例设置密码,设置远程登录,重启 Redis

登录测试

三、Redis 主从复制部署实践

部署 1 主 2 从的 Redis 架构(主节点 6379,从节点 6380、6381),配置从节点只读,验证主从数据同步(主节点写数据,从节点查询验证)。

1、角色分配

|--------|----------|-----------|------|
| 角色 | 主机名 | ip | 端口 |
| Master | rocky-15 | 10.0.0.15 | 6379 |
| Slave1 | rocky-16 | 10.0.0.16 | 6379 |
| Slave2 | rocky-17 | 10.0.0.17 | 6379 |

2、主从命令配置

参考上文,在三台主机上部署 Redis,端口为 6379,密码为 123456。

Redis Server 默认为 Master 节点,如果要配置为 Slave 节点,需要指定 Master 服务器的IP、端口及连接密码。、

查看三个节点的 Redis,角色均为 master

在 Master 上设置 key1,值为 15-master

在 Slave上同样设置 key1,但值不同,分别为 16-slave 和 17-slave

在 Slave1上设置 Master 的 IP 和端口,并指定密码

查看角色,已经变为 slave,且指向 Master

查看值,已经同步成功

在 Slave2 上相同操作,验证数据,同步成功

在 Master 查看主从信息,可以看到有 2 个 Slave 在线

1 主 2 从配置完成。

以上命令配置可通过配置文件参数实现固化,Slave 节点相关配置参考如下

bash 复制代码
bind 0.0.0.0
masterauth "123456"
requirepass "123456"
replicaof 10.0.0.15 6379

四、Redis Sentinel 部署实践

实现 Sentinel 的前提是已经实现了 Redis 的主从复制

1、编辑 Sentinel 配置

Sentinel 实际上是一个特殊的 Redis 服务器,有些 redis 指令支持,但很多指令并不支持。默认监听在 26379/tcp 端口。哨兵服务可以和 Redis 服务器分开部署在不同主机,但为了节约成本一般会部署在一起。

编译安装在源码目录有 sentinel.conf,复制到安装目录即可,注意权限。修改相关配置,三个节点均如此配置。

注:mymaster 为 Sentinel 集群名称,auth-pass 为集群中 Master 的密码

bash 复制代码
sentinel monitor mymaster 10.0.0.15 6379 2
sentinel auth-pass mymaster 123456

2、创建 Sentinel 服务

三个节点均创建 Sentinel 服务文件

bash 复制代码
[Unit]
Description=Redis Sentinel
After=network.target

[Service]
ExecStart=/apps/redis/bin/redis-sentinel /apps/redis/etc/sentinel.conf --supervised systemd
ExecStop=/bin/kill -s QUIT $MAINPID
User=redis
Group=redis
RuntimeDirectory=redis
Mode=0755

[Install]
WantedBy=multi-user.target

3、启动 Sentinel 服务

可通过命令直接启动

bash 复制代码
/apps/redis/bin/redis-sentinel /apps/redis/etc/sentinel.conf

也可以通过上文制作的服务启动

bash 复制代码
systemctl daemon-reload
systemctl enable --now redis-sentinel.service

4、验证服务状态

查看端口

查看当前 sentinel 状态

5、故障转移测试

停止 Master 节点

查看当前 sentinel 状态

查看 Redis 配置中的 master ip 已经更换

查看 Sentinel 配置中的 master ip 已经更换

6、验证 Redis 各节点状态

查看新 Master 节点状态

查看另一个 Slave 节点状态,指向新 Master

7、恢复故障节点测试

启动原 Master 节点的 Redis

查看状态,角色更新为 slave,指向新 Master

查看新 Master 节点状态,可以看到有两个 Slave,其中一个为原 Master

Redis Sentinel 配置完成。

五、Redis Cluster 部署实践

Redis Cluster 需要至少 3 个 Master 节点才能实现,Slave 节点数量不限。Master 节点必须要超过半数以上可用,否则集群将不可用,即数据访问和选举将无法实现。因此 Master 节点的数据一般为奇数。当然一般每个 Master 都至少对应的有一个 Slave 节点。如果有三个主节点采用哈希槽 hash slot 的方式来分配 16384 个槽位,那么这三个节点可以平均分配。

本次实践采用三台机器,三主三从,每台部署一组主从。主节点端口 7000、7001、7002,从节点 7003、7004、7005。

本次实践 Redis 版本为 8.2.2,因此可以采用官方命令 redis-cli --cluster 部署。

Redis 5 以下版本需使用官方专用工具 redis-trib.rb,本次实践不再演示。

1、角色分配

|---------|----------|-----------|------|
| 角色 | 主机名 | ip | 端口 |
| Master1 | rocky-15 | 10.0.0.15 | 7000 |
| Slave1 | rocky-15 | 10.0.0.15 | 7003 |
| Master2 | rocky-16 | 10.0.0.16 | 7001 |
| Slave2 | rocky-16 | 10.0.0.16 | 7004 |
| Master3 | rocky-17 | 10.0.0.17 | 7002 |
| Slave3 | rocky-17 | 10.0.0.17 | 7005 |

2、启用 Redis Cluster 配置

所有 3 台主机都执行以下配置,每个节点两个实例(1主1从)分别修改对应的 redis 配置,必须开启 cluster 功能的参数。重点参数配置如下:

vi /apps/redis/etc/nodes-7000.conf

bash 复制代码
bind 0.0.0.0
port 7000
pidfile /apps/redis/run/redis_7000.pid
logfile "/apps/redis/log/redis_7000.log"
dir /apps/redis/data/
requirepass 123456 #所有节点,包括主从节点都一样
masterauth 123456 #所有节点,包括主从节点都一样,建议配置,否则后期的master和slave主从复制无法成功,还需再配置
cluster-enabled yes #取消此行注释,必须开启集群,开启后 redis 进程会有cluster标识
cluster-config-file nodes-7000.conf #取消此行注释,此为集群状态数据文件,记录主从关系及slot范围信息,由redis cluster 集群自动创建和维护,放在 data 目录
cluster-require-full-coverage no #默认值为yes,设为no可以防止一组主从复制节点不可用导致整个cluster不可用(显示CLUSTERDOWN The cluster is down)

每个实例生成相应的配置文件,然后按照角色分发,注意配置文件权限,属主属组为 redis

同样复制并修改服务文件,每个实例对应一个服务文件,按照角色分发,分发完后每台机器重载服务

启动 7000 实例,观察端口及服务状态,可以看到进程后面有 [cluster] 标识

开启所有实例

3、创建集群

下面命令在集群节点或任意集群外节点执行皆可,命令 redis-cli 的选项 --cluster-replicas 1 表示

每个 Master 对应一个 Slave 节点。注意:所有节点数据必须清空。

bash 复制代码
redis-cli -a 123456 --cluster create 10.0.0.15:7000 10.0.0.16:7001 10.0.0.17:7002 10.0.0.15:7003 10.0.0.16:7004 10.0.0.17:7005--cluster-replicas 1

输入 yes 自动创建集群

4、验证集群

查看主从状态

查看集群信息

查看指定 Master 节点的 Slave 节点信息,需要指定 Master ID

验证集群状态(6个节点,3套主从)

查看任意节点的集群状态

5、验证集群数据分片

写入不同 key,通过 cluster keyslot 查看 key 对应的槽位,验证数据分布

-c 集群模式写入 key1

去掉 -c 参数,更新 key1,提示 error,槽位为 9189,属于 10.0.0.16:7001,槽位不在当前 node 所以无法写入

不在槽位对应的 node,get 值也报错

查看 key1 所属的 slot

连接 10.0.0.16:7001 进行更新,提示成功

get 值也正常

6、集群扩容

查看当前集群状态

增加 Redis 新节点,需要与之前的 Redis node 版本和配置一致,然后分别再启动两台 Redis node,应为一主一从。

本次实践在 10.0.0.15 上再起两个实例,端口为 7006 和 7007

查看状态

添加新的 Master 节点到集群

bash 复制代码
redis-cli -h 10.0.0.15 -p 7000 -a 123456 --cluster add-node 10.0.0.15:7006 10.0.0.15:7000

查看节点信息,已成功加入,但此节点上没有 slot 位,也无从节点,而且新的节点是 Master

查看集群状态,节点数 +1

在新的 Master 上重新分配槽位,否则没有槽位将无法访问

bash 复制代码
redis-cli -h 10.0.0.15 -p 7000 -a 123456 --cluster reshard 10.0.0.15:7000

新分配多少个槽位=16384/master个数,此处输入4096,再输入新 Master ID

输入all,自动在所有的 redis node 选择划分,再输入 yes 确认划分

查看集群,确定 slot 分配成功

为新的 Master 指定新的 Slave 节点

bash 复制代码
redis-cli -h 10.0.0.15 -p 7000 -a 123456 --cluster add-node 10.0.0.15:7007 10.0.0.15:7000 --cluster-slave --cluster-master-id c228cc898a8a7964188e244aad959dfc9f0bccdf

查看集群状态,添加成功

可以看到有 8 个节点,4 套主从

7、集群缩容

迁移要删除的 Master 节点上面的槽位到其它 Master

bash 复制代码
redis-cli -h 10.0.0.15 -p 7000 -a 123456 --cluster reshard 10.0.0.15:7000

4096 个 slots 平均分给剩下 3 个 Master,这里输入1365,在输入迁入 slots 的 Master ID,再输入迁出 slots(即下线) 的Master ID,输入 done 确认,输入 yes 执行

同样操作将剩余 slots 迁移到其余 Master上

查看集群状态,确认下线 Master 的 slots 都完成迁移,且上面的 Slave 也自动删除,成为其它 Master 的 Slave

主从个数 -1

槽位已经迁移走,但是节点仍然还属于集群成员,因此还需从集群删除该节点

bash 复制代码
redis-cli -h 10.0.0.15 -p 7000 -a 123456 --cluster del-node 10.0.0.15:7007 4e75a4533517bb62c3f4c901cce83a851c6507d1

查看集群,节点个数 -1,完成集群缩容

相关推荐
Polaris_GQ1 小时前
Navicat连接Oracle数据库报错:12514问题
数据库
老华带你飞2 小时前
健身房|基于springboot + vue健身房管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
JIngJaneIL2 小时前
基于Java酒店预约系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot
我的offer在哪里2 小时前
MySQL 底层文件的备份与恢复(分「文本类文件」「二进制核心文件」,附全场景实操)
数据库·mysql
2301_800256114 小时前
8.2 空间查询基本组件 核心知识点总结
数据库·人工智能·算法
吃喝不愁霸王餐APP开发者4 小时前
霸王餐API文档自动化:Spring REST Docs与Asciidoctor多模块聚合
数据库·spring·自动化
默恋~微凉4 小时前
Mysql 备份与还原
数据库·mysql
研华科技Advantech5 小时前
储能AI化的数据瓶颈与破解路径:研华全栈方案实践分析
数据库·人工智能·储能·智能体
大锦终5 小时前
【MySQL】索引
数据库·mysql