① ConoHa VPS でWebサーバーとDBサーバーを分離する


最終的にやりたいことと背景

個人で小規模ながら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に接続します。

デバイス一覧を確認します。

# 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

このように出ていたら成功です。

次回記事:② ConoHa VPS で複数WebサーバーとDBサーバーの構成を作る