Redis-Cluster分布式集群

##1. Redis Cluster(分布式集群) 官方推荐最少六个节点做分布式 Redis Cluster

2. Redis Cluster介绍

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

##3. 规划、搭建过程

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

###3.1 安装集群插件ruby(epel源支持)

yum install ruby rubygems -y

gem下载工具使用国内源(gem跟yum差不多,都需要源来下载软件,gem源)
gem sources -l  #查询
gem sources -a http://mirrors.aliyun.com/rubygems/   #从这里开始,gem默认是国外的源,这里给替换成国内的源,在这个因为网速的原因,可能会报错,一直来就对了。
报错展示:
[root@redis-01 /etc/yum.repos.d]# gem sources -a http://mirrors.aliyun.com/rubygems/ 
Error fetching http://mirrors.aliyun.com/rubygems/:
	no such name (http://mirrors.aliyun.com/rubygems/specs.4.8.gz)

成功展示:
[root@redis-01 /etc/yum.repos.d]# gem sources -a http://mirrors.aliyun.com/rubygems/ 
http://mirrors.aliyun.com/rubygems/ added to sources

gem sources  --remove https://rubygems.org/  #移除默认的国外源
[root@redis-01 /etc/yum.repos.d]# gem sources -l
*** CURRENT SOURCES ***

http://mirrors.aliyun.com/rubygems/
gem install redis -v 3.3.3  #安装ruby驱动,用来连接redis,下载速度和网速有关,有可能会失败,多试几次

失败展示:
[root@redis-01 /etc/yum.repos.d]# gem install redis -v 3.3.3
ERROR:  Could not find a valid gem 'redis' (= 3.3.3), here is why:
          Unable to download data from http://mirrors.aliyun.com/rubygems/ - no such name (http://mirrors.aliyun.com/rubygems/specs.4.8.gz)
ERROR:  Possible alternatives: redis

成功展示:
[root@redis-01 /etc/yum.repos.d]# gem install redis -v 3.3.3
Fetching: redis-3.3.3.gem (100%)
Successfully installed redis-3.3.3
Parsing documentation for redis-3.3.3
Installing ri documentation for redis-3.3.3
1 gem installed

###3.2 集群节点准备,生成6个集群节点配置文件

mkdir /data/700{0..5}
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  #节点宕机切换时间
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.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@redis-01 ~]# ps -ef | grep redis
root       6791      1  0 13:00 ?        00:00:42 redis-server *:6381
root       6795      1  0 13:00 ?        00:00:47 redis-server *:6382
root       6993      1  0 14:22 ?        00:00:52 redis-sentinel *:26380 [sentinel]
root       7027      1  0 14:55 ?        00:00:32 redis-server *:6380
root       7643      1  0 22:11 ?        00:00:00 redis-server *:7000 [cluster]
root       7647      1  0 22:11 ?        00:00:00 redis-server *:7001 [cluster]
root       7651      1  0 22:11 ?        00:00:00 redis-server *:7002 [cluster]
root       7653      1  0 22:11 ?        00:00:00 redis-server *:7003 [cluster]
root       7657      1  0 22:11 ?        00:00:00 redis-server *:7004 [cluster]
root       7663      1  0 22:11 ?        00:00:00 redis-server *:7005 [cluster]

###3.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

命令解释:
--replicas 1   #每个节点都会有1个副本
127.0.0.1:7000到7002是该集群的主库
127.0.0.1:703到7005是该集群的从库

命令展示:
[root@redis-01 ~]# 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
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:7000
127.0.0.1:7001
127.0.0.1:7002
Adding replica 127.0.0.1:7003 to 127.0.0.1:7000
Adding replica 127.0.0.1:7004 to 127.0.0.1:7001
Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
M: fe0af991af30aaabccb745382c697036a976c482 127.0.0.1:7000
   slots:0-5460 (5461 slots) master
M: 2bedb9c4ad3454d3e05b20a9a816b8f6924cac5b 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
M: fa7a6a14fa23fb1af5f6709a3d3a645f31c025ad 127.0.0.1:7002
   slots:10923-16383 (5461 slots) master
S: 51a630425865231afdc8abebd1a3c20eefd444c4 127.0.0.1:7003
   replicates fe0af991af30aaabccb745382c697036a976c482
S: 7af75006c62f58d6c00863fddaf6ed98cba4c7f8 127.0.0.1:7004
   replicates 2bedb9c4ad3454d3e05b20a9a816b8f6924cac5b
S: 710cf43820a1043103eb2f1b6bff1bc0e1a6630c 127.0.0.1:7005
   replicates fa7a6a14fa23fb1af5f6709a3d3a645f31c025ad
