💭

MariaDBをOrchestratorで自動フェイルオーバー

2021/10/08に公開

検証環境
・ 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を更新してサービスアウトしたい

公式ドキュメント

https://github.com/openark/orchestrator/tree/master/docs

https://mariadb.com/kb/en/orchestrator-overview/

参考記事

https://blog.s-style.co.jp/2018/11/2875/

https://qiita.com/shora_kujira16/items/31d09b373809a5a44ae5

https://tryota.hatenablog.com/entry/2021/01/10/Ubuntu20.04でDNSの設定を変更する

Discussion