redis分布式存储集群详细用法

redis-cluster集群

一、Redis集群概念

Redis集群TCP端口

每个Redis群集节点都需要打开两个TCP连接。
用于服务客户端的常规Redis TCP端口,例如6379,
再加上在数据端口上加上10000所获得的端口,集群节点通信端口

redis分布式集群存储

使用多台redis节点组合在一起,形成一个集群,便于更好的存储。
redis的集群一般为三个主节点,三个从节点,从节点充当备份。

  • 节点A包含从0到5500的哈希槽。
  • 节点B包含从5501到11000的哈希槽。
  • 节点C包含从11001到16383的哈希槽。

s集群的原理:(数据分片)

1.redis通过hash槽点来进行分配数据,总共有(0~16383)16384个槽点。
2.将这些槽点平均的分配到每台主节点上,只有有槽点的主节点才会进行工作。
3.主节点上有槽点,从节点上没有槽点。
4.当主节点宕机,那么槽点会进行迁移,迁移到从节点上,从节点变为主节点。
5.宕机得主节点修复后,恢复集群状态为从节点。

这样可以轻松添加和删除集群中的节点。
例如,如果我想添加一个新节点D,则需要将一些哈希槽从节点A,B,C移到D。类似地,如果我想从集群中删除节点A,则只需移动A所服务的哈希槽到B和C。当节点A为空时,我可以将其从群集中完全删除。

因为将哈希槽从一个节点移动到另一个节点不需要停止操作,所以添加和删除节点或更改节点持有的哈希槽的百分比不需要任何停机时间。

redis Cluster主从模型

为了保证主节点出现故障或者无法与大多数节点通信时保持可用,产生了redis Cluster主从模型,其中每个哈希槽具有 1个主节点 + N个从节点

在具有节点A,B,C的示例集群中,如果节点B失败,则集群将无法继续,因为我们不再有办法为5501-11000范围内的哈希槽提供服务。

但是,在创建集群(或稍后)时,我们向每个主节点添加一个从属节点,以便最终集群由作为主节点的A,B,C和作为从属节点的A1,B1,C1组成,如果节点B发生故障,系统将能够继续。

节点B1复制B,并且B失败,群集将把节点B1提升为新的主节点,并将继续正常运行。

但是请注意,如果节点B和B1同时失败,则Redis Cluster无法继续运行。

redis集群缓存流程
client — redis集群 ---- mysql数据库

客户端请求缓存发送到redis集群,如果集群中存有数据则直接进行反馈。
如果redis集群种没有数据,则会到mysql数据库中进行查找,回应。
数据库回应的同时会将数据放在redis中进行缓存。

二、Redis Cluster部署 3主3从集群

注意:每台主机的从节点不要与主节点放在同一台主机上,防止意外发生。交叉数据分片存放。

在这里插入图片描述

主机1:192.168.10.3
主机2:192.168.10.4

1、Redis集群配置参数

/usr/local/redis.conf

https://redis.io/topics/cluster-tutorial redis官方cluster文档

protected-mode yes
port 7000
appendonly yes		#开启持久化
appendfilename "appendonly-7000.aof"	#持久化日志文件
cluster-enabled yes	#开启集群功能
cluster-config-file nodes-7000.conf	#集群节点的配置文件
cluster-node-timeout 5000		#节点连接超时时间
#cluster-slave-validity-factor<factor>
#cluster-migration-barrier<count>
#cluster-require-full-coverage<yes/no>
#cluster-allow-reads-when-down<yes/no>

三、创建集群

安装redis

[root@localhost ~]# tar -zxvf redis-5.0.5tar.gz -C /usr/src/
[root@localhost ~]# mv /usr/src/redis-5.0.5/ /usr/local/redis
[root@localhost ~]# cd /usr/local/redis
[root@localhost ~]# make && make install

主机1,创建多实例

#保留6379.redis的主目录,创建一个新的集群目录

[root@localhost ~]# mkdir /usr/local/cluster
[root@localhost cluster]# mkdir {7000..7003}

