Redis 集群★★★

Redis6總綱

http://www.reibang.com/p/901dc5a0c683

目錄

1全封、搭建
2马昙、故障恢復(fù)
3桃犬、jredis開發(fā)

阿K須知點:

操作集群的添加,查詢(對應(yīng)的插槽機(jī))行楞,查看節(jié)點(cluseer nodes)都必須在主機(jī)上面操作攒暇。

一、搭建

1子房、解決兩個問題

(1)容量不夠形用,redis如何進(jìn)行擴(kuò)容?
(2)并發(fā)寫操作证杭, redis如何分?jǐn)偅?/p>

另外尾序,主從模式,薪火相傳模式躯砰,主機(jī)宕機(jī)每币,導(dǎo)致ip地址發(fā)生變化,應(yīng)用程序中配置需要修改對應(yīng)的主機(jī)地址琢歇、端口等信息兰怠。

之前通過代理主機(jī)來解決,但是redis3.0中提供了解決方案李茫。就是無中心化集群配置

2揭保、什么是集群

(1)Redis 集群實現(xiàn)了對Redis的水平擴(kuò)容,即啟動N個redis節(jié)點魄宏,將整個數(shù)據(jù)庫分布存儲在這N個節(jié)點中秸侣,每個節(jié)點存儲總數(shù)據(jù)的1/N。
(2)Redis 集群通過分區(qū)(partition)來提供一定程度的可用性(availability): 即使集群中有一部分節(jié)點失效或者無法進(jìn)行通訊宠互, 集群也可以繼續(xù)處理命令請求味榛。

3、開擼(制作6個實例予跌,6379,6380,6381,6389,6390,6391)

(1)刪除持久化數(shù)據(jù):將rdb,aof文件都刪除掉搏色。
rm -rf dump63*.rdb

[root@VM-0-13-centos ~]# cd /myredis
[root@VM-0-13-centos myredis]# ls
dump6379.rdb  dump6381.rdb    redis6380.conf  redis.conf
dump6380.rdb  redis6379.conf  redis6381.conf  sentinel.conf
[root@VM-0-13-centos myredis]# rm -rf dump63*.rdb
[root@VM-0-13-centos myredis]# ls
redis6379.conf  redis6380.conf  redis6381.conf  redis.conf  sentinel.conf

(2)配置基本信息

[root@VM-0-13-centos myredis]# cat redis6379.conf
include /myredis/redis.conf
pidfile "/var/run/redis_6379.pid"
port 6379
dbfilename "dump6379.rdb"

(3)添加配置信息
cluster-enabled yes 打開集群模式

cluster-config-file nodes-6379.conf 設(shè)定節(jié)點配置文件名

cluster-node-timeout 15000 設(shè)定節(jié)點失聯(lián)時間,超過該時間(毫秒)券册,集群自動進(jìn)行主從切換频轿。

[root@VM-0-13-centos myredis]# cat redis6379.conf
include /myredis/redis.conf
pidfile "/var/run/redis_6379.pid"
port 6379
dbfilename "dump6379.rdb"
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000

(4)復(fù)制出其他五個節(jié)點的配置文件

cp redis6379.conf redis6380.conf
......
cp redis6379.conf redis6391.conf

(5)全局替換配置的端口號
vi 下運行 %s/6379/6380,其他幾個以此類推

image.png

(6)啟動6個節(jié)點服務(wù)

[root@VM-0-13-centos myredis]# redis-server redis6379.conf
[root@VM-0-13-centos myredis]# redis-server redis6380.conf
[root@VM-0-13-centos myredis]# redis-server redis6381.conf
[root@VM-0-13-centos myredis]# redis-server redis6389.conf
[root@VM-0-13-centos myredis]# redis-server redis6390.conf
[root@VM-0-13-centos myredis]# redis-server redis6391.conf

(7)組合之前先確定6個節(jié)點實例啟動成功烁焙,nodes-xxxx.conf文件都生成正常(合體前的檢查)

[root@VM-0-13-centos myredis]# ll
total 144
-rw-r--r-- 1 root root   114 Dec  1 23:13 nodes-6379.conf
-rw-r--r-- 1 root root   114 Dec  1 23:13 nodes-6380.conf
-rw-r--r-- 1 root root   114 Dec  1 23:13 nodes-6381.conf
-rw-r--r-- 1 root root   114 Dec  1 23:13 nodes-6389.conf
-rw-r--r-- 1 root root   114 Dec  1 23:14 nodes-6390.conf
-rw-r--r-- 1 root root   114 Dec  1 23:14 nodes-6391.conf
-rw-r--r-- 1 root root   181 Dec  1 22:55 redis6379.conf
-rw-r--r-- 1 root root   181 Dec  1 23:01 redis6380.conf
-rw-r--r-- 1 root root   181 Dec  1 23:01 redis6381.conf
-rw-r--r-- 1 root root   181 Dec  1 23:02 redis6389.conf
-rw-r--r-- 1 root root   181 Dec  1 23:02 redis6390.conf
-rw-r--r-- 1 root root   181 Dec  1 23:03 redis6391.conf
-rw-r--r-- 1 root root 92223 Nov 30 21:50 redis.conf
-rw-r--r-- 1 root root   392 Dec  1 20:27 sentinel.conf

