redis 集群模式_深度剖析Redis系列笔记(三) Redis集群模式搭建与原理详解

Redis 3.0 之前,使用 哨兵( sentinel )机制来监控各个节点之间的状态。 Redis ClusterRedis分布式解决方案,在 3.0 版本正式推出,有效地解决了 Redis分布式 方面的需求。当遇到 单机内存并发流量 等瓶颈时,可以采用 Cluster 架构方案达到 负载均衡 的目的。本文将从 集群方案、数据分布、搭建集群、节点通信、集群伸缩、请求路由、故障转移、集群运维等几个方面介绍 Redis Cluster

1. Redis集群方案

Redis Cluster  集群模式通常具有  高可用 、 可扩展性 、 分布式 、 容错  等特性。 Redis  分布式方案一般有两种:

1.1 客户端分区方案

客户端  就已经决定数据会被  存储  到哪个  redis  节点或者从哪个  redis  节点  读取数据 。其主要思想是采用  哈希算法  将  Redis  数据的  key  进行散列,通过  hash  函数,特定的  key 会  映射  到特定的  Redis  节点上。 65c1a628787d4faeea2e32133148d5c0.png 客户端分区方案 的代表为 Redis ShardingRedis ShardingRedis Cluster 出来之前,业界普遍使用的 Redis 多实例集群 方法。 JavaRedis 客户端驱动库 Jedis ,支持 Redis Sharding 功能,即 ShardedJedis 以及 结合缓存池ShardedJedisPool
  • 优点:不使用 第三方中间件,分区逻辑 可控,配置 简单,节点之间无关联,容易 线性扩展,灵活性强。

  • 缺点:客户端 无法 动态增删 服务节点,客户端需要自行维护 分发逻辑,客户端之间 无连接共享,会造成 连接浪费

1.2. 代理分区方案

客户端  发送请求到一个  代理组件 , 代理  解析  客户端  的数据,并将请求转发至正确的节点,最后将结果回复给客户端。
  • 优点:简化 客户端 的分布式逻辑,客户端 透明接入,切换成本低,代理的 转发 和 存储 分离。

  • 缺点:多了一层 代理层,加重了 架构部署复杂度 和 性能损耗。

556e310486c66c039c2e397cf57e8a43.png 代理分区  主流实现的有方案有  Twemproxy  和  Codis
1.2.1. Twemproxy
Twemproxy 也叫 nutcraker ,是 twitter 开源的一个 redismemcache中间代理服务器 程序。 Twemproxy 作为 代理,可接受来自多个程序的访问,按照 路由规则,转发给后台的各个 Redis 服务器,再原路返回。 Twemproxy 存在 单点故障 问题,需要结合 LvsKeepalived高可用方案26cc7476552318bfc49f914be73a6585.png
  • 优点:应用范围广,稳定性较高,中间代理层 高可用。

  • 缺点:无法平滑地 水平扩容/缩容,无 可视化管理界面,运维不好,出现故障,不能 自动转移。

1.2.2. Codis
Codis 是一个 分布式 Redis 解决方案,对于上层应用来说,连接 Codis-Proxy 和直接连接 原生的 Redis-Server 没有的区别。 Codis 底层会 处理请求的转发,不停机的进行 数据迁移 等工作。 Codis 采用了无状态的 代理层,对于 客户端 来说,一切都是透明的。 3c99031f74d1a73e88cfe9ef3df5b6f7.png
  • 优点:实现了上层 Proxy 和底层 Redis高可用数据分片自动平衡,提供 命令行接口RESTful API,提供 监控管理 界面,可以动态 添加删除 Redis 节点。

  • 缺点:部署架构配置 复杂,不支持 跨机房多租户,不支持 鉴权管理

1.3. 查询路由方案

