那是因为各节点之间有通讯,通讯端口是对应的redis端口+10000,比如节点6371的集群通讯端口为16371(如果多台机器,别忘了防火墙放开这个端口哦),可以通过cluster nodes看到,如下:
并且将各节点的信息保存在自己对应的集群配置文件中,这个集群文件名是通过配置项cluster-config-file指定的,在集群节点启动时会检查该文件是否存在,如果不存在,会自动创建,如果存在,就加载里面的相关配置信息;里面有哪些信息,随便找个节点的配置文件看一下:
如上图所示,各节点的配置文件中记录了其他节点的主从关系,分配的槽位,各节点的状态;这样的话,集群关系就算重新启动也还存在。
集群伸缩(节点增删)演示在实际应用场景中,会根据业务需要,对集群进行伸缩,即节点的增删;业务并发大了加节点进行扩展, 节点需要调整时可能需要进节点删除;
加节点
这里进行节点扩展,加一个6360主节点,6361作为6360的从节点;参照以上集群搭建时配置文件更改,然后将其都启动,如下:
6360节点
port 6360 # 指定Redis节点端口 pidfile /var/run/redis_6360.pid # 指定对应进程文件 dbfilename dump6360.rdb # 每个节点的rdb持久化文件 cluster-enabled yes # 开启集群,这个比较重要 cluster-config-file nodes-6360.conf #指定每个节点的集群配置文件,这个比较重要6361节点
port 6361 # 指定Redis节点端口 pidfile /var/run/redis_6361.pid # 指定对应进程文件 dbfilename dump6361.rdb # 每个节点的rdb持久化文件 cluster-enabled yes # 开启集群,这个比较重要 cluster-config-file nodes-6361.conf #指定每个节点的集群配置文件,这个比较重要两个节点都启动,然后将6360加入到集群主节点中,执行以下命令:
./redis-cli --cluster add-node 127.0.0.1:6360 127.0.0.1:6370注:其中127.0.0.1:6360是需要加入的新增节点,127.0.0.1:6370是现有集群中的任意一个节点;
可以通过以下命令检测集群状态,如下:
./redis-cli --cluster check 127.0.0.1:6370 # 后面的地址是任意的集群节点可以看到6360已经加入到集群环境中,但现在还没有从节点和槽分配,所以接下来先将6361作为6360的从节点加入,如下:
./redis-cli --cluster add-node --cluster-slave --cluster-master-id eaa814dc56beb0d5edb6a4fbb14f1384e78d4764 127.0.0.1:6361 127.0.0.1:6370参数说明:
--cluster-slave : 意思就是加入的是从节点;
--cluster-master-id:后面紧跟主节点的id,这里就是6360的节点id;通过cluster nodes可以查看到节点id;
127.0.0.1:6361:需要加入的从节点;
127.0.0.1:6370:现有集群的任意主节点;
现在还差槽分配了,如果需要直接将16384个槽平均分配到所有节点话,直接执行以下命令即可:
./redis-cli --cluster rebalance --cluster-threshold 1 --cluster-use-empty-masters 127.0.0.1:6370使用命令./redis-cli --cluster check 127.0.0.1:6370查看分配结果,如下图,只截了部分:
如果不想均匀分配,根据自定义需要进行配置,可以执行以下命令,会提示一步一步配置;
./redis-cli --cluster reshard 127.0.0.1:6360 #后面是新加入的主节点 # 也可以执行以下指令直接配置想要的数据 ./redis-cli --cluster reshard --cluster-from all --cluster-to 需要分配槽的节点id --cluster-slots 1000 --cluster-yes 127.0.0.1:6370 # 1000 指分配的槽数这里就不截图演示了,留给小伙伴自己动手操作吧;
删除节点
先对节点进行分片工作,防止数据丢失,即将指定节点上的槽分配到其他节点;
./redis-cli --cluster reshard 要删除节点ip:port
移除节点,推荐先删除从节点,再删除主节点;
./redis-cli --cluster del-node 节点ip:port 节点id
集群配置项cluster-enabled(是否开启集群模式):设置为yes,将该节点开启为集群模式;
cluster-config-file(设置每个集群节点对应的配置文件名称):文件是自动生成的,不用手动创建;
cluster-node-timeout(设置超时时间,即集群节点不可用的最大时间,如果超过这个时间就认为该节点不可用):默认为15000(以毫秒为单位);