Redis Cluster 简介与部署

一. Redis Cluster 简介

需要 3.0 及以后版本才能支持 cluster

Redis Cluster 带来的优势
  • 使用 redis cluster 安装后,数据会自动分片到多个 redis 节点(如果使用 sentinel 则需要自己实现分片算法)
  • 个别节点宕机,其他节点还能继续正常运行


Redis Cluster TCP 端口
每个Redis Cluster节点都需要打开两个TCP连接。 正常的Redis TCP端口用于为client提供服务,例如6379,加上通过向数据端口号(为client加上10000获得的端口 ),因此在该示例中为16379。10000 这个偏移量是固定的。

这两个端口都需要打开,不能被防火墙屏蔽


Redis Cluster 数据分片
Redis Cluster不使用一致性 hash,而是一种不同形式的分片( key modulo 16384),每个键在概念上都是我们称之为 hash slot 的一部分。

如果是 3 个 node:
  • node A hash slots 是 0 ~ 5500
  • node B hash slots 是 5501 ~ 11000
  • node C hash slots 是 11001 ~ 16383


Redis Cluster 配置参数(redis config):
    • cluster-enabled <yes/no>: 是否启用 cluster
    • cluster-config-file <filename>:请注意,尽管此选项的名称,这不是用户可编辑的配置文件,但是Redis Cluster节点每次发生更改时都会自动保持集群配置(基本上为状态)的文件,以便能够 在启动时重新读取它。 该文件列出了集群中的其他节点,其状态,持久变量等等。 通常,由于某些消息接收,该文件被重写并刷新在磁盘上。
    • cluster-node-timeout <milliseconds>:Redis Cluster节点不可用的最大时间,超过时间则视为失败。 如果 master 节点不可达超过指定的时间长度,则它的从站将失败。 值得注意的是,在指定时间大多数主节点不可达则每个节点将停止接受查询。
    • cluster-slave-validity-factor <factor>:如果设置为零,则从设备将始终尝试故障切换 master,而不管master和slaver之间的链路是否断开连接的时间长短。 如果值为正,则计算最大断开时间作为 node-timeout 值乘以此选项提供的因子;如果节点是slaver,则如果 master 链路断开连接,则不会尝试启动比指定的时间长的故障转移 。 例如,如果node-timeout设置为5秒,并且有效因子设置为10,则master断开连接超过50秒的slaver将不会尝试故障切换master。 请注意,任何不同于零的值都可能导致如果没有slaver能够故障切换,则master故障后Redis Cluster将不可用。 在这种情况下,只有当原始主机重新加入时,集群将继续可用
    • cluster-migration-barrier <count>: master 连接最少的 slaver 数量,slaver 迁移数据不覆盖 master 数据
    • cluster-require-full-coverage <yes/no>: 如果将此设置为是,默认情况下,如果某个百分比的key空间未被任何节点覆盖,则集群将停止接受写入。 如果选项设置为否,集群仍将提供查询,即使只能处理关于键子集的请求。


二. Redis Cluster 部署与使用
最小 cluster 需要 3 个 master,3 个 slaver。

到 redis 根目录下:
cd /home/zhuyibin/redis-3.2.8/
mkdir cluster-test
cd cluster-test/

创建 6 个节点:
mkdir 7000
mkdir 7001
mkdir 7002
mkdir 7003
mkdir 7004
mkdir 7005

分别在各个端口目录下创建  redis.conf 文件:
cd 7000/
vim redis.conf
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

port 7001
cluster-enabled yes
cluster-config-file nodes1.conf
cluster-node-timeout 5000
appendonly yes

分别启动 redis 节点:
nohup /home/zhuyibin/redis-3.2.8/src/redis-server /home/zhuyibin/redis-3.2.8/cluster-test/7000/redis.conf &
nohup /home/zhuyibin/redis-3.2.8/src/redis-server /home/zhuyibin/redis-3.2.8/cluster-test/7001/redis.conf &
nohup /home/zhuyibin/redis-3.2.8/src/redis-server /home/zhuyibin/redis-3.2.8/cluster-test/7002/redis.conf &
nohup /home/zhuyibin/redis-3.2.8/src/redis-server /home/zhuyibin/redis-3.2.8/cluster-test/7003/redis.conf &
nohup /home/zhuyibin/redis-3.2.8/src/redis-server /home/zhuyibin/redis-3.2.8/cluster-test/7004/redis.conf &
nohup /home/zhuyibin/redis-3.2.8/src/redis-server /home/zhuyibin/redis-3.2.8/cluster-test/7005/redis.conf &

现在各个节点都是独立运行的,接下来配置让各个节点相互起作用。借助  redis-trib (在src目录下) 这个工具可以方便使用,如创建新 cluster,检查或者 reshard 已存在的 cluster 等。
运行 redis-trib 需要安装:
gem install redis

然后执行:
./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 表示:每个master需要1个slaver

看到以下输出,说明配置成功:
[OK] All 16384 slots covered

测试集群环境:
./redis-cli -c -p 7000

127.0.0.1:7000> set foo bar
-> Redirected to slot [12182] located at 127.0.0.1:7002
OK
127.0.0.1:7002> set hello world
-> Redirected to slot [866] located at 127.0.0.1:7000
OK
127.0.0.1:7000>

可以看到 set 值到了不同节点,说明配置成功。



三. 运维
节点 ID 查询
redis-cli -p 7000 cluster nodes | grep myself
97a3a64667477371c4479320d683e4c8db5858b1 :0 myself,master - 0 0 0 connected 0-5460

集群 resharding
reshard:将 hash slots 从一些节点移动到另一些节点
./redis-trib.rb reshard 127.0.0.1:7000
 只要指定一个节点,redis-trib 会自动发现其他节点。

第一,需要多大的 resharding ? How many slots do you want to move (from 1 to 16384)?  我们可以选择1000
第二,redis-trib 需要知道 resharding 的目标节点ID(比如 127.0.0.1:7000 是 97a3a64667477371c4479320d683e4c8db5858b1,那么会 再分配 1000个 hash slots)
第三,需要从哪些节点获取这些 keys? 输入 all,会从其他 master 节点取一些 hash slots
第四,检查集群健康: ./redis-trib.rb check 127.0.0.1:7000。

运行完成 127.0.0.1:7000 会多一些 slots,大概在 6461 个。(默认分配 5501 个,加上 1000,难道不应该是 6501 个吗?)

在 resharding 期间,可以有正常的线上请求打过来,不会影响 resharding,如果需要,可以暂停,也可以重启服务。


手动故障转移
一般用在升级主节点的时候


增加一个新节点
(1)增加一个 master
  • 创建一个空节点,配置同上,除了端口号不同,例如端口号 7006
  • 借助 redis-trib 添加节点:./redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000(第二个参数,是随意的已存在的节点) 
  • 现在这个节点还不能存数据,因为还没分配 hash slot,接下来使用 redis reshard 使这个节点正式开始存储数据


(2)增加一个 slaver
  • 创建一个空节点,配置同上,除了端口号不同,例如端口号 7006
  • 借助 redis-trib 添加节点:./redis-trib.rb add-node --slave 127.0.0.1:7006 127.0.0.1:7000(第二个参数,是随意的已存在的节点,这里没指定加到哪个 master 下,所以会分配到少 slaver 的master 下)。或者指定 master:./redis-trib.rb add-node --slave --master-id 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 127.0.0.1:7006 127.0.0.1:7000



四. 参考内容






猜你喜欢

转载自blog.csdn.net/wenniuwuren/article/details/73800441