从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,下面是三台服务器的版本情况
lsb_release -a
2、安装Redis 6.0.10版本的,检查服务器环境是否满足
gcc -v #检查gcc版本,需要是8.3+的
3、安装tcl,否则编译redis的时候不通过,这里安装的时候直接使用rpm编译好的包执行安装即可。
小tips:国内有很多linux软件镜像,这里采用阿里云的镜像网站https://developer.aliyun.com/packageSearch?word=tcl,点开后直接搜索即可,注意使用自己需要的版本
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
#使用上面命令进行安装,注意安装的时候要重新获取一次rpm安装包地址,输入命令回车,一会之后再回车一次,即可以看到Done安装完成!
4、下载Redis,我们默认放到/usr/local/redis-6.0.10文件夹
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、下面以一台服务器为例,安装实例
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
#同时为了后续设置Redis开启启动,该文件顶部需要加上如下代码段,整体的文件注意如下截图
#!/bin/sh
# chkconfig: 2345 10 90
# description: Start and Stop redis
7、创建四个目录
- /etc/redis(存放redis的配置文件)
- /var/redis/7477(存放redis的持久化文件)
mkdir -p /etc/redis mkdir -p /var/redis/7477
mkdir -p /etc/redis-cluster #集群用
mkdir -p /var/log/redis #日志
8、修改redis实例的配置文件(默认在根目录下/usr/local/redis-6.0.10,redis.conf),拷贝到/etc/redis目录中,修改名称为7477.conf
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常用命令提示
ls #列出文件 ls -l #列出文件详情 chmod 777 文件名 #设置可执行文件 ps -ef|grep redis #列出包含redis字符的文件名字 cat 文件名字 #查看文件内容 vi 文件名字 #编辑文件内容,按住i,执行插入,esc退出,按/输入字符,代表查找,查找情况下按n,代表查找下一个,shift z z代表保存并退出
11、上述执行完单redis实例的安装,不出意外,环境的配置已经安装好了。可以通过如下命令启动下试试
cd /etc/init.d chmod 777 redis_7477 ./redis_7477 start #检查是否正常启动
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之后不需要安装 ,此处我们不用安装,直接构建集群即可
[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从。其中对于命令
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
-a 代表是加密链接,后面的ip组,排序不用关心,redis会按照主和从不在一台服务器上的原则,帮助构建主从情况,当然down机之后主从也会跟着去变换。--cluster-replicas 1代表主从的比例是1:1,有条件也可以设置1主多从,保证高可用。
实际生产环境如果资源够用,建议至少6台服务器实现高可用。
16、通过上述构建出来的集群主从情况如下图,redis非常聪明
17、若需要连接集群,通过命令
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
@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); } }