本稿では、ミランティス・OpenStackトレーニング部のインストラクターが、OpenStackに関する疑問について説明いたします。
今回は、「複数のOpenStackコンポーネントデータベースに最も適したデータベースは?同一ノード上にデプロイすべき?それとも別々のノードに分割したほうが良い?」という疑問に対する説明です。
OpenStackの各コンポーネントの多くは、ステートをSQLデータベース上に保持します。各コンポーネントは、独立して機能するように設計されています。そのため、OpenStackの各コンポーネントが利用するデータベースは、同一のデータベースサーバーを参照しなくてもよい設計になっています。
したがって、各コンポーネントは物理的に独立したデータベースを利用することもできますし、他のコンポーネントが既に利用しているデータベースを利用することもできます。このような様々な選択肢がある中、運用効率の視点から、同一データベースサーバー上にあるデータベースを共有して利用することをおすすめします。
その理由は次の通りです。通常、OpenStackコンポーネントは、単一のSQLデータベース上にそれぞれ状態を保持します。データベースへのアクセス時には、OpenStack共有ライブラリであるOsloを利用します。更にOsloライブラリは、Python SQLAlchemyライブラリを活用します。したがって、理論上はOpenStackは、SQLAlchemyライブラリが対応しているSQLデータベースであれば、あらゆるデータベースを利用することができます。
前述のとおり、OpenStackの各コンポーネントは独立して機能します。Neutronであれば、/etc/neutron/neutron.conf
, Novaであれば、/etc/nova/nova.conf
、というように各コンポーネント毎に設定ファイルがあります。データベースのロケーションは、これらの設定ファイル上に定義されます。
例えば、Novaの設定ファイルである nova.conf上には、データベースについて以下のように記述します。
[database]
connection = mysql+pymysql://user:nova@<ip-address-of-database>//nova?charset=utf8
続いて、Cinderの設定ファイル上のデータベースに関する記述例です。
[database]
connection = mysql+pymysql://user:cinder@<ip-address-of-database>//cinder?charset=utf8
上記の記述例でわかる通り、データベースはIPアドレスで識別されます。OpenStackの各コンポーネントは、それぞれ独立したデータベースを利用できるように設計されているため、異なるIPアドレスを指定することができます。たとえデータベースの種類が各コンポーネント毎に異なっていても稼働します。つまりNeutronではSQLite、NovaはMySQL、そしてCinderではPostgreSQLと、それぞれのコンポーネントが全く異なるデータベースを利用することも可能です。
しかし、実践的な見方をすると、単一のノードもしくはクラスター上のデータベースを各コンポーネントのデータベースとして利用する方が適している、と考えられます。運用管理上、データベースサーバー数がより少ない方が効率的に運用管理できるため、メリットがあります。データベースをクラスター構成として高可用性を実現すれば、単一サーバーで稼働させる場合よりも、より大きなメリットが得られます。
OpenStackのデプロイメントツールで最も利用されているデータベースは、MySQL/MariaDBです。OpenStackデプロイメントツールは、通常3サーバーから構成されるデータベースクラスターをインストールします。その上で、クラスターをHA化するためのコンポーネントとして、Galeraを活用します。Galeraは、MySQL/MariaDBクラスター上でデータベースの同期をとるためのツールです。
場合によっては、データベースクラスターへアクセスするには、単一のIPアドレスを設定する必要もあるでしょう。その場合には、Pacemaker/Corosyncをはじめとする他のツールを使って、バーチャルIPアドレス(VIP)を設定します。OpenStack各コンポーネントは、バーチャルIPアドレスを介してデータベースにアクセスし、VIPの背後にある複数のデータベースのうちの一つにデータを保存します。すると、保存されたデータは、Galeraによって他のデータベースサーバーにコピーされます。
運用管理者は、すべてのOpenStack環境をこのような構成にする必要はありません。OpenStackは柔軟性を確保するためにモジュラー構成となっています。したがって、それぞれの環境に応じたアーキテクチャーをとることができます。しかし、今日現在、高可用性を備えた単一データベースサーバーもしくは単一データベースサーバークラスターを構築してOpenStackの各コンポーネントで共有する方が、最も安定していて、かつ運用管理も容易なアーキテクチャであるといえます。
(引用元:Todd Bowman (2016) "Mirantis Training Blog: What's the best architecture for multiple OpenStack component databases?" https://www.mirantis.com/blog/mirantis-training-blog-whats-the-best-architecture-for-multiple-openstack-component-databases/ )