Mesos Mr-Redis 沙箱試用到上線

qfmg6921 7年前發布 | 64K 次閱讀 Redis Mesos NoSQL數據庫

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的一致性實現的)
      1. 最開始考慮的做法是想根據redis name hash成一個固定并且唯一的 在6100 - 6300區間的一個端口號, 不過這種方式可能沖突幾率比較大
      2. 本地proxy每次啟動的時候都去zk讀取本地監聽的端口號 (eg: 6166)
      3. 新建redis,隨機選取6100 ~ 6300 之間的一個端口號 并且在zk里不存在,然后存在zk
      4. 采用輪詢方式,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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!