Redis集群(cluster模式)搭建過程
1、什么是集群
- Redis 集群(包括很多小集群)實現(xiàn)了對Redis的水平擴容,即啟動N個redis節(jié)點,將整個數(shù)據(jù)庫分布存儲在這N個節(jié)點中,每個節(jié)點存儲總數(shù)據(jù)的1/N,即一個小集群存儲1/N的數(shù)據(jù),每個小集群里面維護好自己的1/N的數(shù)據(jù)。
- Redis 集群通過分區(qū)(partition)來提供一定程度的可用性(availability): 即使集群中有一部分節(jié)點失效或者無法進行通訊, 集群也可以繼續(xù)處理命令請求。
- 該模式的redis集群特點是:分治、分片。
2、為什么使用
- 容量不夠,redis如何進行擴容?
- 并發(fā)寫操作, redis如何分?jǐn)偅?/li>
- 另外,主從模式,薪火相傳模式,主機宕機,導(dǎo)致ip地址發(fā)生變化,應(yīng)用程序中配置需要修改對應(yīng)的主機地址、端口等信息。
- 之前通過代理主機來解決,但是redis3.0中提供了解決方案。就是無中心化集群配置。
3、集群連接
- 普通方式登錄:可能直接進入讀主機,存儲數(shù)據(jù)時,會出現(xiàn)MOVED重定向操作,所以,應(yīng)該以集群方式登錄。
- 集群登錄:redis-cli -c -p 6379 采用集群策略連接,設(shè)置數(shù)據(jù)會自動切換到相應(yīng)的寫主機。
4、redis cluster 如何分配這六個節(jié)點?
- 一個集群至少要有三個主節(jié)點。
- 選項 –cluster-replicas 1 :表示我們希望為集群中的每個主節(jié)點創(chuàng)建一個從節(jié)點。
- 分配原則盡量保證每個主數(shù)據(jù)庫運行在不同的IP地址,每個從庫和主庫不在一個IP地址上。
5、集群搭建
1) 通過redis中utils路徑下 ./install_server.sh 執(zhí)行文件創(chuàng)建6個不同的redis節(jié)點,端口號分別為6379、6380、6381、8362、6383、6384
2)如果各個節(jié)點原本有存儲數(shù)據(jù),則先將各個節(jié)點的數(shù)據(jù)文件清空。將6個文件夾內(nèi)的文件全部刪除。
清空數(shù)據(jù)目錄。刪除 Redis 數(shù)據(jù)目錄下的所有文件。使用命令: rm -rf /path/to/redis/data/*
3)修改6個redis節(jié)點的配置文件
在 /etc/redis 文件中,找到每一個端口號對應(yīng)的配置文件:
例如修改的內(nèi)容如下:
bind 0.0.0.0 port 6380 # 設(shè)置成對應(yīng)服務(wù)專屬的端口號 daemonize yes dbfilename "dump6380.rdb" # 設(shè)置成對應(yīng)服務(wù)專屬的名字 appendonly yes cluster-enabled yes cluster-config-file nodes-6380.conf # 設(shè)置成對應(yīng)服務(wù)專屬的
4)啟動六個節(jié)點
[root@bogon src]# ./redis-server /etc/redis/6379.conf [root@bogon src]# ./redis-server /etc/redis/6380.conf [root@bogon src]# ./redis-server /etc/redis/6381.conf [root@bogon src]# ./redis-server /etc/redis/6382.conf [root@bogon src]# ./redis-server /etc/redis/6383.conf [root@bogon src]# ./redis-server /etc/redis/6384.conf
5)查看各個節(jié)點是否啟動成功
[root@bogon src]# ps -ef | grep redis root 3889 1 0 09:56 ? 00:00:03 ./redis-server 0.0.0.0:6379 [cluster] root 3895 1 0 09:56 ? 00:00:03 ./redis-server 0.0.0.0:6380 [cluster] root 3901 1 0 09:57 ? 00:00:03 ./redis-server 0.0.0.0:6381 [cluster] root 3907 1 0 09:57 ? 00:00:02 ./redis-server *:6382 [cluster] root 3913 1 0 09:57 ? 00:00:02 ./redis-server 0.0.0.0:6383 [cluster] root 3919 1 0 09:57 ? 00:00:02 ./redis-server 0.0.0.0:6384 [cluster] root 4247 2418 0 10:22 pts/0 00:00:00 grep --color=auto redis
6)配置集群
命令格式: --cluster-replicas 1 表示為每個master創(chuàng)建一個slave節(jié)點
注意:這里的IP為每個節(jié)點所在機器的真實IP
[root@localhost src]# ./redis-cli --cluster create 192.168.177.128:6379 192.168.177.128:6380 192.168.177.128:6381 192.168.177.128:6382 192.168.177.128:6383 192.168.177.128:6384 --cluster-replicas 1 >>> Performing hash slots allocation on 6 nodes... Master[0] -> Slots 0 - 5460 Master[1] -> Slots 5461 - 10922 Master[2] -> Slots 10923 - 16383 Adding replica 192.168.177.128:6383 to 192.168.177.128:6379 Adding replica 192.168.177.128:6384 to 192.168.177.128:6380 Adding replica 192.168.177.128:6382 to 192.168.177.128:6381 >>> Trying to optimize slaves allocation for anti-affinity [WARNING] Some slaves are in the same host as their master M: ae77569d28f01657d9e3e04810e8562abdb3f5dd 192.168.177.128:6379 slots:[0-5460] (5461 slots) master M: 5ccafb9ee2f223c987c740d3d8282f200e4892dd 192.168.177.128:6380 slots:[5461-10922] (5462 slots) master M: dcd5d5066cd9aa5e3f2830ce985395acb978d764 192.168.177.128:6381 slots:[10923-16383] (5461 slots) master S: 8849bb5437931a3fd8510ffa4c0f755f4e26d1eb 192.168.177.128:6382 replicates ae77569d28f01657d9e3e04810e8562abdb3f5dd S: b00800f65775c52519bd6e9f398f916ffe46fed8 192.168.177.128:6383 replicates 5ccafb9ee2f223c987c740d3d8282f200e4892dd S: 6e7a1ae63691267b000363f6528b620a656e03e7 192.168.177.128:6384 replicates dcd5d5066cd9aa5e3f2830ce985395acb978d764 Can I set the above configuration? (type 'yes' to accept): yes >>> 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 192.168.177.128:6379) M: ae77569d28f01657d9e3e04810e8562abdb3f5dd 192.168.177.128:6379 slots:[0-5460] (5461 slots) master 1 additional replica(s) M: dcd5d5066cd9aa5e3f2830ce985395acb978d764 192.168.177.128:6381 slots:[10923-16383] (5461 slots) master 1 additional replica(s) M: 5ccafb9ee2f223c987c740d3d8282f200e4892dd 192.168.177.128:6380 slots:[5461-10922] (5462 slots) master 1 additional replica(s) S: 8849bb5437931a3fd8510ffa4c0f755f4e26d1eb 192.168.177.128:6382 slots: (0 slots) slave replicates ae77569d28f01657d9e3e04810e8562abdb3f5dd S: b00800f65775c52519bd6e9f398f916ffe46fed8 192.168.177.128:6383 slots: (0 slots) slave replicates 5ccafb9ee2f223c987c740d3d8282f200e4892dd S: 6e7a1ae63691267b000363f6528b620a656e03e7 192.168.177.128:6384 slots: (0 slots) slave replicates dcd5d5066cd9aa5e3f2830ce985395acb978d764 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
7)查看主從關(guān)系
命令格式:redis-cli --cluster check 【本臺redis自己的IP】:【本臺redis自己的端口】
[root@localhost src]# ./redis-cli --cluster check 192.168.177.128:6379 192.168.177.128:6379 (ae77569d...) -> 0 keys | 5461 slots | 1 slaves. 192.168.177.128:6381 (dcd5d506...) -> 0 keys | 5461 slots | 1 slaves. 192.168.177.128:6380 (5ccafb9e...) -> 0 keys | 5462 slots | 1 slaves. [OK] 0 keys in 3 masters. 0.00 keys per slot on average. >>> Performing Cluster Check (using node 192.168.177.128:6379) M: ae77569d28f01657d9e3e04810e8562abdb3f5dd 192.168.177.128:6379 slots:[0-5460] (5461 slots) master 1 additional replica(s) M: dcd5d5066cd9aa5e3f2830ce985395acb978d764 192.168.177.128:6381 slots:[10923-16383] (5461 slots) master 1 additional replica(s) M: 5ccafb9ee2f223c987c740d3d8282f200e4892dd 192.168.177.128:6380 slots:[5461-10922] (5462 slots) master 1 additional replica(s) S: 8849bb5437931a3fd8510ffa4c0f755f4e26d1eb 192.168.177.128:6382 slots: (0 slots) slave replicates ae77569d28f01657d9e3e04810e8562abdb3f5dd S: b00800f65775c52519bd6e9f398f916ffe46fed8 192.168.177.128:6383 slots: (0 slots) slave replicates 5ccafb9ee2f223c987c740d3d8282f200e4892dd S: 6e7a1ae63691267b000363f6528b620a656e03e7 192.168.177.128:6384 slots: (0 slots) slave replicates dcd5d5066cd9aa5e3f2830ce985395acb978d764 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
查看下圖即可發(fā)現(xiàn),一主對一從:
8) 主節(jié)點數(shù)據(jù)寫測試
加參數(shù) -c ,防止路由失效
[root@bogon src]# ./redis-cli -p 6381 -c 127.0.0.1:6381> get name -> Redirected to slot [5798] located at 192.168.109.149:6380 (nil) 192.168.109.149:6380> get name (nil) 192.168.109.149:6380>
9)從節(jié)點讀數(shù)據(jù)測試
- 情況:redis cluster集群中slave節(jié)點能成功復(fù)制master節(jié)點數(shù)據(jù)槽數(shù)據(jù),但是無法get數(shù)據(jù),顯示只能到對應(yīng)的master節(jié)點讀取
- 原因:Redis Cluster集群中的從節(jié)點,官方默認(rèn)設(shè)置的是不分擔(dān)讀請求的、只作備份和故障轉(zhuǎn)移用,當(dāng)有請求讀向從節(jié)點時,會被重定向?qū)?yīng)的主節(jié)點來處理
- 解決辦法:在get數(shù)據(jù)之前先使用命令readonly,這個readonly告訴 Redis Cluster 從節(jié)點客戶端愿意讀取可能過時的數(shù)據(jù)并且對寫請求不感興趣
- 注意:斷開連接后readonly就失效了,再次連接需要重新使用該命令。
[root@bogon src]# ./redis-cli -p 6379 -c 127.0.0.1:6379> set name zhangsan -> Redirected to slot [5798] located at 192.168.109.149:6380 OK 192.168.109.149:6380> get name "zhangsan" 192.168.109.149:6380> [root@bogon src]# ./redis-cli -p 6383 -c 127.0.0.1:6383> get name -> Redirected to slot [5798] located at 192.168.109.149:6380 "zhangsan" 192.168.109.149:6380> [root@bogon src]# ./redis-cli -p 6383 -c 127.0.0.1:6383> readonly OK 127.0.0.1:6383> get name "zhangsan" 127.0.0.1:6383>
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Redis簡單動態(tài)字符串SDS的實現(xiàn)示例
Redis沒有直接復(fù)用C語言的字符串,而是新建了SDS,本文主要介紹了Redis簡單動態(tài)字符串SDS的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下2023-08-08Redis未授權(quán)訪問配合SSH key文件利用詳解
這篇文章主要給大家介紹了關(guān)于Redis未授權(quán)訪問配合SSH key文件利用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09Redis中有序集合的內(nèi)部實現(xiàn)方式的詳細(xì)介紹
本文主要介紹了Redis中有序集合的內(nèi)部實現(xiàn)方式的詳細(xì)介紹,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03redis5.0以上基于密碼認(rèn)證的集群cluster方式
這篇文章主要介紹了redis5.0以上基于密碼認(rèn)證的集群cluster方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11redis和rabbitmq實現(xiàn)延時隊列的示例代碼
在高并發(fā)場景下,延遲隊列顯得尤為重要,本文主要介紹了兩種方式,redis和rabbitmq實現(xiàn)延時隊列,具有一定的參考價值,感興趣的可以了解一下2024-03-03