企业级Redis开发运维从入门到实践 (31)— Redis Cluster(集群)的搭建集群、基本架构、原生命令安装、官方工具安装

单机架构和分布式架构对比
  • 单机架构

在这里插入图片描述

  • 分布式架构
    在这里插入图片描述
Redis Cluster架构
  • 节点:每个节点需要开启配置cluster-enabled yes,让Redis运行在集群模式下,节点数量至少为6个才能保证组成完整高可用的集群
  • meet(节点握手):节点通过Gossip协议彼此通信,达到感知对方的过程,即所有节点共享消息
    在这里插入图片描述
  • 指派槽:每个key会映射为一个固定的槽,只有当节点分配了槽,才能响应和这些槽关联的键命令,通过 cluster addslots命令为节点分配槽
    在这里插入图片描述
Redis Cluster特性
  • 主从复制
  • 高可用
  • 分片
Redis Cluster的安装配置
原生命令安装
原生命令安装 - 架构理解
  • 配置开启节点
  • meet
  • 指派槽
  • 主从
配置节点

节点配置注意事项

  • 配置至少6个节点以保证完整高可用的集群;
  • 每个节点需要开启配置cluster-enabled yes,让Redis运行在集群模式下;
  • 集群内所有节点统一目录,一般划分三个目录:conf、data、log,分别存放配置、数据和日志相关文件。

配置节点的具体步骤:

  1. 节点配置
    6个节点配置统一放在conf目录下,配置文件命名规则redis-{port}.conf,集群相关配置如下:
# 节点端口
port 6379
# 开启集群模式
cluster-enabled yes
# 节点超时时间,单位毫秒
cluster-node-timeout 15000
# 集群内部配置文件
cluster-config-file "node-6379.conf"
  1. 启动所有节点
redis-server conf/redis-6379.conf
redis-server conf/redis-6380.conf
redis-server conf/redis-6381.conf
redis-server conf/redis-6382.conf
redis-server conf/redis-6383.conf
redis-server conf/redis-6384.conf
  1. 检查节点日志是否正确,日志内容如下:6379节点启动成功
cat log/redis-6379.log 
* No cluster configuration found, I'm cfb28ef1deee4e0fa78da86abe5d24566744411e 
# Server started, Redis version 3.0.7 
* The server is now ready to accept connections on port 6379
  1. 集群配置文件:
    1. 第一次启动时如果没有集群配置文件,它会自动创建一份;
    2. 文件名称采用cluster-config-file参数项控制,建议采用node-{port}.conf格式定义,通过使用端口号区分不同节点,防止同一机器下多个节点彼此覆盖,造成集群信息异常。
    3. 如果启动时存在集群配置文件,节点会使用配置文件内容初始化集群信息。
      在这里插入图片描述
    4. Redis自动维护集群配置文件不要手动修改,防止节点重启时产生集群信息错乱),当集群内节点信息发生变化,如添加节点、节点下线、故障转移等,节点会自动保存集群状态到配置文件中。如节点6379首次启动后生成集群配置如下:
    #cat data/nodes-6379.conf 
    cfb28ef1deee4e0fa78da86abe5d24566744411e 127.0.0.1:6379 myself,master - 0 0 0 
    connected vars currentEpoch 0 lastVoteEpoch 0
    
    1. 节点ID:它是一个40位 16进制字符串,用于唯一标识集群内一个节点,之后很多集群操作都要借助于节点ID来完成。节点ID不同于运行ID。节点ID在集群初始化时只创建一次,节点重启时会加载集群配置文件进行重用,而Redis的运行ID每次重启都会变化。在节点6380执行cluster nodes命令获取集群节点状态:
    127.0.0.1:6380>cluster nodes 
    8e41673d59c9568aa9d29fb174ce733345b3e8f1 127.0.0.1:6380 myself,master - 0 0 0 c
    

每个节点目前只能识别出自己的节点信息。我们启动6个节点,但每个节点彼此并不知道对方的存在,下面通过节点握手让6个节点彼此建立联系从而组成一个集群。

节点握手

节点握手是指一批运行在集群模式下的节点通过Gossip协议彼此通信(meet、ping、pong消息是Gossip协议通信的载体,详情查看:企业级Redis开发运维从入门到实践 (32)— Redis Cluster(集群)的节点通讯),达到感知对方的过程。

节点握手步骤:

  1. 节点握手是集群彼此通信的第一步,由客户端发起命令:cluster meet{ip}{port}

