前言
一、主從複制
概念
和mysql的主從複制一樣 都是将伺服器的資料複制到另一個資料庫中 發送的稱為master 接受的叫slave 資料為單向傳輸 隻可以主到從
每台Redis伺服器都是主節點;且一個主節點可以有多個從節點(或沒有從節點),但一個從節點隻能有一個主節點。
作用
資料備援 實作了資料的熱備份,是持久化之外的一種資料備援方式
故障切換 當主節點當機或者出現錯誤時 由從伺服器來提供服務 實作故障切換
負載均衡:在主從複制的基礎上,配合讀寫分離,可以由主節點提供寫服務,由從節點提供讀服務(即寫Redis資料時應用連接配接主節點,讀Redis資料時應用連接配接從節點),分擔伺服器負載;尤其是在寫少讀多的場景下,通過多個從節點分擔讀負載,可以大大提高Redis伺服器的并發量。
基礎 給叢集和哨兵提供環境
主從複制過程
1 若啟動一個Slave機器程序,則它會向Master機器發送一個“sync command”指令,請求同步連接配接。
2 無論是第一次連接配接還是重新連接配接,Master機器都會啟動一個背景程序,将資料快照儲存到資料檔案中(執行rdb操作),同時Master還會記錄修改資料的所有指令并緩存在資料檔案中。
3 背景程序完成緩存操作之後,Maste機器就會向Slave機器發送資料檔案,Slave端機器将資料檔案儲存到硬碟上,然後将其加載到記憶體中,接着Master機器就會将修改資料的所有操作一并發送給Slave端機器。若Slave出現故障導緻當機,則恢複正常後會自動重新連接配接。
4 Master機器收到Slave端機器的連接配接後,将其完整的資料檔案發送給Slave端機器,如果Mater同時收到多個Slave發來的同步請求,則Master會在背景啟動一個程序以儲存資料檔案,然後将其發送給所有的Slave端機器,確定所有的Slave端機器都正常。
部署
三台伺服器 一主倆從
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIwczX0xiRGZkRGZ0Xy9GbvNGL2EzXlpXazxSP9EVT6VlaNNTRU9EM4wmYwhGWhxGZzwEMW1mY1RzRapnTtxkb5ckYplTeMZTTINGMShUYfRHelRHLwEzX39GZhh2css2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xyayFWbyVGdhd3LcV2Zh1Wa9M3clN2byBXLzN3btg3Pn5GcucTN4QTM0kTM5ATNwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
先部署redis 每台配置一緻
systemctl stop firewalld
setenforce 0
yum install -y gcc gcc-c++ make
tar zxvf redis-5.0.7.tar.gz -C /opt/
cd /opt/redis-5.0.7/
make
make PREFIX=/usr/local/redis install
cd /opt/redis-5.0.7/utils
./install_server.sh
回車四次,之後輸入可執行檔案路徑
Please select the redis executable path [] /usr/local/redis/bin/redis-server
ln -s /usr/local/redis/bin/* /usr/local/bin/
主節點配置
vim /etc/redis/6379.conf
bind 0.0.0.0 70行,修改bind 項,0.0.0.0監聽所有網段
daemonize yes 137行,開啟守護程序
logfile /var/log/redis_6379.log 172行,指定日志檔案目錄
dir /var/lib/redis/6379 264行,指定工作目錄
appendonly yes 700行,開啟AOF持久化功能
/etc/init.d/redis_6379 restart
netstat -natp | grep 6379 檢查端口是否開啟
從節點配置
vim /etc/redis/6379.conf
bind 0.0.0.0 70行,修改bind 項,0.0.0.0監聽所有網卡
daemonize yes 137行,開啟守護程序
logfile /var/log/redis_6379.log 172行,指定日志檔案目錄
dir /var/lib/redis/6379 264行,指定工作目錄
replicaof 192.168.25.4 6379 288行,指定要同步的Master節點IP和端口
appendonly yes 700行,開啟AOF持久化功能
/etc/init.d/redis_6379 restart
檢視結果
在主節點檢視日志
tail -f /var/log/redis_6379.log
驗證
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.25.6,port=6379,state=online,offset=504,lag=1
slave1:ip=192.168.25.5,port=6379,state=online,offset=504,lag=0
二、哨兵模式
1 概念
是一個分布式系統,用于對主從結構中的每台伺服器進行監控,當出現故障時通過投票機制選擇新的 Master 并将所有 Slave 連接配接到新的 Master。是以整個運作哨兵的叢集的數量不得少于3個節點。
2.作用
●監控:哨兵會不斷地檢查主節點和從節點是否運作正常。
●自動故障轉移:當主節點不能正常工作時,哨兵會開始自動故障轉移操作,它會将失效主節點的其中一個從節點更新為新的主節點,并讓其他從節點改為複制新的主節點。
●通知(提醒):哨兵可以将故障轉移的結果發送給用戶端。
3 組成
●哨兵節點:哨兵系統由一個或多個哨兵節點組成,哨兵節點是特殊的redis節點,不存儲資料。
●資料節點:主節點和從節點都是資料節點。
哨兵的啟動依賴于主從模式,是以須把主從模式安裝好的情況下再去做哨兵模式,所有節點上都需要部署哨兵模式,哨兵模式會監控所有的 Redis 工作節點是否正常,當 Master 出現問題的時候,因為其他節點與主節點失去聯系,是以會投票,投票過半就認為這個 Master 的确出現問題,然後會通知哨兵間,然後從 Slaves 中選取一個作為新的 Master。
主觀下線和客觀下線
主觀下線是指哨兵節點會每秒一次的頻率向建立了指令節點的執行個體發送ping指令,如果在 down-after-milliseconds 毫秒内沒有做出有效響應包括(pong/loading/masterdown)以外的響應,哨兵就會将該執行個體在本結構體中的狀态标記為 sri_s_down 主觀下線
客觀下線是指當一個哨兵節點發現主節點處于主觀下線狀态時,就會向其他的哨兵節點發出詢問,該節點是否已經主觀下線。如果超過配置參數 quorum 個節點認為是主觀下線時,該哨兵節點就會将自己維護的結構體中該主節點标記為 sri_o_down 客觀下線
部署
所有的節點都要部署哨兵
vim /opt/redis-5.0.7/sentinel.conf
protected-mode no #17行,關閉保護模式
port 26379 #21行,Redis哨兵預設的監聽端口
daemonize yes #26行,指定sentinel為背景啟動
logfile "/var/log/sentinel.log" #36行,指定日志存放路徑
dir "/var/lib/redis/6379" #65行,指定資料庫存放路徑
sentinel monitor mymaster 192.168.184.10 6379 2 #84行,修改 指定該哨兵節點監控192.168.184.10:6379這個主節點,該主節點的名稱是mymaster,最後的2的含義與主節點的故障判定有關:至少需要2個哨兵節點同意,才能判定主節點故障并進行故障轉移
sentinel down-after-milliseconds mymaster 30000 #113行,判定伺服器down掉的時間周期,預設30000毫秒(30秒)
sentinel failover-timeout mymaster 180000 #146行,故障節點的最大逾時時間為180000(180秒)
開啟哨兵
先開master 後開slave
模拟故障
查詢主節點redis服務節點号
殺掉主節點程序 并檢視日志
kill -9 62009
tail -f /var/log/sentinel.log
檢視現在的主節點 現在主節點切換到slave1
三 叢集
1 概念
叢集,即Redis Cluster,是Redis 3.0開始引入的分布式存儲方案。
叢集由多個節點(Node)組成,Redis的資料分布在這些節點中。叢集中的節點分為主節點和從節點:隻有主節點負責讀寫請求和叢集資訊的維護;從節點隻進行主節點資料和狀态資訊的複制。
2 作用
1 資料分區:資料分區(或稱資料分片)是叢集最核心的功能。
叢集将資料分散到多個節點,一方面突破了Redis單機記憶體大小的限制,存儲容量大大增加;另一方面每個主節點都可以對外提供讀服務和寫服務,大大提高了叢集的響應能力。
Redis單機記憶體大小受限問題,在介紹持久化和主從複制時都有提及;例如,如果單機記憶體太大,bgsave和bgrewriteaof的fork操作可能導緻主程序阻塞,主從環境下主機切換時可能導緻從節點長時間無法提供服務,全量複制階段主節點的複制緩沖區可能溢出。
2 高可用:叢集支援主從複制和主節點的自動故障轉移(與哨兵類似);當任一節點發生故障時,叢集仍然可以對外提供服務。
3、Redis叢集的資料分片
Redis叢集引入了哈希槽的概念
Redis叢集有16384個哈希槽(編号0-16383)
叢集的每個節點負責一部分哈希槽
每個Key通過CRC16校驗後對16384取餘來決定放置哪個哈希槽,通過這個值,去找到對應的插槽所對應的節點,然後直接自動跳轉到這個對應的節點上進行存取操作
#以3個節點組成的叢集為例:
節點A包含0到5460号哈希槽
節點B包含5461到10922号哈希槽
節點C包含10923到16383号哈希槽
Redis叢集的主從複制模型
叢集中具有A、B、C三個節點,如果節點B失敗了,整個叢集就會因缺少5461-10922這個範圍的槽而不可以用。
為每個節點添加一個從節點A1、B1、C1整個叢集便有三個Master節點和三個slave節點組成,在節點B失敗後,叢集選舉B1位為的主節點繼續服務。當B和B1都失敗後,叢集将不可用
部署
注意6個端口和IP都要不一樣。
vim /etc/redis/6379.conf
bind 192.168.25.4 70行,修改bind項,監聽自己的IP
protected-mode no 89行,修改,關閉保護模式
port 7001 93行,修改,redis監聽端口,
daemonize yes 137行,以獨立程序啟動
cluster-enabled yes 833行,取消注釋,開啟群集功能
cluster-config-file nodes-6379.conf 841行,取消注釋,群集名稱檔案設定,無需修改
cluster-node-timeout 15000 847行,取消注釋群集逾時時間設定
appendonly yes 700行,修改,開啟AOF持久化
#重新開機服務
/etc/init.d/redis_6379 restart
#加入叢集
redis-cli --cluster create 192.168.25.4:7001 192.168.25.5:7003 192.168.25.6:7005 192.168.25.7:7006 192.168.25.8:7007 192.168.25.9:7008 --cluster-replicas 1
redis-cli -h 192.168.25.4 -p 7001 -c #加-c參數,節點之間就可以互相跳轉
cluster slots #檢視節點的哈希槽編号範圍
set sky x1
cluster keyslot x1 #檢視name鍵的槽編号