LoginSignup
2
1

More than 5 years have passed since last update.

MinecraftサーバーでMySQLを運用する時のベストプラクティス

Posted at

概要

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に以下のように書きます

.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の方が高速でデータ管理も行いやすいのでおすすめです。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1