欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Redis集群模式搭建與原理詳解-創(chuàng)新互聯(lián)

1. Redis集群方案

創(chuàng)新互聯(lián)公司是一家成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè),提供網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),網(wǎng)站制作,建網(wǎng)站,定制制作,網(wǎng)站開(kāi)發(fā)公司,于2013年成立是互聯(lián)行業(yè)建設(shè)者,服務(wù)者。以提升客戶(hù)品牌價(jià)值為核心業(yè)務(wù),全程參與項(xiàng)目的網(wǎng)站策劃設(shè)計(jì)制作,前端開(kāi)發(fā),后臺(tái)程序制作以及后期項(xiàng)目運(yùn)營(yíng)并提出專(zhuān)業(yè)建議和思路。

Redis Cluster 集群模式通常具有高可用、可擴(kuò)展性、分布式、容錯(cuò)等特性。Redis 分布式方案一般有兩種:

1.1 客戶(hù)端分區(qū)方案

客戶(hù)端就已經(jīng)決定數(shù)據(jù)會(huì)被存儲(chǔ)到哪個(gè) redis 節(jié)點(diǎn)或者從哪個(gè) redis 節(jié)點(diǎn)讀取數(shù)據(jù)。其主要思想是采用哈希算法將 Redis 數(shù)據(jù)的 key 進(jìn)行散列,通過(guò) hash 函數(shù),特定的 key會(huì)映射到特定的 Redis 節(jié)點(diǎn)上。

深入剖析Redis-Redis集群模式搭建與原理詳解

客戶(hù)端分區(qū)方案的代表為 Redis Sharding,Redis Sharding 是 Redis Cluster 出來(lái)之前,業(yè)界普遍使用的 Redis多實(shí)例集群方法。Java?的 Redis 客戶(hù)端驅(qū)動(dòng)庫(kù) Jedis,支持 Redis Sharding 功能,即 ShardedJedis 以及結(jié)合緩存池的 ShardedJedisPool。

優(yōu)點(diǎn)

不使用第三方中間件,分區(qū)邏輯可控,配置簡(jiǎn)單,節(jié)點(diǎn)之間無(wú)關(guān)聯(lián),容易線(xiàn)性擴(kuò)展,靈活性強(qiáng)。

缺點(diǎn)

客戶(hù)端無(wú)法動(dòng)態(tài)增刪服務(wù)節(jié)點(diǎn),客戶(hù)端需要自行維護(hù)分發(fā)邏輯,客戶(hù)端之間無(wú)連接共享,會(huì)造成連接浪費(fèi)。

1.2. 代理分區(qū)方案

客戶(hù)端發(fā)送請(qǐng)求到一個(gè)代理組件,代理解析客戶(hù)端的數(shù)據(jù),并將請(qǐng)求轉(zhuǎn)發(fā)至正確的節(jié)點(diǎn),最后將結(jié)果回復(fù)給客戶(hù)端。

優(yōu)點(diǎn):簡(jiǎn)化客戶(hù)端的分布式邏輯,客戶(hù)端透明接入,切換成本低,代理的轉(zhuǎn)發(fā)和存儲(chǔ)分離。 缺點(diǎn):多了一層代理層,加重了架構(gòu)部署復(fù)雜度和性能損耗。

深入剖析Redis-Redis集群模式搭建與原理詳解

代理分區(qū)主流實(shí)現(xiàn)的有方案有 Twemproxy 和 Codis。

1.2.1. Twemproxy

Twemproxy 也叫 nutcraker,是 twitter 開(kāi)源的一個(gè) redis 和 memcache 的中間代理服務(wù)器程序。Twemproxy 作為代理,可接受來(lái)自多個(gè)程序的訪(fǎng)問(wèn),按照路由規(guī)則,轉(zhuǎn)發(fā)給后臺(tái)的各個(gè) Redis 服務(wù)器,再原路返回。Twemproxy 存在單點(diǎn)故障問(wèn)題,需要結(jié)合 Lvs 和 Keepalived 做高可用方案。

深入剖析Redis-Redis集群模式搭建與原理詳解

優(yōu)點(diǎn):應(yīng)用范圍廣,穩(wěn)定性較高,中間代理層高可用。 缺點(diǎn):無(wú)法平滑地水平擴(kuò)容/縮容,無(wú)可視化管理界面,運(yùn)維不友好,出現(xiàn)故障,不能自動(dòng)轉(zhuǎn)移。

