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