Redis-Cluster

Redis Cluster 集群

参考:https://www.cnblogs.com/kismetv/p/9853040.html
集群,即Redis Cluster,是Redis 3.0开始引入的分布式存储方案。
集群由多个节点(Node)组成,Redis的数据分布在这些节点中。集群中的节点分为主节点和从节点:只有主节点负责读写请求和集群信息的维护;从节点只进行主节点数据和状态信息的复制。
集群的作用,可以归纳为两点:

数据分区

数据分区:数据分区(或称数据分片)是集群最核心的功能。
集群将数据分散到多个节点,一方面突破了Redis单机内存大小的限制,存储容量大大增加;另一方面每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力。
Redis单机内存大小受限问题,在介绍持久化和主从复制时都有提及;例如,如果单机内存太大,bgsave和bgrewriteaof的fork操作可能导致主进程阻塞,主从环境下主机切换时可能导致从节点长时间无法提供服务,全量复制阶段主节点的复制缓冲区可能溢出……。

高可用

高可用:集群支持主从复制和主节点的自动故障转移(与哨兵类似);当任一节点发生故障时,集群仍然可以对外提供服务。

Redis集群的搭建

环境搭建

操作系统:CentOS8
Redis版本:6.0.8(Redis已经提前安装好了)
Redis安装路径:/redis
Redis配置文件名:redis-6379.conf

IP HOST Redis-Port ROLE
192.168.10.11 redis1 6379 Master
192.168.10.11 redis1 6380 Slave
192.168.10.12 redis2 6379 Master
192.168.10.12 redis2 6380 Slave
192.168.10.13 redis3 6379 Master
192.168.10.13 redis3 6380 Slave


集群的搭建有两种方式:
(1)手动执行Redis命令,一步步完成搭建;
(2)使用Ruby脚本搭建。二者搭建的原理是一样的,只是Ruby脚本将Redis命令进行了打包封装;在实际应用中推荐使用脚本方式,简单快捷不容易出错。下面分别介绍这两种方式。

执行Redis命令搭建集群

集群的搭建可以分为四步:
(1)启动节点:将节点以集群模式启动,此时节点是独立的,并没有建立联系;
(2)节点握手:让独立的节点连成一个网络;
(3)分配槽:将16384个槽分配给主节点;
(4)指定主从关系:为从节点指定主节点。
实际上,前三步完成后集群便可以对外提供服务;但指定从节点后,集群才能够提供真正高可用的服务。

(1)启动节点

集群节点的启动仍然是使用redis-server命令,但需要使用集群模式启动。下面是redis1节点的配置文件(只列出了节点正常工作关键配置,其他配置(如开启AOF)可以参照单机节点进行):

#redis-6379.conf
port 6379
cluster-enabled yes
cluster-config-file "/redis/conf/node-6379.conf"
logfile "/redis/log/redis-6379.log"
dbfilename "dump-6379.rdb"
daemonize yes

其中的cluster-enabled和cluster-config-file是与集群相关的配置。
cluster-enabled yes:Redis实例可以分为单机模式(standalone)和集群模式(cluster);cluster-enabled yes可以启动集群模式。在单机模式下启动的Redis实例,如果执行info server命令,可以发现redis_mode一项为standalone,如下图所示:

集群模式下的节点,其redis_mode为cluster,如下图所示:

cluster-config-file:该参数指定了集群配置文件的位置。每个节点在运行过程中,会维护一份集群配置文件;每当集群信息发生变化时(如增减节点),集群内所有节点会将最新信息更新到该配置文件;当节点重启后,会重新读取该配置文件,获取集群信息,可以方便的重新加入到集群中。也就是说,当Redis节点以集群模式启动时,会首先寻找是否有集群配置文件,如果有则使用文件中的配置启动,如果没有,则初始化配置并将配置保存到文件中。集群配置文件由Redis节点维护,不需要人工修改。
编辑好配置文件后,使用redis-server命令启动该节点:

redis-server redis-6379.conf

节点启动后,指定的cluster-config-file参数指定的文件自动创建

通过cluster nodes命令可以查看节点的情况,如下图所示。

