zoukankan      html  css  js  c++  java
  • Redis集群

    我叫张贺,贪财好色。一名合格的LINUX运维工程师,专注于LINUX的学习和研究,曾负责某中型企业的网站运维工作,爱好佛学和跑步。
    个人博客:传送阵
    笔者微信:zhanghe15069028807,非诚勿扰。

    Redis集群

    理论

    Redis集群起码是三个服务器做,每个服务器里面都有两个实例,两个实例并不能是单纯的一主一从,而是错开,防止一个服务器挂了之后,数据丢失,如下图所示:

    当集群安装好之后,会生成16384个槽位用于存储键值,其中0--5500在master1这个槽位上,5501--11000在master2槽位上,11001--16384在第三个槽位上,如下所示:

    当我们存储一个键值的时候,redis会通过一个公式计算出一个值,假如这个值 是6666的话,那么这个键值就存储到master2这个实例上,依次类推,存的时候是这样存,取的时候同样也是这样取。

    客户端在连接的时候无论连接哪一个节点都可以,如果本节点上没有要存取的键值的话,本节点会帮客户端转发,客户端不需要重新连接。

    万一其中的一个主挂了,并不是从立马主顶上,而是剩下的两个主一同投票来决定,并不是利用了“哨兵sentinel”的机制。

    安装

    我们操作的时候用一台服务器,然后开6个实例:7000-----7005

    [root@NFS ~]# yum -y install ruby rubygems
    
    //默认源在国外
    [root@NFS ~]# gem sources -l
    *** CURRENT SOURCES ***
    https://rubygems.org/
    
    //换成阿里云的
    [root@NFS ~]# gem sources -a https://mirrors.aliyun.com/rubygems/
    https://mirrors.aliyun.com/rubygems/ added to sources
    
    //移除原来的
    [root@NFS ~]# gem sources --remove https://rubygems.org/
    https://rubygems.org/ removed from sources
    
    //安装集群插件
    [root@NFS ~]# gem install redis -v 3.3.3
    Fetching: redis-3.3.3.gem (100%)
    Successfully installed redis-3.3.3
    Parsing documentation for redis-3.3.3
    Installing ri documentation for redis-3.3.3
    1 gem installed
    
    //只有一个源了
    [root@NFS ~]# gem sources -l
    *** CURRENT SOURCES ***
    
    https://mirrors.aliyun.com/rubygems/
    
    //节点准备
    mkdir /nosql/700{0..5}
    
    vim /nosql/7000/redis.conf
    port 7000
    daemonize yes
    pidfile /nosql/7000/redis.pid
    loglevel notice
    logfile "/nosql/7000/redis.log"
    dbfilename dump.rdb
    dir /nosql/7000
    protected-mode no
    cluster-enabled yes
    cluster-config-file nodes.conf
    cluster-node-timeout 5000
    appendonly yes
    
    vim /nosql/7001/redis.conf
    port 7001
    daemonize yes
    pidfile /nosql/7001/redis.pid
    loglevel notice
    logfile "/nosql/7001/redis.log"
    dbfilename dump.rdb
    dir /nosql/7001
    protected-mode no
    cluster-enabled yes
    cluster-config-file nodes.conf
    cluster-node-timeout 5000
    appendonly yes
    
    vim /nosql/7002/redis.conf
    port 7002
    daemonize yes
    pidfile /nosql/7002/redis.pid
    loglevel notice
    logfile "/nosql/7002/redis.log"
    dbfilename dump.rdb
    dir /nosql/7002
    protected-mode no
    cluster-enabled yes
    cluster-config-file nodes.conf
    cluster-node-timeout 5000
    appendonly yes
    
    vim /nosql/7003/redis.conf
    port 7003
    daemonize yes
    pidfile /nosql/7003/redis.pid
    loglevel notice
    logfile "/nosql/7003/redis.log"
    dbfilename dump.rdb
    dir /nosql/7003
    protected-mode no
    cluster-enabled yes
    cluster-config-file nodes.conf
    cluster-node-timeout 5000
    appendonly yes
    
    vim /nosql/7004/redis.conf
    port 7004
    daemonize yes
    pidfile /nosql/7004/redis.pid
    loglevel notice
    logfile "/nosql/7004/redis.log"
    dbfilename dump.rdb
    dir /nosql/7004
    protected-mode no
    cluster-enabled yes
    cluster-config-file nodes.conf
    cluster-node-timeout 5000
    appendonly yes
    
    vim /nosql/7005/redis.conf
    port 7005
    daemonize yes
    pidfile /nosql/7005/redis.pid
    loglevel notice
    logfile "/nosql/7005/redis.log"
    dbfilename dump.rdb
    dir /nosql/7005
    protected-mode no
    cluster-enabled yes
    cluster-config-file nodes.conf
    cluster-node-timeout 5000
    appendonly yes
    
    redis-server /nosql/7000/redis.conf
    redis-server /nosql/7001/redis.conf
    redis-server /nosql/7002/redis.conf
    redis-server /nosql/7003/redis.conf
    redis-server /nosql/7004/redis.conf
    redis-server /nosql/7005/redis.conf
    
    [root@NFS ~]# ps -ef | grep redis
    root      28437      1  0 14:07 ?        00:00:00 redis-server *:7000 [cluster]
    root      28450      1  0 14:09 ?        00:00:00 redis-server *:7001 [cluster]
    root      28452      1  0 14:09 ?        00:00:00 redis-server *:7002 [cluster]
    root      28456      1  0 14:09 ?        00:00:00 redis-server *:7003 [cluster]
    root      28458      1  0 14:09 ?        00:00:00 redis-server *:7004 [cluster]
    root      28466      1  0 14:09 ?        00:00:00 redis-server *:7005 [cluster]
    
    //将节点加入集群管理,--replicas 1代表一个主带一个从,前三个是主,后三个是对应的是从
    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
    
    >>> Creating cluster
    >>> 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: 7517120d8c2b37de8f94cfeb614d8032e24fc129 127.0.0.1:7000
       slots:0-5460 (5461 slots) master
    M: 367370edab7d5aef62fff5447f0f35e6ddbc8728 127.0.0.1:7001
       slots:5461-10922 (5462 slots) master
    M: cab39e65a84cbbb8db8ea6d6c04f998bba62876c 127.0.0.1:7002
       slots:10923-16383 (5461 slots) master
    S: 66af6f975ff30f4fa86dad5250fc2cbaa8dab592 127.0.0.1:7003
       replicates 7517120d8c2b37de8f94cfeb614d8032e24fc129
    S: bdc7a5dfc50b1d96f5510a5ee01b5ec85411c39a 127.0.0.1:7004
       replicates 367370edab7d5aef62fff5447f0f35e6ddbc8728
    S: 1a26aa7767c4db8ebe0cf0d937e6afc44eba531e 127.0.0.1:7005
       replicates cab39e65a84cbbb8db8ea6d6c04f998bba62876c
    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: 7517120d8c2b37de8f94cfeb614d8032e24fc129 127.0.0.1:7000
       slots:0-5460 (5461 slots) master
       1 additional replica(s)
    S: bdc7a5dfc50b1d96f5510a5ee01b5ec85411c39a 127.0.0.1:7004
       slots: (0 slots) slave
       replicates 367370edab7d5aef62fff5447f0f35e6ddbc8728
    S: 66af6f975ff30f4fa86dad5250fc2cbaa8dab592 127.0.0.1:7003
       slots: (0 slots) slave
       replicates 7517120d8c2b37de8f94cfeb614d8032e24fc129
    M: 367370edab7d5aef62fff5447f0f35e6ddbc8728 127.0.0.1:7001
       slots:5461-10922 (5462 slots) master
       1 additional replica(s)
    M: cab39e65a84cbbb8db8ea6d6c04f998bba62876c 127.0.0.1:7002
       slots:10923-16383 (5461 slots) master
       1 additional replica(s)
    S: 1a26aa7767c4db8ebe0cf0d937e6afc44eba531e 127.0.0.1:7005
       slots: (0 slots) slave
       replicates cab39e65a84cbbb8db8ea6d6c04f998bba62876c
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.
    
    上面的内容有对应关系:
    7000----7003
    7001----7004
    7002----7005
    
    注意还有槽位
    
    //查看集群主的状态
    [root@NFS ~]# redis-cli -p 7000 cluster nodes | grep master
    367370edab7d5aef62fff5447f0f35e6ddbc8728 127.0.0.1:7001 master - 0 1578378191503 2 connected 5461-10922
    cab39e65a84cbbb8db8ea6d6c04f998bba62876c 127.0.0.1:7002 master - 0 1578378191503 3 connected 10923-16383
    7517120d8c2b37de8f94cfeb614d8032e24fc129 127.0.0.1:7000 myself,master - 0 0 1 connected 0-5460
    
    //查看集群从的状态
    [root@NFS ~]# redis-cli -p 7000 cluster nodes | grep slave
    bdc7a5dfc50b1d96f5510a5ee01b5ec85411c39a 127.0.0.1:7004 slave 367370edab7d5aef62fff5447f0f35e6ddbc8728 0 1578378287351 5 connected
    66af6f975ff30f4fa86dad5250fc2cbaa8dab592 127.0.0.1:7003 slave 7517120d8c2b37de8f94cfeb614d8032e24fc129 0 1578378287855 4 connected
    1a26aa7767c4db8ebe0cf0d937e6afc44eba531e 127.0.0.1:7005 slave cab39e65a84cbbb8db8ea6d6c04f998bba62876c 0 1578378286845 6 connected
    

    管理

    增加新-主节点

    mkdir /nosql/7006
    mkdir /nosql/7007
    
    vim /nosql/7006/redis.conf
    port 7006
    daemonize yes
    pidfile /nosql/7006/redis.pid
    loglevel notice
    logfile "/nosql/7006/redis.log"
    dbfilename dump.rdb
    dir /nosql/7006
    protected-mode no
    cluster-enabled yes
    cluster-config-file nodes.conf
    cluster-node-timeout 5000
    appendonly yes
    
    vim /nosql/7007/redis.conf
    port 7007
    daemonize yes
    pidfile /nosql/7007/redis.pid
    loglevel notice
    logfile "/nosql/7007/redis.log"
    dbfilename dump.rdb
    dir /nosql/7007
    protected-mode no
    cluster-enabled yes
    cluster-config-file nodes.conf
    cluster-node-timeout 5000
    appendonly yes
    
    redis-server /nosql/7007/redis.conf
    redis-server /nosql/7006/redis.conf
    
    //把7006加入7000所在的集群
    redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000
    [ERR] Node 127.0.0.1:7006 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
    解决办法:进入新加入的节点,flushdb,然后shutdown,然后重启,再加一遍就会成功。
    //查看一下,7006没有槽位信息
    [root@NFS ~]# redis-cli -p 7000 cluster nodes | grep master
    367370edab7d5aef62fff5447f0f35e6ddbc8728 127.0.0.1:7001 master - 0 1578382465839 2 connected 5461-10922
    cab39e65a84cbbb8db8ea6d6c04f998bba62876c 127.0.0.1:7002 master - 0 1578382465333 3 connected 10923-16383
    7517120d8c2b37de8f94cfeb614d8032e24fc129 127.0.0.1:7000 myself,master - 0 0 1 connected 0-5460
    2860170269d03fc5c543eb33cbff0e2c54b26266 127.0.0.1:7006 master - 0 1578382464329 0 connected
    
    
    //转移一部分槽位(重新分片)给7006,让共平均分配,应该把运行中的应用在停止一下,计算一下用总的除以4等于4096
    redis-trib.rb reshard 127.0.0.1:7000
    How many slots do you want to move (from 1 to 16384)? 4096  #给新的节点多少槽位
    What is the receiving node ID? 2860170269d03fc5c543eb33cbff0e2c54b26266 #新节点的ID
    Please enter all the source node IDs.
      Type 'all' to use all the nodes as source nodes for the hash slots.
      Type 'done' once you entered all the source nodes IDs.
    Source node #1:all    #源是所有集群内节点
    Do you want to proceed with the proposed reshard plan (yes/no)? yes
    
    [root@NFS ~]# redis-cli -p 7000 cluster nodes | grep master  #每人给了一点
    367370edab7d5aef62fff5447f0f35e6ddbc8728 127.0.0.1:7001 master - 0 1578383170298 2 connected 6827-10922
    cab39e65a84cbbb8db8ea6d6c04f998bba62876c 127.0.0.1:7002 master - 0 1578383172313 3 connected 12288-16383
    7517120d8c2b37de8f94cfeb614d8032e24fc129 127.0.0.1:7000 myself,master - 0 0 1 connected 1365-5460
    2860170269d03fc5c543eb33cbff0e2c54b26266 127.0.0.1:7006 master - 0 1578383171810 7 connected 0-1364 5461-6826 10923-12287
    

    增加新-从节点

    [root@NFS ~]# redis-trib.rb add-node --slave --master-id 2860170269d03fc5c543eb33cbff0e2c54b26266 127.0.0.1:7007 127.0.0.1:7000
    [ERR] Node 127.0.0.1:7007 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
    把7007关闭,然后除了配置文件之外全部清除,最后重启,最后再加一次就成功了。
    
    [root@NFS 7007]# redis-cli -p 7000 cluster nodes | grep slave
    abdacebbecf2c4c948dec63601ff3f8eb6c5a64d 127.0.0.1:7007 slave 2860170269d03fc5c543eb33cbff0e2c54b26266 0 1578384755252 7 connected
    bdc7a5dfc50b1d96f5510a5ee01b5ec85411c39a 127.0.0.1:7004 slave 367370edab7d5aef62fff5447f0f35e6ddbc8728 0 1578384755756 5 connected
    66af6f975ff30f4fa86dad5250fc2cbaa8dab592 127.0.0.1:7003 slave 7517120d8c2b37de8f94cfeb614d8032e24fc129 0 1578384755756 4 connected
    1a26aa7767c4db8ebe0cf0d937e6afc44eba531e 127.0.0.1:7005 slave cab39e65a84cbbb8db8ea6d6c04f998bba62876c 0 1578384755252 6 connected
    
    

    删除节点

    删除节点7006之前,要把槽位移动走,不然把槽位也会一同给删除了,又要重新分片。

    redis-trib.rb reshard 127.0.0.1:7000
    # 移动多少,当时分配了4096个,现在也就要移动走这么多
    # 让你选择接收的节点,填7000的ID
    # 让你选择源节点,也就是要删除哪个节点,填7006的节点
    # done
    # yes
    
    [root@NFS ~]# redis-cli -p 7000 cluster nodes | grep master
    367370edab7d5aef62fff5447f0f35e6ddbc8728 127.0.0.1:7001 master - 0 1578385715675 2 connected 6827-10922
    cab39e65a84cbbb8db8ea6d6c04f998bba62876c 127.0.0.1:7002 master - 0 1578385716180 3 connected 12288-16383
    7517120d8c2b37de8f94cfeb614d8032e24fc129 127.0.0.1:7000 myself,master - 0 0 8 connected 0-6826 10923-12287
    2860170269d03fc5c543eb33cbff0e2c54b26266 127.0.0.1:7006 master - 0 1578385716683 7 connected
    
    //删除主节点
    [root@NFS ~]# redis-trib.rb del-node 127.0.0.1:7006 2860170269d03fc5c543eb33cbff0e2c54b26266
    
    [root@NFS ~]# redis-cli -p 7000 cluster nodes | grep slave
    abdacebbecf2c4c948dec63601ff3f8eb6c5a64d 127.0.0.1:7007 slave 7517120d8c2b37de8f94cfeb614d8032e24fc129 0 1578385840781 8 connected
    bdc7a5dfc50b1d96f5510a5ee01b5ec85411c39a 127.0.0.1:7004 slave 367370edab7d5aef62fff5447f0f35e6ddbc8728 0 1578385841286 5 connected
    66af6f975ff30f4fa86dad5250fc2cbaa8dab592 127.0.0.1:7003 slave 7517120d8c2b37de8f94cfeb614d8032e24fc129 0 1578385841286 8 connected
    1a26aa7767c4db8ebe0cf0d937e6afc44eba531e 127.0.0.1:7005 slave cab39e65a84cbbb8db8ea6d6c04f998bba62876c 0 1578385841790 6 connected
    
    //删除从节点
    [root@NFS ~]# redis-trib.rb del-node 127.0.0.1:7007 abdacebbecf2c4c948dec63601ff3f8eb6c5a64d
    
  • 相关阅读:
    Python超轻量数据库之SQLite
    Docker镜像管理透析
    Docker-Compose实战「下篇」
    Docker-Compose实战「上篇」
    Docker-Compose初体验
    Docker火遍全球!dockerfile构建你必须得会
    Docker轻量管理Dashboard
    MongoDB入门实操《上篇》
    用LinkedList完成一个堆栈MyStack.2
    [翻译] 基于.NET Core构建微服务 第五部分:Marten域聚合的理想仓库
  • 原文地址:https://www.cnblogs.com/yizhangheka/p/12162308.html
Copyright © 2011-2022 走看看