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

    Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施(installation)。

    Redis 集群不支持那些需要同时处理多个键的 Redis 命令, 因为执行这些命令需要在多个 Redis 节点之间移动数据, 并且在高负载的情况下, 这些命令将降低 Redis 集群的性能, 并导致不可预测的行为。

    Redis 集群通过分区(partition)来提供一定程度的可用性(availability): 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。

    Redis 集群提供了以下两个好处:

    • 将数据自动切分(split)到多个节点的能力。
    • 当集群中的一部分节点失效或者无法进行通讯时, 仍然可以继续处理命令请求的能力。 

    总而言之,redis集群实现了数据的共享以及去中心化。

     一、Redis集群搭建

      环境:两台主机

        第一台:192.168.11.6(三个实例)

        第二台:192.168.11.7(三个实例)

    1、第一台机器配置

    复制代码
    [root@bi6 ~]# mkdir redis-conf
    [root@bi6 ~]# touch /root/redis-conf/6379.conf 6380.conf 6381.conf  #创建多实例数据目录
    [root@bi6 ~]# vim redis-conf/6379.conf #编辑文件并且把以下内容拷贝进去
    ###########################################
    port 6379                 #绑定端口
    bind 192.168.11.7            #绑定对外连接提供的IP
    daemonize yes               #开启守护进程
    pidfile 6379.pid             #进程文件名
    cluster-enabled yes           #是否是集群
    cluster-config-file 6379_node.conf  #集群配置文件
    cluster-node-timeout 15000       #集群连接超时时间
    appendonly yes               #数据持久化类型
    #############################################
    [root@bi6 ~]# redis-server redis-conf/6379.conf   #启动三个Redis实例
    12958:C 21 Sep 2019 21:01:46.146 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    12958:C 21 Sep 2019 21:01:46.146 # Redis version=5.0.0, bits=64, commit=00000000, modified=0, pid=12958, just started
    12958:C 21 Sep 2019 21:01:46.146 # Configuration loaded
    [root@bi6 ~]# redis-server redis-conf/6380.conf
    12963:C 21 Sep 2019 21:02:02.679 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    12963:C 21 Sep 2019 21:02:02.679 # Redis version=5.0.0, bits=64, commit=00000000, modified=0, pid=12963, just started
    12963:C 21 Sep 2019 21:02:02.679 # Configuration loaded
    [root@bi6 ~]# redis-server redis-conf/6381.conf
    12968:C 21 Sep 2019 21:02:08.393 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    12968:C 21 Sep 2019 21:02:08.393 # Redis version=5.0.0, bits=64, commit=00000000, modified=0, pid=12968, just started
    12968:C 21 Sep 2019 21:02:08.393 # Configuration loaded
    [root@bi6 ~]# ss -tnl
    State      Recv-Q Send-Q Local Address:Port               Peer Address:Port              
    LISTEN     0      128    192.168.11.6:6379                 *:*                  
    LISTEN     0      128    192.168.11.6:6380                 *:*                  
    LISTEN     0      128    192.168.11.6:6381                 *:*                  
    LISTEN     0      128      *:22                   *:*                  
    LISTEN     0      128    192.168.11.6:16379                *:*                  
    LISTEN     0      128    192.168.11.6:16380                *:*                  
    LISTEN     0      128    192.168.11.6:16381                *:*                  
    LISTEN     0      128     :::22                  :::*                  
    复制代码

    2、第二台机器配置

      配置如同第一台机器

    3、安装RVM

      实现redis cluster功能,依赖redis-trib.rb,而这个工具是依赖一个ruby开发工具包的,所以需要安装ruby环境,并安装依赖包

      redis需要的Ruby版本最低是2.2.2,但是CentOS7 yum库中ruby的版本支持到 2.0.0,可gem 安装redis需要最低是2.2.2,采用rvm来更新ruby:

    复制代码
    安装RVM
     1.curl -L get.rvm.io | bash -s stable 
    
     2.find / -name rvm -print(此时可能出现问题)
    
     3.如果报错执行(4,5步)
    
     4.curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -
    
     5.curl -sSL https://rvm.io/pkuczynski.asc | gpg2 --import -
    
     6.出现如下内容代表成功
        /usr/local/rvm
        /usr/local/rvm/src/rvm
        /usr/local/rvm/src/rvm/bin/rvm
        /usr/local/rvm/src/rvm/lib/rvm
        /usr/local/rvm/src/rvm/scripts/rvm
        /usr/local/rvm/bin/rvm
        /usr/local/rvm/lib/rvm
        /usr/local/rvm/scripts/rvm
    
    7.使刚安装的rvm立即生效
      source /usr/local/rvm/scripts/rvm

    8.安装一个ruby版本   rvm install 2.4.1  #(下载有点慢) 9.使用一个ruby版本   rvm use 2.4.1 10.设置默认ruby版本   rvm use 2.4.1 --default 11.gem install redis 12.redis-cli --cluster create 192.168.11.7:6379 192.168.11.7:6380 192.168.11.7:6381 192.168.11.6:6379 192.168.11.6:6380 192.168.11.6:6381 --cluster-replicas 1
    复制代码


    或者可以选择编译安装ruby:

    复制代码
    1. 上传安装包
    2. 编译安装
        ./configure --prefix=/usr/local/ruby && make && make install
    3. 安装Redis-trib.rb的依赖
        ln -s /usr/local/ruby/bin/gem /usr/bin
        gem install -l redis-3.3.0.gem
        ln -s /usr/local/ruby/bin/ruby /usr/bin
    复制代码

    以下是基于编译安装的步骤:

    4、获取集群帮助

    只需要输入redis-trib.rb回车即可

    复制代码
    [root@bi6 ~]# redis-trib.rb 
    Usage: redis-trib <command> <options> <arguments ...>
    
      create          host1:port1 ... hostN:portN
                      --replicas <arg>
      check           host:port
      info            host:port
      fix             host:port
                      --timeout <arg>
      reshard         host:port
                      --from <arg>
                      --to <arg>
                      --slots <arg>
                      --yes
                      --timeout <arg>
                      --pipeline <arg>
      rebalance       host:port
                      --weight <arg>
                      --auto-weights
                      --use-empty-masters
                      --timeout <arg>
                      --simulate
                      --pipeline <arg>
                      --threshold <arg>
      add-node        new_host:new_port existing_host:existing_port
                      --slave
                      --master-id <arg>
      del-node        host:port node_id
      set-timeout     host:port milliseconds
      call            host:port command arg arg .. arg
      import          host:port
                      --from <arg>
                      --copy
                      --replace
      help            (show this help)
    
    For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.
    复制代码

    二、创建Redis集群

      命令的意义如下:
      (1)给定 redis-trib.rb 程序的命令是 create , 这表示我们希望创建一个新的集群。
      (2)选项 --replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。
      (3)之后跟着的其他参数则是实例的地址列表, 我们希望程序使用这些地址所指示的实例来创建新集群。
      简单来说, 以上命令的意思就是让 redis-trib 程序创建一个包含三个主节点和三个从节点的集群。
      接着, redis-trib 会打印出一份预想中的配置给你看, 如果你觉得没问题的话, 就可以输入 yes , redis-trib 就会将这份配置应用到集群当中:

    redis-trib.rb create --replicas 1 10.220.5.137:6379 10.220.5.137:6380 10.220.5.137:6381 10.220.5.137:6382 10.220.5.137:6383 10.220.5.137:6384

    三、Redis集群的简单测试

    测试 Redis 集群比较简单的办法就是使用 redis-rb-cluster 或者 redis-cli

    1、登录集群

     一定要加个-c,后面输入哪个端口都可以,这就是redis的区中心化思想

    redis-cli -c -h 10.220.5.137 -p 6379

    2、创建key(可以发现创建的key被分配到了不同的节点)

    3、获取key(在没有key的节点上,依然会get到对应key的值)

    四、在集群中添加新的节点

    1、创建一个新的实例

    2、添加该节点到集群中

    命令中的 add-node 表示我们要让 redis-trib 将一个节点添加到集群里面, add-node 之后跟着的是新节点的 IP 地址和端口号, 再之后跟着的是集群中任意一个已存在节点的 IP 地址和端口号, 这里我们使用的是 10.220.5.137:6379 。

    redis-trib.rb add-node 10.220.5.137:6385 10.220.5.137:6379

    3、查看

    通过 cluster nodes 命令, 我们可以确认新节点10.220.5.137:6385 已经被添加到集群里面了

    4、使新添加的新节点为从节点

    如果我们打算让新节点成为 10.220.5.137:6379 的从节点, 那么我们只要用客户端连接上新节点, 然后执行以下命令就可以了

    redis-cli -c -h 10.220.5.137 -p 6385

    五、对Redis中的数据做重新分片

    redis-trib.rb reshard 10.220.5.137:6379

     你只需要指定集群中其中一个节点的地址, redis-trib 就会自动找到集群中的其他节点。

    How many slots do you want to move (from 1 to 16384)? 1000

    我们将打算移动的槽数量设置为 1000 个。

    What is the receiving node ID? 3a9aa9592afc594c7e4206cc82ffb37d46a5b23d

    定目标需要使用节点的 ID , 而不是 IP 地址和端口。 比如说, 我们打算使用集群的第一个主节点来作为目标, 它的 IP 地址和端口是 10.220.5.137:6380 , 而节点 ID 则是3a9aa9592afc594c7e4206cc82ffb37d46a5b23d , 那么我们应该向 redis-trib 提供节点的 ID 

    Source node #1:ffadc66b51b6c87ad3c5a33dc9ec39f984bb80e8

    接着, redis-trib 会向你询问重新分片的源节点(source node), 也即是, 要从哪个节点中取出 1000 个哈希槽, 并将这些槽移动到目标节点上面。

    Source node #2:done
    Do you want to proceed with the proposed reshard plan (yes/no)? yes

    输入 yes 并使用按下回车之后, redis-trib 就会正式开始执行重新分片操作, 将指定的哈希槽从源节点一个个地移动到目标节点上面。

    在重新分片操作执行完毕之后, 可以使用以下命令来检查集群是否正常

    redis-trib.rb check 10.220.5.137:6379

    六、删除节点

    如果节点中有slot,那么需要先将slot 执行reshard给其他节点,然后才能执行删除操作

    1、删除空slot

    redis-trib.rb del-node 10.220.5.137:6379

    2、删除带有slot的节点

    需要重新分片

    redis-trib.rb reshard 10.220.5.137:6379

    再检查slot是否为空,之后再执行删除命令

  • 相关阅读:
    Java中一对多映射关系(转)
    java映射一对一关系 (转)
    如何创建JUnit
    Java数组转置
    get与post方法(吴老师整理)
    后台获得数据
    JDK1.8的安装与卸载
    使用JSP输出九九乘法表
    foreach
    匿名内部类
  • 原文地址:https://www.cnblogs.com/biht/p/11720637.html
Copyright © 2011-2022 走看看