久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

Redis高可用架構(gòu)搭建到原理分析

本篇文章給大家?guī)砹岁P(guān)于Redis的相關(guān)知識,其中主要介紹了關(guān)于高可用架構(gòu)搭建到原理分析的相關(guān)內(nèi)容,下面一起來看一下,希望對大家有幫助。

Redis高可用架構(gòu)搭建到原理分析

千萬級數(shù)據(jù)并發(fā)如何處理?進入學(xué)習(xí)

推薦學(xué)習(xí):Redis視頻教程

由于近期公司在做系統(tǒng)優(yōu)化,前段時間將大表進行分表后,現(xiàn)在又來搞redis了。關(guān)于redis,其中有一項要求就是將redis服務(wù)由阿里云遷移到公司自己的服務(wù)器中(由于公司性質(zhì)原因)。剛好借著這次機會,重新回顧一下redis的高可用集群架構(gòu)。redis集群方式有三種,分別為主從復(fù)制模式,哨兵模式以及Cluster集群模式,一般情況下哨兵和Cluster集群用的相對多一些,下面就來簡單理解這三種模式。

持久化機制

在理解集群架構(gòu)前,先要介紹一下redis的持久化機制,因為在后面的集群中會涉及到持久化。redis持久化是將緩存在內(nèi)存中的數(shù)據(jù)根據(jù)一些規(guī)則進行落盤,以防止在redis服務(wù)宕機時可以進行數(shù)據(jù)恢復(fù)或者是集群架構(gòu)中進行主從節(jié)點數(shù)據(jù)同步。redis持久化的方式有RDB和AOF兩種,在4.0版本后新出了混合持久化模式。

RDB

RDB是redis默認開啟的持久化機制,其持久化方式是按照用戶配置的規(guī)則"X秒內(nèi)至少發(fā)生過Y次改動",生成快照并落盤到dump.rdb二進制文件中。默認情況下,redis配置了三種,分別為900秒內(nèi)至少發(fā)生過1次緩存key的改動,300秒內(nèi)至少發(fā)生過10次緩存key的改動以及60秒內(nèi)至少發(fā)生過10000次改動。

Redis高可用架構(gòu)搭建到原理分析

除了redis自動快照持久化數(shù)據(jù)外,還有兩個命令可以幫助我們手動進行內(nèi)存數(shù)據(jù)快照,這兩個命令分別為savebgsave

Redis高可用架構(gòu)搭建到原理分析

  • save:以同步的方式進行數(shù)據(jù)快照,當緩存數(shù)據(jù)量大,會阻塞其他命令的執(zhí)行,效率不高。

  • bgsave:以異步的方式進行數(shù)據(jù)快照,有redis主線程fork出一個子進程來進行數(shù)據(jù)快照,不會阻塞其他命令的執(zhí)行,效率較高。由于是采用異步快照的方式,那么就有可能發(fā)生在快照的過程中,有其他命令對數(shù)據(jù)進行了修改。為了避免這個問題reids采用了寫時復(fù)制(Cpoy-On-Write)的方式,因為此時進行快照的進程是由主線程fork出來的,所以享有主線程的資源,當快照過程中發(fā)生數(shù)據(jù)改動時,那么該數(shù)據(jù)會被復(fù)制一份并生成副本數(shù)據(jù),子進程會將改副本數(shù)據(jù)寫入到dump.rdb文件中。

RDB快照是以二進制的方式進行存儲的,所以在數(shù)據(jù)恢復(fù)時,速度會比較快,但是它存在數(shù)據(jù)丟失的風(fēng)險。假如設(shè)置的快照規(guī)則為60秒內(nèi)至少發(fā)生100次數(shù)據(jù)改動,那么在50秒時,redis服務(wù)由于某種原因突然宕機了,那在這50秒內(nèi)的所有數(shù)據(jù)將會丟失。

AOF

AOF是Redis的另一種持久化方式,與RDB不同時是,AOF記錄著每一條更改數(shù)據(jù)的命令并保存到磁盤下的appendonly.aof文件中,當redis服務(wù)重啟時,會加載該文將并再次執(zhí)行文件中保存的命令,從而達到數(shù)據(jù)恢復(fù)的效果。默認情況下,AOF是關(guān)閉的,可以通過修改conf配置文件來進行開啟。

 # appendonly no  關(guān)閉AOF持久化  appendonly yes   # 開啟AOF持久化  # The name of the append only file (default: "appendonly.aof")  appendfilename "appendonly.aof" # 持久化文件名
登錄后復(fù)制

AOF提供了三種方式,可以讓命令保存到磁盤。默認情況下,AOF采用appendfsync everysec的方式進行命令持久化。

