云服务器部署Redis集群(Cluster模式)及Spring|云服务器部署Redis集群(Cluster模式)及Spring Boot整合问题

目的 通常我们在学习的时候是用自己的电脑作为服务器把redis集群服务和项目放到一起,或者开个虚拟机(VM)将Redis集群服务部署到VM里面来模拟线上环境。但考虑到自身电脑的性能问题,我们更好的是选择云服务器(阿里云、腾讯云等)作为非开发项目的其他部署,如Mysql数据库服务、Rocket MQ服务及Redis集群服务等。此时由于云服务器会提供内网IP公网IP网卡是绑定在内网IP上的,当我们在部署好Redis集群服务并以公网IP创建集群,Spring Boot项目在整合Redis集群时会通过其中一个集群节点(程序会随机选择一个节点)通过CLUSTER SLOTS命令获取整个集群的节点信息,这时会出现一个问题,返回的其它节点信息是公网IP地址,只有用来获取集群信息的这一个随机节点获取的是内网IP地址,结果如下图,这时当我们在本地Spring Boot项目刚好访问这个节点时由于是内网IP地址所以无法访问到这个Redis节点,本文则是为了解决这一个问题。

#以集群模式进入其中一个节点,如7001节点,并执行命令查看Redis集群槽点分布信息 CLUSTER SLOTS #上面命令作者结果如下,可以看到其它节点是公网IP,只有7001节点是内网IP 1) 1) (integer) 10923 2) (integer) 16383 3) 1) "公网IP" 2) (integer) 7003 3) "7273d970b66d2dcb0257f4d7555309f5c2404a09" 4) 1) "公网IP" 2) (integer) 7004 3) "420299acf743549c19cab5ecf0b6cb9e0f482b9b" 2) 1) (integer) 5461 2) (integer) 10922 3) 1) "公网IP" 2) (integer) 7002 3) "f2dbad625bd52b102a916e5ae211cdc999a1d781" 4) 1) "公网IP" 2) (integer) 7006 3) "a4a884ed02f0da555020cb2e5fb5bbfbe2148a05" 3) 1) (integer) 0 2) (integer) 5460 3) 1) "内网IP" 2) (integer) 7001 3) "54e44f550328562d3cf3984426dc9b163aa9e2b1" 4) 1) "公网IP" 2) (integer) 7005 3) "50dceba04d0fa0fd0080a5f842496db07f9366d9"

【云服务器部署Redis集群(Cluster模式)及Spring|云服务器部署Redis集群(Cluster模式)及Spring Boot整合问题】下面是Redis集群Cluster模式(三主三从)集群部署教程,已经部署好的可以跳过
下载 Redis官网下载地址:https://redis.io/,本文所使用的版本是5.0.7,下载完成后上传至云服务器,作者使用的是CentOS 7.6.1810
准备工作
#解压文件 tar -zxvf redis-5.0.7.tar.gz #进入解压文件里面 cd redis-5.0.7 #编译 make #创建集群所需目录(文件夹名字可任意) mkdir -p ./cluster/{conf,data,logs} #创建各节点的配置文件(文件名可任意,这里后面的数字代表端口便于查看) touch ./cluster/conf/redis_700{1,2,3,4,5,6}.conf #创建各节点数据文件夹(文件夹名字可任意,这里后面的数字代表端口便于查看) mkdir ./cluster/data/redis_700{1,2,3,4,5,6}

配置 进入cd ./cluster/conf/目录可以看到有6个配置文件,它们分别对应6个Redis节点,将以下内容写入每个配置文件并做相对应的修改,注释位置为要修改位置。下面以redis_7001.conf配置文件为例
port 7001 #每个节点对应的端口 daemonize yes pidfile "/var/run/redis_7001.pid" #进程id文件 logfile "/root/redis-5.0.7/cluster/logs/redis_7001.log" #日志文件路径 dir "/root/redis-5.0.7/cluster/data/redis_7001" #数据存放文件夹路径 masterauth 123456 requirepass 123456 appendonly yes cluster-enabled yes cluster-config-file nodes_7001.conf #节点集群信息文件名,节点第一次启动时会在data相对应节点目录下自动生成 cluster-node-timeout 15000

启动 进入cd ./src目录以下执行命令启动6个节点,如果配置了环境变量可不用到这个目录下
#启动端口为7001的节点 ./redis-server ../cluster/conf/redis_7001.conf #启动端口为7002的节点 ./redis-server ../cluster/conf/redis_7002.conf #启动端口为7003的节点 ./redis-server ../cluster/conf/redis_7003.conf #启动端口为7004的节点 ./redis-server ../cluster/conf/redis_7004.conf #启动端口为7005的节点 ./redis-server ../cluster/conf/redis_7005.conf #启动端口为7006的节点 ./redis-server ../cluster/conf/redis_7006.conf #查看Redis节点是否全部启动 ps -ef|grep redis #上面命令作者结果如下 root15581 111490 14:52 pts/000:00:00 grep --color=auto redis root1597410 Feb10 ?00:01:02 redis-server *:7001 [cluster] root1615710 Feb10 ?00:00:59 redis-server *:7005 [cluster] root1630510 Feb10 ?00:01:01 redis-server *:7003 [cluster] root1640010 Feb10 ?00:01:01 redis-server *:7004 [cluster] root1648210 Feb10 ?00:01:04 redis-server *:7002 [cluster] root1655610 Feb10 ?00:00:58 redis-server *:7006 [cluster]