客户端随机地 请求任意一个 Redis 实例,然后由 Redis 将请求 转发正确Redis 节点。 Redis Cluster 实现了一种 混合形式查询路由,但并不是 直接 将请求从一个 Redis 节点 转发 到另一个 Redis 节点,而是在 客户端 的帮助下直接 重定向( redirected )到正确的 Redis 节点。 fa7fe4715dbfee7c8711fcded286968e.png
  • 优点:无中心节点,数据按照 存储分布在多个 Redis 实例上,可以平滑的进行节点 扩容/缩容,支持 高可用自动故障转移,运维成本低。

  • 缺点:严重依赖 Redis-trib 工具,缺乏 监控管理,需要依赖 Smart Client (维护连接缓存路由表MultiOpPipeline 支持)。Failover 节点的 检测过慢,不如 中心节点 ZooKeeper 及时。Gossip 消息具有一定开销。无法根据统计区分 冷热数据

2. 数据分布

2.1. 数据分布理论

分布式数据库  首先要解决把  整个数据集  按照  分区规则  映射到  多个节点  的问题,即把  数据集  划分到  多个节点  上,每个节点负责  整体数据  的一个  子集 。 a3fe862955c945c3bbd57ea2dba3afce.png

数据分布通常有 哈希分区顺序分区 两种方式,对比如下:

分区方式特点相关产品
哈希分区离散程度好,数据分布与业务无关,无法顺序访问Redis Cluster,Cassandra,Dynamo
顺序分区离散程度易倾斜,数据分布与业务相关,可以顺序访问BigTable,HBase,Hypertable
由于 Redis Cluster 采用 哈希分区规则,这里重点讨论 哈希分区。常见的 哈希分区 规则有几种,下面分别介绍:
2.1.1. 节点取余分区
使用特定的数据,如  Redis  的  键  或  用户   ID ,再根据  节点数量   N  使用公式: hash(key)% N 计算出  哈希值 ,用来决定数据  映射  到哪一个节点上。 6458876d14f530b0c67d0a771245239a.png
  • 优点

这种方式的突出优点是 简单性,常用于 数据库分库分表规则。一般采用 预分区 的方式,提前根据 数据量 规划好 分区数,比如划分为 5121024 张表,保证可支撑未来一段时间的 数据容量,再根据 负载情况 迁移到其他 数据库 中。扩容时通常采用 翻倍扩容,避免 数据映射 全部被 打乱,导致 全量迁移 的情况。

  • 缺点

节点数量 变化时,如 扩容收缩 节点,数据节点 映射关系 需要重新计算,会导致数据的 重新迁移

2.1.2. 一致性哈希分区
一致性哈希 可以很好的解决 稳定性问题,可以将所有的 存储节点 排列在 收尾相接Hash 环上,每个 key 在计算 Hash 后会 顺时针 找到 临接存储节点 存放。而当有节点 加入退出 时,仅影响该节点在 Hash 环上 顺时针相邻后续节点

adb8ed02c3fe740076b7474e2c52de2e.png

  • 优点

加入删除 节点只影响 哈希环顺时针方向相邻的节点,对其他节点无影响。
  • 缺点

加减节点 会造成 哈希环 中部分数据 无法命中。当使用 少量节点 时,节点变化 将大范围影响 哈希环数据映射,不适合 少量数据节点 的分布式方案。普通一致性哈希分区 在增减节点时需要 增加一倍减去一半 节点才能保证 数据负载的均衡

注意:因为 一致性哈希分区 的这些缺点,一些分布式系统采用 虚拟槽 对 一致性哈希 进行改进,比如 Dynamo 系统。

2.1.3. 虚拟槽分区

虚拟槽分区 巧妙地使用了 哈希空间,使用 分散度良好哈希函数 把所有数据 映射 到一个 固定范围整数集合 中,整数定义为 ( slot )。这个范围一般 远远大于 节点数,比如 Redis Cluster 槽范围是 0 ~ 16383 是集群内 数据管理迁移基本单位。采用 大范围槽 的主要目的是为了方便 数据拆分集群扩展。每个节点会负责 一定数量的槽,如图所示: 746bdf357eebfc6cd68813b57e733432.png 当前集群有  5  个节点,每个节点平均大约负责  3276  个  槽 。由于采用  高质量  的  哈希算法 ,每个槽所映射的数据通常比较  均匀 ,将数据平均划分到  5  个节点进行  数据分区 。 Redis Cluster  就是采用  虚拟槽分区 。
  • 节点1:包含 0 到 3276 号哈希槽。

  • 节点2: 包含 3277 到 6553 号哈希槽。

  • 节点3: 包含 6554 到 9830 号哈希槽。

  • 节点4: 包含 9831 到 13107 号哈希槽。

  • 节点5: 包含 13108 到 16383 号哈希槽。

