Zabbix Mysqlでのレプリケーションについて

お世話になっております。

現在、ZabbixのDBをレプリケーションし、スレーブ側の
DBを参照用として使用したいと考えております。

なかなかZabbixのレプリケーション情報を探しても
見当たらないため、こちらに投稿させていただきました。

今までにレプリケーション環境を構築し、
運用までしているかたはいませんでしょうか。

いらっしゃるようでしたら、構築、運用面の注意点等
教えていただきたいです。

【構成】
・CentOS5.6(64bit)
・zabbix1.8.4-1
・mysql-5.0.77-4.el5_5.4

以上、よろしくお願いいたします。

コメント表示オプション

お好みのコメント表示方法を選び「設定の保存」をクリックすると変更が反映されます。
ユーザー TNK の写真

参照用にDBをレプリケーションするのであれば、Zabbixとは関係無
いと思いますので、通常のMySQLのレプリケーションに関する情報
を探されてはいかがでしょうか?

「mysql replication 5.0.77」というキーワードで検索すれば、
いくつかの設定手順なども見つけられると思います。

ご確認下さい。

ユーザー hajime の写真

TNK様

いつもお世話になっております。

mysqlのレプリケーション設定等は教えていただいたサイトなどで
できるのですが、レプリケーション後、スレーブ側で
下記のようなエラーが出力してしまいます。

Last_Error: Error 'Duplicate entry '166' for key 1' on query. Default database: 'zabbix'. Query: 'INSERT INTO auditlog (auditid,userid,clock,action,resourcetype,details,ip) VALUES (166,1,1326773479,4,0,'Manual Logout','xxx.xxx.xxx.xxx')'

スレーブ側には一切WebUIにてログインはなく、マスター側のWebUI画面からログアウトしたときに出力されました。

過去、アイテム設定や、グラフ設定でも「Duplicate entry」の
ログが出力されております。

念のため、マスター/スレーブの「my.cnf」を下記に。
【マスター】
log-bin
server-id=1
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1

default-character-set=utf8
skip-character-set-client-handshake
innodb_file_per_table
innodb_buffer_pool_size=1024M
innodb_log_file_size=16M
innodb_log_files_in_group=2

# Disabling symbolic-links is recommended to prevent assorted security risks;
# to do so, uncomment this line:
# symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

【スレーブ】
[mysqld]
log-bin
server-id=2
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
master-host=XXXXXXXXX
master-user=repl
master-password=XXXXXXX
master-port=3306
replicate-ignore-db=mysql
report-host=XXXXXXXXX
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1

default-character-set=utf8
skip-character-set-client-handshake
innodb_file_per_table
innodb_buffer_pool_size=1024M
innodb_log_file_size=16M
innodb_log_files_in_group=2

# Disabling symbolic-links is recommended to prevent assorted security risks;
# to do so, uncomment this line:
# symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

以上よろしくお願いいたします。

ユーザー kodai の写真

おそらく、Zabbixの設定ではなくMySQLのレプリケーションの構築に失敗しているのではないかと思います。

レプリケーション開始時に双方のデータは整合性が取れているでしょうか?エラーメッセージを検索すれば同じような状況の対処方法がいくつか出てきますが、これらは試されたでしょうか?

http://www.google.com/search?client=safari&rls=en&q=mysql+replication+Last_Error:+Error+'Duplicate+entry++for+key+on+query.&ie=UTF-8&oe=UTF-8

ユーザー TNK の写真

もしかして、マスタとスレーブの両方を更新していませんか?
スレーブ側のmy.cnfにread_onlyが指定されていませんが、読み込
み専用にされるのではなかったのですか?

もし、ZabbixのWebインターフェイスの接続先をスレーブに設定さ
れているのであれば、いつだれがログインしたかという情報をスレ
ーブのDBに書き込む処理が実行されているはずです。
その際にスレーブDB上のID発行用テーブルからユニークなIDを取得
して、それを利用して操作履歴テーブルに書き込みます。
同時に、マスタ側でも同じような操作が行われた場合は、マスタ側
のID発行用テーブルは更新されていませんので、同じIDを利用して
同じテーブルに書き込もうとする処理が発生し、結果的にキーが重
複してしまって、「Duplicate entry」エラーとなっている可能性
が考えられます。

ZabbixのWebインターフェイスは、読み込み専用のDBでは動きませ
ん。更新可能なスレーブに接続して書き込んでしまうとデータの整
合性が取れなくなりますのでご注意ください。
# 完全に読み込み専用にアクセスできるようにするためには、ソー
# スの変更が必要です。

スレーブ側に更新がかかるようなことが無い状態であるならば、以
下の情報をご参照ください。

MySQLのデータ整合性に問題がある場合やレプリケーションのデー
タの転送タイミングによって、そのエラーが発生する場合があるよ
うです。
その前後で、MySQLサーバで他のエラーが発生していないかを再度
ご確認下さい。

データの整合性に問題がないのであれば、スレーブ側で以下のよう
にスキップして再度レプリケーションを再開させることができます。
<code>
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
mysql> START SLAVE;
</code>

データ整合性に問題がなく、MySQLでその他のエラーも全く発生し
ていないのであれば、スレーブ側のmy.cnfの[mysqld]セクションに
以下のエントリを書く対処方法もあるようです。
<code>
slave-skip-errors=1062
</code>

より詳細な情報に関しましては、スレーブを更新してしまっている
場合以外はZabbixと直接関係ありませんので、MySQLに詳しい方々
がいらっしゃる場所で聞かれた方が、より確実な情報が得られると
思いますのでご検討下さい。

ユーザー hajime の写真

kodai様 TNK様

いつもお世話になっております。

上記回答ありがとうございます。
read_onlyをスレーブ側に設定することで
解消することができました。
が、今回ZabbixAPIを使用しスレーブ側のグラフデータを
取得しようと考えております。

そこで、read_onlyを設定しまうとAPIでの接続が不可となります。
おそらく、apiユーザのログイン履歴がスレーブ側の
DBに書き込もうとしているが、read_onlyのため書き込めないのが
原因かと思われます。

TNK様からの回答で
# 完全に読み込み専用にアクセスできるようにするためには、ソー
# スの変更が必要です。
とありますが、こういった使用方法の場合、
やはりソースを変更するしかないのでしょうか。

以上、よろしくお願いいたします。

ユーザー TNK の写真

そういえば、1年ほど前に参照専用のフロントサーバを構築できな
いかという問い合わせを頂いてました。

この場合は、Zabbixの認証機能を利用せずに、Apache側でBasic認
証を行って対応されたようです。
http://www.zabbix.jp/modules/newbb/viewtopic.php?topic_id=740&forum=5

Basic認証で認証するアカウント名と同じアカウントをZabbix上に
登録して、必要なホストグループなどへのアクセス権限(読み込み)
を与えておくことにご注意ください。

あとは、API呼び出し時にBasic認証に対応できれば、PHPのソース
の変更なしで実現できるかもしれません。

ユーザー hajime の写真

TNK様 kodai様

いつもお世話になっております。

本件ですが、ログインAPIのソースを見ると、
users
sessions
auditlog
ids
に書き込むようなので、

スレーブ側の「my.cnf」に下記設定を追加しました。

replicate-ignore-table=zabbix.auditlog
replicate-ignore-table=zabbix.auditlog_details
replicate-ignore-table=zabbix.profiles
replicate-ignore-table=zabbix.sessions

今のところAPIの動きに問題がないので
こちらで試験を進めようと思います。
※idsテーブルはignore-tableに指定してませんが。。。

色々とありがとうございました。

※上記設定はまずい!というのがありましたら
 ご教授ください。

以上、よろしくお願いいたします。

ユーザー kodai の写真

情報ありがとうございます。

きちんとソースを読んだわけではないですが、profilesとsessionsは一時的な情報を保存しているだけですし、レプリケーションを行わなくても動作自体には大きな問題は出ないだろうと思います。

auditlogも監査ログなので、その他の設定に影響を及ぼすこともありません。ただ、スレーブサーバのデータをバックアップ用途にも利用する場合は、過去の監査ログがバックアップ対象になっていないので注意が必要です(おそらく理解されているのだと思いますけれど)