Redis4.x(十八):Clstuer分片集群模式实现高扩展

star2017 1年前 ⋅ 284 阅读

Redis 可存储数据量受限于内存容量,单实例存储了大量数据(通常 16G 以上)的处理能力就会遇到瓶颈, 在进行持久化或主从复制时, 会越来越多地出现诸如延迟等的问题。针对这种情况,就需要通过部署多节点的 Redis 集群来存储大量的数据,可以将数据集通过分区的方式分布到多个 Redis 主实例中。

Redis 从 3.0 版本开始支持 Redis Cluster(集群),提供了数据在 Redis 节点之间自动分片

Redis Cluster 介绍

Redis 集群将数据自动分片存储在多个 Redis 节点,提供了一定程度的可用性,即使某些节点发生故障仍可继续运行。

集群端口

每个Redis群集节点都开启 2 个 TCP 端口,一个用于给客户端提连接(命令端口),例如 6379;另一个用于集群节点间数据通信(总线端口),在给客户端连接的端口上加 10000 获得,此示例中为 16379。 10000 是命令端口和总线端口的偏移量,是固定的,因此,监听端口大于 55536 的 Redis 集群节点是不能启动的。。

第二个高端口用于集群总线,即使用二进制协议的节点到节点通信通道。节点使用群集总线进行故障检测,配置更新,故障转移授权等。注意防火墙开放这两个端口。

数据分片

Redis Cluster 没有采用一致性 HASH,而是引入了 Hash Slot(哈希槽)的概念。

Redis集群中有 16384哈希槽,每个 Key 通过 CRC16 校验后对 16384 来决定放置哪个槽,集群中的每个节点负责一部分哈希槽。例如,一个包含3个节点的群集,其中:

  • 节点A包含从 0 到 5500 的散列槽。
  • 节点B包含从 5501 到 11000 的散列槽。
  • 节点C包含从 11001 到 16383 的散列槽。

备注:为什么是 16384(2的14次方)个哈希槽,可看 Redis 作者解释:https://github.com/antirez/redis/issues/2576

哈希槽的方式在添加和删除集群节点上非常容易操作,将哈希槽从一个节点移动到另一个节点不需要停止服务,添加删除节点,或者更改节点所拥有的哈希槽的百分比,不需要任何停机时间。

只要涉及单个命令执行(或整个事务或Lua脚本执行)的所有都属于同一个哈希槽,Redis Cluster支持多个操作。用户可以通过使用称为哈希标记的概念强制多个密钥属于同一个哈希槽。

主从复制

为了使在主节点发生故障或无法与大多数节点通信情况下仍然可用可用,Redis 集群使用主从复制模型,每个哈希槽从 1(主节点) 到N个副本(N -1个从节点)。
当主节点因故障不可用时,从节点会被提升为主节点继续提供服务,如果主-从节点都不可用,则集群不可用。

集群一致性

Redis 集群无法保证强一致性,意味着可能丢失部分数据,这是因为 Redis 集群采用了主-从复制模型,而主-从复制是异步执行的,主实例将数据备份给从实例时是不会等待从实例的确认的,若在备份过程中主实例新写入的命令存储在缓冲区可能会因为主服务器崩溃而丢失。

性能数据一致性两间之间需要权衡。 Redis Cluster 在绝对需要时支持同步写入,通过 WAIT 命令实现,可以降低丢失定入的可能性。但要注意,即使使用同步复制,Redis Cluster 也不会实现强一致性。主节点超时后。

Redis Cluster 配置

配置参数

