暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Redis5 Cluster搭建及常用命令

陶老师运维笔记 2020-01-17
683

Redis5 Cluster搭建及常用命令

1.介绍

Redis Cluster是Redis官方在Redis 3.0版本正式推出的高可用以及分布式的解决方案。目前redis最新版本已是5.0.x,本文以redis5.0.6版本为例来搭建redis cluster。

  • 官网Cluster介绍 https://redis.io/topics/cluster-tutorial

  • 官网参考文档 https://redis.io/documentation 

1.1 cluster架构

redis-cluster架构:

Redis Cluster由多个Redis实例组成的整体,数据按照槽(slot)存储分布在多个Redis实例上,通过Gossip协议来进行节点之间通信。

架构细节:

  1. 所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.

  2. 节点的fail是通过集群中超过半数的节点检测失效时才生效.

  3. 客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可

  4. redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value

redis-cluster选举:

1)选举过程是集群中所有master参与,如果半数以上master节点与master节点通信超过(cluster-node-timeout),认为当前master节点挂掉。

2)什么时候整个集群不可用(cluster_state:fail)?当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误。

      a:如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成进群的slot映射[0-16383]不完成时进入fail状态。

      b:如果进群超过半数以上master挂掉,无论是否有slave集群进入fail状态。

2. 机器规划

角色版本IPport
node-1redis-5.0.6192.124.64.2126301,7301
node-2redis-5.0.6192.124.64.2136301,7301
node-3redis-5.0.6192.124.64.2146301,7301

说明:计划把6301端口做为初始master端口,7301为slave端口。

3. 软件安装

  • 下载地址: http://download.redis.io/releases/

本次安装Redis版本为redis-5.0.6。在node1,node2,node3分别执行如下软件安装。

  1. $wget http://download.redis.io/releases/redis-5.0.6.tar.gz

  2. #编译安装

  3. $tar -zxvf redis-5.0.6.tar.gz

  4. $cd redis-5.0.6

  5. $make MALLOC=jemalloc

  6. $make test

  7. $sudo make install PREFIX=/usr/local/redis-5.0.6

  8. $find src/ -perm 755 -print | xargs -i /bin/cp {} /usr/local/redis-5.0.6/bin/

  9. $cp src/redis-trib.rb /usr/local/redis-5.0.6/bin/

  10. $cp README.md redis.conf utils /usr/local/redis-5.0.6/ -R

  11. $cp runtest* sentinel.conf /usr/local/redis-5.0.6/


  12. #也可把编译后的二进制,压缩后再传到其它机器上

  13. tar -zcvf Redis-server-5.0.6.el6.x86_64.tar.gz redis-5.0.6

复制

4. cluster布署

4.1 创建目录

依规划在三台机器上建立redis6301(主),redis7301(从)库的目录。

  1. $mkdir -p /data/redis6301/{conf,data,log}

  2. $mkdir -p /data/redis7301/{conf,data,log}

复制

4.2 修改配置

  • https://redis.io/topics/config

  • https://raw.githubusercontent.com/antirez/redis/5.0/redis.conf

以redis6301为例,修改其配置。

  1. $cp /usr/local/redis-5.0.6/redis.conf /data/redis6301/conf/redis-cluster-6301.conf

  2. #修改port, dir, maxmemory等参数.

  3. $vim redis-cluster-6301.conf

  4. port 6301

  5. dir "/data1/redis6301/data"

  6. dbfilename "redis-6301.rdb"

  7. logfile "/data1/redis6301/log/redis6301.log"

  8. cluster-enabled yes //开启集群 把注释#去掉

  9. cluster-node-timeout 15000 //请求超时 设置5秒够了

  10. cluster-config-file "nodes-6301.conf"

复制

