Redis cluster集群搭建

一、Redis数据分区

思考:
  主从复制是通过将master上的数据全量的复制到一个或多个节点上,这是一种通过数据冗余的形式来保证数据的安全性,但是当主节点发生故障时需要从它的从节点中选出一个作为新的主节点,剩下的从节点要与这个新的主节点进行全量复制,如果节点的数据量非常大的时候会代来两个主要问题,网络阻塞和从节点恢复数据会导致进程阻塞,最终会影响到对外提供服务的稳定性。
  解决这个问题的关键是:要在不影响服务的前提如何做到这点至关重要。减少Redis的数据量,通常我们会采用数据分片的形式来解决问题。将主节点上的全量数据通过分区规则,拆分到不同的分区中,每个节点上可以保存一个或多个分区的数据,即使有一个节点故障,集群中其他节点依旧能对外提供服务。对故障节点做故障转移进行全量复制的时候压力也会大大减少
在这里插入图片描述

1.1 Redis的数据分区规则:

|
   Redis Cluser采用虚拟槽分区,所有的键根据哈希函数映射到0~16383整数槽内,集群中的每个主节点(Master)都负责处理16384个哈希槽中的一部分,当集群处于稳定状态时,每个哈希槽都只由一个主节点进行处理,每个主节点可以有一个到N个从(Slave),当主节点出现宕机或网络断线等不可用时,从节点能自动提升为主节点进行处理
   计算公式:slot=CRC16(key)&16383。
  
槽与节点的关系:
在这里插入图片描述
key映射到槽:
在这里插入图片描述

1.2 Redis集群的特点:

  • 数据按照slot存储分布在多个节点,节点间数据共享,可动态调整数据分布
  • 可扩展性,节点可动态扩容与缩容
  • 高可用性,部分节点不可用时,集群仍可用。通过增加Slave从节点做standby数据副本,能够实现故障自动转移,节点之间通过gossip协议交换状态信息,用投票机制完成Slave到Master的角色提升

1.3 Redis集群与单机相比较在功能上存在一些限制:

  • key批量操作支持有限。如mset、mget,目前只支持具有相同slot值的key执行批量操作。对于映射为不同slot值的key由于执行mget、mget等操作可能存在于多个节点上因此不被支持。
  • key事务操作支持有限。同理只支持多key在同一节点上的事务操作,当多个key分布在不同的节点上时无法使用事务功能。
  • key作为数据分区的最小粒度,因此不能将一个大的键值对象如hash、list等映射到不同的节点。
  • 支持多数据库空间。单机下的Redis可以支持16个数据库,集群模式下只能使用一个数据库空间,即db0。
  • 主从结构只支持一层,从节点只能复制主节点,不支持嵌套树状主从结构。

二、集群环境搭建

2.1 准备节点

在这里插入图片描述

2.2 配置文件

配置文件【 redis-{port}.conf 】:

#注意对应端口和.log名称
port 6379
logfile log/6379.log
cluster-enabled yes
dir data
cluster-node-timeout 15000
cluster-config-file nodes-6379.conf

启动:

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

文件目录:
  节点启动成功后会生成一个nodes-{port}.conf的集群配置文件。当集群内节点信息发生变化,如添加节点、节点下线、故障转移等。节点会自动保存集群状态到配置文件中。需要注意的是,Redis自动维护集群配置文件,不要手动修改。
  