1.2.2. Codis

Codis 是一個(gè)分布式Redis 解決方案,對(duì)于上層應(yīng)用來(lái)說(shuō),連接 Codis-Proxy 和直接連接原生的Redis-Server 沒(méi)有的區(qū)別。Codis 底層會(huì)處理請(qǐng)求的轉(zhuǎn)發(fā),不停機(jī)的進(jìn)行數(shù)據(jù)遷移等工作。Codis 采用了無(wú)狀態(tài)的代理層,對(duì)于客戶(hù)端來(lái)說(shuō),一切都是透明的。

深入剖析Redis-Redis集群模式搭建與原理詳解

優(yōu)點(diǎn)

實(shí)現(xiàn)了上層 Proxy 和底層 Redis 的高可用,數(shù)據(jù)分片和自動(dòng)平衡,提供命令行接口和 RESTful API,提供監(jiān)控和管理界面,可以動(dòng)態(tài)添加和刪除Redis 節(jié)點(diǎn)。

缺點(diǎn)

部署架構(gòu)和配置復(fù)雜,不支持跨機(jī)房和多租戶(hù),不支持鑒權(quán)管理。

1.3. 查詢(xún)路由方案

客戶(hù)端隨機(jī)地請(qǐng)求任意一個(gè) Redis 實(shí)例,然后由 Redis 將請(qǐng)求轉(zhuǎn)發(fā)給正確的 Redis 節(jié)點(diǎn)。Redis Cluster 實(shí)現(xiàn)了一種混合形式的查詢(xún)路由,但并不是直接將請(qǐng)求從一個(gè) Redis 節(jié)點(diǎn)轉(zhuǎn)發(fā)到另一個(gè) Redis 節(jié)點(diǎn),而是在客戶(hù)端的幫助下直接重定向( redirected)到正確的 Redis 節(jié)點(diǎn)。

深入剖析Redis-Redis集群模式搭建與原理詳解

優(yōu)點(diǎn)

無(wú)中心節(jié)點(diǎn),數(shù)據(jù)按照槽存儲(chǔ)分布在多個(gè) Redis 實(shí)例上,可以平滑的進(jìn)行節(jié)點(diǎn)擴(kuò)容/縮容,支持高可用和自動(dòng)故障轉(zhuǎn)移,運(yùn)維成本低。

缺點(diǎn)

嚴(yán)重依賴(lài) Redis-trib 工具,缺乏監(jiān)控管理,需要依賴(lài) Smart Client (維護(hù)連接,緩存路由表,MultiOp 和 Pipeline 支持)。Failover 節(jié)點(diǎn)的檢測(cè)過(guò)慢,不如中心節(jié)點(diǎn)ZooKeeper 及時(shí)。Gossip 消息具有一定開(kāi)銷(xiāo)。無(wú)法根據(jù)統(tǒng)計(jì)區(qū)分冷熱數(shù)據(jù)。

2. 數(shù)據(jù)分布

2.1. 數(shù)據(jù)分布理論

分布式數(shù)據(jù)庫(kù)首先要解決把整個(gè)數(shù)據(jù)集按照分區(qū)規(guī)則映射到多個(gè)節(jié)點(diǎn)的問(wèn)題,即把數(shù)據(jù)集劃分到多個(gè)節(jié)點(diǎn)上,每個(gè)節(jié)點(diǎn)負(fù)責(zé)整體數(shù)據(jù)的一個(gè)子集。

深入剖析Redis-Redis集群模式搭建與原理詳解

數(shù)據(jù)分布通常有哈希分區(qū)和順序分區(qū)兩種方式,對(duì)比如下:

分區(qū)方式 特點(diǎn) 相關(guān)產(chǎn)品 哈希分區(qū) 離散程度好,數(shù)據(jù)分布與業(yè)務(wù)無(wú)關(guān),無(wú)法順序訪(fǎng)問(wèn) Redis Cluster,Cassandra,Dynamo 順序分區(qū) 離散程度易傾斜,數(shù)據(jù)分布與業(yè)務(wù)相關(guān),可以順序訪(fǎng)問(wèn) BigTable,HBase,Hypertable 由于 Redis Cluster 采用哈希分區(qū)規(guī)則,這里重點(diǎn)討論哈希分區(qū)。常見(jiàn)的哈希分區(qū)規(guī)則有幾種,下面分別介紹:

2.1.1. 節(jié)點(diǎn)取余分區(qū)

