このエントリーをはてなブックマークに追加

1.16. OpenStackを冗長化するには?

1.16.1. 概要

OpenStackのコンポーネントのHigh Availavility化を行います。
RabbitMQはOpenStackのドキュメントではPacmakerを利用して冗長化しているのですが行った環境ではどうしても切り替えがうまく行かない場合があったのでRabbitMQ自体でクラスタを行うようにしました。
また、これだけでは足りないところがあるので注意してください。
Glanceが利用する /var/lib/glance/images/
Cinderが利用する /var/lib/cinder/volumes
上記に関してはここで使っているDRBDを追加で設定するとかGlusterFSやNFSなど何らかの方法で冗長化しておく必要があります。
OSはUbuntu13.04を想定していますがパッケージのインストール方法などが多少違うだけでRedHat系でもほとんど同じでしょう。
注意点としてはソースからインストールした場合のパスはPacemakerのOCFだとコマンドが叩けないみたいなのでリンクを貼っておく必要がありますというくらいです。
また、HAを利用する場合はパッケージでOpenStackをインストールしたほうが無難です。
環境としては、既に二台のコントローラーノードがある状態の想定で設定していきます。
しかし非常に面倒なのでそのうちAnsibleなどを使ってデプロイ出来るようにしたいです。
冗長化を実現するために利用するソフトウェアはPacemakerとDRBDです。まあお馴染みのものです。
DRBDで利用するディスクはファイルシステムに作ったディスクイメージで行なっていますので本番環境とかでは違うと思いますがそんなに変わらないかと。
OpenStackの冗長化対象コンポーネントはKeystone、Glance、Cinderです。
Novaに関してはデータベース、RPCを冗長化しますので結果的に冗長化されることになります。(nova.confの設定は必須)
コンピュートノードに関してはベアメタルは別として仮想マシンが対象になると思いますので考え方にもよるでしょうけどHA化は必要ないのではないでしょうか。スナップショットなどを取っておけば瞬間の状態は無理ですが復元は可能ですので。
Quantumは利用していない環境で行いました。リソースの追加を行うくらいで特に変わらないと思います。
また、 <公式ドキュメント http://docs.openstack.org/trunk/openstack-ha/content/_installing_packages.html` をトレースしているだけですので分かる方は本家を見たほうが確実です。

1.16.2. Pacemakerのインストール

インストールはコントローラーノード全てで行います。
インストール自体どのようなサービスを冗長化するのかには関係なく同じ方法です。

1.16.2.1. パッケージをインストール

Ubuntuの場合は、RedHat系と違い標準リポジトリにあるもので問題ありません。
$ sudo apt-get install pacemaker corosync cluster-glue resource-agents -y

1.16.2.2. Corosyncの設定

Corosyncはノードの死活監視を行うソフトウェアです。
$ sudo cp -a /etc/corosync/corosync.conf /etc/corosync/corosync.conf_bak
$ sudo vi /etc/corosync/corosync.conf
tokenの数値はドキュメントと同じようにしました。
secauthは認証なしにしていました。必要な場合はonにして別途認証の設定を行なって下さい。
NICが複数ある場合は rrp_mode: none でなく rrp_mode: active として下さい。
bindnetaddr: 192.168.10.0 は、ハートビート通信を行うセグメントのネットワークを指定して下さい。
また、serviceの箇所のバージョンは ver:       1 としておかないとエラーが発生するみたいです。
# Please read the openais.conf.5 manual page

