Pandora: Documentation ja: Percona Cluster

From Pandora FMS Wiki
Jump to: navigation, search

Pandora FMS ドキュメント一覧に戻る

1 Percona XtraDB クラスタ

1.1 概要

このガイドの目的は、以下の図に示すようなアーキテクチャのシステムを作ることです。

Architecture.jpg

Percona クラスタがインストールされた 3つのノードがあり、それぞれ接続されています。2つのノードで、HAProxy および Keepalived がインストールされています。これが無いと node 1 で障害が発生した場合にクラスタ全体が障害となってしまいます。最初のノードは起動時にプロセス起動する必要があります。

Node123.jpg

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 は、ロードバランシングと可用性確保のために必要です。このシステムにより、最初のノードで障害が発生した場合にもう一方を利用できるようにします。

Proxyvip.jpg

アーキテクチャの図の一番上はアプリケーションを表しており、ここでは Pandora FMS です。Pandora FMS サーバ、コンソールおよび、エージェントを、Percona クラスタと共に利用します。

Pandoralogo.png


1.1.1 Percona の概要

Percona XtraDB は、オープンソースの MySQL HA ソフトウエアです。MySQL HA ソリューションを一つのパッケージにまとめた Galera ライブラリと共に、Percona サーバと Percona XtraBackup が統合されています。

Percona クラスタを使う主な利点はパフォーマンスの向上です。しかし、この利点はリニアに得られるものではありません。たとえば 3ノードのクラスタでは 3倍のパフォーマンスを得られるわけではありません。その理由の一つとしては、クラスタノード間の同期処理が必要だからです。

クラスタはノードで構成されます。最低 3つのノードでの構成が推奨されますが、2ノードでも動かすことができます。

Node123.jpg

それぞれのノードは通常の MySQL / Percona サーバ設定です。ポイントとしては、MySQL / Percona サーバをベースとして、ノードとクラスタロールに変換することです。逆に、クラスタからノードを外せば、通常のサーバとして使えます。

それぞれのノードは全データのコピーを持ちます。多くの方法で XtraDB クラスタの動作を定義しますが、それぞれあきらかに利点と欠点があります。

Cluster.png

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 root@<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.jpg

上記の図は、どのように 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 {
alvise.dorigo@pd.infn.it
}
notification_email_from noreply-keepalived-gridops@pd.infn.it
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

これで、次のようなアーキテクチャになりました。

Architecture.jpg

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

この設定でパフォーマンスが目立って改善していますが、利用環境は同じではないはずなので、これと同じ結果にはならない可能性があります。 これらの設定を調整することにより、さらに高いパフォーマンスを得られる可能性もあります。