使用特定的數(shù)據(jù),如 Redis 的鍵或用戶(hù)ID,再根據(jù)節(jié)點(diǎn)數(shù)量N 使用公式:hash(key)% N 計(jì)算出哈希值,用來(lái)決定數(shù)據(jù)映射到哪一個(gè)節(jié)點(diǎn)上。

深入剖析Redis-Redis集群模式搭建與原理詳解

優(yōu)點(diǎn)

這種方式的突出優(yōu)點(diǎn)是簡(jiǎn)單性,常用于數(shù)據(jù)庫(kù)的分庫(kù)分表規(guī)則。一般采用預(yù)分區(qū)的方式,提前根據(jù)數(shù)據(jù)量規(guī)劃好分區(qū)數(shù),比如劃分為 512 或 1024 張表,保證可支撐未來(lái)一段時(shí)間的數(shù)據(jù)容量,再根據(jù)負(fù)載情況將表遷移到其他數(shù)據(jù)庫(kù)中。擴(kuò)容時(shí)通常采用翻倍擴(kuò)容,避免數(shù)據(jù)映射全部被打亂,導(dǎo)致全量遷移的情況。

缺點(diǎn)

當(dāng)節(jié)點(diǎn)數(shù)量變化時(shí),如擴(kuò)容或收縮節(jié)點(diǎn),數(shù)據(jù)節(jié)點(diǎn)映射關(guān)系需要重新計(jì)算,會(huì)導(dǎo)致數(shù)據(jù)的重新遷移。

2.1.2. 一致性哈希分區(qū)

一致性哈??梢院芎玫慕鉀Q穩(wěn)定性問(wèn)題,可以將所有的存儲(chǔ)節(jié)點(diǎn)排列在收尾相接的 Hash 環(huán)上,每個(gè) key 在計(jì)算 Hash 后會(huì)順時(shí)針找到臨接的存儲(chǔ)節(jié)點(diǎn)存放。而當(dāng)有節(jié)點(diǎn)加入或退出時(shí),僅影響該節(jié)點(diǎn)在 Hash 環(huán)上順時(shí)針相鄰的后續(xù)節(jié)點(diǎn)。

深入剖析Redis-Redis集群模式搭建與原理詳解

優(yōu)點(diǎn)

加入和刪除節(jié)點(diǎn)只影響哈希環(huán)中順時(shí)針?lè)较虻南噜彽墓?jié)點(diǎn),對(duì)其他節(jié)點(diǎn)無(wú)影響。

缺點(diǎn)

加減節(jié)點(diǎn)會(huì)造成哈希環(huán)中部分?jǐn)?shù)據(jù)無(wú)法命中。當(dāng)使用少量節(jié)點(diǎn)時(shí),節(jié)點(diǎn)變化將大范圍影響哈希環(huán)中數(shù)據(jù)映射,不適合少量數(shù)據(jù)節(jié)點(diǎn)的分布式方案。普通的一致性哈希分區(qū)在增減節(jié)點(diǎn)時(shí)需要增加一倍或減去一半節(jié)點(diǎn)才能保證數(shù)據(jù)和負(fù)載的均衡。

注意:因?yàn)橐恢滦怨7謪^(qū)的這些缺點(diǎn),一些分布式系統(tǒng)采用虛擬槽對(duì)一致性哈希進(jìn)行改進(jìn),比如 Dynamo 系統(tǒng)。

2.1.3. 虛擬槽分區(qū)

虛擬槽分區(qū)巧妙地使用了哈希空間,使用分散度良好的哈希函數(shù)把所有數(shù)據(jù)映射到一個(gè)固定范圍的整數(shù)集合中,整數(shù)定義為槽(slot)。這個(gè)范圍一般遠(yuǎn)遠(yuǎn)大于節(jié)點(diǎn)數(shù),比如 Redis Cluster 槽范圍是 0 ~ 16383。槽是集群內(nèi)數(shù)據(jù)管理和遷移的基本單位。采用大范圍槽的主要目的是為了方便數(shù)據(jù)拆分和集群擴(kuò)展。每個(gè)節(jié)點(diǎn)會(huì)負(fù)責(zé)一定數(shù)量的槽,如圖所示:

深入剖析Redis-Redis集群模式搭建與原理詳解