修改后配置如下:

  1. cat /data1/redis6301/conf/redis-cluster-6301.conf |grep -v '#' |grep -v '^$'

  2. daemonize yes

  3. tcp-backlog 511

  4. timeout 600

  5. tcp-keepalive 60

  6. loglevel notice

  7. databases 16

  8. dir "/data1/redis6301/data"

  9. pidfile "/data1/redis6301/data/redis6301.pid"

  10. stop-writes-on-bgsave-error no

  11. repl-timeout 60

  12. repl-ping-slave-period 10

  13. repl-disable-tcp-nodelay no

  14. repl-backlog-size 62500kb

  15. repl-backlog-ttl 7200

  16. slave-serve-stale-data yes

  17. slave-read-only yes

  18. slave-priority 100

  19. lua-time-limit 5000

  20. slowlog-log-slower-than 10000

  21. slowlog-max-len 1024

  22. hash-max-ziplist-entries 512

  23. hash-max-ziplist-value 64

  24. list-max-ziplist-entries 512

  25. list-max-ziplist-value 64

  26. set-max-intset-entries 512

  27. zset-max-ziplist-entries 128

  28. zset-max-ziplist-value 64

  29. activerehashing yes

  30. client-output-buffer-limit normal 0 0 0

  31. client-output-buffer-limit slave 512mb 256mb 180

  32. client-output-buffer-limit pubsub 32mb 8mb 60

  33. hz 50

  34. port 6301

  35. bind 0.0.0.0

  36. maxmemory 1gb

  37. maxmemory-policy volatile-lru

  38. save 900 1

  39. save 300 10

  40. save 60 10000

  41. dbfilename "redis-6301.rdb"

  42. appendonly no

  43. appendfsync everysec

  44. appendfilename "appendonly-6301.aof"

  45. aof-rewrite-incremental-fsync yes

  46. no-appendfsync-on-rewrite yes

  47. auto-aof-rewrite-min-size 62500kb

  48. auto-aof-rewrite-percentage 94

  49. rdbcompression yes

  50. rdbchecksum yes

  51. repl-diskless-sync no

  52. repl-diskless-sync-delay 5

  53. maxclients 10000

  54. hll-sparse-max-bytes 3000

  55. min-slaves-to-write 0

  56. min-slaves-max-lag 10

  57. aof-load-truncated yes

  58. notify-keyspace-events ""

  59. requirepass pwd123

  60. masterauth pwd123

  61. logfile "/data1/redis6301/log/redis6301.log"

  62. cluster-enabled yes

  63. cluster-node-timeout 15000

  64. cluster-slave-validity-factor 10

  65. cluster-migration-barrier 1

  66. cluster-config-file "nodes-6301.conf"

  67. cluster-require-full-coverage no

复制

4.3 启动redis

分别在三台机器上启动redis6301/redis7301。

  1. #启动6301

  2. /usr/local/redis/bin/redis-server /data1/redis6301/conf/redis-cluster-6301.conf

  3. #启动7301

  4. /usr/local/redis/bin/redis-server /data1/redis7301/conf/redis-cluster-7301.conf

复制

检查服务:

  1. $ps -ef | grep redis #查看是否启动成功

  2. $netstat -tnlp | grep redis #可以看到redis监听端口

  3. tcp 0 0 0.0.0.0:6301 0.0.0.0:* LISTEN 26418/redis-server

  4. tcp 0 0 0.0.0.0:7301 0.0.0.0:* LISTEN 26428/redis-server

  5. tcp 0 0 0.0.0.0:16301 0.0.0.0:* LISTEN 26418/redis-server

  6. tcp 0 0 0.0.0.0:17301 0.0.0.0:* LISTEN 26428/redis-server

复制

4.4 创建集群

前面已经准备好了搭建集群的redis节点,现在我们要把这些节点都串连起来搭建集群。redis3.x/4.x创建集群是使用redis-trib.rb来创建,不过5.0.x的redis-cli包括了原redis-trib.rb的全部功能,可用来创建cluster。

新版本redis-cli:

  1. #redis-trib.rb的全部功能已迁移到redis-cli

  2. $/usr/local/redis-5.0.6/bin/redis-trib.rb

  3. WARNING: redis-trib.rb is not longer available!

  4. You should use redis-cli instead.


  5. $redis-cli --cluster SUBCOMMAND [ARGUMENTS] [OPTIONS]


  6. $/usr/local/redis-5.0.6/bin/redis-cli --cluster help

  7. Cluster Manager Commands:

  8. create host1:port1 ... hostN:portN

  9. --cluster-replicas <arg>

  10. check host:port

  11. --cluster-search-multiple-owners

  12. info host:port

  13. ...

  14. help


  15. For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.

