1.哨兵模式的缺陷
在哨兵模式中,仍然只有一个Master节点。当并发写请求较大时,哨兵模式并不能缓解写压力。
2.Redis-cluster集群概念
(1)由多个Redis服务器组成的分布式网络服务集群;
(2)集群之中有多个Master主节点,每一个主节点都可读可写;
(3)节点之间会互相通信,两两相连;
(4)Redis集群无中心节点。
3.集群节点复制
在Redis-Cluster集群中,可以给每一个主节点添加从节点,主节点和从节点直接遵循主从模型的特性。
当用户需要处理更多读请求的时候,添加从节点可以扩展系统的读性能。
4.故障转移
Redis集群的主节点内置了类似Redis Sentinel的节点故障检测和自动故障转移功能,当集群中的某个主节点下线时,集群中的其他在线主节点会注意到这一点,并对已下线的主节点进行故障转移。
集群进行故障转移的方法和Redis Sentinel进行故障转移的方法基本一样,不同的是,在集群里面,故障转移是由集群中其他在线的主节点负责进行的,所以集群不必另外使用Redis Sentinel。
5.集群分片策略
Redis-cluster分片策略,是用来解决key存储位置的。
集群将整个数据库分为16384个槽位slot,所有key-value数据都存储在这些slot中的某一个上。一个slot槽位可以存放多个数据,key的槽位计算公式为:slot_number=crc16(key)%16384,其中crc16为16位的循环冗余校验和函数。
集群中的每个主节点都可以处理0个至16383个槽,当16384个槽都有某个节点在负责处理时,集群进入上线状态,并开始处理客户端发送的数据命令请求。
6.集群redirect转向
由于Redis集群无中心节点,请求会随机发给任意主节点;
主节点只会处理自己负责槽位的命令请求,其它槽位的命令请求,该主节点会返回客户端一个转向错误;
客户端根据错误中包含的地址和端口重新向正确的负责的主节点发起命令请求。
7.集群搭建
7.1 说明
redis5.0版本之后可以直接使用redis-cli命令创建集群,不使用redis-trib.rb命令了。
7.2 准备工作
- Redis集群最少需要6个节点,3主3从,可以分布在一台或者多台主机上。
真集群:6台主机,每台主机的redis服务使用的IP不同,端口号随意,一样不一样都可以
假集群,一台主机,redis服务使用的IP相同,端口号不同
本例子是在一台主机上创建假集群,不同的端口表示不同的redis节点,如下:
主节点:127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381
从节点:127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384
后期新加的主节点:127.0.0.1:6385
后期新家的从节点:127.0.0.1:6386
- 复制redis.conf配置到/usr/local/myredis/目录下并重命名
- 修改配置文件
port 6379 daemonize yes pidfile /var/run/redis/redis-6379.pid logfile /usr/local/redis/var/redis-6379.log dir "./" # node.conf文件保存路径 dbfilename dump-6379.rdb appendonly yes appendfsync always cluster-enabled yes cluster-config-file nodes-6379.conf
- 批量启动关闭脚本
启动脚本start_cluster.sh
#!/bin/bash
cd /usr/local/myredis/
/usr/local/redis/bin/redis-server redis-6379.conf
/usr/local/redis/bin/redis-server redis-6380.conf
/usr/local/redis/bin/redis-server redis-6381.conf
/usr/local/redis/bin/redis-server redis-6382.conf
/usr/local/redis/bin/redis-server redis-6383.conf
/usr/local/redis/bin/redis-server redis-6384.conf
关闭脚本stop_cluster.sh
pgrep redis-server | xargs -exec kill -9
启动6个服务
./start_cluster.sh
- 执行创建集群命令
# --cluster-replicas 1 表示主从配置比,1表示的是1:1,前三个是主,后三个是从
# 若配置文件中设置的密码,则还需要加上-a passwod
redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 --cluster-replicas 1
出现的错误!!!
处理方式:
删除集群的pid文件、aof文件、rdb文件、log文件,重启集群服务
连接各个集群客户端执行以下命令,再次创建集群
CLUSTER RESET
7.3集群管理
- 创建集群
redis-cli --cluster create host1:port1 ... hostN:portN --cluster-replicas <arg>
#例子
redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 --cluster-replicas 1
# 例子说明
host1:port1 ... hostN:portN表示的是要添加的集群的节点IP和端口,
--cluster-replicas <arg>表示的是主从节点比例,参数1表示前三个是主节点,后三个是从节点
也就是说6379,6380,6381端口对应的节点是主节点,6382,6383,6384对应的节点是从节点
- 查询集群节点信息
redis-cli -c -h 127.0.0.1 -p 6379 cluster nodes
- 添加新主节点
redis-cli --cluster add-node new_host:new_port existing_host:existing_port --cluster-master-id node_id
# 例子
redis-cli --cluster add-node 127.0.0.1:6385 127.0.0.1:6381 --cluster-master-id 18783e7b499b0c07227bc2b08bb9dd4f9c574528
# 例子说明
new_host:new_port为要新添加的主节点IP和端口,此处是127.0.0.1:6385
existing_host:existing_port表示的是已存在的最后一个主节点的IP和端口,这个可以从上述的节点信息中查看到,根据slots槽数,6381端口对应的节点槽数是10923-16383
,16383表示的是最后的槽数
--cluster-master-id表示的是最后一个主节点的节点id,表示的是新添加的主节点要在这个节点后面
- hash槽重新分配
添加完新节点后,需要对新添加的主节点进行hash槽重新分配,这样该主节点才能存储数据,redis共有16384个槽。
redis-cli --cluster reshard host:port --cluster-from node_id --cluster-to node_id --cluster-slots <args> --cluster-yes
# 例子
redis-cli --cluster reshard 127.0.0.1:6385 --cluster-from e406b1ea8e1ce5b8c012ae7acef20ea13981a6a0 --cluster-to ce04b81c35b890a332b005014ea66fc9bf945ccc --cluster-slots 500 --cluster-yes
# 例子说明
host:port表示的是新添加的那个主节点IP和端口,此处表示的是127.0.0.1:6385
--cluster-from node_id表示的是集群第一个主节点的节点id,这个可以现有集群的slots槽数分配看出,此处表示的是6379端口对应的节点
--cluster-to node_id表示的是集群最后一个主节点的节点id,也就是新添加的那个主节点id,此处表示的是6385端口对应的节点
--cluster-slots 500表示的是给新主节点分配多少,此处500表示是分配从0-499个slots槽数,若不加上这个会让手动输入
--cluster-yes表示的是自动应答为yes,若不加上这个会让手动输入yes,表示同意此次分配
会发现6385端口对应的主节点已经有slots槽数了,并且是从0开始的
- 添加新从节点
redis-cli --cluster add-node new_host:new_port existing_host:existing_port --cluster-slave --cluster-master-id node_id
# 例子
redis-cli --cluster add-node 127.0.0.1:8386 127.0.0.1:8385 --cluster-slave --cluster-master-id ce04b81c35b890a332b005014ea66fc9bf945ccc
# 例子说明
new_host:new_port表示的是要添加的那个从节点的IP和端口,此处表示的是127.0.0.1:8386
existing_host:existing_port表示的是要给哪个主节点添加从节点,此处表示的是127.0.0.1:8385
--cluster-slave表示的是要添加从节点,否则则是添加主节点了
--cluster-master-id node_id表示要给哪个主节点添加从节点的该主节点节点id
- 删除节点
redis-cli --cluster del-node host:port node_id
# 例子
redis-cli --cluster del-node 127.0.0.1:7008 415db07121ba946b202bca98e15cbdffc60bc18a
# 例子说明
host:port表示的是要删除的那个节点的IP和端口,此处是127.0.0.1:7008
node_id表示的是删除的那个节点的节点id