appendfsync always #每次有新的改寫命令時,都會追加到磁盤的aof文件中。數(shù)據(jù)安全性最高,但效率最慢。 appendfsync everysec # 每一秒,都會將改寫命令追加到磁盤中的aof文件中。如果發(fā)生宕機,也只會丟失1秒的數(shù)據(jù)。 appendfsync no #不會主動進行命令落盤,而是由操作系統(tǒng)決定什么時候?qū)懭氲酱疟P。數(shù)據(jù)安全性不高。
登錄后復(fù)制

開啟AOF后需要重新啟動redis服務(wù),當再次執(zhí)行相關(guān)改寫命令時,aof文件中會記錄操作的命令。

Redis高可用架構(gòu)搭建到原理分析

Redis高可用架構(gòu)搭建到原理分析

相對于RDB,雖然AOF的數(shù)據(jù)安全性更高,但是隨著服務(wù)的持續(xù)運行,aof的文件也會越來越大,等到下次恢復(fù)數(shù)據(jù)時,速度會越來越慢。如果RDB和AOF都開啟,在恢復(fù)數(shù)據(jù)時,redis會優(yōu)先選擇AOF,畢竟AOF丟失的數(shù)據(jù)更少啊。

RDB AOF
恢復(fù)效率
數(shù)據(jù)安全性
空間占用

混合模式

由于RDB持久化方式容易造成數(shù)據(jù)丟失,AOF持久化方式數(shù)據(jù)恢復(fù)較慢,所以在redis4.0版本后,新出來混合持久化模式。混合持久化將RDB和AOF的優(yōu)點進行了集成,并而且依賴于AOF,所以在使用混合持久化前,需要開啟AOF。在開啟混合持久化后,當發(fā)生AOF重寫時,會將內(nèi)存中的數(shù)據(jù)以RDB的數(shù)據(jù)格式保存到aof文件中,在下一次的重寫之前,混合持久化會追加保存每條改寫命令到aof文件中。當需要恢復(fù)數(shù)據(jù)時,會加載保存的rdb內(nèi)容數(shù)據(jù),然后再繼續(xù)同步aof指令。

  # AOF重寫配置,當aof文件達到60MB并且比上次重寫后的體量多100%時自動觸發(fā)AOF重寫  auto-aof-rewrite-percentage 100   auto-aof-rewrite-min-size 64mb      aof-use-rdb-preamble yes # 開啟混合持久化# aof-use-rdb-preamble no # 關(guān)閉混合持久化
登錄后復(fù)制

AOF重寫是指當aof文件越來越大時,redis會自動優(yōu)化aof文件中無用的命令,從而減少文件體積。比如在處理文章閱讀量時,每查看一次文章就會執(zhí)行一次Incr命令,但是隨著閱讀量的不斷增加,aof文件中的incr命令也會積累的越來越多。在AOF重寫后,將會刪除這些沒用的Incr命令,將這些命令直接替換為set key value命令。除了redis自動重寫AOF,如果需要,也可以通過bgrewriteaof命令手動觸發(fā)。

主從復(fù)制

在生產(chǎn)環(huán)境中,一般不會直接配置單節(jié)點的redis服務(wù),這樣壓力太大。為了緩解redis服務(wù)壓力,可以搭建主從復(fù)制,做讀寫分離。redis主從復(fù)制,是有一個主節(jié)點Master和多個從節(jié)點Slave組成。主從節(jié)點間的數(shù)據(jù)同步只能是單向傳輸?shù)模荒苡蒑aster節(jié)點傳輸?shù)絊lave節(jié)點。

Redis高可用架構(gòu)搭建到原理分析

環(huán)境配置

準備三臺linux服務(wù)器,其中一臺作為redis的主節(jié)點,兩臺作為reids的從節(jié)點。如果沒有足夠的機器可以在同一臺機器上面將redis文件多復(fù)制兩份并更改端口號,這樣可以搭建一個偽集群。

IP 主/從節(jié)點 端口 版本
192.168.36.128 6379 5.0.14
192.168.36.130 6379 5.0.14
192.168.36.131 6379 5.0.14
  1. 配置從節(jié)點36.130,36.131機器中reids.conf

修改redis.conf文件中的replicaof,配置主節(jié)點的ip和端口號,并且開啟從節(jié)點只讀。

Redis高可用架構(gòu)搭建到原理分析

Redis高可用架構(gòu)搭建到原理分析

  1. 啟動主節(jié)點36.128機器中reids服務(wù)

 ./src/redis-server redis.conf
登錄后復(fù)制

登錄后復(fù)制

Redis高可用架構(gòu)搭建到原理分析3. 依次啟動從節(jié)點36.130,36.131機器中的redis服務(wù)

 ./src/redis-server redis.conf
登錄后復(fù)制

登錄后復(fù)制

