SAKURA Distributed MariaDB Controller(以降Sakura-DBCと表記)を最小限動作させるためのセットアップ手順を記載します。
Sakura-DBCを最小限動作させるために、以下のリソースが必要です。
必要なリソース | 推奨スペック | 必要数 |
---|---|---|
データベースサーバ | CPU : 4コア以上 Memory : 4GB以上 ストレージ : 20GB以上 |
2 |
アンカーサーバ | CPU : 1コア以上 Memory : 2GB以上 ストレージ : 20GB以上 |
1 |
GSLB | さくらのクラウドGSLB | 1 |
サーバについて
- Linuxディストリビューションは
RHEL8系
を想定した手順を記載しており、動作確認はRocky Linux 8.8
にて実施しています - 3台のサーバに独立したグローバルIPアドレスが必要です
- 3台のサーバは異なるAZ(Availability Zone)に配置してください
- データベースサーバは、一方がPrimary、もう一方がReplicaとして稼働するように制御されます
- アンカーサーバは、ネットワーク分断を検知するためのBGP経路を広告する役割を担います
GSLBについて
- GSLBにより、Primary状態であるDBサーバのIPアドレスをDNSレスポンスすることで、アクセス先を切り替えます
- GSLBとして、AWS Route53なども利用可能かと思われますが、動作未確認です
Sakura-DBCは、以下のコンポーネントを利用します。
利用するコンポーネント | 動作確認バージョン |
---|---|
Golang | 1.20.5 |
MariaDB | 10.11.4 |
FRRouting | 8.5.2 |
nftables | 0.9.3 |
注: nftablesは、Primaryとなるデータベースサーバのみが3306番ポートへの接続を受け付けるようにパケットフィルタルールを設定するために使用されます
対象サーバ: アンカーサーバ、データベースサーバ2台
- firewalldを停止し、nftableを有効化します
systemctl stop firewalld systemctl disable firewalld nft add table ip filter nft list ruleset > /etc/sysconfig/nftables.conf systemctl enable nftables
対象サーバ: アンカーサーバ、データベースサーバ2台
- FRRをインストールします
yum -y install https://rpm.frrouting.org/repo/frr-8-repo-1-0.el8.noarch.rpm yum -y install frr
- /etc/frr/daemons ファイルを作成します
bgpd=yes vtysh_enable=yes zebra_options=" -A 127.0.0.1 -s 90000000" bgpd_options=" -A 127.0.0.1 -n" staticd_options="-A 127.0.0.1"
- /etc/frr/frr.conf ファイルを作成します
hostname test-server 【自身のホスト名を記入】 log syslog informational no ip forwarding no ipv6 forwarding ip nht resolve-via-default bgp no-rib ! router bgp 65001 bgp router-id xx.xx.xx.xx 【自身のIPアドレスを記入】 bgp log-neighbor-changes no bgp network import-check neighbor yy.yy.yy.yy remote-as 65001 【他のサーバ(1台目)のIPアドレスを記入】 neighbor yy.yy.yy.yy timers 3 9 neighbor yy.yy.yy.yy route-reflector-client neighbor zz.zz.zz.zz remote-as 65001 【他のサーバ(2台目)のIPアドレスを記入】 neighbor zz.zz.zz.zz timers 3 9 neighbor zz.zz.zz.zz route-reflector-client ! アンカーの場合 network xx.xx.xx.xx/32 route-map anchor 【自身のIPアドレスを記入】 ! DBサーバの場合 network xx.xx.xx.xx/32 route-map fault 【自身のIPアドレスを記入】 ! bgp community-list standard fault seq 5 permit 65001:1 bgp community-list standard candidate seq 5 permit 65001:2 bgp community-list standard primary seq 5 permit 65001:3 bgp community-list standard replica seq 5 permit 65001:4 bgp community-list standard anchor seq 5 permit 65001:10 ! route-map fault permit 10 set community 65001:1 ! route-map candidate permit 10 set community 65001:2 ! route-map primary permit 10 set community 65001:3 ! route-map replica permit 10 set community 65001:4 ! route-map anchor permit 10 set community 65001:10
- FRRを起動します
systemctl enable frr systemctl start frr
- BGPピアが上がり、経路情報が交換できていることを確認します
vtysh show ip bgp sum show ip bgp ! アンカーのIPアドレスのみ表示されることを確認 show ip bgp community-list anchor ! DBサーバ2台のIPアドレスが表示されることを確認 show ip bgp community-list fault
対象サーバ: データベースサーバ2台
- /etc/yum.repos.d/MariaDB.repo ファイルを作成します
[mariadb] name = MariaDB baseurl = https://rpm.mariadb.org/10.11/rhel/$releasever/$basearch module_hotfixes = 1 gpgkey = https://rpm.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck = 1
- MariaDBをインストールします
yum -y install MariaDB-client MariaDB-common MariaDB-compat MariaDB-server MariaDB-shared
- /etc/my.cnf ファイルを作成します
[mariadb] character_set_server = utf8mb4 skip_name_resolve = 1 read_only = 1 enforce_storage_engine = InnoDB innodb_buffer_pool_size = 3G 【搭載メモリに応じて割り当てるサイズを指定】 innodb_flush_method = O_DIRECT server_id = XX 【1号機は1、2号機は2を指定するなど、ユニークになるように割り当てる】 log_bin = log-bin binlog_expire_logs_seconds = 86400 gtid_strict_mode = 1 relay_log = relay-bin log_slave_updates = 1 rpl_semi_sync_master_enabled = 1 rpl_semi_sync_slave_enabled = 1 rpl_semi_sync_master_wait_point = AFTER_SYNC rpl_semi_sync_master_wait_no_slave = 0 rpl_semi_sync_master_timeout = 30000
- 1号機でレプリケーション用ユーザのパスワードを生成します
openssl rand 1000 | tr -dc '0-9A-Za-z' | fold -w 31 | head -1 > /root/.db-replica-password
- 生成したファイルを2号機にコピーします
scp /root/.db-replica-password root@xx.xx.xx.xx:
- 1号機にてDBの初期設定をします
systemctl start mariadb mysql -e "drop database if exists test" mysql -e "delete from mysql.global_priv where User=''" mysql -e "delete from mysql.global_priv where User='PUBLIC'" mysql -e "delete from mysql.db where Db='test' or Db='test\\_%'" mysql -e "delete from mysql.proxies_priv" mysql -e "flush privileges" REPL_PW=$(cat ~/.db-replica-password) mysql -e "grant all on *.* to repl identified by '$REPL_PW'"
- 2号機にて、レプリケーション設定をします
systemctl start mariadb mysql -e "drop database if exists test" REMOTE_HOST=xx.xx.xx.xx 【1号機のIPアドレスを記入】 PASSWORD=$(cat /root/.db-replica-password) mysqldump --all-databases --master-data=1 --gtid --single-transaction -h $REMOTE_HOST -p$PASSWORD -u repl | mysql mysql -e 'flush privileges' mysql -e "change master to master_host = '$REMOTE_HOST', master_user = 'repl', master_password = '$PASSWORD', master_use_gtid = slave_pos" mysql -e 'reset master' mysql -e 'set global gtid_slave_pos=@@gtid_slave_pos' mysql -e 'start replica' # レプリケーションが確立したか確認 mysql -e 'show replica status\G'
対象サーバ: データベースサーバ2台
- golangをインストールします
wget https://go.dev/dl/go1.20.5.linux-amd64.tar.gz tar -C /usr/local -xzf go1.20.5.linux-amd64.tar.gz export PATH="$PATH:/usr/local/go/bin"
- Sakura-DBCレポジトリをクローンし、コンパイルします
注: コンパイルが成功すると、実行バイナリが
cd /root git clone https://github.com/sakura-internet/distributed-mariadb-controller.git cd distributed-mariadb-controller make sakura-all
/root/distributed-mariadb-controller/bin/sakura-controller
に生成されます - /etc/systemd/system/sakura-controller.service ファイルを作成します
[Unit] Description = Database Controller After=network-online.target [Service] Type=simple ExecStart = /root/distributed-mariadb-controller/bin/sakura-controller --log-level info --db-repilica-password-filepath /root/.db-replica-password WorkingDirectory = /root/distributed-mariadb-controller [Install] WantedBy=multi-user.target
- systemdに反映させます
systemctl daemon-reload
- sakura-controllerを始めに1号機、続いて2号機の順で起動します
systemctl enable sakura-controller systemctl start sakura-controller
ここでは、例としてさくらのクラウドGSLBを利用する場合の手順を示します
注: sakura-controllerはポート54545にて、以下のHTTPレスポンスを行います。
- Primary状態の場合 => 200 OK
- それ以外の状態の場合 => 503 Service Unavailable
さくらのクラウドGSLBにて、これをヘルスチェック対象とすることで、GSLBがPrimary状態のDBサーバのIPアドレスをDNSレスポンスするようにします。
- コントロールパネルよりGSLBを作成します
- 入力フィールドは以下の通りに入力します
- 監視方法: HTTP
- Hostヘッダ: (空欄)
- ポート番号: 54545
- パス: /healthcheck
- レスポンスコード: 200
- チェック間隔(秒): 10
- 重み付け応答: 無効
- ソーリーサーバ: (空欄)
- 作成後、実サーバとして2台のデータベースサーバのIPアドレスを登録します
- 反映ボタンを押下した後、しばらくしてヘルスチェックが正常に通っていることを確認します 注: Primary側がUP、Replica側がDOWNの表示となります
- GSLBがPrimary側データベースサーバのIPアドレスをDNSレスポンスすることを確認します
$ dig +short site-xxxxxxxxxxxx.gslbxx.sakura.ne.jp xx.xx.xx.xx