天天看點

redis學習系列(一)--redis主從,哨兵,叢集

關于redis主從、哨兵、叢集

一、主從

通過持久化功能,Redis保證了即使在伺服器重新開機的情況下也不會損失(或少量損失)資料,因為持久化會把記憶體中資料儲存到硬碟上,重新開機會從硬碟上加載資料。 

但是由于資料是存儲在一台伺服器上的,如果這台伺服器出現硬碟故障等問題,也會導緻資料丢失。為了避免單點故障,通常的做法是将資料庫複制多個副本以部署在不同的伺服器上,這樣即使有一台伺服器出現故障,其他伺服器依然可以繼續提供服務。為此, Redis 提供了複制(replication)功能,可以實作當一台資料庫中的資料更新後,自動将更新的資料同步到其他資料庫上。

在複制的概念中,資料庫分為兩類,一類是主資料庫(master),另一類是從資料庫(slave)。主資料庫可以進行讀寫操作,當寫操作導緻資料變化時會自動将資料同步給從資料庫。而從資料庫一般是隻讀的,并接受主資料庫同步過來的資料。一個主資料庫可以擁有多個從資料庫,而一個從資料庫隻能擁有一個主資料庫。

主從資料庫的配置

master  slave 

主不用配置,從redis的conf檔案加入 slaveof  ip  port 就可以了 

或者從redis啟動時  redis-server --port 6380 --slaveof 127.0.0.1 6379 

    從資料庫一般是隻讀,可以改為可寫,但寫入的資料很容易被主同步沒,是以還是隻讀就可以。 

也可以在運作是使用slaveof ip port指令,停止原來的主,切換成剛剛設定的主  slaveof no one會把自己變成主

複制原理

當從資料庫啟動時,會向主資料庫發送sync指令,主資料庫接收到sync後開始在背景報錯快照rdb,在儲存快照期間受到的命名緩存起來,當快照完成時,主資料庫會将快照和緩存的指令一塊發送給從。複制初始化結束。

之後,主每受到1個指令就同步發送給從。 

當出現斷開重連後,2.8之後的版本會将斷線期間的指令傳給重資料庫。增量複制

主從複制是樂觀複制,當用戶端發送寫執行給主,主執行完立即将結果傳回用戶端,并異步的把指令發送給從,進而不影響性能。也可以設定至少同步給多少個從主才可寫。 

無硬碟複制:如果硬碟效率低将會影響複制性能,2.8之後可以設定無硬碟複制,repl-diskless-sync yes

二、哨兵

當主資料庫遇到異常中斷服務後,開發者可以通過手動的方式選擇一個從資料庫來升格為主資料庫,以使得系統能夠繼續提供服務。然而整個過程相對麻煩且需要人工介入,難以實作自動化。 為此,Redis 2.8中提供了哨兵工具來實作自動化的系統監控和故障恢複功能。

哨兵的作用就是監控redis主、從資料庫是否正常運作,主出現故障自動将從資料庫轉換為主資料庫。

顧名思義,哨兵的作用就是監控Redis系統的運作狀況。它的功能包括以下兩個。

    (1)監控主資料庫和從資料庫是否正常運作。 

    (2)主資料庫出現故障時自動将從資料庫轉換為主資料庫。

可以用info replication檢視主從情況 

例子: 

1主2從  1哨兵,可以用指令起也可以用配置檔案裡 

可以使用雙哨兵,更安全, 

哨兵配置檔案 

    sentinel.conf 

        sentinel monitor mymaster 192.168.0.167 6379 1 

其中mymaster表示要監控的主資料庫的名字,可以自己定義一個。這個名字必須僅由大小寫字母、數字和“.-_”這 3 個字元組成。後兩個參數表示主資料庫的ip位址和端口号,這裡我們要監控的是主資料庫6379。最後一個參數表示投舉票數,及某從資料庫的票數為n時即為master