其中返回值第一项表示节点id,由40个16进制字符串组成,节点id与 主从复制中提到的runId不同:Redis每次启动runId都会重新创建,但是节点id只在集群初始化时创建一次,然后保存到集群配置文件中,以后节点重新启动时会直接在集群配置文件中读取。
其他节点使用相同办法启动,不再赘述。需要特别注意,在启动节点阶段,节点是没有主从关系的,因此从节点不需要加slaveof配置。

当所有节点启动后,查看节点启动的端口

集群端口:端口号是普通端口+10000(10000是固定值,无法改变),如6379节点的集群端口为16379。集群端口只用于节点之间的通信,如搭建集群、增减节点、故障转移等操作时节点间的通信;不要使用客户端连接集群接口。为了保证集群可以正常工作,在配置防火墙时,要同时开启普通端口和集群端口。

打开集群端口的防火墙(若不打开集群端口,节点握手会失败,出现)

firewall-cmd --zone=public --add-port=16379/tcp --permanent
firewall-cmd --zone=public --add-port=16380/tcp --permanent
firewall-cmd --reload

(2)节点握手

节点启动以后是相互独立的,并不知道其他节点存在;需要进行节点握手,将独立的节点组成一个网络。
节点握手使用cluster meet {ip} {port}命令实现,例如在7000节点中执行cluster meet 192.168.10.11 6379,可以完成redis2节点和redis3节点的握手;注意ip使用的是局域网ip而不是localhost或127.0.0.1,是为了其他机器上的节点或客户端也可以访问。此时再使用cluster nodes查看:

这时候你查看被握手节点的cluster nodes可以看到,他们已经与redis1成功握手的信息。

使用cluster meet命令,将所有节点加入到集群,完成节点握手

cluster meet 192.168.10.11 6379
cluster meet 192.168.10.11 6380
cluster meet 192.168.10.12 6379
cluster meet 192.168.10.12 6380
cluster meet 192.168.10.13 6379
cluster meet 192.168.10.13 6380

执行完上述命令后,可以看到节点感知到了所有其他节点

(3)分配槽

在Redis集群中,借助槽实现数据分区。集群有16384个槽,槽是数据管理和迁移的基本单位。当数据库中的16384个槽都分配了节点时,集群处于上线状态(ok);如果有任意一个槽没有分配节点,则集群处于下线状态(fail)。
cluster info命令可以查看集群状态,分配槽之前状态为fail:

分配槽使用cluster addslots命令,执行下面的命令将槽(编号0-16383)全部分配完毕:

#redis1节点执行
redis-cli -h 192.168.10.11 -p 6379 cluster addslots {0..5461}
#redis2节点执行
redis-cli -h 192.168.10.12 -p 6379 cluster addslots {5462..10922}
#redis3节点执行
redis-cli -h 192.168.10.13 -p 6379 cluster addslots {10923..16383}


此时查看集群状态,显示所有槽分配完毕,集群进入上线状态。

(4)指定主从关系
集群中指定主从关系不再使用slaveof命令,而是使用cluster replicate命令;参数使用节点id。
通过cluster nodes获得几个主节点的节点id后,执行下面的命令为每个从节点指定主节点:

redis-cli -h 192.168.10.11 -p 6380 cluster replicate  6a1cdb3b4828ef1bcfcb905c33e1901d1940afbd
redis-cli -h 192.168.10.12 -p 6380 cluster replicate 14116b9542ad35403b20ccc3e63d3dc8073dcdae
redis-cli -h 192.168.10.13 -p 6380 cluster replicate 712685bd1a230d2386ea71bf0a304c6d5095b832

此时执行cluster nodes查看各个节点的状态,可以看到主从关系已经建立。
至此,集群搭建完毕。

使用脚本搭建集群

Redis5之前安装包目录下可以看到redis-trib.rb文件,这是一个Ruby脚本,可以实现自动化的集群搭建。
Redis5之后使用的是redis-cli cluster 命令自动化的集群搭建,使用的是C语言,不再需要安装Ruby。

Redis配置文件准备并启动

Redis配置文件配置,并启动Redis(Redis的配置与之前手动搭建一致,需要打开cluster)