在这里插入图片描述

  1. 图中执行的命令是:cluster meet 127.0.0.1:6380 让节点6379和6380节点进行握手通信。cluster meet命令是一个异步命令,执行之后立刻返回。内部发起与目标节点进行握手通信。

    1. 节点6379本地创建6380节点信息对象,并发送meet消息。

    2. 节点6380接收到meet消息后,保存6379节点信息并回复pong消息。

    3. 之后节点6379和6380之间定期通过ping/pong消息进行正常的节点通信。
      在这里插入图片描述

    4. 6379和 6380节点通过meet命令彼此建立通信之后,集群结构如下
      在这里插入图片描述

    5. 对节点6379和6380分别执行cluster nodes命令,可以看到它们彼此已经感知到对方的存在。

    127.0.0.1:6379> cluster nodes 
    cfb28ef1deee4e0fa78da86abe5d24566744411e 127.0.0.1:6379 myself,master - 0 0     
    	0 connected 
    8e41673d59c9568aa9d29fb174ce733345b3e8f1 127.0.0.1:6380 master - 0 1468073534265     
    	1 connected 
    127.0.0.1:6380> cluster nodes 
    cfb28ef1deee4e0fa78da86abe5d24566744411e 127.0.0.1:6379 master - 0 1468073571641     
    	0 connected 
    8e41673d59c9568aa9d29fb174ce733345b3e8f1 127.0.0.1:6380 myself,master - 0 0     
    	1 connected
    
    1. 分别执行meet命令让其他节点加入到集群中
    127.0.0.1:6379>cluster meet 127.0.0.1 6381
    127.0.0.1:6379>cluster meet 127.0.0.1 6382 
    127.0.0.1:6379>cluster meet 127.0.0.1 6383 
    127.0.0.1:6379>cluster meet 127.0.0.1 6384
    
    1. 执行cluster nodes命令确认6个节点都彼此感知并组成集群
    127.0.0.1:6379> cluster nodes 
    4fa7eac4080f0b667ffeab9b87841da49b84a6e4 127.0.0.1:6384 master - 0 1468073975551     
    	5 connected 
    cfb28ef1deee4e0fa78da86abe5d24566744411e 127.0.0.1:6379 myself,master - 0 0 0 connected 
    be9485a6a729fc98c5151374bc30277e89a461d8 127.0.0.1:6383 master - 0 1468073978579     
    	4 connected 
    40622f9e7adc8ebd77fca0de9edfe691cb8a74fb 127.0.0.1:6382 master - 0 1468073980598     
    	3 connected 
    8e41673d59c9568aa9d29fb174ce733345b3e8f1 127.0.0.1:6380 master - 0 1468073974541     
    	1 connected 
    40b8d09d44294d2e23c7c768efc8fcd153446746 127.0.0.1:6381 master - 0 1468073979589     
    	2 connected
    
    1. 集群握手完成之后的状态
      在这里插入图片描述
  2. 节点建立握手之后集群还不能正常工作,这时集群处于下线状态,所有的数据读写都被禁止。通过如下命令可以看到:

127.0.0.1:6379> set hello redis 
(error) CLUSTERDOWN The cluster is down
  1. 通过cluster info命令可以获取集群当前状态:从输出内容可以看到,被分配的槽(cluster_slots_assigned)是0(由于目前所有的槽没有分配到节点),因此集群无法完成槽到节点的映射。只有当 16384个槽全部分配给节点后,集群才进入在线状态。
127.0.0.1:6379> cluster info 
cluster_state:fail 
cluster_slots_assigned:0 
cluster_slots_ok:0 
cluster_slots_pfail:0 
cluster_slots_fail:0 
cluster_known_nodes:6 
cluster_size:0 
...
分配槽

Redis集群把所有的数据映射到16384个槽中。每个key会映射为一个固定的槽,只有当节点分配了槽,才能响应和这些槽关联的键命令。

分配槽步骤:

  1. 通过 cluster addslots命令为节点分配槽。这里利用bash特性批量设置槽(slots),把16384个slot平均分配给6379、6380、6381三个节点;命令如下:
redis-cli -h 127.0.0.1 -p 6379 cluster addslots {0...5461} 
redis-cli -h 127.0.0.1 -p 6380 cluster addslots {5462...10922} 
redis-cli -h 127.0.0.1 -p 6381 cluster addslots {10923...16383}
  1. 执行cluster info 查看集群状态,当前集群状态是OK,集群进入在线状态;如下所示:
127.0.0.1:6379> cluster info 
cluster_state:ok 
cluster_slots_assigned:16384 
cluster_slots_ok:16384 
cluster_slots_pfail:0 
cluster_slots_fail:0 
cluster_known_nodes:6 
cluster_size:3 
cluster_current_epoch:5 
cluster_my_epoch:0 
cluster_stats_messages_sent:4874 cluster_stats_messages_received:4726
  1. 执行cluster nodes命令可以看到节点和槽的分配关系:
