pikesaku’s blog

個人的な勉強メモです。記載内容について一切の責任は持ちません。

OpenStack環境構築メモ(RabbitMQクラスタセットアップ)

①RabbitMQ Serverインストール&停止

$ sudo apt -y install rabbitmq-server 
$ sudo systemctl stop rabbitmq-server

 

Erlang クッキーファイル設定

/var/lib/rabbitmq/.erlang.cookie
3台のサーバで上記ファイル内容を同一にする
 

③rabbitmq-server起動

$ sudo systemctl start rabbitmq-server.service

 

クラスタ組み込み

2,3号機で以下を実施

$ sudo rabbitmqctl stop_app
$ sudo rabbitmqctl join_cluster --ram rabbit@cnt1
$ sudo rabbitmqctl start_app

※モードはramとdiscの2種類あり。ramモードはキューデータをramに格納(電源障害時データ保護なし)。discモードはramとディスク両方に格納。HAキューミラー構成時は、1台でもdiscがあれば保護レベルは担保されるため、2,3号機はramモードで起動させる。詳細はmanのrabbitmqctlを参照。
 

⑤以下コマンドを実行してクラスタ状態を確認

$ sudo rabbitmqctl cluster_status
Cluster status of node rabbit@cnt2 ...
[{nodes,[{disc,[rabbit@cnt1]},{ram,[rabbit@cnt3,rabbit@cnt2]}]},
 {running_nodes,[rabbit@cnt3,rabbit@cnt1,rabbit@cnt2]},
 {cluster_name,<<"rabbit@cnt1.pikesaku.net">>},
 {partitions,[]}]
$

※running_nodesに3サーバあること
 

⑥キューミラー設定

1号機で以下を実施

$ sudo rabbitmqctl set_policy ha-all '^(?!amq\.).*' '{"ha-mode": "all"}'

※この(?!amq¥.)は以下URLの「先読み否定グループ」。"amq."で始まるもの以外全ての意味。
正規表現サンプル集
 

補足

システム起動時はクラスタの親である1号機が先に起動している状態で、2,3号機を起動する必要あり。
2,3号機はrabbitmqctl join_clusterで1号機のクラスタに属している。また1号機がdiscモードであり永続的にデータを持っている。

OpenStack環境構築メモ(Pacemaker & Corosyncセットアップ)

参考

OpenStack Docs: Pacemaker cluster stack
 
DBクラスタセットアップ実施後に、以下作業をコントローラ3台に実施する。
 

①Pacemaker & Corosyncインストール

$ sudo apt -y install crmsh

 

②設定ファイル編集

/etc/corosync/corosync.conf

totem {
	version: 2
	cluster_name: debian
	token: 3000
	token_retransmits_before_loss_const: 10
	clear_node_high_bit: yes
	crypto_cipher: none
	crypto_hash: none
	interface {
		ringnumber: 0
		bindnetaddr: 192.168.1.0
		broadcast: yes
		mcastport: 5405
		ttl: 1
	}
}

logging {
	fileline: off
	to_stderr: no
	to_logfile: no
	to_syslog: yes
	syslog_facility: daemon
	debug: off
	timestamp: on
	logger_subsys {
		subsys: QUORUM
		debug: off
	}
}

quorum {
	provider: corosync_votequorum
	expected_votes: 2
}

nodelist {
	node {
		ring0_addr: 192.168.1.51
		nodeid: 1
	}
	node {
		ring0_addr: 192.168.1.52
		nodeid: 2
	}
	node {
		ring0_addr: 192.168.1.53
		nodeid: 3
	}
} 

 

③Corosync再起動

$ sudo systemctl stop corosync
$ sudo systemctl start corosync

 

④動作確認

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

※statusがno faultsであること
 

