并发(四)之Redis:Redis集群(cluster)搭建

  |   0 评论   |   浏览

准备工作

5.0之前的版本的集群管理是通过redis-trib.rb,需要依赖ruby;4.0的版本下面测试出了集群管理的bug,经过排查,也得到了官方的证实;如果新搭建的集群,建议使用5.0+的版本;
5.0之后的版本,集群管理工具整合到redis-cli,就不需要依赖其他的资源;

  • 安装ruby(5.0+的版本不用安装)

    yum install -y ruby
    yum install -y rubygems
    gem install redis
    //自带的集群工具依赖于ruby
    

    file

    • ruby版本过低的问题并更新

      ERROR:  Error installing redis:
        redis requires Ruby version >= 2.3.0.
      

      file

    • 安装curl

      yum -y install curl
      
    • 安装rvm

      gpg2 --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3  
      curl -L get.rvm.io | bash -s stable 
      

      file

    • 如果报以上错,按上面的指令执行

      gpg2 --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
      command curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -
      command curl -sSL https://rvm.io/pkuczynski.asc | gpg2 --import -
      
    • 查询安装rvm

      curl -L get.rvm.io | bash -s stable
      

      file

    • 刷新环境变量

      source /etc/profile.d/rvm.sh
      
    • 查找并安装更新的版本

      rvm list known
      rvm install 2.3.3
      

      file

    • 使用并卸载老版本

      // 使用新安装的2.3.3
      rvm use 2.3.3
      // 将2.3.3设置为默认
      rvm use 2.3.3 --default
      // 删除默认的2.0.0版本
      rvm remove 2.0.0
      // 查看版本
      ruby --version
      

      file

    • 重新安装

      gem install redis
      

      file

基础Redis安装

任何版本的Redis都差不多,按这个
《并发之Redis(一):单机环境的安装(仅仅用于学习测试)》https://lupf.cn/articles/2020/04/06/1586153137483.html 安装

集群环境配置

  • 集群结构
    想要搭建集群,那么至少得需要3台机器,来实现3主(master)3从(slave)的高可用集群,如果出现了高并发或者更多的海量数据的情况,那么就横向扩展更多的master节点,来实现高可用、高并发、海量数据的集群file
单机配置

优先从cache0000开始,部署7001和7002;然后其他机器就配置就好了

  • 目录创建

    mkdir -p /etc/redis-cluster
    mkdir -p /var/redis-cluster/data/7001
    mkdir -p /var/redis-cluster/log/7001
    mkdir -p /var/redis-cluster/data/7002
    mkdir -p /var/redis-cluster/log/7002
    
  • 创建7001配置文件

    cp /usr/local/redis-4.0.1/redis.conf /etc/redis-cluster/7001.conf
    
  • 配置7001配置文件

    vim /etc/redis-cluster/7001.conf
    
    // 修改以下配置
    port 7001
    cluster-enabled yes
    cluster-config-file /etc/redis-cluster/node-7001.conf
    cluster-node-timeout 15000
    daemonize  yes  
    pidfile    /var/run/redis_7001.pid   
    dir     /var/redis-cluster/data/7001/
    logfile /var/redis-cluster/log/7001/7001.log
    bind 192.168.1.140  127.0.0.1
    appendonly yes
    
  • 创建7002的配置文件

    cp /etc/redis-cluster/7001.conf /etc/redis-cluster/7002.conf
    // 将/etc/redis-cluster/7002.conf中的7001全部替换成7002
    sed -i "s/7001/7002/g" /etc/redis-cluster/7002.conf
    // 确认一下配置
    vim /etc/redis-cluster/7002.conf
    
  • 创建可redis启动文件

    cp /usr/local/redis-4.0.1/utils/redis_init_script /etc/init.d/redis_7001
    
    // 修改配置文件
    vim  /etc/init.d/redis_7001
    
    // 将端口修改为7001
    REDISPORT=7001
    
    // 在顶部添加以下注释 
    # chkconfig:   2345 90 10
    #
    # description:  Redis  Start and Stop
    
    // 修改配置文件的路径
    CONF="/etc/redis-cluster/${REDISPORT}.conf"
    
  • 准备7002的启动文件

    cp redis_7001 redis_7002
    sed -i "s/7001/7002/g" redis_7002
    
  • 启动7001、7002

    // 启动redis
    cd /etc/init.d/
    ./redis_7001 start
    ./redis_7002 start
    

    file