复制

创建redis5集群示例:

Redis5.0.6带有一个可在本机快速创建redis cluster实验环境的shell脚本create-cluster,但其不支持密码等等有局限性,故咱们直接使用redis-cli --cluster create 来建redis-cluster。

  1. #redis5本机快速建redis-cluster脚本


  2. $./utils/create-cluster/create-cluster [start|create|stop|watch|tail|clean]


  3. #redis3.x/redis4.x ,若要支持密码,还需要去修改redis-trib.rb文件

  4. $redis-trib.rb create --replicas 1 192.124.64.212:6301 192.124.64.213:6301 192.124.64.214:6301 192.124.64.213:7301 192.124.64.214:7301 192.124.64.212:7301


  5. #redis5.0.6

  6. $redis-cli -h

  7. --cluster <command> [args...] [opts...]

  8. Cluster Manager command and arguments (see below).

  9. #创建cluster, 3主3从

  10. $redis-cli --cluster create 192.124.64.212:6301 192.124.64.213:6301 192.124.64.214:6301 192.124.64.213:7301 192.124.64.214:7301 192.124.64.212:7301 \

  11. --cluster-replicas 1 -a pwd123


  12. >>> Performing hash slots allocation on 6 nodes...

  13. Master[0] -> Slots 0 - 5460

  14. Master[1] -> Slots 5461 - 10922

  15. Master[2] -> Slots 10923 - 16383

  16. Adding replica 192.124.64.213:7301 to 192.124.64.212:6301

  17. Adding replica 192.124.64.214:7301 to 192.124.64.213:6301

  18. Adding replica 192.124.64.212:7301 to 192.124.64.214:6301

  19. M: 5e19efdd5aaed8469fa4900bbda57dd3e88991d6 192.124.64.212:6301

  20. slots:[0-5460] (5461 slots) master

  21. M: 8021b063dd7c4b6fbcf0d883bf9b9fc460c29eac 192.124.64.213:6301

  22. slots:[5461-10922] (5462 slots) master

  23. M: 7f4110121f1365119e5234cd4fe2a89eaf826f30 192.124.64.214:6301

  24. slots:[10923-16383] (5461 slots) master

  25. S: b8150fd3a869f28c89c85b242ad71c3a475a249a 192.124.64.213:7301

  26. replicates 5e19efdd5aaed8469fa4900bbda57dd3e88991d6

  27. S: 3146f9f50294ea34a60e668c7cea823cc460cc26 192.124.64.214:7301

  28. replicates 8021b063dd7c4b6fbcf0d883bf9b9fc460c29eac

  29. S: 4fd97d97e9c8cfca5d88b621ca9da4c0568c55f6 192.124.64.212:7301

  30. replicates 7f4110121f1365119e5234cd4fe2a89eaf826f30


  31. #输入yes

  32. Can I set the above configuration? (type 'yes' to accept): yes


  33. >>> Nodes configuration updated

  34. >>> Assign a different config epoch to each node

  35. >>> Sending CLUSTER MEET messages to join the cluster

  36. Waiting for the cluster to join

  37. ....

  38. >>> Performing Cluster Check (using node 192.124.64.212:6301)

  39. M: 5e19efdd5aaed8469fa4900bbda57dd3e88991d6 192.124.64.212:6301

  40. slots:[0-5460] (5461 slots) master

  41. 1 additional replica(s)

  42. M: 8021b063dd7c4b6fbcf0d883bf9b9fc460c29eac 192.124.64.213:6301

  43. slots:[5461-10922] (5462 slots) master

  44. 1 additional replica(s)

  45. S: 3146f9f50294ea34a60e668c7cea823cc460cc26 192.124.64.214:7301

  46. slots: (0 slots) slave

  47. replicates 8021b063dd7c4b6fbcf0d883bf9b9fc460c29eac

  48. M: 7f4110121f1365119e5234cd4fe2a89eaf826f30 192.124.64.214:6301

  49. slots:[10923-16383] (5461 slots) master

  50. 1 additional replica(s)

  51. S: 4fd97d97e9c8cfca5d88b621ca9da4c0568c55f6 192.124.64.212:7301

  52. slots: (0 slots) slave

  53. replicates 7f4110121f1365119e5234cd4fe2a89eaf826f30

  54. S: b8150fd3a869f28c89c85b242ad71c3a475a249a 192.124.64.213:7301

  55. slots: (0 slots) slave

  56. replicates 5e19efdd5aaed8469fa4900bbda57dd3e88991d6

  57. [OK] All nodes agree about slots configuration.

  58. >>> Check for open slots...

  59. >>> Check slots coverage...

  60. [OK] All 16384 slots covered.

