工作中Redis有哪些好用的運(yùn)維工具
工作中使用 Redis 時,如果大家公司沒有專業(yè)運(yùn)維,可能開發(fā)人員就會面臨這些運(yùn)維的工作,包括 Redis 的運(yùn)行狀態(tài)監(jiān)控,數(shù)據(jù)遷移,主從集群、切片集群的部署和運(yùn)維等等。本文我就從這三個方面,給大家介紹一些工具,幫助大家更好的運(yùn)維管理 Redis。最后文末還有免費(fèi)紅包封面可以領(lǐng)取,回饋給各位讀者朋友。
本文目錄如下,
圖片
最基本的監(jiān)控命令:INFO 命令
我們先來學(xué)習(xí)下監(jiān)控 Redis 實(shí)時運(yùn)行狀態(tài)的工具,這些工具都用到了 Redis 提供的一個監(jiān)控命令:INFO。
Redis 本身提供的 INFO 命令會返回豐富的實(shí)例運(yùn)行監(jiān)控信息,這個命令是 Redis 監(jiān)控工具的基礎(chǔ)。
INFO 命令在使用時,可以帶一個參數(shù) section,這個參數(shù)的取值有好幾種,相應(yīng)的,INFO 命令也會返回不同類型的監(jiān)控信息。我把 INFO 命令的返回信息分成 5 大類,其中,有的類別當(dāng)中又包含了不同的監(jiān)控內(nèi)容,如下表所示:
圖片
在監(jiān)控 Redis 運(yùn)行狀態(tài)時,INFO 命令返回的結(jié)果非常有用。如果你想了解 INFO 命令的所有參數(shù)返回結(jié)果的詳細(xì)含義,可以查看 Redis 官網(wǎng)的介紹。這里,我給你提幾個運(yùn)維時需要重點(diǎn)關(guān)注的參數(shù)以及它們的重要返回結(jié)果。
首先,無論你是運(yùn)行單實(shí)例或是集群,我建議你重點(diǎn)關(guān)注一下 stat、commandstat、cpu 和 memory 這四個參數(shù)的返回結(jié)果,這里面包含了命令的執(zhí)行情況(比如命令的執(zhí)行次數(shù)和執(zhí)行時間、命令使用的 CPU 資源),內(nèi)存資源的使用情況(比如內(nèi)存已使用量、內(nèi)存碎片率),CPU 資源使用情況等,這可以幫助我們判斷實(shí)例的運(yùn)行狀態(tài)和資源消耗情況。
另外,當(dāng)你啟用 RDB 或 AOF 功能時,你就需要重點(diǎn)關(guān)注下 persistence 參數(shù)的返回結(jié)果,你可以通過它查看到 RDB 或者 AOF 的執(zhí)行情況。
如果你在使用主從集群,就要重點(diǎn)關(guān)注下 replication 參數(shù)的返回結(jié)果,這里面包含了主從同步的實(shí)時狀態(tài)。
不過,INFO 命令只是提供了文本形式的監(jiān)控結(jié)果,并沒有可視化,所以,在實(shí)際應(yīng)用中,我們還可以使用一些第三方開源工具,將 INFO 命令的返回結(jié)果可視化。接下來,我要講的 Prometheus,就可以通過插件將 Redis 的統(tǒng)計結(jié)果可視化。
面向 Prometheus 的 Redis-exporter 監(jiān)控
圖片
Prometheus 是一套開源的系統(tǒng)監(jiān)控報警框架。它的核心功能是從被監(jiān)控系統(tǒng)中拉取監(jiān)控數(shù)據(jù),結(jié)合 Grafana 工具,進(jìn)行可視化展示。而且,監(jiān)控數(shù)據(jù)可以保存到時序數(shù)據(jù)庫中,以便運(yùn)維人員進(jìn)行歷史查詢。同時,Prometheus 會檢測系統(tǒng)的監(jiān)控指標(biāo)是否超過了預(yù)設(shè)的閾值,一旦超過閾值,Prometheus 就會觸發(fā)報警。
Prometheus 官網(wǎng)地址:https://prometheus.io/
對于系統(tǒng)的日常運(yùn)維管理來說,這些功能是非常重要的。而 Prometheus 已經(jīng)實(shí)現(xiàn)了使用這些功能的工具框架。我們只要能從被監(jiān)控系統(tǒng)中獲取到監(jiān)控數(shù)據(jù),就可以用 Prometheus 來實(shí)現(xiàn)運(yùn)維監(jiān)控。
Prometheus 正好提供了插件功能來實(shí)現(xiàn)對一個系統(tǒng)的監(jiān)控,我們把插件稱為 exporter,每一個 exporter 實(shí)際是一個采集監(jiān)控數(shù)據(jù)的組件。exporter 采集的數(shù)據(jù)格式符合 Prometheus 的要求,Prometheus 獲取這些數(shù)據(jù)后,就可以進(jìn)行展示和保存了。
Redis-exporter 就是用來監(jiān)控 Redis 的,它將 INFO 命令監(jiān)控到的運(yùn)行狀態(tài)和各種統(tǒng)計信息提供給 Prometheus,從而進(jìn)行可視化展示和報警設(shè)置。目前,Redis-exporter 可以支持 Redis 2.0 至 6.0 版本,適用范圍比較廣。
Redis-exporter 地址:https://github.com/oliver006/redis_exporter
除了獲取 Redis 實(shí)例的運(yùn)行狀態(tài),Redis-exporter 還可以監(jiān)控鍵值對的大小和集合類型數(shù)據(jù)的元素個數(shù),這個可以在運(yùn)行 Redis-exporter 時,使用 check-keys 的命令行選項(xiàng)來實(shí)現(xiàn)。
此外,我們可以開發(fā)一個 Lua 腳本,定制化采集所需監(jiān)控的數(shù)據(jù)。然后,我們使用 scripts 命令行選項(xiàng),讓 Redis-exporter 運(yùn)行這個特定的腳本,從而可以滿足業(yè)務(wù)層的多樣化監(jiān)控需求。
除了監(jiān)控 Redis 的運(yùn)行狀態(tài),還有一個常見的運(yùn)維任務(wù)就是數(shù)據(jù)遷移。接下來,我們再來學(xué)習(xí)下數(shù)據(jù)遷移的工具。
數(shù)據(jù)遷移工具 Redis-shake
圖片
有時候,我們需要在不同的實(shí)例間遷移數(shù)據(jù)。目前,比較常用的一個數(shù)據(jù)遷移工具是 Redis-shake,這是阿里云 Redis 和 MongoDB 團(tuán)隊(duì)開發(fā)的一個用于 Redis 數(shù)據(jù)同步的工具。
Redis-shake 地址:https://github.com/tair-opensource/RedisShake
Redis-shake 的基本運(yùn)行原理,是先啟動 Redis-shake 進(jìn)程,這個進(jìn)程模擬了一個 Redis 實(shí)例。然后,Redis-shake 進(jìn)程和數(shù)據(jù)遷出的源實(shí)例進(jìn)行數(shù)據(jù)的全量同步。
這個過程和 Redis 主從實(shí)例的全量同步是類似的。
源實(shí)例相當(dāng)于主庫,Redis-shake 相當(dāng)于從庫,源實(shí)例先把 RDB 文件傳輸給 Redis-shake,Redis-shake 會把 RDB 文件發(fā)送給目的實(shí)例。接著,源實(shí)例會再把增量命令發(fā)送給 Redis-shake,Redis-shake 負(fù)責(zé)把這些增量命令再同步給目的實(shí)例。
下面這張圖展示了 Redis-shake 進(jìn)行數(shù)據(jù)遷移的過程:
圖片
Redis-shake 的一大優(yōu)勢,就是支持多種類型的遷移。
首先,它既支持單個實(shí)例間的數(shù)據(jù)遷移,也支持集群到集群間的數(shù)據(jù)遷移。
其次,有的 Redis 切片集群(例如 Codis)會使用 proxy 接收請求操作,Redis-shake 也同樣支持和 proxy 進(jìn)行數(shù)據(jù)遷移。
另外,因?yàn)?Redis-shake 是阿里云團(tuán)隊(duì)開發(fā)的,所以,除了支持開源的 Redis 版本以外,Redis-shake 還支持云下的 Redis 實(shí)例和云上的 Redis 實(shí)例進(jìn)行遷移,可以幫助我們實(shí)現(xiàn) Redis 服務(wù)上云的目標(biāo)。
在數(shù)據(jù)遷移后,我們通常需要對比源實(shí)例和目的實(shí)例中的數(shù)據(jù)是否一致。如果有不一致的數(shù)據(jù),我們需要把它們找出來,從目的實(shí)例中剔除,或者是再次遷移這些不一致的數(shù)據(jù)。
這里,我就要再給你介紹一個數(shù)據(jù)一致性比對的工具了,就是阿里云團(tuán)隊(duì)開發(fā)的 Redis-full-check。
Redis-full-check 的工作原理很簡單,就是對源實(shí)例和目的實(shí)例中的數(shù)據(jù)進(jìn)行全量比對,從而完成數(shù)據(jù)校驗(yàn)。不過,為了降低數(shù)據(jù)校驗(yàn)的比對開銷,Redis-full-check 采用了多輪比較的方法。
在第一輪校驗(yàn)時,Redis-full-check 會找出在源實(shí)例上的所有 key,然后從源實(shí)例和目的實(shí)例中把相應(yīng)的值也都查找出來,進(jìn)行比對。第一次比對后,redis-full-check 會把目的實(shí)例中和源實(shí)例不一致的數(shù)據(jù),記錄到 sqlite 數(shù)據(jù)庫中。
從第二輪校驗(yàn)開始,Redis-full-check 只比較上一輪結(jié)束后記錄在數(shù)據(jù)庫中的不一致的數(shù)據(jù)。
為了避免對實(shí)例的正常請求處理造成影響,Redis-full-check 在每一輪比對結(jié)束后,會暫停一段時間。隨著 Redis-shake 增量同步的進(jìn)行,源實(shí)例和目的實(shí)例中的不一致數(shù)據(jù)也會逐步減少,所以,我們校驗(yàn)比對的輪數(shù)不用很多。
我們可以自己設(shè)置比對的輪數(shù)。具體的方法是,在運(yùn)行 redis-full-check 命令時,把參數(shù) comparetimes 的值設(shè)置為我們想要比對的輪數(shù)。
等到所有輪數(shù)都比對完成后,數(shù)據(jù)庫中記錄的數(shù)據(jù)就是源實(shí)例和目的實(shí)例最終的差異結(jié)果了。
這里有個地方需要注意下,Redis-full-check 提供了三種比對模式,我們可以通過 comparemode 參數(shù)進(jìn)行設(shè)置。
comparemode 參數(shù)有三種取值,含義如下:
- KeyOutline,只對比 key 值是否相等;
- ValueOutline,只對比 value 值的長度是否相等;
- FullValue,對比 key 值、value 長度、value 值是否相等。
我們在應(yīng)用 Redis-full-check 時,可以根據(jù)業(yè)務(wù)對數(shù)據(jù)一致性程度的要求,選擇相應(yīng)的比對模式。如果一致性要求高,就把 comparemode 參數(shù)設(shè)置為 FullValue。
好了,最后,我再向你介紹一個用于 Redis 集群運(yùn)維管理的工具 CacheCloud。
集群管理工具 CacheCloud
圖片
CacheCloud 是搜狐開發(fā)的一個面向 Redis 運(yùn)維管理的云平臺,它實(shí)現(xiàn)了主從集群、哨兵集群和 Redis Cluster 的自動部署和管理,用戶可以直接在平臺的管理界面上進(jìn)行操作。
CacheCloud 地址:https://github.com/sohutv/cachecloud
針對常見的集群運(yùn)維需求,CacheCloud 提供了 5 個運(yùn)維操作。
- 下線實(shí)例:關(guān)閉實(shí)例以及實(shí)例相關(guān)的監(jiān)控任務(wù)。
- 上線實(shí)例:重新啟動已下線的實(shí)例,并進(jìn)行監(jiān)控。
- 添加從節(jié)點(diǎn):在主從集群中給主節(jié)點(diǎn)添加一個從節(jié)點(diǎn)。
- 故障切換:手動完成 Redis Cluster 主從節(jié)點(diǎn)的故障轉(zhuǎn)移。
- 配置管理:用戶提交配置修改的工單后,管理員進(jìn)行審核,并完成配置修改。
當(dāng)然,作為運(yùn)維管理平臺,CacheCloud 除了提供運(yùn)維操作以外,還提供了豐富的監(jiān)控信息。
CacheCloud 不僅會收集 INFO 命令提供的實(shí)例實(shí)時運(yùn)行狀態(tài)信息,進(jìn)行可視化展示,而且還會把實(shí)例運(yùn)行狀態(tài)信息保存下來,例如內(nèi)存使用情況、客戶端連接數(shù)、鍵值對數(shù)據(jù)量。這樣一來,當(dāng) Redis 運(yùn)行發(fā)生問題時,運(yùn)維人員可以查詢保存的歷史記錄,并結(jié)合當(dāng)時的運(yùn)行狀態(tài)信息進(jìn)行分析。
如果你希望有一個統(tǒng)一平臺,把 Redis 實(shí)例管理相關(guān)的任務(wù)集中托管起來,CacheCloud 是一個不錯的工具。
總結(jié)一下
本文中我給大家介紹了幾種 Redis 的運(yùn)維工具,我們先了解了 Redis 的 INFO 命令,這個命令是監(jiān)控工具的基礎(chǔ),監(jiān)控工具都會基于 INFO 命令提供的信息進(jìn)行二次加工。
我們還學(xué)習(xí)了 3 種用來監(jiān)控 Redis 實(shí)時運(yùn)行狀態(tài)的運(yùn)維工具,分別是 Redis-exporter、redis-stat 和 Redis Live。
關(guān)于數(shù)據(jù)遷移,我們既可以使用 Redis-shake 工具,也可以通過 RDB 文件或是 AOF 文件進(jìn)行遷移。
最后就是集群管理,我們可以使用 CacheCloud 平臺,通過管理界面對 Redis 集群做管理和部署。