欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

首頁綜合 正文
目錄

柚子快報邀請碼778899分享:緩存 【Redis】集群

柚子快報邀請碼778899分享:緩存 【Redis】集群

http://yzkb.51969.com/

文章目錄

一、集群是什么?二、 Redis集群分布式存儲為什么redis集群的最大槽數(shù)是16384(不太懂)redis的集群主節(jié)點數(shù)量基本不可能超過1000個

三、 配置集群(三主三從)3.1 配置config文件3.2 啟動六臺redis3.2 通過redis-cli命令為6臺機器構(gòu)建集群關系3.3 任意連接一個作為切入點(集群只需要連一個),并檢驗集群狀態(tài)

四、 擴展

以下是本篇文章正文內(nèi)容

一、集群是什么?

由于數(shù)據(jù)量過大,單個Master復制集難以承擔,因此需要對多個復制集進行集群,形成水平擴展每個復制集只負責存儲整個數(shù)據(jù)集的一部分,這就是Redis的集群,其作用是提供在多個Redis節(jié)點間共享數(shù)據(jù)的程序集。

Redis集群是一個提供在多個Redis節(jié)點間共享數(shù)據(jù)的程序集

Redis集群可以支持多個Master

Redis集群支持多個Master,每個Master又可以掛載多個Slave讀寫分離支持海量數(shù)據(jù)的高可用支持海量數(shù)據(jù)的讀寫存儲操作由于Cluster自帶Sentinel的故障轉(zhuǎn)移機制,內(nèi)置了高可用的支持,無需再去使用哨兵功能客戶端和Redis的節(jié)點連接,不再需要連接集群中所有節(jié)點,只需連接集群中的任意一個可用節(jié)點即可槽位slot負責分配到各個物理服務節(jié)點,由對應的集群來負責維護節(jié)點、插槽和數(shù)據(jù)之間的關系redis集群不保證強一致性,這意味著在特定的條件下,Redis集群可能會丟掉一些被系統(tǒng)收到的寫入請求命令

二、 Redis集群分布式存儲

槽位 集群的密鑰空間被分成16384個槽,有效地設置了16384個主節(jié)點的集群大小上限(但是,建議的最大節(jié)點大小約為1000個節(jié)點)。 Redis集群投有使用一致性hash,而是引入了哈希槽的概念. Redis集群有16384個哈希槽,每個key通過CRC16校驗后對16384取模來決定放置哪個槽。 集群的每個節(jié)點(master)負責一部分hash槽。

比如,有一個集群有三個節(jié)點:

分片 使用Redis集群時我們會將存儲的數(shù)據(jù)分散到多臺redis機器上,這稱為分片。簡言之,集群中的每個Redis實例都被認為是整個數(shù)據(jù)的一個分片。

如何找到給定key的分片:為了找到給定key的分片,我們對key進行CRC16(key)算法處理并通過對總分片數(shù)量取模。然后,使用確定性哈希函數(shù),這意味著給定的key將多次始終映射到同一個分片,我們可以推斷將來讀取特定key的位置。

Redis集群分布式存儲有大概有3種解決方法

哈希取余分區(qū) hash(key) % N個機器臺數(shù),計算出哈希值,用來決定數(shù)據(jù)映射到哪一個節(jié)點上。 優(yōu)點:

簡單粗暴,直接有效,只需要預估好數(shù)據(jù)規(guī)劃節(jié)點例如3臺、8臺、10臺,就能保證一段時間的數(shù)據(jù)支撐。使用Hash算法讓固定的一部分請求落到同一臺服務器上,這樣每臺服務器固定處理一部分請求(并維護這些請求的信息),起到負載均衡+分而治之的作用。

缺點:

直接規(guī)劃好節(jié)點,進行擴容或者縮容會很麻煩,不管擴還是縮,每次數(shù)據(jù)變動會導致節(jié)點有變動,映射關系都要重新計算,在服務器個數(shù)固定不變時沒有問題。如果需要彈性擴容或故障停機的情況下,原來的取模公式就會發(fā)生變化,Hash(key)/3會變成Hash(key) /?。此時地址經(jīng)過取余運算的結(jié)果將發(fā)生很大變化,根據(jù)公式獲取的服務器也會變得不可控。

一致性哈希算法分區(qū)

為了解決分布式緩存數(shù)據(jù)變動和映射問題,某個機器宕機了,分母數(shù)量改變了,自然取余數(shù)不行了。 目的是當服務器個數(shù)發(fā)生變動時,盡量減少影響客戶端到服務器的映射關系

算法步驟:

哈希槽分區(qū)

哈希槽實質(zhì)就是一個數(shù)組,數(shù)組[0,2^14 -1]形成hash slot空間。

