从0到1在Linux上搭建Redis 6.0的Cluster集群教程
Redis集群模式分三种方式:
1、主从模式,这里通常指的是,主down后,需要手动升级从库为主库。主库支持读写,从库只读。至少两个redis实例
2、哨兵模式,是1模式的加强,由哨兵模式自动选举从库中的某一个为主库。解决高可用问题。至少三个redis实例
3、Cluster集群模式,除了解决高可用问题外,还解决大量数据存储问题,通过slot方式路由到不同的服务器组中。至少3台服务器,六个redis实例。
详细的介绍请参阅:https://blog.csdn.net/miss1181248983/article/details/90056960
下面介绍如何搭建Cluster集群模式。
1、首选准备三台阿里云机器,ip分别如下
s1:172.16.213.251
s2:172.16.213.250
s3:172.16.213.246
注意:建议尽量不要选择Aliyun Linux操作系统,会遇到各种奇怪奇葩的问题,笔者用Aliyun linux花费大量时间,并未安装成功,客服也仅仅只给建议,无奈换回主流的CenterOS,下面是三台服务器的版本情况
1 | lsb_release -a |
2、安装Redis 6.0.10版本的,检查服务器环境是否满足
1 | gcc - v #检查gcc版本,需要是8.3+的 |
3、安装tcl,否则编译redis的时候不通过,这里安装的时候直接使用rpm编译好的包执行安装即可。
小tips:国内有很多linux软件镜像,这里采用阿里云的镜像网站https://developer.aliyun.com/packageSearch?word=tcl,点开后直接搜索即可,注意使用自己需要的版本
1 | rpm -ivh https: //mirrors .aliyun.com /centos/8 .3.2011 /BaseOS/x86_64/os/Packages/tcl-8 .6.8-2.el8.x86_ 64.rpm?spm=a2c6h.13651111.0.0.70662f7099C6CD& file =tcl-8.6.8-2.el8.x86_64.rpm <br> #使用上面命令进行安装,注意安装的时候要重新获取一次rpm安装包地址,输入命令回车,一会之后再回车一次,即可以看到Done安装完成! |
4、下载Redis,我们默认放到/usr/local/redis-6.0.10文件夹
1 2 3 4 5 6 7 8 9 | cd /usr/local wget https: //download .redis.io /releases/redis-6 .0.10. tar .gz tar -zvxf redis-6.0.10. tar .gz cd redis-6.0.10/ make && make test && make install #也可以分步执行,看到下面截图的命令基本代表已经安装成功了。注意请确保gcc和tcl已经安装了对应版本,否则make可能不通过。 |
5、下面要做6个redis实例,因为我们用了3台服务器,所以每台服务器会安装两个实例,具体如下:
172.16.213.251 | 7377端口 | s1 |
172.16.213.251 | 7477端口 | s1 |
172.16.213.250 | 7377端口 | s2 |
172.16.213.250 | 7477端口 | s2 |
172.16.213.246 | 7377端口 | s3 |
172.16.213.246 | 7477端口 | s3 |
注意:提前开启阿里云服务器对应端口号
6、下面以一台服务器为例,安装实例
1 | cp redis_init_script /etc/init .d #在/usr/local/redis-6.0.10目录下,拷贝redis_init_script文件到/etc/init.d目录下mv redis_init_script redis_7477 #进入/etc/init.d目录,并改名称为redis_7477,修改redis_7477脚本的第6行的REDISPORT,设置为相同的端口号7477<br><br>#同时为了后续设置Redis开启启动,该文件顶部需要加上如下代码段,整体的文件注意如下截图<br>#!/bin/sh<br># chkconfig: 2345 10 90 <br># description: Start and Stop redis |
7、创建四个目录
- /etc/redis(存放redis的配置文件)
- /var/redis/7477(存放redis的持久化文件)
1 2 | mkdir -p /etc/redis mkdir -p /var/redis/7477 <br> mkdir -p /etc/redis-cluster #集群用<br>mkdir -p /var/log/redis #日志 |
8、修改redis实例的配置文件(默认在根目录下/usr/local/redis-6.0.10,redis.conf),拷贝到/etc/redis目录中,修改名称为7477.conf
1 2 | cp /usr/local/redis-6 .0.10 /redis .conf /etc/redis mv redis.conf 7477.conf |
9、修改redis.conf中的部分配置
- port 7477
- cluster-enabled yes
- cluster-config-file /etc/redis-cluster/node-7477.conf
- cluster-node-timeout 15000
- daemonize yes
- pidfile /var/run/redis_7477.pid
- dir /var/redis/7477
- logfile /var/log/redis/7477.log
- bind 0.0.0.0(这里代表通过本机哪个网卡过来的请求是可以被响应的,此处设计非常巧妙,一般设置内网bind 127.0.0.1 内网ip 即可,但实际做了开机启动后,会发现通过内网ip无法连接的情况,顾干脆设置0.0.0.0问题可解决。https://www.cnblogs.com/kingsonfu/p/10138647.html)
- appendonly yes
- requirepass 设置密码
- masterauth 设置密码,必须等同于requirepass,也可以密码留空
10、liunx常用命令提示
1 2 3 4 5 6 | ls #列出文件 ls -l #列出文件详情 chmod 777 文件名 #设置可执行文件 ps -ef| grep redis #列出包含redis字符的文件名字 cat 文件名字 #查看文件内容 vi 文件名字 #编辑文件内容,按住i,执行插入,esc退出,按/输入字符,代表查找,查找情况下按n,代表查找下一个,shift z z代表保存并退出 |
11、上述执行完单redis实例的安装,不出意外,环境的配置已经安装好了。可以通过如下命令启动下试试
1 2 3 4 | cd /etc/init .d chmod 777 redis_7477 . /redis_7477 start #检查是否正常启动<br>ps -ef|grep redis |
12、参考文章
https://www.cnblogs.com/blueskyli/p/9045930.html
https://www.cnblogs.com/blueskyli/p/9084548.html
13、搭建集群,按照上述步骤,分别在3台服务器,设置6个实例
14、构建集群,注意6.0一起版本的redis要求安装ruby环境,6.0之后不需要安装 ,此处我们不用安装,直接构建集群即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | [root@iZbp145wkv4vf3oba7qge2Z bin] # redis-cli -a 密码 --cluster create 172.16.213.251:7377 172.16.213.251:7477 17 2.16.213.250:7377 172.16.213.250:7477 172.16.213.246:7377 172.16.213.246:7477 --cluster-replicas 1 Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. >>> Performing hash slots allocation on 6 nodes... Master[0] -> Slots 0 - 5460 Master[1] -> Slots 5461 - 10922 Master[2] -> Slots 10923 - 16383 Adding replica 172.16.213.250:7477 to 172.16.213.251:7377 Adding replica 172.16.213.246:7477 to 172.16.213.250:7377 Adding replica 172.16.213.251:7477 to 172.16.213.246:7377 M: c83d02fcd82160d722be1fd6af92a2701c7f83d9 172.16.213.251:7377 slots:[0-5460] (5461 slots) master S: 1ec9adecf00dfc19b4a1176fafc870256d651eae 172.16.213.251:7477 replicates 7a5690b1f833c2bae448bf978285c9c7e1238c93 M: 214a974eaf9ac38bcf6b46f85baa39a4db671eab 172.16.213.250:7377 slots:[5461-10922] (5462 slots) master S: 39ead0048c4bbbdb0bc6b9516962070e286648af 172.16.213.250:7477 replicates c83d02fcd82160d722be1fd6af92a2701c7f83d9 M: 7a5690b1f833c2bae448bf978285c9c7e1238c93 172.16.213.246:7377 slots:[10923-16383] (5461 slots) master S: c9516b62ebcd8fe888d4bc46a4190be412894fd4 172.16.213.246:7477 replicates 214a974eaf9ac38bcf6b46f85baa39a4db671eab Can I set the above configuration? ( type 'yes' to accept): yes ####这里要输入yes,不能输入y哦!!! >>> Nodes configuration updated >>> Assign a different config epoch to each node >>> Sending CLUSTER MEET messages to join the cluster Waiting for the cluster to join . >>> Performing Cluster Check (using node 172.16.213.251:7377) M: c83d02fcd82160d722be1fd6af92a2701c7f83d9 172.16.213.251:7377 slots:[0-5460] (5461 slots) master 1 additional replica(s) M: 214a974eaf9ac38bcf6b46f85baa39a4db671eab 172.16.213.250:7377 slots:[5461-10922] (5462 slots) master 1 additional replica(s) S: 39ead0048c4bbbdb0bc6b9516962070e286648af 172.16.213.250:7477 slots: (0 slots) slave replicates c83d02fcd82160d722be1fd6af92a2701c7f83d9 S: 1ec9adecf00dfc19b4a1176fafc870256d651eae 172.16.213.251:7477 slots: (0 slots) slave replicates 7a5690b1f833c2bae448bf978285c9c7e1238c93 S: c9516b62ebcd8fe888d4bc46a4190be412894fd4 172.16.213.246:7477 slots: (0 slots) slave replicates 214a974eaf9ac38bcf6b46f85baa39a4db671eab M: 7a5690b1f833c2bae448bf978285c9c7e1238c93 172.16.213.246:7377 slots:[10923-16383] (5461 slots) master 1 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. [root@iZbp145wkv4vf3oba7qge2Z bin] # |
15、至此,我们搭建完成了集群环境。一共6个redis实例,3主3从。其中对于命令
1 2 | <strong>redis-cli -a 密码 --cluster create 172.16.213.251:7377 172.16.213.251:7477 17 2.16.213.250:7377 172.16.213.250:7477 172.16.213.246:7377 172.16.213.246:7477 --cluster-replicas 1< /strong > |
-a 代表是加密链接,后面的ip组,排序不用关心,redis会按照主和从不在一台服务器上的原则,帮助构建主从情况,当然down机之后主从也会跟着去变换。--cluster-replicas 1代表主从的比例是1:1,有条件也可以设置1主多从,保证高可用。
实际生产环境如果资源够用,建议至少6台服务器实现高可用。
16、通过上述构建出来的集群主从情况如下图,redis非常聪明
17、若需要连接集群,通过命令
1 2 | redis-cli -c -h 任意集群ip -p 任意端口7377 /7477 -a pwdxxxx #-c 代表的是集群模式访问 |
其他参考文章:https://blog.csdn.net/miss1181248983/article/details/90056960 可以去增加节点、删除节点、停止服务器观察节点主从变化等
18、集群的客户端连接方式注意要罗列所有ip地址做连接初始化,同时鉴于上述集群会发现用阿里云外网地址是无法连接的,会默认解析为内网ip,若要解决,需要修改配置文件,编组用外网ip编组,因为生产环境肯定要用内网连接,此步骤不做实验了。
外网ip连接问题:https://blog.csdn.net/lingbomanbu_lyl/article/details/107999780
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | @Configuration public class RedisClusterConfig { @Bean public RedisConnectionFactory redisConnectionFactory() { // 客户端读写分离配置 LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder() .readFrom(ReadFrom.REPLICA_PREFERRED) .build(); RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration(Arrays.asList( "122.51.151.130:6381" , "122.51.151.130:6382" , "122.51.151.130:6383" , "122.51.151.130:6384" , "122.51.151.130:6385" , "122.51.151.130:6386" )); return new LettuceConnectionFactory(redisClusterConfiguration, clientConfig); } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库