从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);
	}
}

  

posted @ 2021-02-01 12:37  jackchain  阅读(710)  评论(0编辑  收藏  举报