[root@localhost cluster]# cp /usr/local/redis/redis.conf   7000/redis.conf
[root@localhost cluster]# cp /usr/local/redis/redis.conf   7001/redis.conf
[root@localhost cluster]# cp /usr/local/redis/redis.conf   7002/redis.conf

#修改配置文件内容,开启redis三个实例
[root@localhost cluster]# cat 7000/redis.conf  | grep 7000
port 7000
pidfile /var/run/redis_7000.pid
appendfilename "appendonly-7000.aof"
cluster-config-file nodes-7000.conf

[root@localhost cluster]# redis-server 7000/redis.conf 
[root@localhost cluster]# redis-server 7001/redis.conf 
[root@localhost cluster]# redis-server 7002/redis.conf

#验证是否开启了redis三个实例
[root@localhost cluster]# netstat -anpt | grep redis | awk '{print$4,$7}'
192.168.10.3:7000 14846/redis-server
192.168.10.3:7001 14851/redis-server
192.168.10.3:7002 14856/redis-server
192.168.10.3:17000 14846/redis-server
192.168.10.3:17001 14851/redis-server
192.168.10.3:17002 14856/redis-server

主机2,创建多实例

#保留6379.redis的主目录,创建一个新的集群目录

[root@localhost ~]# mkdir /usr/local/cluster
[root@localhost cluster]# mkdir {7000..7003}

[root@localhost cluster]# cp /usr/local/redis/redis.conf   7000/redis.conf
[root@localhost cluster]# cp /usr/local/redis/redis.conf   7001/redis.conf
[root@localhost cluster]# cp /usr/local/redis/redis.conf   7002/redis.conf

#修改配置文件内容,开启redis三个实例
[root@localhost cluster]# cat 7000/redis.conf  | grep 7000
port 7000
pidfile /var/run/redis_7000.pid
appendfilename "appendonly-7000.aof"
cluster-config-file nodes-7000.conf

[root@localhost cluster]# redis-server 7000/redis.conf 
[root@localhost cluster]# redis-server 7001/redis.conf 
[root@localhost cluster]# redis-server 7002/redis.conf

#验证是否开启了redis三个实例
[root@localhost cluster]# netstat -anpt | grep redis | awk '{print$4,$7}'
192.168.10.4:7000 14885/redis-server
192.168.10.4:7001 14890/redis-server
192.168.10.4:7002 14895/redis-server
192.168.10.4:17000 14885/redis-server
192.168.10.4:17001 14890/redis-server
192.168.10.4:17002 14895/redis-server

1、create 创建redis集群主节点

[root@Localhost ~]# redis-cli --cluster create
192.168.10.3:7000
192.168.10.3:7001
192.168.10.3:7002 \

>>> Performing hash slots allocation on 3 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
M: 7ce7fc34556871ddfbe7aad3b9ad2f858fbfb66f 192.168.10.3:7000
   slots:[0-5460] (5461 slots) master
M: 5b25aea28c7a2a9a3cf2d16fd08a22af6395931c 192.168.10.3:7001
   slots:[5461-10922] (5462 slots) master
M: 26223cc3f91bf4bb83af8a13a500af46134df553 192.168.10.3:7002
   slots:[10923-16383] (5461 slots) master
Can I set the above configuration? (type 'yes' to accept): yes
#确定创建集群。

2、check info 查看集群详细信息

[root@localhost cluster]# redis-cli --cluster check 192.168.10.3:7000

[root@localhost cluster]# redis-cli --cluster info 192.168.10.3:7000

[root@localhost cluster]# redis-cli -h 192.168.10.3 -p 7000 cluster nodes

3、add-node ,添加一个新的节点

1.添加一个空的主节点

[root@localhost cluster]# redis-cli --cluster add-node 192.168.10.4:7000 192.168.10.3:7000

[root@localhost cluster]# redis-cli --cluster add-node 192.168.10.4:7000 192.168.10.3:7000

在这里插入图片描述

2.添加一个空的从节点到主节点

格式:

redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000 --cluster-slave --cluster-master-id 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e

