zabbix+group replication

18
Zabbix+Group replication ブリンガー

Upload: bri-nger

Post on 07-Feb-2017

304 views

Category:

Software


0 download

TRANSCRIPT

Page 1: Zabbix+group replication

Zabbix+Group replicationブリンガー

Page 2: Zabbix+group replication

自己紹介

HN:ブリンガー

(Qiitaとかはbringer1092)

職業:提督

年齢:37

経歴:秋葉原店員、NW・インフラ・(クラウド)エンジニア、転職活動中

興味あること:Zabbix、MySQL、Docker、Hinemos

嫌いなこと:ノーインフラ(エンジニア)時代、無茶なスケジュール

Page 3: Zabbix+group replication

InnoDB Cluster発表時

これでZabbixが閲覧ユーザが爆増増えても耐えられる仕組みが作れそう!

MySQL-MHAは会社に1から導入するにはちょっと大変だったし

これとMySQL Document Storeを併用したら

Page 4: Zabbix+group replication

当初の構想

Page 5: Zabbix+group replication

どういうケースを想定しているか

・アプリケーションが1台のMySQLサーバしか考えられていない物

・今まで(Virtual)IPで書き込み、読み込み処理を分けていたサービス

認証、課金はProxySQLのパスワード制約があるため

ProxySQLを飛ばしHAproxyにSELECTはスレーブをまず参照し、データがなければマ

スターに参照するなど別実装を推奨

Page 6: Zabbix+group replication

Maxscaleではなくなった理由

https://mariadb.com/kb/en/mariadb-enterprise/named-server-filter/

This is the server where matching queries will be router. The server should be in use by the service which uses this filter.

これは、一致するクエリがルーティングするサーバです。サーバーは、このフィルターを

使用するサービスで使用されている必要があります。

英語はきちんと読みましょう

Page 7: Zabbix+group replication

書き込み・読み込みサービスServer1指定

:3306

MySQLマスターserver1

MySQLスレーブserver3

図解

MySQLスレーブserver2

^select.*フィルタ適応server2,3指定NG NG

Page 8: Zabbix+group replication

色々複雑なことしなくてもいいのではないか?

・PHPなんだからphp-mysqlndならmysqlnd_ms使って書き込みと読み込み分けられる

よね?

というツッコミはあると思います。

ですがもっと柔軟でないとアプリ次第で困ることがあります

・マルチマスターで動かせは?

とあると思いますが同期が遅れているサーバをどうやって検出するか、競合が起きない

アプリであるのかマルチマスターでも課題はあります

Page 9: Zabbix+group replication

変わりにProxySQLを採用

利点:

複数フィルタ適応可能など柔軟なSQLのフィルタルールが作成可能

どのフィルタにマッチしたか統計が取れる

欠点:

簡単に説明するとコンフィグがコンフィグファイル、SQLite、メモリと3段階あり面倒

MysqlコマンドでSQLiteに接続するため勘違いしやすい

Note:ProxySQL currently doesn’t encrypt passwords.(実装する気はありそう)

Page 10: Zabbix+group replication

MysqlRouterではなくなった理由

ONLINE判定がない

モニタリングがない

サンプルでHAproxyが使われている

http://lefred.be/content/mysql-group-replication-as-ha-solution/

Page 11: Zabbix+group replication

HAproxyなら

利点:

汎用ロードバランサではあるがHTTPであればL7として動作可能

OKなら200が返ってくるなら万が一シングルマスターなのに高負荷でマスターが2台に

万が一なってもプロクシ側で検知が出来、haproxyを落とせる

モニタがある。GUIでもCUIでも簡単に見られるのは便利

欠点:

公式推奨のnbproc=1だと性能の頭打ちがある

Page 12: Zabbix+group replication

最終的に

every 5sec Script(plan):6446200 ok 2server HAproxy forced down200 ok 0server alert

And select session table

Page 13: Zabbix+group replication

全テーブルにPRIMARY KEYかUNIQ KEYが必要

Zabbixだと4つのテーブル(history、history_str、history_uint、dbversion)

でPKもUKも存在しなかった。

ALTER TABLEを実施する必要があります。

ただし、新規にPKを追加する場合はオンラインDDLが可能なようです(※要検証)

Page 14: Zabbix+group replication

本番データを食べさせて動作させてみて

Zabbixではこういう振り分けになりました。番号順に評価されます

1.^SELECT以外を書き込みポートに振り分け

2. sessionという文字があれば書き込みポートに振り分け

3. zabbixユーザのアクセスは読み込みポートに振り分け

4.^SELECTを書き込みポートに振り分け

Page 15: Zabbix+group replication

Mysql_query_rules{ ( {

rule_id=1

active=1

username=”zabbix”

match_pattern=”^SELECT”

destination_hostgroup=0

negate_match_pattern=1

apply=1

} ) }

1番から評価

設定を有効にするか

接続ユーザ

一致する条件

どのホスト(グループ単位)に送信するか

条件にNOTに一致しない場合

このフィルタで終わらせるか

Page 16: Zabbix+group replication

ProxySQLのSQLルールが柔軟で助かる

接続ユーザ、schema、接続元IP、ポートでも振り分け可能

いくつものルールを適応できるapply=0(次も評価)、flagOUT=xx(次の処理を指定)、flagIN=xx(前の処理を指定)

大文字小文字は気にしなくて良さげ

クエリ書き換えもどうしても必要なら5.7側よりプロクシでやらせたほうがいいかな

どの正規表現規格に準拠しているかわからないのが難点

Page 17: Zabbix+group replication

proxysqlのトラブルシュート

クエリがルールに適応されているか

select active,hits, mysql_query_rules.rule_id, match_digest, match_pattern, replace_pattern, cache_ttl, apply,flagIn,flagOUT FROM mysql_query_rules NATURAL JOIN stats.stats_mysql_query_rules ORDER BY mysql_query_rules.rule_id;

サーバが接続されているか

SELECT * FROM monitor.mysql_server_connect_log ORDER BY time_start DESC LIMIT 6;

サーバが生きているか

SELECT * FROM monitor.mysql_server_ping_log ORDER BY time_start DESC LIMIT 6;

Page 18: Zabbix+group replication

悩み

何かあったらGTIDとグループレプリケーションの両方の知識が必要になる

mysqldumpで--single-transactionが使えるようにならないとDBだけで4台必要

group_replication2台目以降の接続にdry-runが欲しい(こけた時にマスターのhaproxy判定まで影響したことが)

group_replicationの前提条件が多すぎて(13項目)移管するならコンフィグチェックツー

ルが欲しくなる