はじめに
巷ではAWSが流行っているが、Azureを使用してサービス構築をする機会があったので、その時に色々馴染みがない仕組みが多かったので勘所を書いてみる。
Windows Azureの特徴
- Microsoftが提供しているがLinuxも使用できる
- CentOSもパッケージを提供されているが、なんとサポートがついてる
- データ転送の料金についてAzureデータセンターに入ってくるデータは無料
こんなかんじで作ってみた
例えば下記の様な構成で構築するときに必要だったことをあげてみる。
webが2台、DBが2台で冗長化構成にする。Userからはhttp(port 80)でアクセス出来るようにする。
[表1]構成マトリックス
|hostname|private ip|ssh port|affinity|vnet|subnet|availability|service name|strage|data strage|
|---|---|---|---|---|---|---|---|---|---|---|
|vmweb01|10.0.1.4|30101|vmAffinity01|vmNetwork01|vmSubWeb|vmAvaWeb|vmweb|vmStg01|stgWeb01|
|vmweb02|10.0.1.5|30102|||||||stgWeb02|
|vmdb01|10.0.2.4|30201|||vmSubDb|vmAvaDb|vmdb||stgDb01|
|vmdb02|10.0.2.5|30202|||||||stgDb02|
1.構築のトピック
1-1.ネーミングセンスが問われる!?
上記の図や表の通り、色々なところに名前を付けなければならないのではじめに決めておいたほうが手戻りが少ない。なぜなら、何も知らずに作り始めたら丸々3回全部作りなおすことにな(ry
1-2.透明なロードバランサ!?
ナニ言ってんだと言われそうだが、Azureにロードバランサという名前で機能が見えない。Traffic Managerというのがあるがこれは ロードバランサではない。
じゃあどこにあるのかというと、クラウドサービス(上記vmweb部分)毎にロードバランサのような負荷分散をしてくれるものがある。エンドポイントを指定してあげると ラウンドロビン で振り分けてくれる
クラウドサービス | 負荷分散名 | hostname | global port | private port |
---|---|---|---|---|
vmweb | vmHttpWeb | vmweb1 | 80 | 10080 |
vmweb2 | 80 | 10080 |
上記のような場合に、http://vmweb.cloudapp.net
へアクセスするとvmweb1(またはvmweb2)の10080 portへラウンドロビンでアクセスすることになる。
1-3.定期メンテに耐える構成を!
どんなタイミングで起きるかまだ良くわかっていないが定期メンテナンスでvmが再起動されるらしい。
全台停止等が起きないように対策が必要だが下記の方法を取ることである程度回避できる
- 可用性セット(avvalability set)に入れることで同時にvmは落ちない
- 可用性セットに沢山vmを入れ過ぎない。メンテは実施されるので確立が上がる。
2.グローバルIPをコロコロ変えられないようにしたい!
課題
初期設定のままだとサーバを停止/起動するとグローバルIPが開放されてしまう。
また、定期メンテナンスなどで再起動されてしまうと予定外に設定変更されてしまう。
対策
可用性セット(availability set)を設定することで1つのグローバルIPに対して複数のサーバを存在させることで開放されないようにする。
1台目
azure vm create vmweb 5112500ae3b842c8b9c604889f8753c3__OpenLogic-CentOS-65-20140415 azuser
--ssh 30101
--ssh-cert ./key/myCert_azure.pem
--vm-name=vmweb1
--affinity-group=vmAffinity01
--virtual-network-name=vmNetwork01
--subnet-names=vmSubWeb
--availability-set=vmAvaWeb
--vm-size=small
2台目
azure vm create vmweb 5112500ae3b842c8b9c604889f8753c3__OpenLogic-CentOS-65-20140415 azuser
--ssh 30102
--ssh-cert ./key/myCert_azure.pem
--vm-name=vmweb2
--affinity-group=vmAffinity01
--virtual-network-name=vmNetwork01
--subnet-names=vmSubWeb
--availability-set=vmAvaWeb
--vm-size=small
--connect=vmweb <---(追加)
こんな方法もある
2014/5/7にReserved IP AddressesがリリースされたのでWindows power shellを使うことで固定できるらしい(未検証)
3.プライベートIPも固定したい!
課題
グローバルIPと同様に初期設定のままだとDHCPでの割り当てのため、サーバを停止/起動するとprivate IPも変更されてしまう。
対策
azure power shellを使用して固定する。
Set-AzureStaticVNetIP -VM (Get-AzureVM -ServiceName vmweb -Name vmweb2) -IPAddress 10.0.1.5 | Update-AzureVM
4.DiskI/O分散するためデータストレージを追加するべし!
azure cliを使用してOS用のストレージとは別にデータストレージを追加することでI/Oを分散させること出来る。
ただ、azure cliはLinuxやmacなどで使えるがWindows power shellに比べると対応が遅いのでmac使いの人とかには環境が統一できなくてちょっと不便なところも。
azure vm disk attach-new vmweb1 1000 http://vmweb.blob.core.windows.net/vhd-store/vmweb001.vhd
vmでディスクをマウントする
fdisk /dev/sdc
mkfs -t ext4 /dev/sdc1
mkdir /data
mount /dev/sdc1 /data
cp -p /etc/{fstab,fstab.`date +"%Y%m%d"`}
blkid
vi /etc/fstab
fstabに設定を追加する
UUID=33333333-3b3b-3c3c-3d3d-3e3e3e3e3e3e /data ext4 defaults 1 2
5.swap領域は自分で追加!!
初期設定時はswap領域がないので追加する
cp -p /etc/{waagent.conf,waagent.conf.`date +"%Y%m%d"`}
vi /etc/waagent.conf
@@ -39,10 +39,10 @@
ResourceDisk.MountPoint=/mnt/resource
# Create and use swapfile on resource disk.
-ResourceDisk.EnableSwap=n
+ResourceDisk.EnableSwap=y
# Size of the swapfile.
-ResourceDisk.SwapSizeMB=0
+ResourceDisk.SwapSizeMB=10000
# Respond to load balancer probes if requested by Windows Azure.
LBProbeResponder=y
vi /etc/fstab
/mnt/resource/swapfile swap swap defaults 0 0
6.大規模に作るならコア数に上限(クォータ制限)を解除!
課題
初期設定時はCPU Core数を全VMで20までしか使用できない。
対策
これを解除するのには、管理ポータルにてサポートへ連絡する。100コアまでは比較的容易にあげてくれるが、200コアとかになると審査が必要なため時間がかかるようだ。
7.その他
結局のところ...
メリット
- 性能はそれなりに担保されているので上り通信コストが抑えられることでサービスによっては恩恵を受けられる
- ベンチャー企業へのサポートプログラムがある
- 活発に機能拡張が行われている
- まだ使っている人が少ないので技術的に先行できる可能性がある
- 見積もりツールが見やすい気がする
デメリット
- まだ発展途上な感じは否めない
- AWSと比べてしまうとまだ基本機能は不足している
- Windows Power shell、azure cli、管理ポータルの順に機能が追加されるのでコマンドを色々使わなければならないのが若干煩雑になる
- サポートに問い合わせて数日待ってからの対応だったりするものがあるので時間がかかるときがある
まとめ
AWSでうまくいかない事があれば、Azureに乗り換えを検討してみるのもアリかもしれない。