复制

检查集群结果:

  1. #redis5.0.x命令

  2. $/usr/local/redis-5.0.6/bin/redis-cli --cluster info 192.124.64.212:6301 -a pwd123

  3. Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.

  4. 192.124.64.212:6301 (5e19efdd...) -> 0 keys | 5461 slots | 1 slaves.

  5. 192.124.64.213:6301 (8021b063...) -> 0 keys | 5462 slots | 1 slaves.

  6. 192.124.64.214:6301 (7f411012...) -> 0 keys | 5461 slots | 1 slaves.

  7. [OK] 0 keys in 3 masters.

  8. 0.00 keys per slot on average.


  9. #redis4.0.x命令

  10. $redis-trib.rb check 192.124.64.212:6301 #要修改代码才支持密码.

复制

如上相比较redis4.x 的redis-trib.rb,redis5 cluster info可以更方便的查看cluster信息。

5. redis 常用管理命令

  • https://redis.io/topics/rediscli

5.1 读写操作

  1. #读写操作

  2. $redis-cli -c -h 192.124.64.212 -p 6301 -a pwd123 set foo bar

  3. $redis-cli -c -h 192.124.64.212 -p 6301 -a pwd123 get foo

  4. $redis-cli -c -h 192.124.64.212 -p 6301 -a pwd123 del foo

复制

5.2 查看内存等信息

  1. #查看内存等信息

  2. $redis-cli -h 192.124.64.212 -p 6301 -a pwd123 info

  3. $redis-cli -h 192.124.64.212 -p 6301 -a pwd123 info memory |grep human -i

  4. $redis-cli -h 192.124.64.212 -p 6301 -a pwd123 dbsize

复制

5.3 查看key及bigkey

  1. #key的情况

  2. $redis-cli -c -h 192.124.64.212 -p 6301 -a pwd123 dbsize

  3. #性能bigkey

  4. $redis-cli -c --bigkeys -h 192.124.64.212 -p 6301 -a pwd123

  5. #查看key情况

  6. $redis-cli -c -h 192.124.64.212 -p 6301 -a pwd123 keys '*' #数据量大时,有风险,该使用scan

  7. $redis-cli -c -h 192.124.64.212 -p 6301 -a pwd123 scan 0 match '*' count 1000

  8. 1) "0"

  9. 2) 1) "get"

复制

5.4 ops及client链接

  1. #访问情况

  2. $redis-cli -c -h 192.124.64.212 -p 6301 -a pwd123 info |grep ops

  3. $redis-cli -c -h 192.124.64.212 -p 6301 -a pwd123 info clients

  4. # Clients

  5. connected_clients:1

  6. $redis-cli -c -h 192.124.64.212 -p 6301 client list -a pwd123 |awk -F'addr=' '{print $2}' | awk '{print $1}'|awk -F':' '{print $1}'|sort |uniq -c|sort -nr

复制

5.5 统计

  1. $redis-cli --stat -h 192.124.64.212 -p 6301 -a pwd123

  2. ------- data ------ --------------------- load -------------------- - child -

  3. keys mem clients blocked requests connections

  4. 1 62.49M 1 0 146718 (+0) 60

复制

5.6 慢查询

  1. #慢查询

  2. $redis-cli -c -h 192.124.64.212 -p 6301 -a pwd123 SLOWLOG RESET #清空慢查询

  3. #查看

  4. $redis-cli -c -h 192.124.64.212 -p 6301 -a pwd123 SLOWLOG GET

  5. 1) 1) (integer) 4 # 日志的唯一标识符(uid)

  6. 2) (integer) 1578413848 # 命令执行时的 UNIX 时间戳

  7. 3) (integer) 13 # 命令执行的时长,以微秒计算

  8. 4) 1) "SET" # 命令以及命令参数

  9. 2) "database"

  10. 3) "Redis"