當(dāng)前集群有 5 個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)平均大約負(fù)責(zé) 3276 個(gè)槽。由于采用高質(zhì)量的哈希算法,每個(gè)槽所映射的數(shù)據(jù)通常比較均勻,將數(shù)據(jù)平均劃分到 5 個(gè)節(jié)點(diǎn)進(jìn)行數(shù)據(jù)分區(qū)。Redis Cluster 就是采用虛擬槽分區(qū)。

節(jié)點(diǎn)1: 包含 0 到 3276 號(hào)哈希槽。 節(jié)點(diǎn)2:包含 3277 到 6553 號(hào)哈希槽。 節(jié)點(diǎn)3:包含 6554 到 9830 號(hào)哈希槽。 節(jié)點(diǎn)4:包含 9831 到 13107 號(hào)哈希槽。 節(jié)點(diǎn)5:包含 13108 到 16383 號(hào)哈希槽。

這種結(jié)構(gòu)很容易添加或者刪除節(jié)點(diǎn)。如果增加一個(gè)節(jié)點(diǎn) 6,就需要從節(jié)點(diǎn) 1 ~ 5 獲得部分槽分配到節(jié)點(diǎn) 6 上。如果想移除節(jié)點(diǎn) 1,需要將節(jié)點(diǎn) 1 中的槽移到節(jié)點(diǎn) 2 ~ 5 上,然后將沒(méi)有任何槽的節(jié)點(diǎn) 1 從集群中移除即可。

由于從一個(gè)節(jié)點(diǎn)將哈希槽移動(dòng)到另一個(gè)節(jié)點(diǎn)并不會(huì)停止服務(wù),所以無(wú)論添加刪除或者改變某個(gè)節(jié)點(diǎn)的哈希槽的數(shù)量都不會(huì)造成集群不可用的狀態(tài).

2.2. Redis的數(shù)據(jù)分區(qū)

Redis Cluster 采用虛擬槽分區(qū),所有的鍵根據(jù)哈希函數(shù)映射到 0~16383 整數(shù)槽內(nèi),計(jì)算公式:slot = CRC16(key)& 16383。每個(gè)節(jié)點(diǎn)負(fù)責(zé)維護(hù)一部分槽以及槽所映射的鍵值數(shù)據(jù),如圖所示:

深入剖析Redis-Redis集群模式搭建與原理詳解

2.2.1. Redis虛擬槽分區(qū)的特點(diǎn)

解耦數(shù)據(jù)和節(jié)點(diǎn)之間的關(guān)系,簡(jiǎn)化了節(jié)點(diǎn)擴(kuò)容和收縮難度。 節(jié)點(diǎn)自身維護(hù)槽的映射關(guān)系,不需要客戶(hù)端或者代理服務(wù)維護(hù)槽分區(qū)元數(shù)據(jù)。 支持節(jié)點(diǎn)、槽、鍵之間的映射查詢(xún),用于數(shù)據(jù)路由、在線(xiàn)伸縮等場(chǎng)景。

2.3. Redis集群的功能限制

Redis 集群相對(duì)單機(jī)在功能上存在一些限制,需要開(kāi)發(fā)人員提前了解,在使用時(shí)做好規(guī)避。

key批量操作支持有限。

類(lèi)似 mset、mget 操作,目前只支持對(duì)具有相同 slot 值的 key 執(zhí)行批量操作。對(duì)于映射為不同slot 值的 key 由于執(zhí)行 mget、mget 等操作可能存在于多個(gè)節(jié)點(diǎn)上,因此不被支持。

key事務(wù)操作支持有限。

只支持多key 在同一節(jié)點(diǎn)上的事務(wù)操作,當(dāng)多個(gè) key 分布在不同的節(jié)點(diǎn)上時(shí)無(wú)法使用事務(wù)功能。

key 作為數(shù)據(jù)分區(qū)的最小粒度

不能將一個(gè)大的鍵值對(duì)象如 hash、list 等映射到不同的節(jié)點(diǎn)。

不支持多數(shù)據(jù)庫(kù)空間

單機(jī)下的 Redis 可以支持 16 個(gè)數(shù)據(jù)庫(kù)(db0 ~ db15),集群模式下只能使用一個(gè)數(shù)據(jù)庫(kù)空間,即 db0。

復(fù)制結(jié)構(gòu)只支持一層

從節(jié)點(diǎn)只能復(fù)制主節(jié)點(diǎn),不支持嵌套樹(shù)狀復(fù)制結(jié)構(gòu)。

3. Redis集群搭建

