SSDB 配置文件详解
SSDB 的配置非常簡單, 附帶的 ssdb.conf 你不用修改便可以使用. 如果你要高度定制, 還是需要修改一些配置的. 下面做介紹.
SSDB 的配置文件是一種層級 key-value 的靜態配置文件, 通過一個 TAB 縮進來表示層級關系. 以 '#' 號開始的行是注釋. 標準的配置文件如下:
# ssdb-server config# relative to path of this file, must exist work_dir = ./var pidfile = ./var/ssdb.pidserver:ip: 127.0.0.1port: 8888replication:slaveof:# sync|mirror, default is sync#type: sync#ip: 127.0.0.1#port: 8889logger:level: infooutput: log.txtrotate:size: 1000000000leveldb:# in MBcache_size: 500# in KBblock_size: 32# in MBwrite_buffer_size: 64# in MBcompaction_speed: 100# yes|nocompression: yeswork_dir: ssdb-server 的工作目錄, 啟動后, 會在這個目錄下生成 data 和 meta 兩個目錄, 用來保存 LevelDB 的數據庫文件. 這個目錄是相對于 ssdb.conf 的相對路徑, 也可以指定絕對路徑.
server: ip 和 port 指定了服務器要監聽的 IP 和端口號. 如果 ip 是 0.0.0.0, 則表示綁定所有的 IP. 基于安全考慮, 可以將 ip 設置為 127.0.0.1, 這樣, 只有本機可以訪問了. 如果要做更嚴格的更多的網絡安全限制, 就需要依賴操作系統的 iptables.
replication: 用于指定主從同步復制. slaveof.ip, slaveof.port 表示, 本臺 SSDB 服務器將從這個目標機上同步數據(也即這個配置文件對應的服務器是 slave). 你可以參考 ssdb_slave.conf 的配制.
logger: 配置日志記錄. level 是日志的級別, 可以是 trace|debug|info|error. output 是日志文件的名字, SSDB 支持日志輪轉, 在日志文件達到一定大小后, 將 log.txt 改名, 然后創建一個新的 log.txt.
leveldb: 配置 LevelDB 的參數. 你一般想要修改的是 cache_size 參數, 用于指定緩存大小. 適當的緩存可以提高讀性能, 但是過大的緩存會影響寫性能.
另外注意cache_size、和write_buffer_size的配置的閾值以及占用內存的計算:
一個 ssdb-server 實例占用的內存瞬時(有可能, 而且即使達到, 也只是持續短時間)最高達到(MB):
cache_size + write_buffer_size * 66 + 32這是對于壓縮選項沒有開啟的情況, 如果 compression: yes, 計算公式是:
cache_size + 10 * write_buffer_size * 66 + 32你可以調整配置參數, 限制 ssdb-server 的內存占用.
LevelDB:
Log文件
當應用寫入一條Key:Value記錄的時候,LevelDb會先往log文件里寫入,成功后將記錄插進Memtable中,這樣基本就算完成了寫入操作,Log文件在系統中的作用主要是用于系統崩潰恢復而不丟失數據,假如沒有Log文件,因為寫入的記錄剛開始是保存在內存中的,此時如果系統崩潰,內存中的數據還沒有來得及Dump到磁盤,所以會丟失數據(Redis就存在這個問題)。?
因為一次寫入操作只涉及一次磁盤順序寫和一次內存寫入,所以這是為何說LevelDb寫入速度極快的主要原因。?
LevelDB首先將每條寫入數據序列化為一個Record,單個Log文件中包含多個Record。同時,Log文件又劃分為固定大小的Block單位,并保證Block的開始位置一定是一個新的Record。這種安排使得發生數據錯誤時,最多只需丟棄一個Block大小的內容。顯而易見地,不同的Record可能共存于一個Block,同時,一個Record也可能橫跨幾個Block。?
Log文件劃分為固定長度的Block,由連續的32K為單位的物理Block構成的,每次讀取的單位是以一個Block作為基本單位;每個Block中包含多個Record;Record的前56個位為Record頭,包括32位checksum用做校驗,16位存儲Record實際內容數據的長度,8位的Type可以是Full、First、Middle或Last中的一種,表示該Record是否完整的在當前的Block中,如果Type不是Full,則通過Type指明其前后的Block中是否有當前Record的前驅后繼。?
levelDb中的Cache
讀取操作如果沒有在內存的memtable中找到記錄,要多次進行磁盤訪問操作。假設最優情況,即第一次就在level 0中最新的文件中找到了這個key,那么也需要讀取2次磁盤,一次是將SSTable的文件中的index部分讀入內存,這樣根據這個index可以確定key是在哪個block中存儲;第二次是讀入這個block的內容,然后在內存中查找key對應的value。?
levelDb中引入了兩個不同的Cache: Table Cache 和 Block Cache。其中Block Cache是配置可選的,即在配置文件中指定是否打開這個功能。
compression壓縮操作
為了加快讀取速度,levelDb采取了compaction的方式來對已有的記錄進行整理壓縮,通過這種方式,來刪除掉一些不再有效的KV數據,減小數據規模,減少文件數量等。?
數據壓縮是LevelDB中重要的部分,即上文提到的歸并。冷數據會隨著Compaction不斷的下移,同時過期的數據也會在合并過程中被刪除。?
LevelDB的壓縮操作由單獨的后臺線程負責。這里的Compaction包括兩個部分,Memtable向Level 0 SST文件的Compaction,以及SST文件向下層的Compaction。?
levelDb的compaction機制和過程與Bigtable所講述的是基本一致的,Bigtable中講到三種類型的compaction: minor ,major和full。所謂minor Compaction,就是把memtable中的數據導出到SSTable文件中;major compaction就是合并不同層級的SSTable文件,而full compaction就是將所有SSTable進行合并。?
LevelDb包含其中兩種,minor和major。
?
轉載:http://www.ideawu.net/blog/archives/733.html
轉載:https://www.cnblogs.com/chenny7/p/4569837.html
levelDB原理:https://blog.csdn.net/qq_26499321/article/details/78063856#commentBox
總結
以上是生活随笔為你收集整理的SSDB 配置文件详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转载保存】java优先队列使用
- 下一篇: TimeUnit.SECONDS.sle