目的
通常我們在學(xué)習(xí)的時候是用自己的電腦作為服務(wù)器把redis集群服務(wù)和項目放到一起,或者開個虛擬機(jī)(VM)將Redis集群服務(wù)部署到VM里面來模擬線上環(huán)境。但考慮到自身電腦的性能問題,我們更好的是選擇云服務(wù)器(阿里云、騰訊云等)作為非開發(fā)項目的其他部署,如Mysql數(shù)據(jù)庫服務(wù)、Rocket MQ服務(wù)及Redis集群服務(wù)等。此時由于云服務(wù)器會提供內(nèi)網(wǎng)IP和公網(wǎng)IP且網(wǎng)卡是綁定在內(nèi)網(wǎng)IP上的,當(dāng)我們在部署好Redis集群服務(wù)并以公網(wǎng)IP創(chuàng)建集群,Spring Boot項目在整合Redis集群時會通過其中一個集群節(jié)點(diǎn)(程序會隨機(jī)選擇一個節(jié)點(diǎn))通過CLUSTER SLOTS命令獲取整個集群的節(jié)點(diǎn)信息,這時會出現(xiàn)一個問題,返回的其它節(jié)點(diǎn)信息是公網(wǎng)IP地址,只有用來獲取集群信息的這一個隨機(jī)節(jié)點(diǎn)獲取的是內(nèi)網(wǎng)IP地址,結(jié)果如下圖,這時當(dāng)我們在本地Spring Boot項目剛好訪問這個節(jié)點(diǎn)時由于是內(nèi)網(wǎng)IP地址所以無法訪問到這個Redis節(jié)點(diǎn),本文則是為了解決這一個問題。
#以集群模式進(jìn)入其中一個節(jié)點(diǎn),如7001節(jié)點(diǎn),并執(zhí)行命令查看Redis集群槽點(diǎn)分布信息
CLUSTER SLOTS
#上面命令作者結(jié)果如下,可以看到其它節(jié)點(diǎn)是公網(wǎng)IP,只有7001節(jié)點(diǎn)是內(nèi)網(wǎng)IP
1) 1) (integer) 10923
2) (integer) 16383
3) 1) "公網(wǎng)IP"
2) (integer) 7003
3) "7273d970b66d2dcb0257f4d7555309f5c2404a09"
4) 1) "公網(wǎng)IP"
2) (integer) 7004
3) "420299acf743549c19cab5ecf0b6cb9e0f482b9b"
2) 1) (integer) 5461
2) (integer) 10922
3) 1) "公網(wǎng)IP"
2) (integer) 7002
3) "f2dbad625bd52b102a916e5ae211cdc999a1d781"
4) 1) "公網(wǎng)IP"
2) (integer) 7006
3) "a4a884ed02f0da555020cb2e5fb5bbfbe2148a05"
3) 1) (integer) 0
2) (integer) 5460
3) 1) "內(nèi)網(wǎng)IP"
2) (integer) 7001
3) "54e44f550328562d3cf3984426dc9b163aa9e2b1"
4) 1) "公網(wǎng)IP"
2) (integer) 7005
3) "50dceba04d0fa0fd0080a5f842496db07f9366d9"
下面是Redis集群Cluster模式(三主三從)集群部署教程,已經(jīng)部署好的可以跳過
下載
Redis官網(wǎng)下載地址:https://redis.io/,本文所使用的版本是5.0.7,下載完成后上傳至云服務(wù)器,作者使用的是CentOS 7.6.1810
準(zhǔn)備工作
#解壓文件
tar -zxvf redis-5.0.7.tar.gz
#進(jìn)入解壓文件里面
cd redis-5.0.7
#編譯
make
#創(chuàng)建集群所需目錄(文件夾名字可任意)
mkdir -p ./cluster/{conf,data,logs}
#創(chuàng)建各節(jié)點(diǎn)的配置文件(文件名可任意,這里后面的數(shù)字代表端口便于查看)
touch ./cluster/conf/redis_700{1,2,3,4,5,6}.conf
#創(chuàng)建各節(jié)點(diǎn)數(shù)據(jù)文件夾(文件夾名字可任意,這里后面的數(shù)字代表端口便于查看)
mkdir ./cluster/data/redis_700{1,2,3,4,5,6}
配置
進(jìn)入cd ./cluster/conf/目錄可以看到有6個配置文件,它們分別對應(yīng)6個Redis節(jié)點(diǎn),將以下內(nèi)容寫入每個配置文件并做相對應(yīng)的修改,注釋位置為要修改位置。下面以redis_7001.conf配置文件為例
port 7001 #每個節(jié)點(diǎn)對應(yīng)的端口
daemonize yes
pidfile "/var/run/redis_7001.pid" #進(jìn)程id文件
logfile "/root/redis-5.0.7/cluster/logs/redis_7001.log" #日志文件路徑
dir "/root/redis-5.0.7/cluster/data/redis_7001" #數(shù)據(jù)存放文件夾路徑
masterauth 123456
requirepass 123456
appendonly yes
cluster-enabled yes
cluster-config-file nodes_7001.conf #節(jié)點(diǎn)集群信息文件名,節(jié)點(diǎn)第一次啟動時會在data相對應(yīng)節(jié)點(diǎn)目錄下自動生成
cluster-node-timeout 15000
啟動
進(jìn)入cd ./src目錄以下執(zhí)行命令啟動6個節(jié)點(diǎn),如果配置了環(huán)境變量可不用到這個目錄下
#啟動端口為7001的節(jié)點(diǎn)
./redis-server ../cluster/conf/redis_7001.conf
#啟動端口為7002的節(jié)點(diǎn)
./redis-server ../cluster/conf/redis_7002.conf
#啟動端口為7003的節(jié)點(diǎn)
./redis-server ../cluster/conf/redis_7003.conf
#啟動端口為7004的節(jié)點(diǎn)
./redis-server ../cluster/conf/redis_7004.conf
#啟動端口為7005的節(jié)點(diǎn)
./redis-server ../cluster/conf/redis_7005.conf
#啟動端口為7006的節(jié)點(diǎn)
./redis-server ../cluster/conf/redis_7006.conf
#查看Redis節(jié)點(diǎn)是否全部啟動
ps -ef|grep redis
#上面命令作者結(jié)果如下
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]
創(chuàng)建Redis集群
注意?。?!創(chuàng)建時要以
公網(wǎng)IP地址創(chuàng)建,創(chuàng)建如果順利則會出現(xiàn)一個提示輸入yes即可,由于作者已經(jīng)創(chuàng)建好了,此處完成圖忽略
./redis-cli -a 123456 --cluster create 公網(wǎng)IP:7001 公網(wǎng)IP:7002 公網(wǎng)IP:7003 公網(wǎng)IP:7004 公網(wǎng)IP:7005 公網(wǎng)IP:7006 --cluster-replicas 1
查看集群信息
#以集群方式進(jìn)入任意一個節(jié)點(diǎn),密碼為前面配置文件所配置密碼
./redis-cli -c -h 公網(wǎng)IP -p 7001 -a 123456
#進(jìn)入后查看Redis集群主從信息
CLUSTER NODES
#上面命令作者結(jié)果如下,master表示主庫,slave表示從庫,前面字母和數(shù)字表示節(jié)點(diǎn)ID,slave后面的字母和數(shù)字表示所屬主庫的節(jié)點(diǎn)ID,后面還有連接狀態(tài)等
50dceba04d0fa0fd0080a5f842496db07f9366d9 公網(wǎng)IP:7005@17005 slave 54e44f550328562d3cf3984426dc9b163aa9e2b1 0 1581404581690 9 connected
7273d970b66d2dcb0257f4d7555309f5c2404a09 公網(wǎng)IP:7003@17003 master - 0 1581404579686 12 connected 10923-16383
f2dbad625bd52b102a916e5ae211cdc999a1d781 公網(wǎng)IP:7002@17002 master - 0 1581404580688 14 connected 5461-10922
54e44f550328562d3cf3984426dc9b163aa9e2b1 內(nèi)網(wǎng)IP:7001@17001 myself,master - 0 1581404580000 9 connected 0-5460
420299acf743549c19cab5ecf0b6cb9e0f482b9b 公網(wǎng)IP:7004@17004 slave 7273d970b66d2dcb0257f4d7555309f5c2404a09 0 1581404581000 12 connected
a4a884ed02f0da555020cb2e5fb5bbfbe2148a05 公網(wǎng)IP:7006@17006 slave f2dbad625bd52b102a916e5ae211cdc999a1d781 0 1581404579000 14 connected
#查看Redis集群槽點(diǎn)分布信息
CLUSTER SLOTS
#上面命令作者結(jié)果如下
1) 1) (integer) 10923
2) (integer) 16383
3) 1) "公網(wǎng)IP"
2) (integer) 7003
3) "7273d970b66d2dcb0257f4d7555309f5c2404a09"
4) 1) "公網(wǎng)IP"
2) (integer) 7004
3) "420299acf743549c19cab5ecf0b6cb9e0f482b9b"
2) 1) (integer) 5461
2) (integer) 10922
3) 1) "公網(wǎng)IP"
2) (integer) 7002
3) "f2dbad625bd52b102a916e5ae211cdc999a1d781"
4) 1) "公網(wǎng)IP"
2) (integer) 7006
3) "a4a884ed02f0da555020cb2e5fb5bbfbe2148a05"
3) 1) (integer) 0
2) (integer) 5460
3) 1) "內(nèi)網(wǎng)IP"
2) (integer) 7001
3) "54e44f550328562d3cf3984426dc9b163aa9e2b1"
4) 1) "公網(wǎng)IP"
2) (integer) 7005
3) "50dceba04d0fa0fd0080a5f842496db07f9366d9"
至此,Redis的集群部署結(jié)束。
接下來是解決本章前面提出的問題。前面我們說到整合Spring Boot后,它會用任意節(jié)點(diǎn)通過
CLUSTER SLOTS命令去獲取集群中的槽點(diǎn)信息,我們可以看到上面的結(jié)果中7001節(jié)點(diǎn)返回的是內(nèi)網(wǎng)IP,其實當(dāng)我們用7002節(jié)點(diǎn)執(zhí)行CLUSTER SLOTS命令時會發(fā)現(xiàn)7002節(jié)點(diǎn)對應(yīng)的IP地址變?yōu)榱?code>內(nèi)網(wǎng)IP,而其他節(jié)點(diǎn)包括之前的7001節(jié)點(diǎn)都是公網(wǎng)IP,也就是說用哪個節(jié)點(diǎn)獲取集群信息則那個節(jié)點(diǎn)會變成內(nèi)網(wǎng)IP,這是因為每個節(jié)點(diǎn)的集群信息是從之前每個節(jié)點(diǎn)的配置文件里面的這一行cluster-config-file nodes_7001.conf指定文件里面讀取的信息,前面說過第一次啟動后會在cd ./cluster/data/相對應(yīng)節(jié)點(diǎn)目錄下生成該文件,打開該文件會發(fā)現(xiàn)每個節(jié)點(diǎn)自己本身的IP地址均為內(nèi)網(wǎng)IP,其他的均為公網(wǎng)IP,這是因為生成時自己節(jié)點(diǎn)的IP是通過讀取網(wǎng)卡IP作為地址的,由于云服務(wù)器的網(wǎng)卡地址是內(nèi)網(wǎng),所以這里是內(nèi)網(wǎng)IP。那么知道了它是怎么獲取信息的那就好解決了,以修改7001節(jié)點(diǎn)為例,解決步驟如下:
修改cluster-config-file
#查詢Redis節(jié)點(diǎn)進(jìn)程
ps -ef|grep redis
#上面命令作者結(jié)果如下
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節(jié)點(diǎn)進(jìn)程
kill -9 15974
#進(jìn)入7001節(jié)點(diǎn)data相對應(yīng)節(jié)點(diǎn)目錄
cd ./cluster/data/redis_7001/
#修改cluster-config-file,將內(nèi)網(wǎng)IP地址改為公網(wǎng)IP地址
vim nodes_7001.conf
#進(jìn)入src目錄
cd ../../../src
#重啟7001節(jié)點(diǎn),重啟后會自動加入回原來的集群
./redis-server ../cluster/conf/redis_7001.conf
#其它節(jié)點(diǎn)操作同上
至此,修改結(jié)束,其他節(jié)點(diǎn)修改方式同上,全部修改完重啟后走多一次查看集群信息一節(jié)的相關(guān)步驟,查看是否還存在
內(nèi)網(wǎng)IP地址