啟動成功后可以看到日志中顯示已經(jīng)與Master節(jié)點建立的連接。Redis高可用架構(gòu)搭建到原理分析如果出現(xiàn)與Master節(jié)點的連接被拒,那么先檢查Master節(jié)點的服務(wù)器是否開啟防火墻,如果開啟,可以開放6379端口或者關(guān)閉防火墻。如果防火墻被關(guān)閉但連接仍然被拒,那么可以修改Master節(jié)點服務(wù)中的redis.conf文件。將bing 127.0.0.1修改為本機對外的網(wǎng)卡ip或者直接注釋掉即可,然后重啟服務(wù)器即可。Redis高可用架構(gòu)搭建到原理分析

Redis高可用架構(gòu)搭建到原理分析

  1. 查看狀態(tài)

全部節(jié)點啟動成功后,Master節(jié)點可以查看從節(jié)點的連接狀態(tài),offset偏移量等信息。

 info replication # 主節(jié)點查看連接信息
登錄后復(fù)制

Redis高可用架構(gòu)搭建到原理分析

數(shù)據(jù)同步流程

  • 全量數(shù)據(jù)同步Redis高可用架構(gòu)搭建到原理分析主從節(jié)點之間的數(shù)據(jù)同步是通過建立socket長連接來進行傳輸?shù)摹.擲lave節(jié)點啟動時,會與Master節(jié)點建立長連接,并且發(fā)送psync同步數(shù)據(jù)命令。當Master節(jié)點收到psync命令時,會執(zhí)行pgsave進行rdb內(nèi)存數(shù)據(jù)快照(這里的rdb快照與conf文件中是否開啟rdb無關(guān)),如果在快照過程中有新的改寫命令,那么Master節(jié)點會將這些命令保存到repl buffer緩沖區(qū)中。當快照結(jié)束后,會將rdb傳輸給Slave節(jié)點。Slave節(jié)點在接收到rdb后,如果存在舊數(shù)據(jù),那么會將這些舊數(shù)據(jù)清除并加載rdb。加載完成后會接受master緩存在repl buffer中的新命令。在這些步驟全部執(zhí)行完成后,主從節(jié)點已經(jīng)算連接成功了,后續(xù)Master節(jié)點的命令會不斷的發(fā)送到Slave節(jié)點。如果在高并發(fā)的情況下,可能會存在數(shù)據(jù)延遲的情況。

  • 部分數(shù)據(jù)同步

Redis高可用架構(gòu)搭建到原理分析

部分數(shù)據(jù)同步發(fā)生在Slave節(jié)點發(fā)生宕機,并且在短時間內(nèi)進行了服務(wù)恢復(fù)。短時間內(nèi)主從節(jié)點之間的數(shù)據(jù)差額不會太大,如果執(zhí)行全量數(shù)據(jù)同步將會比較耗時。部分數(shù)據(jù)同步時,Slave會向Master節(jié)點建立socket長連接并發(fā)送帶有一個offset偏移量的數(shù)據(jù)同步請求,這個offset可以理解數(shù)據(jù)同步的位置。Master節(jié)點在收到數(shù)據(jù)同步請求后,會根據(jù)offset結(jié)合buffer緩沖區(qū)內(nèi)新的改寫命令進行位置確定。如果確定了offset的位置,那么就會將這個位置往后的所有改寫命令發(fā)送到Slave節(jié)點。如果沒有確定offset的位置,那么會再次執(zhí)行全量數(shù)據(jù)同步。比如,在Slave節(jié)點沒有宕機之前命令已經(jīng)同步到了offset=11這個位置,當該節(jié)點重啟后,向Master節(jié)點發(fā)送該offset,Master根據(jù)offset在緩沖區(qū)中進行定位,在定位到11這個位置后,將該位置往后的所有命令發(fā)送給Slave。在數(shù)據(jù)同步完成后,后續(xù)Master節(jié)點的命令會不斷的發(fā)送到該Slave節(jié)點

Redis高可用架構(gòu)搭建到原理分析

優(yōu)缺點

  • 優(yōu)點

    1. 可以實現(xiàn)一主多從,讀寫分離,減輕Master節(jié)點讀操作壓力
    2. 是哨兵,集群架構(gòu)的基礎(chǔ)
  • 缺點

    1. 不具備自動主從切換功能,當Master節(jié)點宕機后,需要手動切換主節(jié)點
    2. 容易出現(xiàn)數(shù)據(jù)不一致,當Master節(jié)點宕機前,如果有數(shù)據(jù)未同步,則會造成數(shù)據(jù)丟失

哨兵模式

