Masashi Terui @ marcy_terui
I’m a Developer and Cloud Architect.
I’m a full-time employee at JIG-SAW Inc. But, I’m a part-time freelancer.
I’m a member of GCPUG and JAWS-UG and MyNA←New!!
I’m around 30 years old. I’m a father of my son and daughter.
https://willy.works/
2
3
4
R○S is 何
5
IaaSクラウド最大手のA社のフルマネージドRDBサービス
数クリックで起動、スケールアップもスレーブ追加も楽チン
スペックに合わせてパラメータを自動調整
ホットスタンバイへの自動フェイルオーバー
日時フルバックアップ+5分毎の差分バックアップ
メンテナンスウィンドウ(予約)による自動アップデート
6
∀
7
R○Sが
マッチしない
ケース
8
IOが激しい(最大30000IOPS←高い)
Failover時のダウンタイムが許容できない(数十秒〜数分)
サポート外のプラグインを使いたい(e.g. Mroonga)
OSレベルまで手を入れてカリッカリにチューニングしたい
クラウドなんてクソ食らえ!!
9
10
11
使うもの
12
13
MySQL
14
MySQL Server Community Edition
バージョンは最新の5.7(5.6なら今回話す範囲では大体同じ)
mysqlfailover(MHAでも可)
Masterフェイルオーバー
mysqlbinlog
Point In Time Recovery
cloud-init
15
クラウド上のLinuxインスタンスの初期化を行うパッケージ
マルチディストリビューション
起動毎に処理内容やデータを渡せる(User-Data)
初回起動時に一回だけ、毎起動時など色々フック出来る
ShellまたはYAML likeなDSLで動作を指定
https://cloudinit.readthedocs.io/en/latest/
Chef
16
Configuration Management Tool
ステートフル(RDBとかね!)な世界ではまだ代替はない(と思う)
サーバのインベントリを収集して利用できる(Ohai)
クライアント・サーバ型だけどStand aloneも可(local-mode)
knife-zero etc…
https://www.chef.io/
Consul
17
オーケストレーションツール
ゴシッププロトコルとRaftコンセンサスによるクラスタリング
イベント通知
排他制御
KVSインターフェイス
DNSインターフェイス
https://www.consul.io/
18
R○S is 何
19
IaaSクラウド最大手のA社のフルマネージドRDBサービス
数クリックで起動、スケールアップもスレーブ追加も楽チン
スペックに合わせてパラメータを自動調整
ホットスタンバイへの自動フェイルオーバー
日時フルバックアップ+5分毎の差分バックアップ
メンテナンスウィンドウ(予約)による自動アップデート
cloud-initを使いUser-Dataから初回起動時の処理を渡す
1. Chef-Clientのインストール
2. オブジェクトストレージからCookbook取得
3. ロール別のJSONも取得(Master, Standby, Slaveのロール)
4. Chef-Client起動
※2,3,4はChef-Serverを使うとロールを指定してchef-clientを起動するだけでおk
※数クリックかどうかはプラットフォーム次第
20
Cookbook
やること
21
MySQL Server, Consulインストール
MHA or mysqlfailoverインストール(Standby)
my.cnf生成←ロールとインベントリからメモリ搭載量を見て調整
MySQL, Consul起動
REPLICATION SLAVE権限のユーザ作成(Master)
バックアップデータを任意の時間でリストア(Slave or Standby)
CHANGE MASTER TO〜MASTER_AUTO_POSITION =1;

START SLAVE;(Slave or Standby)
22
server_id = node['mysql']['server_id'].nil? node['ipaddress'].match(/.(d+)$/)[1] : node['ipaddress']
if node['memory']['total'].match(/MB$/)
total_memory = node['memory']['total'].gsub(/MB$/, "").to_i * 1024 * 1024
elsif node['memory']['total'].match(/kB$/)
total_memory = node['memory']['total'].gsub(/MB$/, "").to_i * 1024
else
total_memory = node['memory']['total'].to_i
end
template '/etc/my.cnf' do
source 'my.cnf.erb'
action :create
variables({
:server_id => server_id,
:report_host => node['ipaddress'],
:innodb_buffer_pool_size => total_memory * 0.75,
:max_connections => total_memory / 12582880,
:server_type => node['mysql']['server_type'],
})
end
23
[mysqld]
server_id=<%= @server_id %>
log-bin=mysql-bin
log-slave-updates
gtid-mode=ON
enforce-gtid-consistency
master_info_repository=TABLE
relay_log_info_repository=TABLE
report_host=<%= @report_host %>
innodb_buffer_pool_size=<%= @innodb_buffer_pool_size %>
max_connections=<%= @max_connections %>
<% if @server_type == 'master' %>
plugin-load=rpl_semi_sync_master=semisync_master.so
rpl_semi_sync_master_enabled = 1
<% elsif @server_type == 'standby' %>
plugin-load=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled = 1
<% else @server_type == 'slave' %>
rpl_semi_sync_slave_enabled = 0
<% end %>
!includedir /etc/mysql.d
R○S is 何
24
IaaSクラウド最大手のA社のフルマネージドRDBサービス
数クリックで起動、スケールアップもスレーブ追加も楽チン
スペックに合わせてパラメータを自動調整
ホットスタンバイへの自動フェイルオーバー
日時フルバックアップ+5分毎の差分バックアップ
メンテナンスウィンドウ(予約)による自動アップデート
Masterの障害を検知してmysqlfailoverがFailoverを実行
後処理(after_script)で、ConsulのMasterレコード更新
DNSインターフェィスでMasterを常に同じ名前で解決できる
イベントを発火
StandbyやSlaveの台数が変動しているので、

LBやアプリケーションを更新

※LBやアプリケーションサーバにもConsulを入れておく
25
補足
26
フェイルオーバー速度を気にするなら
Keepalived + VIP(使えないクラウドが多い)
Keepalived + IP付け替え
なぜ今回は違う方法にしたのか?
Keepalived方式はフェイルオーバー後の自動制御が難しい
イケてる感出したかった
R○S is 何
27
IaaSクラウド最大手のA社のフルマネージドRDBサービス
数クリックで起動、スケールアップもスレーブ追加も楽チン
スペックに合わせてパラメータを自動調整
ホットスタンバイへの自動フェイルオーバー
日時フルバックアップ+5分毎の差分バックアップ
メンテナンスウィンドウ(予約)による自動アップデート
28
29
# mysqldump --all-databases --single-transaction --master-data 2
# mysqlbinlog --start-position $POSISION_FROM_DUMP $LOG_FILE_NAME_FROM_DUMP
補足
30
バックアップはオブジェクトストレージに置こう
mysqldumpはデータ量に限界がある(時間的な意味で)
とはいえ、Percona XtraBackupとか

コールドバックアップだと自動PITRするのツラい

Enterprise Backup?知らない子ですね :-)
R○S is 何
31
IaaSクラウド最大手のA社のフルマネージドRDBサービス
数クリックで起動、スケールアップもスレーブ追加も楽チン
スペックに合わせてパラメータを自動調整
ホットスタンバイへの自動フェイルオーバー
日時フルバックアップ+5分毎の差分バックアップ
メンテナンスウィンドウ(予約)による自動アップデート
32
まとめ
33
よくできたサービスのデザインは自分で作る上で参考になる
なかなか大変ではある
時間をお金で買うという考え方もある
でも、それに完全依存しちゃうのは怖いから知っておいて損はない
より良いMySQLライフを!
∀

R○Sに学ぶイマドキのMySQL構築運用