Redis-海量存储高并发问题:RedisCluster搭建和扩容(伪集群:4主4从)


关键词

分片集群优点:

  1. 海量数据存储:
    集群中有多个master,每个master保存不同的数据 ,数据存储上限取决于master数量
  2. 高并发写的问题:
    集群中有多个master,每个master包含多个slave,主从并发度都比较高
  3. 不需要哨兵:
    多个master之间互相ping,监测彼此的健康状态,主从切换
  4. 访问方式:
    客户端请求可以访问集群任意节点,最终都会被转发到正确节点

redis5.6扩展 redis cluster 扩容流程_redis



如图:

redis5.6扩展 redis cluster 扩容流程_分布式_02

功能:

(1)搭建Redis集群,要求三主三从
(2)能够添加一主一从(Master4和Slaver4)
(3)能够通过JedisCluster向RedisCluster添加数据和取出数据





一、RedisCluster 搭建(伪集群)

1.1 RedisCluster 集群配置 清单

节点名称

访问地址

Master1

192.168.80.77:5555

Master2

192.168.80.77:5556

Master3

192.168.80.77:5557

Slave1

192.168.80.77:5558

Slave2

192.168.80.77:5559

Slave3

192.168.80.77:5560

Master4

192.168.80.77:5561

Slave4

192.168.80.77:5562

1.2 搭建集群

下载redis-5.0.5

wget http://download.redis.io/releases/redis-5.0.5.tar.gz

redis5.6扩展 redis cluster 扩容流程_java_03

创建redis集群目录redis-cluster,存放所有redis节点

redis5.6扩展 redis cluster 扩容流程_redis5.6扩展_04

解压缩redis安装包

tar -zxvf redis-5.0.5.tar.gz

redis5.6扩展 redis cluster 扩容流程_clustering_05

cd切换到redis解压目录下,执行编译

redis5.6扩展 redis cluster 扩容流程_clustering_06

安装并指定安装目录安装redis

make install PREFIX=/opt/redis-cluster/redisMaster1

redis5.6扩展 redis cluster 扩容流程_clustering_07

从 redis 的源码目录中复制 redis.conf 到 redis 的安装目录生成的bin目录中

redis5.6扩展 redis cluster 扩容流程_redis_08

修改 redis.conf 文件,修改如下参数

# 1. 设置端口
	port 5555
	
	# 2. 将`daemonize`由`no`改为`yes`
	daemonize yes
	
	# 3. 默认绑定的是回环地址,默认不能被其他机器访问
	# bind 127.0.0.1
	
	# 4. 是否开启保护模式,由yes该为no
	protected-mode no 
	
	# 5. 开启集群模式
	cluster-enabled yes

拷贝已经安装完毕得redisMaster1,拷贝出6个redis实例(注意:端口修改)

redis5.6扩展 redis cluster 扩容流程_clustering_09

按照master和slave进行主从节点得区分

redis5.6扩展 redis cluster 扩容流程_分布式_10

修改端口

redis5.6扩展 redis cluster 扩容流程_redis5.6扩展_11

编写批处理脚本,启动所有的Redis实例:

#创建start.sh,启动所有的实例
	vi redisStart.sh

redis5.6扩展 redis cluster 扩容流程_redis5.6扩展_12

赋写脚本得执行的权限,并执行脚本,启动三主三从redis实例

redis5.6扩展 redis cluster 扩容流程_redis5.6扩展_13

node.conf中记录了所有的节点以及槽的对应关系:目前只有当前节点得信息(实例id和实例标识等信息)

redis5.6扩展 redis cluster 扩容流程_redis5.6扩展_14

创建Redis集群(创建时Redis里不要有数据)(进入任何一个redis都可以)

./redis-cli --cluster create 192.168.80.77:5555 192.168.80.77:5556 192.168.80.77:5557 
	          192.168.80.77:5558 192.168.80.77:5559 192.168.80.77:5560 --cluster-replicas 1

 	说明:--cluster-replicas 1 : 设置一主一从,前三台为主,后三天随机和主进行配对
[root@redisCluster bin]# ./redis-cli --cluster create 192.168.80.77:5555 192.168.80.77:5556 192.168.80.77:5557 192.168.80.77:5558 192.168.80.77:5559 192.168.80.77:5560 --cluster-replicas 1



	>>> 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.80.77:5559 to 192.168.80.77:5555
	Adding replica 192.168.80.77:5560 to 192.168.80.77:5556
	Adding replica 192.168.80.77:5558 to 192.168.80.77:5557
	>>> Trying to optimize slaves allocation for anti-affinity
	[WARNING] Some slaves are in the same host as their master
	M: 97bc293359e1fbaa3d37d7fc9547f95e8168a661 192.168.80.77:5555
	   slots:[0-5460] (5461 slots) master
	M: 94a7d264c4d93642dee1079203add2c7dde51742 192.168.80.77:5556
	   slots:[5461-10922] (5462 slots) master
	M: 4ea4b4d24be612e223f0fd1e2db61bd757130f4f 192.168.80.77:5557
	   slots:[10923-16383] (5461 slots) master
	S: a56b4edece031fd70347fd8677058237659ed7ae 192.168.80.77:5558
	   replicates 94a7d264c4d93642dee1079203add2c7dde51742
	S: 1d15dbd61215c9b7b29cd9917ae6c7b1cdc6684b 192.168.80.77:5559
	   replicates 4ea4b4d24be612e223f0fd1e2db61bd757130f4f
	S: bc3bf4315d5628b6ab4d9431eaada3b2448a1cd3 192.168.80.77:5560
	   replicates 97bc293359e1fbaa3d37d7fc9547f95e8168a661
	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.80.77:5555)
	M: 97bc293359e1fbaa3d37d7fc9547f95e8168a661 192.168.80.77:5555
	   slots:[0-5460] (5461 slots) master
	   1 additional replica(s)
	S: 1d15dbd61215c9b7b29cd9917ae6c7b1cdc6684b 192.168.80.77:5559
	   slots: (0 slots) slave
	   replicates 4ea4b4d24be612e223f0fd1e2db61bd757130f4f
	S: bc3bf4315d5628b6ab4d9431eaada3b2448a1cd3 192.168.80.77:5560
	   slots: (0 slots) slave
	   replicates 97bc293359e1fbaa3d37d7fc9547f95e8168a661
	M: 4ea4b4d24be612e223f0fd1e2db61bd757130f4f 192.168.80.77:5557
	   slots:[10923-16383] (5461 slots) master
	   1 additional replica(s)
	S: a56b4edece031fd70347fd8677058237659ed7ae 192.168.80.77:5558
	   slots: (0 slots) slave
	   replicates 94a7d264c4d93642dee1079203add2c7dde51742
	M: 94a7d264c4d93642dee1079203add2c7dde51742 192.168.80.77:5556
	   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.
	[root@redisCluster bin]#

查看执行日志:

55主节点,对应59从节点
	56主节点,对应60从节点
	57主节点,对应58从节点

redis5.6扩展 redis cluster 扩容流程_分布式_15

redis5.6扩展 redis cluster 扩容流程_redis_16


查看node.conf,了解所有的节点以及槽的对应关系

redis5.6扩展 redis cluster 扩容流程_分布式_17

命令客户端连接集群,并进行set/get操作

./redis-cli -h 127.0.0.1 -p 5555 -c
	注意:-c 表示是以redis集群方式进行连接

redis5.6扩展 redis cluster 扩容流程_redis5.6扩展_18


不管存储的数据在那个槽上,最终都将定位到相应的节点上去。

查看集群状态(需要先登陆)

redis5.6扩展 redis cluster 扩容流程_clustering_19


二、JedisCluster

JedisCluster是Jedis根据RedisCluster的特性提供的集群智能客户端

JedisCluster为每个节点创建连接池,并跟节点建立映射关系缓存(Cluster slots)
	JedisCluster将每个主节点负责的槽位一一与主节点连接池建立映射缓存
	JedisCluster启动时,已经知道key,slot和node之间的关系,可以找到目标节点
	JedisCluster对目标节点发送命令,目标节点直接响应给JedisCluster

