1. 程式人生 > 其它 >Python技法:用argparse模組解析命令列選項

Python技法:用argparse模組解析命令列選項

redis主從架構

主負責寫,從負責讀

redis replication

redis主從架構-》讀寫分離架構-》可支援水平擴充套件的度高併發架構

1.redis採用非同步的方式複製資料到slave節點,redis 2.8開始slave node會週期性的確認自己每次複製的資料量

2.slave節點用舊的資料集提供查詢服務,等資料複製好了,載入新資料集,這個時候會停止服務

3.master節點必須開啟rdb和aof持久化,因為不開啟資料丟了,master節點會認為本來就沒有資料,然後去同步slave節點,導致slave節點資料丟失

1.複製過程核心原理

slave節點第一次連線master節點,主節點會開啟一個後臺執行緒,複製一份rdb快照檔案給從節點,同時快取主節點的寫請求在記憶體中,然後從節點接收rdb快照檔案先寫入磁碟,然後載入到記憶體中。然後master節點會吧記憶體中的寫請求也同步給slave節點。

slave節點不是第一次連線master節點,僅僅複製給slave節點缺少的部分。

2.主從複製的斷點續傳

redis2.8開始,支援斷點續傳,如果主從複製過程中,網路斷了,可以接著上次複製的offset繼續複製

master 會在記憶體中建立一個backlog,主從都會儲存一個replica offset和一個masetid。沒有找到就執行全量複製

3.無磁碟化複製

master在記憶體中直接建立rdb,然後傳送給salve,不會在自己本地落地磁碟

repl-diskless-sync no 要落地磁碟為yes

repl-diskless-sync-delay 5,等待一定時長再開始複製,因為要等更多slave重新連線過來

4,過期key處理

slave不會過期key,只會等待master過期key。如果master過期一個key,或者通過LRU淘汰了一個key,那麼會模擬一條del命令發給slave。

redis中儲存一個run id ,如果主節點變了,就全量複製資料

redis複製的時候如果超過60秒會認為失敗。repl-timeout 引數設定

主備切換

主redis掛了,切換從redis為主

sentinel哨兵

哨兵叢集必須部署2個以上節點,因為部署兩個節點的話,根據2/2+1需要兩個節點同意才能通過,3個節點3/2+1要兩個節點同意就能通過,為什麼不建議部署4個簡單?因為4/2+1=3 ,5/2+1=3。4個節點和5個節點都是需要3臺機器同意,5個節點可以允許掛掉兩臺機器。

資料丟失的情況

1.寫磁碟的時候,命令還沒刷到磁碟上

2.主從複製的時候,如果主伺服器在接收到請求,還沒同步到從伺服器的時候掛了,資料丟失

3.腦裂問題,出現網路分割槽,列如:主節點和客戶端在一起,從節點和哨兵叢集在一起,然後哨兵叢集新選舉了一個主節點,這個時候客戶端一隻在往舊的主節點上寫資料,當舊的節點連上時,會被新的主節點同步資料,這個時候資料丟失。

解決資料丟失 主從和腦裂問題:

min-slaves-to-write 1 幾個slave

min-slaves-max-lag 10 資料同步延時的時間

要求至少有1個slave,資料複製和同步的延遲不能超過10秒

非同步複製資料,一旦slave的ack延時太長,就認為複製給從節點的資料太多了,就拒絕請求,這樣如果主節點宕機的損失資料範圍就被控制住了,客戶端被拒絕後需要存如訊息佇列,讓訊息佇列來重試。

shown和odown轉換機制

sdown和odown兩種失敗狀態

sdown是主觀宕機,就是自己覺得一個master掛機了

odown是客觀宕機,quorum數量的哨兵都覺得一個master宕機了

哨兵互相之間的發現,是通過redis的pub/sub系統實現的,每個哨兵都會往sentinel:hello這個channel裡傳送一個訊息,這時候所有其他哨兵都可以消費到這個訊息,並感知到其他哨兵的存在。

master宕機slave節點的配置由哨兵自動更改為新的master,更新配置根據版本號來。

redis cluster

在redis cluster叢集下,每個redis要開放兩個埠,比如6379 和 16379 ,6378和16378

redis用15379來進行通訊,類似叢集匯流排,cluster bus的東西

redis cluster的hash slot演算法

redis cluster有固定的16384個hash slot,對每個key計算CRC16值,然後對16384取模,可以獲取key對應的hash slot

redis cluster中每個master都會持有部分slot,比如有3個master,那麼可能每個master持有5000多個hash slot

hash slot讓node的增加和移除很簡單,增加一個master,就將其他master的hash slot 移動部分過去,減少一個master,就將它的hash slot移動到其他master上去

移動 hash slot的成本非常低的

客戶端的API,可以對指定的資料,讓他們走同一個hash slot,通過hash tag來實現

redis 主從同步

runid:每個redis節點啟動都會生成一個唯一的uuid,每次redis重啟後,runid都會發生變化

offset:主節點和從節點都有自己的offset儲存資料的長度,從節點收到主節點命令後,會把自己的offset給主節點,主節點儲存從節點的offset,然後判斷需要給從節點多少資料。

repl_backlog_size:儲存在主節點上的一個固定長度的先進先出佇列,預設大小是1MB.

全量複製:

從節點發送psync命令,psyns runid offset(由於是第一次,runid為?,offset為-1)

主節點返回fullresync runid offset,runid是主節點的runid,offset是主節點目前的offset。從節點儲存資訊

主節點啟動bgsave命令fork子程序進行RDB持久化,持久化的時候寫資料會複製一份副本,修改資料在副本上進行,原來的資料繼續複製,複製完成後,把原來的資料覆蓋。

從節點清理本地資料並載入RDB,如果開啟了AOF會重寫AOF

部分複製:

複製偏移量:psync runid offset

複製積壓緩衝區:當主節點offset的差距過大超過緩衝區長度時,將無法執行部分複製,只能執行全量複製

​ 如果從節點儲存的runid與主節點現在的runid相同,說明從節點之前同步過,主節點會繼續嘗試使用部分複製(到底能不能部分複製還要看offset和複製積壓緩衝區的情況);

​ 如果從節點儲存的runid與主節點現在的runid不同,說明從節點在斷線前同步的redis節點並不是當前的主節點,只能進行全量複製。