$ sudo corosync-cmapctl runtime.totem.pg.mrp.srp.members
runtime.totem.pg.mrp.srp.members.1.config_version (u64) = 0
runtime.totem.pg.mrp.srp.members.1.ip (str) = r(0) ip(192.168.1.51) 
runtime.totem.pg.mrp.srp.members.1.join_count (u32) = 1
runtime.totem.pg.mrp.srp.members.1.status (str) = joined
runtime.totem.pg.mrp.srp.members.2.config_version (u64) = 0
runtime.totem.pg.mrp.srp.members.2.ip (str) = r(0) ip(192.168.1.52) 
runtime.totem.pg.mrp.srp.members.2.join_count (u32) = 1
runtime.totem.pg.mrp.srp.members.2.status (str) = joined
runtime.totem.pg.mrp.srp.members.3.config_version (u64) = 0
runtime.totem.pg.mrp.srp.members.3.ip (str) = r(0) ip(192.168.1.53) 
runtime.totem.pg.mrp.srp.members.3.join_count (u32) = 1
runtime.totem.pg.mrp.srp.members.3.status (str) = joined

※statusがjoinedであること
 

⑤Pacemaker再起動

$ sudo systemctl restart pacemaker

 

⑥Pacemaker起動確認

$  sudo crm_mon -1
Last updated: Sat Nov  4 00:27:14 2017		Last change: Sat Nov  4 00:25:10 2017 by hacluster via crmd on cnt1
Stack: corosync
Current DC: cnt1 (version 1.1.14-70404b0) - partition with quorum
3 nodes and 0 resources configured

Online: [ cnt1 cnt2 cnt3 ]

※Onlineに3台表示されること
 

⑦Pacemaker設定

cnt1のみで以下を実施
 
プロパティ設定

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

 
VIP設定

$ sudo crm configure primitive vip-public ocf:heartbeat:IPaddr2 params ip="192.168.0.50" cidr_netmask="24" op monitor interval="30s"  
$ sudo crm configure primitive vip-local ocf:heartbeat:IPaddr2 params ip="192.168.1.50" cidr_netmask="24" op monitor interval="30s"  

OpenStack環境構築メモ(DBクラスタセットアップ)

リンク元ページ

pikesaku.hatenablog.com
 
コントローラ基本セットアップ実施後に、以下作業をコントローラ3台に実施する。
 

MariaDBセットアップ

$ sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
$ sudo add-apt-repository 'deb [arch=amd64,i386,ppc64el] http://ftp.yz.yamagata-u.ac.jp/pub/dbms/mariadb/repo/10.2/ubuntu xenial main'
$ sudo apt update
$ sudo apt -y install mariadb-server python-pymysql

 

Mariadbストップ

$ sudo systemctl stop mariadb

 

③設定ファイル編集

以下ファイルを新規に作成

/etc/mysql/mariadb.conf.d/galera.cnf

※bind-address, wsrep_node_address, wsrep_node_nameはノード毎に適宜変更
※bind-addressを0.0.0.0はNG。後で設定するHAProxy・PacemakerのVIP設定をすると起動しなくなる。

Nov 04 14:35:46 cnt3 mysqld[1836]: 2017-11-04 14:35:44 140114370193600 [ERROR] Can't start server: listen() on TCP/IP port: Address already in use
Nov 04 14:35:46 cnt3 mysqld[1836]: 2017-11-04 14:35:44 140114370193600 [ERROR] listen() on TCP/IP failed with error 98
Nov 04 14:35:46 cnt3 mysqld[1836]: 2017-11-04 14:35:44 140114370193600 [ERROR] Aborting'

 
galera.cnf内容

[galera]
bind-address = 192.168.1.51
max_connections	= 4096
collation_server = utf8mb4_general_ci
character_set_server = utf8mb4
binlog_format = row

wsrep_on = ON
wsrep_provider = "/usr/lib/libgalera_smm.so"
wsrep_provider_options = "pc.recovery=TRUE;gcache.size=300M"
wsrep_cluster_name = mycluster
wsrep_cluster_address = "gcomm://192.168.1.51,192.168.1.52,192.168.1.53"
wsrep_sst_method = rsync
wsrep_node_address = 192.168.1.51
wsrep_node_name = cnt1
wsrep_slave_threads = 1

default_storage_engine = InnoDB
innodb_flush_log_at_trx_commit = 0
innodb_autoinc_lock_mode = 2
innodb_file_per_table = on

 

