1. 程式人生 > >Redis--(linux安裝redis3.2.9主從複製與叢集的搭建--教程)

Redis--(linux安裝redis3.2.9主從複製與叢集的搭建--教程)

如果中間遇見問題可以加扣扣群300458205

一、安裝redis並且啟動

二、配置多個Redis

2-0瞭解下機制:

redis的replication機制允許slave從master那裡通過網路傳輸拷貝到完整的資料備份。具有以下特點:
● 非同步複製,從2.8版本開始,slave能不時地從master那裡獲取到資料。
● 允許單個master配置多個slave
● slave允許其它slave連線到自己。一個slave除了可以連線master外,它還可以連線其它的slave。形成一個圖狀的架構。
● master在進行replication時是非阻塞的,這意味著在replication期間,master依然能夠處理客戶端的請求。
● slave在replication期間也是非阻塞的,也可以接受來自客戶端的請求,但是它用的是之前的舊資料。可以通過配置來決定slave是否在進行replication時用舊資料響應客戶端的請求,如果配置為否,那麼slave將會返回一個錯誤訊息給客戶端。不過當新的資料接收完全後,必須將新資料與舊資料替換,即刪除舊資料,在替換資料的這個時間視窗內,slave將會拒絕客戶端的請求和連線。
● 一般使用replication來可以實現擴充套件性,例如說,可以將多個slave配置為“只讀”,或者是純粹的資料冗餘備份。
● 能夠通過replication來避免master每次持久化時都將整個資料集持久化到硬碟中。只需把master配置為不進行持久化操作(把配置檔案中持久化相關的配置項註釋掉即可),然後連線上一個slave,這個slave則被配置持久化選項。不過需要注意的是,在這個方案中,必須確保master不會自動啟動(原因就是如果master自動啟動將會導致IO問題,master資料會同時寫入slave)。

2-1將redis.conf複製一份,並修改名稱

開啟redis安裝目錄,執行如下命令:

cp redis.conf  ./redis_6380.conf

2-2編輯redis.conf檔案

Master配置:
這裡寫圖片描述

1:關閉rdb快照(備份工作交給slave)

2-2-1、執行如下命令

三個save到rdb的命令配置含義:
save 900 1 #在900秒之內,redis至少發生1次修改則redis抓快照到磁碟
save 300 100 #在300秒之內,redis至少發生100次修改則redis抓快照到磁碟
save 60 10000 #在60秒之內,redis至少發生10000次修改則redis抓快照到磁碟

2:可以開啟aof

2-2-2、執行如下命令:

將appendonly no 改為yes 預設的資料會儲存在appendonly.aof檔案中
這裡寫圖片描述
原因:
資料快照的缺點是持久化之後如果出現系統宕機則會丟失一段資料我們知道他是多少秒dump一次,因此增加了另外一種追加式的操作日誌記錄,叫append only file,其日誌檔案以aof結尾,我們稱為aof檔案,要開啟aof日誌的記錄,需要在配置檔案中進行如下配置: appendonly yes
Appendonly配置不開啟,可能在斷電時導致一段時間的資料丟失,因為redis本身同步資料檔案時按save條件來同步的,所以有的資料會在一段時間內只存在於記憶體中。
Appendfsync no/always/everysec
no:表示等作業系統進行資料快取同步到磁碟。效能最好,持久化沒有保障。
Always:表示每次更新操作後手動呼叫fsync()將資料寫到磁碟.每次收到寫命令就立即強制寫入磁碟,最慢的,但是保障完全的持久化。
Everysec:表示每秒同步一次.每秒鐘強制寫入磁碟一次,在效能和持久化方面做了很好的折中。(常常選擇這個折中的方案預設也是這個配置)

2-3編輯redis_6380.conf

slave配置:
0:修改埠號和pid號
這裡寫圖片描述
這裡寫圖片描述

1: 宣告slave-of
1-1、執行關聯
進入slave(從)redis:
執行:slaveof 127.0.0.1 6379 (設定主資料庫)
完成,但是使用這種方式,一旦從庫掛掉重啟,他們的複製關係將終止。
1-2、配置關聯(長期關聯)
到伺服器配置檔案目錄,找到從庫的配置檔案,執行修改操作(也就是上面的redis6380.conf檔案)
vi redis6380.conf
將# slaveof <masterip> <masterport>改為 slaveof 127.0.0.1 6379
儲存退出,這樣從庫每次啟動都會主動建立與主庫的複製關係。
2: 配置密碼[如果master有密碼]--一般也不需要
3: [某1個]slave開啟 rdb快照功能
預設就是save都開啟的 如果沒有開啟 開啟所有的saveaof日誌關掉,因為如果都開啟的話恢復的時候是以aof恢復,而我們可以直接讓masteraof日誌恢復。

這裡寫圖片描述
這裡寫圖片描述

4: 配置是否只讀[slave-read-only]

這裡寫圖片描述

2-4為了防止日誌恢復,重寫的時候誤將flushall命令重寫可以註釋掉。

