• Redis集群研究和实践(基于redis 3.2.5)(一)


    前言

    Redis 是我们目前大规模使用的缓存中间件,由于它强大高效而又便捷的功能,得到广泛的使
    用。
    Redis在2015年发布了3.0.0,官方支持了redis cluster。至此结束了redis没有集群的时代,之
    前使用的redis cluster 最多的是twitter发布的Twemproxy
    还有就是豌豆荚开发的codis

    1 redis cluster 理论知识

    ** Redis Cluster设计要点**
    redis cluster在设计的时候,就考虑到了去中心化,去中间件,也就是说,集群中的每个节点
    都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和
    其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个
    节点,就可以获取到其他节点的数据。

    那么redis 是如何合理分配这些节点和数据的呢?

    Redis Cluster没有使用传统的一致性哈希来分配数据,而是采用另外一种叫
    做 哈希槽(hash slot) 的方式来分配的。 redis cluster 默认分配了16384个 slot ,当我
    们 set 一个 key 时,会采用 CRC16 算法来 取模 得到所属的 slot ,然后将这个 key 分到哈希槽
    区间的节点上,具体算法就是: CRC16(key) % 16384 。
    注意的是:必须要3个以上的主节点,否则创建集群时会失败。

    所以,我们假设现在有3个节点已经部署成 redis cluster ,分别是:A,B,C三个节点,他们
    可以是一台机器上的三个端口,也可以是三台不同的服务器,那么采用哈希槽 (hash slot) 的
    方式来分配16384个slot,它们三个节点分别承担的 slot 区间是:
    节点A覆盖0-5460;
    节点B覆盖5461-10922;
    节点C覆盖10923-16383.
    在这里插入图片描述

    那么,现在我想设置一个 key ,比如叫 my_name :

    set my_name linux
    
    • 1

    按照 redis cluster 的哈希槽算法: CRC16(‘my_name’)%16384 = 2412 。 那么就会把这个
    key 的存储分配到 A 上了。
    同样,当连接(A,B,C)任何一个节点想获取 my_name 这个 key 时,也会这样的算法,然后内部
    跳转到B节点上获取数据。
    这种哈希槽的分配方式有好也有坏,好处就是很清晰,比如想新增一个节点
    D, redis cluster 的这种做法是从各个节点的前面各拿取一部分 slot 到D上,会在接下来
    的实践中实验。大致就会变成这样:
    节点A覆盖1365-5460
    节点B覆盖6827-10922
    节点C覆盖12288-16383
    节点D覆盖0-1364,5461-6826,10923-12287
    同样删除一个节点也是类似,移动完成后就可以删除这个节点了。
    所以redis cluster 就是这样的一个形状:
    在这里插入图片描述

    2 Redis Cluster主从模式

    redis cluster 为了保证数据的高可用性,加入了主从模式,一个主节点对应一个或多个从
    节点,主节点提供数据存取,从节点则是从主节点拉取数据备份,当这个主节点挂掉后,就会
    有这个从节点选取一个来充当主节点,从而保证集群不会挂掉。

    上面例子里, 集群有ABC三个主节点,如果这3个节点都没有加入从节点,如果B挂掉了,我们就
    无法访问整个集群了。A和C的 slot 也无法访问。

    所以在集群建立的时候,一定要为每个主节点都添加了从节点, 比如像这样, 集群包含主节点
    A、B、C, 以及从节点A1、B1、C1, 那么即使B挂掉系统也可以继续正确工作。

    B1节点替代了B节点,所以Redis集群将会选择B1节点作为新的主节点,集群将会继续正确地
    提供服务。 当B重新开启后,它就会变成B1的从节点。

    不过需要注意,如果节点B和B1同时挂了,Redis集群就无法继续正常的提供服务了。

    3 redis cluster 实践

    按照官方的教程,全程再演示一次,官方教程是在一台机器上启动6个节点,3个主,3个从
    (http://redis.io/topics/cluster-tutorial):
    下载官方的redis 版本(3.2.5) :

    wget http://download.redis.io/releases/redis-3.2.5.tar.gz
    
    • 1

    解压

    [root@web3 ~]# tar zxvf redis-3.2.5.tar.gz
    
    • 1

    安装

    [root@web3 ~]# cd redis-3.2.5
    [root@web3 ~]# make && make install
    
    • 1
    • 2

    将redis-trib.rb 复制到/usr/local/bin

    [root@web3 redis-3.2.5]# cd src/
    [root@web3 src]# cp redis-trib.rb /usr/local/bin
    
    • 1
    • 2

    开始集群搭建

    [root@web3 redis-3.2.5]# vi redis.conf
     #修改以下地方
    port 7000
    cluster-enabled yes
    cluster-config-file nodes.conf
    cluster-node-timeout 5000
    appendonly yes
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    新建6个节点:

    将redis.conf 分别拷贝到这6个文件夹中,并修改成对应的端口号

    [root@web3 redis-3.2.5]# mkdir -p /usr/local/cluster-test
    [root@web3 redis-3.2.5]# cd /usr/local/cluster-test/
    [root@web3 cluster-test]# mkdir 7000
    [root@web3 cluster-test]# mkdir 7001
    [root@web3 cluster-test]# mkdir 7002
    [root@web3 cluster-test]# mkdir 7003
    [root@web3 cluster-test]# mkdir 7004
    [root@web3 cluster-test]# mkdir 7005
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    拷贝配置文件

    [root@web3 cluster-test]# cp /root/redis-3.2.5/redis.conf /usr/local/c
    luster-test/7000
    [root@web3 cluster-test]# cp /root/redis-3.2.5/redis.conf /usr/local/c
    luster-test/7001
    [root@web3 cluster-test]# cp /root/redis-3.2.5/redis.conf /usr/local/c
    luster-test/7002
    [root@web3 cluster-test]# cp /root/redis-3.2.5/redis.conf /usr/local/c
    luster-test/7003
    [root@web3 cluster-test]# cp /root/redis-3.2.5/redis.conf /usr/local/c
    luster-test/7004
    [root@web3 cluster-test]# cp /root/redis-3.2.5/redis.conf /usr/local/c
    luster-test/7005
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    修改端口号

    [root@web3 cluster-test]# sed -i "s/7000/7001/g"
    /usr/local/cluster-test/7001/redis.conf
    [root@web3 cluster-test]# sed -i "s/7000/7002/g"
    /usr/local/cluster-test/7002/redis.conf
    [root@web3 cluster-test]# sed -i "s/7000/7003/g"
    /usr/local/cluster-test/7003/redis.conf
    [root@web3 cluster-test]# sed -i "s/7000/7004/g"
    /usr/local/cluster-test/7004/redis.conf
    [root@web3 cluster-test]# sed -i "s/7000/7005/g"
    /usr/local/cluster-test/7005/redis.conf
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    启动这6个节点

    [root@web3 cluster-test]# cd /usr/local/cluster-test/7000/
    [root@web3 7000]# redis-server redis.conf
    [root@web3 7000]# cd ../7001
    [root@web3 7001]# redis-server redis.conf
    [root@web3 7001]# cd ../7002
    [root@web3 7002]# redis-server redis.conf
    [root@web3 7002]# cd ../7003
    [root@web3 7003]# redis-server redis.conf
    [root@web3 7003]# cd ../7004
    [root@web3 7004]# redis-server redis.conf
    [root@web3 7004]# cd ../7005
    [root@web3 7005]# redis-server redis.conf
    [root@web3 7005]#
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    查看6个节点的启动进程情况:

    [root@web3 7005]# ps -ef|grep redis
    root 11380 1 0 07:37 ? 00:00:00 redis-server *:7000
    [cluster]
    root 11384 1 0 07:37 ? 00:00:00 redis-server *:7001
    [cluster]
    root 11388 1 0 07:37 ? 00:00:00 redis-server *:7002
    [cluster]
    root 11392 1 0 07:37 ? 00:00:00 redis-server *:7003
    [cluster]
    root 11396 1 0 07:37 ? 00:00:00 redis-server *:7004
    [cluster]
    root 11400 1 0 07:37 ? 00:00:00 redis-server *:7005
    [cluster]
    root 11404 8259 0 07:38 pts/0 00:00:00 grep redis
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    将6个节点连在一起构成集群

    需要用到的命令就是redis-trib.rb,这是官方的一个用ruby写的一个操作redis cluster的
    命令,所以,你的机器上需要安装ruby。我们先试一下这个命令:

    redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0
    .1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
    
    • 1
    • 2

    因为我们要新建集群, 所以这里使用create命令. --replicas 1 参数表示为每个主节点创建
    一个从节点. 其他参数是实例的地址集合。

    [root@web3 7005]# yum install ruby ruby-devel rubygems rpm-build
    [root@web3 7005]# gem install redis
    Successfully installed redis-3.2.1
    1 gem installed
    Installing ri documentation for redis-3.2.1...
    Installing RDoc documentation for redis-3.2.1...
    [root@web3 7005]# redis-trib.rb create --replicas 1 127.0.0.1:7000
    127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7
    005
    >>> Creating cluster
    Connecting to node 127.0.0.1:7000: OK
    Connecting to node 127.0.0.1:7001: OK
    Connecting to node 127.0.0.1:7002: OK
    Connecting to node 127.0.0.1:7003: OK
    Connecting to node 127.0.0.1:7004: OK
    Connecting to node 127.0.0.1:7005: OK
    >>> Performing hash slots allocation on 6 nodes...
    Using 3 masters:
    127.0.0.1:7000
    127.0.0.1:7001
    127.0.0.1:7002
    Adding replica 127.0.0.1:7003 to 127.0.0.1:7000
    Adding replica 127.0.0.1:7004 to 127.0.0.1:7001
    Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
    M: 3707debcbe7be66d4a1968eaf3a5ffaf4308efa4 127.0.0.1:7000
    slots:0-5460 (5461 slots) master
    M: cb5c04b6160c3b7e18cad5d49d8e2987b27e0d6c 127.0.0.1:7001
    slots:5461-10922 (5462 slots) master
    M: dfa0754c7854a874a6ebd2613b86140ad97701fc 127.0.0.1:7002
    slots:10923-16383 (5461 slots) master
    S: d2237fdcfbba672de766b913d1186cebcb6e1761 127.0.0.1:7003
    replicates 3707debcbe7be66d4a1968eaf3a5ffaf4308efa4
    S: 4b4aef8b48c427a3c903518339d53b6447c58b93 127.0.0.1:7004
    replicates cb5c04b6160c3b7e18cad5d49d8e2987b27e0d6c
    S: 30858dbf483b61b9838d5c1f853a60beaa4e7afd 127.0.0.1:7005
    replicates dfa0754c7854a874a6ebd2613b86140ad97701fc
    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 127.0.0.1:7000)
    M: 3707debcbe7be66d4a1968eaf3a5ffaf4308efa4 127.0.0.1:7000
    slots:0-5460 (5461 slots) master
    M: cb5c04b6160c3b7e18cad5d49d8e2987b27e0d6c 127.0.0.1:7001
    slots:5461-10922 (5462 slots) master
    M: dfa0754c7854a874a6ebd2613b86140ad97701fc 127.0.0.1:7002
    slots:10923-16383 (5461 slots) master
    M: d2237fdcfbba672de766b913d1186cebcb6e1761 127.0.0.1:7003
    slots: (0 slots) master
    replicates 3707debcbe7be66d4a1968eaf3a5ffaf4308efa4
    M: 4b4aef8b48c427a3c903518339d53b6447c58b93 127.0.0.1:7004
    slots: (0 slots) master
    replicates cb5c04b6160c3b7e18cad5d49d8e2987b27e0d6c
    M: 30858dbf483b61b9838d5c1f853a60beaa4e7afd 127.0.0.1:7005
    slots: (0 slots) master
    replicates dfa0754c7854a874a6ebd2613b86140ad97701fc
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.
    
    • 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
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61

    期待下次的分享,别忘了三连支持博主呀~
    我是 念舒_C.ying ,期待你的关注~💪💪💪

  • 相关阅读:
    C语言--求一个 3 X 3 的整型矩阵对角线元素之和
    k8s学习--Secret详细解释与应用
    李m圆申论
    dotnet 探究 SemanticKernel 的 planner 的原理
    谷粒商城实战(044集群学习-redis集群)
    Linux启动过程详解 Xmind导图笔记
    pinia原理
    【算法练习Day8】 kmp算法&&找出字符串中第一个匹配项的下标&&反转字符串中的单词&&重复的子字符串
    Linux学习——exec函数族和守护进程
    深度学习入门:基于Python的理论与实现
  • 原文地址:https://blog.csdn.net/qq_52716296/article/details/126659396