1. 引言

从 3.0 版本开始,redis 具备了集群功能,实现了分布式、容错、去中心化等特性,在生产环境中对于保证数据一致性和安全性、提高系统响应能力都有着很必要的意义。
本文我们就来介绍 redis 集群的三种搭建模式和搭建方法。

1.1. redis 集群的特性

redis 集群的目标是线性可扩展性和保证最终一致性,因此,redis 集群不存在中心节点或代理节点。
同时,一致性的保证是建立在一部分容错性牺牲的基础上的,系统通过主从节点的模式在保证对节点失效具有有限抵抗力的前提下,尽可能保证数据的一致性。
redis 集群实现了节点的自动发现、master 的自动选举、热分片、ASK 转向和 MOVED 转向等机制。
可以参考官方文档:
https://redis.io/topics/cluster-tutorial。

1.2. 集群端口

无论是哪种模式的 redis 集群,都需要指定服务端口(默认为 6379),但 redis 实际上是通过服务端口 + 10000 的端口来进行数据同步的。
因此,如果集群无法建立或同步无法进行,除了需要考虑服务端口是否连通以外,还需要检测同步端口的可用性。

2. 主从模式集群

redis 支持简单的主从单向同步的集群结构,主节点负责写入数据,同步到从节点,从节点进行只读操作。
主从单向同步的集群结构可以有效提升系统的吞吐量,同时保证数据的安全性。

2.1. 搭建方法

主从模式的集群搭建方法非常简单,只需要在从节点的配置文件中写入:

slaveof 112.126.74.142 6379

这样,启动该节点后,他就成为了 112.126.74.142:6379 节点的从节点。

2.2. 从节点的写入操作

需要注意的是,从节点默认也可以进行读写操作,但从节点的写入将会导致这部分数据不会被同步,从而造成数据不一致的问题。
可以通过指定配置来强制从节点不可写入:

replica-read-only yes

此时对从节点进行写入操作会报错:

(error) READONLY You can't write against a read only replica.

2.3. 从节点的同步机制

在 redis-cli 中,通过执行 info replication 可以看到集群信息。

# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:6
master_sync_in_progress:0
slave_repl_offset:462
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:201640b5a63c036087b7a459245a6f6a699b8a36
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:462
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:462

其中有两个标识:

  1. master_replid – 长度为41个字节的字符串,主节点标识
  2. master_replid2 – 该节点上一次连接主实例的实例 master_replid
    如果 A 是集群主节点,B 是 A 的从节点,C 是 B 的从节点,那么 C 的 master_replid 则存储的是 A 的节点标识,这意味着,如果 B 节点非只读,B 节点内写入的数据并不会同步到 C 节点。
    数据的同步就是基于 master_replid 与 master_repl_offset 两个字段进行的,每个从节点都保存了当前已同步数据的偏移,从而实现部分同步。
    主节点一旦重启,master_replid 就会发生变动,从而造成所有从节点重新同步全量数据,由于 master_replid 是自动生成的,我们并不能干涉这一过程。

3. 高可用集群 – HA

上面所描述的主从集群存在一个问题,那就是当主节点宕机时,将导致整个集群无法提供服务。
为了保证集群的容错性,redis 提供了官方的 HA 方案,他是通过建立哨兵节点或哨兵集群来实现对 master 的监控和对 slaver 的提权。
哨兵节点通过监控 redis 集群中 master 的状态实现当 master 状态异常时,在 master 的多个 slaver 中选举一个并通过发送 SLAVEOF NO ONE 命令提升其为 master 节点,同时自动发送 SLAVE OF 命令给其他 slaver 节点,从而让集群重新工作起来,这个过程称为 failover 过程。
多个哨兵节点可以组成集群,从而避免某个哨兵节点宕机的情况发生。

3.1. 集群搭建

首先,我们需要创建哨兵节点配置文件:

port 20086      #默认端口26379
dir "/tmp"
logfile "/var/log/redis/sentinel_20086.log"
daemonize yes# 配置监视的进群的主节点 ip 和端口 1 表示至少需要几个哨兵统一认定才可以做出判断
sentinel monitor mymaster 127.0.0.1 6380 1# 表示如果 5s 内 mymaster 没响应,就认为 SDOWN
sentinel down-after-milliseconds mymaster 5000 # 表示如果15秒后,mysater 仍没活过来,则启动 failover,从剩下从节点序曲新的主节点
sentinel failover-timeout mymaster 15000 # 在发生failover主备切换时,这个选项指定了最多可以有多少个slave同时对新的master进行同步,这个数字越小,完成failover所需的时间就越长,但是如果这个数字越大,就意味着越多的slave因为replication而不可用。可以通过将这个值设为 1 来保证每次只有一个slave处于不能处理命令请求的状态
sentinel parallel-syncs T1 1# sentinel 连接设置了密码和主从
# sentinel auth-pass <master_name> xxxxx# 发生切换之后执行的一个自定义脚本
# sentinel client-reconfig-script <master-name> <script-path>