Redis-Cluster 是 Redis 官方的一個(gè)高可用解決方案,Cluster 中的 Redis 共有 2^14(16384) 個(gè) slot槽。創(chuàng)建 Cluster 后,槽會(huì)平均分配到每個(gè) Redis 節(jié)點(diǎn)上。

下面介紹一下本機(jī)啟動(dòng) 6 個(gè) Redis 的集群服務(wù),并使用 redis-trib.rb 創(chuàng)建3主3從的集群。搭建集群工作需要以下三個(gè)步驟:

3.1. 準(zhǔn)備節(jié)點(diǎn)

Redis 集群一般由多個(gè)節(jié)點(diǎn)組成,節(jié)點(diǎn)數(shù)量至少為 6 個(gè),才能保證組成完整高可用的集群。每個(gè)節(jié)點(diǎn)需要開(kāi)啟配置cluster-enabled yes,讓 Redis 運(yùn)行在集群模式下。

Redis 集群的節(jié)點(diǎn)規(guī)劃如下:

節(jié)點(diǎn)名稱(chēng) 端口號(hào) 是主是從 所屬主節(jié)點(diǎn) redis-6379 6379 主節(jié)點(diǎn) --- redis-6389 6389 從節(jié)點(diǎn) redis-6379 redis-6380 6380 主節(jié)點(diǎn) --- redis-6390 6390 從節(jié)點(diǎn) redis-6380 redis-6381 6381 主節(jié)點(diǎn) --- redis-6391 6391 從節(jié)點(diǎn) redis-6381注意:建議為集群內(nèi)所有節(jié)點(diǎn)統(tǒng)一目錄,一般劃分三個(gè)目錄:conf、data、log,分別存放配置、數(shù)據(jù)和日志相關(guān)文件。把 6 個(gè)節(jié)點(diǎn)配置統(tǒng)一放在 conf 目錄下。

3.1.1. 創(chuàng)建redis各實(shí)例目錄

$ sudo mkdir -p /usr/local/redis-cluster

$ cd /usr/local/redis-cluster

$ sudo mkdir conf data log

$ sudo mkdir -p data/redis-6379 data/redis-6389 data/redis-6380 data/redis-6390 data/redis-6381 data/redis-6391

復(fù)制代碼

3.1.2. redis配置文件管理

根據(jù)以下模板配置各個(gè)實(shí)例的 redis.conf,以下只是搭建集群需要的基本配置,可能需要根據(jù)實(shí)際情況做修改。

# redis后臺(tái)運(yùn)行

daemonize yes

# 綁定的主機(jī)端口

bind 127.0.0.1

# 數(shù)據(jù)存放目錄

dir /usr/local/redis-cluster/data/redis-6379

# 進(jìn)程文件

pidfile /var/run/redis-cluster/${自定義}.pid

# 日志文件

logfile /usr/local/redis-cluster/log/${自定義}.log

# 端口號(hào)

port 6379

# 開(kāi)啟集群模式,把注釋#去掉

cluster-enabled yes

# 集群的配置,配置文件首次啟動(dòng)自動(dòng)生成

cluster-config-file /usr/local/redis-cluster/conf/${自定義}.conf

# 請(qǐng)求超時(shí),設(shè)置10秒

cluster-node-timeout 10000

# aof日志開(kāi)啟,有需要就開(kāi)啟,它會(huì)每次寫(xiě)操作都記錄一條日志

appendonly yes

復(fù)制代碼

redis-6379.conf

daemonize yes

bind 127.0.0.1

dir /usr/local/redis-cluster/data/redis-6379

pidfile /var/run/redis-cluster/redis-6379.pid

logfile /usr/local/redis-cluster/log/redis-6379.log

port 6379

cluster-enabled yes

cluster-config-file /usr/local/redis-cluster/conf/node-6379.conf

cluster-node-timeout 10000

appendonly yes

復(fù)制代碼

redis-6389.conf

daemonize yes

bind 127.0.0.1

dir /usr/local/redis-cluster/data/redis-6389

pidfile /var/run/redis-cluster/redis-6389.pid

logfile /usr/local/redis-cluster/log/redis-6389.log

port 6389

cluster-enabled yes

cluster-config-file /usr/local/redis-cluster/conf/node-6389.conf

cluster-node-timeout 10000

appendonly yes

復(fù)制代碼

redis-6380.conf

daemonize yes

bind 127.0.0.1

dir /usr/local/redis-cluster/data/redis-6380

