一、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,完成集群缩容