哨兵模式對主從復(fù)制進行了進一步優(yōu)化,獨立出單獨的哨兵進程用于監(jiān)控主從架構(gòu)中的服務(wù)器狀態(tài),一旦發(fā)生宕機,哨兵會在短時間內(nèi)選舉出新的Master節(jié)點并進行主從切換。不僅如此,在多哨兵的節(jié)點下,每個哨兵都會相互進行監(jiān)控,監(jiān)控哨兵節(jié)點是否宕機。

Redis高可用架構(gòu)搭建到原理分析

環(huán)境配置

IP 主/從節(jié)點 端口 哨兵端口 版本
192.168.36.128 6379 26379 5.0.14
192.168.36.130 6379 26379 5.0.14
192.168.36.131 6379 26379 5.0.14

主從復(fù)制是哨兵模式的基礎(chǔ),所以在搭建哨兵前需要完成主從復(fù)制的配置。在搭建完主從后,哨兵的搭建就容易很多。 找到安裝目錄下的sentinel.conf文件并進行修改。主要修改兩個地方,分別為哨兵端口port和監(jiān)控的主節(jié)點ip地址和端口號。

Redis高可用架構(gòu)搭建到原理分析

Redis高可用架構(gòu)搭建到原理分析

在配置完成后,可以使用命令啟動各機器的哨兵服務(wù)。啟動成功后,可查看redis服務(wù)和哨兵服務(wù)的進行信息。

Redis高可用架構(gòu)搭建到原理分析

Redis高可用架構(gòu)搭建到原理分析搭建成功后,就來通過代碼演示主節(jié)點宕機的情況下,哨兵是否會幫助系統(tǒng)自動進行主備切換。在springboot項目中引入對應(yīng)的pom,并配置對應(yīng)的redis哨兵信息。

<dependency>     <groupId>org.springframework.boot</groupId>     <artifactId>spring-boot-starter-data-redis</artifactId>     <version>2.2.2.RELEASE</version></dependency><dependency>     <groupId>org.apache.commons</groupId>     <artifactId>commons-pool2</artifactId>     <version>2.4.2</version></dependency>
登錄后復(fù)制

server:   port: 8081spring:   redis:     sentinel:       master: mymaster # 主服務(wù)節(jié)點       nodes: 192.168.36.128:26379,192.168.36.130:26379,192.168.36.131:26379 #哨兵節(jié)點     timeout: 3000 #連接超時時間
登錄后復(fù)制

@Slf4j @RestController public class RedisTest {      @Resource     private StringRedisTemplate stringRedisTemplate;          /*     * 每秒鐘向redis中寫入數(shù)據(jù),中途kill掉主節(jié)點進程,模擬宕機     */     @GetMapping("/redis/testSet")    public void test(@RequestParam(name = "key") String key,                     @RequestParam(name = "value") String value) throws InterruptedException {         int idx=0;         for(;;){             try {                 idx++;                 stringRedisTemplate.opsForValue().set(key+idx, value);                 log.info("=====存儲成功:{},{}=====",key+idx,value);             }catch (Exception e){                 log.error("====連接redis服務(wù)器失敗:{}====",e.getMessage());             }             Thread.sleep(1000);         }    } }
登錄后復(fù)制

當啟動服務(wù)后,通過節(jié)后向后端傳遞數(shù)據(jù),可以看到輸出的日志,表示redis哨兵集群已經(jīng)可以正常運行了。那么這個時候kill掉36.128機器上的主節(jié)點,模擬服務(wù)宕機。通過日志可以知道,服務(wù)出現(xiàn)異常了,在過十幾秒發(fā)現(xiàn)哨兵已經(jīng)自動幫系統(tǒng)進行了主從切換,并且服務(wù)也可以正常訪問了。Redis高可用架構(gòu)搭建到原理分析

2022-11-14 22:20:23.134  INFO 8764 --- [nio-8081-exec-2] com.gz.redis.RedisTest                   : =====存儲成功:test14,123===== 2022-11-14 22:20:24.142  INFO 8764 --- [nio-8081-exec-2] com.gz.redis.RedisTest                   : =====存儲成功:test15,123===== 2022-11-14 22:20:24.844  INFO 8764 --- [xecutorLoop-1-1] i.l.core.protocol.ConnectionWatchdog     : Reconnecting, last destination was /192.168.36.128:6379 2022-11-14 22:20:26.909  WARN 8764 --- [ioEventLoop-4-4] i.l.core.protocol.ConnectionWatchdog     : Cannot reconnect to [192.168.36.128:6379]: Connection refused: no further information: /192.168.36.128:6379 2022-11-14 22:20:28.165 ERROR 8764 --- [nio-8081-exec-2] com.gz.redis.RedisTest                   : ====連接redis服務(wù)器失敗:Redis command timed out; nested exception is io.lettuce.core.RedisCommandTimeoutException: Command timed out after 3 second(s)==== 2022-11-14 22:20:31.199  INFO 8764 --- [xecutorLoop-1-1] i.l.core.protocol.ConnectionWatchdog     : Reconnecting, last destination was 192.168.36.128:6379
登錄后復(fù)制

