理论
集群搭建
节点配置
- 要求最少 6个 节点,每个节点类似下面的配置
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
- 正常启动各个节点
- 在 redis-cli 键入 `cluster nodes` 会发现只有当前节点
<a name="YV423"></a>
### 搭建集群
- 安装 ruby
> apt-get install ruby
<a name="f6Nrt"></a>
#### redis5.0 之前?
> yum install -y rubygems
> gem install redis
其实就是为了搞个 ruby 和 redis-trib.rb
<a name="Emaob"></a>
#### redis5.0
- 在 src 下就有个 redis-trib.rb 了
> ./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
- --replicas: 每个master有几个slave
- 不过提示用 redis-cli 代替了
> ./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
- --cluster-replicas: 每个master有几个slave
<a name="R5m8x"></a>
### 集群完整性检查
> redis-trib.rb check 127.0.0.1:9001
或者
> redis-cli --cluster check 127.0.0.1:9001
---
<a name="QV33O"></a>
### 添加master
- 在搭建集群之后,如果需要再添加额外的 master
<a name="BLAcy"></a>
#### 加入节点
> redis-trib.rb add-node <new-master-ip:port> <one-of-the-master-in-cluster:ip:port>
或者
> redis-cli --cluster add-node 127.0.0.1:9007 127.0.0.1:9001
- 如果出现错误 `[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.`
- 一般是因为当前节点的 rdb/aof 文件有数据,比如和集群中的其他 master node 节点的 rdb/aof 文件是相同文件,也就是配置文件中没配置好
- 或者当前节点的 cluster-config-file 文件存在,删掉即可
- 成功`[OK] New node added correctly.`
<a name="E0DEG"></a>
#### reshard
- `redis-cli --cluster check <cluster-ip:port>` 后发现加入的 master 没有分配到 slot
> 127.0.0.1:9007 (32a2d84a...) -> 0 keys | 0 slots | 0 slaves.
- 开始分配
> redis-trib.rb reshard <cluster-ip:port>
或者用 `redis-cli --cluster reshard` 代替
- 根据提示键入信息
```shell
How many slots do you want to move (from 1 to 16384)? 4096
What is the receiving node ID? 32a2d84aaefbfe0cb3336465e0cf8e0a5d02e5b4
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: all
...
添加 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