目录
一、Redis安装部署
实验环境:基于红帽9系统搭建Redis一主两从集群架构
源码安装
[root@redis-node1 ~]# tar zxf redis-7.4.0.tar.gz
[root@redis-node1 ~]# dnf install make gcc initscripts-10.11.5-1.el9.x86_64 -y
#执行编译命令
[root@redis-node1 redis-7.4.0]# make
[root@redis-node1 redis-7.4.0]# make install
启动Redis
[root@redis-node1 utils]# vim install_server.sh
#bail if this system is managed by systemd
_pid_1_exe="$(readlink -f /proc/1/exe)"
#if [ "${_pid_1_exe##*/}" = systemd ]
#then
# echo "This systems seems to use systemd."
# echo "Please take a look at the provided example service unit files in this directory, and adapt and install them. Sorry!"
# exit 1
#fi
[root@redis-node1 utils]# ./install_server.sh
#配置redis
[root@redis-node1 utils]# vim /etc/redis/6379.conf
bind * -::*
protected-mode no #关闭protected模式
[root@redis-node1 ~]# /etc/init.d/redis_6379 restart
[root@redis-node1 utils]# redis-cli
127.0.0.1:6379>
拷贝文件至其他主机
[root@redis-node1 bin]# scp -r redis-7.4.0 root@172.25.254.20:/root
[root@redis-node1 bin]# cd /usr/local/bin/
[root@redis-node1 bin]# rsync -al * root@172.25.254.20:/usr/local/bin
二、Redis主从复制
主从同步原理:Redis 主从同步通过全量复制和增量复制机制实现数据的一致性。初次连接时,从服务器通过主服务器的 RDB 快照或 AOF 文件进行全量数据同步,之后主服务器会将增量的写操作日志异步地发送给从服务器,以保持数据实时更新。这种机制支持负载均衡和高可用性。
配置slave节点
[root@redis-node2 & 3 ~]# vim /etc/redis/6379.conf
replicaof 172.25.254.10 6379
[root@redis-node2 & 3 ~]# /etc/init.d/redis_6379 restart
三、Redis哨兵模式
1、开启Redis哨兵模式
Redis 哨兵模式通过监控 Redis 主服务器的状态,实现高可用性和自动故障转移。哨兵节点持续检查主服务器的健康状况,当主服务器发生故障时,自动选举新的主服务器并更新从服务器的配置。它还提供客户端通知和配置更新功能,确保 Redis 集群在故障情况下能够继续运行。
#编辑配置文件
[root@redis-node1 ~]# cd redis-7.4.0/
[root@redis-node1 redis-7.4.0]# cp sentinel.conf /etc/redis/
[root@redis-node1 redis-7.4.0]# vim /etc/redis/sentinel.conf
sentinel monitor mymaster 172.25.254.10 6379 2
sentinel down-after-milliseconds mymaster 10000
[root@redis-node1 redis-7.4.0]# scp /etc/redis/sentinel.conf root@172.25.254.20:/etc/redis/sentinel.conf
[root@redis-node1 redis-7.4.0]# scp /etc/redis/sentinel.conf root@172.25.254.30:/etc/redis/sentinel.conf
[root@redis-node1 redis]# cp sentinel.conf sentinel.conf.bak
#哨兵模式会更改配置文件内容,备份便于还原
开启哨兵模式
[root@redis-node1 redis-7.4.0]# redis-sentinel /etc/redis/sentinel.conf
2、Redis哨兵模式选举MASTER全过程
关闭master主机172.25.254.10,观察从机
从master主机下线到上线全过程:
初始化阶段
主节点故障检测阶段
选举master阶段
故障转移阶段
故障恢复阶段
172.25.254.20被选举为新的master
#上线故障主机172.25.254.10
[root@redis-node1 ~]# /etc/init.d/redis_6379 start
故障主机恢复后成为slave主机master为新选举的主机172.25.254.20
3、Redis哨兵模式数据丢失风险的解决方案
在生产环境的 Redis 哨兵模式中,当 master 和 slave 之间出现网络故障时,由于哨兵的作用,master 可能会被提出。网络恢复后,master 发现环境变化会将自己转变为 slave,且转变后会清除网络故障期间写入自身的数据,从而导致数据丢失。为解决这个问题,可以让 master 在被写入数据时持续连接 slave,只有当确保有两个 slave 可以写入时才允许写入数据,若 slave 数量少于两个则拒绝写入,以此方式来保障数据的完整性和一致性,避免因网络故障导致的数据丢失问题。
#在master中设定
[root@redis-node3 ~]# redis-cli
127.0.0.1:6379> CONFIG GET min-slaves-to-write
1) "min-slaves-to-write"
2) "0"
127.0.0.1:6379> CONFIG set min-slaves-to-write 2
OK
127.0.0.1:6379> CONFIG GET min-slaves-to-write
1) "min-slaves-to-write"
2) "2"
#如果要永久保存写到配置文件中/etc/redis/6379.conf
[root@redis-node3 ~]# vim /etc/redis/6379.conf
protected-mode no
min-slaves-to-write 2
四、Redis Cluster
1、Redis集群部署
Redis Cluster 是一种分布式 Redis 解决方案。它将数据自动分片存储在多个 Redis 节点上,每个节点负责一部分哈希槽。客户端可以连接到任意一个节点,该节点会将请求转发到负责相应数据的节点进行处理。节点之间通过 gossip 协议进行通信,不断交换节点状态信息,实现故障检测和自动故障转移。当某个节点出现故障时,其他节点会重新分配故障节点的哈希槽,保证集群的高可用性和数据的持续可访问性。同时,Redis Cluster 支持主从复制,每个主节点都有一个或多个从节点,用于数据备份和故障恢复。
实验环境:基于红帽9系统搭建Redis三组三从集群架构
1.每个redis node节点采用相同的硬件配置、相同的密码、相同的redis版本。
2.每个节点必须开启的参数 cluster-enabled yes #必须开启集群状态,开启后redis进程会有cluster显示 cluster-config-file nodes-6380.conf #此文件有redis cluster集群自动创建和维护,不需要任何手 动操作
3.所有redis服务器必须没有任何数据
4.先启动为单机redis且没有任何key value
RPM方式安装Redis
[root@redis-nodex redis-7.4.0]# yum install redis -y
#所有主机安装Redis
部署Redis Cluster
[root@redis-nodex ~]# vim /etc/redis/redis.conf
bind * -::*
masterauth "123456" #集群主从认证
requirepass "123456" #redis登陆密码 redis-cli 命令连接redis后要
用“auth 密码”进行认证
cluster-enabled yes #开启cluster集群功能
cluster-config-file nodes-6379.conf #指定集群配置文件
cluster-node-timeout 15000 #节点加入集群的超时时间单位是ms
[root@redis-node1 ~]# for i in 20 30 110 120 130; do scp /etc/redis/redis.conf root@172.25.254.$i:/etc/redis/redis.conf ; done
[root@redis-nodex ~]# systemctl enable --now redis
redis-cli --cluster 参数说明
[root@redis-nodex~]# redis-cli --cluster help
Cluster Manager Commands:
create host1:port1 ... hostN:portN #创建集群
--cluster-replicas <arg> #指定master的副本数
check <host:port> or <host> <port> #检测集群信息
info <host:port> or <host> <port> #查看集群信息
fix <host:port> or <host> <port> #修复集群
reshard <host:port> or <host> <port> #在线热迁移集群指定主机的slots数据
rebalance <host:port> or <host> <port> #平衡各集群主机的slot数量
add-node new_host:new_port existing_host:existing_port #添加主机
del-node host:port node_id #删除主机
import host:port #导入外部redis服务器的数据到
当前集群
redis-cli --cluster配置
[root@redis-node1 ~]# redis-cli --cluster create -a 123456 \
> 172.25.254.10:6379 172.25.254.20:6379 172.25.254.30:6379 \
> 172.25.254.110:6379 172.25.254.120:6379 172.25.254.130:6379 \
> --cluster-replicas 1
redis-cli -a 123456 --cluster info 172.25.254.10:6379
该命令用于获取 Redis Cluster 的集群信息。
redis-cli -a 123456 --cluster check 172.25.254.10:6379
此命令用于检查 Redis Cluster 的健康状态和配置。
[root@redis-node1 ~]# redis-cli -a 123456
127.0.0.1:6379> set name mlh
(error) MOVED 5798 172.25.254.20:6379
#Redis Cluster 使用哈希槽(hash slot)将数据分布在不同的节点上。当客户端向一个节点发送命令时,如果该节点确定该键对应的哈希槽不属于自己管理,它就会返回一个 “MOVED” 错误,引导客户端去正确的节点进行操作。
127.0.0.1:6379> set name mlh
OK
在哈希槽对应的节点172.25.254.20则可以写入数据
127.0.0.1:6379> get name
(error) MOVED 5798 172.25.254.20:6379
#slave设备也不能查看数据,当172.25.254.20主机出现故障时才会迁移数据到本机
2、Redis集群扩容
加入一个组从架构master172.25.254.40/slave172.25.254.140
1、加入MASTER集群
#加入master集群
[root@redis-node1 ~]# redis-cli -a 123456 --cluster add-node 172.25.254.40:6379 172.25.254.10:6379
2、分配槽位
#分配槽位
[root@redis-node1 ~]# redis-cli -a 123456 --cluster reshard 172.25.254.10:6379
3、添加slave节点
#添加slave
[root@redis-node1 ~]# redis-cli -a 123456 --cluster add-node 172.25.254.140:6379 172.25.254.10:6379 --cluster-slave --cluster-master-id a0cceb8d1d0c13a10289f4348532d16bc85b2aa0
3、Redis集群维护
Redis中集群的移除操作
注意:先转移槽位再删除主机
在 Redis 集群中先移除槽位再删除主机是为了确保集群的稳定性和数据的完整性。如果先删除主机,而该主机上仍有负责的槽位,那么这些槽位对应的数据将无法被正确访问和处理,可能导致数据丢失或集群状态混乱。而先移除槽位可以将数据的存储责任安全地转移到其他节点上,保证在删除主机时,集群中没有因该主机的突然消失而产生的数据不可用问题,从而使整个移除操作更加有序和可靠。
1、移除槽位
#移除槽位
[root@redis-node1 ~]# redis-cli -a 123456 --cluster reshard 172.25.254.10:6379
2、移除MASTER及SLAVE
#删除master及slave
[root@redis-node1 ~]# redis-cli -a 123456 --cluster del-node 172.25.254.40:6379 a0cceb8d1d0c13a10289f4348532d16bc85b2aa0
[root@redis-node1 ~]# redis-cli -a 123456 --cluster del-node 172.25.254.140:6379 0a9202c430e925760c3cd5b5415c1545b880e2ea