错过血亏!深入学习Redis集群搭建方案及实现原理

首页

2018-11-09

实际上,前三步完成后集群便可以对外提供服务;但指定从节点后,集群才能够提供真正高可用的服务。 启动节点集群节点的启动仍然是使用redis-server命令,但需要使用集群模式启动。

下面是7000节点的配置文件(只列出了节点正常工作关键配置,其他配置,如开启AOF,可以参照单机节点进行):其中的cluster-enabled和cluster-config-file是与集群相关的配置。 cluster-enabledyes:Redis实例可以分为单机模式(standalone)和集群模式(cluster);cluster-enabledyes可以启动集群模式。

在单机模式下启动的Redis实例,如果执行infoserver命令,可以发现redis_mode一项为standalone,如下图所示:集群模式下的节点,其redis_mode为cluster,如下图所示:cluster-config-file:该参数指定了集群配置文件的位置。 每个节点在运行过程中,会维护一份集群配置文件。

每当集群信息发生变化时(如增减节点),集群内所有节点会将最新信息更新到该配置文件。

当节点重启后,会重新读取该配置文件,获取集群信息,可以方便的重新加入到集群中。

也就是说,当Redis节点以集群模式启动时,会首先寻找是否有集群配置文件。 如果有则使用文件中的配置启动;如果没有,则初始化配置并将配置保存到文件中。

集群配置文件由Redis节点维护,不需要人工修改。

编辑好配置文件后,使用redis-server命令启动该节点:节点启动以后,通过clusternodes命令可以查看节点的情况,如下图所示:其中返回值第一项表示节点id,由40个16进制字符串组成,节点id与主从复制一文中提到的runId不同。

Redis每次启动runId都会重新创建,但是节点id只在集群初始化时创建一次,然后保存到集群配置文件中,以后节点重新启动时会直接在集群配置文件中读取。 其他节点使用相同办法启动,不再赘述。

需要特别注意,在启动节点阶段,节点是没有主从关系的,因此从节点不需要加slaveof配置。

节点握手节点启动以后是相互独立的,并不知道其他节点存在;需要进行节点握手,将独立的节点组成一个网络。

节点握手使用clustermeet{ip}{port}命令实现,例如在7000节点中执行,可以完成7000节点和7001节点的握手。

注意:ip使用的是局域网ip,而不是localhost或,是为了其他机器上的节点或客户端也可以访问。 此时再使用clusternodes查看:在7001节点下也可以类似查看:同理,在7000节点中使用clustermeet命令,可以将所有节点加入到集群,完成节点握手:执行完上述命令后,可以看到7000节点已经感知到了所有其他节点:通过节点之间的通信,每个节点都可以感知到所有其他节点,以8000节点为例:分配槽在Redis集群中,借助槽实现数据分区,具体原理后文会介绍。

集群有16384个槽,槽是数据管理和迁移的基本单位。 当数据库中的16384个槽都分配了节点时,集群处于上线状态(ok);如果有任意一个槽没有分配节点,则集群处于下线状态(fail)。

clusterinfo命令可以查看集群状态,分配槽之前状态为fail:分配槽使用clusteraddslots命令,执行下面的命令将槽(编号0-16383)全部分配完毕:此时查看集群状态,显示所有槽分配完毕,集群进入上线状态:指定主从关系集群中指定主从关系不再使用slaveof命令,而是使用clusterreplicate命令;参数使用节点id。

通过clusternodes获得几个主节点的节点id后,执行下面的命令为每个从节点指定主节点:此时执行clusternodes查看各个节点的状态,可以看到主从关系已经建立:至此,集群搭建完毕。 在{REDIS_HOME}/src目录下可以看到文件,这是一个Ruby脚本,可以实现自动化的集群搭建。 ①安装Ruby环境以Ubuntu为例,如下操作即可安装Ruby环境:。