#redis cluster
一、cluster build
(1)原生命令安装
1.节点配置
1.1 准备6个redis.conf(3主3从,为了可以进行投票), 端口分别为 7000-7005
#redis.conf
port 7000
daemonize yes
logfile '/var/log/redis/redis_7000.log'
dbfilename 'redis_7000.data'
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-require-full-coverage no
#end
# sed 's/7000/7001/g' redis_7000.conf > redis_7001.conf # 把redis_7000.conf文件中的7000替换成7001,并生成redis_7001.conf文件
ps: mac redis.conf默认配置路径: /usr/local/etc
1.2 启动所有的redis-server
# redis-server /opt/config/redis_7000.conf # 指定配置文件,启动redis server节点
# ps aux | grep redis-server # 查看redis-server进程运行情况
ps: 若redis中有历史数据,需要清除,否则影响后续分配槽点:分别在所有的节点redis-cli中执行 flushall、cluster reset (略:若想保留数据,需进行槽点迁移)
2.关联所有节点
进入任一节点redis-cli,逐一执行命令关联所有节点:
cluster meet 127.0.0.1 7000
cluster meet 127.0.0.1 7001
...
查看集群状态: redis-cli -h 127.0.0.1 -p 7000 cluster info
查看集群节点信息: redis-cli -h 127.0.0.1 -p 7000 cluster nodes
3.分配slot
redis Cluster 是由 16384 个 slot 组成的,那么我们需要将这些槽分散到这其中 3 个节点里(3 主 3 从)
redis-cli -h 127.0.0.1 -p 7000 cluster addslots {0..5461}
redis-cli -h 127.0.0.1 -p 7001 cluster addslots {5462..10922}
redis-cli -h 127.0.0.1 -p 7002 cluster addslots {10923..16383}
通过命令验证,可以看到槽点分配信息: redis-cli -h 127.0.0.1 -p 7000 cluster nodes
4.主从复制
cluster nodes可以看到,所有节点都是master, 使用cluster replicate命令指定主从关系
# redis-cli -p {slave port} cluster replicate {master nodeId} ({master id} 可使用cluster nodes命令获取)
7003 -> 7000: redis-cli -p 7003 cluster replicate 9332e32fa3a95505cccf3b71458f8a78a75ad821
7004 -> 7001: ..
7005 -> 7002: ..
通过命令验证,可以看到节点角色改变信息: redis-cli -h 127.0.0.1 -p 7000 cluster nodes
(2)官方工具安装
1.Ruby环境准备
官网下载Ruby源码包,解压,编译,安装,进行软链接
Ruby环境安装redis模块:
ruby -v # ruby安装完成,查看版本
gem install redis # 安装ruby操作redis模块
gem list -- check # 查看ruby环境已经安装的模块
下载redis-trib.rb 拷贝到 /usr/bin目录下
2.节点配置
准备6个配置文件,启动6个服务(端口号: 9000-9005)
3.redis-trib.rb 构建集群
构建集群,replicas后的参数为集群的节点:
# redis-trib.rb create --replicas 1 127.0.0.1:9000 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
脚本将自动完成 meet、addslots、replicate
验证: redis-cli -h 127.0.0.1 -p 7000 cluster nodes
4.添加节点
4.1 准备两个节点 一主一从 9006、9007
4.2 向集群添加master节点
# add-node new_host:new_port existing_host:existing_port
# redis-trib.rb add-node 127.0.0.1:9006 127.0.0.1:9000 (9006为新增节点、9000为集群任一节点用来辨识是哪个集群)
4.3 给新增的master节点分配槽
# redis-trib.rb reshard 127.0.0.1:7000 #手动对集群进行重新分片迁移
How many slots do you want to move (from 1 to 16384)? 4096 (待迁移槽点数量:取平均数即可)
What is the receiving node ID? fe595e7a38c659a6eb6949bb31fd7474881d6422 (接收目标节点: 新master节点的nodeId)
Please enter all the source node IDs. (槽点来源: 可以选择具体的节点,为了平衡,选择all)
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: all
4.3 向集群添加salve节点
redis-trib.rb add-node --slave --master-id fe595e7a38c659a6eb6949bb31fd7474881d6422 127.0.0.1:9006 127.0.0.1:9000 # 一步到位(add、 meet、 replication)
nodeId为绑定目标master节点id, 后面分别是 新加入的节点、集群中原有的节点。 也可以拆分执行(添加节点、指定master)
5.移除节点
5.1 master节点
首先需要将待移除节点上的槽点移动到存活的节点上,否则移除节点的时候将报错: [ERR] Node 127.0.0.1:9006 is not empty! Reshard data away and try again.
# redis-trib.rb reshard 127.0.0.1:9000 #重新分配槽点
How many slots do you want to move (from 1 to 16384)? 4096 (待移动槽点数量)
What is the receiving node ID? ce06b13387702c3ee63e0118dd10c5f81a1285b5 (移动目标nodeId)
Source node #1:fe595e7a38c659a6eb6949bb31fd7474881d6422 (!移除来源nodeId, 9006的nodeId)
# redis-trib.rb del-node 127.0.0.1:7003 357c88af6960a11c130e0180038f8d095179b8e7 #移除节点
5.1 slave节点
直接移除即可
ps: 常用命令
集群初始化:
flushall
cluster reset
# 查看集群信息
redis-cli -h 127.0.0.1 -p 7000 cluster info
redis-cli -h 127.0.0.1 -p 7000 cluster nodes
redis-cli -h 127.0.0.1 -p 7000 cluster slots
# 指定主从关系
redis-cli -p 7002 cluster replicate 9332e32fa3a95505cccf3b71458f8a78a75ad821
# 分配槽点
redis-cli -h 127.0.0.1 -p 7000 cluster addslots {0..8192}
redis-cli -h 127.0.0.1 -p 7001 cluster addslots {8193..16383}