注:memcached可能簡稱mc,memcachedb可能簡稱mcdb
一、memcachedb是什么
mcdb是一款分布式鍵值持久存儲系統,由新浪開源。mcdb基于mc協議,所以可以使用mc客戶端直接使用,存儲引擎方面使用Berkeley DB,支持主從復制模式。
二、memcachedb的應用場景
首先,我們從基本的數據存儲的角度看mysql、memcached、memcachedb的區別和特點,當然它們肯定不只這點區別。
mc因為是非持久存儲的,所以它的定位就是緩存。
而mcdb不是用來做緩存的,它是和mysql同個層次的東西。不一樣的是,mcdb性能要比mysql高,而mysql檢索功能比mcdb強。如果非要從緩存的角度看的話,那mc就是緩解mysql讀壓力,而mcdb則是緩解mysql寫壓力。
mcdb適合應用的場景:
1.瀏覽/點擊/等統計,也可以局部代替mysql的count函數
2.標志,例如,JE的“我在干什么”功能
3.頻繁寫的地方,訪客列表、評論之類的
之前,我寫過的feed設計最大特點是使用mcdb來分散寫壓力,對sns來說動態產生太頻繁了,全部寫進mysql壓力太大了,畢竟讀/寫1K和100K性能不是一樣的,一臺mcdb和一臺mysql的成本不一樣啊。。
雖然mcdb的方式比較簡單,但是應用場合還是很豐富的,使用新產品要發散思維,充分發揮想象力~
不過重要的數據還是不建議使用,感覺還不是很放心。
三、安裝
安裝MemcacheDB之前需要安裝Libevent和Berkeley Db
1.先安裝libevent
下載地址: http://www.monkey.org/~provos/libevent/
tar zxvf libevent- 1.4 . 9 -stable.tar.gz
cd libevent-1.4 . 9 -stable
./configure
make
make install
tar zxvf libevent-1.4.9-stable.tar.gz
cd libevent-1.4.9-stable
./configure
make
make install
2.安裝Berkeley Db
下載地址:http://www.oracle.com/technology/software/products/berkeley-db/index.html
tar xvzf db-4.7.25 .tar.gz
cd db-4.7 . 25 /
cd build_unix/
../dist/configure
make
make install
tar xvzf db-4.7.25.tar.gz
cd db-4.7.25/
cd build_unix/
../dist/configure
make
make install
安裝完后,編輯/etc/ld.so.conf把
usr/local/lib
/usr/local/BerkeleyDB.4.7 /lib
usr/local/lib
/usr/local/BerkeleyDB.4.7/lib
3.安裝memcachedb
下載地址:http://code.google.com/p/memcachedb/downloads/list
tar xvzf memcachedb-1.2 . 0 .tar.gz
cd memcachedb-X.Y.Z
./configure --enable-threads
make
make install
tar xvzf memcachedb-1.2.0.tar.gz
cd memcachedb-X.Y.Z
./configure --enable-threads
make
make install
4.創建數據保存點
mkdir /data/ 21201 -p
chown -R willko:wheel
mkdir /data/21201 -p
chown -R willko:wheel
四、使用
1.單機模式
memcachedb -u willko -p 21201 -d -r -H /data/ 21201 / -v >/data/ 21201 .log 2 >& 1
memcachedb -u willko -p 21201 -d -r -H /data/21201/ -v >/data/21201.log 2>&1
2.主從模式
memcachedb -p 21210 -d -r -u willko -H /data/21210_m -N -R 127.0 . 0.1 : 31210 -M
主服務器,用31210 來同步數據
memcachedb -p 21211 -d -r -u willko -H /data/21211_from_local_21210 -N -R 127.0 . 0.1 : 31211 -O 127.0 . 0.1 : 31210 -S
從服務器,主從模式-R是必須設置的。
memcachedb -p 21210 -d -r -u willko -H /data/21210_m -N -R 127.0.0.1:31210 -M
主服務器,用31210來同步數據
memcachedb -p 21211 -d -r -u willko -H /data/21211_from_local_21210 -N -R 127.0.0.1:31211 -O 127.0.0.1:31210 -S
從服務器,主從模式-R是必須設置的。
測試是否同步
[root @srv willko]# telnet 127.0 . 0.1 21210
Trying 127.0 . 0.1 ...
Connected to 127.0 . 0.1 .
Escape character is '^]' .
set yy 0 0 4
yyyy
STORED
get yy
VALUE yy 0 4
yyyy
END
[root@srv willko]# telnet 127.0.0.1 21210
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
set yy 0 0 4
yyyy
STORED
get yy
VALUE yy 0 4
yyyy
END
Java代碼
[root @srv willko]# telnet 127.0 . 0.1 21211
Trying 127.0 . 0.1 ...
Connected to 127.0 . 0.1 .
Escape character is '^]' .
get yy
VALUE yy 0 4
yyyy
END
[root@srv willko]# telnet 127.0.0.1 21211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
get yy
VALUE yy 0 4
yyyy
END
3.FYI:參數說明
Java代碼
memcachedb 1.2 . 0
-p <num> TCP監聽端口,默認是 21201
-U <num> UDP監聽端口,默認是 0 ,也就是關閉。
-s <file> 使用socket通訊,參數是設置unix socket的路徑,此通訊方式只能本地使用
-a <mask> unix socket文件的權限,默認是 0700
-l <ip_addr> 監聽地址,默認是 INDRR_ANY
-d 以守護進程方式運行
-r maximize core file limit
-u <username> 以<username>啟動,只有root才能使用,因為memcachedb不允許以root啟動
-c <num> max simultaneous connections, default is 1024
-b <num> item size smaller than <num> will use fast memory alloc, default is 512B
-v 打印錯誤和警告信息
-vv 打印整個交互過程
-h print this help and exit
-i print license info
-P <file> 進程PID保存路徑,只能在守護進程方式下使用
-t <num> 線程數,默認是4
--------------------BerkeleyDB Options-------------------------------
-m <num> in-memmory cache size of BerkeleyDB in megabytes, default is 64MB
-A <num> underlying page size in bytes, default is 4096 , (512B ~ 64KB, power-of-two)
-f <file> 數據文件名, 默認是 'data.db'
-H <dir> 數據保存目錄,默認是 '/data1/memcachedb'
-B <db_type> 數據結構類型,有 'btree' 和 'hash' 兩種. 默認是 'btree'
-L <num> log buffer size in kbytes, default is 32KB
-C <num> 每隔多少秒checkpoint, 設置為0 將實時寫入硬盤, 默認是 5 分鐘
-T <num> do memp_trickle every <num> seconds, 0 for disable, default is 30 seconds
-e <num> percent of the pages in the cache that should be clean, default is 60 %
-D <num> do deadlock detecting every <num> millisecond, 0 for disable, default is 100ms
-N 設置 DB_TXN_NOSYNC 標志來改善性能,但是犧牲事務的持久性。默認為 關閉
--------------------Replication Options-------------------------------
-R 主服務器提供同步數據的地址和端口,主從模式必須設置
-O 從服務器同步源地址和端口
-M/-S 以主或從服務器啟動
-n 允許從服務器數量, 默認是2 臺
-----------------------------------------------------------------------
memcachedb 1.2.0
-p <num> TCP監聽端口,默認是 21201
-U <num> UDP監聽端口,默認是 0,也就是關閉。
-s <file> 使用socket通訊,參數是設置unix socket的路徑,此通訊方式只能本地使用
-a <mask> unix socket文件的權限,默認是 0700
-l <ip_addr> 監聽地址,默認是 INDRR_ANY
-d 以守護進程方式運行
-r maximize core file limit
-u <username> 以<username>啟動,只有root才能使用,因為memcachedb不允許以root啟動
-c <num> max simultaneous connections, default is 1024
-b <num> item size smaller than <num> will use fast memory alloc, default is 512B
-v 打印錯誤和警告信息
-vv 打印整個交互過程
-h print this help and exit
-i print license info
-P <file> 進程PID保存路徑,只能在守護進程方式下使用
-t <num> 線程數,默認是4
--------------------BerkeleyDB Options-------------------------------
-m <num> in-memmory cache size of BerkeleyDB in megabytes, default is 64MB
-A <num> underlying page size in bytes, default is 4096, (512B ~ 64KB, power-of-two)
-f <file> 數據文件名, 默認是 'data.db'
-H <dir> 數據保存目錄,默認是 '/data1/memcachedb'
-B <db_type> 數據結構類型,有 'btree' 和 'hash'兩種. 默認是 'btree'
-L <num> log buffer size in kbytes, default is 32KB
-C <num> 每隔多少秒checkpoint, 設置為0將實時寫入硬盤, 默認是5分鐘
-T <num> do memp_trickle every <num> seconds, 0 for disable, default is 30 seconds
-e <num> percent of the pages in the cache that should be clean, default is 60%
-D <num> do deadlock detecting every <num> millisecond, 0 for disable, default is 100ms
-N 設置 DB_TXN_NOSYNC 標志來改善性能,但是犧牲事務的持久性。默認為 關閉
--------------------Replication Options-------------------------------
-R 主服務器提供同步數據的地址和端口,主從模式必須設置
-O 從服務器同步源地址和端口
-M/-S 以主或從服務器啟動
-n 允許從服務器數量, 默認是2臺
-----------------------------------------------------------------------
關于-C和-N選項涉及到數據完整性,會在下面會說明一下
五、備份和恢復
1.熱備份
因為memcachedb是基于bdb的,所以可以用bdb自帶的熱備份工具備份
Java代碼
[root @srv willko]# /usr/local/BerkeleyDB. 4.7 /bin/db_hotbackup -h /data/ 21201 / -b ./bak/
-h是數據的目錄
-b是備份的目錄
[root@srv willko]# /usr/local/BerkeleyDB.4.7/bin/db_hotbackup -h /data/21201/ -b ./bak/
-h是數據的目錄
-b是備份的目錄
恢復的話,啟動memcacedb的數據目錄設置成備份目錄就可以了
2.單機模式crash恢復
bdb的事務處理和很多事物引擎相似,都是先寫日志,數據先保存在內存。所以crash以后,可以通過日志來恢復。啟動memcachedb的時候,可以使用-C選項來設置checkpoint的間隔時間,如果設置得太長,恢復時間越長。
/usr/local/BerkeleyDB. 4.7 /bin/db_recover -cf -h /data/ 21201 /
-h是你的數據目錄
/usr/local/BerkeleyDB.4.7/bin/db_recover -cf -h /data/21201/
-h是你的數據目錄
模擬crash
[root @srv willko]# memcachedb -u willko -p 21201 -d -r -H /data/ 21201 / -v >/data/ 21201 .log 2 >& 1 -P /data/ 21201 / 21201 .pid
[root@srv willko]# telnet localhost 21201
Trying 127.0 . 0.1 ...
Connected to localhost.
Escape character is '^]' .
set t 0 0 4
hhhh #設置鍵為t,值為hhhh的
STORED
get t
VALUE t 0 4
hhhh
END
quit
Connection closed by foreign host.
[root@srv willko]# kill - 9 `cat /data/ 21201 / 21201 .pid ` #用- 9 來模擬crash
[root@srv willko]# /usr/local/BerkeleyDB. 4.7 /bin/db_recover -cf -h /data/ 21201 /
recovery 100 % complete
[root@srv willko]# memcachedb -u willko -p 21201 -d -r -H /data/ 21201 / -v >/data/ 21201 .log 2 >& 1 -P /data/ 21201 / 21201 .pid
[root@srv willko]# telnet localhost 21201
Trying 127.0 . 0.1 ...
Connected to localhost.
Escape character is '^]' .
get t
VALUE t 0 4
hhhh #還可以獲得crash前設置的值
END
quit
Connection closed by foreign host.
[root@srv willko]#
[root@srv willko]# memcachedb -u willko -p 21201 -d -r -H /data/21201/ -v >/data/21201.log 2>&1 -P /data/21201/21201.pid
[root@srv willko]# telnet localhost 21201
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
set t 0 0 4
hhhh #設置鍵為t,值為hhhh的
STORED
get t
VALUE t 0 4
hhhh
END
quit
Connection closed by foreign host.
[root@srv willko]# kill -9 `cat /data/21201/21201.pid ` #用-9來模擬crash
[root@srv willko]# /usr/local/BerkeleyDB.4.7/bin/db_recover -cf -h /data/21201/
recovery 100% complete
[root@srv willko]# memcachedb -u willko -p 21201 -d -r -H /data/21201/ -v >/data/21201.log 2>&1 -P /data/21201/21201.pid
[root@srv willko]# telnet localhost 21201
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
get t
VALUE t 0 4
hhhh #還可以獲得crash前設置的值
END
quit
Connection closed by foreign host.
[root@srv willko]#
3.主從模式的crash恢復
主從模式下可以考慮啟用-N選項來提高性能,如果不是用-N,日志是實時寫到硬盤,這也是為什么crash以后可以通過日志恢復的原因。
但是如果使用-N來提高性能是有代價的,也就是日志不實時寫硬盤,那crash以后無法保證完全恢復,沒寫入硬盤的數據無法通過日志恢復。但是如果你做了主從模式,那就無需擔心,因為當事務提交以后,會馬上同步到slave。
也就是說使用-N選項后,crash后通過slave來恢復。
六、一點抱怨
目前,持久存儲系統產品非常的多,我覺得未來的持久存儲肯定不只提供hash table存儲,還應該把加入list、tree等的支持。這些都可以擴大持久存儲系統的應用場景,未來持久存儲系統成熟的時候,將會大規模代替RMDB。
最近,有個亮點產品出現,叫redis,目前還只是beta。
參考資料:
http://memcachedb.org/
http://memcachedb.org/memcachedb-guide-1.0.pdf
新聞熱點
疑難解答