pidfile /var/run/redis-cluster/redis-6380.pid

logfile /usr/local/redis-cluster/log/redis-6380.log

port 6380

cluster-enabled yes

cluster-config-file /usr/local/redis-cluster/conf/node-6380.conf

cluster-node-timeout 10000

appendonly yes

復(fù)制代碼

redis-6390.conf

daemonize yes

bind 127.0.0.1

dir /usr/local/redis-cluster/data/redis-6390

pidfile /var/run/redis-cluster/redis-6390.pid

logfile /usr/local/redis-cluster/log/redis-6390.log

port 6390

cluster-enabled yes

cluster-config-file /usr/local/redis-cluster/conf/node-6390.conf

cluster-node-timeout 10000

appendonly yes

復(fù)制代碼

redis-6381.conf

daemonize yes

bind 127.0.0.1

dir /usr/local/redis-cluster/data/redis-6381

pidfile /var/run/redis-cluster/redis-6381.pid

logfile /usr/local/redis-cluster/log/redis-6381.log

port 6381

cluster-enabled yes

cluster-config-file /usr/local/redis-cluster/conf/node-6381.conf

cluster-node-timeout 10000

appendonly yes

復(fù)制代碼

redis-6391.conf

daemonize yes

bind 127.0.0.1

dir /usr/local/redis-cluster/data/redis-6391

pidfile /var/run/redis-cluster/redis-6391.pid

logfile /usr/local/redis-cluster/log/redis-6391.log

port 6391

cluster-enabled yes

cluster-config-file /usr/local/redis-cluster/conf/node-6391.conf

cluster-node-timeout 10000

appendonly yes

復(fù)制代碼

3.2. 環(huán)境準(zhǔn)備

3.2.1. 安裝Ruby環(huán)境

$ sudo brew install ruby

復(fù)制代碼

3.2.2. 準(zhǔn)備rubygem redis依賴(lài)

$ sudo gem install redis

Password:

Fetching: redis-4.0.2.gem (100%)

Successfully installed redis-4.0.2

Parsing documentation for redis-4.0.2

Installing ri documentation for redis-4.0.2

Done installing documentation for redis after 1 seconds

1 gem installed

復(fù)制代碼

3.2.3. 拷貝redis-trib.rb到集群根目錄

redis-trib.rb 是 redis 官方推出的管理 redis集群的工具,集成在 redis 的源碼?src 目錄下,將基于 redis 提供的集群命令封裝成簡(jiǎn)單、便捷、實(shí)用的操作工具。

$ sudo cp /usr/local/redis-4.0.11/src/redis-trib.rb /usr/local/redis-cluster

復(fù)制代碼

查看 redis-trib.rb 命令環(huán)境是否正確,輸出如下:

$ ./redis-trib.rb

Usage: redis-trib

create host1:port1 ... hostN:portN --replicas check host:port info host:port fix host:port --timeout reshard host:port --from --to --slots --yes --timeout --pipeline rebalance host:port --weight --auto-weights --use-empty-masters --timeout --simulate --pipeline --threshold add-node new_host:new_port existing_host:existing_port --slave --master-id del-node host:port node_id set-timeout host:port milliseconds call host:port command arg arg .. arg import host:port --from --copy --replace help (show this help) For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster. 復(fù)制代碼

redis-trib.rb 是 redis 作者用 ruby 完成的。redis-trib.rb命令行工具的具體功能如下:

命令 作用 create 創(chuàng)建集群 check 檢查集群 info 查看集群信息 fix 修復(fù)集群 reshard 在線(xiàn)遷移slot rebalance 平衡集群節(jié)點(diǎn)slot數(shù)量 add-node 將新節(jié)點(diǎn)加入集群 del-node 從集群中刪除節(jié)點(diǎn) set-timeout 設(shè)置集群節(jié)點(diǎn)間心跳連接的超時(shí)時(shí)間 call 在集群全部節(jié)點(diǎn)上執(zhí)行命令 import 將外部redis數(shù)據(jù)導(dǎo)入集群 3.3. 安裝集群

3.3.1. 啟動(dòng)redis服務(wù)節(jié)點(diǎn)

運(yùn)行如下命令啟動(dòng) 6 臺(tái) redis 節(jié)點(diǎn):

sudo redis-server conf/redis-6379.conf

sudo redis-server conf/redis-6389.conf

sudo redis-server conf/redis-6380.conf

sudo redis-server conf/redis-6390.conf