注意:

    1、使用時不能用127.0.0.1,需要用真實IP,不然java程式通過哨兵會連到java程式所在的機器(127.0.0.1 )

2、配置哨兵監控一個系統時,隻需要配置其監控主資料庫即可,哨兵會自動發現所有複制該主資料庫的從資料庫,這樣哨兵就能監控主6379和從6380、6381,一旦6379挂掉,哨兵就會在2個從中選擇一個作為主,根據優先級選,如果一樣就選個id小的,當6379再起來就作為從存在。

主從切換過程:

(1)      slave leader更新為master 

(2)      其他slave修改為新master的slave 

(3)      用戶端修改連接配接 

(4)      老的master如果重新開機成功,變為新master的slave

哨兵監控1主2從,停掉主,哨兵會選出1個從作為主,變成1主1從。然而當我把原來的主再起來,它不會作為從,隻是個獨立的節點。

三、叢集

即使使用哨兵,redis每個執行個體也是全量存儲,每個redis存儲的内容都是完整的資料,浪費記憶體且有木桶效應。為了最大化利用記憶體,可以采用叢集,就是分布式存儲。即每台redis存儲不同的内容,

共有16384個slot。每個redis分得一些slot,hash_slot = crc16(key) mod 16384 找到對應slot,鍵是可用鍵,如果有{}則取{}内的作為可用鍵,否則整個鍵是可用鍵

叢集至少需要3主3從,且每個執行個體使用不同的配置檔案,主從不用配置,叢集會自己選。

修改每個執行個體的配置檔案:

    cluster-enabled yes  --開啟叢集

    cluster-config-file nodes-6382.conf --叢集配置檔案名,每個執行個體配置的要不同,redis會根據檔案名自動建立

用叢集工具建立叢集:

我們可以用叢集工具進行叢集,該工具是redis源碼包中,用ruby編寫,是以需要先安裝ruby。

1、安裝rubygems

    yum install ruby 

    yum install rubygems  

    gem install redis

 注:若安裝過程中提示:

ERROR:  Could not find a valid gem 'redisa' (>= 0) in any repository

redis學習系列(一)--redis主從,哨兵,叢集

請檢視

2、把6個redis執行個體都起來,每個執行個體的叢集都打開。(可以複制n份redis.conf,更改檔案内的端口号及叢集配置檔案名,然後再以redis-service ./redis-6380.conf 啟動redis執行個體)

3、redis安裝目錄的src執行

./redis-trib.rb create --replicas 1 10.100.50.23:638010.100.50.23:6381 10.100.50.23:638210.100.50.23:6383 10.100.50.23:6384 10.100.50.23:6385

提示資訊如下

redis學習系列(一)--redis主從,哨兵,叢集

輸入yes,這樣叢集就建立了。

登入任一台redis,執行 info cluster,提示cluster_enabled:1

叢集過程:

首先redis-trib.rb會以用戶端的形式嘗試連接配接所有的節點,并發送PING指令以确定節點能夠正常服務。如果有任何節點無法連接配接,則建立失敗。同時發送 INFO 指令擷取每個節點的運作ID以及是否開啟了叢集功能(即cluster_enabled為1)。 準備就緒後叢集會向每個節點發送 CLUSTER MEET指令,格式為 CLUSTER MEET ip port,這個指令用來告訴目前節點指定ip和port上在運作的節點也是叢集的一部分,進而使得6個節點最終可以歸入一個叢集。

然後redis-trib.rb會配置設定主從資料庫節點,配置設定的原則是盡量保證每個主資料庫運作在不同的IP位址上,同時每個從資料庫和主資料庫均不運作在同一IP位址上,以保證系統的容災能力

3主3從,當1個主故障,大家會給對應的從投票,把從立為主,若沒有從資料庫可以恢複則redis叢集就down了。

用戶端連接配接:

使用redis-cli -c -p 任意一個端口

繼續閱讀