• Redis集群概念与搭建


    概述

    存在问题

    1. 容量不够,redis如何进行扩容?
    2. 并发写操作,redis如何分摊?
    3. 主从模式,薪火相传模式,主机宕机,导致ip地址发送变化,应用程序中配置需要修改对应的主机地址、端口等信息。
      之前通过代理主机来解决,但是redis3.0中提供了解决方案,就是无中心化集群配置。
      在这里插入图片描述

    什么是集群

    Redis集群实现了对Redis的水平扩容,即启动了N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N。
    Redis集群通过分区(partition)来提供一定程度的可用性(availablitity):即使集群中有一部分节点失效或者无法进行通讯,集群也可以继续处理命令请求。

    集群搭建

    制作6个redis实例,6379、6380、6381、6389、6390、6391

    配置基本信息

    • 开启daemonize yes;
    • 修改pid文件名字;
    • 修改端口;
    • 修改log文件名称(可以不改);
    • 修改dbfilename
      改动的配置如下:
    daemonize yes
    pidfile "/var/run/redis_6379.pid"
    port 6379
    dbfilename "dump6379.rdb"
    
    • 1
    • 2
    • 3
    • 4

    redis cluster配置修改

    • cluster-enabled yes 打开集群模式
    • cluster-config-file nodes-6379.conf 设定节点配置文件名
    • cluster-node-timeout 1500 设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换。
    daemonize yes
    pidfile "/var/run/redis_6379.pid"
    port 6379
    dbfilename "dump6379.rdb"
    
    cluster-enabled yes
    cluster-config-file nodes-6379.conf
    cluster-node-timeout 15000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    启动redis集群实例

    在这里插入图片描述
    集群中配置的cluster-config-file文件自动生成。
    在这里插入图片描述

    将6个节点合成一个集群

    组合之前,请确保所有的redis实例启动,nodes-xxx.conf文件都生成正常。
    进入redis源文件目录。(redis低版本需要安装rb环境)。
    重点配置解析

    # 此处不要用127.0.0.1,请用真实ip地址
    # --cluster-replicas 1 表示采用最简单的方式配置集群,一台主机,一台从机,正好三组。
    [root@master src]# redis-cli --cluster create --cluster-replicas 1 192.168.230.128:6379 192.168.230.128:6380 192.168.230.128:6381 192.168.230.128:6389 192.168.230.128:6390 192.168.230.128:6391 
    
    • 1
    • 2
    • 3

    具体配置结果如下:

    [root@master src]# pwd
    /usr/local/bin/redis/src
    # 此处不要用127.0.0.1,请用真实ip地址
    [root@master src]# redis-cli --cluster create --cluster-replicas 1 192.168.230.128:6379 192.168.230.128:6380 192.168.230.128:6381 192.168.230.128:6389 192.168.230.128:6390 192.168.230.128:6391 
    >>> Performing hash slots allocation on 6 nodes...
    Master[0] -> Slots 0 - 5460
    Master[1] -> Slots 5461 - 10922
    Master[2] -> Slots 10923 - 16383
    Adding replica 192.168.230.128:6390 to 192.168.230.128:6379
    Adding replica 192.168.230.128:6391 to 192.168.230.128:6380
    Adding replica 192.168.230.128:6389 to 192.168.230.128:6381
    >>> Trying to optimize slaves allocation for anti-affinity
    [WARNING] Some slaves are in the same host as their master
    M: 7613a39531e47a6ff6fd56983cdae88e5d9df94a 192.168.230.128:6379
       slots:[0-5460] (5461 slots) master
    M: 70c1e43570d7bc31e90e47e4220d428ac7f4816c 192.168.230.128:6380
       slots:[5461-10922] (5462 slots) master
    M: b34b9c9224c937d8078395ceb5448fe6ebd23273 192.168.230.128:6381
       slots:[10923-16383] (5461 slots) master
    S: fb8df6c560b021bf7d1aa883791888d59d8fed01 192.168.230.128:6389
       replicates b34b9c9224c937d8078395ceb5448fe6ebd23273
    S: a89052128eec0c4b1aab900255ae60047ceafb8f 192.168.230.128:6390
       replicates 7613a39531e47a6ff6fd56983cdae88e5d9df94a
    S: 11097faa158e438842c12cbcd71d498abec61783 192.168.230.128:6391
       replicates 70c1e43570d7bc31e90e47e4220d428ac7f4816c
    Can I set the above configuration? (type 'yes' to accept): yes
    >>> 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 192.168.230.128:6379)
    M: 7613a39531e47a6ff6fd56983cdae88e5d9df94a 192.168.230.128:6379
       slots:[0-5460] (5461 slots) master
       1 additional replica(s)
    M: 70c1e43570d7bc31e90e47e4220d428ac7f4816c 192.168.230.128:6380
       slots:[5461-10922] (5462 slots) master
       1 additional replica(s)
    S: a89052128eec0c4b1aab900255ae60047ceafb8f 192.168.230.128:6390
       slots: (0 slots) slave
       replicates 7613a39531e47a6ff6fd56983cdae88e5d9df94a
    M: b34b9c9224c937d8078395ceb5448fe6ebd23273 192.168.230.128:6381
       slots:[10923-16383] (5461 slots) master
       1 additional replica(s)
    S: 11097faa158e438842c12cbcd71d498abec61783 192.168.230.128:6391
       slots: (0 slots) slave
       replicates 70c1e43570d7bc31e90e47e4220d428ac7f4816c
    S: fb8df6c560b021bf7d1aa883791888d59d8fed01 192.168.230.128:6389
       slots: (0 slots) slave
       replicates b34b9c9224c937d8078395ceb5448fe6ebd23273
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.
    [root@master src]# 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    客户端连接

    • 通过普通方式连接
      只能看到本实例的数据。
    [root@master src]# redis-cli -p 6379
    127.0.0.1:6379> get a
    (error) MOVED 15495 192.168.230.128:6381
    127.0.0.1:6379> get b
    "11"
    127.0.0.1:6379> 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 采用集群策略连接,设置数据会自动切换到相应的写主机
    [root@master src]# redis-cli -c -p 6379
    127.0.0.1:6379> get a
    -> Redirected to slot [15495] located at 192.168.230.128:6381
    "10"
    192.168.230.128:6381> get b
    -> Redirected to slot [3300] located at 192.168.230.128:6379
    "11"
    192.168.230.128:6379> keys *
    1) "b"
    192.168.230.128:6379> 
    
    # 查看集群节点信息
    192.168.230.128:6379> cluster nodes
    70c1e43570d7bc31e90e47e4220d428ac7f4816c 192.168.230.128:6380@16380 master - 0 1659536510264 2 connected 5461-10922
    a89052128eec0c4b1aab900255ae60047ceafb8f 192.168.230.128:6390@16390 slave 7613a39531e47a6ff6fd56983cdae88e5d9df94a 0 1659536508000 5 connected
    b34b9c9224c937d8078395ceb5448fe6ebd23273 192.168.230.128:6381@16381 master - 0 1659536508249 3 connected 10923-16383
    11097faa158e438842c12cbcd71d498abec61783 192.168.230.128:6391@16391 slave 70c1e43570d7bc31e90e47e4220d428ac7f4816c 0 1659536507241 6 connected
    7613a39531e47a6ff6fd56983cdae88e5d9df94a 192.168.230.128:6379@16379 myself,master - 0 1659536506000 1 connected 0-5460
    fb8df6c560b021bf7d1aa883791888d59d8fed01 192.168.230.128:6389@16389 slave b34b9c9224c937d8078395ceb5448fe6ebd23273 0 1659536509257 4 connected
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 使用图形化客户端连接
      在这里插入图片描述

    集群如何分配节点

    一个集群至少要有三个主节点。
    选项–cluster-replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。
    分配原则尽量保证每个主数据库运行在不同的IP地址上,每个从库和主库不在一个IP地址上。

    什么是slots

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

    一个Redis集群包含16384个插槽(hash slot),数据库中的每个键都属于这16384个插槽的其中的一个。
    集群使用公式CRC16(key)%16384来计算键key属于哪个槽,其中CRC16(key)语句用于计算键key的CRC16校验和。
    集群中的每个节点负责处理一部分插槽。举个例子,如果一个集群可以有主节点,其中:
    节点A负责处理0号至5460号插槽。
    节点B负责处理5461号至10922号插槽。
    节点C负责处理10923号至16383号插槽。
    在这里插入图片描述
    每个插槽可以存放多个key-value键值对。

    故障恢复

    • 如果主节点下线,从节点15s超时后自动升为主节点。
    • 原先下线的主节点恢复后,主节点变成了从节点。
    • 如果某一段插槽的主从节点都宕机,redis服务是否还能继续?
      答:如果某一段插槽的主从节点都挂掉,而cluster-require-full-coverage为yes,那么整个集群都挂掉。
      如果某一段插槽的主从都挂掉,而cluster-require-full-coverage为no,那么,该段插槽的数据全都不能使用,也无法存储;其他节点的插槽可以正常使用。

    参考

    集群故障恢复

  • 相关阅读:
    求生之路2服务器搭建插件安装及详细的游戏参数配置教程windows
    scrapy--豆瓣top250--中间件
    FS4067 SOP8 5V输入两节锂电池升压型充电管理芯片
    【论文笔记_知识蒸馏_2021】PANets: Learning from the Universal Pixel Attention Networks
    NNDL实验 知识点梳理
    1385:团伙(group)
    idea设置gradle
    权限提升数据库(基于MySQL的UDF,MOF,启动项提权)
    hutool导出excel 设置单元格日期格式 poi设置excel单元格日期格式
    Uinux网络模型-IO模型
  • 原文地址:https://blog.csdn.net/tianzhonghaoqing/article/details/126131036