Redis集群系列六 —— 分片集群搭建

Redis 常用集群中,常用的几种集群方案有:主从集群、哨兵集群、分片集群,不同的集群对应着不同的场景,并且各种集群也都有不同的优劣,本篇将以 redis 分片集群为切入点。

主从和哨兵虽然解决了高可用、高并发读的问题,但是依然有两个问题没有解决:

  • 海量数据存储问题
  • 高并发写的问题

使用分片集群可以解决上述问题。

分片集群结构

分片集群需要的节点数量较多,一个最小的分片集群至少需要6个节点(3主,3从)。要保证集群的高可用,需要每个主节点都有至少一个从节点,也就是备份节点,所以Redis集群至少需要6台服务器。如图:

分片集群特征

  • Redis 集群不支持单机版本的16个默认数据库,仅有0数据库,且select命令被禁用;
  • 每个主节点下都可能有1个或多个从节点,这些从节点在网络分区或者发生故障时会尝试替代主节点,同时从节点也可用于支撑大规模的读操作;
  • 主节点之间通过 ping 监测彼此健康状态;
  • 客户端可以访问集群中任意节点(包括从节点),节点将会分析要操作的 key,找到对应哈希槽的节点,最终都会被转发到正确节点。一般情况下从节点会将客户端请求重定向到负责对应哈希槽的主节点。如果要实现大规模读,可以给从节点开启 READONLY;
  • key 空间被划分为16384个槽位(哈希槽),集群中的每个主节点占据一部分槽位数,跨slot的两个 key 可能不能做一些操作,比如:sdiff sunion;
  • key 映射到哈希操作的算法是 hash_slot = CRC16(16)mod 16384;
  • Cluster bus: 集群节点都通过TCP连接(TCP bus)和一个二进制协议(集群连接,cluster bus)建立通信(在原客户端访问端口之上加上1000),节点之间使用 gossip 协议来发布广播消息,通知配置变更;

通过分片集群,Redis 解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,而且也具有故障迁移(主从切换)的功能,实现了较为完善的高可用方案。

搭建分片集群

建集群的第一件事情我们需要一些运行在集群模式的 Redis 实例。这意味这集群并不是由一些普通的 Redis 实例组成的,集群模式需要通过配置启用,开启集群模式后的Redis实例便可以使用集群特有的命令和特性了。

下面是一个最少选项的集群的配置文件:

port 7000

# 打开集群模式
cluster-enabled yes

# 设定节点配置文件名,保存节点配置文件的路径, 默认值为 nodes.conf;节点配置文件无须人为修改,它由 Redis 集群在启动时创建,并在有需要时自动进行更新。
cluster-config-file nodes.conf

# 设定节点心跳失联时间,超过该时间(毫秒),集群自动进行主从切换。
cluster-node-timeout 5000

# 开启 AOF
appendonly yes

搭建分片集群有两种方式,分别为:手动搭建和自动搭建两种。

手动搭建

准备实例和配置

参考上述配置,创建不同实例的 redis.conf 文件,并修改每个实例配置文件中的端口号。如图:

在当前目录下一键启动所有服务

printf '%s\n' 30001 30002 30003 30004 30005 30006 | xargs -I{} -t redis-server /etc/redis/cluster/{}.conf

一键关闭所有服务

printf '%s\n' 30001 30002 30003 30004 30005 30006 | xargs -I{} -t redis-cli -p {} shutdown

关于脚本使用说明请参考 xargs 命令

通过ps查看状态 

这个时候虽然所有节点启动了,但是目前每个服务之间都是独立的,没有任何关联,还不能称之为集群。

创建集群

需要执行命令来创建集群,在Redis5.0之前创建集群比较麻烦,5.0之后集群管理命令都集成到了redis-cli 中。

  • Redis5.0之前

Redis5.0 之前是通过使用 Redis 集群命令行工具 redis-trib 来实现,在此需要安装 ruby 环境。

# 安装依赖
yum -y install zlib ruby rubygems
gem install redis

然后通过命令来管理集群:

./redis-trib.rb create --replicas 1 127.0.0.1:30001 127.0.0.1:30002 127.0.0.1:30003 127.0.0.1:30004 127.0.0.1:30005 127.0.0.1:30006

redis-trib 文件通过向实例发送特殊命令来完成创建新集群,检查集群, 或者对集群进行重新分片(reshared)等工作

选项 --replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。

  • Redis5.0以后

Redis5.0以后就不需要安装 ruby 环境,Redis 源码的 src 文件夹中已经包含了 redis-trib 文件。

./redis-trib.rb create --replicas 1 127.0.0.1:30001 127.0.0.1:30002 127.0.0.1:30003 127.0.0.1:30004 127.0.0.1:30005 127.0.0.1:30006

