Pika 是360 DBA和基礎架構組聯合開發的類Redis 存儲系統, 完全支持Redis協議。Pika的出現並不是為了替代Redis,而是Redis的場景補充。
Pika是一個可持久化的大容量Redis存儲服務,兼容String、Hash、List、ZSet、Set的絕大部分接口,解決Redis由於存儲數據量巨大而導致內存不夠用的容量瓶頸。
Pika基於Rocksdb開發的大容量類Redis存儲,通過持久化存儲方式解決Redis在大容量場景下主從同步代價高、恢復時間慢、單線程相對脆弱、內存成本高等問題。
Github地址:
https://github.com/Qihoo360/pika
特點:
適用場景:
如果業務場景的數據比較大,Redis 很難支撐, 比如大於50G。或者業務數據很重要,不允許斷電丟失,那麼使用Pika 就可以解決你的問題。而在實際使用中,Pika的性能大約是Redis的50%。
主要組成:
1. 網絡模塊 pink-對網絡編程的封裝,支持Redis協議。
2. 線程模塊-基於pink對線程進行封裝,使用多個工作線程來進行讀寫操作,由底層 nemo 引擎來保證線程安全。
3. 存儲引擎 nemo-基於 Rocksdb 修改,封裝 Hash, List, Set, Zset 等數據結構。
4. 日誌模塊 binlog-Pika的主從同步是使用Binlog來完成的。Binlog 本質是順序寫文件,通過Index + offset 進行同步點檢查。
存儲引擎為什麼沒有選擇 LevelDB 呢,另外市面上有類似的方案如 ssdb,有什麼不同之處嗎?
關於存儲引擎的選擇,在 LevelDB、RocksDB 上面做過對比。LevelDB,RocksDB 在數據量比較小的時候性能差異不大,但是在數據量比較大的情況下,比如 200G 的時候,RocksDB 的性能會比 LevelDB 要來得好。
RocksDB 作為一個繼承了 LevelDB 衣缽的 key-value 資料庫,使用和 LevelDB 一樣的 LSM Tree(Log Structured Merge Trees)來存儲數據,同時允許高度靈活的配置,從而可以應對各種不同的應用場景與需求。
為了減少用戶的學習成本,目前 Pika 的主從同步功能是和 Redis 完全一樣,只需要 slaveof 就可以實現主從關係的建立,使用起來非常方便。
目前,Pika支持主從結構,也支持Codis。Pika 從3.2.0版本之後支持sharding mode。
Pika 具有兩種運行模式: 經典模式(Classic) & 分布式模式(Sharding)。
(1)經典模式(Classic): 即1主N從同步模式,1個主實例存儲所有的數據,N個從實例完全鏡像同步主實例的數據,每個實例支持多個DBs。DB默認從0開始,Pika的配置項databases可以設置最大DB數量。DB在Pika上的物理存在形式是一個文件目錄。
(2)分布式模式(Sharding): Sharding模式下,將用戶存儲的數據集合稱為Table,每個Table切分成多個分片,每個分片稱為Slot,對於某一個KEY的數據由哈希算法計算決定屬於哪個Slot。將所有Slots及其副本按照一定策略分散到所有的Pika實例中,每個Pika實例有一部分主Slot和一部分從Slot。在Sharding模式下,分主從的是Slot而不再是Pika實例。Slot在Pika上的物理存在形式是一個文件目錄。
Pika可以通過配置文件中的instance-mode配置項,設置為classic和sharding,來選擇運行經典模式(Classic)還是分布式模式(Sharding)的Pika。
Pika 目前並沒有使用類似 Redis 的Sentinel,Pika 前面是掛 LVS 來負責主從切換。
目前已知用戶有:360,新浪微博,garena 遊戲,apus,萬達飛凡網,美團網,學而思教育,小米,環信,58 同城,迅雷,高偉達,第一彈社區,億瑪科技等。
在 360 內部使用情況,粗略的統計如下:目前已有1000+實例,每天訪問量900億,存儲容量18T。
Pika相對於Redis,最大的不同就是Pika是持久化存儲,數據存在磁碟上,而Redis是內存存儲,由此不同也給Pika帶來了相對於Redis的優勢和劣勢。
優勢:
劣勢:
Pika與Redis是使用場景上互相補充的關係。目前線上的Pika機器都使用的SSD,一般場景下ops在5w以內場景都能輕鬆應對。
Pika的設計初衷其實就是為滿足業務在Redis存儲中,因為內存不足而造成業務損失,所以,Pika的命令基本與Redis保持一致,並且Client也是復用Redis的,這樣,業務從Redis切換到Pika,無任何複雜度。