Redis 集群原理
- Redis 集群结构:N 个平权主节点(master),每个主节点对应 M 个从节点(slave)。
注:因为投票机制,N 须为奇数。必须要 3 个或以上的主节点,否则在创建集群时会失败,并且当存活的节点数小于总节点数的一半时,整个集群就无法提供服务了,所以正常集群至少需要6个节点。
-
Redis 集群投票机制:服务器之间通过互相的 ping-pong 判断是否节点可以连接上。如果有一半以上的节点去 ping 一个节点的时候没有回应,集群就认为这个节点宕机了。此时该主节点对应的从节点上升为主节点。当没有从节点可替补时,集群宕机。
-
本次部署简化,使用单台linux服务器用6个端口部署,3主3从节点测试redis集群环境
资源准备
ip | 端口 | 节点类型 |
---|---|---|
192.168.1.88 | 6381 | 主 |
192.168.1.88 | 6382 | 主 |
192.168.1.88 | 6383 | 主 |
192.168.1.88 | 6391 | 从 6381 |
192.168.1.88 | 6392 | 从 6382 |
192.168.1.88 | 6393 | 从 6383 |
数据库安装包download.redis.io/releases/re…
开始部署
创建目录
mkdir 6381 6382 6383
mkdir 6391 6392 6393
cd 6381
tar -zxvf redis-6.2.9.tar.gz
编译安装
make
make install PREFIX=/usr/local/redis/cluster/6381
拷贝并修改配置文件
bind 192.168.1.88
port 6381
daemonize yes
pidfile /usr/local/redis/cluster/6381/redis.pid
logfile "/usr/local/redis/cluster/6381/redis.log"
dbfilename dump6381.rdb
# RDB 持久化设置
save 900 1
save 300 10
save 60 10000
appendonly yes
appendfilename "appendonly6381.aof"
cluster-enabled yes
cluster-node-timeout 6000
cluster-config-file nodes-6381.conf
# 主节点的密码验证
masterauth feng$2024
requirepass feng$2024
# 集群配置中向其他节点广播的 IP 地址
cluster-announce-ip 192.168.1.88
# 集群配置中向其他节点广播的端口
cluster-announce-port 6381
将以上配置复制6份,修改对应端口号和
replicaof
启动节点start-cluster.sh
#!/bin/bash
./6381/bin/redis-server ./6381/redis.conf
./6382/bin/redis-server ./6382/redis.conf
./6383/bin/redis-server ./6383/redis.conf
./6391/bin/redis-server ./6391/redis.conf
./6392/bin/redis-server ./6392/redis.conf
./6393/bin/redis-server ./6393/redis.conf
查看启动情况
ps -ef | grep redis |grep -v grep
root 1309463 1 0 15:43 ? 00:00:00 ./6381/bin/redis-server 172.16.156.197:6381 [cluster]
root 1309465 1 0 15:43 ? 00:00:00 ./6382/bin/redis-server 172.16.156.197:6382 [cluster]
root 1309471 1 0 15:43 ? 00:00:00 ./6383/bin/redis-server 172.16.156.197:6383 [cluster]
root 1309481 1 0 15:43 ? 00:00:00 ./6391/bin/redis-server 172.16.156.197:6391 [cluster]
root 1309483 1 0 15:43 ? 00:00:00 ./6392/bin/redis-server 172.16.156.197:6392 [cluster]
root 1309489 1 0 15:43 ? 00:00:00 ./6393/bin/redis-server 172.16.156.197:6393 [cluster]
6台都是cluster启动成功才可以
创建集群
使用redis-cli --cluster 命令
# 设置密码
redis-cli -a feng$2024
redis-cli --cluster create 192.168.1.88:6381 192.168.1.88:6382 192.168.1.88:6383\
192.168.1.88:6391 192.168.1.88:6392 192.168.1.88:6393 \
--cluster-replicas 1 -a feng$2024
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.1.88:6392 to 192.168.1.88:6381
Adding replica 192.168.1.88:6393 to 192.168.1.88:6382
Adding replica 192.168.1.88:6391 to 192.168.1.88:6383
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 7b7b89d282fdaaa998ab9ae31cbe537d09dd7e74 192.168.1.88:6381
slots:[0-5460] (5461 slots) master
M: cf74039746ef91e0fc24a37a038da286aca11b9c 192.168.1.88:6382
slots:[5461-10922] (5462 slots) master
M: 9c1db9699978cb1227136ac5e38bb8678378c749 192.168.1.88:6383
slots:[10923-16383] (5461 slots) master
S: ba446c42379e033e277ab77ceba19d29f4beb2f3 192.168.1.88:6391
replicates cf74039746ef91e0fc24a37a038da286aca11b9c
S: bdeb3887db2b9ffa505cf70824c4253da8df203a 192.168.1.88:6392
replicates 9c1db9699978cb1227136ac5e38bb8678378c749
S: a0d401b2b4d8ae229616d537cae1e7d45b0a06bf 192.168.1.88:6393
replicates 7b7b89d282fdaaa998ab9ae31cbe537d09dd7e74
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.
>>> Performing Cluster Check (using node 192.168.1.88:6381)
M: 7b7b89d282fdaaa998ab9ae31cbe537d09dd7e74 192.168.1.88:6381
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: ba446c42379e033e277ab77ceba19d29f4beb2f3 192.168.1.88:6391
slots: (0 slots) slave
replicates cf74039746ef91e0fc24a37a038da286aca11b9c
S: a0d401b2b4d8ae229616d537cae1e7d45b0a06bf 192.168.1.88:6393
slots: (0 slots) slave
replicates 7b7b89d282fdaaa998ab9ae31cbe537d09dd7e74
M: 9c1db9699978cb1227136ac5e38bb8678378c749 192.168.1.88:6383
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: bdeb3887db2b9ffa505cf70824c4253da8df203a 192.168.1.88:6392
slots: (0 slots) slave
replicates 9c1db9699978cb1227136ac5e38bb8678378c749
M: cf74039746ef91e0fc24a37a038da286aca11b9c 192.168.1.88:6382
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
检测是否创建成功
./redis-cli -c -h 192.168.1.88 -p 6381
auth feng$2024
192.168.1.88:6381> info
# Server
redis_version:6.2.9
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:acc995961c9790c8
redis_mode:cluster
os:Linux 4.19.90-24.4.v2101.ky10.x86_64 x86_64