Pandora: Documentation ja: Percona Cluster
Contents
1 Percona XtraDB クラスタ
1.1 概要
このガイドの目的は、以下の図に示すようなアーキテクチャのシステムを作ることです。
Percona クラスタがインストールされた 3つのノードがあり、それぞれ接続されています。2つのノードで、HAProxy および Keepalived がインストールされています。これが無いと node 1 で障害が発生した場合にクラスタ全体が障害となってしまいます。最初のノードは起動時にプロセス起動する必要があります。
node #1 hostname: percona1 IP: 192.168.70.71
node #2 hostname: percona2 IP: 192.168.70.72
node #3 hostname: percona3 IP: 192.168.70.73
以下の図では、2つの HAProxy サーバおよび keepalived で仮想 IP アドレスを持っています。keepalived は、ロードバランシングと可用性確保のために必要です。このシステムにより、最初のノードで障害が発生した場合にもう一方を利用できるようにします。
アーキテクチャの図の一番上はアプリケーションを表しており、ここでは Pandora FMS です。Pandora FMS サーバ、コンソールおよび、エージェントを、Percona クラスタと共に利用します。
1.1.1 Percona の概要
Percona XtraDB は、オープンソースの MySQL HA ソフトウエアです。MySQL HA ソリューションを一つのパッケージにまとめた Galera ライブラリと共に、Percona サーバと Percona XtraBackup が統合されています。
Percona クラスタを使う主な利点はパフォーマンスの向上です。しかし、この利点はリニアに得られるものではありません。たとえば 3ノードのクラスタでは 3倍のパフォーマンスを得られるわけではありません。その理由の一つとしては、クラスタノード間の同期処理が必要だからです。
クラスタはノードで構成されます。最低 3つのノードでの構成が推奨されますが、2ノードでも動かすことができます。
それぞれのノードは通常の MySQL / Percona サーバ設定です。ポイントとしては、MySQL / Percona サーバをベースとして、ノードとクラスタロールに変換することです。逆に、クラスタからノードを外せば、通常のサーバとして使えます。
それぞれのノードは全データのコピーを持ちます。多くの方法で XtraDB クラスタの動作を定義しますが、それぞれあきらかに利点と欠点があります。
Percona XtraDB クラスタが提供するもの:
- 本番環境を停止することなくクラスタの再起動とアップグレードを実現。
- 同期レプリケーション。全てのノードに適用されるかまたは適用されないトランザクション。
- マルチマスタレプリケーション。任意のノードに書き込めます。
- スレーブへの並列イベント適用。実際の "並列レプリケーション"。
- 自動ノードプロビジョニング。
- データの一貫性。非同期スレーブなし。
Percona XtraDB クラスタの欠点:
- 新規ノードの追加にオーバーヘッドがあります。新規ノードは、既存ノードから全データのコピーを行います。100GB のデータがあるとすると、100GB をコピーします。
- 書き込みをスケールする手段としては利用できません。書き込みを 2ノードに対して行うのと 1ノードに対して行うのとでスループットを改善できるかもしれませんが、多くは期待できません。全ての書き込みは最終的には全てのノードに対して行われます。
- 3ノードであれば、3つといった、複数の複製データを持つことになります。
1.2 Percona のインストール
要件:
- CentOS をインストール
- ファイアウォールにて、3306, 4444, 4567, 4568 ポートの接続を許可(もしくはファイアウォール無効化)
- mysql がインストールされていたら削除
- SELinux の無効化 - 次のコマンドを実行します。
echo 0 >/selinux/enforce
以下のコマンドで確認します。
sestatus
次のコマンドでノードの IP を確認します:
ifconfig
以下に例を示します:
node #1 hostname: percona1 IP: 192.168.70.71
node #2 hostname: percona2 IP: 192.168.70.72
node #3 hostname: percona3 IP: 192.168.70.73
1.2.1 必要パッケージのインストール
最初に必要なパッケージ(Percona および Percona XtraDB クラスタ)をインストールする必要があります。
以下のように yum でリポジトリからパッケージをインストール。:
yum install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm
聞かれることに対しては Yes と入力します。 XtraDB クラスタパッケージをインストールします。:
yum install Percona-XtraDB-Cluster-56
以下のコマンドでリポジトリを有効化します。:
rpm -Uhv http://www.percona.com/downloads/percona-release/percona-release-0.0-1.x86_64.rpm
1.2.2 ノードの設定
設定ファイルを設定します。個々のノードをクラスタが起動できるように設定する必要があります。
1.2.2.1 ノード #1
ターミナルを開き、my.cnf ファイルを開きます。
nano /etc/my.cnf
node1 の my.cnf の内容は以下の設定(IPアドレスは環境に合わせてください)で保存し、終了します。
設定は次のようにします。
[mysqld] datadir=/var/lib/mysql user=mysql # Path to Galera library wsrep_provider=/usr/lib64/libgalera_smm.so # Cluster connection URL contains the IPs of node#1, node#2 and node#3 wsrep_cluster_address=gcomm://192.168.70.71,192.168.70.72,192.168.70.73 # In order for Galera to work correctly binlog format should be ROW binlog_format=ROW # MyISAM storage engine has only experimental support default_storage_engine=InnoDB # This changes how InnoDB autoincrement locks are managed and is a requirement for Galera innodb_autoinc_lock_mode=2 # Node #1 address wsrep_node_address=192.168.70.71 # SST method wsrep_sst_method=xtrabackup-v2 # Cluster name wsrep_cluster_name=my_centos_cluster # Authentication for SST method wsrep_sst_auth="sstuser:s3cret"
my.cnf を設定したあとは、以下のコマンドを実行します。
mysql_install_db --datadir=/var/lib/mysql --user=mysql
node1 を以下のコマンドで起動します。
/etc/init.d/mysql bootstrap-pxc
または
service mysql bootstrap-pxc
このコマンドは、初期の wsrep_cluster_address を gcomm:// に設定してクラスタを起動します。 これによりクラスタが起動され、ノードでは MySQL が後から起動されます。以降は設定ファイルを変更する必要はありません。
次のような出力がされます。
Bootstrapping PXC (Percona XtraDB Cluster)Starting MySQL (Percona XtraDB Cluster). SUCCESS!
mysql の状態を確認するには次のコマンドを実行します。
mysql -u root
そして、次のコマンドを実行します。
show status like 'wsrep%';
次のような出力が表示されます。
+----------------------------+--------------------------------------+ | Variable_name | Value +----------------------------+--------------------------------------+ | wsrep_local_state_uuid | c2883338-834d-11e2-0800-03c9c68e41ec ... | wsrep_local_state | 4 | wsrep_local_state_comment| Synced ... | wsrep_cluster_size | 1 | wsrep_cluster_status | Primary | wsrep_connected | ON ... | wsrep_ready | ON +----------------------------+--------------------------------------+ 40 rows in set (0.01 sec)
(オプション) root にパスワードを付けるには次のコマンドを実行します。
UPDATE mysql.user SET password=PASSWORD("yourpassword") where user='root'; FLUSH PRIVILEGES;
XtraBackup を使って状態スナップショット転送を出来るようにするには、次のコマンドで適切な権限を持ったユーザを設定する必要があります。
CREATE USER 'sstuser'@'localhost' IDENTIFIED BY 's3cret';
次に、以下を実行します。
GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'sstuser'@'localhost';
また、以下を実行します。
FLUSH PRIVILEGES;
以下のコマンドで mysql を抜けます。
exit
最初のノードの準備が終わったら、他のノードを設定します。
1.2.2.2 ノード #2
以下のコマンドで node1 を停止する必要があります。
service mysql stop
次に、node2 のターミナルを開き、my.cnf を編集します。
nano /etc/my.cnf
以下の設定を node2 の my.cnf にペーストし(IPアドレスは環境に合わせて調整します)、保存します。
設定は次の通りです。
[mysqld] datadir=/var/lib/mysql user=mysql # Path to Galera library wsrep_provider=/usr/lib64/libgalera_smm.so # Cluster connection URL contains IPs of node#1, node#2 and node#3 wsrep_cluster_address=gcomm://192.168.70.71,192.168.70.72,192.168.70.73 # In order for Galera to work correctly binlog format should be ROW binlog_format=ROW # MyISAM storage engine has only experimental support default_storage_engine=InnoDB # This changes how InnoDB autoincrement locks are managed and is a requirement for Galera innodb_autoinc_lock_mode=2 # Node #2 address wsrep_node_address=192.168.70.72 # Cluster name wsrep_cluster_name=my_centos_cluster # SST method wsrep_sst_method=xtrabackup-v2 #Authentication for SST method wsrep_sst_auth="sstuser:s3cret"
node2 の my.cnf を設定したら、以下のコマンドを実行します。
mysql_install_db --datadir=/var/lib/mysql --user=mysql
node2 が正しく設定できたら、Mysql を起動します。
以下のコマンドで mysql を起動します。
service mysql start
次のような出力が表示されます。
Starting MySQL (Percona XtraDB Cluster)... [ OK ]
全て正常に動作しているので、node3 の設定に進みます。
1.2.2.3 ノード #3
node3 の設定に進みます。 node2 の mysql を停止します。
service mysql stop
node3 のターミナルを開き、my.cnf を編集します。
nano /etc/my.cnf
node3 の my.cnf に以下をペーストして(IPは環境に合わせて設定します)、保存します。
設定は次の通りです。
[mysqld] datadir=/var/lib/mysql user=mysql # Path to Galera library wsrep_provider=/usr/lib64/libgalera_smm.so # Cluster connection URL contains IPs of node#1, node#2 and node#3 wsrep_cluster_address=gcomm://192.168.70.71,192.168.70.72,192.168.70.73 # In order for Galera to work correctly binlog format should be ROW binlog_format=ROW # MyISAM storage engine has only experimental support default_storage_engine=InnoDB # This changes how InnoDB autoincrement locks are managed and is a requirement for Galera innodb_autoinc_lock_mode=2 # Node #3 address wsrep_node_address=192.168.70.73 # Cluster name wsrep_cluster_name=my_centos_cluster # SST method wsrep_sst_method=xtrabackup-v2 #Authentication for SST method wsrep_sst_auth="sstuser:s3cret"
以下のコマンドで node3 の mysql を起動します。
service mysql start
次のような出力が表示されます。
Starting MySQL (Percona XtraDB Cluster)... [ OK ]
問題なければ、次のステップに進みます。 その前に、node3 の mysql を停止しておきます。
service mysql stop
1.2.3 サーバの起動
すべてのノードが動作するようになったら、すべてを停止したあと正しい順番で起動させる必要があります。そのためには次のステップを実行します。
node1 にて以下のコマンドを実行し起動します。
/etc/init.d/mysql bootstrap-pxc
node1 が起動したら、node2 と node3 で以下を実行します。
service mysql start
サーバが起動したら、状態スナップショット転送が自動的に node2 と 3 に行われます。
mysql の状態を確認します。(node1, node2 および node3)
mysql -u root
パスワードを設定している場合は次のようにします。
mysql -u root -p
そして、状態を確認します。
show status like 'wsrep%';
クラスタにいくつノードが接続されているか、次の行を確認します。
| wsrep_cluster_size | 3 |
クラスタをテストするには、以下のステップを実行します。
node2 の mysql でデータベースを作成します。( mysql -u root で接続します。パスワードを設定している場合は mysql -u root -p です) 以下のコマンドを実行します。
CREATE DATABASE percona;
出力: Query OK, 1 row affected (x sec)
node3 に example テーブルを作成します。( mysql -u root で接続します。パスワードを設定している場合は mysql -u root -p です) 以下のコマンドを実行します。
USE percona;
出力: Database changed
つぎに以下を実行します。
CREATE TABLE example (node_id INT PRIMARY KEY, node_name VARCHAR(30));
出力: Query OK, 0 rows affected (x sec)
node1 でレコードを挿入します。( mysql -u root で接続します。パスワードを設定している場合は mysql -u root -p です) レコード挿入のコマンドは以下の通りです。
INSERT INTO percona.example VALUES (1, 'percona1');
出力: Query OK, 1 row affected (x sec)
node2 のテーブルから全ての行を取得します。 コマンド:
SELECT * FROM percona.example;
出力:
+-----------+------------------+ | node_id | node_name | +-----------+------------------+ | 1 | percona1 | +-----------+------------------+ 1 row in set (0.00 sec)
この例は、クラスタ内の全ノードが同期され意図通りに動作していることを示しています。
1.3 Pandora コンソールの設定
すべてのノードの設定が完了したので、Pandora コンソールの設定を始めます。以下の手順です。
Pandora FMS サーバとコンソールを次のガイドに従ってインストールします。 http://wiki.pandorafms.com/index.php?title=Pandora:Documentation_ja:Installing#Red_Hat_Enterprise_Linux_.2F_Fedora_.2F_CentOS_.E3.81.B8.E3.81.AE.E3.82.A4.E3.83.B3.E3.82.B9.E3.83.88.E3.83.BC.E3.83.AB ターミナルを開き、Pandora サーバにログインします。
ssh [email protected]<pandoraサーバIP>
MySQL に接続します。
mysql -u root -p
次のコマンドで全ての権限設定をします。
grant all privileges on pandoraname.* ‘pandora’@<node #1 ip> identified by ‘pandora’;
<Pandora FMS サーバのIP>/pandora_console/install.php にアクセスします。詳細は以下を参照してください。 http://wiki.pandorafms.com/index.php?title=Pandora:Documentation_ja:Installing#.E3.82.B3.E3.83.B3.E3.82.BD.E3.83.BC.E3.83.AB.E3.81.AE.E5.88.9D.E6.9C.9F.E8.A8.AD.E5.AE.9A
apache は異なる名前になっている可能性があるので注意してください。ここでは httpd です。他には、apache, apached, http, httpd, apache2 などがあります。
ノードを使って動作するようにするには、config.php および pandora_server.conf を設定する必要があります。
次の通り config.php を編集します。
nano /var/www/html/pandora_console/include/config.php
dbuser を root に、dbpass を pandora(デフォルト) に変更し、dbhost を ノード #1 の IP に変更します。 pandora_server.conf を編集します。
nano /etc/pandora/pandora_server.conf
dbuser を root に、dbpass を pandora(デフォルト) に変更し、dbhost を ノード #1 の IP に変更します。 bootstrap を最初にして 1 から 3 の全てのノードを起動します。その後 pandora_server を以下のコマンドで再起動します。
service pandora_server restart
1.4 HAProxy の設定
HAProxy はフリーで、高速な HA、ロードバランシング、TCP および HTTP ベースのアプリケーションに対するプロキシのソリューションを提供するソフトです。bootstrap ノードで障害が発生したとしてもクラスタが動作し続けるために高可用性が必要とされます。ロードバランシングは、負荷を均等に分散します。
上記の図は、どのように HAProxy がノードと通信するかを示しています。
要件:
少なくとも以下の設定の 2ノードが必要です。
- SELinux のモードを“permissive”にする
これには、SELinux 設定を編集する必要があります。
nano /etc/selinux/config
SELINUX=disabled を SELINUX=permissive に変更し、再起動します。
- iptables の無効化
iptables を無効化するには以下を実行します。
service iptables stop
- ntpd の有効化
ntpd を有効化するには以下を実行します。
service ntpd start
1.4.1 HAProxy のインストール
HAProxy をインストールするには、個々のノードで以下のコマンドを実行します。
yum -y install haproxy
1.4.2 HAProxy の設定
ここでは、ノードで動作するように HAproxy 設定ファイルの設定をします。以下の手順を実施します。
以下のコマンドで設定のバックアップを取得します。
mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.orig
新たな設定ファイルを作成します。
nano /etc/haproxy/haproxy.cfg
以下の設定をコピーしパラメータ(node1,node2,node3 のホスト名とIP)の調整をします。
global log 127.0.0.1 local0 log 127.0.0.1 local1 notice maxconn 4096 uid 188 gid 188 daemon #debug #quiet defaults log global mode http option tcplog option dontlognull retries 3 option redispatch maxconn 2000 contimeout 5000 clitimeout 50000 srvtimeout 50000 listen mysql-cluster 0.0.0.0:33306 mode tcp balance roundrobin option httpchk server percona1 192.168.70.71:3306 check port 9200 inter 12000 rise 3 fall 3 server percona2 192.168.70.72:3306 check port 9200 inter 12000 rise 3 fall 3 server percona3 192.168.70.73:3306 check port 9200 inter 12000 rise 3 fall 3 listen mysql-cluster-failover :43306 mode tcp balance leastconn option httpchk server percona1 192.168.70.71:3306 check port 9200 server percona2 192.168.70.72:3306 check port 9200 backup server percona3 192.168.70.73:3306 check port 9200 backup
この設定で、HAProxy は 3ノード間のロードバランシングをします。
設定ファイルを保存して抜けます。
以下の 2つのコマンドでサーバを起動します。
service haproxy start
および
chkconfig haproxy on
1.5 Keepalived で 2台の HAProxy ノードを冗長化する
1.5.1 Keepalived の最新版のインストール
keepalived の最新版は、以下のコマンドでインストールします。
yum install -y keepalived
1.5.2 Keepalived の設定
2つのノード双方で、次のステップで設定ファイルを作成します。
オリジナルの設定ファイルをリネームします。(バックアップ)
mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.backup
新たなファイルを作成します。
nano /etc/keepalived/keepalived.conf
作成したファイルに以下の設定を入れます。仮想 IP アドレス、email アドレス、SMTP サーバ IP アドレスは環境に合わせて調整します。
global_defs { notification_email { [email protected] } notification_email_from [email protected] smtp_server 192.168.70.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_script chk_haproxy { script "killall -0 haproxy" interval 1 } vrrp_instance VI_1 { interface eth0 state MASTER smtp_alert virtual_router_id 51 priority 101 # on the nodes considered slaves, change 101 -> 100 unicast_peer { 192.168.70.72 # this is the other node's IP address } advert_int 1 authentication { auth_type PASS auth_pass 1111 } # check every second # add 2 points of prio if OK # 101 on master, 100 on slaves virtual_ipaddress { 192.168.70.54 } } track_script { chk_haproxy }
システムに定義されていない IP をバインドできるように、kernel レベルで非ローカルアドレスのバインドを有効化します。
sysctl.conf を開きます。
nano /etc/sysctl.conf
以下の行を追加します。
net.ipv4.ip_nonlocal_bind = 1
有効化するために以下を実行します。
sysctl -p
以下のコマンドで、keepalive を起動します。
service keepalived start
また以下を実行します。
chkconfig keepalived on
どちらのノードに仮想 IP がついているかは、以下のコマンドで確認できます。
ip addr sh eth0
正しく設定できていれば、次のように表示されます。
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 44:37:e6:dd:fa:27 brd ff:ff:ff:ff:ff:ff inet 192.168.70.71/24 brd 192.168.70.255 scope global eth0 inet 192.168.70.54/32 scope global eth0 inet6 fe80::4637:e6ff:fedd:fa27/64 scope link valid_lft forever preferred_lft forever
これで、次のようなアーキテクチャになりました。
1.6 'too many open files' 問題の回避
このエラーを回避するは、制限の設定ファイルを開きます。
nano /etc/security/limits.conf
以下の 2行を追記します。
* soft nofile 60000 * hard nofile 60000
sysctl.conf を開きます。
nano /etc/sysctl.conf
そして、以下の行を追加します。
fs.file-max = 900000
その後、以下のコマンドで有効化します。
sysctl -p
1.7 最適化
この章はオプションですが対応をお勧めします。 クラスタ動作の最適化のために設定を調整すると良いでしょう。我々は、/etc/my.cnf ファイルに以下の設定をしています。
innodb_io_capacity = 100 innodb_flush_log_at_trx_commit = 0 innodb_flush_method = O_DIRECT key_buffer = 300M innodb_buffer_pool_size = 600M innodb_log_buffer_size =32M max_allowed_packet = 64M bind-address = 0.0.0.0 innodb_lock_wait_timeout = 30 query_cache_size = 128M query_cache_limit = 2M join_buffer_size = 16M log_warnings back_log=100 max_connections=500 innodb_file_per_table
結果は以下の通りです。
最適化前:
-> Current rate: 0.82 modules/sec -> Current rate: 0.69 modules/sec -> Current rate: 0.60 modules/sec -> Current rate: 0.80 modules/sec -> Current rate: 0.81 modules/sec -> Current rate: 0.56 modules/sec
最適化後:
-> Current rate: 62.44 modules/sec -> Current rate: 61.49 modules/sec -> Current rate: 74.81 modules/sec -> Current rate: 73.90 modules/sec -> Current rate: 73.22 modules/sec -> Current rate: 77.00 modules/sec -> Current rate: 72.77 modules/sec -> Current rate: 77.10 modules/sec -> Current rate: 72.44 modules/sec -> Current rate: 69.99 modules/sec -> Current rate: 70.81 modules/sec
この設定でパフォーマンスが目立って改善していますが、利用環境は同じではないはずなので、これと同じ結果にはならない可能性があります。 これらの設定を調整することにより、さらに高いパフォーマンスを得られる可能性もあります。