#redis-6379.conf
port 6379
cluster-enabled yes
cluster-config-file "/redis/conf/node-6379.conf"
logfile "/redis/log/redis-6379.log"
dbfilename "dump-6379.rdb"
daemonize yes

Redis5之前的版本脚本搭建集群使用Ruby

(1)安装Ruby环境
以CentOS8为例,如下操作即可安装Ruby环境(

yum install ruby #安装ruby环境
gem install redis #gem是ruby的包管理工具,该命令可以安装ruby-redis依赖

(2)启动节点
与第一种方法中的“启动节点”完全相同。
(3)搭建集群
redis-trib.rb脚本提供了众多命令,其中create用于搭建集群,使用方法如下:

./redis-trib.rb create --replicas 1 192.168.10.11:6379 192.168.10.11:6380 192.168.10.12:6379 192.168.10.12:6380 192.168.10.13.6379 192.168.10.13:6380

其中:–replicas=1表示每个主节点有1个从节点;后面的多个{ip:port}表示节点地址,前面的做主节点,后面的做从节点。使用redis-trib.rb搭建集群时,要求节点不能包含任何槽和数据。
执行创建命令后,脚本会给出创建集群的计划,如下图所示;计划包括哪些是主节点,哪些是从节点,以及如何分配槽。

附:若你是5之后的版本使用Ruby脚本搭建会报如下错误,它还会提示你使用redis-cli –cluster命令创建集群的命令。

Redis5之后的版本脚本搭建集群使用C

(1)执行redis-cli –cluster create

redis-cli --cluster create 192.168.10.11:6379 192.168.10.11:6380 192.168.10.12:6379 192.168.10.12:6380 192.168.10.13:6379 192.168.10.13:6380 --cluster-replicas 1

注:–cluster-replicas参数与Ruby的–replicas参数一样

脚本创建的时候它会自动分配槽,之后它会问你是否确认这样分配

(2)查看集群信息,发现集群已经成功创建

若要在集群查询数据

只需要redis-cli连接其中一个节点即可,需要加上-c集群模式参数
以下截图我先是在别的节点插入的数据,然后使用集群模式查询它会到别的节点将数据查询过来

若使用集群模式插入数据,你会发现数据它会做负载均衡的将数据插入到别的节点

集群方案设计

设计集群方案时,至少要考虑以下因素:
(1)高可用要求:根据故障转移的原理,至少需要3个主节点才能完成故障转移,且3个主节点不应在同一台物理机上;每个主节点至少需要1个从节点,且主从节点不应在一台物理机上;因此高可用集群至少包含6个节点。
(2)数据量和访问量:估算应用需要的数据量和总访问量(考虑业务发展,留有冗余),结合每个主节点的容量和能承受的访问量(可以通过benchmark得到较准确估计),计算需要的主节点数量。
(3)节点数量限制:Redis官方给出的节点数量限制为1000,主要是考虑节点间通信带来的消耗。在实际应用中应尽量避免大集群;如果节点数量不足以满足应用对Redis数据量和访问量的要求,可以考虑:(1)业务分割,大集群分为多个小集群;(2)减少不必要的数据;(3)调整数据过期策略等。
(4)适度冗余:Redis可以在不影响集群服务的情况下增加节点,因此节点数量适当冗余即可,不用太大。

Contents
  1. 1. Redis Cluster 集群
    1. 1.0.1. 数据分区
    2. 1.0.2. 高可用
  • 2. Redis集群的搭建
    1. 2.1. 环境搭建
      1. 2.1.1. 执行Redis命令搭建集群
        1. 2.1.1.1. (1)启动节点
      2. 2.1.2. (2)节点握手
      3. 2.1.3. (3)分配槽
    2. 2.2. 使用脚本搭建集群
      1. 2.2.1. Redis配置文件准备并启动
      2. 2.2.2. Redis5之前的版本脚本搭建集群使用Ruby
      3. 2.2.3. Redis5之后的版本脚本搭建集群使用C
    3. 2.3. 若要在集群查询数据
    4. 2.4. 集群方案设计
  • |