复制

时间戳转换:

  • python转换: time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(1578413848))

  • MySQL转换: select from_unixtime(1578413848);

5.7 配置修改

有时会需要修改配置,如最大内存大小,开aof等。

  1. #配置查看/修改

  2. $redis-cli -c -h 192.124.64.212 -p 6301 -a pwd123 config-admroot get maxmemory

  3. $redis-cli -c -h 192.124.64.212 -p 6301 -a pwd123 config-admroot set maxmemory 1073741824

  4. #aof修改

  5. $redis-cli -c -h 192.124.64.212 -p 6301 -a pwd123 config-admroot get appendonly

  6. 1) "appendonly"

  7. 2) "no"

  8. $redis-cli -c -h 192.124.64.212 -p 6301 -a pwd123 config-admroot set appendonly yes


  9. #从库只读

  10. $redis-cli -h 192.124.64.212 -p 6301 -a pwd123 config get slave-read-only

  11. 1) "slave-read-only"

  12. 2) "yes"

  13. $redis-cli -c -h 192.124.64.212 -p 6301 -a pwd123 config-admroot set slave-read-only yes

复制

5.8 主从复制

  1. #从库同步

  2. $redis-cli -h redis_slave_ip -p redis_slave_port -a xxx slaveof redis_master redis_port

  3. $redis-cli -h 192.124.64.212 -p 7301 -a pwd123 slaveof 192.124.64.212 6301

  4. #取消同步

  5. $redis-cli -h redis_master -p redis_port slaveof NO ONE

  6. # 查看主从同步情况

  7. $redis-cli -c -h 192.124.64.212 -p 6301 -a pwd123 info Replication

  8. role:master

  9. connected_slaves:1

  10. slave0:ip=192.124.64.213,port=7301,state=online,offset=114756,lag=0


  11. $redis-cli -c -h 192.124.64.212 -p 7301 -a pwd123 info Replication

  12. # Replication

  13. role:slave

  14. master_host:192.124.64.214

  15. master_port:6301

  16. master_link_status:up

  17. master_last_io_seconds_ago:1

复制

6. redis cluster常用命令

Redis4.x上面的cluster命令基本上都仍可以在redis5.0.x正常使用。但是redis5.0.x上redis-trib.rb工具不再可用,redis-trib.rb相关的全部功能,已迁移到redis-cli --cluster命令上了。

6.1 cluster命令语法

  1. $redis-cli --cluster SUBCOMMAND [ARGUMENTS] [OPTIONS]


  2. $/usr/local/redis-5.0.6/bin/redis-cli --cluster help

  3. Cluster Manager Commands:

  4. create host1:port1 ... hostN:portN

  5. --cluster-replicas <arg>

  6. check host:port

  7. --cluster-search-multiple-owners

  8. info host:port

  9. fix host:port

  10. --cluster-search-multiple-owners

  11. reshard host:port

  12. --cluster-from <arg>

  13. --cluster-to <arg>

  14. --cluster-slots <arg>

  15. --cluster-yes

  16. --cluster-timeout <arg>

  17. --cluster-pipeline <arg>

  18. --cluster-replace

  19. rebalance host:port

  20. --cluster-weight <node1=w1...nodeN=wN>

  21. --cluster-use-empty-masters

  22. --cluster-timeout <arg>

  23. --cluster-simulate

  24. --cluster-pipeline <arg>

  25. --cluster-threshold <arg>

  26. --cluster-replace

  27. add-node new_host:new_port existing_host:existing_port

  28. --cluster-slave

  29. --cluster-master-id <arg>

  30. del-node host:port node_id

  31. call host:port command arg arg .. arg

  32. set-timeout host:port milliseconds

  33. import host:port

  34. --cluster-from <arg>

  35. --cluster-copy

  36. --cluster-replace

  37. help

复制

子命令说明:

  • create:创建集群

  • check:检查集群

  • info:查看集群信息

  • fix:修复集群

  • reshard:在线迁移slot

  • rebalance:平衡集群节点slot数量

  • add-node:将新节点加入集群

  • del-node:从集群中删除节点

  • set-timeout:设置集群节点间心跳连接的超时时间

  • call:在集群全部节点上执行命令

  • import:将外部redis数据导入集群

