文章目录

  • Redis cluster分布式分片集群
  • 1. 介绍
  • 2. 高可用:
  • 3. 规划、搭建过程【测试环境】
  • 4. 集群节点管理
  • 5. 删除节点


Redis cluster分布式分片集群

RedissonClient Cluster 配置 redis cluster 16384_redis

1. 介绍

1、在多分片节点中,将16384个槽位,均匀分布到多个分片节点中
2、存数据时,将key做crc16(key),然后和16384进行取模,得出槽位值(0-16383之间)
3、根据计算得出的槽位值,找到相对应的分片节点的主节点,存储到相应槽位上
4、如果客户端当时连接的节点不是将来要存储的分片节点,分片集群会将客户端连接切换至真正存储节点进行数据存储

key :  value 
crc16(key)   ----> 22222 -----> 22222%16384 ====> 5838 ------> slot(0-16383)

2. 高可用:

在搭建集群时,会为每一个分片的主节点,对应一个从节点,实现slaveof的功能,同时当主节点down,实现类似于sentinel的自动failover的功能。

1、redis会有多组分片构成(3组)
2、redis cluster 使用固定个数的slot存储数据(一共16384slot)
3、每组分片分得1/3 slot个数(0-5500  5501-11000  11001-16383)
4、基于CRC16(key) % 16384 ====》值 (槽位号)。

3. 规划、搭建过程【测试环境】

6个redis实例,一般会放到3台硬件服务器
注:在企业规划中,一个分片的两个分到不同的物理机,防止硬件主机宕机造成的整个分片数据丢失。
端口号:7000-7005

(1) 安装集群插件
EPEL源安装ruby支持
[root@db01 ~]# yum install ruby rubygems -y

使用国内源
gem sources -l
gem sources -a http://mirrors.aliyun.com/rubygems/ 
gem sources  --remove https://rubygems.org/
gem sources -l

安装redis驱动
gem install redis -v 3.3.3


(2)集群节点准备
2.1 创建相应的目录
mkdir /data/700{0..5}

2.2 编写对应的配置文件
cat > /data/7000/redis.conf <<EOF
port 7000
daemonize yes
pidfile /data/7000/redis.pid
loglevel notice
logfile "/data/7000/redis.log"
dbfilename dump.rdb
dir /data/7000
protected-mode no
cluster-enabled yes		#开启集群功能
cluster-config-file nodes.conf		#集群配置管理
cluster-node-timeout 5000	#5秒
appendonly yes
EOF

cat >> /data/7001/redis.conf <<EOF
port 7001
daemonize yes
pidfile /data/7001/redis.pid
loglevel notice
logfile "/data/7001/redis.log"
dbfilename dump.rdb
dir /data/7001
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat >> /data/7002/redis.conf <<EOF
port 7002
daemonize yes
pidfile /data/7002/redis.pid
loglevel notice
logfile "/data/7002/redis.log"
dbfilename dump.rdb
dir /data/7002
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF


cat >>  /data/7003/redis.conf <<EOF
port 7003
daemonize yes
pidfile /data/7003/redis.pid
loglevel notice
logfile "/data/7003/redis.log"
dbfilename dump.rdb
dir /data/7003
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF


cat >> /data/7004/redis.conf <<EOF
port 7004
daemonize yes
pidfile /data/7004/redis.pid
loglevel notice
logfile "/data/7004/redis.log"
dbfilename dump.rdb
dir /data/7004
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat >> /data/7005/redis.conf <<EOF
port 7005
daemonize yes
pidfile /data/7005/redis.pid
loglevel notice
logfile "/data/7005/redis.log"
dbfilename dump.rdb
dir /data/7005
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF



(3) 启动节点:
redis-server /data/7000/redis.conf 
redis-server /data/7001/redis.conf 
redis-server /data/7002/redis.conf 
redis-server /data/7003/redis.conf 
redis-server /data/7004/redis.conf 
redis-server /data/7005/redis.conf 