这种结构很容易 添加 或者 删除 节点。如果 增加 一个节点 6 ,就需要从节点 1 ~ 5 获得部分 分配到节点 6 上。如果想 移除 节点 1 ,需要将节点 1 中的 移到节点 2 ~ 5 上,然后将 没有任何槽 的节点 1 从集群中 移除 即可。

由于从一个节点将 哈希槽 移动到另一个节点并不会 停止服务,所以无论 添加删除 或者 改变 某个节点的 哈希槽的数量 都不会造成 集群不可用 的状态.

2.2. Redis的数据分区

Redis Cluster  采用  虚拟槽分区 ,所有的  键  根据  哈希函数  映射到  0~16383  整数槽内,计算公式: slot = CRC16(key)& 16383 。每个节点负责维护一部分槽以及槽所映射的  键值数据 ,如图所示: 28b32d6e5755ff9d15b3f3c0c7e8a686.png

2.2.1. Redis虚拟槽分区的特点

  • 解耦 数据 和 节点 之间的关系,简化了节点 扩容 和 收缩 难度。

  • 节点自身 维护槽的 映射关系,不需要 客户端 或者 代理服务 维护 槽分区元数据。

  • 支持 节点、槽、键 之间的 映射查询,用于 数据路由、在线伸缩 等场景。

2.3. Redis集群的功能限制

Redis  集群相对  单机  在功能上存在一些限制,需要  开发人员  提前了解,在使用时做好规避。
  • key 批量操作 支持有限。

类似  msetmget 操作,目前只支持对具有相同  slot 值的  key 执行  批量操作。对于  映射为不同  slot 值的  key 由于执行  mgetmget 等操作可能存在于多个节点上,因此不被支持。
  • key 事务操作 支持有限。

只支持  多  key 在  同一节点上 的  事务操作,当多个  key 分布在  不同 的节点上时  无法 使用事务功能。
  • key 作为 数据分区 的最小粒度

不能将一个  大的键值 对象如  hashlist 等映射到  不同的节点。
  • 不支持 多数据库空间

单机 下的  Redis 可以支持  16 个数据库( db0 ~ db15), 集群模式 下只能使用  一个 数据库空间,即  db0
  • 复制结构 只支持一层

从节点  只能复制  主节点 ,不支持  嵌套树状复制  结构。

3. Redis集群搭建

Redis-Cluster  是  Redis  官方的一个  高可用  解决方案, Cluster  中的  Redis  共有  2^14(16384)  个  slot   槽 。创建  Cluster  后, 槽  会  平均分配  到每个  Redis  节点上。 下面介绍一下本机启动  6  个  Redis  的  集群服务 ,并使用  redis-trib.rb  创建  3主3从  的  集群 。搭建集群工作需要以下三个步骤:

3.1. 准备节点

Redis  集群一般由  多个节点  组成,节点数量至少为  6  个,才能保证组成  完整高可用  的集群。每个节点需要  开启配置   cluster-enabled yes ,让  Redis  运行在  集群模式  下。

Redis 集群的节点规划如下:

节点名称端口号是主是从所属主节点
redis-63796379主节点---
redis-63896389从节点redis-6379
redis-63806380主节点---
redis-63906390从节点redis-6380
redis-63816381主节点---
redis-63916391从节点redis-6381

注意:建议为集群内 所有节点 统一目录,一般划分三个目录:confdatalog,分别存放 配置、数据 和 日志 相关文件。把 6 个节点配置统一放在 conf 目录下。