totem {
        version: 2

        # How long before declaring a token lost (ms)
        #token: 3000
        token: 10000

        # How many token retransmits before forming a new configuration
        token_retransmits_before_loss_const: 10

        # How long to wait for join messages in the membership protocol (ms)
        join: 60

        # How long to wait for consensus to be achieved before starting a new round of membership configuration (ms)
        consensus: 3600

        # Turn off the virtual synchrony filter
        vsftype: none

        # Number of messages that may be sent by one processor on receipt of the token
        max_messages: 20

        # Limit generated nodeids to 31-bits (positive signed integers)
        clear_node_high_bit: yes

        # Disable encryption
        secauth: off

        # How many threads to use for encryption/decryption
        threads: 0

        # Optionally assign a fixed node id (integer)
        # nodeid: 1234

        # This specifies the mode of redundant ring, which may be none, active, or passive.
        rrp_mode: none

        interface {
                # The following values need to be set based on your environment
                ringnumber: 0
                #bindnetaddr: 127.0.0.1
                bindnetaddr: 192.168.10.0
                mcastaddr: 226.94.1.1
                mcastport: 5405
        }
}

amf {
        mode: disabled
}

service {
        # Load the Pacemaker Cluster Resource Manager
        #ver:       0
        ver:       1
        name:      pacemaker
}

aisexec {
        user:   root
        group:  root
}

logging {
        fileline: off
        to_stderr: yes
        to_logfile: no
        to_syslog: yes
        syslog_facility: daemon
        debug: off
        timestamp: on
        logger_subsys {
                subsys: AMF
                debug: off
                tags: enter|leave|trace1|trace2|trace3|trace4|trace6
        }
}

起動時にCorosyncを起動する設定を行います。

$ vi /etc/default/corosync

noをyesに変更します。

#START=no
START=yes

全ノードでCorosyncを起動します。

$ sudo service corosync start

状態を確認します。

$ sudo corosync-cfgtool -s
Printing ring status.
Local node ID 839559360
RING ID 0
        id      = 192.168.10.50
        status  = ring 0 active with no faults

セグメント内のノードを確認します。

$ sudo corosync-objctl runtime.totem.pg.mrp.srp.members

設定したノード全てが見えることを確認します。

runtime.totem.pg.mrp.srp.839559360.ip=r(0) ip(192.168.10.50)
runtime.totem.pg.mrp.srp.839559360.join_count=1
runtime.totem.pg.mrp.srp.839559360.status=joined
runtime.totem.pg.mrp.srp.856336576.ip=r(0) ip(192.168.10.51)
runtime.totem.pg.mrp.srp.856336576.join_count=1
runtime.totem.pg.mrp.srp.856336576.status=joined

1.16.2.3. Pacmakerの設定

Pacemakerはクラスタリソースマネージャと呼ばれ、リソース(仮想IP、サービス)の動作状態を監視します。
設定はPacmakerを起動してから行います。
仮想IPはMySQL、RabbitMQ、OpenStack API用の3つを追加します。
先にhostsに追加しておきます。
$ sudo vi /etc/hosts
192.168.10.52 stack_mysql_vip
192.168.10.53 stack_api_vip
$ sudo service pacemaker start
確認します。参加しているノードが全て見えることが重要です。
$ sudo crm_mon

============
Last updated: Tue Apr  9 21:03:43 2013
Last change: Tue Apr  9 21:03:36 2013 via crmd on stack01
Stack: openais
Current DC: stack01 - partition with quorum
Version: 1.1.7-ee0730e13d124c3d58f00016c3376a1de5323cff
2 Nodes configured, 2 expected votes
0 Resources configured.
============

Online: [ stack01 stack02 ]

基本的なクラスタプロパティの設定を行います。

$ sudo crm configure property no-quorum-policy=ignore           \
                              pe-warn-series-max="1000"         \
                              pe-input-series-max="1000"        \
                              pe-error-series-max="1000"        \
                              cluster-recheck-interval="5min"   \
                              stonith-enabled=false

特にOpenStackに関する設定はまだおこなっていません。

1.16.3. DRBDのインストール

特定のパーティションを対象に、ネットワークを介して自動的にミラーリングを行うソフトウェアです。
Pacemakerと組み合わせてサービスを停止しないようにすることが多いです。
ここではMySQLとRabbitMQのためにミラーリングの設定を行います。

1.16.3.1. DRBDパッケージのインストール

また、2台構成で行ないますのでどちらのホストでも同じコマンドを利用して設定していきます。
Ubuntuの場合は、RHELやCentOSなどと違い標準リポジトリのパッケージでインストール可能です。
$ sudo apt-get install drbd8-utils -y