2022-11-14 22:20:52.189 ERROR 8764 --- [nio-8081-exec-2] com.gz.redis.RedisTest                   : ====連接redis服務(wù)器失敗:Redis command timed out; nested exception is io.lettuce.core.RedisCommandTimeoutException: Command timed out after 3 second(s)==== 2022-11-14 22:20:53.819  WARN 8764 --- [ioEventLoop-4-2] i.l.core.protocol.ConnectionWatchdog     : Cannot reconnect to [192.168.36.128:6379]: Connection refused: no further information: /192.168.36.128:6379 2022-11-14 22:20:56.194 ERROR 8764 --- [nio-8081-exec-2] com.gz.redis.RedisTest                   : ====連接redis服務(wù)器失敗:Redis command timed out; nested exception is io.lettuce.core.RedisCommandTimeoutException: Command timed out after 3 second(s)==== 2022-11-14 22:20:57.999  INFO 8764 --- [xecutorLoop-1-2] i.l.core.protocol.ConnectionWatchdog     : Reconnecting, last destination was 192.168.36.128:6379 2022-11-14 22:20:58.032  INFO 8764 --- [ioEventLoop-4-4] i.l.core.protocol.ReconnectionHandler    : Reconnected to 192.168.36.131:6379 2022-11-14 22:20:58.040  INFO 8764 --- [nio-8081-exec-2] com.gz.redis.RedisTest                   : =====存儲成功:test24,123===== 2022-11-14 22:20:59.051  INFO 8764 --- [nio-8081-exec-2] com.gz.redis.RedisTest                   : =====存儲成功:test25,123===== 2022-11-14 22:21:00.057  INFO 8764 --- [nio-8081-exec-2] com.gz.redis.RedisTest                   : =====存儲成功:test26,123===== 2022-11-14 22:21:01.065  INFO 8764 --- [nio-8081-exec-2] com.gz.redis.RedisTest                   : =====存儲成功:test27,123=====
登錄后復(fù)制

故障轉(zhuǎn)移

在多個哨兵的模式下,每個哨兵都會向redis節(jié)點發(fā)送心跳包來檢測節(jié)點的運行狀態(tài)。如果某個哨兵發(fā)現(xiàn)主節(jié)點連接超時了,沒有收到心跳,那么系統(tǒng)并不會立刻進行故障轉(zhuǎn)移,這種情況叫做主觀下線。如果后續(xù)的哨兵節(jié)點發(fā)現(xiàn),與主節(jié)點的心跳也失敗了并且哨兵數(shù)量超過2個,那么這個時候就會認為主節(jié)點客觀下線,并且會進行故障轉(zhuǎn)移,這個客觀下線的數(shù)值可以在哨兵的配置文件中進行配置。

sentinel monitor master 192.168.36.128 6378 2
登錄后復(fù)制

在故障轉(zhuǎn)移前,需要選舉出一個哨兵leader來進行Master節(jié)點的重新選舉。哨兵的選舉過程大致可以分為三步:

  • 當某個的哨兵確定主節(jié)點已經(jīng)下線時,會像其他哨兵發(fā)送is-master-down-by-addr命令,要求將自己設(shè)為leader,并處理故障轉(zhuǎn)移工作。

  • 其他哨兵在收到命令后,進行投票選舉

  • 如果票數(shù)過半時,那么發(fā)送命令的哨兵節(jié)點將成為主節(jié)點,并進行故障轉(zhuǎn)移。

當選舉出主哨兵后,那么這個主哨兵就會過濾掉宕機的redis節(jié)點,重新選舉出Master節(jié)點。首先會根據(jù)redis節(jié)點的優(yōu)先級進行選舉(slave-priority),數(shù)值越大的從節(jié)點將會被選舉為主節(jié)點。如果這個優(yōu)先級相同,那么主哨兵節(jié)點就會選擇數(shù)據(jù)最全的從節(jié)點作為新的主節(jié)點。如果還是選舉失敗,那么就會選舉出進程id最小的從節(jié)點作為主節(jié)點。

腦裂