6.2 cluster基本信息

基础信息查看, CLUSTER INFO ,CLUSTER NODES等。

  1. CLUSTER INFO # 打印集群的信息

  2. CLUSTER NODES # 列出集群当前已知的所有节点(node),以及这些节点的相关信息。


  3. #示例:

  4. $redis-cli -c -h 192.124.64.212 -p 6301 -a pwd123 cluster info

  5. cluster_state:ok

  6. cluster_slots_assigned:16384

  7. cluster_slots_ok:16384


  8. $redis-cli -c -h 192.124.64.212 -p 6301 -a pwd123 cluster nodes |grep master |sort -k 9n

  9. 5e19efdd5aaed8469fa4900bbda57dd3e88991d6 192.124.64.212:6301@16301 myself,master - 0 15791922727000 1 connected 0-5460

  10. 8021b063dd7c4b6fbcf0d883bf9b9fc460c29eac 192.124.64.213:6301@16301 master - 0 15791922728623 2 connected 5461-192922

  11. 7f41192121f1365119e5234cd4fe2a89eaf826f30 192.124.64.214:6301@16301 master - 0 15791922728000 3 connected 192923-16383


  12. $redis-cli --cluster info 192.124.64.212:6301 -a pwd123

  13. 192.124.64.212:6301 (5e19efdd...) -> 1 keys | 5461 slots | 1 slaves.

  14. 192.124.64.213:6301 (8021b063...) -> 0 keys | 5462 slots | 1 slaves.

  15. 192.124.64.214:6301 (7f4119212...) -> 0 keys | 5461 slots | 1 slaves.

  16. [OK] 1 keys in 3 masters.


  17. $redis-cli --cluster check 192.124.64.212:6301 -a pwd123

复制

6.3 批量处理

redis-cli --cluster call 可对集群中全部redis节点批量执行命令,非常好用。

  1. $redis-cli --cluster call host:port command arg arg .. arg

  2. #示例:

  3. $redis-cli --cluster info 192.124.64.212:6301 -a pwd123

  4. $redis-cli --cluster call 192.124.64.212:6301 info -a pwd123 |grep ops

  5. $redis-cli --cluster call 192.124.64.212:6301 info memory -a pwd123 |egrep 'Memory|human'

  6. $redis-cli --cluster call 192.124.64.212:6301 info Keyspace -a pwd123

  7. $redis-cli --cluster call 192.124.64.212:6301 dbsize -a pwd123

  8. $redis-cli --cluster call 192.124.64.212:6301 info clients -a pwd123 | grep Clients -i

  9. $redis-cli --cluster call 192.124.64.212:6301 client list -a pwd123

复制

6.4 节点管理

  1. CLUSTER MEET <ip> <port> # 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。

  2. CLUSTER FORGET <node_id> # 从集群中移除 node_id 指定的节点。

  3. CLUSTER REPLICATE <node_id> # 将当前节点设置为 node_id 指定的节点的从节点。

  4. CLUSTER SAVECONFIG # 将节点的配置文件保存到硬盘里面。

  5. CLUSTER NODES # 列出集群当前已知的所有节点(node),以及这些节点的相关信息。

  6. CLUSTER SLAVES node-id # 返回一个master节点的slaves 列表


  7. #cluster forget 命令需要在集群内所有节点执行

  8. $redis-cli --cluster call 192.124.64.212:6301 cluster FORGET e4adb3835xx -a pwd123

复制