解決均勻分配的問題,在數(shù)據(jù)和節(jié)點之間又加入了一層,把這層稱為哈希槽(slot),用于管理數(shù)據(jù)和節(jié)點之間的關系(即解決映射問題),現(xiàn)在就相當于節(jié)點上放的是槽,槽里放的是數(shù)據(jù)。 一個集群只能有16384個槽,編號0-16383(0-2^14-1)。這些槽會分配給集群中的所有主節(jié)點,分配策略沒有要求。

接下來就需要對key求哈希值,然后對16384取模,余數(shù)是幾key就落入對應的槽里。集群會記錄節(jié)點和槽的對應關系。 HASH_SLOT = CRC16(key) mod 16384。 以槽為單位移動數(shù)據(jù),因為槽的數(shù)目是固定的,處理起來比較容易,這樣數(shù)據(jù)移動問題就解決了。

寫入的總體流程:當需要在 Redis 集群中放置一個 key-value時,redis先對key使用crc16算法算出一個結(jié)果然后用結(jié)果對16384求余數(shù)[ CRC16(key) % 16384],這樣每個 key 都會對應一個編號在 0-16383 之間的哈希槽,也就是映射到某個節(jié)點上。

為什么redis集群的最大槽數(shù)是16384(不太懂)

Redis集群并沒有使用一致性hash而是引入了哈希槽的概念。Redis 集群有16384個哈希槽,每個key通過CRC16校驗后對16384取模來決定放置哪個槽,集群的每個節(jié)點負責一部分hash槽。

正常的心跳數(shù)據(jù)包帶有節(jié)點的完整配置,可以用冪等方式用舊的節(jié)點替換舊節(jié)點,以便更新舊的配置。這意味著它們包含原始節(jié)點的插槽配置,該節(jié)點使用2k的空間和16k的插槽,但是會使用8k的空間(使用65k的插槽)。同時,由于其他設計折衷,Redis集群不太可能擴展到1000個以上的主節(jié)點。因此16k處于正確的范圍內(nèi),以確保每個主機具有足夠的插槽,最多可容納1000個矩陣,但數(shù)量足夠少,可以輕松地將插槽配置作為原始位圖傳播。請注意,在小型群集中,位圖將難以壓縮,因為當N較小時,位圖將設置的slot / N位占設置位的很大百分比。

redis的集群主節(jié)點數(shù)量基本不可能超過1000個

集群節(jié)點越多,心跳包的消息體內(nèi)攜帶的數(shù)據(jù)越多。如果節(jié)點過1000個,也會導致網(wǎng)絡擁堵。因此redis作者不建議redis cluster節(jié)點數(shù)量超過1000個。 那么,對于節(jié)點數(shù)在1000以內(nèi)的redis cluster集群,16384個槽位夠用了。沒有必要拓展到65536個。

三、 配置集群(三主三從)

Redis集群為什么至少需要三個master節(jié)點? 因為新master的選舉需要大于半數(shù)的集群master節(jié)點同意才能選舉成功,如果只有兩個master節(jié)點,當其中一個掛了,是達不到選舉新master的條件的。

Redis集群為什么推薦節(jié)點數(shù)為奇數(shù)? 奇數(shù)個master節(jié)點可以在滿足選舉該條件的基礎上節(jié)省一個節(jié)點,比如三個master節(jié)點和四個master節(jié)點的集群相比,大家如果都掛了一個master節(jié)點都能選舉新master節(jié)點,如果都掛了兩個master節(jié)點都沒法選舉新master節(jié)點了,所以奇數(shù)的master節(jié)點更多的是從節(jié)省機器資源角度出發(fā)說的。

3.1 配置config文件

本案例的配置是在一臺虛擬機的6個端口分別配置了6個redis服務器

端口 6381

vim /myredis/cluster/redisCluster6381.conf

bind 0.0.0.0

daemonize yes

protected-mode no

port 6381

logfile "/myredis/cluster/cluster6381.log"

pidfile /myredis/cluster6381.pid

dir /myredis/cluster

dbfilename dump6381.rdb

appendonly yes

appendfilename "appendonly6381.aof"

requirepass 123456

masterauth 123456

cluster-enabled yes

cluster-config-file nodes-6381.conf

cluster-node-timeout 5000

端口 6382

vim /myredis/cluster/redisCluster6382.conf

bind 0.0.0.0

daemonize yes

protected-mode no

port 6382

logfile "/myredis/cluster/cluster6382.log"

pidfile /myredis/cluster6382.pid

dir /myredis/cluster

dbfilename dump6382.rdb

appendonly yes

appendfilename "appendonly6382.aof"

requirepass 123456

masterauth 123456

cluster-enabled yes

cluster-config-file nodes-6382.conf

cluster-node-timeout 5000

端口 6383

vim /myredis/cluster/redisCluster6383.conf

bind 0.0.0.0

