云服务器部署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模式(三主三从)集群部署教程,已经部署好的可以跳过

下载

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
#上面命令作者结果如下
root     15581 11149  0 14:52 pts/0    00:00:00 grep --color=auto redis
root     15974     1  0 Feb10 ?        00:01:02 redis-server *:7001 [cluster]
root     16157     1  0 Feb10 ?        00:00:59 redis-server *:7005 [cluster]
root     16305     1  0 Feb10 ?        00:01:01 redis-server *:7003 [cluster]
root     16400     1  0 Feb10 ?        00:01:01 redis-server *:7004 [cluster]
root     16482     1  0 Feb10 ?        00:01:04 redis-server *:7002 [cluster]
root     16556     1  0 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
#上面命令作者结果如下
root     15581 11149  0 14:52 pts/0    00:00:00 grep --color=auto redis
root     15974     1  0 Feb10 ?        00:01:02 redis-server *:7001 [cluster]
root     16157     1  0 Feb10 ?        00:00:59 redis-server *:7005 [cluster]
root     16305     1  0 Feb10 ?        00:01:01 redis-server *:7003 [cluster]
root     16400     1  0 Feb10 ?        00:01:01 redis-server *:7004 [cluster]
root     16482     1  0 Feb10 ?        00:01:04 redis-server *:7002 [cluster]
root     16556     1  0 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地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342