集群扩容redis节点:

  • 扩容master: 把新节点加入集群,reshard 迁移slot到新节点,reblance集群。

  • 扩容slave: 需要指定--cluster-master-id ,省去了迁移slot的步骤。

  1. add-node new_host:new_port existing_host:existing_port

  2. --cluster-slave

  3. --cluster-master-id <arg>

  4. del-node host:port node_id

  5. #节点查看

  6. $redis-cli -c -h 192.124.64.212 -p 6301 -a pwd123 cluster nodes


  7. #添加master节点

  8. $redis-cli --cluster add-node new_host:new_port existing_host:existing_port

  9. $redis-cli --cluster add-node 192.124.64.212:6543 192.124.64.212:6301 -a pwd123


  10. #分配slot

  11. $redis-cli --cluster info 192.124.64.212:6301 -a pwd123

  12. $redis-cli --cluster check 192.124.64.212:6301 -a pwd123

  13. #reshard ,迁移slot

  14. redis-cli --cluster reshard 192.124.64.212:7543 --cluster-from 7f4110121f1365119e5234cd4fe2a89eaf826f30 --cluster-to 5c524853ad5995cd30cad27adce042c9d1ad55ce --cluster-slots 4 -a pwd123


  15. #rebalance

  16. $redis-cli --cluster rebalance 192.124.64.212:6301 -a pwd123


  17. #添加slave节点,--slave 表示是添加从库

  18. $redis-cli --cluster add-node --cluster-slave --cluster-master-id xxx new_host:new_port existing_host:existing_port

  19. $redis-cli --cluster add-node 192.124.64.212:6543 192.124.64.212:6301 --cluster-slave --cluster-master-id 5e19efdd5aaed8xx -a pwd123

  20. >>> Send CLUSTER MEET to node 192.124.64.212:6543 to make it join the cluster.

  21. Waiting for the cluster to join

  22. >>> Configure node as replica of 192.124.64.212:6301.

  23. [OK] New node added correctly.


  24. #检查

  25. $redis-cli --cluster info 192.124.64.212:6301 -a pwd123

  26. $redis-cli --cluster check 192.124.64.212:6301 -a pwd123

复制

删除节点:

  • 删除主库节点: 只能删除没有分配slot的节点,故先移除删除节点的slot,然后del-node。

  • 删除从库节点: 直接用--cluster del-node 命令删除即可。

  1. #删除节点

  2. #redis-cli --cluster del-node host:port node_id

  3. $redis-cli --cluster del-node host:port node_id

  4. $redis-cli -a pwd123 --cluster del-node 192.124.64.212:7543 5c524853ad5995cd30cad27adce042c9d1ad55ce

  5. >>> Removing node 5c524853ad5995cd30cad27adce042c9d1ad55ce from cluster 192.124.64.212:7543

  6. >>> Sending CLUSTER FORGET messages to the cluster...

  7. >>> SHUTDOWN the node.


  8. #若是删除失败可能要用到forget命令

  9. $redis-cli --cluster call 192.124.64.212:6301 cluster FORGET 5c524853ad59xx -a pwd123

复制

6.5 SLOT处理

  1. CLUSTER KEYSLOT <key> # 计算键 key 应该被放置在哪个槽上。

  2. CLUSTER COUNTKEYSINSLOT <slot> # 返回槽 slot 目前包含的键值对数量。

  3. CLUSTER GETKEYSINSLOT <slot> <count> # 返回 count 个 slot 槽中的键。

  4. #

  5. CLUSTER ADDSLOTS <slot> [slot ...] # 将一个或多个槽(slot)指派(assign)给当前节点。

  6. CLUSTER DELSLOTS <slot> [slot ...] # 移除一个或多个槽对当前节点的指派。

  7. CLUSTER FLUSHSLOTS # 移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。

  8. CLUSTER SETSLOT <slot> NODE <node_id> # 将槽 slot 指派给 node_id 指定的节点。

  9. CLUSTER SETSLOT <slot> MIGRATING <node_id> # 将本节点的槽 slot 迁移到 node_id 指定的节点中。

  10. CLUSTER SETSLOT <slot> IMPORTING <node_id> # 从 node_id 指定的节点中导入槽 slot 到本节点。

  11. CLUSTER SETSLOT <slot> STABLE # 取消对槽 slot 的导入(import)或者迁移(migrate)。

复制

