最終的にやりたいことと背景
個人で小規模ながらWebサービスを複数個運営していて、本番環境は基本ConohaのVPSにCentOS入れています。
一人でやっているので仕様決めて実装してデプロイして~みたいな一連の流れがサクサク進むのですが、デプロイ時にはサービスを停止するダウンタイムがどうしても発生していて、クリティカルじゃないながらもなんとかしたいと考えています。
色々調べるとCIとかDIとかモダンなやりかたがあるようなのですが、一旦Webサーバーを複数立ててロードバランサでうまく切り替えるなりすることでダウンタイムを無くす方法を勉強してみようと思います。
ロードバランサ入れて複数Webサーバーで切り替えといってもやることは結構あると思っていて、
- WebサーバーとDBサーバーを分離する
- VPSとDBサーバーを構築
- DBサーバーにはデータベースを立てておく
- VPSとDBサーバーを接続
- 複数WebサーバーとDBサーバーの構成を作る
- VPSをWebサーバーとして動くようにする
- そこにPHPの簡単なスクリプトを設置
- スクリプトから前回作成したDBサーバーのデータベースに接続して情報を取得
- フロントに表示
- 2つ目のWebサーバーを作る
- ロードバランサーを導入して複数Webサーバーの割り振り
- Conoha VPSでロードバランサを導入して複数Webサーバーを紐づけ
- Webサーバー側の設定
- ロードバランサによる振り分け実験
あたりが必要になりそうです。
この記事でやること
今回は上記のうち、
- WebサーバーとDBサーバーを分離する
- VPSとDBサーバーを構築
- DBサーバーにはデータベースを立てておく
- VPSとDBサーバーを接続
の部分を進めていきます。
ちなみに今回ほぼこちらの記事通りにすすめています。とてもありがたかったです。
VPSとDBサーバーを構築
一旦VPS一つ、DBサーバー一つをConoha上で構築します。VPSを一つ立てるのですが、まだApacheなどWebサーバー的な要素は加えないので、この記事の中ではVPSと呼んでいきます。
VPSを構築
こちらから新しいVPSを作成します。
構成は最小のもので、OSはCentOSの7.4(最新)を選択。
ネームタグは任意のものにしています。
このVPSは後ほどネットワークを作成する時にシャットダウンされている必要があるので、シャットダウンしておきます。
DBサーバーを構築
続いて先程と同じメニューから新しいDBサーバーを作成します。
DBサーバー
タブを選択して、こちらも一応ネームタグを任意のものに変更して作成します。
続いて今作成したDBサーバーの詳細画面から設定をしていきます。
まずデータベースを作成します。
ここで設定するデータベース名は後ほど接続の際に利用します。
続いてデータベースに接続するユーザーを作成します。
ここで設定するユーザー名とパスワードも後ほど利用します。
今回はパスワードをPassword1234
としています。
さらに、今作成したユーザーが先程作成したデータベースに接続できるように紐づけを行ってあげます。
このタイミングで今作成したデータベースにお手元のクライアント端末PCからアクセスできます。
作成したデータベースを見てみると下記のように、接続先ホスト名が出てきます。
このそれぞれのホストですが、
- グローバルネットワーク:外部からの接続時に利用
- プライベートネットワーク:同一ネットワーク内で利用
という用途になってます。
データベースの操作
この時点でもデータベースへの接続は可能なので、グローバルネットワークを使ってターミナルから接続してみます。パスワードは先程のものを使ってください。
$ mysql -h public.3vptj.tyo1.database-hosting.conoha.io -u 3vptj_test -p 3vptj_test
下記のように出たら成功です。
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 96478140
Server version: 5.5.5-10.0.19-MariaDB-log MariaDB Server
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
ついでに後ほど接続確認の時に使いたいので、簡単なテーブルとデータを作成しておきます。
create table fruit(name varchar(20));
insert into fruit values ('apple');
select * from fruit;
最後のセレクト文の結果が下記のようになっているかと思います。
+-------+
| name |
+-------+
| apple |
+-------+
1 row in set (0.11 sec)
VPSとDBサーバーを接続
それではConohaに戻り、プライベートネットワーク
メニュー内のDBサーバー接続用ネットワーク
からVPSをDBサーバーに接続する設定を行います。下記スクショのとおりです。
サーバーリストからtestVPS1
を選択してネットワーク情報
を見てみると、表示NIC
に今接続されたDBサーバーが見れるようになっています。
ここにある
- IPアドレス
- ゲートウェイ
は後ほどVPSからデータベースに接続するときに活用します。
VPSは起動しておきます。
VPSでの接続設定
ターミナルからSSH接続でVPSに接続します。
ssh root@133.130.118.38
デバイス一覧を確認します。
# nmcli d
DEVICE TYPE STATE CONNECTION
eth0 ethernet 接続済み eth0
eth1 ethernet 切断済み --
lo loopback 管理無し --
今回はeth1
というデバイスを利用したいのですが切断済みになっているので、networkを再起動します。
# systemctl restart network
もう一度デバイス一覧を確認します。
# nmcli d
DEVICE TYPE STATE CONNECTION
eth0 ethernet 接続済み eth0
eth1 ethernet 接続中 (IP 設定を取得中) Wired connection 1
lo loopback 管理無し
の名前をeth1
とそろえてあげます。
# nmcli c m "Wired connection 1" connection.interface-name eth1 connection.id eth1
改めて確認すると反映されているのがわかります。
# nmcli d
DEVICE TYPE STATE CONNECTION
eth0 ethernet 接続済み eth0
eth1 ethernet 接続中 (IP 設定を取得中) eth1
lo loopback 管理無し
IPアドレスを設定します。先程のtestVPS1
>ネットワーク情報
>表示NIC
にあったものです。
# nmcli c m eth1 ipv4.method manual ipv4.addresses 172.21.139.213/24 connection.autoconnect yes
続いてゲートウェイを設定します。これも先程のtestVPS1
>ネットワーク情報
>表示NIC
にあったものです。
# nmcli c modify eth1 ipv4.gateway 172.21.138.1
続いてこのネットワーク用の静的ルーティングを設定します。書式は下記です。
ip route add [リージョンのIP] via [ゲートウェイのIP] dev [インタフェース名(例:eth1)]
リージョンのIPは
東京リージョン:
(IPアドレスが172.21.***.***の場合)172.21.74.0/23
(IPアドレスが172.29.***.***の場合)172.29.92.0/23
アメリカリージョン: 172.21.92.0/23
シンガポールリージョン: 172.21.110.0/23
なので、今回は172.21.74.0/23
が該当します。
コマンドを実行します。
# ip route add 172.21.74.0/23 via 172.21.138.1 dev eth1
もしRTNETLINK answers: Network is unreachable
と出たら、systemctl restart network
でnetworkを再起動してから実行してください。
詳細を確認してみます。
# nmcli d show eth1
GENERAL.DEVICE: eth1
GENERAL.TYPE: ethernet
GENERAL.HWADDR: FA:16:3E:4B:B4:5A
GENERAL.MTU: 1500
GENERAL.STATE: 100 (接続済み)
GENERAL.CONNECTION: eth1
GENERAL.CON-PATH: /org/freedesktop/NetworkManager/ActiveConnection/17
WIRED-PROPERTIES.CARRIER: オン
IP4.ADDRESS[1]: 172.21.139.213/24
IP4.GATEWAY: 172.21.138.1
IP4.ROUTE[1]: dst = 172.21.139.0/24, nh = 0.0.0.0, mt = 101
IP4.ROUTE[2]: dst = 172.21.138.1/32, nh = 0.0.0.0, mt = 101
IP4.ROUTE[3]: dst = 172.21.74.0/23, nh = 172.21.138.1, mt = 0
IP4.ROUTE[4]: dst = 0.0.0.0/0, nh = 172.21.138.1, mt = 101
IP6.ADDRESS[1]: fe80::1a20:1a60:c9f6:ae0b/64
IP6.GATEWAY: --
IP6.ROUTE[1]: dst = fe80::/64, nh = ::, mt = 101
IP6.ROUTE[2]: dst = ff00::/8, nh = ::, mt = 256, table=255
pingでVPSからDBサーバーに接続できるか試してみます。
# ping -c 3 private.3vptj.tyo1.database-hosting.conoha.io
PING private.unit01.database-hosting.tyo1.conoha.io (172.21.74.19) 56(84) bytes of data.
64 bytes from 172.21.74.19 (172.21.74.19): icmp_seq=1 ttl=63 time=3.39 ms
64 bytes from 172.21.74.19 (172.21.74.19): icmp_seq=2 ttl=63 time=0.275 ms
64 bytes from 172.21.74.19 (172.21.74.19): icmp_seq=3 ttl=63 time=0.272 ms
--- private.unit01.database-hosting.tyo1.conoha.io ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 0.272/1.315/3.399/1.473 ms
このように出ていたら成功です。