其他机器配置
  • 分别在cache0001和cache0002上面创建目录

    // cache0001
    mkdir -p /etc/redis-cluster
    mkdir -p /var/redis-cluster/data/7003
    mkdir -p /var/redis-cluster/log/7003
    mkdir -p /var/redis-cluster/data/7004
    mkdir -p /var/redis-cluster/log/7004
    
    // cache0002
    mkdir -p /etc/redis-cluster
    mkdir -p /var/redis-cluster/data/7005
    mkdir -p /var/redis-cluster/log/7005
    mkdir -p /var/redis-cluster/data/7006
    mkdir -p /var/redis-cluster/log/7006
    
  • 在cache0000机器上往其他两台机器拷贝配置文件

    // 在cache0000上执行
    // 拷贝到cache0001
    scp -r /etc/redis-cluster/7001.conf root@cache0001:/etc/redis-cluster/
    scp -r /etc/init.d/redis_7001 root@cache0001:/etc/init.d/
    
    // 拷贝到cache0002
    scp -r /etc/redis-cluster/7001.conf root@cache0002:/etc/redis-cluster/
    scp -r /etc/init.d/redis_7001 root@cache0002:/etc/init.d/
    
  • cache0001配置

    cp /etc/redis-cluster/7001.conf /etc/redis-cluster/7003.conf 
    cp /etc/redis-cluster/7001.conf /etc/redis-cluster/7004.conf 
    sed -i "s/7001/7003/g" /etc/redis-cluster/7003.conf
    sed -i "s/7001/7004/g" /etc/redis-cluster/7004.conf
    sed -i "s/192.168.1.140/192.168.1.141/g" /etc/redis-cluster/7003.conf
    sed -i "s/192.168.1.140/192.168.1.141/g" /etc/redis-cluster/7004.conf
    rm -rf /etc/redis-cluster/7001.conf
    
    cp /etc/init.d/redis_7001 /etc/init.d/redis_7003
    cp /etc/init.d/redis_7001 /etc/init.d/redis_7004
    sed -i "s/7001/7003/g" /etc/init.d/redis_7003
    sed -i "s/7001/7004/g" /etc/init.d/redis_7004
    rm -rf /etc/init.d/redis_7001
    
    // 启动redis
    cd /etc/init.d/
    ./redis_7003 start
    ./redis_7004 start
    

    file

  • cache0002配置

    cp /etc/redis-cluster/7001.conf /etc/redis-cluster/7005.conf 
    cp /etc/redis-cluster/7001.conf /etc/redis-cluster/7006.conf 
    sed -i "s/7001/7005/g" /etc/redis-cluster/7005.conf
    sed -i "s/7001/7006/g" /etc/redis-cluster/7006.conf
    sed -i "s/192.168.1.140/192.168.1.142/g" /etc/redis-cluster/7005.conf
    sed -i "s/192.168.1.140/192.168.1.142/g" /etc/redis-cluster/7006.conf
    rm -rf /etc/redis-cluster/7001.conf
    
    cp /etc/init.d/redis_7001 /etc/init.d/redis_7005
    cp /etc/init.d/redis_7001 /etc/init.d/redis_7006
    sed -i "s/7001/7005/g" /etc/init.d/redis_7005
    sed -i "s/7001/7006/g" /etc/init.d/redis_7006
    rm -rf /etc/init.d/redis_7001
    
    // 启动redis
    cd /etc/init.d/
    ./redis_7005 start
    ./redis_7006 start
    

    file

5.0之前的构建集群

redis的集群工具会将主从节点自动分散在不同的节点,来实现节点的高可用

// 为了方便后续的操作,这里都执行一下一下指令
cp /usr/local/redis-4.0.1/src/redis-trib.rb /usr/local/bin
  
redis-trib.rb create --replicas 1 192.168.1.140:7001 192.168.1.140:7002 192.168.1.141:7003 192.168.1.141:7004 192.168.1.142:7005 192.168.1.142:7006

file

  • 集群的操作指令

    CLUSTER INFO 打印集群的信息 
    CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相关信息。  
    
    //节点(node) 
    CLUSTER MEET <ip> <port> 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。 
    CLUSTER FORGET <node_id> 从集群中移除 node_id 指定的节点。 
    CLUSTER REPLICATE <node_id> 将当前节点设置为 node_id 指定的节点的从节点。 
    CLUSTER SAVECONFIG 将节点的配置文件保存到硬盘里面。  
    
    //槽(slot) 
    CLUSTER ADDSLOTS <slot> [slot ...] 将一个或多个槽(slot)指派(assign)给当前节点。 
    CLUSTER DELSLOTS <slot> [slot ...] 移除一个或多个槽对当前节点的指派。 
    CLUSTER FLUSHSLOTS 移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。 
    CLUSTER SETSLOT <slot> NODE <node_id> 将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。 
    CLUSTER SETSLOT <slot> MIGRATING <node_id> 将本节点的槽 slot 迁移到 node_id 指定的节点中。 
    CLUSTER SETSLOT <slot> IMPORTING <node_id> 从 node_id 指定的节点中导入槽 slot 到本节点。 
    CLUSTER SETSLOT <slot> STABLE 取消对槽 slot 的导入(import)或者迁移(migrate)。  
    
    //键 (key) 
    CLUSTER KEYSLOT <key> 计算键 key 应该被放置在哪个槽上。 
    CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的键值对数量。 
    CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 个 slot 槽中的键。
    

    file