在这里插入图片描述
启动后节点的信息(未握手和分片)
连接某个节点的客户端,执行命令: cluster nodes
在这里插入图片描述
显示的格式为:
< id > < ip:port > < flags > < master > < pong-recv > < config-epoch > < link-state > < slot > < slot > … < slot >

  • id: 节点ID,是一个40字节的随机字符串,这个值在节点启动的时候创建,并且永远不会改变。
  • ip:port: 客户端与节点通信使用的地址.
  • flags: 逗号分割的标记位,可能的值有: myself, master, slave, fail?, fail, handshake,noaddr, noflags. 下一部分将详细介绍这些标记.
  • master: 如果节点是slave,并且已知master节点,则这里列出master节点ID,否则的话这里列出”-“。
  • ping-sent: 最近一次发送ping的时间,这个时间是一个unix毫秒时间戳,0代表没有发送过.
  • pong-recv: 最近一次收到pong的时间,使用unix时间戳表示.
  • config-epoch: 节点的epoch值。每当节点发生失败切换时,都会创建一个新的,独特的,递增epoch。如果多个节点竞争同一个哈希槽时,epoch值更高的节点会抢夺到。
  • link-state: node-to-node集群总线使用的链接的状态,我们使用这个链接与集群中其他节点进行通信.值可以是connected 和 disconnected.
  • slot: 哈希槽值或者一个哈希槽范围. 从第9个参数开始,后面最多可能有16384个 数(limit never
    reached)。代表当前节点可以提供服务的所有哈希槽值。如果只是一个值,那就是只有一个槽会被使用。如果是一个范围,这个值表示为起始槽-结束槽,节点将处理包括起始槽和结束槽在内的所有哈希槽。

2.3 节点握手

概念:
  在节点未完成握手前,每个启动的节点还是作为单独的运行。节点握手是指一批运行在集群模式下的节点通过Gossip协议彼此通信,达到感知对方的过程。
  从6个节点中任意打开一个客户端输入:cluster meet{ip}{port}
在这里插入图片描述
将剩下的节点都进行握手

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

查看集群信息:
在这里插入图片描述
  可以看到现在集群中有6个节点,但是集群的状态标识 cluster_state:fial 。这是因为槽未分配造成的

2.4. 分配槽

为主节点分配槽
  Redis集群把所有的数据映射到16384个槽中。每个key会映射为一个固定的槽,只有当节点分配了槽,才能响应和这些槽关联的键命令。cluster addslots命令为节点分配槽。所有槽分配完成后集群的状态会变为ok。
  但是在windows 环境下,不支持{10…30} 多个连续分配

2.5 配置主从复制

主从复制
  还有三个节点没有使用,作为一个完整的集群,每个负责处理槽的节点应该具有从节点,保证当它出现故障时可以自动进行故障转移。集群模式下,Reids节点角色分为主节点和从节点。首次启动的节点和被分配槽的节点都是主节点,从节点负责复制主节点槽信息和相关的数据,从节点也没有槽的概念
  
命令:cluster replicate < masterid >

masterid 不是节点的rid,而是cluster nodes 命令显示的40字节长度的节点ID
在这里插入图片描述

三、redis-trib.rb快速搭建集群

3.1 edis-trib.rb工具

~
  通过手动的去配置搭建集群,太繁琐和容易出错,edis-trib.rb是采用Ruby实现Redis集群管理工具。内部通过Cluster相关命令帮我们简化集群创建、检查、槽迁移和均衡等常见运维操作,使用之前需要安装Ruby依赖环境。

3.2 集群部署

1. install Ruby on Linux

在这里插入图片描述

2. install Ruby on windows

  1. Ruby官网下载安装文件
  2. 在http://curl.haxx.se/ca/cacert.pem下载证书,放在ruby安装目录下
  3. 设置环境变量SSL_CERT_FILE,指向证书文件
  4. 运行Start Command Prompt with Ruby
  5. 输入gem install redis
  6. 从redis3.2源码中的src文件夹下redis-trib.rb 复制到搭建的集群文件夹下
  7. 运行redis-trib.rb

3. 准备6个节点
在这里插入图片描述
4. 创建集群

redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384
**命令语义:**创建集群为每个主节点指定一个从节点
create --replicas < slave num > < master … > < slave … >

执行完命令后,会显示集群的主从,槽分配配置方案,选择yes同意配置方案。

在这里插入图片描述
5. 集群完整性检查

  集群完整性指所有的槽都分配到存活的主节点上,只要16384个槽中有一个没有分配给节点则表示集群不完整。可以使用redis-trib.rb check命令检测之前创建的集群是否成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值