Redis-Cluster 集群模式

redis为什么要有集群

redis的哨兵模式基本已经可以实现高可用,读写分离 ,但是在性能,存储量上还是不够好,那么在redis3.0上加入了cluster模式,实现的redis的分布式存储以及高可用。

今天先完成配置,再思考中间的问题点

配置Cluster

电脑配置有限,所以在一台机器上模拟集群

  1. 先创建好配置文件
    cp /usr/local/redis/redis.conf /etc/9001.conf
    cp /usr/local/redis/redis.conf /etc/9002.conf
    cp /usr/local/redis/redis.conf /etc/9003.conf
    cp /usr/local/redis/redis.conf /etc/9004.conf
    cp /usr/local/redis/redis.conf /etc/9005.conf
    cp /usr/local/redis/redis.conf /etc/9006.conf

  2. 修改配置文件中的以下选项
    vim /etc/9001.conf
    daemonize yes #以daemon方式运行
    pidfile /var/run/redis_9001.pid #指定pid文件
    port 9001 #使用端口
    cluster-enabled yes #启用集群
    cluster-config-file nodes-9001.conf #集群配置文件,由系统自动生成
    cluster-node-timeout 15000 #Node之间的连接超时时间

  3. 启动所有的redis
    redis-server /etc/9001.conf
    redis-server /etc/9002.conf
    redis-server /etc/9003.conf
    redis-server /etc/9004.conf
    redis-server /etc/9005.conf
    redis-server /etc/9006.conf

  4. 构建集群环境
    启动完成之后,我们需要把所有的node归纳到一个集群当中,需要使用ruby的命令
    gpg2 –keyserver hkp://keys.gnupg.net –recv-keys D39DC0E3
    curl -L get.rvm.io | bash -s stable
    source /usr/local/rvm/scripts/rvm
    rvm install 2.3.3
    rvm use 2.3.3 –default

  5. 构建集群
    ./redis-trib.rb create –replicas 1 127.0.0.1:9001 127.0.0.1:9002 127.0.0.1:9003 127.0.0.1:9004 127.0.0.1:9005 127.0.0.1:9006

  6. 检查集群状态

redis-cli -p 9001 cluster nodes
eeedc9b05e56b7fba7a6bb9d03c4c7cf320815bc 127.0.0.1:9001 myself,master - 0 0 1 connected 0-5460
0394096f122fd2729f49553290f8ef183f917443 127.0.0.1:9003 master - 0 1527699315976 3 connected 10923-16383
9f281f159134ffa1c4d042e665984e1f12b8edbe 127.0.0.1:9004 slave eeedc9b05e56b7fba7a6bb9d03c4c7cf320815bc 0 1527699314966 4 connected
263c65e25471744ab05370945c8e815d384ddbd1 127.0.0.1:9002 master - 0 1527699311939 2 connected 5461-10922
83daa0580f9e13ea035b9be963491f4b07c9748e 127.0.0.1:9006 slave 0394096f122fd2729f49553290f8ef183f917443 0 1527699313957 6 connected
8fd667d89669e664d5f4ae5425360a30d69de441 127.0.0.1:9005 slave 263c65e25471744ab05370945c8e815d384ddbd1 0 1527699312949 5 connected

键值的分布式存储

Reis Cluster的存储使用的虚拟槽的概念。槽的范围是0~16383,每个节点负责一部分槽的存储。如果上面的示例,第一个master的槽范围是0~5460,第二个master范围是5461~10922,第三个master范围是10923~16383. 每个键值经过哈希运算之后映射到固定的节点当中。

动态扩容

再增加两个节点,9007.conf, 9008.conf
[root@localhost etc]# redis-server /etc/9007.conf
[root@localhost etc]# redis-server /etc/9008.conf
启动好之后的新节点默认作为孤儿节点 ,并没有与其它节点通信。 使用redis-trib.rb加入到集群当中,
[root@localhost src]# /root/redis-3.0.7/src/redis-trib.rb add-node 127.0.0.1:9007 127.0.0.1:9001
[root@localhost src]# /root/redis-3.0.7/src/redis-trib.rb add-node 127.0.0.1:9008 127.0.0.1:9001
加入到集群之后,看到如下信息,新加入的节点并没有槽范围,意思着并不会存入相应的Key值