1.16.3.2. DRBD用パーティションの作成

DRBD用にディスクがあるのであればそれを利用します。
本来はそのようにするべきでパフォーマンスも勿論そちらのほうが高いです。
ここではイメージを作成してDRBDを利用してますのでディスクを用意して行う場合とは若干手順が変わるでしょう。
イメージで本番環境では使用しないほうが無難です。
また再起動などを行った場合に再度ループバックデバイスなどを認識させる必要などがあります。
20GByteのイメージを作製します。ディスクの空き容量にあわせてください。
$ sudo dd if=/dev/zero of=/opt/drbd.img bs=1M count=20480

使用可能なループバックデバイスを確認してイメージを関連付けます。

$ losetup -f
$ losetup /dev/loop0 /opt/drbd.img
ループバックデバイスにパーティションを割り当てます。
全体を割り当ててしまいます。
$ sudo fdisk /dev/loop0
パーティションの確認を行います。
kpartxがインストールされていない場合はインストールしておきます。
オプション【-l】でパーティションが何も無いことを確認して認識させます。
$ sudo apt-get install kpartx -y
$ sudo kpartx -l /dev/loop0
$ ls -l /dev/mapper
total 0
crw------- 1 root root 10, 236 Apr  9 10:06 control
lrwxrwxrwx 1 root root       7 Apr  9 10:06 vg00-root -> ../dm-1
lrwxrwxrwx 1 root root       7 Apr  9 10:06 vg00-swap -> ../dm-0

ループバックデバイスを認識させます。

$ sudo kpartx -a /dev/loop0

確認するとloop0p1が追加されていることがわかります。

$ ls -l /dev/mapper
total 0
crw------- 1 root root 10, 236 Apr  9 10:06 control
lrwxrwxrwx 1 root root       7 Apr  9 10:30 loop0p1 -> ../dm-2
lrwxrwxrwx 1 root root       7 Apr  9 10:06 vg00-root -> ../dm-1
lrwxrwxrwx 1 root root       7 Apr  9 10:06 vg00-swap -> ../dm-0

PV(Physical Volume)の作成を行います。

$ sudo pvcreate /dev/mapper/loop0p1
Writing physical volume data to disk "/dev/mapper/loop0p1"
Physical volume "/dev/mapper/loop0p1" successfully created
$ sudo pvscan

loopp0p1の部分が作成されたPVです。

PV /dev/vda5             VG cinder-volumes   lvm2 [25.49 GiB / 25.49 GiB free]
PV /dev/vda1             VG vg00             lvm2 [74.50 GiB / 0    free]
PV /dev/mapper/loop0p1                       lvm2 [10.00 GiB]
Total: 3 [109.99 GiB] / in use: 2 [99.99 GiB] / in no VG: 1 [10.00 GiB]

VG(Volume Group)の作成を行います。

$ sudo vgcreate -s 32m vg_stack_ha /dev/mapper/loop0p1
Volume group "vg_stack_ha" successfully created
$ sudo vgscan
Reading all physical volumes.  This may take a while...
Found volume group "cinder-volumes" using metadata type lvm2
Found volume group "vg_stack_ha" using metadata type lvm2
Found volume group "vg00" using metadata type lvm2
LV(Logical Volume)の作成を行います。
作成したLGから9000MのLVMを作成します。
$ sudo lvcreate -L9000 -n mysql vg_stack_ha
Rounding up size to full physical extent 8.81 GiB
Logical volume "mysql" created
$ sudo lvdisplay
--- Logical volume ---
LV Path                /dev/vg_stack_ha/mysql
LV Name                mysql
VG Name                vg_stack_ha
LV UUID                zJ9yap-xmWm-7VM7-Xwr0-k8c2-gfEI-EZJdcK
LV Write Access        read/write
LV Creation host, time stack02, 2013-04-10 02:02:29 +0900
LV Status              available
# open                 0
LV Size                928.00 MiB
Current LE             29
Segments               1
Allocation             inherit
Read ahead sectors     auto
- currently set to     256
Block device           252:3
これでDRBDで利用するパーティションが作成されました。
本番環境であれば行わなくても良い作業も含まれています。
ミラーリングするノード2台どちらでも同じものを作製しておきます。