rename-command FLUSHALL “” #可以用這種方式關掉非常危險的命令,如FLUSHALL這個命令,它清空整個 Redis 伺服器的資料,而且不用確認且從不會失敗
這裡寫圖片描述

2-5分別啟動redis和redis_6380

主從通訊原理:
這裡寫圖片描述
判斷是否有啟動如果有殺掉程序
這裡寫圖片描述
這裡寫圖片描述
啟動redis6380 6380輸出日誌:
這裡寫圖片描述
我們再看redis6379 6379輸出日誌:
這裡寫圖片描述

2-6手動切換redis的master和slave

我們現在將主redis殺掉: ps -ef|grep redis
然後:kill -9 6860或者如果沒有前臺啟動可以直接CTRL+C退出
這裡寫圖片描述
此時:src/redis-cli -p 6379
這裡寫圖片描述
表明主master已經結束
此時6380的redis連線不上
這裡寫圖片描述
使用命令:127.0.0.1:6378> slaveof NO ONE
OK slave變為master
127.0.0.1:6378> set age 20
OK 已經可以插入資料了
這裡寫圖片描述

此時切換已經完成,但是我們還需要啟動之前的主redis,但是這個時候我們已經進行過插入、刪除等操作,以前的主redis並沒有記錄這些,那麼就需要將redis6380的dump.rdb替換之前redismaster 的dump.rdb檔案。
首先進入redis-master 啟動 ./src/redis-server redis.conf
然後127.0.0.1:6378> slaveof 127.0.0.1 6379
OK
表示又回到之前的狀態
這裡就不做資料恢復了
恢復的時候注意事項:
資料遷移:
資料遷移首先需要關閉aof因為恢復先以aof日誌恢復後以快照恢復,
然後需要關掉redis程序,(如果程序開啟複製的話那麼具有相同的控制代碼導致的後果是隻能有一個埠獲取到rdb),
然後save dump出rdb,複製rdb一份新的rdb
然後進行資料遷移重新匯入另外一個埠

啟動redis6379
客戶端訪問6380的時候輸出資訊
這裡寫圖片描述
服務端6380輸出資訊:

這裡寫圖片描述

2-7sentinel自動切換

這裡寫圖片描述

sentinel就是監聽master,通過監聽其狀態,來完成主從之間的切換, 我們直接使用sentinel的預設配置,使用./src/redis-sentinel sentinel.conf –sentinel啟動sentinel, 可以看到日誌資訊
這裡寫圖片描述

可以使用上述步驟試驗下

補充知識:
原理:
這裡寫圖片描述
一、Sentinel作用:
1):Master狀態檢測
2):如果Master異常,則會進行Master-Slave切換,將其中一個Slave作為Master,將之前的Master作為Slave
3):Master-Slave切換後,master_redis.conf、slave_redis.conf和sentinel.conf的內容都會發生改變,即master_redis.conf中會多一行slaveof的配置,sentinel.conf的監控目標會隨之調換
二、Sentinel工作方式:
1):每個Sentinel以每秒鐘一次的頻率向它所知的Master,Slave以及其他 Sentinel 例項傳送一個 PING 命令
2):如果一個例項(instance)距離最後一次有效回覆 PING 命令的時間超過 down-after-milliseconds 選項所指定的值, 則這個例項會被 Sentinel 標記為主觀下線。
3):如果一個Master被標記為主觀下線,則正在監視這個Master的所有 Sentinel 要以每秒一次的頻率確認Master的確進入了主觀下線狀態。
4):當有足夠數量的 Sentinel(大於等於配置檔案指定的值)在指定的時間範圍內確認Master的確進入了主觀下線狀態, 則Master會被標記為客觀下線
5):在一般情況下, 每個 Sentinel 會以每 10 秒一次的頻率向它已知的所有Master,Slave傳送 INFO 命令
6):當Master被 Sentinel 標記為客觀下線時,Sentinel 向下線的 Master 的所有 Slave 傳送 INFO 命令的頻率會從 10 秒一次改為每秒一次
7):若沒有足夠數量的 Sentinel 同意 Master 已經下線, Master 的客觀下線狀態就會被移除。
若 Master 重新向 Sentinel 的 PING 命令返回有效回覆, Master 的主觀下線狀態就會被移除。

2-8其它後繼資料備份工作

1、用redis-cli bgsave 命令每天凌晨一次持久化一次master redis上的資料,並CP到其它備份伺服器上。
2、用redis-cli bgrewriteaof 命令每半小時持久化一次 slave redis上的資料,並CP到其它備份伺服器上。
3、寫個指令碼 ,定期get master和slave上的key,看兩個是否同步,如果沒有同步,及時報警。

三、主從複製與叢集的架構

這裡寫圖片描述
一般選用第二種架構 好處就是宕機切換的時候快,而且注意一點啟動主redis時候不能啟用多個slave否則主redis的IO會同時寫入到從redis,造成IO壓力過大