使用端口
redis cluster默认使用2个接口,6379用于处理客户端请求, *cluster bus port默认在数据端口上加10000,也可以用cluster-port指定端口
创建redis-cluster
在redis.conf加最少配置
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
To enable cluster mode, set the cluster-enabled
directive to yes
每个实例还包含一个文件路径,用于节点的配置存储, 默认是node.conf
一个最小的cluster集群, 至少包括3个master节点
正式环境,推荐6个节点, 3个master,3个replicas
可以按照如下步骤创建6节点的cluster
创建目录
mkdir cluster-test
cd cluster-test
mkdir 7000 7001 7002 7003 7004 7005
在每个节点下创建redis.conf 文件,按照前面最小配置的例子,只是端口不同从7000-7005
参考如下命令启动每个实例
cd 7000
redis-server ./redis.conf
会看到如下的日志
[82462] 26 Nov 11:56:55.329 * No cluster configuration found, I'm 97a3a64667477371c4479320d683e4c8db5858b1
创建cluster
redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 \
127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 \
--cluster-replicas 1
这个命令是创建一个cluster, --cluster-replicas=1表示给每个master分配一个replica
redis-cli
会弹出一个配置确认,输入yes之后,就是执行集群配置和节点加入, 最终会看到如下内容:
[OK] All 16384 slots covered
Interact with the cluster
To connect to Redis Cluster, you'll need a cluster-aware Redis client
参考文档 https://redis.io/docs/connect/clients/
使用redis-cli:
redis-cli $ redis-cli -c -p 7000
redis 127.0.0.1:7000> set foo bar
-> Redirected to slot [12182] located at 127.0.0.1:7002
OK
redis 127.0.0.1:7002> set hello world
-> Redirected to slot [866] located at 127.0.0.1:7000
OK
redis 127.0.0.1:7000> get foo
-> Redirected to slot [12182] located at 127.0.0.1:7002
"bar"
redis 127.0.0.1:7002> get hello
-> Redirected to slot [866] located at 127.0.0.1:7000
"world"
Reshard the cluster
使用redis-cli开始reshard
redis-cli --cluster reshard 127.0.0.1:7000
会出现如下确认
How many slots do you want to move (from 1 to 16384)?
We can try to reshard 1000 hash slots, 在上面交互提示中输入 1000
然后会提示输入要迁移这个1000个slot到哪个节点:
What is the receiving node ID?
我们选择127.0.0.1:7000这个节点,获取node id
$ redis-cli -p 7000 cluster nodes | grep myself
97a3a64667477371c4479320d683e4c8db5858b1 :0 myself,master - 0 0 0 connected 0-5460
输入node id之后, 会提示选择从哪些节点迁移slot
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, 从其他所有节点迁移
然后会提示确认迁移计划,确认之后执行迁移
可以使用如下命令查看迁移结果
redis-cli --cluster check 127.0.0.1:7000
在迁移slot的过程中,客户端的访问不受影响
也可以使用非交互式的迁移命令
redis-cli --cluster reshard <host>:<port> --cluster-from <node-id> --cluster-to <node-id> --cluster-slots <number of slots> --cluster-yes
目前还没有根据key的分布自动rebalance的机制
Test the failover
$ redis-cli -p 7002 debug segfault
Error: Server closed the connection
failover期间, redis节点不能接受请求。有可能出现数据不一致,但是发生的概率很小,because Redis sends the reply to the client, and the commands to replicate to the replicas, about at the same time, so there is a very small window to lose data
Manual failover
先对应master的一个replica发送命令
redis-cli -p 7001 CLUSTER FAILOVER
Manual failover, 不影响客户端访问
添加节点
redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000
这个命令第一个参数指定了要加入的新节点127.0.0.1:7006, 第二个参数为集群中已有的任意一个节点
实际上这里redis-cli做了很少的事情,只是给节点发送了 CLUSTER MEET
message
现在可以在集群中看到新加入的节点了
redis 127.0.0.1:7006> cluster nodes
3e3a6cb0d9a9a87168e266b0a0b24026c0aae3f0 127.0.0.1:7001 master - 0 1385543178575 0 connected 5960-10921
3fc783611028b1707fd65345e763befb36454d73 127.0.0.1:7004 slave 3e3a6cb0d9a9a87168e266b0a0b24026c0aae3f0 0 1385543179583 0 connected
f093c80dde814da99c5cf72a7dd01590792b783b :0 myself,master - 0 0 0 connected
2938205e12de373867bf38f1ca29d31d0ddb3e46 127.0.0.1:7002 slave 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 0 1385543178072 3 connected
a211e242fc6b22a9427fed61285e85892fa04e08 127.0.0.1:7003 slave 97a3a64667477371c4479320d683e4c8db5858b1 0 1385543178575 0 connected
97a3a64667477371c4479320d683e4c8db5858b1 127.0.0.1:7000 master - 0 1385543179080 0 connected 0-5959 10922-11422
3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 127.0.0.1:7005 master - 0 1385543177568 3 connected 11423-16383
需要留意,新加入的节点可以转发客户端的请求了,但是还是和其他节点不同
没有数据,没有分配hash slots
作为一个没有hash slots的master, 不参与选举
然后就可以使用前面的reshard步骤给这个新节点分配hash slots了
添加新的replica
还是使用add-node命令, 只是加上--cluster-slave
没有指定新加的节点作为哪个节点的replica,所以会随机选一个replica数量最小的master,作为它的replica
redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000 --cluster-slave
指定master节点,加为它的replica
redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000 --cluster-slave --cluster-master-id 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e
也可以先把新节点加入成为一个空的master, 然后再转为某个节点的replica
redis 127.0.0.1:7006> cluster replicate 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e
还可以用这个命令,把一个master的replica转位另一个master的replica
Remove a node
删除一个replica
redis-cli --cluster del-node 127.0.0.1:7000 `<node-id>`
该命令的第一个参数是集群中的任意节点,第2个参数是要删除的node id
也可以使用该命令删除一个master节点,但是要求该master节点必须是空节点(可以先reshard走该节点的数据)
另外一个删除master节点的方法是 manual failover把它转为replica,再删除
Replica migration
在redis cluster中,你可以随时把一个master的replica重新配置为另一个master replica, 使用如下命令
CLUSTER REPLICATE <master-node-id>
redis cluster可以自动迁移master的replica,配置参数cluster-migration-barrier
Upgrade nodes in a Redis Cluster
更新slave很简单, 直接重启就可以了
更新master复杂些
Use
CLUSTER FAILOVER
to trigger a manual failover of the master to one of its replicasWait for the master to turn into a replica
Finally upgrade the node as you do for replicas
如果还想原来的节点做回master,再来一次clsuter failover
Migrate to Redis Cluster
迁移需要留意:
若果使用了 Multiple keys operations, transactions, Lua scripts 包含多key, 并且这些key没有指定相同的hash tag,会有问题,应用需要做相应的调整
确认应用兼容之后,可以按照如下步骤迁移:
停止访问redis, 现在还没有在线迁移的支持
使用BGREWRITEAOF命令,给所有master节点生成append only file, 等待这些文件生成好
Save your AOF files from aof-1 to aof-N somewhere, 然后可以关闭旧的redis节点了
创建一个redis cluster, N masters and zero replicas. Make sure all your nodes are using the append only file for persistence.
stop掉cluster中的所有redis节点,并替换它们的append only file
Restart your Redis Cluster nodes with the new AOF files, They'll complain that there are keys that should not be there according to their configuration.
Use
redis-cli --cluster fix
command in order to fix the cluster so that keys will be migrated according to the hash slots each node is authoritative or not.Use
redis-cli --cluster check
at the end to make sure your cluster is okRestart your clients modified to use a Redis Cluster aware client library
另外一种前一方法是使用 redis-cli --cluster import
这个命令会move所有旧实例的key到新的redis cluster(旧实例的keys会被删除)
redis 2.8操作会比较慢, 使用这个操作最好先升到3.x的版本