检查端口
[root@db01 ~]# ps -ef |grep redis
root       8854      1  0 03:56 ?        00:00:00 redis-server *:7000 [cluster]     
root       8858      1  0 03:56 ?        00:00:00 redis-server *:7001 [cluster]     
root       8860      1  0 03:56 ?        00:00:00 redis-server *:7002 [cluster]     
root       8864      1  0 03:56 ?        00:00:00 redis-server *:7003 [cluster]     
root       8866      1  0 03:56 ?        00:00:00 redis-server *:7004 [cluster]     
root       8874      1  0 03:56 ?        00:00:00 redis-server *:7005 [cluster]
  
(4) 将节点加入集群管理
redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 \
127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
前三个是主节点 后三个是对应的从节点
敲yes
PS:搭建集群必须是空闲的节点才能够加入
生产环境建议这样规划:
1号物理机:7000 7003
2号物理机:7001 7004
3号物理机:7002 7005

(5)集群状态查看
集群主节点状态
[root@db01 ~]# redis-cli -p 7000 cluster nodes | grep master
59758edfdaecee0e88511e46993c7297b0955e69 127.0.0.1:7001 master - 0 1578574325149 9 connected 5461-10922
14c98f44ac0d627b4a00f4ec875608a7a7572a44 127.0.0.1:7000 myself,master - 0 0 8 connected 0-5460
d600d6db415fd49b23cc76bf35bf9e9d56d03c55 127.0.0.1:7002 master - 0 1578574324637 10 connected 10923-16383


集群从节点状态
[root@db01 ~]# redis-cli -p 7000 cluster nodes | grep slave
9cfd07fec036274d65ed8e9a257977ddf2772523 127.0.0.1:7004 slave 59758edfdaecee0e88511e46993c7297b0955e69 0 1578574566256 9 connected
9531b812ddf15d38394f52fcf6c4acb2b8d29acc 127.0.0.1:7003 slave 14c98f44ac0d627b4a00f4ec875608a7a7572a44 0 1578574565754 8 connected
c22870d073c7ae366234259fcd3d8620662c4558 127.0.0.1:7005 slave d600d6db415fd49b23cc76bf35bf9e9d56d03c55 0 1578574566760 10 connected
前边是从库的UUID 后边是主库的UUID

4. 集群节点管理

(1) 增加新的节点
mkdir /data/7006
mkdir /data/7007
cat > /data/7006/redis.conf <<EOF
port 7006
daemonize yes
pidfile /data/7006/redis.pid
loglevel notice
logfile "/data/7006/redis.log"
dbfilename dump.rdb
dir /data/7006
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat >  /data/7007/redis.conf <<EOF
port 7007
daemonize yes
pidfile /data/7007/redis.pid
loglevel notice
logfile "/data/7007/redis.log"
dbfilename dump.rdb
dir /data/7007
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

redis-server /data/7006/redis.conf 
redis-server /data/7007/redis.conf 


(2) 添加主节点:
redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000


(3) 转移slot(重新分片)
redis-trib.rb reshard 127.0.0.1:7000

(4) 添加一个从节点
redis-trib.rb add-node --slave --master-id 3ba9af262145817741a5c614254ec4a707018515 127.0.0.1:7007 127.0.0.1:7000
redis-trib.rb add-node --slave --master-id xxxxxxxxx 127.0.0.1:7007 127.0.0.1:7000

5. 删除节点

(1)将需要删除节点slot移动走
3ba9af262145817741a5c614254ec4a707018515 127.0.0.1:7006 
0-1364       1365
5461-6826    1366
10923-12287  1365

redis-trib.rb reshard 127.0.0.1:7000

(2)删除一个节点
删除master节点之前首先要使用reshard移除master的全部slot,然后再删除当前节点
redis-trib.rb del-node 127.0.0.1:7006 xxxxxxx