④1号機でサービス起動

$ sudo galera_new_cluster

  

⑤2,3号機でサービス起動

$ sudo systemctl start mariadb

 

クラスタ確認

3台のコントローラで以下コマンド実行。valueが3であることを確認。

$ mysql -uroot -p[DB_PASSWORD] -e "SHOW STATUS LIKE 'wsrep_cluster_size';"
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 3     |
+--------------------+-------+

 

補足

システム起動時はサービス起動に失敗する。以下作業が必要。
①一番最後に停止したサーバで以下コマンドを実行

$ sudo galera_new_cluster

 
②他サーバで以下コマンドを実行

$ sudo systemctl start mariadb

 
※一番最後に停止してないサーバで、galera_new_clusterを実行するとエラーになる。ログメッセージは以下。

WSREP: It may not be safe to bootstrap the cluster from this node. It was not the last one to leave the cluster and may not contain all the updates. To force cluster bootstrap with this node, edit the grastate.dat file manually and set safe_to_bootstrap to 1 .

※3台のサーバを同時に停止すると、一番最後に停止したサーバでgalera_new_clusterを実行しても上記エラーになる。この場合は、ログに従い/var/lib/mysql/grastate.datのsafe_to_bootstrapパラメタを1にして、再度galera_new_clusterを実行する。

OpenStack環境構築メモ(コントローラ基本セットアップ)

参考URL

OpenStack Docs: OpenStack Installation Guide
 
以下作業をUbuntu 16.04LTS最小インストール後のコントローラ3台に実施する。
 

①apparmor無効化

$ sudo systemctl stop apparmor.service
$ sudo systemctl disable apparmor.service
$ sudo shutdown -r now

 

②NW設定

/etc/network/interfaces
※ipaddressはノード毎に適宜変更

source /etc/network/interfaces.d/*

auto lo
iface lo inet loopback

auto ens3
iface ens3 inet static
address 192.168.0.51
netmask 255.255.255.0
gateway 192.168.0.1
dns-nameservers 192.168.0.1

auto ens9
iface ens9 inet static
address 192.168.1.51
netmask 255.255.255.0

/etc/hostname
※ノード毎に適宜変更

$ cnt1

 
設定ファイル変更し再起動(networklingサービス再起動では反映されない。以下URL参照)
Ubuntuでネットワーク設定の変更をする - Qiita
 

③OpenSSHセットアップ

$ sudo apt install openssh-server

 

④時刻同期設定

$ sudo apt -y install chrony
$ sudo systemctl disable systemd-timesyncd
$ sudo systemctl enable chrony
$ sudo shutdown -r now

 
再起動後、時刻同期確認

$ chronyc sources

 

⑤hostsファイル編集

/etc/hosts

127.0.0.1	localhost
192.168.1.50 cnt.local cnt
192.168.1.51 cnt1.local cnt1
192.168.1.52 cnt2.local cnt2
192.168.1.53 cnt3.local cnt3
192.168.1.61 nw1.local nw1
192.168.1.62 nw2.local nw2
192.168.1.71 cm1.local cm1
192.168.1.72 cm2.local cm2
192.168.1.1  nfs.local nfs

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

  

⑥OpenStackレポジトリ追加&パッケージ最新化&パッケージインストール

$ sudo add-apt-repository cloud-archive:pike
$ sudo apt update && sudo apt full-upgrade
$ sudo apt -y install python-openstackclient nfs-common  crudini apt-file

※apt-fileはyum provides同等機能を提供

aptとapt-getの違い

6.2. aptitude、apt-get、apt コマンド

APT は巨大なプロジェクトで、当初の予定ではグラフィカルインターフェースを含んでいました。APT はライブラリに基づいており、そのライブラリにはコアアプリケーションが含まれています。apt-get は最初のコマンドラインベースフロントエンドで、APT プロジェクト内で開発されました。apt は APT から提供されているもう一つのコマンドラインベースフロントエンドで、apt-get の持っていた設計上のミスを克服しています。