1.16.3.3. ディスクイメージをOSから開放する

作成したループバックデバイスなどを解放するには以下のコマンドで行ないます。
このまますすめるので行う必要はありません。参考です。
$ sudo vgchange -an
$ sudo kpartx -d /dev/loop0
$ sudo losetup -d /dev/loop0

1.16.3.4. 再起動などを行った場合

以下のコマンドを実施して再度OSからループバックデバイス上のLVが確認できるようにします。
ループバックデバイスの紐付けからなくなっています。
また、lvdisplayで表示されているのに/dev配下にファイルが作成されていない場合は以下のコマンドを実施する必要があります。
あと、両方のノードのDRBDを再起動してプライマリ、セカンダリの状態も元に戻しておいたほうがよいでしょう。
$ sudo losetup -f
$ sudo losetup /dev/loop0 /opt/drbd.img
$ sudo kpartx  -a /dev/loop0
$ sudo vgchange -a y vg_stack_ha

1.16.3.5. OS起動時にLVがOSから確認できる状態にする

/etc/rc.local の最終行に追加しておくとよいでしょう。
exit 0より先の行に記述しておきます。
$ sudo vi /etc/rc.local
losetup /dev/loop0 /opt/drbd.img
kpartx  -a /dev/loop0
vgchange -a y vg_stack_ha

1.16.3.6. DRBDの設定

ノード2台ともどちらも同じコンフィグを作成します。

$ sudo cp -a /etc/drbd.conf /etc/drbd.conf_orig
$ sudo vi /etc/drbd.conf
下記の行をコメントアウトしておきます。

#include "drbd.d/global_common.conf";

アドレス及びホスト名及び暗号文字は適宜変更して下さい。

$ sudo cp -a /etc/drbd.d /etc/drbd.d_bak
$ sudo vi /etc/drbd.d/stack.res
global { usage-count yes; }
common { syncer { rate 10M; } }
resource mysql {
    protocol C;
    startup {
         degr-wfc-timeout 120;
    }
    net {
         cram-hmac-alg sha1;
         shared-secret "FullTrust";
    }
    on stack01 {
         device    minor 0;
         disk      /dev/vg_stack_ha/mysql;
         address   192.168.10.50:7789;
         meta-disk  internal;
    }
    on stack02 {
         device    minor 0;
         disk      /dev/vg_stack_ha/mysql;
         address   192.168.10.51:7789;
         meta-disk  internal;
    }
}

1.16.3.7. DRBDメタデータの作成

初期化のことです。1台目が終わったら2台目でも作成します。
$ sudo drbdadm create-md mysql
  --==  Thank you for participating in the global usage survey  ==--
The server's response is:

you are the 850th user to install this version
Writing meta data...
initializing activity log
NOT initializing bitmap
New drbd meta data block successfully created.
success

1.16.3.8. DRBDの起動

$ sudo service drbd start
両方のノードで起動します。
 * Starting DRBD resources

  --==  Thank you for participating in the global usage survey  ==--
The server's response is:

you are the 233th user to install this version
[
     create res: r0
   prepare disk: r0
    adjust disk: r0
     adjust net: r0
]
outdated-wfc-timeout has to be shorter than degr-wfc-timeout
outdated-wfc-timeout implicitly set to degr-wfc-timeout (120s)
error determining which timeout to use: sequence mismatch in netlink reply

1.16.3.9. DRBDの同期

プライマリとするホスト側でDRBDの初期同期を行ないます。

$ sudo drbdadm -- --overwrite-data-of-peer primary all

経過の確認

$ sudo service drbd status

途中経過

