redis集群设计方案及原理(4)

使用redis-server命令启动该节点:
  redis-server redis-7000.conf
(2)节点握手
  节点启动以后是相互独立的,并不知道其他节点存在;需要进行节点握手,将独立的节点组成一个网络。
  节点握手使用cluster meet {ip} {port}命令实现
  例如在7000节点中执行cluster meet 192.168.72.128 7001,可以完成7000节点和7001节点的握手;注意ip使用的是局域网ip而不是localhost或127.0.0.1,
是为了其他机器上的节点或客户端也可以访问
同理,在7000节点中使用cluster meet命令,可以将所有节点加入到集群,完成节点握手:
  1 cluster meet 192.168.72.128 7002
  2 cluster meet 192.168.72.128 8000
  3 cluster meet 192.168.72.128 8001
  4 cluster meet 192.168.72.128 8002
(3)分配槽
  在Redis集群中,借助槽实现数据分区,具体原理后文会介绍。集群有16384个槽,槽是数据管理和迁移的基本单位。当数据库中的16384个槽都分配了节点时,集群处于上线状态(ok);如果有任意一个槽没有分配节点,则集群处于下线状态(fail)。
分配槽使用cluster addslots命令,执行下面的命令将槽(编号0-16383)全部分配完毕:
  1 redis-cli -p 7000 cluster addslots {0..5461}
  2 redis-cli -p 7001 cluster addslots {5462..10922}
  3 redis-cli -p 7002 cluster addslots {10923..16383}
(4)指定主从关系
集群中指定主从关系不再使用slaveof命令,而是使用cluster replicate命令;参数使用节点id。
通过cluster nodes获得几个主节点的节点id后,执行下面的命令为每个从节点指定主节点:
  1 redis-cli -p 8000 cluster replicate be816eba968bc16c884b963d768c945e86ac51ae
  2 redis-cli -p 8001 cluster replicate 788b361563acb175ce8232569347812a12f1fdb4
  3 redis-cli -p 8002 cluster replicate a26f1624a3da3e5197dde267de683d61bb2dcbf1

第二种搭建: 脚本
  使用Ruby脚本搭建集群
  在{REDIS_HOME}/src目录下可以看到redis-trib.rb文件,这是一个Ruby脚本,可以实现自动化的集群搭建。
  (1)安装Ruby环境
  以Ubuntu为例,如下操作即可安装Ruby环境:
  1 apt-get install ruby #安装ruby环境
  2 gem install redis #gem是ruby的包管理工具,该命令可以安装ruby-redis依赖
  (2)启动节点
  与第一种方法中的“启动节点”完全相同。
  (3)搭建集群
  redis-trib.rb脚本提供了众多命令,其中create用于搭建集群,使用方法如下

  ./redis-trib.rb create --replicas 1 192.168.72.128:7000 192.168.72.128:7001 192.168.72.128:7002 192.168.72.128:8000 192.168.72.128:8001 192.168.72.128:8002

  其中:--replicas=1表示每个主节点有1个从节点;后面的多个{ip:port}表示节点地址,前面的做主节点,后面的做从节点。使用redis-trib.rb搭建集群时,要求节点不能包含任何槽和数据。

  执行创建命令后,脚本会给出创建集群的计划;计划包括哪些是主节点,哪些是从节点,以及如何分配槽

集群扩展:

1. 集群伸缩
  实践中常常需要对集群进行伸缩,如访问量增大时的扩容操作。Redis集群可以在不影响对外服务的情况下实现伸缩;伸缩的核心是槽迁移:修改槽与节点的对应关系,实现槽(即数据)在节点之间的移动。例如,如果槽均匀分布在集群的3个节点中,此时增加一个节点,则需要从3个节点中分别拿出一部分槽给新节点,从而实现槽在4个节点中的均匀分布。
  增加节点、
  假设要增加7003和8003节点,其中8003是7003的从节点;步骤如下:
  (1)启动节点:方法参见集群搭建
  (2)节点握手:可以使用cluster meet命令,但在生产环境中建议使用redis-trib.rb的add-node工具,其原理也是cluster meet,但它会先检查新节点是否已加入其它集群或者存在数据,避免加入到集群后带来混乱。
  1 redis-trib.rb add-node 192.168.72.128:7003 192.168.72.128 7000
  2 redis-trib.rb add-node 192.168.72.128:8003 192.168.72.128 7000
  (3)迁移槽:推荐使用redis-trib.rb的reshard工具实现。reshard自动化程度很高,只需要输入redis-trib.rb reshard ip:port (ip和port可以是集群中的任一节点),然后按照提示输入以下信息,槽迁移会自动完成:
    ○ 待迁移的槽数量:16384个槽均分给4个节点,每个节点4096个槽,因此待迁移槽数量为4096
    ○ 目标节点id:7003节点的id
    ○ 源节点的id:7000/7001/7002节点的id
  (4)指定主从关系:方法参见集群搭建
  减少节点、
  假设要下线7000/8000节点,可以分为两步:
  (1)迁移槽:使用reshard将7000节点中的槽均匀迁移到7001/7002/7003节点
  (2)下线节点:使用redis-trib.rb del-node工具;应先下线从节点再下线主节点,因为若主节点先下线,从节点会被指向其他主节点,造成不必要的全量复制。
  1 redis-trib.rb del-node 192.168.72.128:7001 {节点8000的id}
  2 redis-trib.rb del-node 192.168.72.128:7001 {节点7000的id}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/7e638e829d6ad2ef449d91f1060c1a36.html