SSDB FAQ - 常見問題
- 問: 這裡沒有我想問的問題和答案, 我該怎麼辦?
#答案: 我推薦所有人透過學習文件和使用自己大腦思考來回答自己的問題.
#如果你經過學習文檔, 並且進行充分思考後, 仍然無法得到答案, 你可以到Github 上提issue.
注意, 作為一個技術產品的用戶, 一個互聯網工作者, 甚至是一個程序員, 你應該學會基本的提問技能. 如果你的提問沒有得到回答, 那麼責任不在被問到者, 而在於你自己, 你自己沒有像個正常的技術人那樣正確地提問.
- 問: 為什麼我在本機可以存取SSDB 伺服器, 在其它機器卻不能呢? 提示Connection refused.
答案: 預設的設定檔基於安全考量, 只開放給本機存取. 如果你想開放給網路上的其它IP 存取, 請按文件修改設定.
- 問: 為什麼並發數上不去? 伺服器報錯Too many open files, 客戶端報錯Connection reset by peer.
#答案: 請參考文檔 進行設定.
- 問: 我把一個, 兩個, 或所有的key 都刪除了, 為什麼SSDB 佔用的記憶體和磁碟空間並沒有釋放?
答案: SSDB 有自己策略來決定何時釋放或是否釋放記憶體和硬碟佔用, 你不能要求SSDB 立即或在未來某個時間, 或基於某個條件 釋放這些空間. 而且, 即使資料庫清空了, SSDB 仍然會保留一些資訊, 因此仍然佔用部分硬碟空間. 你不應該關心這個問題.
- 問: 為什麼SSDB 偶爾會用100% CPU?
答案: SSDB 偶爾使用100% CPU 是完全正常的, 請不要大驚小怪. 這是因為SSDB/LevelDB 在進行資料庫整理(Compaction)操作, 持續的時間一般隨著資料變大而變長, 一般只持續數秒.
- 問: 為什麼SSDB 偶爾會使用較多磁碟IO?
## SSDB
- 偶爾
正常的, 請不要大驚小怪. 這是因為SSDB/LevelDB 在進行資料庫整理(Compaction)操作, 持續的時間一般隨著資料變大而變長, 一般只持續數秒.
- 問: 為什麼SSDB 偶爾會使用較多記憶體空間, 然後又降下來?
答案:SSDB 使用的記憶體空間是變動的, 可能忽高忽低. 使用的記憶體空間的上限在文件 中有描述.
# #####問: Compaction 時服務會有稍微變慢, 我可以設定Compaction 執行的時間嗎?##################答案:### 很遺憾, 你不能設定Compaction 在何時執行, SSDB/LevelDB 有自己策略和機制, 決定何時應該進行Compaction. 根據大多數用戶的使用反饋, Compaction 對服務沒有任何影響.###
- 問: 我原來的設定檔中沒有開啟壓縮選項(compression: no), 我可以中途把compression 改為yes 嗎?
答案: 是的, 你可以在任何時候修改compression 選項, 只要你重啟ssdb-server, 新的修改就能生效. 更改後, 原來的數據依然兼容, 不會有任何問題.
- 問: 我開啟了壓縮選項, 但SSDB 的硬碟佔用並沒有變小, 這是怎麼回事?
答案: 無論你開啟或關閉壓縮選項, 只要重啟後, 新的選項就已經生效了. 但是, 新的選項不一定立即影響原來的舊資料, SSDB 會在適當的時候將新選項套用到舊資料, 你無法控制這一點.
- 問: 有指令可以知道SSDB 中儲存的key 總數嗎?
答案: 如果你想統計的是KV 的數量, 那麼, 在一開始時, 你就要把所有KV 都放在同一個HASH 中, 然後通過 hsize 命令就可以得到key 的數量了. 如果一開始你沒有這麼做, 或者你想統計KV 以外的數量, 那麼答案很簡單- 沒有這樣的單一命令(除非你自己寫腳本遍歷統計).
- 問: SSDB 支援 key 尋找嗎?支援通配符 模糊尋找嗎?
答案: SSDB 支援, 且只支援前綴查找, 也就是類似
a
這樣的查找, 而不支援a
,a
或其它的模糊尋找. 具體用法請參考指令:scan#, hlist, keys, hkeys, #hscan, zlist, zkeys, ##zscan, qlist 的文檔.注意, 這些指令都要求你省略
號!
- 問: SSDB 不支援sets 集合嗎? Redis 的sadd, sdiff 等求交集, 並集指令我都用不了了?
答案: SSDB 不支援sets, 以後也不太可能支援, 因為有替代方案. 你可以用hash 來替代sets, 因為一個hash 的key 是唯一的, 可以實現集合的特性. 至於交集, 並集等操作,你只能自己實現. 例如, 求交集, 你可以遍歷第一個hash 的key, 然後和第二個hash 對比, 把結果存入第三個hash.
- 問: 我用Twemproxy 設定SSDB 做負載平衡和叢集, 但是當我用ssdb-cli 連接Twemproxy 時, 會報錯, 為什麼?
答案: 因為Twemproxy 不支援SSDB 網路協定, 所以, 你只能使用redis-cli 連接Twemproxy. 注意, 你可以用ssdb-cli 或redis-cli 連接SSDB, 那是因為SSDB 支援兩種協定, 而Twemproxy 只支援一種.
- 問: 如何在一台機器上部署多個SSDB 實例?
答案: 每一個實例使用不同的設定檔進行啟動, 而且, 設定檔裡的
work_dir
server.port
不能相同, 也就是每個實例的資料庫儲存路徑, 以及監聽埠. 如果pidfile
logger.output
使用的是絕對路徑, 也要保證不能相同, 如果是相對路徑, 由不需要, 因為預設跟隨work_dir
而不同了.