3.1.1. 创建redis各实例目录
$ sudo mkdir -p /usr/local/redis-cluster
$ cd /usr/local/redis-cluster
$ sudo mkdir conf data log
$ sudo mkdir -p data/redis-6379 data/redis-6389 data/redis-6380 data/redis-6390 data/redis-6381 data/redis-6391

3.1.2. redis配置文件管理

根据以下  模板  配置各个实例的  redis.conf ,以下只是搭建集群需要的  基本配置 ,可能需要根据实际情况做修改。
 1# redis后台运行
2daemonize yes
3# 绑定的主机端口
4bind 127.0.0.1
5# 数据存放目录
6dir /usr/local/redis-cluster/data/redis-6379
7# 进程文件
8pidfile /var/run/redis-cluster/${自定义}.pid
9# 日志文件
10logfile /usr/local/redis-cluster/log/${自定义}.log
11# 端口号
12port 6379
13# 开启集群模式,把注释#去掉
14cluster-enabled yes
15# 集群的配置,配置文件首次启动自动生成
16cluster-config-file /usr/local/redis-cluster/conf/${自定义}.conf
17# 请求超时,设置10秒
18cluster-node-timeout 10000
19# aof日志开启,有需要就开启,它会每次写操作都记录一条日志
20appendonly yes
  • redis-6379.conf

     1daemonize yes
    2bind 127.0.0.1
    3dir /usr/local/redis-cluster/data/redis-6379
    4pidfile /var/run/redis-cluster/redis-6379.pid
    5logfile /usr/local/redis-cluster/log/redis-6379.log
    6port 6379
    7cluster-enabled yes
    8cluster-config-file /usr/local/redis-cluster/conf/node-6379.conf
    9cluster-node-timeout 10000
    10appendonly yes
  • redis-6389.conf

     1daemonize yes
    2bind 127.0.0.1
    3dir /usr/local/redis-cluster/data/redis-6389
    4pidfile /var/run/redis-cluster/redis-6389.pid
    5logfile /usr/local/redis-cluster/log/redis-6389.log
    6port 6389
    7cluster-enabled yes
    8cluster-config-file /usr/local/redis-cluster/conf/node-6389.conf
    9cluster-node-timeout 10000
    10appendonly yes
  • redis-6380.conf

     1daemonize yes
    2bind 127.0.0.1
    3dir /usr/local/redis-cluster/data/redis-6380
    4pidfile /var/run/redis-cluster/redis-6380.pid
    5logfile /usr/local/redis-cluster/log/redis-6380.log
    6port 6380
    7cluster-enabled yes
    8cluster-config-file /usr/local/redis-cluster/conf/node-6380.conf
    9cluster-node-timeout 10000
    10appendonly yes
  • redis-6390.conf

     1daemonize yes
    2bind 127.0.0.1
    3dir /usr/local/redis-cluster/data/redis-6390
    4pidfile /var/run/redis-cluster/redis-6390.pid
    5logfile /usr/local/redis-cluster/log/redis-6390.log
    6port 6390
    7cluster-enabled yes
    8cluster-config-file /usr/local/redis-cluster/conf/node-6390.conf
    9cluster-node-timeout 10000
    10appendonly yes
  • redis-6381.conf

     1daemonize yes
    2bind 127.0.0.1
    3dir /usr/local/redis-cluster/data/redis-6381
    4pidfile /var/run/redis-cluster/redis-6381.pid
    5logfile /usr/local/redis-cluster/log/redis-6381.log
    6port 6381
    7cluster-enabled yes
    8cluster-config-file /usr/local/redis-cluster/conf/node-6381.conf
    9cluster-node-timeout 10000
    10appendonly yes
  • redis-6391.conf

     1daemonize yes
    2bind 127.0.0.1
    3dir /usr/local/redis-cluster/data/redis-6391
    4pidfile /var/run/redis-cluster/redis-6391.pid
    5logfile /usr/local/redis-cluster/log/redis-6391.log
    6port 6391
    7cluster-enabled yes
    8cluster-config-file /usr/local/redis-cluster/conf/node-6391.conf
    9cluster-node-timeout 10000
    10appendonly yes