127.0.0.1:6379> cluster nodes 
4fa7eac4080f0b667ffeab9b87841da49b84a6e4 127.0.0.1:6384 master - 0 1468076240123     
	5 connected 
cfb28ef1deee4e0fa78da86abe5d24566744411e 127.0.0.1:6379 myself,master - 0 0 0 connected     
	0-5461 
be9485a6a729fc98c5151374bc30277e89a461d8 127.0.0.1:6383 master - 0 1468076239622     
	4 connected 
40622f9e7adc8ebd77fca0de9edfe691cb8a74fb 127.0.0.1:6382 master - 0 1468076240628     
	3 connected 
8e41673d59c9568aa9d29fb174ce733345b3e8f1 127.0.0.1:6380 master - 0 1468076237606 579
    1 connected     
	5462-10922 
40b8d09d44294d2e23c7c768efc8fcd153446746 127.0.0.1:6381 master - 0 1468076238612     
	2 connected     
	10923-16383
  1. 没有分配槽的的节点设置为分配槽的节点的从节点,实现故障的自动转移;

    1. 使用cluster replicate {nodeId}命令让一个节点成为从节点。其中命令执行必须在对应的从节点上执行,nodeId是要复制主节点的节点ID。
    127.0.0.1:6382>cluster replicate cfb28ef1deee4e0fa78da86abe5d24566744411e 
    OK 
    127.0.0.1:6383>cluster replicate 8e41673d59c9568aa9d29fb174ce733345b3e8f1 
    OK 
    127.0.0.1:6384>cluster replicate 40b8d09d44294d2e23c7c768efc8fcd153446746 
    OK
    
    1. Redis集群模式下的主从复制使用了之前介绍的Redis复制流程,依然支 持全量和部分复制。复制(replication)完成后,整个集群的结构如下
      在这里插入图片描述
    2. 通过cluster nodes命令查看集群状态和复制关系
    127.0.0.1:6379> cluster nodes 
    4fa7eac4080f0b667ffeab9b87841da49b84a6e4 127.0.0.1:6384 slave 40b8d09d44294d2e2    
    	3c7c768efc8fcd153446746 0 1468076865939 5 connected 
    cfb28ef1deee4e0fa78da86abe5d24566744411e 127.0.0.1:6379 myself,master - 0 0 0 connected     
    	0-5461 
    be9485a6a729fc98c5151374bc30277e89a461d8 127.0.0.1:6383 slave 8e41673d59c9568aa    
    	9d29fb174ce733345b3e8f1 0 1468076868966 4 connected 
    40622f9e7adc8ebd77fca0de9edfe691cb8a74fb 127.0.0.1:6382 slave cfb28ef1deee4e0fa    
    	78da86abe5d24566744411e 0 1468076869976 3 connected 
    8e41673d59c9568aa9d29fb174ce733345b3e8f1 127.0.0.1:6380 master - 0 1468076870987 1     
    	connected 5462-10922 
    40b8d09d44294d2e23c7c768efc8fcd153446746 127.0.0.1:6381 master - 0 1468076867957 2    
    	connected 10923-16383
    
官方工具安装
用redis-trib.rb搭建集群

redis-trib.rb是采用Ruby实现的Redis集群管理工具。内部通过Cluster相关命令帮我们简化集群创建、检查、槽迁移和均衡等常见运维操作,使用之前需要安装Ruby依赖环境。下面介绍搭建集群的详细步骤。

  1. Ruby环境准备

    1. 安装Ruby
    -- 下载ruby 
    wget https:// cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz 
    -- 安装ruby 
    tar xvf ruby-2.3.1.tar.gz ./configure -prefix=/usr/local/ruby 
    make 
    make install 
    cd /usr/local/ruby 
    sudo cp bin/ruby /usr/local/bin 
    sudo cp bin/gem /usr/local/bin
    
    1. 安装rubygem redis依赖
    wget http:// rubygems.org/downloads/redis-3.3.0.gem 
    gem install -l redis-3.3.0.gem 
    gem list --check redis gem
    
    1. 安装redis-trib.rb
    sudo cp /{redis_home}/src/redis-trib.rb /usr/local/bin
    
    1. 安装完Ruby环境后,执行redis-trib.rb命令确认环境是否正确(提供了集群创建、检查、修复、 均衡等命令行工具,可以使用redis-trib.rb create命令可快速搭建集群。),输出如下
    # redis-trib.rb
    Usage: redis-trib <command> <options> <arguments ...>    	
    	create          host1:port1 ... hostN:portN                 
    				  --replicas <arg>    
    	check           host:port    
    	info            host:port    
    	fix              host:port                 
    				  --timeout <arg>    
    	reshard         host:port                  
    				  --from <arg>                  
    				  --to <arg>                  
    				  --slots <arg>                 
    				  --yes                  
    				  --timeout <arg>                  
    				  --pipeline <arg>    
    	...忽略...
    
  2. 准备节点:首先我们跟之前内容一样准备好节点配置并启动:

