High-Availability

SQLite 可以與 GlusterFS 一起使用嗎?

  • September 11, 2011

我想建構一個基於 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 的內部鎖定不夠可靠。

引用自:https://serverfault.com/questions/62609