127.0.0.1:9001> CLUSTER NODES
ac693d0fe6334ceb1f5bdc07c564db18b51dddda 127.0.0.1:9008 master - 0 1527774545212 7 connected
b510254dc1965a4df470fa3e1675dcd27412d0cb 127.0.0.1:9007 master - 0 1527774546726 0 connected

加入之后需要为新节点迁移槽和相关数据,使用redis-trib.rb命令
/root/redis-3.0.7/src/redis-trib.rb reshard 127.0.0.1:9001

How many slots do you want to move (from 1 to 16384)? 4096  #输入迁出的槽数量,四个节点,那么16384/4=4096
What is the receiving node ID  b510254dc1965a4df470fa3e1675dcd27412d0cb   #输入目录nodeID
Type 'done' once you entered all the source nodes IDs.   #输入源节点ID,完成之后输入done
Source node #1:cfb28ef1deee4e0fa78da86abe5d24566744411e
Source node #2:8e41673d59c9568aa9d29fb174ce733345b3e8f1
Source node #3:40b8d09d44294d2e23c7c768efc8fcd153446746
Source node #4:done

之后便会自动进行迁移,迁移完成之后我们执行下面命令

127.0.0.1:9001> CLUSTER  nodes
ac693d0fe6334ceb1f5bdc07c564db18b51dddda 127.0.0.1:9008 master - 0 1527775461945 7 connected
b510254dc1965a4df470fa3e1675dcd27412d0cb 127.0.0.1:9007 master - 0 1527775462041 8 connected 0-1364 5461-6826 10923-12287

自此,9001节点已经拿到了相应的槽范围了。
我们使用redis-trib.rb rebalance命令检查集群状态

>>> Performing Cluster Check (using node 127.0.0.1:9001)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
*** No rebalancing needed! All nodes are within the 2.0% threshold.

所有的负责的槽数据差异在2%以内,所以数据相对均匀

收缩集群

我们收缩集群时需要分为两步,首先迁移出当前节点的槽范围,然后忘记该节点。
1. 迁移槽范围
首先需要把槽的范围分配给其他节点来负责,但是又不能把当前的范围分配给其它一个节点,这样的话目标节点的范围就太大,差异量太大,会不够均衡

127.0.0.1:9001> CLUSTER  nodes
eeedc9b05e56b7fba7a6bb9d03c4c7cf320815bc 127.0.0.1:9001 myself,master - 0 0 1 connected 1365-5460
0394096f122fd2729f49553290f8ef183f917443 127.0.0.1:9003 master - 0 1527775461032 3 connected 12288-16383
ac693d0fe6334ceb1f5bdc07c564db18b51dddda 127.0.0.1:9008 master - 0 1527775461945 7 connected
b510254dc1965a4df470fa3e1675dcd27412d0cb 127.0.0.1:9007 master - 0 1527775462041 8 connected 0-1364 5461-6826 10923-12287
9f281f159134ffa1c4d042e665984e1f12b8edbe 127.0.0.1:9004 slave eeedc9b05e56b7fba7a6bb9d03c4c7cf320815bc 0 1527775464464 4 connected
263c65e25471744ab05370945c8e815d384ddbd1 127.0.0.1:9002 master - 0 1527775460023 2 connected 6827-10922
83daa0580f9e13ea035b9be963491f4b07c9748e 127.0.0.1:9006 slave 0394096f122fd2729f49553290f8ef183f917443 0 1527775464060 6 connected
8fd667d89669e664d5f4ae5425360a30d69de441 127.0.0.1:9005 slave 263c65e25471744ab05370945c8e815d384ddbd1 0 1527775463051 5 connected

