高可用redis cluster集群搭建 秒速五厘米 2022-02-26 19:16 291阅读 0赞 redis集群是一个由多个主从节点群组成的分布式服务器群,它具有复制、高可用和分片特 性。Redis集群不需要 sentinel哨兵也能完成节点移除和故障转移的功能。需要将每个节点 设置成集群模式,这种集群模式没有中心节 点,可水平扩展,据官方文档称可以线性扩展到 1000节点。redis集群的性能和高可用性均优于之前版本的哨兵模式,而且集群的安装配置,细节比较多,但是流程相对还是比较简单的。 至于redis安装,这里有详细的安装步骤:https://blog.csdn.net/baomw/article/details/88916102,对着一顿猛操作即可。 一个最简单的集群部署图如下,三主六从,真正生产应用的时候,就是九台机器(有钱人干的),三个一组,一组里面一主节点(master)二从(slave),当我们主节点挂掉的时候,会根据相关算法在配置的两个从节点中,从新选举出一个主节点,从而保证集群的可用性,至于具体怎么配置,看下即可。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jhb213_size_16_color_FFFFFF_t_70] ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jhb213_size_16_color_FFFFFF_t_70 1] 如上图,为了模拟集群环境,我这边vm中创建了三台虚拟机,然后每台机器中起一个master和两个slave。模拟集群环境,当然生产使用的时候一般都是在不同的物理机上了。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jhb213_size_16_color_FFFFFF_t_70 2] 上一篇文章说道,redis启动基于配置文件,所以如图,这边每台虚拟机上放置三套redis启动配置,模拟三台机器,文件名对应启动端口,6001-6003,7001-7003,8001-8003,。 详细配置如下; # 绑定Ip 指定可以连接本实例Redis的ip 如果注释(删掉)则任意IP都可以连接 bind 127.0.0.1 #禁止外网访问redis,如果启用了,即使注释掉了bind 127.0.0.1,再访问redisd时候还是无法连接的 #它启用的条件有两个,第一是没有使用bind,第二是没有设置访问密码。 protected-mode yes #指定Redis的端口 port 6379 # 是否以守护进程启动 daemonize yes # dbfilename文件存放目录。必须是一个目录,aof文件也会保存到该目录下。 dir ./ #当master服务设置了密码保护时,slave服务连接master的密码,集群通信密码 和登录密码一致即可,每组小集群密码设置成一样, #注意master也要设置密码,因为存在故障切换,主从存在替换 masterauth 123456 #当一个slave与master失去联系时,或者复制正在进行的时候,slave应对请求的行为: #如果为 yes(默认值) ,slave 仍然会应答客户端请求,但返回的数据可能是过时,或者数据可能是空的在第一次同步的时候 #如果为 no ,在你执行除了 info 和 salveof 之外的其他命令时,slave 都将返回一个 "SYNC with master in progress" 的错误。 replica-serve-stale-data yes #设置slave是否是只读的。从2.6版起,slave默认是只读的。一般做读写分离是使用,主机写,从机读 replica-read-only yes # 指定slave定期ping master的周期,默认10秒钟。既主从心跳时间 repl-ping-replica-period 10 #当 master 不能正常工作的时候,Redis Sentinel 会从 slaves 中选出一个新的 master,这个值越小,就越会被优先选中,但是如果是 0 , 那是意味 #着这个 slave 不可能被选中。 默认优先级为 100。 replica-priority 100 # 是否开启cluster集群模式 如果配置yes则开启集群功能,此redis实例作为集群的一个节点,否则,它是一个普通的单一的redis实例。 cluster-enabled yes #这是集群中的节点能够失联的最大时间,超过这个时间,该节点就会被认为故障。如果主节点超过这个时间还是不可达,则用它的从节点将启动故障 #迁移,升级成主节点。 cluster-node-timeout 15000 #如果设置成0,则无论从节点与主节点失联多久,从节点都会尝试升级成主节点。 #如果设置成正数,则cluster-node-timeout乘以cluster-slave-validity-factor得到的时间,是从节点与主节点失联后, #此从节点数据有效的最长时间,超过这个时间,从节点不会启动故障迁移。 #假设cluster-node-timeout=5,cluster-slave-validity-factor=10,则如果从节点跟主节点失联超过50秒,此从节点不能成为主节点。 #注意,如果此参数配置为非0,将可能出现由于某主节点失联却没有从节点能顶上的情况,从而导致集群不能正常工作, #在这种情况下,只有等到原来的主节点重新回归到集群,集群才恢复运作。 cluster-replica-validity-factor 10 # 表示当负责一个插槽的主库下线且没有相应的从库进行故障恢复时,是否整个集群不可用,这个配置要开启 cluster-require-full-coverage yes 按照如上配置完成之后,使用启动命令分别启动所有节点: redis-db-7001/bin/redis-server redis-db-7001/etc/redis.conf 启动完成之后的效果如下: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jhb213_size_16_color_FFFFFF_t_70 3] 可以看到,现在所有的节点都已经使用集群模式(cluster)启动了,但是是不是说明我们现在的所有节点就已经完成集群了呢,显然不是。 现在我们可以使用redis-client来构建我们的集群,构建方式也比较简单,命令如下: redis-cli -a baomw --cluster create --cluster-replicas 2 192.168.179.101:6001 192.168.179.102:7002 192.168.179.103:8003 192.168.179.102:7001 192.168.179.101:6002 192.168.179.103:8002 192.168.179.103:8001 192.168.179.101:6003 192.168.179.102:7003 随便找一个节点,进入bin目录,参数解释: \-a baomw 即密码是baomw,你们是多少就设置多少就可以了 –cluster create 创建集群 –cluster-replicas 2 表示一个master有几个slave,redis三个一组或两个一组,一个集群至少三组,如果我们有六台机器,很明显,一个master对应一个slove,那么这里写1,我现在这里有9台机器,那么,算一下很容易算出来,一台master对应两个slave,这里写2即可 后面这一坨即是我们所有的节点的ip地址+端口,注意这里写法有点东西的,为了保证高可用,我们搭建集群首先保证我们的master和slave不在一台机器上,配置2的话,会顺序三个分成一组,然后再每一组里面根据选出一个master和两个slave。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jhb213_size_16_color_FFFFFF_t_70 4] 执行命令后,会弹出这个选项,让你确定是不是执行这种策略,如上图,主意三点: 1,m表示改节点是master,s表示slave 2,表示槽点,redis内部写死了,集群有16384个槽点,槽点只分配在master上,只有master节点才会显示,即我们的槽点值范围 槽点范围默认是平均分配的,当有数据写入的时候,会先对key进行一个hash算法计算出的值对16384取模,计算出槽点的位 置,然后去对应的master节点组中做读写数据操作 3,标识出了该slave对应的masterd的id ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jhb213_size_16_color_FFFFFF_t_70 5] 输入yes,即可开始构建我们的集群了当弹出如图提示的时候表示集群已经构建好了,然后槽点也都分配好了 下面我们来访问下这个集群,当然访问方式也得用我们的集群命令来访问了,我们随机访问一台master即可。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jhb213_size_16_color_FFFFFF_t_70 6] redis-cli -a baomw -c -h 192.168.179.101 -p 6001 命令参数如下: \-a baomw 密码 \-c 表示用集群方式访问 如上图,我set了baomw baomw,可以看到算出来key对应的槽点值为,13925,然后客户端重定向到了192.168.179.130:8003这个master上。表示我们的集群已经可以正常工作了 下面再介绍两个命令: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jhb213_size_16_color_FFFFFF_t_70 7] cluster info cluster nodes 如上,可以看到当前接点信息,还有集群的所有的节点信息。 如上,我们整个redis集群就搭建好了,至于具体测容灾测试你们有兴趣的可以自己试试,这里就不在多说了。 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jhb213_size_16_color_FFFFFF_t_70]: /images/20220226/4bbf777c28494cd8803379e86a4c0fe4.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jhb213_size_16_color_FFFFFF_t_70 1]: /images/20220226/265a589db1f24a59b341639a1f5067a7.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jhb213_size_16_color_FFFFFF_t_70 2]: /images/20220226/ac43e2cd6cef4c93b5d282fcf8bff36c.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jhb213_size_16_color_FFFFFF_t_70 3]: /images/20220226/a4f7eefb20504c0eaaf9593095e22dd1.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jhb213_size_16_color_FFFFFF_t_70 4]: /images/20220226/a34af6e4c87d4e05ae43bc7c808f0763.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jhb213_size_16_color_FFFFFF_t_70 5]: /images/20220226/60726fb42c774b8a96bdb15b4b66ce59.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jhb213_size_16_color_FFFFFF_t_70 6]: /images/20220226/a30c763bf66a45f78c7d3dc75875b6a7.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jhb213_size_16_color_FFFFFF_t_70 7]: /images/20220226/95af5b7510ab4436a2972118caa94db2.png
还没有评论,来说两句吧...