一 . 群集模式
集群由多组节点(Node)组成,Redis的数据分布在这些节点中。
1 . 集群中的节点分为
主节点:只有主节点负责读写请求和集群信息的维护;
从节点:从节点只进行主节点数据和状态信息的复制。
2 . 集群的作用,可以归纳为两点:
(1)数据分区:数据分区(或称数据分片)是集群最核心的功能。 集群将数据分散到多个节点,一方面突破了Redis单机内存大小的限制,存储容量大大增加;另一方面每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力。 Redis单机内存大小受限问题,在介绍持久化和主从复制时都有提及;例如,如果单机内存太大,bgsave和bgrewriteaof的fork操作可能导致主进程阻塞,主从环境下主机切换时可能导致从节点长时间无法提供服务,全量复制阶段主节点的复制缓冲区可能溢出。
(2)高可用:集群支持主从复制和主节点的自动故障转移(与哨兵类似);当任一节点发生故障时,集群仍然可以对外提供服务。
3 . Redis集群的数据分片:
Redis集群引入了哈希槽的概念 Redis集群有16384个哈希槽(编号0-16383) 集群的每组节点负责一部分哈希槽 每个Key通过CRC16校验后对16384取余来决定放置哪个哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作
3个节点组成的集群为例:
- 节点A包含0到5460号哈希槽
- 节点B包含5461到10922号哈希槽
- 节点C包含10923到16383号哈希槽
5 . Redis集群的主从复制模型
集群中具有A、B、C三个节点,如果节点B失败了,整个集群就会因缺少5461-10922这个范围的槽而不可以用。 为每个节点添加一个从节点A1、B1、C1整个集群便有三个Master节点和三个slave节点组成,在节点B失败后,集群选举B1位为的主节点继续服务。当B和B1都失败后,集群将不可用。
二 . 搭建Redis 群集模式
redis的集群一般需要6个节点,3主3从。方便起见,这里所有节点在同一台服务器上模拟: 以端口号进行区分:3个主节点端口号:6001/6002/6003,对应的从节点端口号:6004/6005/6006。
具体操作:
1.先去我们redis文件夹下创建一个redis集群
cd /usr/local/redis/
mkdir redis-cluster
2.进入集群目录中,我们创建多实例的文件夹,做3主3从
cd redis-cluster/
mkdir redis600{1..6}
3.使用for循环把我们需要的源文件复制到我们的多实例中
for i in {1..6}
do
cp /opt/redis-7.0.9/redis.conf src/redis-server src/redis-cli /usr/local/redis/redis-cluster/redis600$i
done
cd /usr/local/redis/log/
touch redis_6001.pid
touch redis_6001.log
4.进入redi6001中修改配置文件
vim redis.conf
341:pidfile /usr/local/redis/log/redis_6001.pid
354:logfile "/usr/local/redis/log/redis_6001.log"
5.继续使用for循环把另外5个配置文件的端口号都进行修改
[root@localhost redis6001]#for i in {2..6}
> do
> \cp -f redis.conf ../redis600$i
> done
6.再使用sed将里面的端口号改为自己文件对应的端口号,注意每个文件夹的文件都需要修改
sed -i 's/6001/6002/' redis.conf
sed -n '/6002/p' redis.conf
- 启动所有redis节点
#进入各个节点文件
redis-server redis.conf
#执行命令,启动节点
ps -elf | grep redis-server
8.之后我们启动集群
redis-cli --cluster create 127.0.0.1:6001 127.0.0.1:6002 127.0.0.1:6003 127.0.0.1:6004 127.0.0.1:6005 127.0.0.1:6006 --cluster-replicas 1
测试集群
9.进入我们的6001redis服务器中查看我们的集群状态
redis-cli -p 6001 -c
# -c选项可以显示出我们数据转入的服务器
cluster nodes
cluster slots
#测试
127.0.0.1:6001> set name yhy
127.0.0.1:6001> cluster keyslot name
#查看name键的槽编号
redis-cli -p 6005 -c
127.0.0.1:6004> keys * #对应的slave节点也有这条数据,但是别的节点没有
#连接到6001节点并获取集群中的节点信息
redis-cli -p 6001 -c cluster nodes
三 扩充Cluster集群
1 再次创建集群管理目录及文件
cd /usr/local/redis/
mkdir -p redis-cluster/redis600{7..8}
#复制 Redis 配置文件和可执行文件到不同目录
for i in {7..8}
do
cp /opt/redis-7.0.9/redis.conf /usr/local/redis/redis-cluster/redis600$i
cp /opt/redis-7.0.9/src/redis-cli /opt/redis-7.0.9/src/redis-server /usr/local/redis/redis-cluster/redis600$i
done
#创建pid及日志文件
touch redis_6007.log
touch redis_6007.pid
#重复操作
2 修改配置文件并开启集群功能
cp ../redis6001/redis.conf redis.conf
#覆盖原配置文件
sed -i 's/6001/6007/' redis.conf
#修改其中端口号
sed -n '/6007/p' redis.conf
#重复操作
#修改完成后开启集群功能
./redis-server ./redis.conf
ps -ef | grep redis
3 将7-8添加如集群中
#创建一个新的主节点127.0.0.1:6007。命令里需要指定一个已有节点以便于获取集群信息,本例是指定的127.0.0.1:6001
redis-cli -p 6001 --cluster add-node 127.0.0.1:6007 127.0.0.1:6001
或
redis-cli -p 6001
cluster meet 127.0.0.1 6007
cluster meet 127.0.0.1 6008
cluster nodes
#将127.0.0.1:6008创建为127.0.0.1:6007的从节点。命令里需要指定一个已有节点以便于获取集群信息和主节点的node ID
redis-cli -p 6007 --cluster add-node 127.0.0.1:6008 127.0.0.1:6007 --cluster-slave --cluster-master-id 27b680c2a455f25b9a4192fa4bc48e496ef6c5d2
或
redis-cli -p 6008
cluster replicate 27b680c2a455f25b9a4192fa4bc48e496ef6c5d2
#新加入的主节点是没有槽数的,只有初始化集群的时候,才会根据主的数据分配好,如新增的主节点,需要手动分配
redis-cli -p 6007 --cluster reshard 127.0.0.1:6001
#从6001分配哈希槽到6007
#查看集群状态
cluster nodes