最近ゲームサーバーのランキングデータを、
簡単に扱えるSQLite3を使って運用した際に、びっくりした挙動もメモ。
即席で作ったのでベタソース2枚のみw
構成
- SQLite3のsqlite3ファイルをマスター用とスレーブ(読み取り専用)用の2つ用意し、
- Redisをキャッシュ&集計処理用として利用をしていて。
下記のようなアクセスが秒間で数十あり。
// redisから現在のスコア取得
$currentScore = $redis->hGet('score', $_user);
// SQliteで現在順位を取得
$pdo = new PDO('sqlite:db.sqlite3', "", "");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare("SELECT * FROM rankTable order by abs( ? - score) limit 1");
$stmt->execute([$currentScore]);
$searchRank = $stmt->fetch();
毎回ソートとする集計はさすがに重いので、
下記のようなバッチソースをcronで一定間隔で集計。
// sqlite3ファイル上書きコピー
if( copy($MasterDbFile, $ReadDbFile) ){
echo "db 上書きOK";
}else{
alertPush("sqlitecopy エラー");
}
このsqlite3ファイル、、毎回copyで上書きしている、、、!!!!
なのに、ReadDbFileのsqlite3ファイルへの接続は、、、
なんと生きているんす、、!!!
普通にselectで検索できちゃってます。。!
コピー中にアクセスしてもエラーにならない、、ロック処理みたいのがはたらいるのかな。。特に意識せずにやってけど、、
実際数十万のスコアデータランキングを格安(月額1000円未満の1台)サーバーでやって一度もエラーになっていませんでした(今のところ)wすごい