(8)查看是否有 rb環(huán)境(合體前的檢查)
切換到 cd /opt/redis-6.2.1/src

image.png

redis6.2.1及其以上是有封裝這個環(huán)境航邢,以下的版本需要自己裝

(9)將6個節(jié)點合成一個集群(合體!)
以下命令要在cd /opt/redis-6.2.1/src目錄下才能執(zhí)行

redis-cli --cluster create --cluster-replicas 1 172.16.0.13:6379 172.16.0.13:6380 172.16.0.13:6381 172.16.0.13:6389 172.16.0.13:6390 172.16.0.13:6391

此處不要用127.0.0.1骄蝇, 請用真實IP地址
--replicas 1 采用最簡單的方式配置集群膳殷,一臺主機(jī),一臺從機(jī)乞榨,正好三組秽之。


image.png

(10)登錄:此時不能已普通方式登錄当娱,插入等操作會出重定向的問題
-c 采用集群策略連接,設(shè)置數(shù)據(jù)會自動切換到相應(yīng)的寫主機(jī)
redis-cli -c -p 6379

image.png

這里需要注意考榨,保證6個端口都是開放的跨细,否則運行后會超時

(11)通過 cluster nodes 命令查看集群信息

127.0.0.1:6380> CLUSTER NODES
e78e278a3cc33c4a865bad7ea86bb722b6afa7fe 172.16.0.13:6391@16391 slave ef3ba51385b31592b3acd21c51ca9f9050b23fbd 0 1638458289000 1 connected
ef3ba51385b31592b3acd21c51ca9f9050b23fbd 172.16.0.13:6379@16379 master - 0 1638458289779 1 connected 0-5460
a907d625a8b92a9ba429722cca79c94ad344ad88 172.16.0.13:6380@16380 myself,master - 0 1638458288000 2 connected 5461-10922
4938a160c0fc0fdb6dc5e3f212dafaeb32793176 172.16.0.13:6381@16381 master - 0 1638458290000 3 connected 10923-16383
bc322a21770479fb1488245e5a7f28ca7f417265 172.16.0.13:6389@16389 slave a907d625a8b92a9ba429722cca79c94ad344ad88 0 1638458291806 2 connected
f6fb7918b4823db8bd3555f45eb6a04c0425c254 172.16.0.13:6390@16390 slave 4938a160c0fc0fdb6dc5e3f212dafaeb32793176 0 1638458290781 3 connected

二、集群原理

(1)redis cluster 如何分配這六個節(jié)點?

一個集群至少要有三個主節(jié)點河质。

選項 --cluster-replicas 1 表示我們希望為集群中的每個主節(jié)點創(chuàng)建一個從節(jié)點冀惭。(一對一)

分配原則盡量保證每個主數(shù)據(jù)庫運行在不同的IP地址,每個從庫和主庫不在一個IP地址上掀鹅。

(2)什么是slots
一個 Redis 集群包含 16384 個插槽(hash slot)散休, 數(shù)據(jù)庫中的每個鍵都屬于這 16384 個插槽的其中一個,
集群使用公式 CRC16(key) % 16384 來計算鍵 key 屬于哪個槽乐尊, 其中 CRC16(key) 語句用于計算鍵 key 的 CRC16 校驗和 戚丸。

集群中的每個節(jié)點負(fù)責(zé)處理一部分插槽。 舉個例子扔嵌, 如果一個集群可以有主節(jié)點限府, 其中:
節(jié)點 A 負(fù)責(zé)處理 0 號至 5460 號插槽。
節(jié)點 B 負(fù)責(zé)處理 5461 號至 10922 號插槽痢缎。
節(jié)點 C 負(fù)責(zé)處理 10923 號至 16383 號插槽胁勺。

image.png

(3)在集群中錄入值

在redis-cli每次錄入、查詢鍵值独旷,redis都會計算出該key應(yīng)該送往的插槽署穗,如果不是該客戶端對應(yīng)服務(wù)器的插槽,redis會報錯嵌洼,并告知應(yīng)前往的redis實例地址和端口案疲。

redis-cli客戶端提供了 –c 參數(shù)實現(xiàn)自動重定向。

如 redis-cli -c –p 6379 登入后咱台,再錄入络拌、查詢鍵值對可以自動重定向。