3.2. 环境准备

3.2.1. 安装Ruby环境
$ sudo brew install ruby

3.2.2. 准备rubygem redis依赖

1$ sudo gem install redis
2Password:
3Fetching: redis-4.0.2.gem (100%)
4Successfully installed redis-4.0.2
5Parsing documentation for redis-4.0.2
6Installing ri documentation for redis-4.0.2
7Done installing documentation for redis after 1 seconds
81 gem installed

3.2.3. 拷贝redis-trib.rb到集群根目录

redis-trib.rb 是 redis 官方推出的管理 redis 集群 的工具,集成在 redis 的源码 src 目录下,将基于 redis 提供的 集群命令 封装成 简单、便捷、实用 的 操作工具。
$ sudo cp /usr/local/redis-4.0.11/src/redis-trib.rb /usr/local/redis-cluster
查看 redis-trib.rb 命令环境是否正确,输出如下:
$ ./redis-trib.rb 
Usage: redis-trib   create          host1:port1 ... hostN:portN--replicas 
  check           host:port
  info            host:port
  fix             host:port--timeout 
  reshard         host:port--from --to --slots --yes--timeout --pipeline 
  rebalance       host:port--weight --auto-weights--use-empty-masters--timeout --simulate--pipeline --threshold 
  add-node        new_host:new_port existing_host:existing_port--slave--master-id 
  del-node        host:port node_id
  set-timeout     host:port milliseconds
  call            host:port command arg arg .. arg
  import          host:port--from --copy--replace
  help            (show this help)
For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.
redis-trib.rb  是  redis  小编用  ruby  完成的。 redis-trib.rb  命令行工具 的具体功能如下:
命令作用
create创建集群
check检查集群
info查看集群信息
fix修复集群
reshard在线迁移slot
rebalance平衡集群节点slot数量
add-node将新节点加入集群
del-node从集群中删除节点
set-timeout设置集群节点间心跳连接的超时时间
call在集群全部节点上执行命令
import将外部redis数据导入集群

3.3. 安装集群

3.3.1. 启动redis服务节点

运行如下命令启动 6 台 redis 节点:

1sudo redis-server conf/redis-6379.conf
2sudo redis-server conf/redis-6389.conf
3sudo redis-server conf/redis-6380.conf
4sudo redis-server conf/redis-6390.conf
5sudo redis-server conf/redis-6381.conf
6sudo redis-server conf/redis-6391.conf

启动完成后,redis 以集群模式启动,查看各个 redis 节点的进程状态:

1$ ps -ef | grep redis-server
2    0  1908     1   0  4:59下午 ??         0:00.01 redis-server *:6379 [cluster] 
3    0  1911     1   0  4:59下午 ??         0:00.01 redis-server *:6389 [cluster] 
4    0  1914     1   0  4:59下午 ??         0:00.01 redis-server *:6380 [cluster] 
5    0  1917     1   0  4:59下午 ??         0:00.01 redis-server *:6390 [cluster] 
6    0  1920     1   0  4:59下午 ??         0:00.01 redis-server *:6381 [cluster] 
7    0  1923     1   0  4:59下午 ??         0:00.01 redis-server *:6391 [cluster] 

在每个 redis 节点的 redis.conf 文件中,我们都配置了 cluster-config-file 的文件路径,集群启动时,conf 目录会新生成 集群 节点配置文件。查看文件列表如下:

 1$ tree -L 3 .
