3节点部署redis集群模式
1. redis三种模式说明
1.1 单机模式
单机模式是Redis最简单的部署形式,仅包含一个Redis实例。
这种模式易于设置和管理,适用于开发、测试和小型生产环境。
单机模式的缺点是,它无法提供高可用性和水平扩展性。如果Redis实例出现故障,可能导致服务中断。
1.2 哨兵模式
哨兵模式是基于主从复制架构的,包含一个主节点和多个从节点。主节点负责读写操作,从节点负责复制主节点的数据。
Redis哨兵实例负责监控主从节点的健康状况。当主节点出现故障时,哨兵会自动将一个从节点提升为新的主节点,从而实现自动故障转移和高可用性。
哨兵模式提供了读取操作的水平扩展性,可以将读请求分发到从节点以减轻主节点的负担。但是,它不支持写操作的水平扩展。
哨兵模式比单机模式更复杂,需要配置和管理主从复制和哨兵实例。
作为开发人员需要知道的是,与单机模式不同,使用哨兵模式时要修改少量代码。
1.3 集群模式
集群模式是Redis的分布式部署方案,数据分布在多个主节点上,每个主节点都有一个或多个从节点。
集群模式提供了高可用性、读写操作的水平扩展性和数据分片功能。Redis集群通过键空间分区将数据分布在多个主节点上,每个主节点负责一部分键空间。
当某个主节点出现故障时,其对应的从节点会被提升为新的主节点,实现故障转移。
集群模式相对于单机模式和哨兵模式更复杂,需要配置和管理多个主从节点和分片策略。
作为开发人员需要知道的是,与单机模式、哨兵模式不同,使用集群模式时要修少量代代码。
在实际使用中,集群模式也较少使用,主要还是哨兵模式;集群模式设备成本、维护成本都比较高;
2. 环境说明
操作系统 | IP | 主机名 | 端口号 | 备注 |
---|---|---|---|---|
CentOS 7.9 | 192.168.3.71 | redis-01.tiga.cc | 6380 | master |
CentOS 7.9 | 192.168.3.71 | redis-01.tiga.cc | 6381 | redis-02的slave |
CentOS 7.9 | 192.168.3.72 | redis-02.tiga.cc | 6380 | master |
CentOS 7.9 | 192.168.3.72 | redis-02.tiga.cc | 6381 | redis-03的slave |
CentOS 7.9 | 192.168.3.73 | redis-03.tiga.cc | 6380 | master |
CentOS 7.9 | 192.168.3.73 | redis-03.tiga.cc | 6381 | redis-01的slave |
redis版本使用当前最新stable版本: 7.0.12
3. 部署redis集群
3.1 通过源码编译安装redis
# 准备编译环境
yum install -y wget gcc-c++
echo 'vm.overcommit_memory=1' >> /etc/sysctl.conf
sysctl -p
wget https://codeload.github.com/redis/redis/tar.gz/refs/tags/7.0.12 -O redis-7.0.12.tar.gz
tar xf redis-7.0.12.tar.gz
cd redis-7.0.12
make
make PREFIX=/opt/redis-7.0.12 install
ln -s /opt/redis-7.0.12 /opt/redis
3.2 准备redis cluster配置文件
mkdir -p /opt/redis/conf/cluster_{6380,6381}
mkdir -p /opt/redis/logs/cluster_{6380,6381}
# mkdir -p /data/redis/cluster_{6380,6381}
master节点配置文件
cat > /opt/redis/conf/cluster_6380/redis_6380.conf << EOF
port 6380
daemonize yes
logfile /opt/redis/logs/cluster_6380/redis_6380.log
pidfile /opt/redis/logs/cluster_6380/redis_6380.pid
cluster-enabled yes
cluster-config-file node_6380.conf
cluster-node-timeout 10000
rdb-save-incremental-fsync no
requirepass tiga
masterauth tiga
EOF
slave节点配置文件
cat > /opt/redis/conf/cluster_6381/redis_6381.conf << EOF
port 6381
daemonize yes
logfile /opt/redis/logs/cluster_6381/redis_6381.log
pidfile /opt/redis/logs/cluster_6381/redis_6381.pid
cluster-enabled yes
cluster-config-file node_6381.conf
cluster-node-timeout 10000
rdb-save-incremental-fsync no
requirepass tiga
masterauth tiga
EOF
3.3 启动redis
/opt/redis/bin/redis-server /opt/redis/conf/cluster_6380/redis_6380.conf
/opt/redis/bin/redis-server /opt/redis/conf/cluster_6381/redis_6381.conf
# 设置开机自启动
echo '/opt/redis/bin/redis-server /opt/redis/conf/cluster_6380/redis_6380.conf' >> /etc/rc.local
echo '/opt/redis/bin/redis-server /opt/redis/conf/cluster_6381/redis_6381.conf' >> /etc/rc.local
chmod 755 /etc/rc.local
3.4 查看redis进程与监听端口
查看redis进程
ps -ef |grep redis | grep -v grep
输出
root 16000 1 0 11:01 ? 00:00:00 /opt/redis/bin/redis-server *:6380 [cluster]
root 16011 1 0 11:02 ? 00:00:00 /opt/redis/bin/redis-server *:6381 [cluster]
查看redis监听端口
ss -nlutp|grep redis
输出
tcp LISTEN 0 511 *:16380 *:* users:(("redis-server",pid=16000,fd=9))
tcp LISTEN 0 511 *:16381 *:* users:(("redis-server",pid=16011,fd=9))
tcp LISTEN 0 511 *:6380 *:* users:(("redis-server",pid=16000,fd=6))
tcp LISTEN 0 511 *:6381 *:* users:(("redis-server",pid=16011,fd=6))
tcp LISTEN 0 511 [::]:16380 [::]:* users:(("redis-server",pid=16000,fd=10))
tcp LISTEN 0 511 [::]:16381 [::]:* users:(("redis-server",pid=16011,fd=10))
tcp LISTEN 0 511 [::]:6380 [::]:* users:(("redis-server",pid=16000,fd=7))
tcp LISTEN 0 511 [::]:6381 [::]:* users:(("redis-server",pid=16011,fd=7))
3.5 创建redis集群
只需要在任意一个节点上操作
# 在redis-01 (192.168.3.71)节点上操作
/opt/redis/bin/redis-cli --cluster create 192.168.3.71:6380 192.168.3.72:6380 192.168.3.73:6380
查看节点信息
/opt/redis/bin/redis-cli -h 192.168.3.71 -p 6380 -a tiga CLUSTER NODES
输出
e7f6c81652cb602063ae334e680e7f80781b1df4 192.168.3.72:6380@16380 master - 0 1689429074197 2 connected 5461-10922
33c11faddd22354f446e0021c4e0e8739f357660 192.168.3.71:6380@16380 myself,master - 0 1689429073000 1 connected 0-5460
17020d9a17d33c6d0a0899357a9d89962e4c0db3 192.168.3.73:6380@16380 master - 0 1689429075202 3 connected 10923-16383
3.67 配置主从关系
只需要在任意一个节点上操作
# 在redis-01 (192.168.3.71)节点上操作
/opt/redis/bin/redis-cli -h 192.168.3.71 -p 6380 -a tiga CLUSTER MEET 192.168.3.71 6381
/opt/redis/bin/redis-cli -h 192.168.3.71 -p 6380 -a tiga CLUSTER MEET 192.168.3.72 6381
/opt/redis/bin/redis-cli -h 192.168.3.71 -p 6380 -a tiga CLUSTER MEET 192.168.3.73 6381
# 最后的ID为 redis-02 的ID
/opt/redis/bin/redis-cli -h 192.168.3.71 -p 6381 -a tiga CLUSTER REPLICATE e7f6c81652cb602063ae334e680e7f80781b1df4
# 最后的ID为 redis-03 的ID
/opt/redis/bin/redis-cli -h 192.168.3.72 -p 6381 -a tiga CLUSTER REPLICATE 17020d9a17d33c6d0a0899357a9d89962e4c0db3
# 最后的ID为 redis-01 的ID
/opt/redis/bin/redis-cli -h 192.168.3.73 -p 6381 -a tiga CLUSTER REPLICATE 33c11faddd22354f446e0021c4e0e8739f357660
# 查看集群状态
/opt/redis/bin/redis-cli -h 192.168.3.71 -p 6381 -a tiga CLUSTER NODES
输出
e7f6c81652cb602063ae334e680e7f80781b1df4 192.168.3.72:6380@16380 master - 0 1689428417000 0 connected
36d42d143ee1834adc97ca9d2406aa35282b9c77 192.168.3.73:6381@16381 slave 33c11faddd22354f446e0021c4e0e8739f357660 0 1689428418607 1 connected
df23b24ca720764bceede35fffc0503244b0d9a9 192.168.3.71:6381@16381 myself,slave e7f6c81652cb602063ae334e680e7f80781b1df4 0 1689428416000 0 connected
33c11faddd22354f446e0021c4e0e8739f357660 192.168.3.71:6380@16380 master - 0 1689428417601 1 connected
17020d9a17d33c6d0a0899357a9d89962e4c0db3 192.168.3.73:6380@16380 master - 0 1689428417000 3 connected
630c05abdbfa0298079baa1d698c044ac2bb5d1e 192.168.3.72:6381@16381 slave 17020d9a17d33c6d0a0899357a9d89962e4c0db3 0 1689428417000 3 connected
3.7 验证集群是否正常使用
# 查看集群状态
/opt/redis/bin/redis-cli -h 192.168.3.71 -p 6380 -a tiga CLUSTER INFO
输出
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:912
cluster_stats_messages_pong_sent:903
cluster_stats_messages_meet_sent:15
cluster_stats_messages_sent:1830
cluster_stats_messages_ping_received:899
cluster_stats_messages_pong_received:927
cluster_stats_messages_meet_received:4
cluster_stats_messages_received:1830
total_cluster_links_buffer_limit_exceeded:0
/opt/redis/bin/redis-cli -h 192.168.3.71 -p 6380 -a tiga SET testKey testValue
/opt/redis/bin/redis-cli -h 192.168.3.73 -p 6381 -a tiga GET testKey
3.8 重置集群
只需要在任意一个节点执行
/opt/redis/bin/redis-cli -h 192.168.3.71 -p 6380 -a tiga CLUSTER RESET
/opt/redis/bin/redis-cli -h 192.168.3.72 -p 6380 -a tiga CLUSTER RESET
/opt/redis/bin/redis-cli -h 192.168.3.73 -p 6380 -a tiga CLUSTER RESET
/opt/redis/bin/redis-cli -h 192.168.3.71 -p 6381 -a tiga CLUSTER RESET
/opt/redis/bin/redis-cli -h 192.168.3.72 -p 6381 -a tiga CLUSTER RESET
/opt/redis/bin/redis-cli -h 192.168.3.73 -p 6381 -a tiga CLUSTER RESET
在所有节点上执行
/bin/rm -f /data/redis/cluster_6380/node_6380.conf
/bin/rm -f /data/redis/cluster_6381/node_6301.conf