slot操作示例:

  1. #计算

  2. $redis-cli -c -h 192.124.64.212 -p 6301 -a pwd123 CLUSTER KEYSLOT foo

  3. (integer) 12182


  4. #检查slot

  5. $redis-cli --cluster info 192.124.64.212:6301 -a pwd123

  6. $redis-cli --cluster check 192.124.64.212:6301 -a pwd123


  7. #迁移slot

  8. $redis-cli --cluster reshard 192.124.64.212:7543 --cluster-from 5c524853ad5995cd30cad27adce042c9d1ad55ce --cluster-to 7f4110121f1365119e5234cd4fe2a89eaf826f30 --cluster-slots 4 -a pwd123


  9. #增加/删除槽

  10. redis-cli -c -h 192.124.64.212 -p 6301 -a pwd123 CLUSTER ADDSLOTS 16383

  11. redis-cli -c -h 192.124.64.212 -p 6301 -a pwd123 CLUSTER DELSLOTS 16383

复制

5.7 Reshard及Rebalance

虽然reshard和rebalance也是slot操作相关,但因为工作常会使用并且命令参数较多,故单独列出介绍。

Reshard :

手动迁移slot很烦琐,容易出错,所以redis-cli提供了reshard 子命令来支持在线迁移slot。

  1. reshard host:port

  2. --cluster-from <arg>

  3. --cluster-to <arg>

  4. --cluster-slots <arg>

  5. --cluster-yes

  6. --cluster-timeout <arg>

  7. --cluster-pipeline <arg>

  8. --cluster-replace


  9. 参数说明:

  10. hostport:必传参数,集群内任意节点地址,用来获取整个集群信息。

  11. --cluster-from:制定源节点的id,如果有多个源节点,使用逗号分隔,如果是all源节点变为集群内所有主节点,在迁移过程中提示用户输入。

  12. --cluster-to:需要迁移的目标节点的id,目标节点只能填写一个,在迁移过程中提示用户输入。

  13. --cluster-slots:需要迁移槽的总数量,在迁移过程中提示用户输入。

  14. --cluster-yes:当打印出reshard执行计划时,是否需要用户输入yes确认后再执行reshard

  15. --cluster-timeout:控制每次migrate操作的超时时间,默认为60000毫秒。

  16. --cluster-pipeline:控制每次批量迁移键的数量,默认为10



  17. #示例

  18. $redis-cli --cluster reshard host:port

  19. $redis-cli --cluster reshard 192.124.64.212:6301 --cluster-from 5c524853ad5995cd30cad27adce042c9d1ad55ce --cluster-to 7f4110121f1365119e5234cd4fe2a89eaf826f30 --cluster-slots 4 -a pwd123

复制

Rebalance :

若各节点slot数量不均衡时,可以用rebalance命令来平衡各集群节点slot数量。

  1. rebalance host:port

  2. --cluster-weight <node1=w1...nodeN=wN>

  3. --cluster-use-empty-masters

  4. --cluster-timeout <arg>

  5. --cluster-simulate

  6. --cluster-pipeline <arg>

  7. --cluster-threshold <arg>

  8. --cluster-replace


  9. host:port:这个是必传参数,用来从一个节点获取整个集群信息,相当于获取集群信息的入口。

  10. --cluster-weight <arg>:节点的权重,格式为node_id=weight,例如--weight b31e3a2e=5 node_id可为节点名称的前缀。没有传递–weight的节点的权重默认为1

  11. --cluster-threshold <arg>:只有节点需要迁移的slot阈值超过threshold,才会执行rebalance操作。

  12. --cluster-use-empty-mastersrebalance是否考虑没有节点的master,默认没有分配slot节点的master是不参与rebalance的,设置--use-empty-masters可以让没有分配slot的节点参与rebalance

  13. --cluster-timeout <arg>:设置migrate命令的超时时间。

  14. --cluster-simulate:设置该参数,可以模拟rebalance操作,提示用户会迁移哪些slots,而不会真正执行迁移操作。

  15. --cluster-pipeline <arg>:与resharpipeline参数一样,定义cluster getkeysinslot命令一次取出的key数量,不传的话使用默认值为10


  16. #示例

  17. #rebalance

  18. redis-cli --cluster rebalance host:port

  19. $redis-cli --cluster rebalance 192.124.64.212:6301 -a pwd123

  20. $redis-cli --cluster rebalance 192.124.64.212:6301 -a pwd123 --cluster-threshold 1 --cluster-use-empty-masters --pipeline 10

复制

参考:

  • https://redis.io/documentation 

  • https://redis.io/topics/cluster-tutorial

  • https://redis.io/topics/rediscli


文章转载自陶老师运维笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论