通过 redis-sentinel 命令指定配置文件启动即可。

4. redis-cluster

尽管可以使用哨兵主从集群实现可用性保证,但是这种实现方式每个节点的数据都是全量复制,数据存放量存在着局限性,受限于内存最小的节点。
为了增大存储性能,实现真正的分布式存储系统,sharding 的方案是非常有必要的。
所谓的 sharding 方案指的是将全量数据分成 16384 个散列槽,我们只需采用密钥模数 16384 的 CRC16 就可以计算 key 所在的散列槽位置,这样,每个节点容纳全部 16384 个散列槽中的一部分,所有 master 节点共同组成完整的数据。

4.1. 配置集群

如果需要 sharding 模式与主从模式结合使用,那么需要在建立集群时通过命令指定,而不能在配置文件中添加 slaveof 配置项。
首先修改 redis 配置打开 cluster 配置:

################################ REDIS CLUSTER  ###############################
#
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# WARNING EXPERIMENTAL: Redis Cluster is considered to be stable code, however
# in order to mark it as "mature" we need to wait for a non trivial percentage
# of users to deploy it in production.
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#
# Normal Redis instances can't be part of a Redis Cluster; only nodes that are
# started as cluster nodes can. In order to start a Redis instance as a
# cluster node enable the cluster support uncommenting the following:
#
cluster-enabled yes# Every cluster node has a cluster configuration file. This file is not
# intended to be edited by hand. It is created and updated by Redis nodes.
# Every Redis Cluster node requires a different cluster configuration file.
# Make sure that instances running in the same system do not have
# overlapping cluster configuration file names.
#
cluster-config-file /etc/redis/nodes-6379.conf# Cluster node timeout is the amount of milliseconds a node must be unreachable
# for it to be considered in failure state.
# Most other internal time limits are multiple of the node timeout.
#
cluster-node-timeout 15000

cluster-config-file 配置的文件 redis 集群启动后会自动写入集群信息,如果要删除集群重建,最暴力的方法就是删除集群中每台机器上的 cluster-config-file 配置文件。

其他配置项还有:

  • cluster-slave-validity-factor – slave节点与master断线的时间是否过长,如果 (node-timeout * slave-validity-factor) + repl-ping-slave-period 大于了该值,则 slave 不会被提升为 master,默认值为 10
  • cluster-migration-barrier – master 的最小 slaver 数,避免组建集群时 slaver 不能平均分配的情况发生,默认为 0
  • cluster-require-full-coverage – 是否 sharding 所有 slot 才能够提供服务,默认为 yes,如果设置为 no,可以在 slot 没有全部分配的时候提供服务,不建议,这样会造成分区的时候,小分区的master一直在接受写请求,而造成很长时间数据不一致

4.2. 启动集群

首先,更新完配置后,需要启动所有节点的 redis-server。
redis5.0 版本以后集群操作从 redis-trib.rb 命令迁移到 redis-cli,通过 redis-cli --cluster 命令就可以组建集群了。

redis-cli --cluster create 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 --cluster-replicas 1

–cluster-replicas 指定了集群中每个 master 节点的 slaver 数量。

  • 需要注意的是,至少三台 master 主机才能组成一个 redis-cluster,并且集群中的所有节点初始时必须不能有数据

4.3. 报错处理 – Not all 16384 slots are covered by nodes

可以通过 redis-cli --cluster fix 命令修复,让集群中槽位重新分布。
通过执行 redis-cli --cluster check host:port 可以检测集群中的槽位分布情况。
官方文档中还介绍了集群的其他操作,例如节点的添加和删除,可以进一步阅读。

4.4. MOVED xxx xxx.xxx.xxx.xxx:xxxx

使用 redis-cli 连接集群进行操作,会出现 MOVED 错误。

这是因为出现了 MOVED 转向,提示客户端转向分片所在节点进行操作,关于 MOVED 转向和 ASK 转向我们下一篇文章中再来介绍。
redis 要求客户端自己处理 MOVED 转向和 ASK 转向,所以 redis-cli 中已经拥有了处理逻辑,只需在登录时增加 -c 参数即可自动进行转向,也就不会再报出相应的错误了。

5. 参考资料

https://redis.io/topics/cluster-tutorial。
https://blog.csdn.net/qq_20597727/article/details/83385737。
https://www.cnblogs.com/vansky/p/9130647.html。
https://www.cnblogs.com/zhoujinyi/p/5570024.html。
https://blog.csdn.net/vtopqx/article/details/50235737。
https://blog.csdn.net/huwei2003/article/details/50973893。