先查看集群信息,需要分三次执行,把slots分配给其它节点,我们分配9001这个节点slots,

/root/redis-3.0.7/src/redis-trib.rb reshard 127.0.0.1:9001
How many slots do you want to move (from 1 to 16384)? 1361   #分别迁移出1361,1361, 236个slots, 我并没有提前计算好,都是按大概输入的,这个记得尽量均衡
What is the receiving node ID? 0394096f122fd2729f49553290f8ef183f917443  #输入目标节点
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:eeedc9b05e56b7fba7a6bb9d03c4c7cf320815bc #分别输入目录Node
Source node #2:done

我们看到9001节点已经不再有slots范围了,下一步 我们将下线9001,9004节点

[root@localhost src]# redis-cli -p 9001 cluster nodes
eeedc9b05e56b7fba7a6bb9d03c4c7cf320815bc 127.0.0.1:9001 myself,master - 0 0 10 connected
0394096f122fd2729f49553290f8ef183f917443 127.0.0.1:9003 master - 0 1527777367086 9 connected 1365-2725 12288-16383
ac693d0fe6334ceb1f5bdc07c564db18b51dddda 127.0.0.1:9008 master - 0 1527777363044 7 connected
b510254dc1965a4df470fa3e1675dcd27412d0cb 127.0.0.1:9007 master - 0 1527777366075 12 connected 0-1364 4087-8187 10923-12287
9f281f159134ffa1c4d042e665984e1f12b8edbe 127.0.0.1:9004 slave b510254dc1965a4df470fa3e1675dcd27412d0cb 0 1527777370113 12 connected
263c65e25471744ab05370945c8e815d384ddbd1 127.0.0.1:9002 master - 0 1527777367590 11 connected 2726-4086 8188-10922
83daa0580f9e13ea035b9be963491f4b07c9748e 127.0.0.1:9006 slave 0394096f122fd2729f49553290f8ef183f917443 0 1527777369105 9 connected
8fd667d89669e664d5f4ae5425360a30d69de441 127.0.0.1:9005 slave 263c65e25471744ab05370945c8e815d384ddbd1 0 1527777368094 11 connected
  1. 忘记节点
    我们使用redistrib.rb del-node 使其它节点忘记这个节点
    [root@localhost src]# /root/redis-3.0.7/src/redis-trib.rb del-node 127.0.0.1:9002 eeedc9b05e56b7fba7a6bb9d03c4c7cf320815bc
    /root/redis-3.0.7/src/redis-trib.rb del-node 127.0.0.1:9002 9f281f159134ffa1c4d042e665984e1f12b8edbe

自此已经完成 节点下线

[root@localhost src]# redis-cli -p 9002 cluster nodes
8fd667d89669e664d5f4ae5425360a30d69de441 127.0.0.1:9005 slave 263c65e25471744ab05370945c8e815d384ddbd1 0 1527777797647 11 connected
0394096f122fd2729f49553290f8ef183f917443 127.0.0.1:9003 master - 0 1527777797142 9 connected 1365-2725 12288-16383
83daa0580f9e13ea035b9be963491f4b07c9748e 127.0.0.1:9006 slave 0394096f122fd2729f49553290f8ef183f917443 0 1527777796637 9 connected
ac693d0fe6334ceb1f5bdc07c564db18b51dddda 127.0.0.1:9008 master - 0 1527777799670 7 connected
b510254dc1965a4df470fa3e1675dcd27412d0cb 127.0.0.1:9007 master - 0 1527777798658 12 connected 0-1364 4087-8187 10923-12287
263c65e25471744ab05370945c8e815d384ddbd1 127.0.0.1:9002 myself,master - 0 0 11 connected 2726-4086 8188-10922

请求路由

  在集群模式下, Redis接收任何键相关命令时首先计算键对应的槽, 再根据槽找出所对应的节点, 如果节点是自身, 则处理键命令; 否则回复MOVED重定向错误, 通知客户端请求正确的节点。 这个过程称为MOVED重定向
客户端的下载地址:点击这里

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值