sudo redis-server conf/redis-6381.conf

sudo redis-server conf/redis-6391.conf

復(fù)制代碼

啟動(dòng)完成后,redis 以集群模式啟動(dòng),查看各個(gè) redis 節(jié)點(diǎn)的進(jìn)程狀態(tài):

$ ps -ef | grep redis-server

0 1908 1 0 4:59下午 0:00.01 redis-server *:6379 [cluster]

0 1911 1 0 4:59下午 0:00.01 redis-server *:6389 [cluster]

0 1914 1 0 4:59下午 0:00.01 redis-server *:6380 [cluster]

0 1917 1 0 4:59下午 0:00.01 redis-server *:6390 [cluster]

0 1920 1 0 4:59下午 0:00.01 redis-server *:6381 [cluster]

0 1923 1 0 4:59下午 0:00.01 redis-server *:6391 [cluster]

復(fù)制代碼

在每個(gè) redis 節(jié)點(diǎn)的 redis.conf 文件中,我們都配置了 cluster-config-file 的文件路徑,集群?jiǎn)?dòng)時(shí),conf 目錄會(huì)新生成集群節(jié)點(diǎn)配置文件。查看文件列表如下:

$ tree -L 3 .

.

├── appendonly.aof

├── conf

│ ├── node-6379.conf

│ ├── node-6380.conf

│ ├── node-6381.conf

│ ├── node-6389.conf

│ ├── node-6390.conf

│ ├── node-6391.conf

│ ├── redis-6379.conf

│ ├── redis-6380.conf

│ ├── redis-6381.conf

│ ├── redis-6389.conf

│ ├── redis-6390.conf

│ └── redis-6391.conf

├── data

│ ├── redis-6379

│ ├── redis-6380

│ ├── redis-6381

│ ├── redis-6389

│ ├── redis-6390

│ └── redis-6391

├── log

│ ├── redis-6379.log

│ ├── redis-6380.log

│ ├── redis-6381.log

│ ├── redis-6389.log

│ ├── redis-6390.log

│ └── redis-6391.log

└── redis-trib.rb

9 directories, 20 files

復(fù)制代碼

3.3.2. redis-trib關(guān)聯(lián)集群節(jié)點(diǎn)

按照從主到從的方式從左到右依次排列 6 個(gè) redis 節(jié)點(diǎn)。

$ sudo ./redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6389 127.0.0.1:6390 127.0.0.1:6391

復(fù)制代碼

集群創(chuàng)建后,redis-trib 會(huì)先將 16384 個(gè)哈希槽分配到 3 個(gè)主節(jié)點(diǎn),即 redis-6379,redis-6380 和 redis-6381。然后將各個(gè)從節(jié)點(diǎn)指向主節(jié)點(diǎn),進(jìn)行數(shù)據(jù)同步。

>>> Creating cluster

>>> Performing hash slots allocation on 6 nodes...

Using 3 masters:

127.0.0.1:6379

127.0.0.1:6380

127.0.0.1:6381

Adding replica 127.0.0.1:6390 to 127.0.0.1:6379

Adding replica 127.0.0.1:6391 to 127.0.0.1:6380

Adding replica 127.0.0.1:6389 to 127.0.0.1:6381

>>> Trying to optimize slaves allocation for anti-affinity

[WARNING] Some slaves are in the same host as their master

M: ad4b9ffceba062492ed67ab336657426f55874b7 127.0.0.1:6379

slots:0-5460 (5461 slots) master

M: df23c6cad0654ba83f0422e352a81ecee822702e 127.0.0.1:6380

slots:5461-10922 (5462 slots) master

M: ab9da92d37125f24fe60f1f33688b4f8644612ee 127.0.0.1:6381

slots:10923-16383 (5461 slots) master

S: 25cfa11a2b4666021da5380ff332b80dbda97208 127.0.0.1:6389

replicates ad4b9ffceba062492ed67ab336657426f55874b7

S: 48e0a4b539867e01c66172415d94d748933be173 127.0.0.1:6390

replicates df23c6cad0654ba83f0422e352a81ecee822702e

S: d881142a8307f89ba51835734b27cb309a0fe855 127.0.0.1:6391

replicates ab9da92d37125f24fe60f1f33688b4f8644612ee

復(fù)制代碼

然后輸入 yes,redis-trib.rb 開(kāi)始執(zhí)行節(jié)點(diǎn)握手和槽分配操作,輸出如下:

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 127.0.0.1:6379)

