TroveをkiloでちゃんとDBaasとして利用する流れ
TroveをちゃんとDBaaSとして利用可能にするのは難しい。
ざっくり言うと、以下の2点が絡み合うためである。
- 起動に利用するイメージの準備
- Troveがイメージを起動の際に実施する操作への対応
ここでは幾つか注意点を纏めておく。
Troveが利用するイメージの準備
イメージの作成
trove-guestagentをまずインストールしておく必要がある。
ホストで動作させるtroveのバージョンと同一のバージョンのtrove-guestagentが動作するようにインストールしておく必要がある。
また、systemdなど自動起動するようにスクリプトも適宜配置しておく必要が
ある。
# systemd設定ファイルの例
[Unit]
Description=OpenStack Trove guestagent Service
After=syslog.target network.target
[Service]
Type=simple
User=trove
ExecStart=/usr/bin/trove-guestagent --config-file /usr/share/trove/trove-dist.conf --config-file /etc/trove/trove-guestagent.conf --config-file /etc/guest_info --config-file /etc/trove/conf.d/guest_info.conf --config-file /etc/trove/conf.d/trove-guestagent.conf
Restart=on-failure
[Install]
WantedBy=multi-user.target
また、DBのインストールと設定も適宜行なうと良い。
DBの設定などを考える場合に、以下の項目を考慮すると良い。
- DBごとにイメージを用意するのか
- DBをいつインストールするのか
- イメージに最初からインストール
- cloudinitでイメージ起動時にインストール
- trove-guestagentにインストールしてもらう
今回は必要になるDBサーバが全てインストールされているイメージを作
成し、cloudinitで少し設定の変更(hostの設定など)を実施するような運用に
した。
troveと連携するための設定
標準的な構成でインストールするだけでは、troveと上手く連携できない。
ここでは、自分がインストールした際に嵌ったDBとその対処方法について纏める。
なお、ここで示す設定は予めイメージ作成時に手動で実施しても良いし、cloudinitに実行してもらうことも可能だ。
troveが利用するcloudinitスクリプトは、/etc/trove/cloudini/の下に配置する必要がある。
起動するDBの名前に合わせて各DB名+cloudinitという名前のスクリプトが実行される。
mysqlの場合にはmysql.cloudinitといった具合だ。
mysqlのユーザ
troveのソースを読むと、自前でtrove用にos_admin
というユーザを作成しようとしているように見えるのだが
上手く動作してくれない……。結果troveと上手く連携できず動作できない。
これは自分の環境だけなのか不明であるが、Googleすると自前でos_admin
を追加するスクリプトを記述している例も見るので
自分で追加する対応で問題無いだろう。
mysql -uroot -e "CREATE USER 'os_admin'@'localhost'"
mysql -uroot -e "GRANT ALL PRIVILEGES ON *.* TO 'os_admin'@'localhost' WITH GRANT OPTION"
mysql -uroot -e "DELETE FROM mysql.user WHERE host != 'localhost'"
上記コマンドを実行しておくことで、Troveと上手く連携できるmysqlサーバとなる。
postgresqlの外部接続許可
標準的なパッケージではpostgresqlは外部から接続を許す設定になっていない。
このため、troveが外部から接続出来ないDBを起動することとなってしまうので
適宜許可を予め設定しておく必要がある。
mongodbの外部接続許可
mongodbもpostgresqlと同じく外部接続が標準では出来ないので設定を変更する必要がある。
イメージの登録
イメージの登録は、trove-manageコマンドで実施する。
http://docs.openstack.org/cli-reference/content/trove-manageclient_commands.html
trove-manage datastore_version_update
<datastore>
<version_name>
<manager>
<image_id>
<package_name>
<active>
というコマンドを実行することで登録できる。
例えば
trove-manage datastore_version_update
mysql
5.6
mysql
image-id
mysql-server-5.6
1
などとなる。
このコマンドの引数のうちversion_name
, manager
, image_id
, package_name
はとても厄介なので注意深く設定する必要がある。
version_name
version_nameはバージョンの名前を設定できる。文字列なので好きな名前を利用できそうに見えるがそうではない。
postgresqlは、ディレクトリ名にバージョン番号を利用する。例えば、postgresql9.4はDBの位置は/var/lib/postgresql/9.4/という風に。
troveはこのディレクトリの検索にversion_name
を利用する。このため、version_name
にpostresql-9.4などと指定すると
/var/lib/postgresql/postgresql-9.4/
がDBの格納ディレクトリだと認識し、各種操作が失敗してしまう。
manager
manager
は、troveが指定したdatastoreを操作するために利用するmanagerの名前である。
これは、以下の物が利用できる(はず)。なおmysql以外はexperimental扱いのようだ。
https://github.com/openstack/trove/tree/stable/kilo/trove/guestagent/datastore を参照して欲しい。
- mysql
- cassandra
- couchbase
- couchdb
- db2
- mongodb
- postgresql
- redis
- vertica
image_id & package_name
troveでは、DBのインスタンスの起動に合わせてDBを起動するが、この際にここで指定しているpackage_name
の名前の
パッケージがインストールされているかを確認する。
つまり、image_idのパッケージ管理システム上で利用できる名前でなければならない。
Redhat系ではredis-serverだが、Debian系ではredisなどパッケージ名が異なるものがあったりする。
このため、image_idのインスタンスの内部でインストールするパッケージの名前を事前に控えるなどして把握しておく必要がある。
もし、実際と名前が異なる場合に上手く動作しなくなってしまう。
まとめ
上記の事項に気をつけつつDBのイメージを作成すると、ちゃんとTroveでDBの
起動、停止などの管理ができるようになっているはずだ。