drbd driver loaded OK; device status:
version: 8.4.2 (api:1/proto:86-101)
srcversion: D4E87CE96AA95060B684559
m:res       cs          ro                 ds                     p  mounted  fstype
...         sync'ed:    29.8%              (667712/950204)K
...         sync'ed:    29.8%              (671548/950204)K
0:mysql     SyncSource  Primary/Secondary  UpToDate/Inconsistent  C

終了

drbd driver loaded OK; device status:
version: 8.4.2 (api:1/proto:86-101)
srcversion: D4E87CE96AA95060B684559
m:res       cs         ro                 ds                 p  mounted  fstype
0:mysql     Connected  Primary/Secondary  UpToDate/UpToDate  C

1.16.3.10. ノード1台目をプライマリ化

初期化を1台目で行っていれば行う必要はありませんが明示的に行っておいても問題ありません。
プライマリノードにしたいノードで行います。
再起動などを行った時もこのコマンドを実施する必要があります。
$ drbdadm primary all
ステータスの確認で【Primary/Secondary】となっていればプライマリ【Secondary/Primary】となっていればセカンダリです。

1.16.3.11. DRBDのディスクへファイルシステムを作成

DRBDにファイルシステムの制約はありません。
OpenStackのドキュメント通りにxfsでフォーマットします。
コマンドを実施するのはどちらかのノード1台だけです。
パッケージは両方でインストールしておいて下さい。
2台で行えば再初期化されるだけで問題にはなりませんがする必要はありません。
$ sudo apt-get install xfsprogs -y
$ sudo mkfs -t xfs /dev/drbd/by-res/mysql

1.16.4. MySQLの冗長化

1.16.4.1. MySQLのデータ移行

