理论

redis cluster - 图1

集群搭建

节点配置

  • 要求最少 6个 节点,每个节点类似下面的配置
    • 注意,各个节点的 rdb 和 aof 的文件路径相互间不要覆盖,如果覆盖,添加 slave node 可能会有问题 ```shell port 9001

      使能 cluster

      cluster-enabled yes

      自动填写配置文件, 如果不明确位置,会自动挂载到 dir 设置中

      cluster-config-file /etc/redis-cluster/node-7001.conf

      节点延迟时间 ms

      cluster-node-timeout 15000

daemonize yes
pidfile /var/run/redis_7001.pid
dir /var/redis/7001
logfile /var/log/redis/7001.log bind 127.0.0.1 appendonly yes

  1. - 正常启动各个节点
  2. - redis-cli 键入 `cluster nodes` 会发现只有当前节点
  3. <a name="YV423"></a>
  4. ### 搭建集群
  5. - 安装 ruby
  6. > apt-get install ruby
  7. <a name="f6Nrt"></a>
  8. #### redis5.0 之前?
  9. > yum install -y rubygems
  10. > gem install redis
  11. 其实就是为了搞个 ruby redis-trib.rb
  12. <a name="Emaob"></a>
  13. #### redis5.0
  14. - src 下就有个 redis-trib.rb
  15. > ./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
  16. - --replicas: 每个master有几个slave
  17. - 不过提示用 redis-cli 代替了
  18. > ./redis-cli --cluster create --cluster-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
  19. - --cluster-replicas: 每个master有几个slave
  20. <a name="R5m8x"></a>
  21. ### 集群完整性检查
  22. > redis-trib.rb check 127.0.0.1:9001
  23. 或者
  24. > redis-cli --cluster check 127.0.0.1:9001
  25. ---
  26. <a name="QV33O"></a>
  27. ### 添加master
  28. - 在搭建集群之后,如果需要再添加额外的 master
  29. <a name="BLAcy"></a>
  30. #### 加入节点
  31. > redis-trib.rb add-node <new-master-ip:port> <one-of-the-master-in-cluster:ip:port>
  32. 或者
  33. > redis-cli --cluster add-node 127.0.0.1:9007 127.0.0.1:9001
  34. - 如果出现错误 `[ERR] Node 127.0.0.1:9007 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.`
  35. - 一般是因为当前节点的 rdb/aof 文件有数据,比如和集群中的其他 master node 节点的 rdb/aof 文件是相同文件,也就是配置文件中没配置好
  36. - 或者当前节点的 cluster-config-file 文件存在,删掉即可
  37. - 成功`[OK] New node added correctly.`
  38. <a name="E0DEG"></a>
  39. #### reshard
  40. - `redis-cli --cluster check <cluster-ip:port>` 后发现加入的 master 没有分配到 slot
  41. > 127.0.0.1:9007 (32a2d84a...) -> 0 keys | 0 slots | 0 slaves.
  42. - 开始分配
  43. > redis-trib.rb reshard <cluster-ip:port>
  44. 或者用 `redis-cli --cluster reshard` 代替
  45. - 根据提示键入信息
  46. ```shell
  47. How many slots do you want to move (from 1 to 16384)? 4096
  48. What is the receiving node ID? 32a2d84aaefbfe0cb3336465e0cf8e0a5d02e5b4
  49. Please enter all the source node IDs.
  50. Type 'all' to use all the nodes as source nodes for the hash slots.
  51. Type 'done' once you entered all the source nodes IDs.
  52. Source node #1: all
  53. ...

添加 slave

  • 同样起一个节点

    redis-trib.rb add-node —slave —master-id <节点中要挂载的master的id> <作为slave的ip:port> <集群入口ip:port>

    • 或者用 redis-cli --cluster add-node --slave --master-id 代替

删除节点

  • 先用 reshard 将当前节点的 slot 分配给其他 master
  • 删除节点

    redis-trib.rb del-node <集群入口ip:port> <节点中要挂载的master的id

    • 或者用 redis-cli --cluster del-node 代替

slave 删除

  • slave 不用删,master 删除后,cluster 会将其挂载到其他 master 下作为冗余 slave