Mesos Mr-Redis 沙箱試用到上線
Mr-Redis 是華為基于mesos開發的一個redis framework , 方便管理 redis 實例和集群 (github url: https://github.com/mesos/mr-redis )。Mr-Redis 可以創建單個實例,也可以創建主從實例,并實現了高可用, 這比使用 redis-sentinel 來實現 redis 高可用架構上簡單很多。下面是我從測試 Mr-Redis 到上線過程中遇到的問題,希望對正在打算使用和調研 Mr-Redis 的同學有所幫助...
Mr-Redis特點
- 充分使用數據中心的資源
- 創建一個redis實例的時間為秒級
- failover 的時間為秒級
(在沙箱測試failover時把 redis 容器stop, 幾秒種內會啟動一個新的redis容器,ip和端口可能會發生變化,沒有做主從的 redis 數據會丟失,做了主從的數據不會丟失)
Mr-Redis 解決了客服系統中哪些問題
- 每個微服務都擁有自己的 redis , 所以隨著業務增長,微服務的拆分, redis 實例會不斷的增長,通過 Mr-Redis 統一管理可以簡化運維工作量
- Mr-Redis 提供了 redis 的高可用,解決線上 redis 單點的問題
部署架構
使用 Mr-Redis 遇到的問題
- 通過 Mr-Redis 部署的 redis 性能會損失多少
和作者 Dhilip Kumar 聊過,他說 redis 性能會損失 30% 左右,當時不確定性能是在哪里損失掉的,經過沙箱測試發現性能是損失在proxy轉發上面了,我的壓測結果顯示go-proxy損失了30-40%的性能,以后會逐步分析這個proxy是不是有改進的空間。`如果服務對 redis qps 要求特別高,建議考慮其他集群方案`** - redis 實例 failover 后, 客戶端如何發現新的redis 地址
為了解決這個問題,我們做了如下改進:- redis 信息儲存在 zk 里, 去掉 config.json 這個依賴, 初始化還有同步操作都從zk中讀取
- 每個 mesos slave 機器上的 proxy 所代理的 redis 在本地的轉發端口是一致的 (利用zk的一致性實現的)
- 最開始考慮的做法是想根據redis name hash成一個固定并且唯一的 在6100 - 6300區間的一個端口號, 不過這種方式可能沖突幾率比較大
- 本地proxy每次啟動的時候都去zk讀取本地監聽的端口號 (eg: 6166)
- 新建redis,隨機選取6100 ~ 6300 之間的一個端口號 并且在zk里不存在,然后存在zk
- 采用輪詢方式,proxy 會定時去獲取 zk 中 redis 相關信息
之前準備用zk的事件通知機制來處理, 不過由于 Mr-Redis 在 zk 中的數據結構復雜, 不能 通過childrenW 簡單的實現, 所以只好折衷選擇了輪訓的方式來獲取 proxy 代理的 redis 信息
- scheduler 重啟之后不會從zk中load redis信息,dashboard上不會顯示任何redis實例,但是redis實例確實還在運行。
這個問題可以通過一個 tricky 的方式來解決,在 zk 中查詢出所有運行中的 redis 實例名稱(eg. redis_name), 對每一個實例執行 curl <scheduler_ip>:5656/v1/STATUS/redis_name, 執行完這個命令, dashboard 上就會顯示所有運行的 redis 實例 - 在 dashboard 中創建 redis 實例,dashboard 上不會自動更新
可以手動刷新,如果有時間可以幫忙解一下這個bug - MrRedisExecutor 運行過程中 docker pull 拉取 redis 鏡像的時候會連接外網,如果沒有外網會報錯。為了解決這個問題可以在內網環境里可以為 dockerd 配置代理 也可以在內網里搭建自己的 docker registry
https://docs.docker.com/engine/admin/systemd/#httphttps-proxy
錯誤信息:dockerd: time="2017-08-29T12:19:16.361567332+08:00" level=error msg="Not continuing with pull after error: Network timed out while trying to connect to https://index.docker.io/v1/repositories/library/redis/images. You may want to check your internet connection or if you are behind a proxy."
- mr-redis scheduler 配置文件中不支持寫多zk地址, 導致 zk 會成為單點
提了一個pr https://github.com/mesos/mr-redis/pull/70
需要重新編譯 scheduler 和 MrRedisExecutor. - Mr-Redis scheduler 高可用 不能像 marathon 那樣實現 failover (3個實例,一個 leader, 另外2個 follower, 當 leader 掛掉的時候,follower會自動選舉出leader), scheduler 的 leader 掛掉后,另外2個 follower 沒有得到通知。 解決方法: 通過 marathon 只起一個 scheduler 實例, constrains 配置為 hostname:UNIQUE, 這樣配置如果 scheduler 所在服務器宕機, 會在其他機器重新啟動一個scheduler, 并重新連接master。經過多種 redis 破壞性測試,redis 都是可以 failover的。
需要改進的地方
- 查看本地 redis 代理監聽端口列表需要通過api調用,可以考慮加到dashboard上方便查看
- 提供 proxy 轉發性能, 減少 redis qps 損耗
- redis 內存彈性擴容
來自:http://dockone.io/article/2658
本文由用戶 qfmg6921 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!