在集群環(huán)境下會由于網(wǎng)絡(luò)等原因出現(xiàn)腦裂的情況,所謂的腦裂就是由于主節(jié)點和從節(jié)點和哨兵處于不同的網(wǎng)絡(luò)分區(qū),由于網(wǎng)絡(luò)波動等原因,使得哨兵沒有能夠即使接收到主節(jié)點的心跳,所以通過選舉的方式選舉了一個從節(jié)點為新的主節(jié)點,這樣就存在了兩個主節(jié)點,就像一個人有兩個大腦一樣,這樣會導(dǎo)致客戶端還在像老的主節(jié)點那里寫入數(shù)據(jù),新節(jié)點無法同步數(shù)據(jù),當網(wǎng)絡(luò)恢復(fù)后,哨兵會將老的主節(jié)點降為從節(jié)點,這時再從新主節(jié)點同步數(shù)據(jù),這會導(dǎo)致大量數(shù)據(jù)丟失。如果需要避免腦裂的問題,可以配置下面兩行信息。

 min-replicas-to-write 3 # 最少從節(jié)點為3  min-replicas-max-lag 10 # 表示數(shù)據(jù)復(fù)制和同步的延遲不能超過10秒
登錄后復(fù)制

優(yōu)缺點

優(yōu)點:除了擁有主從復(fù)制的優(yōu)點外,還可以進行故障轉(zhuǎn)移,主從切換,系統(tǒng)更加可靠。

缺點:故障轉(zhuǎn)移需要花費一定的時間,在高并發(fā)場景下容易出現(xiàn)數(shù)據(jù)丟失。不容易實現(xiàn)在線擴容。

Cluster模式

哨兵模式中雖然在主節(jié)點宕機的情況下能夠做到主從切換,但是在切換的過程中需要花費十幾秒或者更久的時間,會造成部分數(shù)據(jù)的丟失。如果在并發(fā)量不高的情況下,可以使用該集群模式,但是在高并發(fā)的情況下,這十幾秒的時間可能會造成嚴重的后果,所以,在很多互聯(lián)網(wǎng)公司都是采用Cluster集群架構(gòu)。Cluster集群中由多個redis節(jié)點組成,每個redis服務(wù)節(jié)點都有一個Master節(jié)點和多個Slave節(jié)點,在進行數(shù)據(jù)存儲時,redis會對數(shù)據(jù)的key進行hash運算并根據(jù)運算結(jié)果分配到不同的槽位。一般情況下,Cluster集群架構(gòu)要設(shè)置6個節(jié)點(三主三從)。

Redis高可用架構(gòu)搭建到原理分析

環(huán)境搭建

由于只有三臺虛擬機,所以需要在每臺服務(wù)器上面搭建兩個redis服務(wù),端口分別為6379和6380,這個剛好可以構(gòu)建6個節(jié)點。

IP 主/從節(jié)點 端口 版本
192.168.36.128 6379 5.0.14
192.168.36.128 6380 5.0.14
192.168.36.130 6379 5.0.14
192.168.36.130 6380 5.0.14
192.168.36.131 6379 5.0.14
192.168.36.131 6380 5.0.14

為了看起來不是那么混亂,可以為cluster新建一個文件夾,并將redis的文件拷貝到cluster文件夾中,并修改文件夾名為redis-6379,reids-6380。Redis高可用架構(gòu)搭建到原理分析

新建完成后,修改每個節(jié)點的redis.conf配置文件,找到cluster相關(guān)的配置位置,將cluster-enable更改為yes,表示開啟集群模式。開啟后,需要修改集群節(jié)點連接的超時時間cluster-node-timeout,節(jié)點配置文件名cluster-config-file等等,需要注意的是,同一臺機器上面的服務(wù)節(jié)點記得更改端口號。Redis高可用架構(gòu)搭建到原理分析

Redis高可用架構(gòu)搭建到原理分析

Redis高可用架構(gòu)搭建到原理分析

Redis高可用架構(gòu)搭建到原理分析

在每個節(jié)點都配置完成后,可以依次啟動各節(jié)點。啟動成功后,可以查看redis的進程信息,后面有明顯的標識為[cluster]。

Redis高可用架構(gòu)搭建到原理分析

現(xiàn)在雖然每個節(jié)點的redis都已經(jīng)正常啟動了,但是每個節(jié)點之間并沒有任何聯(lián)系啊。所以這個時候還需要最后一步,將各節(jié)點建立關(guān)系。在任意一臺機器上運行下面的命令– cluster create ip:port,進行集群創(chuàng)建。命令執(zhí)行成功后,可以看到槽位的分布情況和主從關(guān)系。

./src/redis-cli --cluster create 192.168.36.128:6379 192.168.36.128:6380 192.168.36.130:6379 192.168.36.130:6380 192.168.36.131:6379 192.168.36.131:6380 --cluster-replicas 1復(fù)制代碼
登錄后復(fù)制

Redis高可用架構(gòu)搭建到原理分析

cluster成功啟動后,可以在代碼中簡單的測試一下,這里的代碼依舊采用哨兵模式中的測試代碼,只是將sentinel相關(guān)的信息注釋掉并加上cluster的節(jié)點信息即可。

