High-Availability
SQLite 可以與 GlusterFS 一起使用嗎?
我想建構一個基於 GlusterFS 和自動文件複製 (AFR) 的分佈式儲存,以容錯的方式儲存使用者文件。
但我也想從多個客戶端訪問儲存在 GlusterFS 卷上的 SQLite3 數據庫(並因此復製到多個伺服器上)。可能嗎?多個客戶端之間的並發是否會得到很好的處理,不會導致腐敗?
或者是否有更好的替代 GlusterFS 來分發 SQLite3 數據庫?
GlusterFS 即使在複製模式下也支持完整的 POSIX 文件/記錄級別鎖定。它應該可以正常工作。
我寫了一個sqlite_shared_fs_check.sh腳本來模擬對 sqlite3 數據庫的許多讀寫。它應該在多台客戶端機器上的同一個 GlusterFS 目錄中執行。
我測試了以下配置:
- GlusterFS 3.2 和 sqlite3 3.5.9 (ubuntu 8.10)。數據庫沒有損壞。
- GlusterFS 3.2 和 sqlite3 3.6.22-1 (ubuntu 10.04)。待定。
- Ext3 和 sqlite3 3.5.9 (ubuntu 8.10):測試同時從兩個終端視窗執行。測試結束,沒有任何問題。
最後一次測試(ext3+sqlite3)的結果將 POSIX 鎖定不一致性歸咎於 GlusterFS 3.2。
這是我用來進行測試的腳本:
#!/bin/bash function ErrorExit() { echo Error: $@ exit 1 } # Microseconds timeout=5000 if [ ! -f test.sqlite3 ]; then touch test.sqlite3 echo 'create table test1 (id integer primary key autoincrement,datetime text,hostname text);' | sqlite3 test.sqlite3 || ErrorExit "Create" fi if [ ! -f /tmp/insert.sql ]; then echo .timeout $timeout > /tmp/insert.sql echo "insert into test1 values (NULL,datetime('now','localtime'),'$HOSTNAME');" >> /tmp/insert.sql fi if [ ! -f select.sql ]; then echo .timeout $timeout > select.sql echo "select * from test1 order by id desc limit 1;" >> select.sql fi if [ ! -f count.sql ]; then echo .timeout $timeout > count.sql echo "select count(*) from test1;" >> count.sql fi i=1 while [ $i -le 1000 ]; do lockfile-create --retry 20 test.sqlite3 || echo -n "?" sqlite3 test.sqlite3 < /tmp/insert.sql lockfile-remove test.sqlite3 # Sleep a bit to allow other users sleep 0.5 lockfile-create --retry 20 test.sqlite3 || echo -n "?" sqlite3 test.sqlite3 < select.sql >/dev/null || ErrorExit select [$i] sqlite3 test.sqlite3 < count.sql >/dev/null || ErrorExit count [$i] lockfile-remove test.sqlite3 let i++ echo -n "." done
請注意,我必須使用 lockfile-create 實用程序來獲取數據庫上的鎖定,因為 sqlite 的內部鎖定不夠可靠。