创建Redis集群
注意!!!创建时要以公网IP地址创建,创建如果顺利则会出现一个提示输入yes即可,由于作者已经创建好了,此处完成图忽略
./redis-cli -a 123456 --cluster create 公网IP:7001 公网IP:7002 公网IP:7003 公网IP:7004 公网IP:7005 公网IP:7006 --cluster-replicas 1

查看集群信息
#以集群方式进入任意一个节点,密码为前面配置文件所配置密码 ./redis-cli -c -h 公网IP -p 7001 -a 123456 #进入后查看Redis集群主从信息 CLUSTER NODES #上面命令作者结果如下,master表示主库,slave表示从库,前面字母和数字表示节点ID,slave后面的字母和数字表示所属主库的节点ID,后面还有连接状态等 50dceba04d0fa0fd0080a5f842496db07f9366d9 公网IP:7005@17005 slave 54e44f550328562d3cf3984426dc9b163aa9e2b1 0 1581404581690 9 connected 7273d970b66d2dcb0257f4d7555309f5c2404a09 公网IP:7003@17003 master - 0 1581404579686 12 connected 10923-16383 f2dbad625bd52b102a916e5ae211cdc999a1d781 公网IP:7002@17002 master - 0 1581404580688 14 connected 5461-10922 54e44f550328562d3cf3984426dc9b163aa9e2b1 内网IP:7001@17001 myself,master - 0 1581404580000 9 connected 0-5460 420299acf743549c19cab5ecf0b6cb9e0f482b9b 公网IP:7004@17004 slave 7273d970b66d2dcb0257f4d7555309f5c2404a09 0 1581404581000 12 connected a4a884ed02f0da555020cb2e5fb5bbfbe2148a05 公网IP:7006@17006 slave f2dbad625bd52b102a916e5ae211cdc999a1d781 0 1581404579000 14 connected #查看Redis集群槽点分布信息 CLUSTER SLOTS #上面命令作者结果如下 1) 1) (integer) 10923 2) (integer) 16383 3) 1) "公网IP" 2) (integer) 7003 3) "7273d970b66d2dcb0257f4d7555309f5c2404a09" 4) 1) "公网IP" 2) (integer) 7004 3) "420299acf743549c19cab5ecf0b6cb9e0f482b9b" 2) 1) (integer) 5461 2) (integer) 10922 3) 1) "公网IP" 2) (integer) 7002 3) "f2dbad625bd52b102a916e5ae211cdc999a1d781" 4) 1) "公网IP" 2) (integer) 7006 3) "a4a884ed02f0da555020cb2e5fb5bbfbe2148a05" 3) 1) (integer) 0 2) (integer) 5460 3) 1) "内网IP" 2) (integer) 7001 3) "54e44f550328562d3cf3984426dc9b163aa9e2b1" 4) 1) "公网IP" 2) (integer) 7005 3) "50dceba04d0fa0fd0080a5f842496db07f9366d9"

至此,Redis的集群部署结束。
接下来是解决本章前面提出的问题。前面我们说到整合Spring Boot后,它会用任意节点通过CLUSTER SLOTS命令去获取集群中的槽点信息,我们可以看到上面的结果中7001节点返回的是内网IP,其实当我们用7002节点执行CLUSTER SLOTS命令时会发现7002节点对应的IP地址变为了内网IP,而其他节点包括之前的7001节点都是公网IP,也就是说用哪个节点获取集群信息则那个节点会变成内网IP,这是因为每个节点的集群信息是从之前每个节点的配置文件里面的这一行cluster-config-file nodes_7001.conf指定文件里面读取的信息,前面说过第一次启动后会在cd ./cluster/data/相对应节点目录下生成该文件,打开该文件会发现每个节点自己本身的IP地址均为内网IP,其他的均为公网IP,这是因为生成时自己节点的IP是通过读取网卡IP作为地址的,由于云服务器的网卡地址是内网,所以这里是内网IP。那么知道了它是怎么获取信息的那就好解决了,以修改7001节点为例,解决步骤如下:
修改cluster-config-file
#查询Redis节点进程 ps -ef|grep redis #上面命令作者结果如下 root15581 111490 14:52 pts/000:00:00 grep --color=auto redis root1597410 Feb10 ?00:01:02 redis-server *:7001 [cluster] root1615710 Feb10 ?00:00:59 redis-server *:7005 [cluster] root1630510 Feb10 ?00:01:01 redis-server *:7003 [cluster] root1640010 Feb10 ?00:01:01 redis-server *:7004 [cluster] root1648210 Feb10 ?00:01:04 redis-server *:7002 [cluster] root1655610 Feb10 ?00:00:58 redis-server *:7006 [cluster] #杀死7001节点进程 kill -9 15974 #进入7001节点data相对应节点目录 cd ./cluster/data/redis_7001/ #修改cluster-config-file,将内网IP地址改为公网IP地址 vim nodes_7001.conf #进入src目录 cd ../../../src #重启7001节点,重启后会自动加入回原来的集群 ./redis-server ../cluster/conf/redis_7001.conf #其它节点操作同上

至此,修改结束,其他节点修改方式同上,全部修改完重启后走多一次查看集群信息一节的相关步骤,查看是否还存在内网IP地址

    推荐阅读