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

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

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

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

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

分片集群结构

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

Redis集群系列六 —— 分片集群搭建_第1张图片

分片集群特征

  • 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 文件,并修改每个实例配置文件中的端口号。如图:

Redis集群系列六 —— 分片集群搭建_第2张图片

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

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 命令进行集群命令的查看。

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

Redis集群系列六 —— 分片集群搭建_第3张图片

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

Redis集群系列六 —— 分片集群搭建_第4张图片

查看集群状态:

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

还可以使用以下命令:

redis-cli -p 30001 cluster nodes

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

自动搭建

以上是手动创建集群的方法,还可以使用 create-cluster 脚本启动节点,创建集群,停止集群等操作,文件在 Redis 安装目录下的 utils/create-cluster/ 中。

它是一个简单的 bash 脚本,可以根据需要修改端口、集群实例等,默认是 6 节点集群。只需键入以下命令:

# 启动实例
create-cluster start

# 创建集群
create-cluster create

# 停止集群
create-cluster stop

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

Redis集群系列六 —— 分片集群搭建_第5张图片

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

测试

使用以下命令进入

redis-cli -c -p 30001

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

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

Redis集群系列六 —— 分片集群搭建_第6张图片

集群下常用命令

# 查看状态
info replication

# 查看当前集群信息
cluster info

# 查看集群里有多少个节点
cluster nodes

你可能感兴趣的:(#,Redis,redis,分片,集群)