redis.conf 文件的 REDIS CLUSTER 章节包含了配置 Redis Cluster 的参数。

  1. cluster-enabled [yes/no]
    是否开启集群,yes表示开启;no表示不开启,按常规的单实例启动。

  2. cluster-config-file [filename]
    每个集群节点都会有一个集群配置文件,些文件无须用户编辑,是由 Redis 节点创建和更新,用于每次发生更新时 Redis 集群节点自动保存集群配置(基本上是状态),便于重启时重载配置。每个 Redis 集群节点的集群配置文件不同,通常会做如下命名nodes-6379.conf

  3. cluster-node-timeout [milliseconds:毫秒]
    集群节点持续不可用的时长。如果主节点的可访问时间超过指定时长(连接超时),则视此主节点为故障状态,从节点执行故障迁移并升级为主节点。

  4. cluster-slave-validity-factor [factor]
    在进行故障迁移时,所有从节点都会申请为主节点,但有些从节点可能与主节点连接断开时间较长,数据较旧,这样的从节点不应被提升为主节点。

    每个从节点会计算最后一次与主节点交互的时间,或者与主节点连接超时的时长。如果从节点与主节点最后一次交互超过太旧(超龄)的话,从节点不会进行故障迁移。这个值用户可设置,公式如下,如果从节点连接断开时长超过公式计算的值,则不进行故障迁移(不提升为主节点)。
    (node-timeout slave-validity-factor)+ repl-ping-slave-period
    如果node-timeout为30秒,slave-validity-factor为10,并假设默认的*repl-ping-slave-period
    为10秒,则连接超时大于 310 秒的从节点不进行故障迁移。

    从节点的有效因子。 为了获得最大可用性,可设置为 0,表示从服务器将始终尝试对主服务器进行故障迁移,不管主-从连接断开的时长。0 是唯一能够保证所有分区恢复时,集群能够继承提供服务的值。

    注意:如果主节点没有从节点对其进行故障迁移,则任何不等 0的值都可能导致集群不可用,只有当原始主节点恢复时,集群才可用。(由 cluster-require-full-coverage 设置决定)

  5. cluster-migration-barrier [count]
    每个主节点拥有的最小从节点才可以执行故障迁移。默认值为 1,表示当主节点至少有一个从节点才会进行故障迁移。要禁用迁可,只需设置为一个超大的值即可。可设置为 0,但仅用于调试,生产环境是危险的。

  6. cluster-require-full-coverage [yes/no]
    默认值是 yes, 如果集群节点只要检测到一个哈希槽未被覆盖(没有可用节点提供为其提供服务),则整个集群将停止接受写入/查询处理;若再次覆盖所有哈希槽,集群将自动恢复。
    若希望集群子节点继续接受对仍覆盖的哈希槽提供查询,可设置为no

创建集群

创建 Redis 集群,最低配置 3 个主节点,3个从节点,一主至少一从的架构。

  1. 创建 6 个目录,以端口号命名,将安装 Redis 生成的 bin 目录复制到这 6 个目录。

    6379 6380 6381 26379 26380 26381

  2. 配置集群, 在 redis.conf 文件中,集群的基本配置如下,其它节点复制配置修改配置文件,修改端口号。注意不要与 10000 + [port] 端冲突

    #端口
    port 6379
    
    #后台运行
    daemonize yes
    
    #pid文件
    pidfile /var/run/redis_<port>.pid
    
    #日志文件
    logfile ../log/<port>.log
    
    #开启集群
    cluster-enabled yes
    
    #集群配置文件
    cluster-config-file nodes_<port>.conf
    
    #集群节点超时
    cluster-node-timeout 5000
    
    #开启AOF持久化
    appendonly yes
    
  3. 安装 Ruby
    gem install redis
    apt install ruby
    /var/lib/gems/2.5.0/gems/redis-4.0.3/lib/redis/client.rb

    DEFAULTS = {
          :url => lambda { ENV["REDIS_URL"] },
          :scheme => "redis",
          :host => "127.0.0.1",
          :port => 6379,
          :path => nil,
          :timeout => 5.0,
          :password => "123456",
          :db => 0,
          :driver => nil,
          :id => nil,
          :tcp_keepalive => 0,
          :reconnect_attempts => 1,
          :reconnect_delay => 0,
          :reconnect_delay_max => 0.5,
          :inherit_socket => false
        }
    

    redis-server-start-all.sh

    cd 6379/
    ./redis-server redis.conf
    cd ../26379/
    ./redis-server redis.conf
    
    cd ../6380/
    ./redis-server redis.conf
    cd ../26380/
    ./redis-server redis.conf
    cd ../6381/
    ./redis-server redis.conf
    cd ../26381/
    ./redis-server redis.conf
    
  4. 创建副本
      ./redis-trib.rb create --replicas 1 10.0.3.4:6379 10.0.3.4:26379 10.0.3.4:6380 10.0.3.4:26380 10.0.3.4:6381 10.0.3.4:26381
      ./redis-cli -c -p 7000 -a passwd123
    

相关参考

https://www.zhihu.com/question/21419897

更多内容请访问:IT源点

全部评论: 0

    我有话说: