2012年10月31日水曜日

レプリケーション設定(非同期レプリケーション)

レプリケーションの設定を行いたいと思います。
master用と、slave用のMySQLが既にインストール済みの状態から説明したいと思います。
MySQLのインストールについてはこちらを参考にしてください
(準同期レプリケーションについては、この記事の設定が終わった後にこちらを参考にしてください)

■手順1.masterの設定を変更します。
[mysqld]セクションに次の項目を追加する。
# vi /etc/my.cnf
#バイナリーログを有効化
log-bin=mysql-bin
#レプリケーション方式の選択SBRとRBRを動的に切り替える(デフォルトはMIXED)
binlog_format=MIXED
#バイナリーログファイルのサイズ
max_binlog_size=100M
#バイナリーログの有効期限
expire_logs_days=3
#1回バイナリログへ更新を行うことでディスクへのフラッシュを行う
sync_binlog=1
#InnoDBのログバッファをInnoDBログファイルに書き込むタイミングを決める
innodb_support_xa=1
#2相コミットを行うかどうか。ログをコミットごとにフラッシュしない
innodb_flush_log_at_trx_commit=1
#テーブルスペースをテーブル単位で作成する
innodb_file_per_table

MySQLレプリケーションを安全に利用するための10のテクニックからの引用になります。
5. バイナリログを同期する 適切な設定をしておかないと、サーバがクラッシュしてしまった場合などに最後にバイナリログに対して行った更新が失われてしまう場合がある。バイナリログの一部が失われてしまうと、スレーブへ更新内容を転送することが出来なくなる。そのため、マスターとスレーブでデータの食い違いが生じるので、レプリケーションは停止する。このような状況になった場合、最悪はマスターからデータのコピーをやり直す必要があるので厄介だ。そのような状況になりたくない場合には、次の設定をしておこう。 sync_binlog=1
innodb_support_xa=1
innodb_flush_logs_at_trx_commit=1

レプリケーション時のデータの整合性やクラッシュ時の事を考えるなら、上記の三つは必須項目で、
パフォーマンスを考えると場合によっては変えた方が(・∀・)イイ!!って感じかな?

my.cnf編集後に再起動を行う。
# /etc/init.d/mysqld restart
mysqld を停止中:                                           [  OK  ]
mysqld を起動中:                                           [  OK  ]
MySQLにログインして確認する
mysql> show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       126 |
| mysql-bin.000002 |       126 |
| mysql-bin.000003 |       126 |
| mysql-bin.000004 |       126 |
| mysql-bin.000005 |       126 |
| mysql-bin.000006 |       126 |
| mysql-bin.000007 |       126 |
| mysql-bin.000008 |       107 |
+------------------+-----------+
8 rows in set (0.01 sec)
mysql> show master status\G
*************************** 1. row ***************************
            File: mysql-bin.000008
        Position: 107
    Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)
■手順2.マスター上にレプリケーション用のユーザーを作成する。
スレーブが複数ある場合にはホスト名にワイルドカードを用いて、
すべてのホストからログインできる統一のレプリケーション用アカウントを作成するか、
スレーブのホストごとにユーザーを作成する必要がある。
マスターの現在のユーザーを確認する
mysql> SELECT user, host, password FROM mysql.user;
+------+-----------+----------+
| user | host      | password |
+------+-----------+----------+
| root | localhost |          |
| root | 127.0.0.1 |          |
| root | ::1       |          |
+------+-----------+----------+
3 rows in set (0.08 sec)
slaveがmasterのデータベースに接続するためslaveユーザーを作成する。
今回はslaveで共通のアカウントを利用する方法を利用しますので、
一番上のコマンドでユーザーを作成します。
#slaveごとに共通のアカウントを利用する場合、 
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%' IDENTIFIED BY '任意のパスワード';

#slaveごとにアカウントを分ける場合 
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'slaveのIPアドレス' IDENTIFIED BY '任意のパスワード';

#指定IPアドレスのネットワーク内なら全て許可(IPアドレス/255.255.255.0) 
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO slave@'指定のIPアドレス/255.255.255.0' IDENTIFIED BY '任意のパスワード';
slaveユーザー作成。
#slaveユーザー作成
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%' IDENTIFIED BY '*****';
Query OK, 0 rows affected (0.08 sec)

#権限の確認
mysql> SHOW GRANTS FOR 'slave'@'%';
+--------------------------------------------------------------------------------------------------------------------------------------+
| Grants for slave@%                                                                                                                   |
+--------------------------------------------------------------------------------------------------------------------------------------+
| GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%' IDENTIFIED BY PASSWORD '*2222CF6639797EFE06ED82985752723FE6BB0BA0' |
+--------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

#設定の反映
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
間違った権限や、情報でユーザーを作ってしまった場合には、次の手順で削除を行う。
#間違ったアカウントを作った場合には権限を全て取り上げてから削除すること全ての権限を取り上げる
mysql> REVOKE ALL ON *.* FROM 'slave'@'%';
Query OK, 0 rows affected (0.02 sec)

#権限がなくなっているか確認
mysql> SHOW GRANTS FOR 'slave'@'%';
+------------------------------------------------------------------------------------------------------+
| Grants for slave@%                                                                                   |
+------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'slave'@'%' IDENTIFIED BY PASSWORD '*2222CF6639797EFE06ED82985752723FE6BB0BA0' |
+------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

#slaveユーザー削除
mysql> DELETE FROM mysql.user WHERE USER LIKE 'slave' AND HOST LIKE '%';
Query OK, 1 row affected (0.06 sec)

#slaveユーザーが削除されているか確認
mysql> SELECT user, host, password FROM mysql.user;
+------+-----------+----------+
| user | host      | password |
+------+-----------+----------+
| root | localhost |          |
| root | 127.0.0.1 |          |
| root | ::1       |          |
+------+-----------+----------+
3 rows in set (0.00 sec)

#反映
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
■手順3.レプリケーションのテスト用にデータベース、テーブル、レコードの作成を行う。
#データベースの作成
mysql> CREATE DATABASE test;
Query OK, 1 row affected (0.01 sec)

#テーブルを選択
mysql> use test;
Database changed

#テーブルの作成
mysql> CREATE TABLE IF NOT EXISTS `user` (
    ->   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    ->   PRIMARY KEY (`id`)
    -> ) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.09 sec)

#レコードの登録
mysql> INSERT INTO user( id ) VALUES( 1 );
Query OK, 1 row affected (0.03 sec)

#データの確認
mysql> SELECT * FROM user;
+----+
| id |
+----+
|  1 |
+----+
1 row in set (0.00 sec)
■手順4.slaveのセットアップ用データとしてmasterのデータをdumpする。
# mysqldump -u root -p --all-databases --master-data=2 --single-transaction --flush-logs > /home/admin/dump_20121031_01.sql
Enter password:

#dumpファイルの確認
# ls -alt /home/admin/dump_20121031_01.sql
-rw-r--r-- 1 root root 513573 11月  1 01:03 2012 /home/admin/dump_20121031_01.sql
mysqldumpの各オプションの説明
・--all-databases
全てのデータベースからデータをdumpします。
・--master-data=2
slaveのセットアップで利用できるバイナリログのファイル名と開始位置を出力する。
・--single-transaction
利用しているストレージエンジンがInnoDBだけの場合、
このオプションを付けるだけでテーブルへの参照や更新をブロックすることなく、
コマンド開始時点のデータのスナップショットを採取することができます。
この指定が無い場合には、mysqldumpで全てのテーブルをREADロックしてしまう。
・--flush-logs
バイナリログのローテーションを行います。

■手順5.dumpファイルをslaveに転送する。
ポート番号を変更してるので-Pオプションがついてます。
#転送コマンド
scp /home/admin/dump_20121031_01.sql ユーザー名@slaveのIPアドレス:/tmp/

■手順6.手順2で作成したユーザーがslaveからログインできるかチェック。

共通のアカウント用のコマンドでslaveユーザーを作成した場合には、IPアドレスの制限などが無いので、
slaveとなるサーバーであればどのサーバーからでもログインが出来るようになっている。
slaveサーバーに移動した後に、次のコマンドを実行してみる。
# mysql -h masterのIPアドレス -u slave -p
Enter password:パスワード入力
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 231
Server version: 5.5.27-log MySQL Community Server (GPL) by Remi

Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
次のようなエラーメッセージが出る場合には、設定がうまく行えていない可能性があります。
ERROR 1130 (HY000): Host 'slaveのIPアドレスorホスト名' is not allowed to connect to this MySQL server

■手順7.slaveのmy.cnf設定

スレーブ用にmy.cnfを編集します。 [mysqld]セクションに次の項目を追加します。
vi /etc/my.cnf
#
server-id=20
#masterでSHOW SLAVE HOSTSコマンドを実行したときにスレーブの一覧が見れるように。
report_host=slave20
#書き込み禁止(SUPER権限のユーザーは書き込めてしまう)
read_only=1
#slaveの自動同期開始を無効化
skip_slave_start
#ログ関係はデフォルトだとホスト名が使われてしまうので指定しておいたほうが、
#後の管理が楽になるので指定しておく方が良いかも?
#バイナリーログのファイル名の指定。(slaveをmasterに昇格する場合など用に必要な場合のみ)
log_bin=mysql-bin
#バイナリーログを生成する場合にはこの記述も忘れずに!
#この指定がないとslave側では正しくバイナリーログが生成されない。
log_slave_updates
#リレーログのファイル名(masterから取得したバイナリーログを別名で保存したもの)
relay_log=mysql-relay-bin
#リレーログのインデックス用?のファイル名
relay-log-index==mysql-relay-bin
#テーブルスペースをテーブル単位で作成する
innodb_file_per_table

■手順8.slaveの起動を行い、リストアを行う。 slaveの同期を停止させている状態で起動する。
# /etc/init.d/mysqld start
mysqld を起動中:                                           [  OK  ]

既に一度slaveの設定がされていたり、余計なデータベースなどがある場合には削除する。
デフォルトで作られるデータベースの、
information_schema、performance_schema、mysql、testは消さない

・information_schema
INFORMATION_SCHEMAデータベースはMySQLに存在するデータベースやテーブルなどの情報を
参照するために利用できるものです

・performance_schema
実行性能に関する統計情報など?

・mysql
mysqlはアカウントユーザー情報が入っている。上書きされる。
・test
テスト用のデータベース?テーブルは無しの状態っぽい。

information_schemaデータベースは削除できないっぽい?
mysql> DROP DATABASE information_schema;
ERROR 1044 (42000): Access denied for user 'root'@'localhost' to database 'information_schema'
余計なデータベースを削除したらdumpファイルをリストアする。
mysql -u root -p --default-character-set=utf8 < /tmp/dump_20121031_01.sql
リストアしたデータが正常に登録されているか確認する。
# mysql -u root
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.02 sec)

#
mysql> use test;
Database changed

#
mysql> SELECT * FROM user;
+----+
| id |
+----+
|  1 |
+----+
1 row in set (0.00 sec)
■手順9.dumpファイルからレプリケーションの設定を情報を取得し、設定する。
次のコマンドでdumpファイルからレプリケーションの設定情報を取得する
# head -100 /tmp/dump_20121031_01.sql | grep CHANGE
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000009', MASTER_LOG_POS=107;
上記のコマンドで出力されたLOG_FILEとLOG_POSの値を、CHANGE MASTER TOのMASTER_LOG_FILE、MASTER_LOG_POSの各値に設定する。
#レプリケーションの設定
mysql> CHANGE MASTER TO
     MASTER_HOST='masterサーバーのIPアドレス',
     MASTER_USER='slaveユーザーのアカウント名',
     MASTER_PASSWORD='slaveユーザーのパスワード',
     MASTER_PORT=3306,
     MASTER_LOG_FILE='mysql-bin.000009',
     MASTER_LOG_POS=107,
     MASTER_CONNECT_RETRY=10;
Query OK, 0 rows affected (0.02 sec)
■手順10.slave起動 CHANGE MASTER TOコマンドだけではslaveの同期が開始されません
Slave_IO_Running、Slave_SQL_RunningがNoになっていると思います
#slaveのステータスを確認する
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
               Slave_IO_State:
                  Master_Host: *************
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 10
              Master_Log_File: mysql-bin.000009
          Read_Master_Log_Pos: 107
               Relay_Log_File: mysql-relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: mysql-bin.000009
             Slave_IO_Running: No
            Slave_SQL_Running: No
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 107
              Relay_Log_Space: 107
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 0
1 row in set (0.00 sec)

#slave起動
mysql> START SLAVE;
Query OK, 0 rows affected (0.02 sec)

#再度、ステータスを確認する。Slave_IO_Running、Slave_SQL_RunningがYesになっている事を確認する
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: ************
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 10
              Master_Log_File: mysql-bin.000009
          Read_Master_Log_Pos: 107
               Relay_Log_File: mysql-relay-bin.000002
                Relay_Log_Pos: 253
        Relay_Master_Log_File: mysql-bin.000009
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 107
              Relay_Log_Space: 409
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 10
1 row in set (0.00 sec)

#system userというプロセスがslaveが利用しているプロセスになりますのでkillなどで殺してはいけない。
mysql> SHOW PROCESSLIST;
+-----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------------+------------------+
| Id  | User        | Host      | db   | Command | Time | State                                                                       | Info             |
+-----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------------+------------------+
| 327 | root        | localhost | NULL | Query   |    0 | NULL                                                                        | SHOW PROCESSLIST |
| 333 | system user |           | NULL | Connect |   22 | Waiting for master to send event                                            | NULL             |
| 334 | system user |           | NULL | Connect |   22 | Slave has read all relay log; waiting for the slave I/O thread to update it | NULL             |
+-----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------------+------------------+
3 rows in set (0.00 sec)
■手順10.masterにデータを登録して同期されるか確認してみる
#masterサーバーでデータの登録する
mysql> INSERT INTO user( id ) VALUES( 2 );
Query OK, 1 row affected (0.01 sec)
mysql> SELECT * FROM user;
+----+
| id |
+----+
|  1 |
|  2 |
+----+
2 rows in set (0.00 sec)
slaveサーバーでに接続して同期されているか確認する
#slaveサーバーでデータの確認をする
mysql> SELECT * FROM user;
+----+
| id |
+----+
|  1 |
|  2 |
+----+
2 rows in set (0.00 sec)
以上でレプリケーションの設定は完了です(`・ω・´)ゞビシッ!! 今回利用したmater,slaveの設定ファイルはこちらになります。
master側のmy.cnf
# Example MySQL config file for large systems.
#
# This is for a large system with memory = 512M where the system runs mainly
# MySQL.
#
# MySQL programs look for option files in a set of
# locations which depend on the deployment platform.
# You can copy this option file to one of those
# locations. For information about these locations, see:
# http://dev.mysql.com/doc/mysql/en/option-files.html
#
# In this file, you can use all long options that a program supports.
# If you want to know which options a program supports, run the program
# with the "--help" option.

# The following options will be passed to all MySQL clients
[client]
#password       = your_password
port            = 3306
socket          = /var/lib/mysql/mysql.sock

#文字コードをUTF-8
default-character-set=utf8

# Here follows entries for some specific programs

# The MySQL server
[mysqld]
port            = 3306
socket          = /var/lib/mysql/mysql.sock
skip-external-locking
key_buffer_size = 256M
max_allowed_packet = 1M
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 16M
# Try number of CPU's*2 for thread_concurrency
thread_concurrency = 8

#文字コードをUTF-8
character-set-server=utf8

# Don't listen on a TCP/IP port at all. This can be a security enhancement,
# if all processes that need to connect to mysqld run on the same host.
# All interaction with mysqld must be made via Unix sockets or named pipes.
# Note that using this option without enabling named pipes on Windows
# (via the "enable-named-pipe" option) will render mysqld useless!
#
#skip-networking

# Replication Master Server (default)
# binary logging is required for replication
#バイナリーログを有効化
log-bin=mysql-bin

#エラーログを有効化
log-error = mysql-error.log

#バイナリーログの有効期限
expire_logs_days=31

#1回バイナリログへ更新を行うことでディスクへのフラッシュを行う
sync_binlog=1

#InnoDBのログバッファをInnoDBログファイルに書き込むタイミングを決める
innodb_support_xa=1

#2相コミットを行うかどうか。ログをコミットごとにフラッシュしない
innodb_flush_log_at_trx_commit=1

# binary logging format - mixed recommended
binlog_format=mixed

# required unique id between 1 and 2^32 - 1
# defaults to 1 if master-host is not set
# but will not function as a master if omitted
#サーバーの識別ID(ユニークな値にする)
server-id       = 10

# Replication Slave (comment out master section to use this)
#
# To configure this host as a replication slave, you can choose between
# two methods :
#
# 1) Use the CHANGE MASTER TO command (fully described in our manual) -
#    the syntax is:
#
#    CHANGE MASTER TO MASTER_HOST=<host>, MASTER_PORT=<port>,
#    MASTER_USER=<user>, MASTER_PASSWORD=<password> ;
#
#    where you replace <host>, <user>, <password> by quoted strings and
#    <port> by the master's port number (3306 by default).
#
#    Example:
#
#    CHANGE MASTER TO MASTER_HOST='125.564.12.1', MASTER_PORT=3306,
#    MASTER_USER='joe', MASTER_PASSWORD='secret';
#
# OR
#
# 2) Set the variables below. However, in case you choose this method, then
#    start replication for the first time (even unsuccessfully, for example
#    if you mistyped the password in master-password and the slave fails to
#    connect), the slave will create a master.info file, and any later
#    change in this file to the variables' values below will be ignored and
#    overridden by the content of the master.info file, unless you shutdown
#    the slave server, delete master.info and restart the slaver server.
#    For that reason, you may want to leave the lines below untouched
#    (commented) and instead use CHANGE MASTER TO (see above)
#
# required unique id between 2 and 2^32 - 1
# (and different from the master)
# defaults to 2 if master-host is set
# but will not function as a slave if omitted
#server-id       = 2
#
# The replication master for this slave - required
#master-host     =   <hostname>
#
# The username the slave will use for authentication when connecting
# to the master - required
#master-user     =   <username>
#
# The password the slave will authenticate with when connecting to
# the master - required
#master-password =   <password>
#
# The port the master is listening on.
# optional - defaults to 3306
#master-port     =  <port>
#
# binary logging - not required for slaves, but recommended
#log-bin=mysql-bin

# Uncomment the following if you are using InnoDB tables
#innodb_data_home_dir = /var/lib/mysql
#innodb_data_file_path = ibdata1:10M:autoextend
#innodb_log_group_home_dir = /var/lib/mysql
# You can set .._buffer_pool_size up to 50 - 80 %
# of RAM but beware of setting memory usage too high
#innodb_buffer_pool_size = 256M
#innodb_additional_mem_pool_size = 20M
# Set .._log_file_size to 25 % of buffer pool size
#innodb_log_file_size = 64M
#innodb_log_buffer_size = 8M
#innodb_flush_log_at_trx_commit = 1
#innodb_lock_wait_timeout = 50

#DNS逆引きを無効化
skip-name-resolve

#簡単な目安としてサーバーに積んであるメモリの50%~80%を指定するの(・∀・)イイ!!らしいです。
innodb_buffer_pool_size = 256M

#ログファイルのバッファサイズ
innodb_log_buffer_size = 16M

#ログファイルのサイズ
innodb_log_file_size = 128M

#ログファイルを作成する数
innodb_log_files_in_group = 2

#デフォルトのままで。(自動拡張有効で、初期化で10MBの領域を確保する)
innodb_data_file_path = ibdata1:10M:autoextend

#拡張時に64MBの領域を確保する
innodb_autoextend_increment=64

#ibdataの肥大化対策用にテーブルスペースをテーブル単位で作成する
#(innodb_file_per_tableを利用する場合にはinnodb_log_group_home_dirは設定してはいけない)
innodb_file_per_table

[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash
# Remove the next comment character if you are not familiar with SQL
#safe-updates

#文字コードをUTF-8
default-character-set=utf8

[myisamchk]
key_buffer_size = 128M
sort_buffer_size = 128M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout

slave側のmy.cnf
# Example MySQL config file for large systems.
#
# This is for a large system with memory = 512M where the system runs mainly
# MySQL.
#
# MySQL programs look for option files in a set of
# locations which depend on the deployment platform.
# You can copy this option file to one of those
# locations. For information about these locations, see:
# http://dev.mysql.com/doc/mysql/en/option-files.html
#
# In this file, you can use all long options that a program supports.
# If you want to know which options a program supports, run the program
# with the "--help" option.

# The following options will be passed to all MySQL clients
[client]
#password       = your_password
port            = 3306
socket          = /var/lib/mysql/mysql.sock

#文字コードをUTF-8
default-character-set=utf8

# Here follows entries for some specific programs

# The MySQL server
[mysqld]
port            = 3306
socket          = /var/lib/mysql/mysql.sock
skip-external-locking
key_buffer_size = 256M
max_allowed_packet = 1M
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 16M
# Try number of CPU's*2 for thread_concurrency
thread_concurrency = 8

#文字コードをUTF-8
character-set-server=utf8

# Don't listen on a TCP/IP port at all. This can be a security enhancement,
# if all processes that need to connect to mysqld run on the same host.
# All interaction with mysqld must be made via Unix sockets or named pipes.
# Note that using this option without enabling named pipes on Windows
# (via the "enable-named-pipe" option) will render mysqld useless!
#
#skip-networking

# Replication Master Server (default)
# binary logging is required for replication
#バイナリーログを有効化
log-bin=mysql-bin

#エラーログを有効化
log-error = mysql-error.log

#バイナリーログの有効期限
expire_logs_days=31

#1回バイナリログへ更新を行うことでディスクへのフラッシュを行う
sync_binlog=1

#InnoDBのログバッファをInnoDBログファイルに書き込むタイミングを決める
innodb_support_xa=1

#InnoDBのログバッファをInnoDBログファイルに書き込むタイミングと、
#InnoDBログファイルをディスクにフラッシュするタイミングの設定
innodb_flush_log_at_trx_commit=1

# binary logging format - mixed recommended
binlog_format=mixed

# required unique id between 1 and 2^32 - 1
# defaults to 1 if master-host is not set
# but will not function as a master if omitted
#サーバーの識別ID(ユニークな値にする)
server-id       = 20

# Replication Slave (comment out master section to use this)
#
# To configure this host as a replication slave, you can choose between
# two methods :
#
# 1) Use the CHANGE MASTER TO command (fully described in our manual) -
#    the syntax is:
#
#    CHANGE MASTER TO MASTER_HOST=<host>, MASTER_PORT=<port>,
#    MASTER_USER=<user>, MASTER_PASSWORD=<password> ;
#
#    where you replace <host>, <user>, <password> by quoted strings and
#    <port> by the master's port number (3306 by default).
#
#    Example:
#
#    CHANGE MASTER TO MASTER_HOST='125.564.12.1', MASTER_PORT=3306,
#    MASTER_USER='joe', MASTER_PASSWORD='secret';
#
# OR
#
# 2) Set the variables below. However, in case you choose this method, then
#    start replication for the first time (even unsuccessfully, for example
#    if you mistyped the password in master-password and the slave fails to
#    connect), the slave will create a master.info file, and any later
#    change in this file to the variables' values below will be ignored and
#    overridden by the content of the master.info file, unless you shutdown
#    the slave server, delete master.info and restart the slaver server.
#    For that reason, you may want to leave the lines below untouched
#    (commented) and instead use CHANGE MASTER TO (see above)
#
# required unique id between 2 and 2^32 - 1
# (and different from the master)
# defaults to 2 if master-host is set
# but will not function as a slave if omitted
#server-id       = 2
#
# The replication master for this slave - required
#master-host     =   <hostname>
#
# The username the slave will use for authentication when connecting
# to the master - required
#master-user     =   <username>
#
# The password the slave will authenticate with when connecting to
# the master - required
#master-password =   <password>
#
# The port the master is listening on.
# optional - defaults to 3306
#master-port     =  <port>
#
# binary logging - not required for slaves, but recommended
#log-bin=mysql-bin

# Uncomment the following if you are using InnoDB tables
#innodb_data_home_dir = /var/lib/mysql
#innodb_data_file_path = ibdata1:10M:autoextend
#innodb_log_group_home_dir = /var/lib/mysql
# You can set .._buffer_pool_size up to 50 - 80 %
# of RAM but beware of setting memory usage too high
#innodb_buffer_pool_size = 256M
#innodb_additional_mem_pool_size = 20M
# Set .._log_file_size to 25 % of buffer pool size
#innodb_log_file_size = 64M
#innodb_log_buffer_size = 8M
#innodb_flush_log_at_trx_commit = 1
#innodb_lock_wait_timeout = 50

#DNS逆引きを無効化
skip-name-resolve

#簡単な目安としてサーバーに積んであるメモリの50%~80%を指定するの(・∀・)イイ!!らしいです。
innodb_buffer_pool_size = 256M

#ログファイルのバッファサイズ
innodb_log_buffer_size = 16M

#ログファイルのサイズ
innodb_log_file_size = 128M

#ログファイルを作成する数
innodb_log_files_in_group = 2

#デフォルトのままで。(自動拡張有効で、初期化で10MBの領域を確保する)
innodb_data_file_path = ibdata1:10M:autoextend

#拡張時に64MBの領域を確保する
innodb_autoextend_increment=64

#ibdataの肥大化対策用にテーブルスペースをテーブル単位で作成する
#(innodb_file_per_tableを利用する場合にはinnodb_log_group_home_dirは設定してはいけない)
innodb_file_per_table

###########
# slave用の設定
###########
#masterでSHOW SLAVE HOSTSコマンドを実行したときにスレーブの一覧が見れるように。
report_host=slave20

#書き込み禁止(SUPER権限のユーザーは書き込めてしまう)
read_only=1

#slaveの自動同期開始を無効化
skip_slave_start

#バイナリーログを生成する場合にはこの記述も忘れずに!
#この指定がないとslave側では正しくバイナリーログが生成されない。
#ただし、マスターの予備用として出力しておくのはダメ。
#log_slave_updates

#リレーログのファイル名(masterから取得したバイナリーログを別名で保存したもの)
relay-log=mysql-relay-bin

#リレーログのインデックス用?のファイル名
relay-log-index==mysql-relay-bin

[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash
# Remove the next comment character if you are not familiar with SQL
#safe-updates

#文字コードをUTF-8
default-character-set=utf8

[myisamchk]
key_buffer_size = 128M
sort_buffer_size = 128M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout

zabbix_agentの設定(zabbixサーバー側のホスト設定)

前回の記事で、監視対象のサーバー側の設定は完了しましたが、
zabbixのWebインターフェースで見えるようにするには、こちら側の設定も必要になります。
zabbixにログインしたら次の手順で設定を行います。

1.「設定」→「ホスト」でホスト一覧を表示する。
2.右の方に「ホストの作成」を押すと、新規作成画面が表示される。
3.ホストの設定で、各項目を次のように入力する。


・名前には、ホスト一覧で表示される名前になりますので、分かりやすい名前をつける。
・グループには、既に存在するグループと同じものがあれば、その他のグループから選択して、「<<」を押してグループに追加します。
・新規のグループとして追加したい場合には、新規ホストグループにグループ名を入力します。
・IPアドレスには、監視対象サーバーのIPアドレスを入力します。
・リンクしているテンプレートの枠の追加を押すと、ポップアップが表示されるので、その中から追加するテンプレートを追加する。
 今回はとりあえず、Webサーバーの監視なので、Template_App_httpdと、Template_OS_Linuxを設定しておきます。
 (テンプレートが表示されていない場合には、右上のプルダウンから「全て」を選択すると出てくるかもしれません)
 Template_App_httpdが見当たらない方は、テンプレートが追加されていない可能性があるので、
 こちらの記事を参考に追加してみてください。

今回は次のように入力しました。

4.保存を押して、設定を保存して、ホスト一覧で設定したい内容が追加されているか確認する。
 (ステータスが有効になっていることと、エージェントの状態が緑色になっていれば正常に動作しています)

以上です(`・ω・´)ゞビシッ!!

zabbix_agentの設定(監視対象サーバー側の設定)

監視対象サーバーの情報を収集するために、対象サーバーにzabbix_agentをインストールする必要があります。
まずは、RPMのダウンロード
#ダウンロード
wget http://www.zabbix.jp/binaries/relatedpkgs/rhel6/x86_64/zabbix-jp-release-6-5.noarch.rpm
RPMをインストールする。
# rpm -ihv zabbix-jp-release-6-5.noarch.rpm
バージョンの確認
# alternatives --display zabbix-jp-release
zabbix-jp-release -ステータスは自動です。
リンクは現在 /usr/share/zabbix-jp-release/zabbix-jp-1.8.repo を指しています。
/usr/share/zabbix-jp-release/zabbix-jp-1.1.repo - 優先項目 10
/usr/share/zabbix-jp-release/zabbix-jp-1.4.repo - 優先項目 20
/usr/share/zabbix-jp-release/zabbix-jp-1.6.repo - 優先項目 30
/usr/share/zabbix-jp-release/zabbix-jp-1.8.repo - 優先項目 40
現在の「最適」バージョンは /usr/share/zabbix-jp-release/zabbix-jp-1.8.repo です。
zabbix_agentをインストールする。
# yum install zabbix-agent
zabbix_agentd.confは、スタンドアロンで動作するものと、
xinetdを経由で動作するzabbix_agentの2種類ある。

xinetd経由のzabbix_agentはログ監視機能が利用できないなどいくつかの制限がある。
基本的にスタンドアロンのzabbix_agentdを利用する。
設定ファイルの編集
# vi /etc/zabbix/zabbix_agentd.conf

#48行目に次の行を追加。デバッグログの出力設定。必要なければ設定しない。
DebugLevel=4

#86行目のServerに、zabbix_serverのIP アドレスを指定する(複数ある場合にはカンマ区切りで)
Server=zabbixサーバーのIPアドレス

#109行目のHostnameに自身のhostnameを設定。zabbixエージェントのアクティブチェックを利用する場合には必須。
Hostname=hoge.hogehoge.com

#134行目のListenIPに監視対象サーバー自身のIPアドレスを指定する
ListenIP=監視対象サーバー自身のIPアドレス
zabbix_agentを起動する
# /etc/init.d/zabbix-agent start
Starting zabbix agent:                                     [  OK  ]

#確認
# /etc/init.d/zabbix-agent status

#自動起動設定
chkconfig zabbix-agent on
停止方法は次のコマンドになります。
# /etc/init.d/zabbix-agent stop
Shutting down zabbix agent:                                [  OK  ]
zabbix_agentのログファイルの場所はこちら。
view /var/log/zabbix/zabbix_agentd.log
以上(`・ω・´)ゞビシッ!!
参考URL

2012年10月30日火曜日

監視テンプレート追加

ZABBIX-JPからの引用になります。
Zabbixはアイテム、トリガー、グラフの設定をテンプレートとして管理し、テンプレートをホストに適用することで監視設定を容易に管理することができます。 テンプレートはXML形式のファイルでエクスポート/インポートすることができるようになっているため、バックアップの取得や他のZabbixサーバへの再利用したり、インターネット上で公開されているテンプレートを利用して設定を簡略化することができます。 ここではインターネット上で公開されているテンプレートやテンプレートに関連する情報をまとめています。
ZABBIX-JPで提供されているテンプレートは次のものになります
Template_OS_Linux
Template_App_bind
Template_App_cupsd
Template_App_dhcpd
Template_App_httpd
Template_App_ldap
Template_App_postfix
Template_App_samba
Template_App_sshd
Template_JP_App_mysqld


早速ダウンロードして使おうかと思ったら・・・一部リンク先がNOT FOUND・・・orz

まず、ダウンロードしたファイルを追加してみます。
「設定」→「テンプレート」→「テンプレートのインポート」を押します。
先程ダウンロードしてきたテンプレートファイルを一つずつ選択して、インポートを行います。

インポート時に、いくつかのテンプレートで、次のようなエラーが発生しますが気にしないで大丈夫みたいです。
Undefined index: ymin_type[/usr/share/zabbix/include/export.inc.php:1352]
Undefined index: ymax_type[/usr/share/zabbix/include/export.inc.php:1365]
Undefined index: graphtype[/usr/share/zabbix/api/classes/class.cgraph.php:1062]

■追加したテンプレートをZabbix_serverに適用してみる。
1.上部メニューの「設定」→「ホスト」でホスト一覧からZabbix_serverを選択する。
2.「リンクしているテンプレート」の追加を押すと、ポップアップでテンプレート一覧が表示される
※デフォルトでは「リンクしているテンプレート」の枠内に、「Template_Linux」がある。
その際に右上にあるグループのプルダウンで、「全て」が選択されていない場合には選択する
3.追加したいテンプレートのチェックボックスを選択する。今回は「Template_App_httpd」を追加してみます

参考URL

DNSゾーン設定

  • IPアドレスとホスト名の関連付け


SOAレコード
$TTL 600
@ IN SOA NS1.DO-REG.JP. root.example.com. (
     1210301700 ; Serial
     10800 ; Refresh 3 hour
     3600 ; Retry 1 hour
     360000 ; Expire 100 hours
     3600 ; Minium 1 hours
     )

★ゾーンファイルを更新する際は、Serial値を前回より大きい値にしないと更新されない。

1207271500 ; Serial・・・12年07月27日15時00分

1210301400 ; Serial・・・12年10月30日14時00分

YYMMDDHHMM形式で管理
本来はYYYYMMDDnn(nnは当該日の連番)が推奨のようです。


2012110801 ; Serial・・・2012年11月08日01連番に変更


$TTL 600
@ IN SOA NS1.DO-REG.JP. root.example.com. (
     1210301700 ; Serial
;     10800 ; Refresh 3 hour
;     3600 ; Retry 1 hour
     1800 ; Refresh 30min
     900 ; Retry 15min
     360000 ; Expire 100 hours
     3600 ; Minium 1 hours
     )

★Refresh / Retryの値を下げると、設定反映までの時間が早くなる。
;は、コメント行


---------------------------------------------------------------------
Aレコード、CNAMEレコード

先頭のホスト名指定なしは、wwwなしのドメイン
   IN A XXX.XXX.XXX.103
example.com = XXX.XXX.XXX.103


IPは一番後ろにピリオド必要なし
www  IN A XXX.XXX.XXX.103
www.example.com = XXX.XXX.XXX.103


ドメインの場合?は一番後ろにピリオドが必要
CNAMEは別名
大文字はエラーになるようです(lbvIP01反映されず、lbvip01で反映された)
staging  IN CNAME web01.example.com.
staging.example.com = web01.example.com


ピリオドが無いとexample.comが付与される?
試してないが↑と↓は一緒かも
staging  IN CNAME web01

@IT:メール/Webサーバを効率的に動かすゾーン設定(1/2)からの引用になります。
CNAMEは便利ですが、小規模なサイトであれば、CNAMEよりも複数のAレコードを用いた方が問い合わせの負荷を減らすことができます。あるクライアントがwww.example.jpを問い合わせてきたとき、それがCNAMEの場合はいったん正規のホスト名(この場合はhost1.example.jp)を調べ、その後正規ホストのIPアドレスをクライアントに返します。つまり、ゾーンファイルを2回参照することになります。もし、www.example.jpをAレコードで定義していれば、ゾーンファイルの参照は1回で済みます。


DNSラウンドロビンにする場合は、TTL値(↓60)が必要っぽい
TTL値なしだと反映されず!

www  60 IN A XXX.XXX.XXX.103
www  60 IN A XXX.XXX.XXX.143

---------------------------------------------------------------------
nslookup(WindowsPC)で設定情報を確認する
Aレコード
C:\>nslookup example.net
MXレコード
C:\>nslook
C:\>set type=mx
C:\>mail.example.net
SPFレコード
C:\>nslookup -type=TXT mail.example.net
NSレコード
C:\>nslook
C:\>set type=ns
C:\>mail.example.net
SOAレコード
C:\>nslook
C:\>set type=soa
C:\>mail.example.net
---------------------------------------------------------------------
◆Doレジ 管理画面 手順

1.Doレジ 会員専用ページへログイン
https://regist.do-reg.jp/login.reg

2.左カラムメニューの[オプションサービス][DNSサービス]リンクをクリックする

3.■ご利用ドメイン一覧の[DNSゾーン設定]ボタンをクリックする

4.■上級者向け設定モードの[ゾーンファイルのアップロード]ボタンをクリックする

5.■記述例の下の[現在のDNSゾーン設定確認]ボタンをクリックする

6.表示された設定情報の「zoneファイル内容」の下($TTL以降)をコピーしテキストファイルに保存する
(ファイル名は何でも良い)

7.テキストファイルの設定情報を更新する。記述はBIND9形式。最後にSerialの数値を上げる

8.■ゾーンファイルアップロードフォームの[参照]ボタンから更新したテキストファイルを指定し[次へ]ボタンをクリックする

9.内容を確認して[この内容で設定する]ボタンをクリックする

---------------------------------------------------------------------
参考URL

障害通知メール設定その2

前回からの続きになります。
■通知メール設定

通知メールの設定はメディアタイプとユーザーの設定を行うことで、
メールが送信されるようになります。

上部のメニューから「管理」→「メディアタイプ」をクリックした後に、
メディアタイプ一覧から「Email」をクリックする。

メディアタイプの設定を次のようにする
※sendmailが起動している場合。外部メールサーバーなどを利用する場合にそちらの環境にあわせる。
ただし、SMTP AuthやSMTPSなどには対応していないそうです
説明:Email
タイプ:メール
SMTPサーバー:localhost
SMTP helo:localhost
送信元メールアドレス:zabbix@localhost

■ユーザーの設定

インストール直後には、admin,guestユーザが作成されている。
上部のメニューから「管理」→「ユーザ」をクリックした後に、
右側にあるプルダウンから「ユーザ」を選ぶ。

そうすると、次のような画面が表示されます。

その中からアカウント名のAdminをクリックすると
Adminの設定画面が開きます。

メディアの項目にある、追加を押すと新規メディアの登録画面が開きます。
そこで、タイプをEmailを選択して、送信先に障害時などに受け取りたいメールアドレスを記述します。
有効な時間帯は、障害時発生時に通知を受け取る時間帯になります。
デフォルトで入ってるのは、「1-7,00:00-24:00;」で、カンマの前半が曜日の指定で、後半が時間指定になる。
デフォルトの設定は全ての曜日を24時間を対象とする設定になっている。
;セミコロンで一つの定義になるため、複数定義したい場合には;で区切ること。
前半の日付は、1:月曜日、2:火曜日...7:日曜日の値を利用する。
後半の時間は、MM/HHで指定する。2桁表記。
たとえば、「1-2,10:00-24:00;6-7,10:00-20:00;」の表記は
月曜日、火曜日の10時から24時までと、土曜日と、日曜日の10時から20時までを対象とする定義になります。

入力が終わったら、追加を押してメディアの登録が完了になります。
(※まだ設定は保存されていません。)
ユーザの設定画面に戻った時に、

メディアの欄に先程設定した内容が追加されていると思います。
この画面で保存を押すと、先程設定したメディアが保存されて反映されます。
※Adminユーザーのパスワードがデフォルトのままであればついでに、
任意のパスワードに変更しておきましょう

■障害通知メールの確認

次は、上記で設定した障害通知メールが正常に動作するか確認してみます。

zabbix-serverでは、/etc/passwordファイルのチェックサムを監視するアイテム設定と、
チェックサムの値が前回取得値と異なった場合に、障害と検知するトリガーが設定されているらしいです。
なのでユーザーの追加を行うと障害として検知されるので、それを利用して障害を発生させてみる。

useradd testuser

/etc/passwordのチェックサム監視は10分間隔で行うように設定されているため、
検知されるまで少し時間がかかるそうです。


イベント発生時に、アクションの欄が失敗になっている場合には、メール送信が失敗している。

失敗しているイベントの時間の項目にあるリンクをクリックすると、
そのイベントの詳細が見れるの確認してみる。
イベントの詳細画面でメッセージアクション内にエラー内容が表示されている。 今回は次のようなエラーが発生していました。
cannot connect to SMTP server [localhost]: *** Cannot connect to [[localhost]:25]: [111] Connection refused

とりあえず、このエラーを回避する為に、先程設定したメディアタイプの設定を変更します。
メニューの「管理」→「メディアタイプ」のEmailの設定を「localhost」から127.0.0.1に変更すれば解決しました。
根本的に解決するには、サーバーにIPv6用の設定をする、あIPv6を無効にする方法があるみたいです。

正常にメールが送信された時のイベント詳細画面はこちらのようになります。

■障害通知の流れ。

1.アイテム設定で各ホストからステータス情報を収集し、データベースに保存する。
2.収集したデータを元に、トリガーで設定されている条件を元に、状態が変更された場合にイベントを生成する。
3.イベントが生成された際に、設定されているアクションが実行される。

という流れなのかな・・・?

アイテム設定で収集されたデータの最新データは「監視データ」→「最新データ」で確認ができる。
トリガーでステータスが変わったものは「監視データ」→「トリガー」で確認できる。
トリガーによって発生したイベントは「監視データ」→「イベントで確認できる。

参考URL

障害通知メール設定その1

■zabbixサーバー起動
zabbixサーバーが起動している確認する

# ps axu|grep -i [z]abbix
zabbix   11298  0.0  0.0  45876   888 ?        S    13:19   0:00 /usr/sbin/zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf
zabbix   11300  0.0  0.0  45876  1028 ?        S    13:19   0:00 /usr/sbin/zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf
zabbix   11301  0.0  0.0  45888  1180 ?        S    13:19   0:00 /usr/sbin/zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf
zabbix   11302  0.0  0.0  45888  1168 ?        S    13:19   0:00 /usr/sbin/zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf
zabbix   11303  0.0  0.0  45888  1180 ?        S    13:19   0:00 /usr/sbin/zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf
zabbix   11304  0.0  0.0  45876   908 ?        S    13:19   0:00 /usr/sbin/zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf
zabbix   11418  0.0  0.1 152720  2740 ?        S    14:52   0:00 zabbix_server -c /etc/zabbix/zabbix_server.conf
zabbix   11420  0.0  0.1 152792  2276 ?        S    14:52   0:00 zabbix_server -c /etc/zabbix/zabbix_server.conf
zabbix   11421  0.0  0.0 152720  1964 ?        S    14:52   0:00 zabbix_server -c /etc/zabbix/zabbix_server.conf
zabbix   11422  0.0  0.1 250624  3980 ?        S    14:52   0:00 zabbix_server -c /etc/zabbix/zabbix_server.conf
zabbix   11423  0.0  0.1 250624  3952 ?        S    14:52   0:00 zabbix_server -c /etc/zabbix/zabbix_server.conf
起動していなければ起動させる。
# service zabbix-server start
Starting zabbix server:                                    [  OK  ]
次はWebインターフォース側の設定を行うので、zabbixにログインする。

デフォルトでは監視が無効になっているので有効化を行います。
上部のメニューから「設定」→「ホスト」をクリックした後に、
ホストの設定一覧から、Zabbix_serverの行のステータスという項目を見つけて、
無効になっているのでクリックして有効化する。
これで、監視が開始されます。

■アクションの設定
デフォルトではアクションが設定されていないので設定を行う。
「設定」→「アクション」をクリックして、右側にあるプルダウンからトリガーを選択する。
その後に、同じく右側にあるアクションを作成を押すと、アクションの設定画面が表示されます。
アクション、アクションのコンディション、アクションのオペレーションの各枠の各項目に次の内容を設定する。

・アクション枠
1.各項目に次の設定を行う。 名前:ZabbixServerの障害通知テスト
イベントソース:トリガー
エスカレーション:未選択
デフォルトの件名:{TRIGGER.NAME}:{STATUS}
リカバリーメッセージ:未選択
ステータス:有効

・アクションのコンディション枠
1.コンディション(A),(B)の横にあるチェックボックスを選択して、右下にある削除を押して削除する。
2.アクションのコンディション枠内が未設定になるので、アクションのコンディション枠の新規を押す。
3.新規コンディションの枠が作られるので、その枠に内にある一番左側のプルダウンからホストを選択する。右側にあったテキストエリアの右側に選択ボタンが表示される
4.右側にある選択ボタンをクリックすると、現在のホスト一覧がポップアップで表示されるので、一覧からZabbix_serverを選択すると、ポップアップが閉じます。
5.新規コンディションの枠内の、選択ボタンの横に先程選択したZabbix_serverが表示されたことを確認する。
6.新規コンディション枠内の追加を押すと、アクションのコンディションの枠内に設定内容が反映されます。
7.再度、アクションのコンディションの新規を押すと、また新規コンディションの枠が作られるので、一番左側のプルダウンでトリガーの値を選択する。
8.右側にあるプルダウンを正常から障害に選択して、追加を押すとアクションのコンディションに追加した内容が反映される。

・アクションのオペレーション枠
1.新規を押すと、オペレーションの編集の枠が新たに表示される。

2.オペレーションの編集の各項目を次のように設定する。
オペレーションのタイプ:メッセージ送信
メッセージの送信先:シングルユーザ
※メッセージの送信先でシングルユーザーを選んだ後に、選択を押して、ユーザー一覧のポップアップがでるので、その中からAdminを選択する
次のメディアのみ使用:全て
デフォルトメッセージ:チェックボックスを選択

3.追加を押すと、アクションのオペレーションの枠内に設定が追加される。

最後に、アクション枠内の保存を押して設定完了です。

これでZabbixサーバーに設定されているトリガーの状態がが正常、障害に切り替わった場合に、
Adminユーザーにメッセージを送信する設定になります。

次は、実際にメールが送信される際の設定に成ります。

2012年10月20日土曜日

MySQLバイナリーログ

■MySQLバイナリーログについて

バイナリーログは更新系のログが記述されていくもので、
自動削除設定をしない限りは自動で消えないため、どんどん増えていってしまいます。

レプリケーション時には、このバイナリーログをマスターからスレーブが参照して、
自身のサーバーに持って行き、バイナリーログを実行することで同期を行っていますので、
レプリケーション時には必要なログになります。

もし、レプリケーションを行ってい無い場合で、何かあった時に調査もしなくて(・∀・)イイ!!
とかであれば、バイナリーログの出力自体を止めてしまうのもありかと思います( ̄ー ̄)ニヤリ
レプリケーション以外の用途としては、差分バックアップやリストア(ロールフォワードリカバリ)用途に利用できます。

削除の手段としては、手動でコマンドを実行する方法と、my.cnfに設定して自動で消す方法があります。
まずは、手動でコマンドを実行する方法をおこなっていみたいと思います

現在、存在しているバイナリーログを確認しています。
■バイナリーログが設定されているか確認
mysql> SELECT @@log_bin;
+-----------+
| @@log_bin |
+-----------+
|         1 |
+-----------+
1 row in set (0.01 sec)
1ならバイナリーログが有効になっています。
my.cnfの設定では、log-binが設定されていたら有効になっています。
view /etc/my.cnf
#バイナリーログ出力
log-bin=mysql-bin
■現在のバイナリログファイル一覧を確認
SHOW BINARY LOGS;
または
SHOW MASTER LOGS;

+------------------+------------+
| Log_name         | File_size  |
+------------------+------------+
| mysql-bin.000001 |      27287 |
| mysql-bin.000002 |    1031892 |
| mysql-bin.000003 |        271 |
| mysql-bin.000004 |        126 |
| mysql-bin.000005 |        126 |
:
:
:
| mysql-bin.000224 | 1074266518 |
| mysql-bin.000225 | 1073768399 |
| mysql-bin.000226 | 1074062569 |
| mysql-bin.000227 | 1073853832 |
| mysql-bin.000228 | 1073833840 |
| mysql-bin.000229 | 1073855601 |
| mysql-bin.000230 |  624410684 |
+------------------+------------+

たまっているバイナリーログを消す場合には、
次のコマンドを実行することで、最新バイナリーログ以外を全て自動で削除してくれます
PURGE MASTER LOGS BEFORE now();
もし、特定のファイルを指定して、それよりか古いファイルを消す場合には、
次の記述で行えます。(例では、mysql-bin.000010より若い番号のログが全て消えてしまいます)
PURGE MASTER LOGS TO 'mysql-bin.000010';
レプリケーション時に、マスターのバイナリーログを消す場合には注意が必要かも?
たとえば、スレーブ側で遅延が発生している場合に、
マスターのバイナリーログをまだスレーブ側が取得していない場合に消してしまった場合に、
同期がとれなくなる?
■my.cnfによる自動削除
my.cnfに「expire_logs_days」の項目を追加すると、
指定した日数を経過したバイナリーログを削除してくるようになります

10日を経過したバイナリーログを消す場合には、次のように記述します。
expire_logs_days = 10
データベースを止めずに反映させる場合には、
mysql> SET GLOBAL expire_logs_days = 10;

#確認する
SELECT @@expire_logs_days;
バイナリーログのローテーションは
mysql再起動や、FLUSH LOGS文の実効時、新たなバイナリログーが作られた時とかにも実行されてしまいます。

■番外編
とある案件で、zabbixを導入しているサーバーで、
zabbixが使っているMySQLのバイナリーログがHDDを圧迫して100%になってしまいました( ゚д゚)ポカーン

HDDが100%なんて初めて見たなので、戸愚呂120%的な意味かと思いワクテカしていたら、
MySQLにすらログイン出来ないという状況になっていて焦りましガ━━(;゚Д゚)━━ン!!

ログインが出来ないとPURGEコマンドによる削除が行えない・・・orz

仕方ないのでバイナリーログをrmコマンドで消しHDDの圧迫を解消し、
MySQLにログイン後にバイナリーログ一覧を見てみると、
実ファイルは既にrmコマンドでなくなっているのにも関わらず、
File_seizeの項目が全て0になってしまっていて、一覧にその名前が残っていたままでした。

mysql-bin.00108*番台のバイナリーログを全て削除
rm -rf ./mysql-bin.00108*
MySQlにログインして確認してみる。
mysql> SHOW BINARY LOGS;
+------------------+------------+
| Log_name         | File_size  |
+------------------+------------+
| mysql-bin.001081 |          0 |
| mysql-bin.001082 |          0 |
| mysql-bin.001083 |          0 |
| mysql-bin.001084 |          0 |
| mysql-bin.001085 |          0 |
| mysql-bin.001086 |          0 |
| mysql-bin.001087 |          0 |
| mysql-bin.001088 |          0 |
| mysql-bin.001089 |          0 |
| mysql-bin.001090 |          0 |
| mysql-bin.001091 | 1073744240 |
| mysql-bin.001092 |   12358066 |
+------------------+------------+
0byteファイル(゚∀゚)キタコレ!!
気持ち悪かったので、PURGEを実行してみると、
綺麗に一覧から消えてスッキリしましたド━━━━m9(゚∀゚)━━━━ン!!
mysql>  PURGE MASTER LOGS before now();
Query OK, 0 rows affected, 20 warnings (3.02 sec)

mysql> SHOW BINARY LOGS;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.001092 |  12553967 |
+------------------+-----------+
1 row in set (0.00 sec)
もしかしたらflush logs;でも治ったかも!?(゚д゚)(。_。)(゚д゚)(。_。) ウンウン
そもそも、zabbixサーバーのMySQLはレプリケーションを行っていないので、
バイナリーログを出力しない設定にすれば良かったのかといまさら思いました・・・orz
バイナリーログの設定には次の項目もあるみたいです。
#バイナリログ出力先
log_bin                 = /var/log/mysql/mysql-bin.log
#フラッシュするかの回数
sync_binlog             = 0
#バイナリログを保持しておく日数
expire_logs_days        = 60
#バイナリログの1ファイルあたりの最大サイズ
max_binlog_size         = 1024M
#バイナリログを出力する対象のDB
binlog_do_db           = hoge
#バイナリログの出力対象外とするDB 
binlog_ignore_db        = mysql information_schema
#バイナリログフォーマット
binlog_format           = ROW
以上(`・ω・´)ゞビシッ!!

ちなみに稼働中にHDD100%になると次のようなエラーが吐き出されていました!
121028  9:56:06 [Warning] Timeout waiting for reply of binlog (file: mysql-bin.000459, pos: 1387371563), semi-sync up to file mysql-bin.000459, position 1040130015.
121028  9:56:06 [Note] Semi-sync replication switched OFF.
121028  9:56:23 [Note] Semi-sync replication switched ON with slave (server_id: 2) at (mysql-bin.000459, 1387371563)
121028  9:57:05 [Warning] Timeout waiting for reply of binlog (file: mysql-bin.000460, pos: 347253907), semi-sync up to file mysql-bin.000459, position 1387371563.
121028  9:57:05 [Note] Semi-sync replication switched OFF.
121028  9:57:20 [Note] Semi-sync replication switched ON with slave (server_id: 2) at (mysql-bin.000460, 347253907)
121028  9:58:04 [ERROR] /usr/libexec/mysqld: Disk is full writing './mysql-bin.000460' (Errcode: 28). Waiting for someone to free space... (Expect up to 60 secs delay for server to continue afte
r freeing disk space)
121028  9:58:04 [ERROR] /usr/libexec/mysqld: Retry in 60 secs. Message reprinted in 600 secs
121028  9:59:04 [ERROR] /usr/libexec/mysqld: Disk is full writing './mysql-bin.000460' (Errcode: 28). Waiting for someone to free space... (Expect up to 60 secs delay for server to continue afte
r freeing disk space)
121028  9:59:04 [ERROR] /usr/libexec/mysqld: Retry in 60 secs. Message reprinted in 600 secs
121028 10:00:02 [ERROR] Error writing file '/data/mysql-log/mysql.log' (errno: 28)
121028 10:00:04 [ERROR] /usr/libexec/mysqld: Incorrect key file for table '/data/mysql-tmp/#sql_7a73_0.MYI'; try to repair it
121028 10:00:04 [ERROR] Got an error from unknown thread, /builddir/build/BUILD/mysql-5.5.22/storage/myisam/mi_write.c:223
121028 10:00:04 [ERROR] Error writing file '/data/mysql-log/mysql-slow.log' (errno: 1)
121028 10:00:06 [ERROR] /usr/libexec/mysqld: Incorrect key file for table '/data/mysql-tmp/#sql_7a73_0.MYI'; try to repair it
121028 10:00:06 [ERROR] Got an error from unknown thread, /builddir/build/BUILD/mysql-5.5.22/storage/myisam/mi_write.c:223
121028 10:09:04 [ERROR] /usr/libexec/mysqld: Retry in 60 secs. Message reprinted in 600 secs
121028 10:19:04 [ERROR] /usr/libexec/mysqld: Retry in 60 secs. Message reprinted in 600 secs
121028 10:29:04 [ERROR] /usr/libexec/mysqld: Retry in 60 secs. Message reprinted in 600 secs
121028 10:30:04 [ERROR] /usr/libexec/mysqld: Incorrect key file for table '/data/mysql-tmp/#sql_7a73_0.MYI'; try to repair it
121028 10:30:04 [ERROR] Got an error from unknown thread, /builddir/build/BUILD/mysql-5.5.22/storage/myisam/mi_write.c:223
121028 10:30:06 [ERROR] /usr/libexec/mysqld: Incorrect key file for table '/data/mysql-tmp/#sql_7a73_0.MYI'; try to repair it
121028 10:30:06 [ERROR] Got an error from unknown thread, /builddir/build/BUILD/mysql-5.5.22/storage/myisam/mi_write.c:223
121028 10:39:04 [ERROR] /usr/libexec/mysqld: Retry in 60 secs. Message reprinted in 600 secs

参考URL

2012年10月19日金曜日

便利なfindコマンド!指定日より古いファイルを消すっ!(前編)

プログラム上でアップロードされた画像などは削除しないと
どんどん溜まっていってしまってHDDを圧迫する原因になったり、
想定外の動きになりプログラムが正常に動作しなくなってしまうことがあります。

それを防ぐために、定期的に必要なくなったファイルは消すか、
圧縮してバックアップファイルとして移動させておく必要が出来ます。

その際の手段として、findコマンドを使う方法になります。

検証用に、touchコマンドも使います。
touchコマンドはファイルのタイムスタンプ時間などを操作できるコマンドです。
未来の日付のファイルを作ったり出来ます( ゚д゚)
検証用に次のようなファイルを作成します。
#2011年11月10日 00時00分としてファイルを作成
touch -t 201111100000 /tmp/test/2011_1110_0000.txt

#2012年10月15日 09時15分としてファイルを作成
touch -t 201210150915 /tmp/test/2012_1015_0915.txt

#2012年10月16日 00時00分としてファイルを作成
touch -t 201210160000 /tmp/test/2012_1016_0000.txt
#2012年10月16日 09時15分としてファイルを作成
touch -t 201210160915 /tmp/test/2012_1016_0915.txt
#2012年10月16日 23時59分としてファイルを作成
touch -t 201210162359 /tmp/test/2012_1016_2359.txt

#2012年10月17日 00時00分としてファイルを作成
touch -t 201210170000 /tmp/test/2012_1017_0000.txt
#2012年10月17日 09時15分としてファイルを作成
touch -t 201210170915 /tmp/test/2012_1017_0915.txt
#2012年10月17日 01時15分としてファイルを作成
touch -t 201210170115 /tmp/test/2012_1017_0115.txt
#2012年10月17日 23時59分としてファイルを作成
touch -t 201210172359 /tmp/test/2012_1017_2359.txt

#2012年10月18日 00時00分としてファイルを作成
touch -t 201210180000 /tmp/test/2012_1018_0000.txt
#2012年10月18日 23時59分としてファイルを作成
touch -t 201210182359 /tmp/test/2012_1018_2359.txt

#2012年10月19日 00時00分としてファイルを作成
touch -t 201210190000 /tmp/test/2012_1019_0000.txt
#2012年10月19日 03時00分としてファイルを作成
touch -t 201210190300 /tmp/test/2012_1019_0300.txt
#2012年10月19日 23時59分としてファイルを作成
touch -t 201210192359 /tmp/test/2012_1019_2359.txt
作られたファイルを確認する
# date
2012年 10月 19日 金曜日 01:41:53 JST
# ls -alu /tmp/test/
合計 8
drwxrwxrwx  2 apache   apache   4096 10月 19 01:40 2012 .
drwxrwxrwt. 8 root     root     4096 10月 19 01:39 2012 ..
-rw-rw-r--  1 K1-admin K1-admin    0 11月 10 00:00 2011 2011_1110_0000.txt
-rw-rw-r--  1 K1-admin K1-admin    0 10月 15 09:15 2012 2012_1015_0915.txt
-rw-rw-r--  1 K1-admin K1-admin    0 10月 16 00:00 2012 2012_1016_0000.txt
-rw-rw-r--  1 K1-admin K1-admin    0 10月 16 09:15 2012 2012_1016_0915.txt
-rw-rw-r--  1 K1-admin K1-admin    0 10月 16 23:59 2012 2012_1016_2359.txt
-rw-rw-r--  1 K1-admin K1-admin    0 10月 17 00:00 2012 2012_1017_0000.txt
-rw-rw-r--  1 K1-admin K1-admin    0 10月 17 01:15 2012 2012_1017_0115.txt
-rw-rw-r--  1 K1-admin K1-admin    0 10月 17 09:15 2012 2012_1017_0915.txt
-rw-rw-r--  1 K1-admin K1-admin    0 10月 17 23:59 2012 2012_1017_2359.txt
-rw-rw-r--  1 K1-admin K1-admin    0 10月 18 00:00 2012 2012_1018_0000.txt
-rw-rw-r--  1 K1-admin K1-admin    0 10月 18 23:59 2012 2012_1018_2359.txt
-rw-rw-r--  1 K1-admin K1-admin    0 10月 19 00:00 2012 2012_1019_0000.txt
-rw-rw-r--  1 K1-admin K1-admin    0 10月 19 03:00 2012 2012_1019_0300.txt
-rw-rw-r--  1 K1-admin K1-admin    0 10月 19 23:59 2012 2012_1019_2359.txt

まず、よく使われる過去のファイルを対象に、検索したいと思います。