集群添加从节点
  • 在cache0003新添加一个7007

    mkdir -p /etc/redis-cluster
    mkdir -p /var/redis-cluster/data/7007
    mkdir -p /var/redis-cluster/log/7007
    
    // 在chche0000上拷贝相关的配置
    scp -r /etc/redis-cluster/7001.conf root@cache0003:/etc/redis-cluster/
    scp -r /etc/init.d/redis_7001 root@cache0003:/etc/init.d/
    
    cp /etc/redis-cluster/7001.conf /etc/redis-cluster/7007.conf
    sed -i "s/7001/7007/g" /etc/redis-cluster/7007.conf
    sed -i "s/192.168.1.140/192.168.1.143/g" /etc/redis-cluster/7007.conf
    cp /etc/init.d/redis_7001 /etc/init.d/redis_7007
    sed -i "s/7001/7007/g" /etc/init.d/redis_7007
    
    // 删除无关配置
    rm -rf /etc/init.d/redis_7001
    rm -rf /etc/redis-cluster/7001.conf
    
    cd /etc/init.d/
    ./redis_7007 start
    

    file

  • 将节点添加到集群

    CLUSTER MEET 192.168.1.143 7007
    
  • 集群平衡报错
    file
    核实貌似是redis的bug: https://github.com/antirez/redis/issues/5029

5.0之后的集群管理

  • 集群管理API

    redis-cli --cluster help
    
    [root@cache1000 redis-cluster]# redis-cli --cluster help
    Cluster Manager Commands:
    create         host1:port1 ... hostN:portN
                   --cluster-replicas <arg>
    check          host:port
                   --cluster-search-multiple-owners
    info           host:port
    fix            host:port
                   --cluster-search-multiple-owners
    reshard        host:port
                   --cluster-from <arg>
                   --cluster-to <arg>
                   --cluster-slots <arg>
                   --cluster-yes
                   --cluster-timeout <arg>
                   --cluster-pipeline <arg>
                   --cluster-replace
    rebalance      host:port
                   --cluster-weight <node1=w1...nodeN=wN>
                   --cluster-use-empty-masters
                   --cluster-timeout <arg>
                   --cluster-simulate
                   --cluster-pipeline <arg>
                   --cluster-threshold <arg>
                   --cluster-replace
    add-node       new_host:new_port existing_host:existing_port
                   --cluster-slave
                   --cluster-master-id <arg>
    del-node       host:port node_id
    call           host:port command arg arg .. arg
    set-timeout    host:port milliseconds
    import         host:port
                   --cluster-from <arg>
                   --cluster-copy
                   --cluster-replace
    help   
    
    For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.
    
  • 构建集群

    redis-cli --cluster create 192.168.1.160:7001 192.168.1.160:7002 192.168.1.161:7003 192.168.1.161:7004 192.168.1.162:7005 192.168.1.162:7006 --cluster-replicas 1
    

    filefile

  • 简单操作测试

    [root@cache1000 init.d]# redis-cli -h 192.168.1.160 -p 7001  // 没有-c参数,如果操作的槽位不在当前节点,就会提示MOVE到对应的节点
    192.168.1.160:7001> get a
    (error) MOVED 15495 192.168.1.162:7005
    192.168.1.160:7001> get b 
    [root@cache1000 init.d]# redis-cli -h 192.168.1.160 -p 7001 -c   // 加了-c参数之后,会自动重定向
    192.168.1.160:7001> get a
    -> Redirected to slot [15495] located at 192.168.1.162:7005
    (nil)
    192.168.1.162:7005> set  a 1
    OK
    192.168.1.162:7005> get a
    "1"
    192.168.1.162:7005> get b
    -> Redirected to slot [3300] located at 192.168.1.161:7004
    "2"
    192.168.1.161:7004>
    


标题:并发(四)之Redis:Redis集群(cluster)搭建
作者:码霸霸
地址:https://lupf.cn/articles/2020/04/17/1587095105274.html