redis-server conf/redis-6481.conf 
redis-server conf/redis-6482.conf 
redis-server conf/redis-6483.conf 
redis-server conf/redis-6484.conf 
redis-server conf/redis-6485.conf 
redis-server conf/redis-6486.conf
  1. 创建集群:启动好6个节点之后,使用redis-trib.rb create命令完成节点握手和槽分配
    过程(- -replicas参数指定集群中每个主节点配备几个从节点,这里设置为1),

    1. 命令如下(出于测试目的使用本地IP地址127.0.0.1)
    redis-trib.rb create --replicas 1 127.0.0.1:6481 127.0.0.1:6482 127.0.0.1:6483     
    	127.0.0.1:6484 127.0.0.1:6485 127.0.0.1:6486
    
    1. 如果部署节点使用不同的IP地址,redis-trib.rb会尽可能保证主从节点不分配在同一机器下,因此会重新排序节点列表顺序。节点列表顺序用于确定主从角色,先主后从。创建过程中首先会给出主从节点角色分配的计划,如下所示
    >>> Creating cluster 
    >>> Performing hash slots allocation on 6 nodes... 
    Using 3 masters: 
    127.0.0.1:6481 
    127.0.0.1:6482 
    127.0.0.1:6483 
    Adding replica 127.0.0.1:6484 to 127.0.0.1:6481 
    Adding replica 127.0.0.1:6485 to 127.0.0.1:6482 
    Adding replica 127.0.0.1:6486 to 127.0.0.1:6483 
    M: 869de192169c4607bb886944588bc358d6045afa 127.0.0.1:6481 
    slots:0-5460 (5461 slots) master 
    M: 6f9f24923eb37f1e4dce1c88430f6fc23ad4a47b 127.0.0.1:6482 
    slots:5461-10922 (5462 slots) master 
    M: 6228a1adb6c26139b0adbe81828f43a4ec196271 127.0.0.1:6483 
    slots:10923-16383 (5461 slots) master 
    S: 22451ea81fac73fe7a91cf051cd50b2bf308c3f3 127.0.0.1:6484 
    replicates 869de192169c4607bb886944588bc358d6045afa 
    S: 89158df8e62958848134d632e75d1a8d2518f07b 127.0.0.1:6485 
    replicates 6f9f24923eb37f1e4dce1c88430f6fc23ad4a47b 
    S: bcb394c48d50941f235cd6988a40e469530137af 127.0.0.1:6486 
    replicates 6228a1adb6c26139b0adbe81828f43a4ec196271 
    Can I set the above configuration (type 'yes' to accept):
    
    1. 当我们同意这份计划之后输入yes,redis-trib.rb开始执行节点握手和槽分配操作,输出如下
    >>> Nodes configuration updated 
    >>> Assign a different config epoch to each node 
    >>> Sending CLUSTER MEET messages to join the cluster 
    Waiting for the cluster to join.. 
    >>> Performing Cluster Check (using node 127.0.0.1:6481) 
    ...忽略... 
    [OK] All nodes agree about slots configuration. 
    >>> Check for open slots... 
    >>> Check slots coverage... 
    [OK] All 16384 slots covered
    
    1. 最后的输出报告说明:16384个槽全部被分配,集群创建成功。这里需要注意给redis-trib.rb的节点地址必须是不包含任何槽/数据的节点,否则会拒绝创建集群。
  2. 集群完整性检查:指所有的槽都分配到存活的主节点上,只要16384个槽中有 一个没有分配给节点则表示集群不完整。

    1. 可以使用redis-trib.rb check命令检测之前创建的两个集群是否成功,check命令只需要给出集群中任意一个节点地址就可以完成整个集群的检查工作,命令如下:
    redis-trib.rb check 127.0.0.1:6379 
    redis-trib.rb check 127.0.0.1:6481
    
    1. 当最后输出如下信息,提示集群所有的槽都已分配到节点:
    [OK] All nodes agree about slots configuration. 
    >>> Check for open slots... 
    >>> Check slots coverage... 
    [OK] All 16384 slots covered.
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值