為了避免服務的單點故障,會把資料複製到多個副本放在不同的伺服器上,且這些擁有資料副本的伺服器可以用於處理客戶端的讀請求,擴充套件整體的效能。我們把這種機制稱之為主從複製,即master/sl**e複製機制。
主從複製的優勢:讀寫分離、容災恢復、資料冗餘(熱備份)。
概述:
我們可以通過sl**eof 命令,或者通過配置sl**eof選項,來指定主伺服器(master)和從伺服器(sl**e),資料會從主伺服器複製並備份到從伺服器中。主伺服器主要進行寫操作,當主伺服器的資料發生變化,master會發出命令流來保持對salve的更新,從而實現資料備份;而從伺服器sl**e通常是唯讀的(可以通過sl**e-read-only指定)。
乙個master可以有多個sl**e,即一主多從,但通常是一主二從,以避免中心化嚴重。而sl**e也可以接受其他sl**e的連線,形成「主從鏈」層疊狀結構(cascading-like structure),自 redis 4.0 起,所有的sub-sl**e也會從master收到完全一樣的複製流;這樣可以緩解master的壓力。
階段:主從複製主要分為三個階段,即建立連線、資料同步、命令傳播。
建立連線:在sl**eof命令執行之後,從伺服器根據設定的master的ip位址和埠,建立連向主伺服器的socket套接字連線,連線成功後,從伺服器會為這個套接字關聯乙個專門的處理器,用於處理後續的複製工作。此外,如果主伺服器設定了requirepass選項,那麼從伺服器必須配置masterauth選項,且保證密碼一致才能通過驗證。
資料同步:從伺服器向主伺服器傳送psync命令,執行同步操作,並把自己的資料庫狀態更新至主伺服器的資料庫狀態。資料同步可以分為完整重同步和部分重同步。
命令傳播:完成資料同步之後,主從伺服器的資料暫時達到一致狀態,當主伺服器執行了客戶端的寫命令之後,一致性被打破。為了能夠使主從伺服器的資料保持一致性,主伺服器會對從伺服器執行命令傳播操作,即將寫命令傳送給從伺服器,從伺服器執行命令並更新資料庫狀態。
sl**eof :讓當前伺服器變成指定伺服器(ip和port進行指定)的從伺服器。
info replication: 檢視伺服器在主從複製中的狀態
sl**eof on one : 使當前的伺服器切斷與其他伺服器的連線,角色由sl**e變成master。
檔案配置(redis.conf):
在從伺服器中新增配置sl**eof 選項,在5.0版本中使用了replicaof代替了sl**eof。
sl**eof還可以繼續使用,不過建議使用replicaof。如果是使用命令列來複製的話,重啟之後會無效。
注意事項:
- 在不同伺服器之間進行主從複製的實現時,需要關閉系統的防火牆。如centos7中,關閉的命令是:systemctl stop firewalld.service;禁止開機啟動:systemctl disable firewalld.service。
- 當主機掛了,從機資料仍然存在,但連線狀態為down,從機角色不變;主機恢復,則連線狀態變為up,主從複製繼續。
- 當從機掛了之後又重啟:如果是用命令執行的sl**eof,則從機失去與主機的連線,從機角色變為master,需要重新執行sl**eof才能重新連線;如果是採用配置檔案進行指令,則會恢復連線,主從複製繼續。
概述:是一種特殊的模式,由乙個或多個哨兵進行對多個伺服器進行監控,當主伺服器發生故障後,哨兵會進行投票選舉出新的主伺服器以繼續進行主從複製,從而實現了自動化的故障轉移。哨兵模式可以通過sentinel.conf檔案進行配置。注意,當原有的主伺服器恢復,其角色不會恢復成master,而是變成sl**e。
功能:
監控(monitoring):哨兵會不斷地檢查主節點和從節點是否運作正常。
自動故障轉移(automatic failover):當主節點不能正常工作時,哨兵會開始自動故障轉移操作,它會將失效主節點的其中乙個從節點公升級為新的主節點,並讓其他從節點改為複製新的主節點。
配置提供者(configurationprovider):客戶端在初始化時,通過連線哨兵來獲得當前 redis 服務的主節點位址。
通知(notification):哨兵可以將故障轉移的結果傳送給客戶端。
其中,監控和自動故障轉移功能,使得哨兵可以及時發現主節點故障並完成轉移;而配置提供者和通知功能,則需要在與客戶端的互動中才能體現。
這裡對「客戶端」一詞在本文的用法做乙個說明:在前面的文章中,只要通過 api 訪問 redis 伺服器,都會稱作客戶端,包括 redis-cli、j**a 客戶端 jedis 等。redis-cli 使用的是 redis 提供的底層介面,而客戶端則對這些介面、功能進行了封裝,以便充分利用哨兵的配置提供者和通知功能。
Redis學習筆記(4)
集合 在集合中每個元素都是不同的,且沒有順序。常用的操作是向集合加入或刪除元素。判斷某個元素是否存在等,由於集合型別在redis內部是使用值為空的三列表實現的,所以這些操作的時間複雜度都是0 1 最方便的是多個集合型別鍵之間還可以進行並集,交集和差運算。命令 1 增加 刪除元素 sadd key m...
redis學習筆記4(hashes)
redis學習筆記4 hashes 一 概述 我們可以將redis中的hashes型別看成具有string key和string value的map容器。所以該型別非常適合於儲存值物件的資訊。如username password和age等。如果hash中包含很少的字段,那麼該型別的資料也將僅占用很少...
Redis學習筆記4 Redis資料儲存優化機制
1.zipmap優化hash 前面談到將乙個物件儲存在hash型別中會占用更少的記憶體,並且可以更方便的訪問整個物件。省記憶體的原因是新建乙個hash物件時開始是用zipmap來儲存的。這個zipmap其實並不是hash table,但是zipmap相比正常的hash實現可以節省不少hash本身需要...