daemonize yes

protected-mode no

port 6383

logfile "/myredis/cluster/cluster6383.log"

pidfile /myredis/cluster6383.pid

dir /myredis/cluster

dbfilename dump6383.rdb

appendonly yes

appendfilename "appendonly6383.aof"

requirepass 123456

masterauth 123456

cluster-enabled yes

cluster-config-file nodes-6383.conf

cluster-node-timeout 5000

端口 6384

vim /myredis/cluster/redisCluster6384.conf

bind 0.0.0.0

daemonize yes

protected-mode no

port 6384

logfile "/myredis/cluster/cluster6384.log"

pidfile /myredis/cluster6384.pid

dir /myredis/cluster

dbfilename dump6384.rdb

appendonly yes

appendfilename "appendonly6384.aof"

requirepass 123456

masterauth 123456

cluster-enabled yes

cluster-config-file nodes-6384.conf

cluster-node-timeout 5000

端口 6385

vim /myredis/cluster/redisCluster6385.conf

bind 0.0.0.0

daemonize yes

protected-mode no

port 6385

logfile "/myredis/cluster/cluster6385.log"

pidfile /myredis/cluster6385.pid

dir /myredis/cluster

dbfilename dump6385.rdb

appendonly yes

appendfilename "appendonly6385.aof"

requirepass 123456

masterauth 123456

cluster-enabled yes

cluster-config-file nodes-6385.conf

cluster-node-timeout 5000

端口 6386

vim /myredis/cluster/redisCluster6386.conf

bind 0.0.0.0

daemonize yes

protected-mode no

port 6386

logfile "/myredis/cluster/cluster6386.log"

pidfile /myredis/cluster6386.pid

dir /myredis/cluster

dbfilename dump6386.rdb

appendonly yes

appendfilename "appendonly6386.aof"

requirepass 123456

masterauth 123456

cluster-enabled yes

cluster-config-file nodes-6386.conf

cluster-node-timeout 5000

3.2 啟動六臺redis

redis-server /myredis/cluster/redisCluster6381.conf

..........

redis-server /myredis/cluster/redisCluster6386.conf

3.2 通過redis-cli命令為6臺機器構(gòu)建集群關系

redis-cli -a 123456 --cluster create --cluster-replicas 1 192.168.88.130:6381 192.168.88.130:6382 192.168.88.130:6383 192.168.88.130:6384 192.168.88.130:6385 192.168.88.130:6386

-cluster-replicas 1 表示為每個master創(chuàng)建一個slave節(jié)點

3.3 任意連接一個作為切入點(集群只需要連一個),并檢驗集群狀態(tài)

連接6381端口

redis-cli -a 123456 -p 6381 -c // -c表示集群 不加的話不是按照集群啟動的,對于在別的機器上的key,會報錯

不加 -c 啟動 ,在存值時,可能會報錯,原因是在計算槽位時,可能是在別的master下管理的槽位 下圖中的槽位是在6384端口,所以需要在6384端口的redis進行set操作 加上-c之后,會進行自動重定向

查看集群主從關系

cluster nodes // 查看集群的主從關系

查看集群信息

cluster info // 查看集群信息

查看某個key該屬于對應的槽位值

CLUSTER KEYSLOT key //查詢key所在的槽位值

四、 擴展

不在同一個slot槽位下的鍵值無法使用mset.mget等多鍵操作

可以通過{}來定義同一個組的概念,使key中內(nèi)相同內(nèi)容的鍵值對放到一個slot槽位去,對照下圖類似k1k2k3都映射為x,

集群是否完整才能對外提供服務

在配置文件中有以下代碼

cluster-require-full-coverage

默認YES,現(xiàn)在集群架構(gòu)是3主3從的redis cluster由3個master平分16384個slot,每個master的小集群負責1/3的slot,對應一部分數(shù)據(jù)。 cluster-require-full-coverage:默認值 yes,即需要集群完整性,方可對外提供服務通常情況,如果這3個小集群中,任何一個(1主1從)掛了,你這個集群對外可提供的數(shù)據(jù)只有2/3了,整個集群是不完整的, redis 默認在這種情況下,是不會對外提供服務的。

如果你的訴求是,集群不完整的話也需要對外提供服務,需要將該參數(shù)設置為no ,這樣的話你掛了的那個小集群是不行了,但是其他的小集群仍然可以對外提供服務。

柚子快報邀請碼778899分享:緩存 【Redis】集群

http://yzkb.51969.com/

精彩內(nèi)容

評論可見,查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。

轉(zhuǎn)載請注明,如有侵權,聯(lián)系刪除。

本文鏈接:http://gantiao.com.cn/post/19562663.html

發(fā)布評論

您暫未設置收款碼

請在主題配置——文章設置里上傳

掃描二維碼手機訪問

文章目錄