redis 集群详解及搭建过程相关推荐

  1. Redis集群cluster环境(快速搭建过程10分钟)

    安装环境CentOS Linux release 7.5.1804 (Core) 如果服务器没有连接网络,请按步骤自行百度其离线方式 话不多说,开整!!! 一.安装redis #下载至/home/in ...

  2. Redis集群的原理和搭建

    Redis集群的原理和搭建 前言 Redis 是我们目前大规模使用的缓存中间件,由于它强大高效而又便捷的功能,得到了广泛的使用.单节点的Redis已经就达到了很高的性能,为了提高可用性我们可以使用Re ...

  3. Redis集群环境之linux搭建多机版---已完结,跟着一步一步来你就可以集群成功

    上一篇踩着各种坑写了Redis集群环境之linux搭建单机版,这一篇准备就多机版集群进行搭建,主要目的一来是在上一篇的基础上进行精华提粹总结,二来是把单机版与多机版的区别进行记录. 首先软硬件环境: ...

  4. Redis集群--Cluster--故障转移的过程(原理)

    原文网址:Redis集群--Cluster--故障转移的过程(原理)_IT利刃出鞘的博客-CSDN博客_redis集群故障转移 简介 本文介绍Redis集群(Cluster)的故障转移的流程. 故障发 ...

  5. Redis数据结构、持久化、缓存技术和集群详解

    redis 是什么? 是完全开源免费的,用c语言编写的,是一个单线程,高性能的(key/value)内存数据库,基于内存运行并支持持久化的nosql数据库 能干嘛? 主要是用来做缓存,但不仅仅只能做缓 ...

  6. Redis Cluster 集群详解

    Redis 分布式扩展之 Redis Cluster 方案 主从切换的过程中会丢失数据,因为只有一个 master,只能单点写,没有解决水平扩容的问题.而且每个节点都保存了所有数据,一个是内存的占用率 ...

  7. Redis集群读写分离架构搭建以及主从数据连通验证(附加集群口令认证以及Redis端口6379释放)

    1. 先在两台主机上装好Redis 如果这部分工作还没有准备好的话,可以看我的另一篇博客. 2. 设置主从节点以及从节点只读(实现读写分离) 2.1 配置slave节点作为master的从机,打开/e ...

  8. ElasticSearch搭建集群详解

    Elasticsearch如果做集群的话Master节点至少三台服务器或者三个Master实例加入相同集群,三个Master节点最多只能故障一台Master节点,如果故障两个Master节点,Elas ...

  9. Redis分片集群(详解+图)

    目录 分片集群特征: 散列插槽 集群伸缩 创建新的redis实例 添加新节点到redis 转移插槽 故障转移 自动故障转移 手动故障转移 RedisTemplate访问分片集群 主从和哨兵可以解决高可 ...

  10. 负载均衡集群、高可用集群详解,DR、NAT超详细搭建步骤

    集群概述 流量相关:     PV:PV(page view)即页面浏览量或点击量,是衡量一个网站或网页用户访问量.具体的说,PV值就是所有访问者在24小时(0点到24点)内看了某个网站多少个页面或某 ...

最新文章

  1. Android studio 自定义打包apk名
  2. 图像处理与识别的算法中若有非线性变换,那么请一定注意归一化的处理会影响结果
  3. Matlab:成功解决The option is not valid. The options must be'double','native','default','omitnan', or'inc
  4. 无法将项目和文件的编码格式从UTF-8转为GBK
  5. 知道 Hardtop 就够了?这九项必备技术你也必须掌握!
  6. c语言编程算法模板,C语言编程算法精选.doc
  7. Django Abstract Models使用下划线设置related_name
  8. Python--简单的端口扫描脚本
  9. 中国量子云计算机,量子云平台“中国版”拉开帷幕:国际首个基于核磁共振的量子计算云平台 | Science Bulletin...
  10. 算法 --- 顺序查找、二分查找的js实现
  11. python antlr_使用ANTLR在5分钟内用Java解析任何语言:例如Python
  12. android netty导入_Android Netty框架的使用
  13. ext/iconv/.libs/iconv.o: In function `_php_iconv_strlen'
  14. mysql拆分盘数据库_数据库拆分
  15. matlab着重标出某个点,MATLAB与数学实验讲义资料.doc
  16. 远程医疗作用_是远程医疗保健的未来
  17. (大数据方向)分布式实验七:HBase数据库搭建以及常用命令
  18. Mac Android 查看dex文件内容
  19. 【CSDN】markdown小技巧
  20. win10状态栏卡死,屏幕正常

热门文章

  1. Unity Hex与Color之间进行颜色转换
  2. 林彪-怎样当好一名师长
  3. TIA博途中CPU固件版本和实际PLC不同时如何进行程序的下载?
  4. Android手机写Java代码的软件
  5. win10街头篮球服务器连接中断,win10系统玩街头篮球游戏老掉线的修复技巧
  6. 1096 大美数 – PAT乙级真题
  7. 给JavaScript 初心者的ES2015 实战
  8. liunx中文件夹不能删除怎么操作
  9. js实现逐行打字,逐段打字效果(最全)
  10. 看看最新BTA大厂的Java程序员的招聘技术标准,成功入职字节跳动