Redis集群提供一种运行Redis的方式,数据被自动的分片到多个Redis节点。 集群不支持处理多个键的命令,因为这需要在Redis节点间移动数据,使得Redis集群不能提供像Redis单点那样的性能,在高负载下会表现得不可预知。 Redis集群也提供在网络分割(partitions)期间的一定程度的可用性,这就是在现实中当一些节点失败或者不能通信时能继续进行运转的能力。 所以,在实践中,你可以从Redis集群中得到什么呢? 在多个节点间自动拆分你的数据集的能力。 当部分节点正在经历失败或者不能与集群其他节点通信时继续运转的能力。
Redis 集群的TCP 端口(Redis Cluster TCP ports)
为了让Redis集群工作正常,对每个节点:
- 用于与客户端通信的正常的客户端通信端口(通常为6379)需要开放给所有需要连接集群的客户端以及其他集群节点(使用客户端端口来进行键迁移)。
- 集群总线端口(客户端端口固定偏移量加10000)必须从所有的其他集群节点可达。
创建和使用Redis集群(Creating and using a Redis Cluster)
注意,可以正常运转的最小集群需要包含至少3个主服务器节点。在你的第一次尝试中,强烈建议开始一个6个节点的集群,3个主服务器,3个从服务器。下面是最小的Redis集群配置文件:
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
创建集群(Creating the cluster)
创建3个主从群组,--replicas 1选项意思是我们希望每个创建的主服务器有一个从服务器。其他参数是我想用来创建新集群的实例地址列表。
./redis-trib.rb create --replicas 1 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
采用客户端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:7000> get hello
-> Redirected to slot [866] located at 127.0.0.1:7000
"world"
重新分片集群(Resharding the cluster)
./redis-trib.rb reshard 127.0.0.1:7000
你只需要指定单个节点,redis-trib会自动找到其它节点。
当前redis-trib只能在管理员的支持下进行重分片,你不能只是说从这个节点移动5%的哈希槽到另一个节点(但是这也很容易实现)。那么问题就随之而来了。第一个问题就是你想要重分片多少:
你想移动多少哈希槽(从1到16384)? 我们尝试重新分片1000个哈希槽,如果没有sleep调用的那个例子程序还在运行的话,这些槽里面应该已经包含了不少的键了。
然后,redis-trib需要知道重分片的目标了,也就是将接收这些哈希槽的节点。我将使用第一个主服务器节点,也就是127.0.0.1:7000,但是我得指定这个实例的节点ID。这已经被redis-trib打印在一个列表中了,但是我总是可以在需要时使用下面的命令找到节点的ID:
$ redis-cli -p 7000 cluster nodes | grep myself
97a3a64667477371c4479320d683e4c8db5858b1 :0 myself,master - 0 0 0 connected 0-5460
好了,我的目标节点是97a3a64667477371c4479320d683e4c8db5858b1。 现在,你会被询问想从哪些节点获取这些键。我会输入all,这样就会从所有其它的主服务器节点获取一些哈希槽。 在最后的确认后,你会看到每一个被redis-trib准备从一个节点移动到另一个节点的槽的消息,并且会为每一个被从一侧移动到另一侧的真实的键打印一个圆点。 在重分片进行的过程中,你应该能够看到你的示例程序运行没有受到影响。如果你愿意的话,你可以在重分片期间多次停止和重启它。 在重分片的最后,你可以使用下面的命令来测试一下集群的健康情况:
./redis-trib.rb check 127.0.0.1:7000
Redis 节点查看
-- 查看主节点
redis-cli -p 7000 cluster nodes | grep master
-- 查看所有节点
redis-cli -p 7000 cluster nodes
-- 使节点奔溃
redis-cli -p 7002 debug segfault
Redis 节点操作
-- 添加节点7006 到 7000 所在的集群中
./redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000
-- 添加从节点7006 到7000 所在的集群中
./redis-trib.rb add-node --slave 127.0.0.1:7006 127.0.0.1:7000
-- 添加从节点到指定的主节点中,需要先通过 cluster nodes 查看 master id
./redis-trib.rb add-node --slave --master-id 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 127.0.0.1:7006 127.0.0.1:7000
-- 移除节点 第一个参数只是集群中的一个随机节点,第二个参数是你想移除的节点的ID。
./redis-trib del-node 127.0.0.1:7000 <node-id>
-- 为了给节点127.0.0.1:7005添加一个副本,这个节点当前服务11432-16383范围内的哈希槽,
其节点ID为3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e,
所有我们需要去做的,就是连接这个新的节点(已经作为空主服务器被添加)然后发送命令:
redis 127.0.0.1:7006> cluster replicate 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e
-- 运行结果发现有两个从节点了
redis-cli -p 7000 cluster nodes | grep slave | grep 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e
f093c80dde814da99c5cf72a7dd01590792b783b 127.0.0.1:7006 slave 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 0 1385543617702 3 connected
2938205e12de373867bf38f1ca29d31d0ddb3e46 127.0.0.1:7002 slave 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 0 1385543617198 3 connect