2.
3├── appendonly.aof
4├── conf
5│   ├── node-6379.conf
6│   ├── node-6380.conf
7│   ├── node-6381.conf
8│   ├── node-6389.conf
9│   ├── node-6390.conf
10│   ├── node-6391.conf
11│   ├── redis-6379.conf
12│   ├── redis-6380.conf
13│   ├── redis-6381.conf
14│   ├── redis-6389.conf
15│   ├── redis-6390.conf
16│   └── redis-6391.conf
17├── data
18│   ├── redis-6379
19│   ├── redis-6380
20│   ├── redis-6381
21│   ├── redis-6389
22│   ├── redis-6390
23│   └── redis-6391
24├── log
25│   ├── redis-6379.log
26│   ├── redis-6380.log
27│   ├── redis-6381.log
28│   ├── redis-6389.log
29│   ├── redis-6390.log
30│   └── redis-6391.log
31└── redis-trib.rb
32
339 directories, 20 files
3.3.2. redis-trib关联集群节点
按照  从主到从  的方式  从左到右  依次排列  6  个  redis  节点。
$ sudo ./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:6389 127.0.0.1:6390 127.0.0.1:6391
集群创建后, redis-trib  会先将  16384  个  哈希槽  分配到  3  个  主节点 ,即  redis-6379redis-6380  和  redis-6381 。然后将各个  从节点  指向  主节点 ,进行  数据同步 。
 1>>> Creating cluster
2>>> Performing hash slots allocation on 6 nodes...
3Using 3 masters:
4127.0.0.1:6379
5127.0.0.1:6380
6127.0.0.1:6381
7Adding replica 127.0.0.1:6390 to 127.0.0.1:6379
8Adding replica 127.0.0.1:6391 to 127.0.0.1:6380
9Adding replica 127.0.0.1:6389 to 127.0.0.1:6381
10>>> Trying to optimize slaves allocation for anti-affinity
11[WARNING] Some slaves are in the same host as their master
12M: ad4b9ffceba062492ed67ab336657426f55874b7 127.0.0.1:6379
13   slots:0-5460 (5461 slots) master
14M: df23c6cad0654ba83f0422e352a81ecee822702e 127.0.0.1:6380
15   slots:5461-10922 (5462 slots) master
16M: ab9da92d37125f24fe60f1f33688b4f8644612ee 127.0.0.1:6381
17   slots:10923-16383 (5461 slots) master
18S: 25cfa11a2b4666021da5380ff332b80dbda97208 127.0.0.1:6389
19   replicates ad4b9ffceba062492ed67ab336657426f55874b7
20S: 48e0a4b539867e01c66172415d94d748933be173 127.0.0.1:6390
21   replicates df23c6cad0654ba83f0422e352a81ecee822702e
22S: d881142a8307f89ba51835734b27cb309a0fe855 127.0.0.1:6391
23   replicates ab9da92d37125f24fe60f1f33688b4f8644612ee

然后输入 yesredis-trib.rb 开始执行 节点握手 和 槽分配 操作,输出如下:

 1Can I set the above configuration? (type 'yes' to accept): yes
2>>> Nodes configuration updated
3>>> Assign a different config epoch to each node
4>>> Sending CLUSTER MEET messages to join the cluster
5Waiting for the cluster to join....
6>>> Performing Cluster Check (using node 127.0.0.1:6379)
7M: ad4b9ffceba062492ed67ab336657426f55874b7 127.0.0.1:6379
8   slots:0-5460 (5461 slots) master
9   1 additional replica(s)
10M: ab9da92d37125f24fe60f1f33688b4f8644612ee 127.0.0.1:6381
11   slots:10923-16383 (5461 slots) master
12   1 additional replica(s)
13S: 48e0a4b539867e01c66172415d94d748933be173 127.0.0.1:6390
14   slots: (0 slots) slave
15   replicates df23c6cad0654ba83f0422e352a81ecee822702e
16S: d881142a8307f89ba51835734b27cb309a0fe855 127.0.0.1:6391
17   slots: (0 slots) slave
18   replicates ab9da92d37125f24fe60f1f33688b4f8644612ee
19M: df23c6cad0654ba83f0422e352a81ecee822702e 127.0.0.1:6380
20   slots:5461-10922 (5462 slots) master
21   1 additional replica(s)
22S: 25cfa11a2b4666021da5380ff332b80dbda97208 127.0.0.1:6389
23   slots: (0 slots) slave
24   replicates ad4b9ffceba062492ed67ab336657426f55874b7
25[OK] All nodes agree about slots configuration.
26>>> Check for open slots...
27>>> Check slots coverage...
28[OK] All 16384 slots covered.

