このブログ投稿では、マルチクラウド環境でMariaDBレプリケーションセットアップをデプロイする方法を検討します。プライマリアプリケーションがAWSにあるとすると、MariaDBマスターをホストするプライマリデータセンターとしてAWSを設定するのが最善の方法です。 MariaDBスレーブはGCPでホストされ、ClusterControlはオフィス内の会社のプライベートクラウドインフラストラクチャ内に配置されます。これらはすべて、192.168.50.0/24のIP範囲でWireGuardのシンプルで安全なVPNトンネルを介して接続されています。 ClusterControlは、このVPNインターフェースを使用して、すべてのデータベースノードで展開、管理、および監視をリモートで実行します。
- アマゾンウェブサービス(AWS):
- ホスト:MariaDBマスター
- パブリックIP:54.151.183.93
- プライベートIP:10.15.3.170/24(VPC)
- VPN IP:192.168.50.101
- OS:Ubuntu 18.04.4 LTS(バイオニック)
- 仕様:t2.medium(2 vCPU、4 GBメモリ)
- Google Cloud Platform(GCP):
- ホスト:MariaDBスレーブ
- パブリックIP:35.247.147.95
- プライベートIP:10.148.0.9/32
- VPN IP:192.168.50.102
- OS:Ubuntu 18.04.4 LTS(バイオニック)
- 仕様:n1-standard-1(1 vCPU、3.75 GBメモリ)
- VMwareプライベートクラウド(Office):
- ホスト:ClusterControl
- パブリックIP:3.25.96.229
- プライベートIP:192.168.55.138/24
- VPN IP:192.168.50.100
- OS:Ubuntu 18.04.4 LTS(バイオニック)
- 仕様:プライベートクラウドVMWare(2 CPU、2 GB RAM)
最終的なアーキテクチャは次のようになります:
すべてのノードの/etc/hostsの下にあるホストマッピングは次のとおりです。
3.25.96.229 cc clustercontrol office.mydomain.com
54.151.183.93 aws1 db1 mariadb1 db1.mydomain.com
35.247.147.95 gcp2 db2 mariadb2 db2.mydomain.com
ホストマッピングを設定すると、ホスト間の名前解決管理が簡素化され、Wireguardピアを構成するときにIPアドレスの代わりにホスト名が使用されます。
すべてのサーバーは3つの異なる場所にあり、パブリックネットワーク経由でのみ接続されているため、Wireguardを使用してすべてのノード間にVPNトンネリングを設定します。次の内部IP構成を使用して、この通信用にすべてのノードに新しいネットワークインターフェイスを追加します。
- 192.168.50.100-ClusterControl(Officeプライベートクラウド)
- 192.168.50.101-MariaDBマスター(AWS)
- 192.168.50.102-MariaDBスレーブ(GCP)
このページに示すように、3つのノードすべてにWireguardをインストールします。
$ sudo add-apt-repository ppa:wireguard/wireguard
$ sudo apt-get upgrade
$ sudo apt-get install wireguard
Ubuntuホストの場合、wireguardのインストール中にプロンプトが表示されたら、デフォルト値を受け入れるだけです。 Wireguardを機能させるには、OSを最新バージョンにアップグレードすることが非常に重要であることに注意してください。
ホストを再起動して、Wireguardカーネルモジュールをロードします。
$ reboot
起動したら、すべてのノードの/ etc/hosts内のホストマッピングを次のように構成します。
$ cat /etc/hosts
3.25.96.229 cc clustercontrol office.mydomain.com
54.151.183.93 aws1 db1 mariadb1 db1.mydomain.com
35.247.147.95 gcp2 db2 mariadb2 db2.mydomain.com
127.0.0.1 localhost
**このセクションのすべての手順は、特に指定がない限り、すべてのノードで実行する必要があります。
1)rootユーザーとしてのすべてのノードで、秘密鍵を生成し、安全なアクセス許可を割り当てます
$ umask 077
$ wg genkey > /root/private
2)次に、wg0:
という新しいインターフェースを追加します。$ ip link add wg0 type wireguard
3)対応するIPアドレスをwg0インターフェースに追加します:
ホスト「cc」の場合:
$ ip addr add 192.168.50.100/32 dev wg0
$ ip addr add 192.168.50.101/32 dev wg0
ホスト「gcp2」の場合:
$ ip addr add 192.168.50.102/32 dev wg0
4)リスニングポートを55555にし、生成された秘密鍵をWireguardインターフェースに割り当てます。
$ wg set wg0 listen-port 55555 private-key /root/private
5)ネットワークインターフェースを起動します:
$ ip link set wg0 up
6)インターフェースが起動したら、「wg」コマンドで確認します。
(cc1)$ wg
interface: wg0
public key: sC91qhb5QI4FjBZPlwsTLNIlvuQqsALYt5LZomUFEh4=
private key: (hidden)
listening port: 55555
(aws1) $ wg
interface: wg0
public key: ZLdvYjJlaS56jhEBxWGFFGprvZhtgJKwsLVj3zGonXw=
private key: (hidden)
listening port: 55555
(gcp2) $wg
interface: wg0
public key: M6A18XobRFn7y7u6cg8XlEKy5Nf0ZWqNMOw/vVONhUY=
private key: (hidden)
listening port: 55555
これで、すべてを接続する準備が整いました。
次に、すべてのノードをピアとして追加し、それらが相互に通信できるようにします。このコマンドには、4つの重要なパラメーターが必要です。
- ピア :ターゲットホストの公開鍵。
- 許可されたips :通信が許可されているホストのIPアドレス。
- エンドポイント :ホストとWireguardおよびリスニングポート(ここでは、ポート55555を使用するようにすべてのノードを構成します)。
- 永続的-キープアライブ :NATおよびステートフルファイアウォールは「接続」を追跡するため、NATの背後にあるピアまたはファイアウォールが着信パケットを受信する場合は、キープアライブパケットを定期的に送信することにより、NAT/ファイアウォールマッピングを有効に保つ必要があります。デフォルト値は0(無効)です。
したがって、ホストccで、「aws1」と「gcp2」を追加する必要があります。
$ wg set wg0 peer ZLdvYjJlaS56jhEBxWGFFGprvZhtgJKwsLVj3zGonXw= allowed-ips 192.168.50.101/32 endpoint aws1:55555 persistent-keepalive 25
$ wg set wg0 peer M6A18XobRFn7y7u6cg8XlEKy5Nf0ZWqNMOw/vVONhUY= allowed-ips 192.168.50.102/32 endpoint gcp2:55555 persistent-keepalive 25
$ wg set wg0 peer sC91qhb5QI4FjBZPlwsTLNIlvuQqsALYt5LZomUFEh4= allowed-ips 192.168.50.100/32 endpoint cc:55555 persistent-keepalive 25
$ wg set wg0 peer M6A18XobRFn7y7u6cg8XlEKy5Nf0ZWqNMOw/vVONhUY= allowed-ips 192.168.50.102/32 endpoint gcp2:55555 persistent-keepalive 25
$ wg set wg0 peer sC91qhb5QI4FjBZPlwsTLNIlvuQqsALYt5LZomUFEh4= allowed-ips 192.168.50.100/32 endpoint gcp2:55555 persistent-keepalive 25
$ wg set wg0 peer ZLdvYjJlaS56jhEBxWGFFGprvZhtgJKwsLVj3zGonXw= allowed-ips 192.168.50.101/32 endpoint aws1:55555 persistent-keepalive 25
すべてのホストから、お互いにpingを実行し、返信が届くようにします。
(cc)$ ping 192.168.50.101 # aws1
(cc)$ ping 192.168.50.102 # gcp2
(aws1)$ ping 192.168.50.101 # cc
(aws1)$ ping 192.168.50.102 # gcp2
(gcp2)$ ping 192.168.50.100 # cc
(gcp2)$ ping 192.168.50.101 # aws1
「wg」出力をチェックして、現在のステータスを確認します。ホストccの観点からの出力は次のとおりです。
interface: wg0
public key: sC91qhb5QI4FjBZPlwsTLNIlvuQqsALYt5LZomUFEh4=
private key: (hidden)
listening port: 55555
peer: M6A18XobRFn7y7u6cg8XlEKy5Nf0ZWqNMOw/vVONhUY=
endpoint: 35.247.147.95:55555
allowed ips: 192.168.50.102/32
latest handshake: 34 seconds ago
transfer: 4.70 KiB received, 6.62 KiB sent
persistent keepalive: every 25 seconds
peer: ZLdvYjJlaS56jhEBxWGFFGprvZhtgJKwsLVj3zGonXw=
endpoint: 54.151.183.93:55555
allowed ips: 192.168.50.101/32
latest handshake: 34 seconds ago
transfer: 3.12 KiB received, 9.05 KiB sent
persistent keepalive: every 25 seconds
すべてのステータスは良好に見えます。ノード間のエンドポイント、ハンドシェイクステータス、および帯域幅ステータスを確認できます。この構成を構成ファイルに永続化して、WireGuardで簡単にロードできるようにします。 /etc/wireguard/wg0.confにあるファイルに保存します。まず、ファイルを作成します:
$ touch /etc/wireguard/wg0.conf
次に、インターフェイスwg0のランタイム構成をエクスポートし、「wg-quick」コマンドを使用してwg0.confに保存します。
$ wg-quick save wg0
構成ファイルの内容を確認します(ホスト「cc」の例):
(cc)$ cat /etc/wireguard/wg0.conf
[Interface]
Address = 192.168.50.100/24
ListenPort = 55555
PrivateKey = UHIkdA0ExCEpCOL/iD0AFaACE/9NdHYig6CyKb3i1Xo=
[Peer]
PublicKey = ZLdvYjJlaS56jhEBxWGFFGprvZhtgJKwsLVj3zGonXw=
AllowedIPs = 192.168.50.101/32
Endpoint = 54.151.183.93:55555
PersistentKeepalive = 25
[Peer]
PublicKey = M6A18XobRFn7y7u6cg8XlEKy5Nf0ZWqNMOw/vVONhUY=
AllowedIPs = 192.168.50.102/32
Endpoint = 35.247.147.95:55555
PersistentKeepalive = 25
コマンドwg-quickは、WireGuardインターフェースを管理および構成するためのいくつかの優れたショートカットを提供します。このツールを使用して、ネットワークインターフェイスを上下させます。
(cc)$ wg-quick down wg0
[#] ip link delete dev wg0
(cc)$ wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 192.168.50.100/24 dev wg0
[#] ip link set mtu 8921 up dev wg0
最後に、起動時にこのインターフェースをロードするようにsystemdに指示します:
$ systemctl enable [email protected]
Created symlink /etc/systemd/system/multi-user.target.wants/[email protected] → /lib/systemd/system/[email protected]
この時点で、VPN構成が完了し、展開を開始できます。
アーキテクチャ内のすべてのノードが相互に通信できるようになったら、ClusterControlを使用してMariaDBレプリケーションをデプロイするための最後のステップに進みます。
ClusterControlをccにインストールします:
(cc)$ wget https://severalnines.com/downloads/cmon/install-cc
(cc)$ chmod 755 install-cc
(cc)$ ./install-cc
インストールが完了するまで、指示に従ってください。次に、ClusterControlホストから両方のMariaDBノードへのパスワードなしのSSHを設定する必要があります。まず、ユーザーrootのSSHキーを生成します:
(cc)$ whoami
root
(cc)$ ssh-keygen -t rsa # press Enter for all prompts
/root/.ssh/id_rsa.pubの公開鍵コンテンツを/root/.ssh/authorized_keysの下のMariaDBノードにコピーします。これは、rootがホストへのSSHを許可されていることを前提としています。それ以外の場合は、それに応じてこれを許可するようにSSHデーモンを構成します。パスワードなしのSSHが正しく設定されていることを確認します。 ClusterControlノードで、リモートSSHコマンドを実行し、パスワードプロンプトなしで正しい応答が返されることを確認します。
(cc)$ ssh 192.168.50.101 "hostname"
aws1
(cc)$ ssh 192.168.50.102 "hostname"
gcp2
これで、MariaDBレプリケーションをデプロイできます。 Webブラウザーを開き、http:// public_ip_of_CC /clustercontrolのClusterControlUIに移動して、スーパー管理者ユーザーのログインを作成します。 「デプロイ」->「MySQLレプリケーション」に移動し、以下を指定します:
次に、バージョン10.4のベンダーとして「MariaDB」を選択します。 MariaDBのルートパスワードも指定します。 [トポロジの定義]セクションで、次のスクリーンショットのように、MariaDBノードのWireguard IPアドレス(wg0)を指定します。
[展開]をクリックして、展開が完了するまで待ちます。完了すると、次のように表示されます。
現在、MariaDBレプリケーションのセットアップは3つの異なる場所(オフィス、AWS、GCP)で実行されており、ノード間の安全なVPNトンネリングに接続されています。