spring:   redis:     cluster:       nodes: 192.168.36.128:6379,192.168.36.128:6380,192.168.36.130:6379,192.168.36.130:6380,192.168.36.131:6379,192.168.36.131:6380#    sentinel:#      master: mymaster#      nodes: 192.168.36.128:26379,192.168.36.130:26379,192.168.36.131:26379     timeout: 3000     lettuce:       pool:         max-active: 80         min-idle: 50
登錄后復(fù)制

數(shù)據(jù)分片

Cluster模式下由于存在多個Master節(jié)點,所以在存儲數(shù)據(jù)時,需要確定將這個數(shù)據(jù)存儲到哪臺機器上。上面在啟動集群成功后可以看到每臺Master節(jié)點都有自己的一個槽位(Slots)范圍,Master[0]的槽位范圍是0 – 5460,Master[1]的槽位范圍是5461 – 10922,Master[2]的槽位范圍是10922 – 16383。redis在存儲前會通過CRC16方法計算出key的hash值,并與16383進行位運算來確定最終的槽位值。所以,可以知道確定槽位的方式就是 CRC16(key) & 16383。計算出槽位后,此時在java服務(wù)端并不知道這個槽位對應(yīng)到哪一臺redis服務(wù),其實在java服務(wù)端啟動服務(wù)時會將redis的相關(guān)槽位和映射的ip信息進行一個本地緩存,所以知道槽位后,就會知道對應(yīng)槽位的ip。

選舉機制

cluster模式中的選舉與哨兵中的不同。當某個從節(jié)點發(fā)現(xiàn)自己的主節(jié)點狀態(tài)變?yōu)閒ail狀態(tài)時,便嘗試進行故障轉(zhuǎn)移。由于掛掉的主節(jié)點可能會有多個從節(jié)點,從而存在多個從節(jié)點競爭成為新主節(jié)點 。其選舉過程大概如下:

  • 從節(jié)點將自己記錄的集群currentEpoch加1,并廣播FAILOVER_AUTH_REQUEST信息,通知集群中的所有節(jié)點,需要進行重新選舉了。

  • 其他節(jié)點收到該信息,但只有master節(jié)點會進行響應(yīng),判斷請求者的合法性,并發(fā)送 FAILOVER_AUTH_ACK,對每一個epoch只發(fā)送一次ack。

  • 發(fā)送通知的從節(jié)點會收集各master主節(jié)點返回的FAILOVER_AUTH_ACK。

  • 如果該從節(jié)點收到的ack數(shù)過半,那么該節(jié)點就會被選舉為新的Master主節(jié)點。成為主節(jié)點后,廣播通知其他小集群節(jié)點

優(yōu)缺點

優(yōu)點:

  • 有多個主節(jié)點,做到去中心化。

  • 數(shù)據(jù)可以槽位進行分布存儲

  • 擴展性更高,可用性更高。cluster集群中的節(jié)點可以在線添加或刪除,官方推薦節(jié)點數(shù)不超1000。當部分Master節(jié)點不可用時,整個集群任然可以正常工作。

缺點:

  • 數(shù)據(jù)通過異步復(fù)制,不保證數(shù)據(jù)的強一致性

  • Slave節(jié)點在集群中充當冷備,不能緩解讀壓力

總結(jié)

reids作為當下非常流行的一款中間件,它可以用作緩存,減少DB的壓力,提高系統(tǒng)的性能。也可以用作分布式鎖保證并發(fā)安全性。還可以用作MQ消息隊列,減少系統(tǒng)的耦合度。它支持單機模式,主從復(fù)制,哨兵以及Cluster模式。每個模式都有自己的優(yōu)點和缺點,在實際項目中可以根據(jù)自己的業(yè)務(wù)需求以及并發(fā)程度來進行選擇。

