ssdb簡(jiǎn)單介紹
ssdb介紹
ssdb是一款類似于redis的nosql數(shù)據(jù)庫(kù),不過redis是基于內(nèi)存的,服務(wù)器比較昂貴,ssdb則是基于硬盤存儲(chǔ)的,很容易擴(kuò)展,對(duì)于一些對(duì)速度要求不是太高的應(yīng)用,還是不錯(cuò)的選擇。
SSDB是一套基于LevelDB存儲(chǔ)引擎的非關(guān)系型數(shù)據(jù)庫(kù)(NOSQL),可用于取代Redis,更適合海量數(shù)據(jù)的存儲(chǔ)。
另外,rocksdb是FB在LevelDB的二次開發(fā)版本,因此也存在使用RocksDB作為存儲(chǔ)引擎的SSDB版本,可以參考這里。
先記錄一個(gè)比較坑的東西,具體的用法以后補(bǔ)充。
ssdb刪除數(shù)據(jù)的時(shí)候有很多中方法:
flushdb 刪除整個(gè)數(shù)據(jù)庫(kù)中的所有數(shù)據(jù)
qclear 刪除列表類型的數(shù)據(jù)
hclear 刪除hash類型的數(shù)據(jù)
zclear 刪除有序集合類型的梳理
del 刪除字符串類型的數(shù)據(jù)
不過,ssdb在刪除數(shù)據(jù)的時(shí)候并不會(huì)立刻釋放磁盤的空間,用作者的話說(shuō)就是ssdb會(huì)在合適的時(shí)候去釋放,這就會(huì)造成不知不覺中ssdb占用的磁盤空間越來(lái)越大,還不知道什么時(shí)候才會(huì)被釋放,如果不及時(shí)處理的話,服務(wù)器卡死是很正常的事情,經(jīng)過不斷的尋找,終于被我發(fā)現(xiàn)了一個(gè)命令 compact , 這個(gè)命令會(huì)自動(dòng)去釋放應(yīng)該被釋放的磁盤空間,不過在使用的時(shí)候會(huì)造成ssdb卡慢,并且 compact 命令的執(zhí)行速度也不快,但總算是可以立刻釋放了,不用再擔(dān)心服務(wù)器被撐爆。
需要注意的是如果服務(wù)器已經(jīng)快被撐爆了,那么你在執(zhí)行 compact 的時(shí)候ssdb是有可能崩潰的,而且執(zhí)行一次 compact 并不會(huì)釋放所有應(yīng)該釋放的空間,可能需要多次執(zhí)行才行。
還有一個(gè)比較坑的東西就是在刪除數(shù)據(jù)的時(shí)候,會(huì)造成服務(wù)阻塞,其他任何寫命令都執(zhí)行不了,可讀不可寫。。。而且刪除的超級(jí)慢。。。
安裝,啟動(dòng)
編譯和安裝
wget --no-check-certificate https://github.com/ideawu/ssdb/archive/master.zip unzip master cd ssdb-master make # 將安裝在 /usr/local/ssdb 目錄下 sudo make install
啟動(dòng)服務(wù)
# 啟動(dòng)主庫(kù) ./ssdb-server ssdb.conf # 或者啟動(dòng)為后臺(tái)進(jìn)程 ./ssdb-server -d ssdb.conf # 啟動(dòng) ssdb 命令行客戶端 ./tools/ssdb-cli -p 8888 # 停止 ssdb-server ./ssdb-server ssdb.conf -s stop # 對(duì)于舊版本 kill `cat ./var/ssdb.pid`
配置文件
ssdb.conf:
work_dir = ./var pidfile = ./var/ssdb.pid server: ip: 127.0.0.1 port: 8888 # bind to public ip #ip: 0.0.0.0 # format: allow|deny: all|ip_prefix # multiple allows or denys is supported #deny: all #allow: 127.0.0.1 #allow: 192.168 # auth password must be at least 32 characters #auth: very-strong-password replication: binlog: yes # Limit sync speed to *MB/s, -1: no limit sync_speed: -1 slaveof: # to identify a master even if it moved(ip, port changed) # if set to empty or not defined, ip:port will be used. #id: svc_2 # sync|mirror, default is sync #type: sync #ip: 127.0.0.1 #port: 8889 logger: level: debug # 支持的日志級(jí)別有: debug, warn, error, fatal . output: log.txt rotate: size: 1000000000 leveldb: # in MB cache_size: 500 # in KB block_size: 32 # in MB write_buffer_size: 64 # in MB compaction_speed: 1000 # yes|no compression: yes
一個(gè) ssdb-server 實(shí)例占用的內(nèi)存瞬時(shí)(有可能, 而且即使達(dá)到, 也只是持續(xù)短時(shí)間)最高達(dá)到(MB):
cache_size + write_buffer_size * 66 + 32
這是對(duì)于壓縮選項(xiàng)沒有開啟的情況, 如果 compression: yes, 計(jì)算公式是:
cache_size + 10 * write_buffer_size * 66 + 32
你可以調(diào)整配置參數(shù), 限制 ssdb-server 的內(nèi)存占用.
SSDB命令
與Redis類似,SSDB也支持多種數(shù)據(jù)結(jié)構(gòu)(KV list, hash, soreted set),下面列出了常用命令:
dbsize # 返回?cái)?shù)據(jù)庫(kù)占用空間,以字節(jié)為單位
flushdb # 清空數(shù)據(jù)庫(kù)
info # 返回服務(wù)器信息
auth password # 驗(yàn)證訪問密碼
結(jié)構(gòu)
KV結(jié)構(gòu)
set key value
setx key value ttl # 設(shè)置key的同時(shí)設(shè)置ttl
setnx key value # 若key已存在,則不設(shè)置
multi_set key1 value1 key2 value2 ...
exists key
get key
getset key value # 更新key,并返回舊value
multi_get key1 key2 ...
keys key_start key_end limit # 返回指定范圍內(nèi)的key,左開右閉區(qū)間(SSDB的key有序存儲(chǔ))
rkeys key_start key_end limit
scan key_start key_end limit
rscan key_start key_end limit
expire key ttl
ttl key
del key
multi_del key1 key2 ...
substr key start size # 返回子串
strlen key
incr key [num]
getbit key offset
setbit key offset val
bitcount key [start] [end]
countbit key start size
hashmap結(jié)構(gòu)
hset name key value
multi_hset name key1 value1 key2 value2 ...
hget name key
multi_hget name key1 key2 ...
hgetall name
hkeys name key_start key_end
hscan key_start key_end limit
hrscan key_start key_end limit
hdel name key # 刪除一個(gè)字段
hclear name # 刪除所有字符
multi_hdel name key1 key2 ...
hexists name key
hsize name
hincr name key [num]
hlist name_start name_end limit # 列出指定范圍的所有hash表
hrlist name_start name_end limit
list結(jié)構(gòu)
qpush_front name item1 item2 ... # 往隊(duì)頭插入新元素
qpush_back name item1 item2 ... # 往隊(duì)尾插入新元素
qpop_front name size # 從隊(duì)頭彈出若干個(gè)元素
qpop_back name size # 從隊(duì)尾彈出若干個(gè)元素
qtrim_front name size # 從隊(duì)頭移除多個(gè)元素
qtrim_back name size # 從隊(duì)尾移除多個(gè)元素
qfront name # 返回隊(duì)頭
qback name # 返回隊(duì)尾
qsize name # 返回隊(duì)長(zhǎng)
qget name index # 返回指定位置元素
qset name index val
qrange name offset limit # 返回一個(gè)切片
qslice name begine end # 返回一個(gè)切片
qclear name
qlist name_start name_end limit
qrlist name_start name_end limit
sorted set結(jié)構(gòu)
zset name key socre
zget name key
zdel name key
zexists name key
zsize name
zincr name key num
導(dǎo)出/導(dǎo)入
SSDB才有LSM模型,也就是說(shuō)它的key是有序存儲(chǔ)的,因此,我們可以導(dǎo)出所有key的數(shù)據(jù),也可以導(dǎo)出指定范圍內(nèi)key的數(shù)據(jù)。
1、使用ssdb-cli 命令行客戶端
導(dǎo)出整個(gè)數(shù)據(jù)庫(kù):
# backup current database into file backup.ssdb ssdb 127.0.0.1:8888> export backup.ssdb
按照 Key 區(qū)間導(dǎo)出數(shù)據(jù)庫(kù)(交互模式)
ssdb 127.0.0.1:8888> export -i backup.ssdb input KV range[start, end]: start(inclusive, default none): a end(inclusive, default none): z input HASH range: start(inclusive, default none): end(inclusive, default none): input ZSET range: start(inclusive, default none): end(inclusive, default none): input QUEUE range: start(inclusive, default none): end(inclusive, default none):
命令 export -i backup.ssdb 將導(dǎo)出區(qū)間 [a, z] 內(nèi)的 KV, 所有的 HASH, ZSET, QUEUE.
導(dǎo)入命令:
# import backup.ssdb into current database ssdb 127.0.0.1:8888> import backup.ssdb
import 命令會(huì)把數(shù)據(jù)庫(kù)中的相同 key 給替換。
2、SSDB 另一個(gè)專門用于導(dǎo)出工具是 ssdb-dump,用法如下:
./tools/ssdb-dump ip port output_folder
目錄 output_folder 必須不存在, 因?yàn)?ssdb-dump 會(huì)創(chuàng)建這個(gè)目錄. 導(dǎo)出之后, 這個(gè)目錄里將有兩個(gè)子目錄, data 目錄里包含著數(shù)據(jù), 還有一個(gè)空的 meta 目錄.
如果想從導(dǎo)出的目錄恢復(fù)數(shù)據(jù),可以將 output_folder 目錄拷貝到你的服務(wù)器上面,然后修改你的 ssdb.conf 配置文件, 將 work_dir 指向 output_folder 目錄, 然后重啟 ssdb-server。
限制
最大 Key 長(zhǎng)度 200 字節(jié)
最大 Value 長(zhǎng)度 31MB
最大請(qǐng)求或響應(yīng)長(zhǎng)度 31MB
單個(gè) HASH 中的元素?cái)?shù)量 9,223,372,036,854,775,807
單個(gè) ZSET 中的元素?cái)?shù)量 9,223,372,036,854,775,807
單個(gè) QUEUE 中的元素?cái)?shù)量 9,223,372,036,854,775,807
命令最多參數(shù)個(gè)數(shù) 所有參數(shù)加起來(lái)體積不超過 31MB 大小
Replication
Redis的主從復(fù)制在主庫(kù)掛了的時(shí)候就無(wú)法再寫入數(shù)據(jù)了,而SSDB不但支持主-從結(jié)構(gòu),還支持多主結(jié)構(gòu)。
主-從配置
#server1:
replication: slaveof:
#server2:
replication: slaveof: id: svc_1 # sync|mirror, default is sync type: sync ip: 127.0.0.1 port: 8888
主-主配置
#server1:
replication: slaveof: id: svc_2 # sync|mirror, default is sync type: mirror ip: 127.0.0.1 port: 8889
#server2:
replication: slaveof: id: svc_1 # sync|mirror, default is sync type: mirror ip: 127.0.0.1 port: 8888
多主配置
在一組一共包含 n 個(gè)實(shí)例的 SSDB 實(shí)例群中, 每一個(gè)實(shí)例必須 slaveof 其余的 n-1 個(gè)實(shí)例.
replication: slaveof: id: svc_1 # sync|mirror, default is sync type: mirror ip: 127.0.0.1 port: 8888 slaveof: id: svc_2 # sync|mirror, default is sync type: mirror ip: 127.0.0.1 port: 8889 # ... more slaveof
監(jiān)控
info命令可以返回SSDB服務(wù)狀態(tài):
ssdb 127.0.0.1:8899> info binlogs capacity : 10000000 min_seq : 1 max_seq : 74 replication client 127.0.0.1:55479 type : sync status : SYNC last_seq : 73 replication slaveof 127.0.0.1:8888 id : svc_2 type : sync status : SYNC last_seq : 73 copy_count : 0 sync_count : 44
binlogs,當(dāng)前實(shí)例的寫操作狀態(tài):
- capacity: binlog 隊(duì)列的最大長(zhǎng)度
- min_seq: 當(dāng)前隊(duì)列中的最小 binlog 序號(hào)
- max_seq: 當(dāng)前隊(duì)列中的最大 binlog 序號(hào)
replication,可以有多條 replication 記錄. 每一條表示一個(gè)連接進(jìn)來(lái)的 slave(client), 或者一個(gè)當(dāng)前服務(wù)器所連接的 master(slaveof).
- slaveof|client ip:port, 遠(yuǎn)端 master/slave 的 ip:port
- type: 類型, sync|mirror
- status: 當(dāng)前同步狀態(tài), DISCONNECTED|INIT|OUT_OF_SYNC|COPY|SYNC,見下面的解釋
- last_seq: 上一條發(fā)送或者收到的 binlog 的序號(hào)
- slaveof.id: master 的 id(這是從 slave's 角度來(lái)看的, 你永遠(yuǎn)不需要在 master 上配置它自己的 id)
- slaveof.copy_count: 在全量同步時(shí), 已經(jīng)復(fù)制的 key 的數(shù)量
- slaveof.sync_count: 發(fā)送或者收到的 binlog 的數(shù)量.
關(guān)于 status:
- DISCONNECTED: 與 master 斷開了連接, 一般是網(wǎng)絡(luò)中斷
- INIT: 初始化狀態(tài)
- OUT_OF_SYNC: 由于短時(shí)間內(nèi)在 master 有大量寫操作, 導(dǎo)致 binlog 隊(duì)列淘汰, slave 丟失同步點(diǎn), 只好重新復(fù)制全部的數(shù)據(jù)
- COPY: 正在復(fù)制基準(zhǔn)數(shù)據(jù)的過程中, 新的寫操作可能無(wú)法及時(shí)地同步
- SYNC: 同步狀態(tài)是健康的
判斷同步狀態(tài)
binlogs.max_seq 是指當(dāng)前實(shí)例上的最新一次的寫(寫/更新/刪除)操作的序號(hào);
replication.client.last_seq 是指已發(fā)送給 slave 的最新一條 binlog 的序號(hào);
所以, 如果你想判斷主從同步是否已經(jīng)同步到位(實(shí)時(shí)更新), 那么就判斷 binlogs.max_seq 和 replication.client.last_seq 是否相等。
SSDB協(xié)議
SSDB協(xié)議與Redis的文本協(xié)議也類似:
SSDB數(shù)據(jù)包的結(jié)構(gòu):
Packet := Block+ '\n' Block := Size '\n' Data '\n' Size := literal_integer Data := size_bytes_of_data
請(qǐng)求:
Request := Cmd Blocks* Cmd := Block
請(qǐng)求命令包括: get, set, del, ...
響應(yīng):
Response := Status Block* Status := Block
響應(yīng)狀態(tài)碼包括: ok, not_found, error, fail, client_error
示例:
用 telnet 或者 nc 命令連接到 SSDB 服務(wù)器, 然后輸入下面的代碼(用最后一行空行結(jié)束):
3 get 3 key
你將看到類似這樣的響應(yīng):
2 ok 3 val
SSDB 協(xié)議解析器的C實(shí)現(xiàn):
#include <stdlib.h> #include <string.h> int len = buffer->size(); char *ptr = buffer->data(); while(len > 0){ char *data = (char *)memchr(ptr, '\n', len); if(data == NULL){ break; } data += 1; int num = data - ptr; if(num == 1 || (num == 2 && ptr[0] == '\r')){ // Packet received. return OK; } // Size received int size = (int)strtol(ptr, NULL, 10); len -= num + size; ptr += num + size; if(len >= 1 && ptr[0] = '\n'){ len -= 1; ptr += 1; }else if(len >= 2 && ptr[0] == '\r' && ptr[1] == '\n'){ len -= 2; ptr += 2; }else{ break; } // Data received }
到此這篇關(guān)于ssdb簡(jiǎn)單介紹的文章就介紹到這了,更多相關(guān)ssdb介紹內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何使用navicat遠(yuǎn)程連接openGauss
公司要在openEuler系統(tǒng)中安裝openGauss數(shù)據(jù)庫(kù),經(jīng)過幾天的查資料,終于是安裝成功了,并且能在navicat中遠(yuǎn)程連接使用,本文給大家介紹如何使用navicat遠(yuǎn)程連接openGauss,感興趣的朋友跟隨小編一起看看吧2023-10-10數(shù)據(jù)庫(kù)連接池Druid與Hikari對(duì)比詳解
這篇文章主要為大家介紹了數(shù)據(jù)庫(kù)連接池Druid與Hikari對(duì)比詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02數(shù)據(jù)庫(kù)建立索引的一般依據(jù)小結(jié)
以下是一些普遍的建立索引時(shí)的判斷依據(jù)。一言以蔽之,索引的建立必須慎重,對(duì)每個(gè)索引的必要性都應(yīng)該經(jīng)過仔細(xì)分析,要有建立的依據(jù)2012-05-05sqlserver中drop、truncate和delete語(yǔ)句的用法
這篇文章主要介紹了sqlserver中drop、truncate和delete語(yǔ)句的用法,本文圖文并茂,內(nèi)容清晰,需要的朋友可以參考下2014-09-09ACCESS轉(zhuǎn)化成SQL2000需要注意的幾個(gè)問題小結(jié)
ACCESS轉(zhuǎn)化成SQL2000需要注意的幾個(gè)問題小結(jié)...2007-06-06