張小峰 Oray技術總監
簡介
張小峰專注于高性能網絡辦事架構,15年C++網絡應用開發和團隊辦理經驗;在DNS架構、C++網絡通信技術、各操作系統API交互、圖像處理、加密算法等領域都有著深入的研究;在Oray技術團隊中負責所有產品的網絡辦事及圖像底層架構設計與開發;帶領團隊先后研發了多款花生殼、向日葵遠程控制軟件千萬量級的產品,從事其中的結構設計與關鍵技術攻關。是Oray技術團隊的領頭羊與靈魂人物。
應用配景介紹作為提供各種互聯網辦事且具有海量用戶的的Oray,我們也一直在實踐各種新技術新架構;緩存方面我們從memcached、ttserver、redis等都有較多應用,其中redis我們的dns體系中有著很深度的集成使用;MySQL InnoDB memcached plugin出來挺久的了,網上還沒見到國內有把它用到生產環境的實例,我今天就給大家說下小白鼠體驗。
創始產品花生殼是個簡單的動態域名產品,用戶可以用它發布本身的各類辦事,從網站到各類專用數據連接;就算在中國互聯網環境如此殘酷同時IPv4資源在不停萎縮的今天,這個產品還在不停的發展壯大。雖然外貌看起來是個簡單的工具軟件,但它為中國一代代的互聯網人解決了很多基礎的連接問題!
但很大一部分用戶使用我們的花生殼也就是為了遠程操作電腦,所以2010年,在我們埋頭苦干了1年多后推出了向日葵遠程控制產品,這個產品的基本功能就是讓用戶不需要關心IP端口等技術知識就可以遠程辦理控制他的所有電腦,這個產品主要依賴以下技術:
1、 通過關系型數據庫辦理用戶主機清單;
2、 使用長連接維持被控在線狀態;
3、 P2P通信技術傳輸控制信號以及圖像信號;
4、 優化的算法盡可能的降低用戶帶寬占用以及提高圖像質量;
5、 其他周邊技術,如HTML5免插件遠程控制、遠程開機等。
客戶端、操作系統以及相關遠控技術問題我們今天先不探討,向日葵也不是一個簡單的C/S結構軟件,我們需要像聊天辦事器那樣與客戶端進行實時交互,而客戶端在線量一直在兇猛的增長中,我們的系統以及運維和開發團隊也就不竭的迭代并成長。
向日葵遠程控制技術的數據需求上面提到,向日葵使用關系型數據庫存貯某一個用戶擁有哪些主機,以及這些主機的具體相關信息;在此同時,我們也需要臨時存儲一些關鍵的實時數據:
1、 主機鑒權信息
2、 主機在線狀態
3、 如何連接主機
其實剛發布向日葵的幾個月我們是把它們同時放在關系數據庫里的,阿誰時候主要考慮的也不是辦事端的性能問題,而是整個系統跑通,只是我們的數據庫后來吃不用了,這一段經歷不長,說真的也沒啥好講的。
緩存優化史既然存在關系數據庫中分歧適,我們就開始用各種緩存技術來存儲這種實時數據。
從memcached到ttservermemcached第一代的主機狀態數據緩存化,我們把它放在了memcached,整個客戶端的登陸過程是這樣的(里頭略去了各種錯誤處理及異常以及各種附屬架構,好比負載均衡或者備份等):

把狀態等需要頻繁拜候的數據放到緩存后,這個大框架到現在也還基本上是這樣,API負責所有跟持久化DB的交互操作,長連接只負責跟memcached的通信,這樣也制止了我們的DB有過多角色參與讀寫;別的這個時候我們只有一臺memcached辦事器,因為我們算過16G內存大約可以放上億的主機信息。
但這些數據跑memcached真的合適嗎?
在經歷了兩次memcached瓦解后我們也瓦解了,memcached的數據是完全放在內存里的,瓦解后所有主機全部會釀成不在線且只能通過重啟所有辦事器解決,而重啟所有辦事器意味著所有原先在線客戶端都得全部重新登陸一次,這個過程會極其漫長,以小時計的。
ttserver我們要改進了,順其自然的,我們想到了ttserver,ttserver可以在瓦解重啟后恢復數據且具備主備同步功能,而丟失那部分數據我們可以在客戶端登陸時從DB里自動恢復出來;
由于ttserver跟memcached通信協議上完全兼容,但為了制止全局性的災難,我們在完成多cache辦事優化后,新系統很快就上線了。
新緩存體系的結構長這樣的:

完全堆疊式的設計,理論上也是可以無限擴容的,但我們沒意識到ttserver幾個大問題:
ttserver不支持key過期的,需要開啟table database模式,并通過lua腳本的方式來實現,但該模式ttserver的運行性能相當差,而且在數據很大的時候出現不不變的現象。