[root@localhost cluster]# redis-cli --cluster add-node 192.168.10.4:7001 192.168.10.3:7001 \ --cluster-slave --cluster-master-id 5b25aea28c7a2a9a3cf2d16fd08a22af6395931c

在这里插入图片描述

4、del-node 删除一个节点

1.删除主节点

#删除添加的空的“主节点”

格式: redis-cli --cluster del-node 127.0.0.1:7000

[root@localhost cluster]# redis-cli --cluster del-node 192.168.10.4:7000 89dff642bc5d71425dca46bf5958e252f1097afb
在这里插入图片描述

但其实并没有真正的删除干净,因为在从服务器上,node-7000的配置文件依旧存在

在这里插入图片描述

#彻底删除清空一个空的主节点,模拟其故障转移,让主节点崩溃

[root@localhost cluster]# redis-cli -h 192.168.10.4 -p 7000 debug segfault
Could not connect to Redis at 192.168.10.4:7002: Connection refused

此时才是真正将空的主节点删除干净。

2.删除从节点

格式:

redis-cli --cluster del-node 127.0.0.1:7000 <node-id>

[root@localhost cluster]# redis-cli --cluster del-node 192.168.10.4:7002 1d2eb07e2a70b892a4f177c821d0808b9a4b925f

5、reshard 重新分片,分槽

只需要指定集群中其中一个节点的地址, redis-trib 就会自动找到集群中的其他节点

格式:

redis-cli --cluster reshard

[root@localhost cluster]# redis-cli --cluster reshard 192.168.10.3:7000

#你想移动多少个槽(116384)?
How many slots do you want to move (from 1 to 16384)? "4096"

#输入想要重新分片的目标节点
What is the receiving node ID? "4c23a004a399da0bd72178dcb18dda70b4405db1"

#指定从哪些节点来移动keys到目标节点,如果是all会从其他每个master节点取出一些哈希槽进行分配
Source node #1: "all"

#确实是否要重新进行分片
Do you want to proceed with the proposed reshard plan (yes/no)? "yes"

#查看重新分槽后的集群信息

[root@localhost cluster]# redis-cli --cluster check 192.168.10.3:7000
M: 4c23a004a399da0bd72178dcb18dda70b4405db1 192.168.10.4:7002
slots:[0-1706],[5461-7167],[10923-12628] (5120 slots) master

6、将外部redis实例中的数据导入集群中去

格式:

redis-cli --cluster import 集群内部实例:port  --cluster-from 外部实例:port \
cluster-copy

[root@localhost ~]# redis-cli --cluster import 192.168.10.3:7000
–cluster-from 192.168.10.3:6379 --cluster-copy

cluster-from后面跟外部redis的ip和port
在这里插入图片描述
在这里插入图片描述

7、debug segfault 节点崩溃

一般做测试故障转移使用
格式:redis-cli -p 7000 -h 127.0.0.1 debug segfault

四、redis-cli 集群命令

redis-cli 命令
-p  指定redis放行端口
-h	指定redis放行主机
-c  以集群模式运行

--cluster:指定集群
--cluster create:创建集群
--cluster check <ip:port>:查看集群详细信息
--cluster info <ip:port>:查看集群详细信息(主节点信息)

--cluster add-node:添加节点(默认为空的主节点)
--cluster-slave:添加从节点
--cluster-master-id:添加从节点并指定主节点的UUID码

--cluster del-node:删除节点(只有从节点和空的主节点可以删除)

--cluster reshard:重新分片

import:集群内部实例
--cluster-from:外部实例
--cluster-copy:进行键值对拷贝
ster:指定集群
--cluster create:创建集群
--cluster check <ip:port>:查看集群详细信息
--cluster info <ip:port>:查看集群详细信息(主节点信息)

--cluster add-node:添加节点(默认为空的主节点)
--cluster-slave:添加从节点
--cluster-master-id:添加从节点并指定主节点的UUID码

--cluster del-node:删除节点(只有从节点和空的主节点可以删除)

--cluster reshard:重新分片

import:集群内部实例
--cluster-from:外部实例
--cluster-copy:进行键值对拷贝
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值