※現在の時刻は「2012年 10月 19日 金曜日 01:41:53 JST」前後で実行しています
■現在の時間から24時間より前に作られたファイルを対象に検索
# find /tmp/test/* -mtime +0
/tmp/test/2011_1110_0000.txt
/tmp/test/2012_1015_0915.txt
/tmp/test/2012_1016_0000.txt
/tmp/test/2012_1016_0915.txt
/tmp/test/2012_1016_2359.txt
/tmp/test/2012_1017_0000.txt
/tmp/test/2012_1017_0115.txt
/tmp/test/2012_1017_0915.txt
/tmp/test/2012_1017_2359.txt
/tmp/test/2012_1018_0000.txt
■現在の時間から48時間より前に作られたファイルを対象に検索
find /tmp/test/* -mtime +1
/tmp/test/2011_1110_0000.txt
/tmp/test/2012_1015_0915.txt
/tmp/test/2012_1016_0000.txt
/tmp/test/2012_1016_0915.txt
/tmp/test/2012_1016_2359.txt
/tmp/test/2012_1017_0000.txt
/tmp/test/2012_1017_0115.txt
となります。

気をつける点として、コマンドを実行した時間を基準に24時間単位で過去を指定していく点になります。
上記のやり方ですと、時間単位になってしまいますので、
わかりにくい場合には日付を基準にして検索する事も可能です(1日の00時00分を基準にする)
■19日の00時00分より前のファイルを対象に検索
# find /tmp/test/* -daystart -mtime +0
/tmp/test/2011_1110_0000.txt
/tmp/test/2012_1015_0915.txt
/tmp/test/2012_1016_0000.txt
/tmp/test/2012_1016_0915.txt
/tmp/test/2012_1016_2359.txt
/tmp/test/2012_1017_0000.txt
/tmp/test/2012_1017_0115.txt
/tmp/test/2012_1017_0915.txt
/tmp/test/2012_1017_2359.txt
/tmp/test/2012_1018_0000.txt
/tmp/test/2012_1018_2359.txt
■18日の00時00分より前のファイルを対象に検索
# find /tmp/test/* -daystart -mtime +1
/tmp/test/2011_1110_0000.txt
/tmp/test/2012_1015_0915.txt
/tmp/test/2012_1016_0000.txt
/tmp/test/2012_1016_0915.txt
/tmp/test/2012_1016_2359.txt
/tmp/test/2012_1017_0000.txt
/tmp/test/2012_1017_0115.txt
/tmp/test/2012_1017_0915.txt
/tmp/test/2012_1017_2359.txt
個人的にはこっちのが直感的に分かりやすくて好きです(´∀`*)ポッ
次は-mtimeの-(マイナス)の場合についてになります
-mtimeのプラスの場合には、+に指定した数値分だけ過去のファイルを全て対象にしていましたが、
-の場合には、その逆で指定した日付から未来までのファイルを対象にします。

■未来のファイルを対象に検索
# find /tmp/test/* -mtime -0
/tmp/test/2012_1019_0300.txt
/tmp/test/2012_1019_2359.txt
■24時間以内に作られたファイルを対象に検索
# find /tmp/test/* -mtime -1
/tmp/test/2012_1018_2359.txt
/tmp/test/2012_1019_0000.txt
/tmp/test/2012_1019_0300.txt
/tmp/test/2012_1019_2359.txt
これに-daystartをつけると、
■20以降の00時00分(20日から未来まで)を対象に検索?
# find /tmp/test/* -daystart -mtime -0
■19日以降に作られた(19日から未来まで)を対象に検索
# find /tmp/test/* -daystart -mtime -1
/tmp/test/2012_1019_0000.txt
/tmp/test/2012_1019_0300.txt
/tmp/test/2012_1019_2359.txt
になります。

次回は、今回利用したfindコマンドで検索にマッチしたファイルを削除したり、移動させたりしてみたいと思います(`・ω・´)ゞビシッ!!
参考URL

2012年10月16日火曜日

まっさらのvpsにzabbixを導入 その3(イベント発生時のメール送信設定)

設定したトリガーに対してイベント(障害)が起きた際に、設定したメールアドレスにメール送信をする設定を記載します。

大まかに言って、下記3工程の設定が必要です。
1.ユーザのメールアドレス設定
2.アクションの設定
3.メディアタイプの設定

 1.ユーザのメールアドレス設定
ユーザにメールアドレスを設定します。
ここでは、既存のユーザ「Admin」にメアド「aaa@aaa.aaa」を設定します。

[管理]→[ユーザ]

右上のプルダウンから[ユーザ]を選択

[メディア]項目の【追加】
・タイプ:Email
・送信先:aaa@aaa.aaa  
・有効な時間帯:1-7,00:00-24:00  
・指定した深刻度の時に使用:全てチェック
・ステータス:有効







2.アクションの設定
イベントが生成された(障害が起きた)時に、何を行うかを設定する部分です。
ここでは、Adminユーザに登録されたメアドにメールを送信するように設定します。

[設定]→[アクション]→【アクションの作成】
・アクション、アクションのコンディションは画像の通り。(アクションの名前は任意、他の値はデフォルト値です)
・アクションのオペレーションに、1でメアドを設定したユーザ「Admin」を登録します。








3.メディアタイプの設定
SMTPサーバの設定をデフォルトから変更します。
[管理]→[メディアタイプ]→Emailを選択

SMTPの設定を
・SMTPサーバ:localhost→127.0.0.1
・SMTP helo :localhost→127.0.0.1
に変更します。






以上で、イベント発生時のメール送信設定は完了です。

SVNのインストール

ソース管理用にSVNをインストールする(`・ω・´)シャキーン
■手順1)インストール
yum -y install subversion
yum -y install mod_dav_svn
■手順2)リポジトリ用のディレクトリを作る。
mkdir -p 777 /var/www/svn
chown -R apache:apache /var/www/svn
■手順3)sampleリポジトリを作る。
svnadmin create /var/www/svn/sample
■手順4)sampleリポジトリディレクトリの権限を与える。
chown -R apache:apache /var/www/svn/sample
chmod -R 777 /var/www/svn
■手順5)svnの設定ファイルを修正する
vi /etc/httpd/conf.d/subversion.conf
LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule authz_svn_module   modules/mod_authz_svn.so

<VirtualHost *:80>
  #sample
  <Location /repos/sample>
     #Subversionを利用するために必ず指定
     DAV svn
     #リポジトリを作成したディレクトリへのパスを指定します。
     SVNPath /var/www/svn/sample
#     <LimitExcept GET PROPFIND OPTIONS REPORT>
#       # Require SSL connection for password protection.
#       # SSLRequireSSL
#       AuthType Basic
#       AuthName "Authorization Realm"
#       AuthUserFile /etc/httpd/conf/.htpasswd.svn.default
#       Require valid-user
#     </LimitExcept>
  </Location>
</VirtualHost>

ブラウザにアクセスして確認
http://利用しているサーバーのIPアドレス/repos/sample/

以上です(`・ω・´)ゞビシッ!!

次は、SVNのSSLの設定を行いたいと思います。

2012年10月15日月曜日

インストールされているパッケージ/バージョンの調べ方

OSのバージョンを調べる
cat /etc/redhat-release
rpm -qa | grep centos-release
Apacheのバージョンを調べる
rpm -qa | grep httpd
httpd -v
apachectl -v

PHPのバージョンを調べる
php -v

peclのパッケージ/バージョンを調べる
pecl list

pearのパッケージ/バージョンを調べる
pear list

yum PHP関連のパッケージ/バージョンを調べる
yum list | grep php

rpm パッケージ/バージョンを調べる
rpm -qa | grep ImageMagick
rpm -qa | grep zabbix
rpm -qa | grep libssh2

mysqlのバージョンを調べる
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.1.66    |
+-----------+
1 row in set (0.00 sec)

まっさらのvpsにzabbixを導入 その2

ここでは、web上でzabbixの管理画面にログインするまでに実行したコマンドを記載していきます。

■zabbixのyumリポジトリ用RPMダウンロード■■■■■■■■■■■■■■■■■■■■■
wget http://www.zabbix.jp/binaries/relatedpkgs/rhel6/x86_64/zabbix-jp-release-6-5.noarch.rpm
からのyumリポジトリ用RPMインストール
rpm -ihv zabbix-jp-release-6-5.noarch.rpm
バージョン確認
alternatives --display zabbix-jp-release


■mysql設定 ■■■■■■■■■■■■■■■■■■■■
yumでインストール
yum install mysql-server
mysql起動
service mysqld start
ログインしてzabbix用DB作成
mysql>create database zabbix
接続ユーザ「zabbix」パスワード「zabbixpassword」で設定
ユーザ「zabbix」はDB「zabbix」に対する全ての権限を付与する
mysql>grant all privileges on zabbix.* to zabbix@localhost identified by 'zabbixpassword'
ユーザ情報再読み込み
mysql>flush privileges
ログアウトして、OS起動時に自動的にMySQLが起動するよう設定
chkconfig mysqld on


■zabbixをインストール■■■■■■■■■■■■■■■■■■■■
zabbixをyumでインストール
yum install zabbix.x86_64 zabbix-agent.x86_64 zabbix-server.x86_64
DBに初期データをインポート(インポートするファイルはzabbixをインストールすると自動的に配置されます)
mysql -uzabbix -p zabbix < /usr/share/doc/zabbix-server-1.8.15/schema/mysql.sql
mysql -uzabbix -p zabbix < /usr/share/doc/zabbix-server-1.8.15/data/data.sql
mysql -uzabbix -p zabbix < /usr/share/doc/zabbix-server-1.8.15/data/images_mysql.sql
zabbixの設定ファイルのDB接続内容を設定したものに書き換え
vi /etc/zabbix/zabbix_server.conf
↓設定内容のDBName、DBUser、DBPasswordは上で設定したものを記載
 DBName=zabbix
 DBUser=zabbix
 DBPassword=zabbixpassword
 DBSocket=/var/lib/mysql/mysql.sock
zabbixサーバー起動
service zabbix-server start
zabbixサーバー起動確認
service zabbix-server status
 →「実行中」と表示さればOK
Apache起動
service httpd start
OS起動時に自動的にApacheが起動するよう設定
chkconfig httpd on


■webインターフェースを設定■■■■■■■■■■■■■■■■■■■■
webインターフェースのパッケージをインストール
yum install zabbix-web zabbix-web-mysql
Apache再起動
service httpd restart
ブラウザからwebインターフェースのインストーラを起動
http://●●●.●●●.●●●.●●/zabbix/
●はもちろん設置したサーバーのIPアドレス
インストーラは画面の指示に従って入力すればOK
 ・ポートは10051(デフォルトっぽかったので)
インストール完了後、ログイン画面になれば設定OK
最後にconfファイルのオーナー、権限を変更しておく
chown root.root /etc/zabbix/zabbix.conf.php
chmod 644 /etc/zabbix/zabbix.conf.php


■最後の最後にzabbix agentの起動■■■■■■■■■■■■■■■■■■■■
zabbix agentの起動
service zabbix-agent start
確認
service zabbix-agent status

まっさらのvpsにzabbixを導入 その1


まっさらのvpsにzabbixをインストールし最終的には、トリガーによるアクションの制御やagentの追加、サーバー監視の方法等をメモしていきたいと思います。

・サーバーのユーザー追加
・yumのリポジトリ設定
このあたりの最初の設定は下記エントリをそのまま行いましたので、↓参照です。
kagoya vpsを使ってみた。その1(アカウント・SSHの設定)
kagoya vpsを使ってみた。その2(yumリポジトリ設定・前編)
kagoya vpsを使ってみた。その3(yumリポジトリ設定・後編)

【小ネタ】lsで新しい順に表示

する時のオプションです。
ls -ltr

MySQLアップデート(mysql_upgrade)

そういえば、MySQLのエラーログを見ていたら、
InnoDB: Progress in percents: 1121014 17:46:25  InnoDB: Waiting for the background threads to start
121014 17:46:26 InnoDB: 1.1.8 started; log sequence number 123738696720
121014 17:46:26 [Warning] 'user' entry 'root@db01' ignored in --skip-name-resolve mode.
121014 17:46:26 [Warning] 'user' entry '@db01' ignored in --skip-name-resolve mode.
121014 17:46:26 [Warning] 'proxies_priv' entry '@ root@db01' ignored in --skip-name-resolve mode.
121014 17:46:26 [ERROR] /usr/libexec/mysqld: Can't find file: './performance_schema/events_waits_current.frm' (errno: 13)
121014 17:46:26 [ERROR] Native table 'performance_schema'.'events_waits_current' has the wrong structure
121014 17:46:26 [ERROR] /usr/libexec/mysqld: Can't find file: './performance_schema/events_waits_history.frm' (errno: 13)
121014 17:46:26 [ERROR] Native table 'performance_schema'.'events_waits_history' has the wrong structure
121014 17:46:26 [ERROR] /usr/libexec/mysqld: Can't find file: './performance_schema/events_waits_history_long.frm' (errno: 13)
121014 17:46:26 [ERROR] Native table 'performance_schema'.'events_waits_history_long' has the wrong structure
121014 17:46:26 [ERROR] /usr/libexec/mysqld: Can't find file: './performance_schema/setup_consumers.frm' (errno: 13)
121014 17:46:26 [ERROR] Native table 'performance_schema'.'setup_consumers' has the wrong structure
121014 17:46:26 [ERROR] /usr/libexec/mysqld: Can't find file: './performance_schema/setup_instruments.frm' (errno: 13)
121014 17:46:26 [ERROR] Native table 'performance_schema'.'setup_instruments' has the wrong structure
121014 17:46:26 [ERROR] /usr/libexec/mysqld: Can't find file: './performance_schema/setup_timers.frm' (errno: 13)
121014 17:46:26 [ERROR] Native table 'performance_schema'.'setup_timers' has the wrong structure
121014 17:46:26 [ERROR] /usr/libexec/mysqld: Can't find file: './performance_schema/performance_timers.frm' (errno: 13)
121014 17:46:26 [ERROR] Native table 'performance_schema'.'performance_timers' has the wrong structure
121014 17:46:26 [ERROR] /usr/libexec/mysqld: Can't find file: './performance_schema/threads.frm' (errno: 13)
121014 17:46:26 [ERROR] Native table 'performance_schema'.'threads' has the wrong structure
121014 17:46:26 [ERROR] /usr/libexec/mysqld: Can't find file: './performance_schema/events_waits_summary_by_thread_by_event_name.frm' (errno: 13)
121014 17:46:26 [ERROR] Native table 'performance_schema'.'events_waits_summary_by_thread_by_event_name' has the wrong structure
121014 17:46:26 [ERROR] /usr/libexec/mysqld: Can't find file: './performance_schema/events_waits_summary_by_instance.frm' (errno: 13)
121014 17:46:26 [ERROR] Native table 'performance_schema'.'events_waits_summary_by_instance' has the wrong structure
121014 17:46:26 [ERROR] /usr/libexec/mysqld: Can't find file: './performance_schema/events_waits_summary_global_by_event_name.frm' (errno: 13)
121014 17:46:26 [ERROR] Native table 'performance_schema'.'events_waits_summary_global_by_event_name' has the wrong structure
121014 17:46:26 [ERROR] /usr/libexec/mysqld: Can't find file: './performance_schema/file_summary_by_event_name.frm' (errno: 13)
121014 17:46:26 [ERROR] Native table 'performance_schema'.'file_summary_by_event_name' has the wrong structure
121014 17:46:26 [ERROR] /usr/libexec/mysqld: Can't find file: './performance_schema/file_summary_by_instance.frm' (errno: 13)
121014 17:46:26 [ERROR] Native table 'performance_schema'.'file_summary_by_instance' has the wrong structure
121014 17:46:26 [ERROR] /usr/libexec/mysqld: Can't find file: './performance_schema/mutex_instances.frm' (errno: 13)
121014 17:46:26 [ERROR] Native table 'performance_schema'.'mutex_instances' has the wrong structure
121014 17:46:26 [ERROR] /usr/libexec/mysqld: Can't find file: './performance_schema/rwlock_instances.frm' (errno: 13)
121014 17:46:26 [ERROR] Native table 'performance_schema'.'rwlock_instances' has the wrong structure
121014 17:46:26 [ERROR] /usr/libexec/mysqld: Can't find file: './performance_schema/cond_instances.frm' (errno: 13)
121014 17:46:26 [ERROR] Native table 'performance_schema'.'cond_instances' has the wrong structure
121014 17:46:26 [ERROR] /usr/libexec/mysqld: Can't find file: './performance_schema/file_instances.frm' (errno: 13)
121014 17:46:26 [ERROR] Native table 'performance_schema'.'file_instances' has the wrong structure
という、エラーが出ていてなんだろう?って思ってたら、
MySQLのアップデートしろという事らしいです。
それで、mysql_upgradeを行ってみました
mysql_upgrade -u root -p
そうしたら、次のようなエラーになってしまってうまく行きませんでした。
Running 'mysql_fix_privilege_tables'...
ERROR 1007 (HY000) at line 160: Can't create database 'performance_schema'; database exists
ERROR 1005 (HY000) at line 183: Can't create table 'cond_instances' (errno: 13)
ERROR 1005 (HY000) at line 213: Can't create table 'events_waits_current' (errno: 13)
ERROR 1005 (HY000) at line 227: Can't create table 'events_waits_history' (errno: 13)
ERROR 1005 (HY000) at line 241: Can't create table 'events_waits_history_long' (errno: 13)
ERROR 1005 (HY000) at line 262: Can't create table 'events_waits_summary_by_instance' (errno: 13)
ERROR 1005 (HY000) at line 283: Can't create table 'events_waits_summary_by_thread_by_event_name' (errno: 13)
ERROR 1005 (HY000) at line 303: Can't create table 'events_waits_summary_global_by_event_name' (errno: 13)
ERROR 1005 (HY000) at line 320: Can't create table 'file_instances' (errno: 13)
ERROR 1005 (HY000) at line 339: Can't create table 'file_summary_by_event_name' (errno: 13)
ERROR 1005 (HY000) at line 359: Can't create table 'file_summary_by_instance' (errno: 13)
ERROR 1005 (HY000) at line 376: Can't create table 'mutex_instances' (errno: 13)
ERROR 1005 (HY000) at line 394: Can't create table 'performance_timers' (errno: 13)
ERROR 1005 (HY000) at line 412: Can't create table 'rwlock_instances' (errno: 13)
ERROR 1005 (HY000) at line 428: Can't create table 'setup_consumers' (errno: 13)
ERROR 1005 (HY000) at line 445: Can't create table 'setup_instruments' (errno: 13)
ERROR 1005 (HY000) at line 461: Can't create table 'setup_timers' (errno: 13)
ERROR 1005 (HY000) at line 478: Can't create table 'threads' (errno: 13)
調べるのが面倒だったのでアップデートせずに放置プレイ!(゚∀゚)
そうしたら見事に天罰がガ━━(;゚Д゚)━━ン!!
いつの間にかサイトの表示が正しくされなくなってしまっていました:(;゙゚'ω゚'):
スレーブのステータスを見てみると次のエラーが発生していました
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.255.7.2
                  Master_User: repl
                  Master_Port: 3306
             Slave_IO_Running: Yes
            Slave_SQL_Running: No
                   Last_Errno: 1580
                   Last_Error: Error 'You cannot 'ALTER' a log table if logging is enabled' on query. Default database: 'mysql'. Query: 'ALTER TABLE general_log
   MODIFY event_time TIMESTAMP NOT NULL,
   MODIFY user_host MEDIUMTEXT NOT NULL,
   MODIFY thread_id INTEGER NOT NULL,
   MODIFY server_id INTEGER UNSIGNED NOT NULL,
   MODIFY command_type VARCHAR(64) NOT NULL,
   MODIFY argument MEDIUMTEXT NOT NULL'

調べてみると、こちらのサイトに書かれているような現象に近かったと思います。
マスターで行ったmysql_upgradeがスレーブ側で失敗しているせい?

とりあえず、放置していたアップデートを続けることにしました。
まずはスレーブ側でアップデートを行います。
その前にslaveのレプリケーションを停止しておきます
# mysql -u root -p
mysql> slave stop;
その後にアップデート(`・ω・´)シャキーン
# mysql_upgrade -u root -p
Enter password:
Looking for 'mysql' as: mysql
Looking for 'mysqlcheck' as: mysqlcheck
Running 'mysqlcheck' with connection arguments: '--port=3306' '--socket=/var/lib/mysql/mysql.sock'
Running 'mysqlcheck' with connection arguments: '--port=3306' '--socket=/var/lib/mysql/mysql.sock'
:
:
Running 'mysql_fix_privilege_tables'...
OK
スレーブ側は無事に成功しました( ̄ー ̄)bグッ!
ただ、スレーブ側のレプリケーションのエラーはまだ残っていますので、それを解消します
エラーが出ているSQLをスキップさせます。
#スレーブ停止
mysql> slave stop;
#1つだけスキップする
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
#スレーブ起動
mysql> slave start;
#スレーブのステータス確認
mysql> show slave status\G
*************************** 1. row ***************************
             Slave_IO_Running: Yes
            Slave_SQL_Running: No
                   Last_Errno: 1580
                   Last_Error: Error 'You cannot 'ALTER' a log table if logging is enabled' on query. Default database: 'mysql'. Query: 'ALTER TABLE slow_log
   MODIFY start_time TIMESTAMP NOT NULL,
   MODIFY user_host MEDIUMTEXT NOT NULL,
   MODIFY query_time TIME NOT NULL,
   MODIFY lock_time TIME NOT NULL,
   MODIFY rows_sent INTEGER NOT NULL,
   MODIFY rows_examined INTEGER NOT NULL,
   MODIFY db VARCHAR(512) NOT NULL,
   MODIFY last_insert_id INTEGER NOT NULL,
   MODIFY insert_id INTEGER NOT NULL,
   MODIFY server_id INTEGER UNSIGNED NOT NULL,
   MODIFY sql_text MEDIUMTEXT NOT NULL'
あれ・・・まだ解消されていない(´;ω;`)ウッ…
もう一度スキップしてみる
#スレーブ停止
mysql> slave stop;
#1つだけスキップする
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
#スレーブ起動
mysql> slave start;
#スレーブのステータス確認
mysql> show slave status\G
*************************** 1. row ***************************
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
                   Last_Errno: 0
                   Last_Error:
これで無事に解消されました!( ̄ー ̄)bグッ!

そして次はエラーが起きていたマスター側を行います
# mysql_upgrade -u root -p
Running 'mysql_fix_privilege_tables'...
ERROR 1007 (HY000) at line 160: Can't create database 'performance_schema'; database exists
ERROR 1005 (HY000) at line 183: Can't create table 'cond_instances' (errno: 13)
ERROR 1005 (HY000) at line 213: Can't create table 'events_waits_current' (errno: 13)
ERROR 1005 (HY000) at line 227: Can't create table 'events_waits_history' (errno: 13)
ERROR 1005 (HY000) at line 241: Can't create table 'events_waits_history_long' (errno: 13)
ERROR 1005 (HY000) at line 262: Can't create table 'events_waits_summary_by_instance' (errno: 13)
ERROR 1005 (HY000) at line 283: Can't create table 'events_waits_summary_by_thread_by_event_name' (errno: 13)
ERROR 1005 (HY000) at line 303: Can't create table 'events_waits_summary_global_by_event_name' (errno: 13)
ERROR 1005 (HY000) at line 320: Can't create table 'file_instances' (errno: 13)
ERROR 1005 (HY000) at line 339: Can't create table 'file_summary_by_event_name' (errno: 13)
ERROR 1005 (HY000) at line 359: Can't create table 'file_summary_by_instance' (errno: 13)
ERROR 1005 (HY000) at line 376: Can't create table 'mutex_instances' (errno: 13)
ERROR 1005 (HY000) at line 394: Can't create table 'performance_timers' (errno: 13)
ERROR 1005 (HY000) at line 412: Can't create table 'rwlock_instances' (errno: 13)
ERROR 1005 (HY000) at line 428: Can't create table 'setup_consumers' (errno: 13)
ERROR 1005 (HY000) at line 445: Can't create table 'setup_instruments' (errno: 13)
ERROR 1005 (HY000) at line 461: Can't create table 'setup_timers' (errno: 13)
ERROR 1005 (HY000) at line 478: Can't create table 'threads' (errno: 13)
やっぱり、エラーになってしまいますね・・・。
エラー内容を見てみると、なにやらテーブルが作れないとのこと。
errno: 13はどこかで見たようなエラーだと思いながら、
パーミッションを確認してみると、所有者がrootになっていましたΣ(゚Д゚ υ) アリャ
# ls -alt /var/lib/mysql/|grep performance_schema
drwx------  2 mysql mysql        4096 Oct 14 17:07 performance_schema
なので、所有者をmysqlに変更し、再度実行すると無事に成功します!
# chown -R mysql:mysql /var/lib/mysql/performance_schema
# mysql_upgrade -u root -p
:
:
Running 'mysql_fix_privilege_tables'...
OK
今度は、スレーブ側のレプリケーションを再開します。
# mysql -u root -p
mysql> slave start;
mysql> show slave status\G
*************************** 1. row ***************************
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
Slave_IO_Running、Slave_SQL_RunningがYesになっていることを事を確認する。(`・ω・´)ゞビシッ!!

参考URL