zoukankan      html  css  js  c++  java
  • redis学习7--redis-Cluster

      1 redis 数据分区

        redis采用虚拟槽分区,将所有数据全部分散在16384个槽内 槽的范围是0-16383。假设集群有5个节点,那么他负责的槽数据如下,

      

       redis 集群有一下特点: 1 将数据和节点分开,简化了节点扩容和缩容的难度,2

      redis集群不一定不单机好,集群存在以下弱点,1 key批量操作支持有限。如mset、mget只有在同一个节点下才能使用批量操作,而CRC16算法很好的将数据散列在不同的槽里面,2  复制结构只支持一层,从节点只能复制主节点,不支持嵌套树状复制结构 ,3  不支持多数据库空间。单机下的Redis可以支持16个数据库,集群模

    式下只能使用一个数据库空间,即db0。等等问题。

      2搭建集群

        2.1 手动搭建集群,手动搭建集群有助于理解流程和细节,实际操作中可能会使用ruby快速搭建 。

          1 配置节点

            

            使用sed 命令快速生产7001  - 7005节点配置

            sed 's/7000/7001/g' redis-7000.conf  > redis-7001.conf       

             sed 's/7000/7002/g' redis-7000.conf > redis-7002.conf
             sed 's/7000/7003/g' redis-7000.conf > redis-7003.conf
             sed 's/7000/7004/g' redis-7000.conf > redis-7004.conf
             sed 's/7000/7005/g' redis-7000.conf > redis-7005.conf

            启动这些节点

            

            此时这些节点还不能添加数据进去,因为还没有分配槽

          2 meet

            

          3 指配槽

            1 写一个分配槽的shell脚本(推荐),注意shell语法的问题 和 `  符号

            

            这里是本机,所以未写host,执行槽的分配,分别将16384个节点 分配到 7000 7001 7002上

              sh addslots.sh  0 5461 7000 ,sh addslots.sh  5462 10922 7001 ,sh addslots.sh 10923 16383 7002

            2 也可以通过cluster addslots命令的bash特性批量设置槽,

              redis-cli -h 127.0.0.1 -p 7000 cluster addslots {0...5461}

              redis-cli -h 127.0.0.1 -p 7000 cluster addslots {5462...10922}

              redis-cli -h 127.0.0.1 -p 7000 cluster addslots {10923...16383}

          4 分配主从关系

             

            最后一个参数是master的nodeID ,cluster node 可以通过客户端的 cluster nodes 命令查看

           

            到此,集群手动搭建完成

        2.2用redis-trib.rb快速搭建集群。

          下载  ruby

          wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz
          tar xvf ruby-2.3.1.tar.gz -C /data/wwwroot/
            cd ruby-2.3.1/
           ./configure -prefix=/usr/local/ruby
            make && make install

          这中间安装会很慢
           cd /usr/local/ruby/
          cp bin/ruby /usr/local/bin/
          cp bin/gem /usr/local/bin/

        安装rubygem redis 依赖

          wget http://rubygems.org/downloads/redis-3.3.0.gem

          gem install -l redis-3.3.0.gem 

          这里可能会出现一个错误

          

          可以如下解决

          yum install zlib-devel

          cd /data/ruby-2.4.2
          cd ext/zlib
          ruby extconf.rb
          make && make install
          再次执行  gem install -l redis-3.3.0.gem  即可
          将之前的手动集群停下来,杀进程 并且重新启动
          

          复制redis-trib.rb      cp  /data/wwwroot/redis/src/redis-trib.rb /usr/local/bin/

          创建集群
            ./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
          

          到此 工具安装已经完成

     

      3 节点通信

        集群中的节点会通过基于实现Gossip协议的消息来实现通信,常见的课=可分为

        ping消息(节点之间使用最频繁的消息,用于检测彼此之间的状态)

        pong消息(回复消息)

        meet消息(一般用于新节点的加入)

        fail消息(下线消息)

      4 集群伸缩(扩容,缩容)

        redis上集群的伸缩节点之间迁移。

        扩容

        1 准备7006 7007节点,并且启动,配置和之前一致 ,互相meet

        sed 's/7000/7006/g' redis-7000.conf > redis-7006.conf
        sed 's/7000/7007/g' redis-7000.conf > redis-7007.conf

          redis-server redis-7006.conf
        redis-server redis-7007.conf

        redis-cli -p 7000 cluster meet 127.0.0.1 7006
        redis-cli -p 7000 cluster meet 127.0.0.1 7007

        将7007设置为7006的从节点

        redis-cli -p 7007 cluster replicate 7a228afc266cc44c25bcb7859fde4d9a55b439ad

        也可以通过redis-trib来加入节点 

        ./redis-trib.rb add-node 127.0.0.1:7006

        ./redis-trib.rb add-node 127.0.0.1:7007

        使用redis-trib分配槽信息

        cd /data/wwwroot/redis/src

        ./redis-trib.rb reshard 127.0.0.1:7000

        4096

        填写7006的nodesID

        all 

        yes

        查看一下槽结果

        这里可以看到 三段 槽,是7000 7001 7002 迁移过来的, 实现了扩容,

        缩容(这里下线7006 7007节点)

        迁移槽

        ./redis-trib.rb reshard --from 7a228afc266cc44c25bcb7859fde4d9a55b439ad --to 4c9f8211c1bc964cd905e7137a415a300bf7351d --slots 1365 127.0.0.1:7006

        ./redis-trib.rb reshard --from 7a228afc266cc44c25bcb7859fde4d9a55b439ad --to 3404eb10fd3220ccd49735701ee73e1eb6a33324  --slots 1365 127.0.0.1:7006

        ./redis-trib.rb reshard --from 7a228afc266cc44c25bcb7859fde4d9a55b439ad --to 4db1a893096fa03869ebb0c941948d312b41864e --slots 1365 127.0.0.1:7006

        删除节点(先下从节点 后下主节点)

        ./redis-trib.rb del-node 127.0.0.1:7000 7a228afc266cc44c25bcb7859fde4d9a55b439ad

        ./redis-trib.rb del-node 127.0.0.1:7000 f79ab01139845f48d0a64223cf40f69a3179d873

      5 请求路由

        move重定向

        

        

  • 相关阅读:
    java9的JShell小工具和编译器两种自动优化
    运算符
    数据类型
    常量&&变量
    强化学习复习笔记
    强化学习复习笔记
    DQN算法原理详解
    语言模型评价指标Perplexity
    C++ STL标准容器插入删除算法的复杂度
    集束搜索beam search和贪心搜索greedy search
  • 原文地址:https://www.cnblogs.com/tjqBlog/p/9645032.html
Copyright © 2011-2022 走看看