プライマリノードで行います。MySQLは停止して行います。
$ sudo service mysql stop
$ sudo mount /dev/drbd/by-res/mysql /mnt
$ sudo  mv /var/lib/mysql/* /mnt
$ sudo umount /mnt

1.16.4.2. MySQLのリソース追加

DRBDの設定は終了していますのでPacemakerのリソースにMySQLを追加します。
192.168.10.52 は、VIPです。実際にMySQLなどに接続する際に利用するIPを指定してください。
$ sudo crm configure
primitive p_ip_mysql ocf:heartbeat:IPaddr2    \
 params ip="192.168.10.52" cidr_netmask="24"  \
 op monitor interval="30s"
primitive p_drbd_mysql ocf:linbit:drbd        \
 params drbd_resource="mysql"                 \
 op start timeout="90s"                       \
 op stop timeout="180s"                       \
 op promote timeout="180s"                    \
 op demote timeout="180s"                     \
 op monitor interval="30s" role="Slave"       \
 op monitor interval="29s" role="Master"
primitive p_fs_mysql ocf:heartbeat:Filesystem \
 params device="/dev/drbd/by-res/mysql"       \
 directory="/var/lib/mysql"                   \
 fstype="xfs"                                 \
 options="relatime"                           \
 op start timeout="60s"                       \
 op stop timeout="180s"                       \
 op monitor interval="60s" timeout="60s"
primitive p_mysql ocf:heartbeat:mysql         \
 params additional_parameters="--bind-address=0.0.0.0" \
 config="/etc/mysql/my.cnf"                   \
 pid="/var/run/mysqld/mysqld.pid"             \
 socket="/var/run/mysqld/mysqld.sock"         \
 log="/var/log/mysql/mysqld.log"              \
 op monitor interval="20s" timeout="10s"      \
 op start timeout="120s"                      \
 op stop timeout="120s"
group g_mysql p_ip_mysql p_fs_mysql p_mysql
ms ms_drbd_mysql p_drbd_mysql \
 meta notify="true" clone-max="2"
colocation c_mysql_on_drbd inf: g_mysql ms_drbd_mysql:Master
order o_drbd_before_mysql inf: ms_drbd_mysql:promote g_mysql:start
commit
exit

1.16.4.3. OpenStackの各コンポーネントのMySQL接続先の変更

各コンポーネントのMySQLへの接続設定を変更します。
ここでは /etc/hosts192.168.10.52 stack_mysql_vip などとして追加したので以下のような設定にしました。
$ sudo sed -i 's/cinder:password@stack01/cinder:password@stack_mysql_vip/' /etc/cinder/cinder.conf
$ sudo sed -i 's/glance:password@stac01/glance:password@stack_mysql_vip' /etc/glance/glance-registry.conf
$ sudo sed -i 's/glance:password@stac01/glance:password@stack_mysql_vip' /etc/glance/glance-api.conf
$ sudo sed -i 's/keystone:password@stack01/keystone:password@stack_mysql_vip' /etc/keystone/keystone.conf
$ sudo sed -i 's/nova:password@stack01/nova:password@stack_mysql_vip' /etc/nova/nova.conf
MySQLの設定は以上です。
各プロセスを再起動すれば仮想IP経由でMySQLに接続できるようになっているはずです。
まだ設定してくためここではまだプロセスの再起動は行いません。

1.16.5. RabbitMQのクラスタ化

全てのサーバでプロセスを停止しておきます。

$ sudo service rabbitmq-server stop
また以下のプロセスは停止しないので?killで殺します。
/usr/lib/erlang/erts-5.9.1/bin/epmd
$ sudo kill $(ps -ef | grep epmd | grep -v grep | awk '{print $2}')
クラスタ内のクッキーは同一である必要がありますのでプライマリノードのクッキーをセカンダリノードにコピーしておきます。
$ scp -p /var/lib/rabbitmq/.erlang.cookie stack@stack02:/tmp
$ ssh stack@stack02
$ cp -a /var/lib/rabbitmq/.erlang.cookie /var/lib/rabbitmq/.erlang.cookie_bak
$ sudo mv /tmp/.erlang.cookie /var/lib/rabbitmq
$ sudo chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
$ exit

全てのサーバでプロセスを起動します。

$ sudo service rabbitmq-server start

セカンダリノード側でコマンドを実行しプライマリノードのクラスタに参加します。

$ sudo rabbitmqctl cluster_status
Cluster status of node rabbit@stack02 ...
[{nodes,[{disc,[rabbit@stack02]}]},
 {running_nodes,[rabbit@stack02]},
 {partitions,[]}]
...done.
$ sudo rabbitmqctl stop_app
Stopping node rabbit@stack02 ...
...done.
$ sudo rabbitmqctl reset
Resetting node rabbit@stack02 ...
...done.
$ sudo rabbitmqctl join_cluster rabbit@stack01
Clustering node rabbit@stack02 with rabbit@stack01 ...
...done.
$ sudo rabbitmqctl start_app
Starting node rabbit@stack02 ...
...done.
$ sudo rabbitmqctl cluster_status
Cluster status of node rabbit@stack02 ...
[{nodes,[{disc,[rabbit@stack01,rabbit@stack02]}]},
 {running_nodes,[rabbit@stack01,rabbit@stack02]},
 {partitions,[]}]
...done.

Novaの設定を変更します。

$ sudo vi /etc/nova/nova.conf

RabbitMQの設定を追加します。

rabbit_durable_queues=True

1.16.6. Memcachedのクラスタ化

Novaの設定を変更します。

$ sudo vi /etc/nova/nova.conf

Memcachedの設定を変更します。

memcached_servers=stack01:11211,stack02,11211

RabbitMQとPacemakerの状態は以下のようになっています。

$ sudo rabbitmqctl cluster_status
Cluster status of node rabbit@stack01 ...
[{nodes,[{disc,[rabbit@stack01,rabbit@stack02]}]},
 {running_nodes,[rabbit@stack02,rabbit@stack01]},
 {partitions,[]}]
...done.
$ crm_mon -1
============
Last updated: Tue Apr 23 08:51:40 2013
Last change: Tue Apr 23 08:37:44 2013 via cibadmin on stack01
Stack: openais
Current DC: stack01 - partition with quorum
Version: 1.1.7-ee0730e13d124c3d58f00016c3376a1de5323cff
2 Nodes configured, 2 expected votes
5 Resources configured.
============

Online: [ stack01 stack02 ]

 Resource Group: g_mysql
     p_ip_mysql (ocf::heartbeat:IPaddr2):       Started stack01
     p_fs_mysql (ocf::heartbeat:Filesystem):    Started stack01
     p_mysql    (ocf::heartbeat:mysql): Started stack01
 Master/Slave Set: ms_drbd_mysql [p_drbd_mysql]
     Masters: [ stack01 ]
     Slaves: [ stack02 ]

1.16.7. 各コンポーネントのリソースをPacemakerに追加

Keystone、Cinder、Glancdなどのコンポーネントを登録していきます。

1.16.7.1. VIPの設定

各コンポーネントへの外部からの接続用VIPを追加します。
ここでは /etc/hosts192.168.10.53 stack_api_vip などとして追加したので以下のような設定にしました。
プライマリノードだけで行います。
$ sudo crm configure primitive p_api-ip ocf:heartbeat:IPaddr2     \
                     params ip="192.168.10.53" cidr_netmask="24"  \
                     op monitor interval="30s"
Keystoneのエンドポイントを仮想IPに変更します。
サンプルスクリプトで作成したものなので同じように再作成しました。
$ mysql -uroot -pnova -e "drop database if exists keystone;"
$ mysql -uroot -pnova -e "create database keystone character set utf8;"
$ sudo keystone-manage db_sync
$ cd /usr/local/src ; sudo cp -a /usr/share/keystone/sample_data.sh .
$ stop keystone ; start keystone
$ export CONTROLLER_HOST=stack_api_vip
$ export SERVICE_ENDPOINT=http://$CONTROLLER_HOST:35357/v2.0
$ sudo sed -i "s/localhost/$CONTROLLER_HOST/" /usr/local/src/sample_data.sh
$ sudo -E bash /usr/local/src/sample_data.sh

1.16.7.2. Keystoneのリソース追加

Pacmakerが利用するKeystone用リソース監視スクリプトのダウンロードを両方のノードで行います。
$ cd /usr/lib/ocf/resource.d
$ sudo mkdir openstack
$ cd openstack
$ sudo wget https://raw.github.com/madkiss/openstack-resource-agents/master/ocf/keystone
$ sudo chmod a+rx *
プライマリ側で設定変更を行います。
Novaの認証設定の接続先を変更します。
$ sudo sed -i 's/auth_host = stack01/auth_host = stack_api_vip/' /etc/nova/api-paste.ini
HorizonのKeystoneへの接続先を変更します。
$ sudo 's/OPENSTACK_HOST = 127.0.0.1/OPENSTACK_HOST = stack_api_vip/' /etc/openstack-dashboard/local_settings.py
セカンダリ側で設定変更を行います。
Novaの認証設定の接続先を変更します。
$ sudo sed -i 's/auth_host = stack02/auth_host = stack_api_vip/' /etc/nova/api-paste.ini
HorizonのKeystoneへの接続先を変更します。
$ sudo 's/OPENSTACK_HOST = 127.0.0.1/OPENSTACK_HOST = stack_api_vip/' /etc/openstack-dashboard/local_settings.py
Pacemakerへのリソース追加はプライマリノードだけで行います。
$ sudo crm configure primitive p_keystone ocf:openstack:keystone   \
                     params config="/etc/keystone/keystone.conf"   \
                     os_password="secrete"                         \
                     os_username="admin"                           \
                     os_tenant_name="demo"                         \
                     os_auth_url="http://192.168.10.53:5000/v2.0/" \
                     op monitor interval="30s" timeout="30s"

1.16.7.3. Glanceのリソース追加

Pacmakerが利用するGlance用リソース監視スクリプトのダウンロードを両方のノードで行います。
両方のノードで行います。
$ cd /usr/lib/ocf/resource.d/openstack
$ sudo wget https://raw.github.com/madkiss/openstack-resource-agents/master/ocf/glance-api
$ sudo wget https://raw.github.com/madkiss/openstack-resource-agents/master/ocf/glance-registry
$ sudo chmod a+rx *
プライマリ側で設定変更を行います。
NovaのGlance認証の設定を変更します。
$ sudo sudo sed -i '/glance_api_servers=stack01:9292/glance_api_servers=stack_api_vip:9292/' /etc/nova/nova.conf
GlanceのKeystone認証の設定を変更します。
$ sudo sed -i '/auth_host = stack01/auth_host = stack_api_vip/' /etc/glance/glance-api.conf
$ sudo sed -i '/auth_host = stack01/auth_host = stack_api_vip/' /etc/glance/glance-registry.conf
セカンダリ側で設定変更を行います。
NovaのGlance認証の設定を変更します。
$ sudo sudo sed -i '/glance_api_servers=stack02:9292/glance_api_servers=stack_api_vip:9292/' /etc/nova/nova.conf
GlanceのKeystone認証の設定を変更します。
$ sudo sed -i '/auth_host = stack02/auth_host = stack_api_vip/' /etc/glance/glance-api.conf
$ sudo sed -i '/auth_host = stack02/auth_host = stack_api_vip/' /etc/glance/glance-registry.conf
Pacemakerへのリソース追加はプライマリノードだけで行います。
$ sudo crm configure primitive p_glance-api ocf:openstack:glance-api \
                     op monitor interval="30s" timeout="30s"

$ sudo crm configure primitive p_glance-registry ocf:openstack:glance-registry \
                     op monitor interval="30s" timeout="30s"
共有ディスクがイメージの保存先になっていない場合は冗長化は不完全です。
/var/lib/glance/images/ を何らかの手段(NFS、GlusterFS、DRBDなど)で冗長化しておきましょう。

1.16.7.4. Cinderのリソース追加

Pacmakerが利用するCinder用リソース監視スクリプトのダウンロードを両方のノードで行います。
両方のノードで行います。
$ cd /usr/lib/ocf/resource.d/openstack
$ sudo wget https://raw.github.com/madkiss/openstack-resource-agents/master/ocf/cinder-api
$ sudo wget https://raw.github.com/madkiss/openstack-resource-agents/master/ocf/cinder-schedule
$ sudo wget https://raw.github.com/madkiss/openstack-resource-agents/master/ocf/cinder-volume
$ sudo chmod a+rx *
プライマリ側で設定変更を行います。
Cinderの接続先を変更します。
$ sudo sed -i 's/service_host = stack01/service_host = stack_api_vip/' /etc/cinder/api-paste.ini
$ sudo sed -i 's/auth_host = stack01/auth_host = stack_api_vip/' /etc/cinder/api-paste.ini
セカンダリ側で設定変更を行います。
Cinderの接続先を変更します。
$ sudo sed -i 's/service_host = stack01/service_host = stack_api_vip/' /etc/cinder/api-paste.ini
$ sudo sed -i 's/auth_host = stack01/auth_host = stack_api_vip/' /etc/cinder/api-paste.ini
Pacemakerへのリソース追加はプライマリノードだけで行います。
$ sudo crm configure primitive p_cinder-api ocf:openstack:cinder-api           \
                     op monitor interval="30s" timeout="30s"

あとは、追加したリソースのグループを作成しておきます。

$ sudo crm configure group g_services_api p_api-ip p_keystone            \
                                          p_glance-api p_glance-registry \
                                          p_cinder-api
以上です。
両方のノードを再起動したりした後はDRBDをプライマリにしたりPacmakerを起動する必要があります。

1.16.8. おまけ

Glusterを利用してCinderとGlusterのバックエンドを作成して冗長化します。
まだ書いてませんのでそのうち。。
あと、公式ドキュメントでCinderだとAPIだけだしNovaのリソースは一切追加してないのは何でなんだろう。

目次

前のトピックへ

1.15. インスタンスの不整合が発生した場合は?

次のトピックへ

1. Openstackインストール手順(Diablo)

このページ