💭
MariaDBをOrchestratorで自動フェイルオーバー
検証環境
・ Ubuntu 20.04.2
・ MariaDB 10.3.31
・ Orchestrator 3.2.6
・ dnsmasq 2.8.0
※フェイルオーバーしたことをアプリが意識せずにすむように内部DNSとしてdnsmasqを使用
やりたいこと
システム構成
構成
ホスト名 | IP | 用途 |
---|---|---|
admin | 192.168.1.10 | Orchestrator、DNS |
master | 192.168.1.11 | MariaDB(Master) |
slave | 192.168.1.12 | MariaDB(Slave) |
slave2 | 192.168.1.13 | MariaDB(Slave) |
※フェイルオーバー時にホスト名を付け替えるのでmaster、slave、slave2は初期のもの
rootユーザーで作業
1. 名前解決
DNS構築
adminサーバー
# dnsmasqインストール
$ apt update
$ apt-get -y install dnsmasq
# ipとホスト名の対応表
$ vi /etc/dnsmasq_hosts
192.168.1.10 admin
192.168.1.11 master
192.168.1.12 slave
192.168.1.13 slave2
# 内部の名前解決に上位DNSに問い合わせしない
# dnsmasq_hostsの有効化
$ vi /etc/dnsmasq.conf
domain-needed
bogus-priv
addn-hosts=/etc/dnsmasq_hosts
# Port53が競合しない様にする
$ vi /etc/systemd/resolved.conf
DNSStubListener=no
# 設定反映
$ systemctl restart dnsmasq
使用するDNSを指定
各サーバー
# DNS設定
$ vi /etc/netplan/99-config.yaml
network:
ethernets:
eth0:
nameservers:
addresses:
[192.168.1.10]
version: 2
$ netplan apply
$ ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
$ systemctl restart systemd-resolved
# 動作確認
$ dig master
master. 0 IN A 192.168.1.11
2. MariaDB設定
インストール、セットアップ
master、salve、slave2サーバー
# インストール
$ apt update
$ apt-get -y install mariadb-server
$ mysql_secure_installation
# レプリケーション、Orchestrator用のユーザー作成
$ mysql -root -p
> grant replication slave on *.* to repl@'%' identified by 'password';
> grant all on *.* to orchestrator@'admin' identified by 'password';
> flush privileges;
> exit
# 別のホストから接続可にする
$ vi /etc/mysql/mariadb.conf.d/50-server.cnf
# bind-address = 127.0.0.1
レプリケーション設定
masterサーバー
# レプリケーション設定
$ vi /etc/mysql/mariadb.conf.d/50-server.cnf
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
log_slave_updates
# 設定反映
$ systemctl restart mysql
slave、slave2サーバー
$ vi /etc/mysql/mariadb.conf.d/50-server.cnf
server-id = 2 # 全サーバーでユニークになるように
log_bin = /var/log/mysql/mysql-bin.log
log_slave_updates
# 設定反映
$ systemctl restart mysql
# 書込み不可として、レプリケーション開始
$ mysql -root -p
> change master to master_host = 'master', master_user = 'repl', master_password = 'password', master_use_gtid = current_pos;
> exit;
動作確認(masterサーバー)
$ mysql -root -p
> create database example;
> use example;
> create table users (id int, name varchar(10));
> insert into users values (1, 'User1');
> exit;
動作確認(slave、slave2サーバー)
$ mysql -root -p
> use example;
> select * from users;
> exit;
3. Orchestrator設定
インストール、セットアップ
adminサーバー
# Orchestratorインストール
$ wget https://github.com/openark/orchestrator/releases/download/v3.2.6/orchestrator_3.2.6_amd64.deb
$ apt-get -y install jq
$ dpkg -i orchestrator_3.2.6_amd64.deb
# MariaDBのインストールとセットアップ(Orchestratorが使用)
$ apt-get -y install mariadb-server
$ mysql_secure_installation
$ mysql -uroot -p
> create database if not exists orchestrator;
> grant all on *.* to orchestrator@'localhost' identified by 'password';
> exit
$ cp -ip /usr/local/orchestrator/orchestrator-sample.conf.json /etc/orchestrator.conf.json
# orchestratorから監視対象のMariaDBへの接続情報
# Masterがフェイルオーバーしたときにスクリプトを起動
# Host名の名前解決のキャッシュ時間は1分間に
$ vi /etc/orchestrator.conf.json
"MySQLTopologyUser": "orchestrator",
"MySQLTopologyPassword": "password",
"MySQLOrchestratorUser": "orchestrator",
"MySQLOrchestratorPassword": "password",
"RecoverMasterClusterFilters": ["*"],
"RecoverIntermediateMasterClusterFilters": ["*"],
"PostMasterFailoverProcesses": [
"/usr/local/orchestrator/failover.sh {successorHost}"
],
"ExpiryHostnameResolvesMinutes": 1,
# DNSを更新するスクリプト
$ vi /usr/local/orchestrator/failover.sh
#!/bin/bash -eu
# dnsmasq_hostsの2行目のmasterのIPを更新
NEW_MASTER_IP=$(/usr/bin/mysql -uroot -BN -e "SELECT Ipv4 FROM orchestrator.hostname_ips WHERE hostname = \"${1}\"")
sed -i "2s/.*/$NEW_MASTER_IP master/g" /etc/dnsmasq_hosts
systemctl restart dnsmasq
# 書込み可とする
orchestrator-client -c set-writeable -i $NEW_MASTER_IP
# orchestrator起動
$ systemctl start orchestrator
$ systemctl enable orchestrator
動作確認
adminサーバーで、masterを監視対象に追加
$ orchestrator-client -c discover master
ip-192-168-1-11:3306
# 管理対象として追加されたことを確認
$ orchestrator-client -c clusters
ip-192-168-1-11:3306
# slave、slave2を自動で検知してくれる
$ orchestrator-client -c topology -i ip-192-168-1-11:3306
ip-192-168-1-11:3306 [0s,ok,10.3.31-MariaDB-log,rw,MIXED,>>]
+ ip-192-168-1-12:3306 [0s,ok,10.3.31-MariaDB-log,ro,MIXED,>>,GTID]
+ ip-192-168-1-13:3306 [0s,ok,10.3.31-MariaDB-log,ro,MIXED,>>,GTID]
masterのMariaDBをシャットダウンする(masterサーバー)
$ systemctl stop mysql
adminサーバーで確認
# invalidになったことを確認
$ orchestrator-client -c topology -i ip-192-168-1-11:3306
ip-192-168-1-11:3306 [unknown,invalid,10.3.31-MariaDB-log,rw,MIXED,>>,downtimed]
# 管理対象が自動で追加されたことを確認
$ orchestrator-client -c clusters
ip-192-168-1-11:3306
ip-192-168-1-12:3306
# slaveを新masterとするレプリケーションが構築されたことを確認
$ orchestrator-client -c topology -i ip-192-168-1-12:3306
ip-192-168-1-12:3306 [0s,ok,10.3.31-MariaDB-log,rw,MIXED,>>]
+ ip-192-168-1-13:3306 [0s,ok,10.3.31-MariaDB-log,ro,MIXED,>>,GTID]
# dnsが更新されていることを確認
$ dig master
master. 0 IN A 192.168.1.12
$ vi /etc/dnsmasq_hosts
192.168.1.10 admin
192.168.1.12 master # masterのipが書き換わっている
192.168.1.12 slave
192.168.1.13 slave2
旧masterをslaveとしてレプリケーションに戻す
$ systemctl start mysql
$ mysql -uroot -p
> change master to master_host = 'master', master_user = 'repl', master_password = 'password', master_use_gtid = current_pos;
> start slave;
> exit;
adminサーバーで、管理対象に追加されていることを確認
$ orchestrator-client -c topology -i ip-192-168-1-12:3306
ip-192-168-1-12:3306 [0s,ok,10.3.31-MariaDB-log,rw,MIXED,>>]
+ ip-192-168-1-13:3306 [0s,ok,10.3.31-MariaDB-log,ro,MIXED,>>,GTID]
+ ip-192-168-1-11:3306 [0s,ok,10.3.31-MariaDB-log,ro,MIXED,>>,GTID]
dnsにも追加してホスト名でアクセスできるように
$ vi /etc/dnsmasq_hosts
192.168.1.10 admin
192.168.1.12 master
192.168.1.11 slave # 修正前 192.168.1.12
192.168.1.13 slave2
$ systemctl restart dnsmasq
その他
やり残してること
・Slaveにread_onlyを設定したい
・SlaveがダウンしたときにDNSを更新してサービスアウトしたい
公式ドキュメント
参考記事
Discussion