不在一個slot下的鍵值回溺,是不能使用mget,mset等多鍵操作。

127.0.0.1:6380> mset k1 v1 k2 v2 ke v3
(error) CROSSSLOT Keys in request don't hash to the same slot

可以通過{}來定義組的概念混萝,從而使key中{}內(nèi)相同內(nèi)容的鍵值對放到一個slot中去遗遵。

127.0.0.1:6380> mset name{user} jack age{user} 20
OK

(4)查詢集群中的值
CLUSTER GETKEYSINSLOT <slot><count> 返回 count 個 slot 槽中的鍵。

127.0.0.1:6380> CLUSTER KEYSLOT user
(integer) 5474
127.0.0.1:6380> CLUSTER COUNTKEYSINSLOT 5474
(integer) 2
127.0.0.1:6380> CLUSTER GETKEYSINSLOT 5474 2
1) "age{user}"
2) "name{user}"

三逸嘀、故障恢復(fù)

1车要、如果主節(jié)點下線?

從節(jié)點能否自動升為主節(jié)點崭倘?注意:15秒超時
原本是 6380主機(jī)的 從機(jī) 6389上位了

[root@VM-0-13-centos ~]# redis-cli -c -p  6380
127.0.0.1:6380> shutdown
not connected> exit
[root@VM-0-13-centos ~]# ps -ef|grep redis
root     19658     1  0 14:40 ?        00:00:50 redis-server *:6381 [cluster]
root     19664     1  0 14:40 ?        00:00:49 redis-server *:6389 [cluster]
root     19670     1  0 14:41 ?        00:00:49 redis-server *:6390 [cluster]
root     19676     1  0 14:41 ?        00:00:49 redis-server *:6391 [cluster]
root     19686     1  0 14:42 ?        00:00:50 redis-server *:6379 [cluster]
root     19739 19610  0 14:57 pts/1    00:00:00 redis-cli -c -p 6379
root     24776 24515  0 23:34 pts/0    00:00:00 grep --color=auto redis
[root@VM-0-13-centos ~]# redis-cli -c -p  6381
127.0.0.1:6381> cluster nodes
ef3ba51385b31592b3acd21c51ca9f9050b23fbd 172.16.0.13:6379@16379 master - 0 1638459347964 1 connected 0-5460
4938a160c0fc0fdb6dc5e3f212dafaeb32793176 172.16.0.13:6381@16381 myself,master - 0 1638459348000 3 connected 10923-16383
f6fb7918b4823db8bd3555f45eb6a04c0425c254 172.16.0.13:6390@16390 slave 4938a160c0fc0fdb6dc5e3f212dafaeb32793176 0 1638459348000 3 connected
bc322a21770479fb1488245e5a7f28ca7f417265 172.16.0.13:6389@16389 master - 0 1638459348989 7 connected 5461-10922
e78e278a3cc33c4a865bad7ea86bb722b6afa7fe 172.16.0.13:6391@16391 slave ef3ba51385b31592b3acd21c51ca9f9050b23fbd 0 1638459347000 1 connected
a907d625a8b92a9ba429722cca79c94ad344ad88 172.16.0.13:6380@16380 master,fail - 1638459257471 1638459254000 2 disconnected

2翼岁、主節(jié)點恢復(fù)后类垫,主從關(guān)系會如何?

主節(jié)點回來變成從機(jī)琅坡。

[root@VM-0-13-centos ~]# redis-server /myredis/redis6380.conf
[root@VM-0-13-centos ~]# redis-cli -c -p 6389
127.0.0.1:6389> cluster nodes
a907d625a8b92a9ba429722cca79c94ad344ad88 :0@0 master,fail,noaddr - 1638459258445 1638459254000 2 disconnected
e78e278a3cc33c4a865bad7ea86bb722b6afa7fe 172.16.0.13:6391@16391 slave ef3ba51385b31592b3acd21c51ca9f9050b23fbd 0 1638459799000 1 connected
ef3ba51385b31592b3acd21c51ca9f9050b23fbd 172.16.0.13:6379@16379 master - 0 1638459798000 1 connected 0-5460
4938a160c0fc0fdb6dc5e3f212dafaeb32793176 172.16.0.13:6381@16381 master - 0 1638459800592 3 connected 10923-16383
f6fb7918b4823db8bd3555f45eb6a04c0425c254 172.16.0.13:6390@16390 slave 4938a160c0fc0fdb6dc5e3f212dafaeb32793176 0 1638459799578 3 connected
bc322a21770479fb1488245e5a7f28ca7f417265 172.16.0.13:6389@16389 myself,master - 0 1638459799000 7 connected 5461-10922

3悉患、如果所有某一段插槽的主從節(jié)點都宕掉,redis服務(wù)是否還能繼續(xù)?