Can I set the above configuration? (type 'yes' to accept): yes   #####################注意这里 输入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 127.0.0.1:7000)
M: fe0af991af30aaabccb745382c697036a976c482 127.0.0.1:7000
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: 7af75006c62f58d6c00863fddaf6ed98cba4c7f8 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 2bedb9c4ad3454d3e05b20a9a816b8f6924cac5b
S: 710cf43820a1043103eb2f1b6bff1bc0e1a6630c 127.0.0.1:7005
   slots: (0 slots) slave
   replicates fa7a6a14fa23fb1af5f6709a3d3a645f31c025ad
M: 2bedb9c4ad3454d3e05b20a9a816b8f6924cac5b 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
S: 51a630425865231afdc8abebd1a3c20eefd444c4 127.0.0.1:7003
   slots: (0 slots) slave
   replicates fe0af991af30aaabccb745382c697036a976c482
M: fa7a6a14fa23fb1af5f6709a3d3a645f31c025ad 127.0.0.1:7002
   slots:10923-16383 (5461 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.

###3.4 集群状态查看(3主3从)

(1)集群主节点状态
[root@redis-01 ~]# redis-cli -p 7000 cluster nodes | grep master
fe0af991af30aaabccb745382c697036a976c482 127.0.0.1:7000 myself,master - 0 0 1 connected 0-5460
2bedb9c4ad3454d3e05b20a9a816b8f6924cac5b 127.0.0.1:7001 master - 0 1584022841101 2 connected 5461-10922
fa7a6a14fa23fb1af5f6709a3d3a645f31c025ad 127.0.0.1:7002 master - 0 1584022840597 3 connected 10923-16383

(2)集群从节点状态
[root@redis-01 ~]# redis-cli -p 7000 cluster nodes | grep slave
7af75006c62f58d6c00863fddaf6ed98cba4c7f8 127.0.0.1:7004 slave 2bedb9c4ad3454d3e05b20a9a816b8f6924cac5b 0 1584022863261 5 connected
710cf43820a1043103eb2f1b6bff1bc0e1a6630c 127.0.0.1:7005 slave fa7a6a14fa23fb1af5f6709a3d3a645f31c025ad 0 1584022862757 6 connected
51a630425865231afdc8abebd1a3c20eefd444c4 127.0.0.1:7003 slave fe0af991af30aaabccb745382c697036a976c482 0 1584022861751 4 connected

(3)集群主库查询信息说明
[root@redis-01 ~]# redis-cli -p 7000 cluster nodes | grep master
fe0af991af30aaabccb745382c697036a976c482  #uuid,节点在集群中的唯一标识 

127.0.0.1:7000  #节点的IP地址,端口号

 myself(myself为集群管理节点,大哥,通过集群管理节点来管理集群),master  #集群中的角色

 - 0 0 1 connected 

0-5460  #槽位号,从0开始的
2bedb9c4ad3454d3e05b20a9a816b8f6924cac5b 127.0.0.1:7001 master - 0 1584022841101 2 connected 5461-10922
fa7a6a14fa23fb1af5f6709a3d3a645f31c025ad 127.0.0.1:7002 master - 0 1584022840597 3 connected 10923-16383

##4. 添加新节点到集群中

(1)创建节点数据目录
mkdir /data/7006
mkdir /data/7007

(2)增加节点配置文件
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

(3)启动新增节点
redis-server /data/7006/redis.conf 
redis-server /data/7007/redis.conf

(4)添加新的主节点到集群(重要)
redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000

(5)重新分配槽位(重要),也就是转移slot(重新分片)
槽位计算方法:
16384除以集群节点组数,这里是4组
16384/4=4096

[root@redis-01 ~]# redis-trib.rb reshard 127.0.0.1:7000
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: fe0af991af30aaabccb745382c697036a976c482 127.0.0.1:7000
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: 7af75006c62f58d6c00863fddaf6ed98cba4c7f8 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 2bedb9c4ad3454d3e05b20a9a816b8f6924cac5b
M: a4305b6aa06b52f61c513b71fed08fb54cc63f83 127.0.0.1:7006
   slots: (0 slots) master
   0 additional replica(s)
S: 710cf43820a1043103eb2f1b6bff1bc0e1a6630c 127.0.0.1:7005
   slots: (0 slots) slave
   replicates fa7a6a14fa23fb1af5f6709a3d3a645f31c025ad
M: 2bedb9c4ad3454d3e05b20a9a816b8f6924cac5b 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
S: 51a630425865231afdc8abebd1a3c20eefd444c4 127.0.0.1:7003
   slots: (0 slots) slave
   replicates fe0af991af30aaabccb745382c697036a976c482
M: fa7a6a14fa23fb1af5f6709a3d3a645f31c025ad 127.0.0.1:7002
   slots:10923-16383 (5461 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.
How many slots do you want to move (from 1 to 16384)?4096(分配的槽位数,也就是分配多少到新的节点上)
What is the receiving node ID?a4305b6aa06b52f61c513b71fed08fb54cc63f83(接收节点的ID是多少,就是刚刚添加的新的master节点,7006)
Please enter all the source node IDs.  #请输入所有源节点id。
  Type 'all' to use all the nodes as source nodes for the hash slots.  #键入'all'将所有节点用作散列槽的源节点。
  Type 'done' once you entered all the source nodes IDs.  #输入所有源节点id后,请键入“done”
Source node #1:all  
Moving slot 12287 from fa7a6a14fa23fb1af5f6709a3d3a645f31c025ad  #省略部分内容
Do you want to proceed with the proposed reshard plan #您想继续执行提议的reshard计划吗(yes/no)? yes

(6)查看新节点槽位分配是否成功
[root@redis-01 ~]# redis-cli -p 7000 cluster nodes | grep master
a4305b6aa06b52f61c513b71fed08fb54cc63f83 127.0.0.1:7006 master - 0 1584024568498 7 connected 0-1364 5461-6826 10923-12287  #槽位分配成功,刚开始是没有槽位的
fe0af991af30aaabccb745382c697036a976c482 127.0.0.1:7000 myself,master - 0 0 1 connected 1365-5460
2bedb9c4ad3454d3e05b20a9a816b8f6924cac5b 127.0.0.1:7001 master - 0 1584024567492 2 connected 6827-10922
fa7a6a14fa23fb1af5f6709a3d3a645f31c025ad 127.0.0.1:7002 master - 0 1584024569001 3 connected 12288-16383

(7)添加一个从节点(从节点不需要槽位,因为是同步主节点的)
注意:--master-id后面写的是新增master节点7006的uuid
[root@redis-01 /data/7007]# redis-trib.rb add-node --slave --master-id a4305b6aa06b52f61c513b71fed08fb54cc63f83 127.0.0.1:7007 127.0.0.1:7000
>>> Adding node 127.0.0.1:7007 to cluster 127.0.0.1:7000
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: fe0af991af30aaabccb745382c697036a976c482 127.0.0.1:7000
   slots:1365-5460 (4096 slots) master
   1 additional replica(s)
S: 7af75006c62f58d6c00863fddaf6ed98cba4c7f8 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 2bedb9c4ad3454d3e05b20a9a816b8f6924cac5b
M: a4305b6aa06b52f61c513b71fed08fb54cc63f83 127.0.0.1:7006
   slots:0-1364,5461-6826,10923-12287 (4096 slots) master
   0 additional replica(s)
S: 710cf43820a1043103eb2f1b6bff1bc0e1a6630c 127.0.0.1:7005
   slots: (0 slots) slave
   replicates fa7a6a14fa23fb1af5f6709a3d3a645f31c025ad
M: 2bedb9c4ad3454d3e05b20a9a816b8f6924cac5b 127.0.0.1:7001
   slots:6827-10922 (4096 slots) master
   1 additional replica(s)
S: 51a630425865231afdc8abebd1a3c20eefd444c4 127.0.0.1:7003
   slots: (0 slots) slave
   replicates fe0af991af30aaabccb745382c697036a976c482
M: fa7a6a14fa23fb1af5f6709a3d3a645f31c025ad 127.0.0.1:7002
   slots:12288-16383 (4096 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.
>>> Send CLUSTER MEET to node 127.0.0.1:7007 to make it join the cluster.
Waiting for the cluster to join.
>>> Configure node as replica of 127.0.0.1:7006.

##5. 从集群中删除节点(这里删除7006)

(1)将需要删除节点slot(槽位)移动走,不移走无法删除
移动第一组槽位
[root@redis-01 /data/7007]# redis-trib.rb reshard 127.0.0.1:7000
>>> Performing Cluster Check (using node 127.0.0.1:7000)
#省略部分内容
How many slots do you want to move (from 1 to 16384)?1365#因为这里是要把被删除节点7006的槽位均匀的扣除回集群内,所以计算方法如下:
0-1364 5461-6826 10923-12287
1365      1366     1365

What is the receiving node ID?(控制节点的UUID,也就是7000)fe0af991af30aaabccb745382c697036a976c482
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1:(源节点ID,也就是7006)a4305b6aa06b52f61c513b71fed08fb54cc63f83
Source node #2:(问还有没有源节点,没有就done)done
#省略部分内容
 Moving slot 1364 from a4305b6aa06b52f61c513b71fed08fb54cc63f83
Do you want to proceed with the proposed reshard plan (yes/no)?yes

检查槽位移动情况
[root@redis-01 /data/7007]# redis-cli -p 7000 cluster nodes | grep master
#省略部分内容
a4305b6aa06b52f61c513b71fed08fb54cc63f83 127.0.0.1:7006 master - 0 1584026026182 7 connected 5461-6826 10923-12287  #现在这里就只有2组槽位了

移动第二组槽位
[root@redis-01 /data/7007]# redis-trib.rb reshard 127.0.0.1:7000
>>> Performing Cluster Check (using node 127.0.0.1:7000)
#省略部分内容
How many slots do you want to move (from 1 to 16384)?1366
What is the receiving node ID?2bedb9c4ad3454d3e05b20a9a816b8f6924cac5b(这里接收槽位的节点为第二组的主节点7001的UUID)
#省略部分内容
Source node #1:a4305b6aa06b52f61c513b71fed08fb54cc63f83(被扣除槽位的节点7006的UUID)
Source node #2:done
#省略部分内容
Do you want to proceed with the proposed reshard plan (yes/no)? yes

第二次检查槽位扣除情况
[root@redis-01 /data/7007]# redis-cli -p 7000 cluster nodes | grep master
#省略部分内容
a4305b6aa06b52f61c513b71fed08fb54cc63f83 127.0.0.1:7006 master - 0 1584026531264 7 connected 10923-12287  #还剩最后一组槽位了

移动第三组槽位
[root@redis-01 /data/7007]# redis-trib.rb reshard 127.0.0.1:7000
>>> Performing Cluster Check (using node 127.0.0.1:7000)
#省略部分内容
How many slots do you want to move (from 1 to 16384)? 1365
What is the receiving node ID?fa7a6a14fa23fb1af5f6709a3d3a645f31c025ad(这里接收槽位的节点为第三组的主节点7002的UUID)
#省略部分内容
Source node #1:a4305b6aa06b52f61c513b71fed08fb54cc63f83(7006的UUID)
Source node #2:done
#省略部分内容
Do you want to proceed with the proposed reshard plan (yes/no)? yes

第三次检查槽位扣除情况
[root@redis-01 /data/7007]# redis-cli -p 7000 cluster nodes | grep master
#省略部分内容
a4305b6aa06b52f61c513b71fed08fb54cc63f83 127.0.0.1:7006 master - 0 1584026912970 7 connected  #槽位已经全部扣除完毕

(2)删除没有槽位的主节点
[root@redis-01 /data/7007]# redis-trib.rb del-node 127.0.0.1:7006 a4305b6aa06b52f61c513b71fed08fb54cc63f83
>>> Removing node a4305b6aa06b52f61c513b71fed08fb54cc63f83 from cluster 127.0.0.1:7006
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.

删除完毕后可以查看一下节点是否被删除成功
redis-cli -p 7000 cluster nodes | grep master

(3)删除从主节点对应的从节点
[root@redis-01 /data/7007]# redis-cli -p 7000 cluster nodes | grep slave
7af75006c62f58d6c00863fddaf6ed98cba4c7f8 127.0.0.1:7004 slave 2bedb9c4ad3454d3e05b20a9a816b8f6924cac5b 0 1584027276580 9 connected
c60773e85a7a54dc54e382972e1b2cc7b78aacbb 127.0.0.1:7007 slave fa7a6a14fa23fb1af5f6709a3d3a645f31c025ad 0 1584027276580 10 connected
710cf43820a1043103eb2f1b6bff1bc0e1a6630c 127.0.0.1:7005 slave fa7a6a14fa23fb1af5f6709a3d3a645f31c025ad 0 1584027276076 10 connected
51a630425865231afdc8abebd1a3c20eefd444c4 127.0.0.1:7003 slave fe0af991af30aaabccb745382c697036a976c482 0 1584027277082 8 connected
[root@redis-01 /data/7007]# redis-trib.rb del-node 127.0.0.1:7007 c60773e85a7a54dc54e382972e1b2cc7b78aacbb
>>> Removing node c60773e85a7a54dc54e382972e1b2cc7b78aacbb from cluster 127.0.0.1:7007
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.

扩展:设置redis最大内存

---------------------
设置redis最大内存
config set maxmemory 102400000
---------------------

猜你喜欢

转载自www.cnblogs.com/xiets/p/13164616.html