M: ad4b9ffceba062492ed67ab336657426f55874b7 127.0.0.1:6379

slots:0-5460 (5461 slots) master

1 additional replica(s)

M: ab9da92d37125f24fe60f1f33688b4f8644612ee 127.0.0.1:6381

slots:10923-16383 (5461 slots) master

1 additional replica(s)

S: 48e0a4b539867e01c66172415d94d748933be173 127.0.0.1:6390

slots: (0 slots) slave

replicates df23c6cad0654ba83f0422e352a81ecee822702e

S: d881142a8307f89ba51835734b27cb309a0fe855 127.0.0.1:6391

slots: (0 slots) slave

replicates ab9da92d37125f24fe60f1f33688b4f8644612ee

M: df23c6cad0654ba83f0422e352a81ecee822702e 127.0.0.1:6380

slots:5461-10922 (5462 slots) master

1 additional replica(s)

S: 25cfa11a2b4666021da5380ff332b80dbda97208 127.0.0.1:6389

slots: (0 slots) slave

replicates ad4b9ffceba062492ed67ab336657426f55874b7

[OK] All nodes agree about slots configuration.

>>> Check for open slots...

>>> Check slots coverage...

[OK] All 16384 slots covered.

復(fù)制代碼

執(zhí)行集群檢查,檢查各個(gè) redis 節(jié)點(diǎn)占用的哈希槽(slot)的個(gè)數(shù)以及 slot覆蓋率。16384 個(gè)槽位中,主節(jié)點(diǎn)redis-6379、redis-6380 和 redis-6381 分別占用了 5461、5461 和 5462 個(gè)槽位。

3.3.3. redis主節(jié)點(diǎn)的日志

可以發(fā)現(xiàn),通過(guò) BGSAVE 命令,從節(jié)點(diǎn)redis-6389 在后臺(tái)異步地從主節(jié)點(diǎn)redis-6379 同步數(shù)據(jù)。

$ cat log/redis-6379.log

1907:C 05 Sep 16:59:52.960 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo

1907:C 05 Sep 16:59:52.961 # Redis version=4.0.11, bits=64, commit=00000000, modified=0, pid=1907, just started

1907:C 05 Sep 16:59:52.961 # Configuration loaded

1908:M 05 Sep 16:59:52.964 * Increased maximum number of open files to 10032 (it was originally set to 256).

1908:M 05 Sep 16:59:52.965 * No cluster configuration found, I'm ad4b9ffceba062492ed67ab336657426f55874b7

1908:M 05 Sep 16:59:52.967 * Running mode=cluster, port=6379.

1908:M 05 Sep 16:59:52.967 # Server initialized

1908:M 05 Sep 16:59:52.967 * Ready to accept connections

1908:M 05 Sep 17:01:17.782 # configEpoch set to 1 via CLUSTER SET-CONFIG-EPOCH

1908:M 05 Sep 17:01:17.812 # IP address for this node updated to 127.0.0.1

1908:M 05 Sep 17:01:22.740 # Cluster state changed: ok

1908:M 05 Sep 17:01:23.681 * Slave 127.0.0.1:6389 asks for synchronization

1908:M 05 Sep 17:01:23.681 * Partial resynchronization not accepted: Replication ID mismatch (Slave asked for '4c5afe96cac51cde56039f96383ea7217ef2af41', my replication IDs are '037b661bf48c80c577d1fa937ba55367a3692921' and '0000000000000000000000000000000000000000')

1908:M 05 Sep 17:01:23.681 * Starting BGSAVE for SYNC with target: disk

1908:M 05 Sep 17:01:23.682 * Background saving started by pid 1952

1952:C 05 Sep 17:01:23.683 * DB saved on disk

1908:M 05 Sep 17:01:23.749 * Background saving terminated with success

1908:M 05 Sep 17:01:23.752 * Synchronization with slave 127.0.0.1:6389 succeeded

復(fù)制代碼

參考

《Redis 開(kāi)發(fā)與運(yùn)維》

另外送福利了,關(guān)于Redis的學(xué)習(xí)腦圖

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線(xiàn),公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。

當(dāng)前題目:Redis集群模式搭建與原理詳解-創(chuàng)新互聯(lián)
文章位置:http://chinadenli.net/article22/icgjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)、企業(yè)建站虛擬主機(jī)、網(wǎng)站設(shè)計(jì)、App設(shè)計(jì)、做網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)