概要
MinecraftサーバーでMySQLを運用するときは以下の点を考慮して行ったほうが良いです。
- マイグレーションツールを使って、データベースを定義する
- プラグインでデータベース定義に関わるクエリを実行しない
- DBパスワードなどは環境変数に書く
以下にそれぞれの理由を書いていきます。
マイグレーションツール
データベースではテーブルの定義、インデックスを貼るという作業が必要になります。
それらの作業を以下のようにして行うのは望ましくないです。
- サーバープラグインでCREATE TABLE等を実行する
- MySQLに直接ログインしてテーブルを作成する
一つ目の理由ですが、これは単純に変化に対応するのが大変だからです。
テーブルの作成、更新などを行うのは難しく、再現性がありません。
ある環境ではテーブルが作成されるけど、別の環境ではテーブルが作成できないというトラブルが発生します。
これらの問題は頑張れば解決できますが、得られるものは少ないと思います。
二つ目ですが、MySQLに直接ログインして操作するのは事故の原因になります。
間違えて名前の違うテーブルを作成して、削除するときに別のテーブルを削除してしまってデータが消えた。
というようなオペレーションミスが発生する確率が高いです。
これらの問題を解決してくれるのがマイグレーションツールです。
データベースの定義を補助してくれるツールです。
マイグレーションツールは色々なものがあるので、環境に合わせて選定してください。
http://qiita.com/narikei/items/8a71c5439edc9cb66550
筆者の環境 Rails
筆者の環境ではRailsのActiveRecordを使ってDBを管理しています。
選定理由として、Railsで管理画面を作る予定があったこと、筆者がRailsに慣れているためです。
マイグレーションファイルの作成はローカルで行い、サーバー上では
git pull
bin/rails db:migrate
でデータベースを更新しています。
DB定義はRailsで全て行うという方式にしています。
運用しているLinuxサーバーでは、RailsとMinecraftサーバーが入っています。
動かしているサーバーが、ローカルサーバー、devサーバー、prodサーバーがありますが、
このお陰で、全てのサーバーで同じデータベース環境を構築することができます。
プラグイン側では基本的にSELECT、UPDATE、INSERTしか行わないようになっています。
環境変数
プラグインにデータベースのパスワードなどを書かなければならない時があります。
host = "localhost"
port = 3306
database = "test"
username = "minecraft"
password = "password
Class.forName("com.mysql.jdbc.Driver")
connection = DriverManager.getConnection("jdbc:mysql://" + host + ":" + port + "/" + database, username, password)
こんなコードがあったとします。
データベースのパスワードをそのまま書いてしまっているのでセキュリティ的に問題あります。
gitやプラグインには含めたくないので環境変数として設定します。
~/.bash_profileに以下のように書きます
export DATABASE_HOST="localhost"
export DATABASE_PORT="3306"
export DATABASE_DATABASE="test"
export DATABASE_USER="minecraft"
export DATABASE_PASSWORD="password"
そしてコードを環境変数を参照するように変更します。
host = System.getenv("DATABASE_HOST")
port = Integer.parseInt(System.getenv("DATABASE_PORT"))
database = System.getenv("DATABASE_DATABASE")
username = System.getenv("DATABASE_USER")
password = System.getenv("DATABASE_PASSWORD")
Class.forName("com.mysql.jdbc.Driver")
connection = DriverManager.getConnection("jdbc:mysql://" + host + ":" + port + "/" + database, username, password)
このようにすることで、データベースの情報を秘匿することができます。
終わりに
開発中のサーバーでまだ本格始動はしていないですが、個人的に得られた知見をまとめてみました。
他に良い方法があれば教えていただけるとありがたいです。
Minecraftサーバーではymlファイルをデータベースとして使っているところが多いですが、
ちょっと敷居が高いかもしれないですが、MySQLの方が高速でデータ管理も行いやすいのでおすすめです。