推薦學(xué)習(xí):Redis視頻教程

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
欧美日韩亚洲一区| 欧美日韩中出| 精品一区二区三区中文字幕| 午夜性色一区二区三区免费视频| 在线亚洲国产精品网站| 五月天激情综合网| 国精品一区二区三区| 亚洲国产影院| 久久国产日本精品| 久久精品不卡| 日韩一区二区免费看| 激情综合自拍| 99re国产精品| 亚洲一区二区av| 日韩中文字幕一区二区高清99| 久热综合在线亚洲精品| 中文字幕日韩欧美精品高清在线| 亚洲精品影视| 久久91视频| 久久久亚洲一区| 久久午夜精品| 国产精品亚洲综合久久| 激情综合婷婷| 日韩和的一区二在线| 在线视频精品| 日本亚洲视频在线| 久久国产乱子精品免费女| 久久亚州av| 自拍日韩欧美| 国产欧美在线观看免费| 伊人久久视频| 亚洲一二三区视频| 久久久久观看| 国产色99精品9i| 国产精品丝袜xxxxxxx| 精品欧美激情在线观看| 7777精品| 首页亚洲欧美制服丝腿| 日韩av三区| 夜久久久久久| 国产精品福利在线观看播放| 日韩中文在线播放| 国产精品香蕉| 石原莉奈在线亚洲三区| 久久亚洲影院| 国产不卡一区| 在线一区二区三区视频| 国产毛片一区二区三区| 久久这里只有精品一区二区| 亚洲国产成人精品女人| 91亚洲精品视频在线观看| 福利一区二区| 亚洲激情欧美| 日韩精品视频网站| 久久久久国产精品一区三寸| 亚洲人成在线影院| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 国产精品资源| 亚洲精品自拍| 国产欧美一区二区色老头| 精品国产aⅴ| 久久久久伊人| 精品一区免费| 先锋影音国产一区| 国产精品一区二区三区www| 日本一二区不卡| 男人天堂欧美日韩| 97精品资源在线观看| 久久av网址| 亚洲国产一区二区在线观看| 成人片免费看| 老牛国内精品亚洲成av人片| 国产精品欧美三级在线观看 | 日韩国产欧美一区二区三区| 亚洲在线网站| 另类亚洲自拍| 天堂va在线高清一区| 日韩欧美在线精品| 国产精品久久久久久久久免费高清| 国产精品一区2区3区| 久久99高清| 桃色一区二区| 免费人成黄页网站在线一区二区| 亚洲午夜精品久久久久久app| 亚洲一区二区毛片| 婷婷综合成人| 国产中文欧美日韩在线| 亚洲性色视频| 日韩成人午夜精品| 久久亚洲国产| 国产精品一级| 国产视频久久| 国产一区二区三区国产精品| 2023国产精品久久久精品双| 欧美日一区二区在线观看| 99久久精品国产亚洲精品| 国产精品一区二区精品视频观看| 亚洲午夜91| 日韩在线观看中文字幕| 麻豆国产精品一区二区三区| 日本欧美久久久久免费播放网| 欧美黄色一区| 国产一区清纯| 欧美一区成人| 日韩国产一区二区| 免费看日韩精品| 蜜桃精品在线| 亚洲狼人精品一区二区三区| 国产精品jk白丝蜜臀av小说| 亚洲成人日韩| 日韩精品看片| 欧美日韩一区二区三区不卡视频| av免费不卡国产观看| 婷婷综合亚洲| 日本欧美一区| 91成人网在线观看| 精品一区二区三区视频在线播放| 亚洲成人日韩| 色婷婷色综合| 91一区二区三区四区| 亚洲一区av| 午夜免费一区| 欧美va天堂在线| 成人污污视频| 国产精品免费不| 中文日韩在线| 亚洲色图国产| 视频一区二区三区入口| 国产一区二区三区网| av不卡在线看| 神马日本精品| 福利在线免费视频| 欧美日韩午夜| 亚洲精品伊人| 视频在线观看国产精品| 久久久噜噜噜| 999久久久免费精品国产| caoporn视频在线| 荡女精品导航| 91欧美在线| 日韩激情av在线| 亚洲另类av| 一区二区三区国产盗摄| 久久精品官网| 99精品美女| 水蜜桃久久夜色精品一区| 国产欧美日本| 麻豆久久一区二区| 国产中文欧美日韩在线| 精品国产午夜| 国产精品九九| 福利在线一区| 在线日韩视频| 福利一区和二区| 日本精品影院| 亚洲欧美日本国产专区一区| 午夜宅男久久久| 日韩1区2区3区| 亚洲3区在线| 国产亚洲一区| 成人在线黄色| 久久久久亚洲| 亚洲a级精品| 国产精品一区二区99| 日韩av有码| 国产麻豆综合| 久久狠狠亚洲综合| 国内在线观看一区二区三区| 久久久天天操| 五月综合激情| 婷婷精品久久久久久久久久不卡| 久久av影院| 亚洲午夜91| 日韩欧美激情电影| 久久精品 人人爱| 欧产日产国产精品视频| 久久国产99| 中文一区一区三区高中清不卡免费| 美女网站一区| 国产美女亚洲精品7777| 香蕉久久精品| 日韩在线黄色| 欧美福利一区| 久久av免费| 蜜桃一区二区三区在线| 成人国产精品| 日韩一区免费| 欧美日韩一二三四| 欧美一级一区| 在线亚洲免费| 美女福利一区二区三区| 欧美大黑bbbbbbbbb在线| 婷婷六月综合| 欧洲一区二区三区精品| 六月丁香综合在线视频| 国产日韩一区二区三区在线| 婷婷丁香综合| 亚洲国产福利| 国产精品精品| 精品一区不卡|