如果某一段插槽的主從都掛掉榆俺,而cluster-require-full-coverage 為yes 售躁,那么 ,整個集群都掛掉

如果某一段插槽的主從都掛掉茴晋,而cluster-require-full-coverage 為no 陪捷,那么,該插槽數(shù)據(jù)全都不能使用诺擅,也無法存儲市袖,但是整個集群還可以用。

redis.conf中的參數(shù) cluster-require-full-coverage

查看 參數(shù)情況:config get cluster-require-full-coverage

127.0.0.1:6389> config get cluster-require-full-coverage
1) "cluster-require-full-coverage"
2) "yes"

四烁涌、jredis開發(fā)

1苍碟、說明

即使連接的不是主機(jī),集群會自動切換主機(jī)存儲烹玉。主機(jī)寫驰怎,從機(jī)讀。
無中心化主從集群二打。無論從哪臺主機(jī)寫的數(shù)據(jù)县忌,其他主機(jī)上都能讀到數(shù)據(jù)。

2继效、代碼

    public static void main(String[] args) {
        // 創(chuàng)建對象
        HostAndPort hostAndPort = new HostAndPort ("172.16.0.13",6390);
        JedisCluster jedisCluster = new JedisCluster (hostAndPort);

        // 操作
        jedisCluster.set ("bb1","vv1");
        String value = jedisCluster.get ("bb1");
        System.out.println (value );

        jedisCluster.close ();
    }

3症杏、Redis 集群提供了以下好處

(1)實現(xiàn)擴(kuò)容
(2)分?jǐn)倝毫?br> (3)無中心配置相對簡單

4、缺點

(1)多鍵操作是不被支持的
(2)多鍵的Redis事務(wù)是不被支持的瑞信。lua腳本不被支持
(3)由于集群方案出現(xiàn)較晚厉颤,很多公司已經(jīng)采用了其他的集群方案,而代理或者客戶端分片的方案想要遷移至redis cluster凡简,需要整體遷移而不是逐步過渡逼友,復(fù)雜度較大。

端口開放

1秤涩、開啟防火墻 
    systemctl start firewalld

2帜乞、開放指定端口
      firewall-cmd --zone=public --add-port=1935/tcp --permanent
 命令含義:
--zone #作用域
--add-port=1935/tcp  #添加端口,格式為:端口/通訊協(xié)議
--permanent  #永久生效筐眷,沒有此參數(shù)重啟后失效

3黎烈、重啟防火墻
      firewall-cmd --reload

4、查看端口號
netstat -ntlp   //查看當(dāng)前所有tcp端口·

netstat -ntulp |grep 1935   //查看所有1935端口使用情況·

搭建遇到的問題參考的博客

使用rb合體:https://blog.csdn.net/weixin_42350858/article/details/108229438

發(fā)現(xiàn)rb運行不了:https://blog.csdn.net/fly910905/article/details/85274463

開放端口:https://www.cnblogs.com/sxmny/p/11224842.html

cluster-require-full-coverage 參數(shù):https://blog.51cto.com/liuzhanbin/1871514

節(jié)點重新加入集群:https://blog.csdn.net/qq_35613498/article/details/105523536

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市照棋,隨后出現(xiàn)的幾起案子资溃,更是在濱河造成了極大的恐慌,老刑警劉巖烈炭,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溶锭,死亡現(xiàn)場離奇詭異,居然都是意外死亡梳庆,警方通過查閱死者的電腦和手機(jī)暖途,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來膏执,“玉大人驻售,你說我怎么就攤上這事「祝” “怎么了欺栗?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長征峦。 經(jīng)常有香客問我迟几,道長,這世上最難降的妖魔是什么栏笆? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任类腮,我火速辦了婚禮,結(jié)果婚禮上蛉加,老公的妹妹穿的比我還像新娘蚜枢。我一直安慰自己,他們只是感情好针饥,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布厂抽。 她就那樣靜靜地躺著,像睡著了一般丁眼。 火紅的嫁衣襯著肌膚如雪筷凤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天苞七,我揣著相機(jī)與錄音藐守,去河邊找鬼。 笑死蹂风,一個胖子當(dāng)著我的面吹牛吗伤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播硫眨,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了礁阁?” 一聲冷哼從身側(cè)響起巧号,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎姥闭,沒想到半個月后丹鸿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡棚品,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年靠欢,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铜跑。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡门怪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锅纺,到底是詐尸還是另有隱情掷空,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布囤锉,位于F島的核電站坦弟,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏官地。R本人自食惡果不足惜酿傍,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望驱入。 院中可真熱鬧赤炒,春花似錦、人聲如沸沧侥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宴杀。三九已至癣朗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間旺罢,已是汗流浹背旷余。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留扁达,地道東北人正卧。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像跪解,于是被迫代替她去往敵國和親炉旷。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容