或者还可以使用

./redis-cli --cluster create --cluster-replicas 1 127.0.0.1:30001 127.0.0.1:30002 127.0.0.1:30003 127.0.0.1:30004 127.0.0.1:30005 127.0.0.1:30006

命令说明:

  • redis-cli --cluster 或者 redis-trib.rb:代表集群操作命令
  • create:代表是创建集群
  • --replicas 1 或者 --cluster-replicas 1:指定集群中每个主节点的副本个数为1。计算公式:主节点的数量=节点总数÷(replicas + 1) 。因此节点列表中的前n个就是主节点,其它节点都是从节点,随机分配到不同主节点。

可以通过 redis-cli --cluster help 命令进行集群命令的查看。

执行以上命令后会出现如图:

 这里输入yes,则集群开始创建:

查看集群状态:

注意:这里一定要有 -c ,表示连接的是集群。

还可以使用以下命令:

redis-cli -p 30001 cluster nodes

通过这个命令,可以清楚的看到集群中各个实例节点的主从状态,实例ID,槽位区间等信息。详情请参考文章末
 

自动搭建

以上是手动创建集群的方法,还可以使用 create-cluster 脚本启动节点,创建集群,停止集群等操作。

找到快速搭建 create-cluster 脚本

$ cd redis/utils/create-cluste
$ ll
-rwxrwxr-x. 1 root root 2324 12月  12 2023 create-cluster #这就是快速搭建集群脚本
-rw-rw-r--. 1 root root 1347 12月  12 2023 README

 同时还提供了其他命令,在此就不一一说明了,如图:

create-cluster 脚本提供以下几个命令:

  • start :创建redis集群实例
  • create :搭建redis集群
  • stop :停止redis集群实例
  • watch :查看集群节点
  • clean :删除生成的日志,配置,数据文件
  • clean-logs :只删除日志

了解更多请阅读当前目录下的 README 文件以获取有关如何运行脚本的更多信息。

创建集群实例

运行 ./create-cluster start 命令脚本将自动创建 6 个 redis 进程实例(集群环境至少 6 个 redis 实例,3 master / 3 slave),而且自动为我们分配端口(30001-30006)

$ ./create-cluster start
Starting 30001
Starting 30002
Starting 30003
Starting 30004
Starting 30005
Starting 30006

搭建集群

运行 ./create-cluster create 命令脚本将自动搭建集群环境(分配 6 个 slot 并配置好 6 个 redis 实例的主从关系)。

redis 集群最大支持 16384 个 slots 的集群环境。为什么槽的范围是0 ~16383个呢?

Redis集群中,在握手成功后,连个节点之间会定期发送 ping/pong 消息,交换数据信息,集群中节点数量越多,消息体内容越大,比如说10个节点的状态信息约1kb,同时 redis 集群内节点,每秒都在发 ping 消息。

例如,一个总节点数为 200 的 Redis 集群,默认情况下,这时 ping/pong 消息占用带宽达到 25M。

那么如果槽位为65536,发送心跳信息的消息头达8k,发送的心跳包过于庞大,非常浪费带宽。

其次redis的集群主节点数量基本不可能超过1000个。集群节点越多,心跳包的消息体内携带的数据越多。如果节点过1000个,也会导致网络拥堵。因此redis作者,不建议redis cluster节点数量超过1000个。

那么,对于节点数在1000以内的redis cluster集群,16384个槽位够用了,可以以确保每个 master 有足够的插槽,没有必要拓展到65536个。

再者Redis主节点的配置信息中,它所负责的哈希槽是通过一张bitmap的形式来保存的,在传输过程中,会对bitmap进行压缩,但是如果bitmap的填充率slots / N很高的话(N表示节点数),也就是节点数很少,而哈希槽数量很多的话,bitmap的压缩率就很低,也会浪费资源。

所以Redis作者决定取16384个槽,作为一个比较好的设计权衡。

遇到以下提示信息,是询问你是否可以使用分配的配置,输入yes 回车即可

Can I set the above configuration? (type 'yes' to accept): yes # 输入 yes 回车即可

 

测试

使用以下命令进入

redis-cli -c -p 30001

 注意:这里一定要有 -c ,表示连接的是集群。

请求根据 key 哈希计算重定向到对应的节点上,如图:

集群下常用命令

# 查看状态
$ ./src/redis-cli -c -p 30001 info replication

# 查看当前集群信息
$ ./src/redis-cli -c -p 30001 cluster info

# 查看集群里有多少个节点
$ ./src/redis-cli -c -p 30001 cluster nodes

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旷野历程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值