如果JedisCluster与目标节点连接出错,则JedisCluster会知道连接的节点是一个错误的节点此时节点返回moved异常给JedisCluster

JedisCluster会重新初始化slot与node节点的缓存关系,然后向新的目标节点发送命令,目标命令执行命令并向JedisCluster响应

如果命令发送次数超过5次,则抛出异常"Too many cluster redirection!"

redis5.6扩展 redis cluster 扩容流程_redis_20

redis5.6扩展 redis cluster 扩容流程_分布式_21

redis5.6扩展 redis cluster 扩容流程_redis_22

demo下载地址 JedisCluster



三、扩容(添加主节点redisMaster4和redisSlave4到当前集群)

先创建redisMaster4节点 (无数据)

redis5.6扩展 redis cluster 扩容流程_redis5.6扩展_23

复制配置文件 redis.conf

redis5.6扩展 redis cluster 扩容流程_redis5.6扩展_24

修改 redis.conf 文件

# 1. 设置端口
	port 5562
	
	# 2. 将`daemonize`由`no`改为`yes`
	daemonize yes
	
	# 3. 默认绑定的是回环地址,默认不能被其他机器访问
	# bind 127.0.0.1
	
	# 4. 是否开启保护模式,由yes该为no
	protected-mode no 
	
	# 5. 开启集群模式
	cluster-enabled yes

复制从节点redisSlave4:

redis5.6扩展 redis cluster 扩容流程_java_25

启动新添加的主节点redisMaster4:

redis5.6扩展 redis cluster 扩容流程_redis_26

进入集群中的某一个主节点的客户端进行节点添加:添加新节点,并启动

./redis-cli --cluster add-node 192.168.80.77:5561  192.168.80.77:5555

redis5.6扩展 redis cluster 扩容流程_分布式_27

查看集群结点发现7007已添加到集群中

hash槽重新分配(数据迁移)
	添加完主节点需要对主节点进行hash槽分配,这样该主节才可以存储数据。
	查看集群中槽占用情况,redis集群有16384个槽,集群中的每个结点分配自已槽,通过查看集群结点可以看到槽占用情况。

redis5.6扩展 redis cluster 扩容流程_redis5.6扩展_28

给刚添加的7007结点分配槽

第一步:连接上集群(连接集群中任意一个可用结点都行)
		./redis-cli --cluster reshard 192.168.127.128:5561

	第二步:输入要分配的槽数量
		How many slots do you want to move (from 1 to 16384)? 3000
		输入:3000,表示要给目标节点分配3000个槽


	第三步:输入接收槽的结点id
		What is the receiving node ID?
		输入:50b073163bc4058e89d285dc5dfc42a0d1a222f2
		PS:这里准备给7007分配槽,通过cluster nodes查看7007结点id为:
				50b073163bc4058e89d285dc5dfc42a0d1a222f2


	第四步:输入源结点id
		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.


	第五步:输入yes开始移动槽到目标结点id
		输入:yes

redis5.6扩展 redis cluster 扩容流程_redis_29


redis5.6扩展 redis cluster 扩容流程_分布式_30


redis5.6扩展 redis cluster 扩容流程_redis5.6扩展_31

添加从节点,添加redisSlave4从结点,将redisSlave4作为redisMaster4的从结点

./redis-cli --cluster add-node 新节点的ip和端口  旧节点ip和端口 --cluster-slave --cluster-master-id 主节点id
启动新得从节点

redis5.6扩展 redis cluster 扩容流程_java_32

添加redisSlave4从结点,将redisSlave4作为redisMaster4的从结点
./redis-cli --cluster add-node 192.168.80.77:5562 192.168.80.77:5561 --cluster-slave --cluster-master-id a42ac5608328fd997732dd577029c9f91c844512

redis5.6扩展 redis cluster 扩容流程_java_33

查看:

redis5.6扩展 redis cluster 扩容流程_分布式_34

搭建完毕,后续会更新关于redis更细致得内容