高级开发运维从简单学:Redis哨兵和集群小贴士
目錄
寫在前面
一、數據庫服務器高可用
二、 Sentinel (哨兵)是啥?
三、部署 Sentinel過程?
1、初始化服務器
2、將普通的Redis服務器使用的代碼替換成sentinel專用代碼
3、初始化sentinel狀態
4、創建連向主服務器的網絡連接
5、哨兵監控實現原理
四、分布式數據庫高并發
五、Redis集群是如何實現的?
1、【槽指派】
2、【重新分片】
3、【MOVED錯誤】
4、【ASK錯誤】
寫在前面
最近博主學習數據庫方面的知識,也算是小白入門,大家伙來一起學習交流,我邊看書邊記錄總結,馬上又開啟新的一周,趕緊把過去一周零散學習的知識記錄下來,以作備忘。
或許你了解高級開發運維知識,對高可用、高并發、分布式略知一二,或許你跟我一樣剛剛入門,那就看完本篇,應該有所收獲,其實這篇總結的知識點不難,是最基礎的Redis多機數據庫下的哨兵架構和集群架構。可能單純的文字描述閱讀起來有點枯燥,但內容算是干貨總結,值得閱讀,最后一鍵三連更好哈 :)
有趣的內容大家可以看看我的博客,例如這篇:我之前做的這個《口罩預約管理系統——數據庫設計(前端+PHP+MySQL)》(有興趣可以瞧瞧,完整項目源碼和教程已上傳CSDN)。
還有《Socket網絡編程專欄》:https://blog.csdn.net/charzous/category_10465473.html? 里面有好玩的小程序(模擬QQ郵箱、實時聊天小程序、C/S架構的通信等)。
一、數據庫服務器高可用
高可用性(High Availability)是系統開發中是經常提到的一個名詞,現在來看看它具體指的是什么,顧名思義,就是保證某種事物可用性很高,不容易出現問題,對于服務器來講,那它指的就是來描述一個系統經過專門的設計,從而增加正常運行時間,減少故障或者宕機停工時間,而保持其服務的高度可用性。
二、 Sentinel (哨兵)是啥?
出現的問題是:Redis主從復制模式下,當主服務器由于故障不能提供服務,需要人工將從節點晉升為主節點,同時需要更新應用方的主節點地址。這種故障處理方法明顯是低效且繁瑣的。
由此,Redis服務器為了保證高可用性,Sentinel(哨兵)架構誕生了!
sentinel架構就是Redis高可用的解決方案。(圖片來源:Redis開發與運維)
- 它是由一個或多個sentinel實例組成的sentinel系統,可以監視任意多個主服務器,以及其下從服務器。
- 在被監視的主服務器進入下線狀態時,自動將下屬的某個服務器升級為新的主服務器,代替下線的主服務器繼續處理命令請求。
三、部署 Sentinel過程?
sentinel系統的部署大概有下面幾個步驟:啟動和初始化sentinel命令:
redis-sentinel sentinel.conf?sentinel架構部署如圖:?
1、初始化服務器
Sentinel 執行的工作和普通 Redis 服務器執行的工作不同, 所以 Sentinel 的初始化過程和普通 Redis 服務器的初始化過程并不完全相同。
比如說, 普通服務器在初始化時會通過載入 RDB 文件或者 AOF 文件來還原數據庫狀態, 但是Sentinel 并不使用數據庫, 所以初始化 Sentinel 時就不會載入 RDB 文件或者 AOF 文件。
2、將普通的Redis服務器使用的代碼替換成sentinel專用代碼
使用REDIS_SENTINEL_PORT端口26379。命令列表包括:ping、sentinel、subscribe、unsubscribe、psubscribe、punsubscribe、info。
Sentinel 則使用 sentinel.c/sentinelcmds 作為服務器的命令表,具體如下:
struct redisCommand sentinelcmds[] = {{"ping",pingCommand,1,"",0,NULL,0,0,0,0,0},{"sentinel",sentinelCommand,-2,"",0,NULL,0,0,0,0,0},{"subscribe",subscribeCommand,-2,"",0,NULL,0,0,0,0,0},{"unsubscribe",unsubscribeCommand,-1,"",0,NULL,0,0,0,0,0},{"psubscribe",psubscribeCommand,-2,"",0,NULL,0,0,0,0,0},{"punsubscribe",punsubscribeCommand,-1,"",0,NULL,0,0,0,0,0},{"info",sentinelInfoCommand,-1,"",0,NULL,0,0,0,0,0} };3、初始化sentinel狀態
其中,master屬性記錄了所有被監視的主服務器的相關信息,數據結構是字典。
- 字典的鍵是被監視主服務器的名字。
- 而字典的值是被監視主服務器對應的?sentinel.c/sentinelRedisInstance?結構。
4、創建連向主服務器的網絡連接
一個是命令連接,專門用于向主服務器發送的命令,并接受命令回復。
一個是訂閱連接,專用用于訂閱主服務器的__sentinel__:hello頻道,保證頻道信息不丟失。
為什么有訂閱連接?
在 Redis 目前的發布與訂閱功能中, 被發送的信息都不會保存在 Redis 服務器里面, 如果在信息發送時, 想要接收信息的客戶端不在線或者斷線, 那么這個客戶端就會丟失這條信息。
因此, 為了不丟失?__sentinel__:hello?頻道的任何信息, Sentinel 必須專門用一個訂閱連接來接收該頻道的信息。
因為 Sentinel 需要與多個實例創建多個網絡連接, 所以 Sentinel 使用的是異步連接。
5、哨兵監控實現原理
?Redis Sentinel通過三個定時監控任務完成對各個節點發現和監控,是判定節點不可達的重要保證。
任務1:每隔10秒,每個Sentinel節點會向主節點和從節點發送info命令獲取最新的拓撲結構,如圖所示。
任務2:每隔2秒,定時任務可以完成以下兩個工作:
- 發現新的Sentinel節點:通過訂閱主節點的__sentinel__:hello了解其他的Sentinel節點信息,如果是新加入的Sentinel節點,將該Sentinel節點信息保存起來,并與該Sentinel節點創建連接。
- Sentinel節點之間交換主節點的狀態,作為后面客觀下線以及領導者選舉的依據。
任務3:每隔1秒,每個Sentinel節點會向主節點、從節點、其余Sentinel節點發送一條ping命令做一次心跳檢測,來確認這些節點當前是否可達。
?
四、分布式數據庫高并發
高并發(High Concurrency)是分布式系統架構設計中必須考慮的因素之一,它通常是指,通過設計保證系統能夠同時并行處理很多請求。
高并發相關常用的一些指標有響應時間,吞吐量,每秒查詢率QPS(Query Per Second),并發用戶數等。
五、Redis集群是如何實現的?
Redis集群就是提供的分布式數據庫方案。集群通過分片來進行數據共享,并提供復制和故障轉移的功能。
Redis的一個集群由多個節點組成,一個節點就是一個運行在集群模式下的Redis服務器,配置選項cluster-enabled決定是否開啟集群模式。
集群的建立通過向一個節點發送cluster meet <ip> <port>命令,握手成功則添加到node節點當前所在的集群。
Redis集群的知識非常豐富,這里簡單介紹其中的幾個重要的點。
1、【槽指派】
Redis集群通過分片的方式來保存數據庫中的鍵值對。集群的整個數據庫被分為16384個槽slot,數據庫中的每個鍵都屬于這些槽中的一個,集群中的每個節點可以處理0個或16384個槽。
2、【重新分片】
可以將任意數量的已經指派給某個節點的槽改為指派給另一個節點,并且相關槽所屬的鍵值對也會移動到目標節點。
3、【MOVED錯誤】
當節點發現鍵所在的槽并非由自己處理時候,節點就會向客戶端返回一個MOVED錯誤,指引客戶端轉向正在負責槽的節點。
集群模式下的客戶端并不會打印出MOVED錯誤,而是自動進行節點轉向,打印轉向信息,單機模式下就會打印出錯誤信息。
4、【ASK錯誤】
在重新分片期間,可能出現部分分片存在于不同節點的情況,客戶端向源節點發送鍵值對請求命令,出現ASK錯誤。同樣的,集群模式下ASK錯誤會自動轉向目標節點。
可能單純的文字描述閱讀起來有點枯燥,但內容算是干貨總結,值得閱讀,最后一鍵三連更好哈 :)
有趣的內容大家可以看看我的博客,例如這篇:我之前做的這個《口罩預約管理系統——數據庫設計(前端+PHP+MySQL)》(有興趣可以瞧瞧,完整項目源碼和教程已上傳CSDN)。
還有《Socket網絡編程專欄》:https://blog.csdn.net/charzous/category_10465473.html? 里面有好玩的小程序(模擬QQ郵箱、實時聊天小程序、C/S架構的通信等)。
如果覺得不錯歡迎“一鍵三連”哦,點贊收藏關注,評論提問建議,歡迎交流學習!一起加油進步!?
本篇內容首發我的CSDN博客:https://csdn-czh.blog.csdn.net/article/details/116596657
總結
以上是生活随笔為你收集整理的高级开发运维从简单学:Redis哨兵和集群小贴士的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS2015无法使用编辑并继续 及 警告
- 下一篇: LINK : warning LNK40