执行 集群检查,检查各个 redis 节点占用的 哈希槽(slot)的个数以及 slot 覆盖率。16384个槽位中,主节点 redis-6379redis-6380 和 redis-6381 分别占用了 54615461 和 5462个槽位。

3.3.3. redis主节点的日志

可以发现,通过 BGSAVE 命令,从节点 redis-6389 在 后台 异步地从 主节点 redis-6379 同步数据。

 1$ cat log/redis-6379.log 
21907:C 05 Sep 16:59:52.960 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
31907:C 05 Sep 16:59:52.961 # Redis version=4.0.11, bits=64, commit=00000000, modified=0, pid=1907, just started
41907:C 05 Sep 16:59:52.961 # Configuration loaded
51908:M 05 Sep 16:59:52.964 * Increased maximum number of open files to 10032 (it was originally set to 256).
61908:M 05 Sep 16:59:52.965 * No cluster configuration found, I'm ad4b9ffceba062492ed67ab336657426f55874b7
71908:M 05 Sep 16:59:52.967 * Running mode=cluster, port=6379.
81908:M 05 Sep 16:59:52.967 # Server initialized
91908:M 05 Sep 16:59:52.967 * Ready to accept connections
101908:M 05 Sep 17:01:17.782 # configEpoch set to 1 via CLUSTER SET-CONFIG-EPOCH
111908:M 05 Sep 17:01:17.812 # IP address for this node updated to 127.0.0.1
121908:M 05 Sep 17:01:22.740 # Cluster state changed: ok
131908:M 05 Sep 17:01:23.681 * Slave 127.0.0.1:6389 asks for synchronization
141908:M 05 Sep 17:01:23.681 * Partial resynchronization not accepted: Replication ID mismatch (Slave asked for '4c5afe96cac51cde56039f96383ea7217ef2af41', my replication IDs are '037b661bf48c80c577d1fa937ba55367a3692921' and '0000000000000000000000000000000000000000')
151908:M 05 Sep 17:01:23.681 * Starting BGSAVE for SYNC with target: disk
161908:M 05 Sep 17:01:23.682 * Background saving started by pid 1952
171952:C 05 Sep 17:01:23.683 * DB saved on disk
181908:M 05 Sep 17:01:23.749 * Background saving terminated with success
191908:M 05 Sep 17:01:23.752 * Synchronization with slave 127.0.0.1:6389 succeeded
3.3.4 . redis集群完整性检测

使用 redis-trib.rb check 命令检测之前创建的 两个集群 是否成功,check 命令只需要给出集群中 任意一个节点地址 就可以完成 整个集群 的 检查工作,命令如下:

$ ./redis-trib.rb check 127.0.0.1:6379

当最后输出如下信息,提示集群 所有的槽 都已分配到节点:

1[OK] All nodes agree about slots configuration.
2>>> Check for open slots...
3>>> Check slots coverage...
4[OK] All 16384 slots covered.

小结

本文介绍了 Redis 集群解决方案数据分布集群搭建。集群方案包括 客户端分区 方案,代理分区 方案 和 查询路由 方案。数据分布 部分简单地对 节点取余 分区,一致性哈希 分区以及 虚拟槽 分区进行了阐述和对比。最后对使用 Redis-trib 搭建了一个 三主三从虚拟槽 集群示例。

欢迎关注技术公众号:java小白逆袭之路

253f69ebd3c633dce211e37fc13a6e89.png

本帐号将持续分享后端技术干货,包括多线程编程,JVM基础,,高性能框架,异步、缓存和微服务,分布式和消息中间件,架构学习和进阶等学习资料和文章。

原文引用:https://juejin.im/post/5b8fc5536fb9a05d2d01fb11

深度剖析Redis系列笔记(一) - Redis入门简介与主从搭建

深度剖析Redis系列笔记(二) - Redis哨兵模式与高可用集群

点我留言吧
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值