每个节点上执行以下2条命令进行服务启动:
$ redis-server /usr/local/redis_cluster/redis_6379/conf/redis.cnf $ redis-server /usr/local/redis_cluster/redis_6380/conf/redis.cnf
集群模式启动,进程后会加上[cluster]的字样:
同时,查看一下集群节点配置文件,会发现生成了一组集群信息,每个Redis服务都是不同的:
$ cat /usr/local/redis_cluster/redis_6379/nodes_6379.conf c8a8c7d52e6e7403e799c75302b6411e2027621b :0@0 myself,master - 0 0 0 connected vars currentEpoch 0 lastVoteEpoch 0 $ cat /usr/local/redis_cluster/redis_6380/nodes_6380.conf baa10306639fcaca833db0d521235bc9593dbeca :0@0 myself,master - 0 0 0 connected vars currentEpoch 0 lastVoteEpoch 0 # 第一段信息是这个Redis服务作为集群节点的一个身份编码 # 别名为集群的node-id 加入集群 现在虽然说每个服务都成功启动了,但是彼此之间并没有任何联系。
所以下一步要做的就是将6个服务加入至一个集群中,如下操作示例:
$ redis-cli -h node1 -p 6379 node1:6379> cluster meet 192.168.0.130 6379 node1:6379> cluster meet 192.168.0.140 6379 node1:6379> cluster meet 192.168.0.120 6380 node1:6379> cluster meet 192.168.0.130 6380 node1:6379> cluster meet 192.168.0.140 6380 查看当前集群所有的节点:
node1:6379> cluster nodes 214dc5a10149091047df1c61fd3415d91d6204ea 192.168.0.130:6379@16379 master - 0 1617291123000 1 connected baa10306639fcaca833db0d521235bc9593dbeca 192.168.0.120:6380@16380 master - 0 1617291120000 3 connected 7a151f97ee9b020a3c954bbf78cd7ed8a674aa70 192.168.0.140:6379@16379 master - 0 1617291123000 2 connected bae708f7b8df32edf4571c72bbf87715eb45c169 192.168.0.130:6380@16380 master - 0 1617291124175 4 connected fd1dde2a641727e52b4e82cfb351fe3c17690a17 192.168.0.140:6380@16380 master - 0 1617291124000 0 connected c8a8c7d52e6e7403e799c75302b6411e2027621b 192.168.0.120:6379@16379 myself,master - 0 1617291121000 5 connected 查看端口监听,可以发现Gossip监听的1000+端口出现了,此时代表集群各个节点之间已经能互相通信了:
$ netstat -lnpt | grep redis tcp 0 0 192.168.0.120:6379 0.0.0.0:* LISTEN 51311/redis-server tcp 0 0 192.168.0.120:6380 0.0.0.0:* LISTEN 51329/redis-server tcp 0 0 192.168.0.120:16379 0.0.0.0:* LISTEN 51311/redis-server tcp 0 0 192.168.0.120:16380 0.0.0.0:* LISTEN 51329/redis-server 主从配置 6个服务之间并没有任何主从关系,所以现在进行主从配置,记录下上面cluster nodes命令输出的node-id信息,只记录主节点:
hostname 节点 node-idnode1 192.168.0.120:6379 c8a8c7d52e6e7403e799c75302b6411e2027621b
node2 192.168.0.130:6379 214dc5a10149091047df1c61fd3415d91d6204ea
node3 192.168.0.140:6379 7a151f97ee9b020a3c954bbf78cd7ed8a674aa70
首先是node1的6380,将它映射到node2的6379:
$ redis-cli -h node1 -p 6380 node1:6380> cluster replicate 214dc5a10149091047df1c61fd3415d91d6204ea 然后是node2的6380,将它映射到node3的6379:
$ redis-cli -h node2 -p 6380 node2:6380> cluster replicate 7a151f97ee9b020a3c954bbf78cd7ed8a674aa70 最后是node3的6380,将它映射到node1的6379:
$ redis-cli -h node3 -p 6380 node3:6380> cluster replicate c8a8c7d52e6e7403e799c75302b6411e2027621b 查看集群节点信息,内容有精简:
$ redis-cli -h node1 -p 6379 node1:6379> cluster nodes 192.168.0.130:6379@16379 master 192.168.0.120:6380@16380 slave 192.168.0.140:6379@16379 master 192.168.0.130:6380@16380 slave 192.168.0.140:6380@16380 slave 192.168.0.120:6379@16379 myself,master # myself表示当前登录的是那个服务 分配槽位 接下来我们要开始分配槽位了,为了考虑今后的写入操作能分配均匀,槽位也要进行均匀分配。
仅在Master上进行分配,从库不进行分配,仅做主库的备份和读库使用。
使用python计算每个master节点分多少槽位:
$ python3 >>> divmod(16384,3) (5461, 1)