XiaoMi Chronos時間戳服務器
Chronos,在古希臘語意為時間,是小米公司開發(fā)的實現(xiàn)高可用、高性能、提供全局唯一而且嚴格單調遞增timestamp的服務。
Chronos 采用主備架構,主服務器掛了以后備服務器迅速感知并接替服務,從而實現(xiàn)系統(tǒng)的高可用。服務端使用Thrift框 架,經(jīng)測試每秒可處理約60萬次RPC請求,客戶端單線程每秒可請求6萬次(本地服務器),保證高性能與低延時。全局只有唯一的 ChronosServer提供服務,分配的timestamp保證嚴格單調遞增,并且將已分配的值持久化到ZooKeeper上,即使發(fā)生 failover也能保證服務的正確性。
原理
Chronos依賴ZooKeeper實現(xiàn)與HBase類 似的Leader Election機制,ChronosServer啟動時將自己的信息寫到ZooKeeper的Master臨時節(jié)點上,如果主服務器已經(jīng)存在,那么就記 錄到BackupServers節(jié)點上。一旦Master臨時節(jié)點消失(主服務器發(fā)生failover),所有備服務器收到ZooKeeper通知后參與 新一輪的選主,保證最終只有一個新的主服務器接替服務。
ChronosServer運行時會啟動一個Thrift服務器,提供getTimestamp()和getTimestamps(int)接口, 并且保證每次返回的timestamp都是嚴格單調遞增的。返回的timestamp與現(xiàn)實時間有基本對應關系,為當前Unix time乘以2的18次方(足夠使用1115年),由于我們優(yōu)化了性能,所以如果存在failover就不能保證這種對應關系的可靠性。
ChronosClient啟動時,通過訪問ZooKeeper獲得當前的主ChronosServer地址,連接該服務器后就可以發(fā)送 Thrift RPC請求了。一旦主服務器發(fā)生failover,客戶端請求失敗,它會自動到ZooKeeper獲得新的主ChronosServer地址重新建立連 接。
