Azure: настройка MySQL in-app (Preview) для Web Apps и сравнение с ClearDB

Автор: | 19/09/2016
 

azure_logo

Обзор

Не так давно Azure анонсировала поддержку MySQL для Azure Application Services, aka WebApp.

Благодаря ей – вам не требуется больше беспокоиться о развёртывании MySQL сервера и баз на нём, достаточно установить элемент “MySQL in-app(Preview)” в ON при создании WebApp – и Azure развернёт его вместе с базой данных.

Преимущества in-app MySQL:

  • поддержка любых приложений, требующих MySQL базу – WordPress, Joomla , Drupal и т.д.;
  • сервер MySQL работаем на том же инстансе, что и веб-сервер с вашим приложением, что положительно (теоретически) влияет на производительность;
  • дисковый объём вашего приложения делится вместе с файлами баз данных (имейте ввиду, что на Free и Shared хостинг-ланах – вы можете столкнутся с нехваткой места);
  • вы можете включить slow_query лог для MySQL (имейте ввиду – что это может повлиять на производительность приложения – не стоит его оставлять включенным на PROD-окружении).

Недостатки/ограничения:

  • Auto scale не поддерживается;
  • Local Cache не поддерживается;
  • удалённый доступ к базам данных не поддерживается (только через phpMyAdmin или утилиты KUDU);
  • App Service Environment не поддерживается.

Создание WordPress WebApp с in-app MySQL

У нас имеется WordPress, уже работающий с ClearDB (падения баз которой на пару часов – совершенно нормальная вещь для Azure), которое мы хотим перенести на MySQL In App.

Сначала – создадим “голый” WebApp сервис с WordPress и MySQL in-app, а потом – переключим существующую установку WP с ClearDB на MySQL in-app.

Переходим в Portal > Marketplace, находим WordPress, начинаем настройку.

Обратите внимание – что теперь при создании WebApp можно сразу выбрать ClearDB или MySQL In App:

azure-mysql-in-app-1

Выбираем MySQL In App, после развёртывания самого приложения – переходим по его URL-у, и заканчиваем установку как обычно:

azure-mysql-in-app-2

Что бы проверить текущие настройки подключения WordPress приложения к MySQL – открываем App Service Editor, доступный по адресу https://<application-name>.scm.azurewebsites.net/dev/wwwroot/ и проверяем wp-config.php:

...
$connectstr_dbhost = '';
$connectstr_dbname = '';
$connectstr_dbusername = '';
$connectstr_dbpassword = '';

foreach ($_SERVER as $key => $value) {
    if (strpos($key, "MYSQLCONNSTR_") !== 0) {
        continue;
    }
    
    $connectstr_dbhost = preg_replace("/^.*Data Source=(.+?);.*$/", "\\1", $value);
    $connectstr_dbname = preg_replace("/^.*Database=(.+?);.*$/", "\\1", $value);
    $connectstr_dbusername = preg_replace("/^.*User Id=(.+?);.*$/", "\\1", $value);
    $connectstr_dbpassword = preg_replace("/^.*Password=(.+?)$/", "\\1", $value);
}

// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME', $connectstr_dbname);

/** MySQL database username */
define('DB_USER', $connectstr_dbusername);

/** MySQL database password */
define('DB_PASSWORD', $connectstr_dbpassword);

/** MySQL hostname */
define('DB_HOST', $connectstr_dbhost);

/** Database Charset to use in creating database tables. */
define('DB_CHARSET', 'utf8');

/** The Database Collate type. Don't change this if in doubt. */
define('DB_COLLATE', '');
...

azure-mysql-in-app-3

Функция preg_replace() получает из переменной окружения %MYSQLCONNSTR_localdb%, которая получает значения из файла MYSQLCONNSTR_localdb.txt:

PS D:\home\data\mysql> type MYSQLCONNSTR_localdb.txt
Database=azuredb;Data Source=127.0.0.1:51869;User Id=azure;Password=password

И задаёт значение переменных с именем хоста, базой, пользователем и паролем.

Управление базой доступно через phpMyAdmin (https://<application-name>.scm.azurewebsites.net/phpMyAdmin):

mysq-in-app-2

Подключение MySQL In App к существующему WebApp WordPress

Создаём WordPress WebApp, указав Database Provider == ClearDB.

mysq-in-app-5

Продолжаем установку, как обычно:

mysq-in-app-6

Проверяем базу:

$ mysql -h eu-cdbr-azure-west-d.cloudapp.net -u dbuser -p -D jm_wp_cleardb_to_inapp
Enter password: 
...
mysql> select * from wp_users;
+----+------------+------------------------------------+---------------+--------------------+----------+---------------------+---------------------+-------------+--------------+
| ID | user_login | user_pass                          | user_nicename | user_email         | user_url | user_registered     | user_activation_key | user_status | display_name |
+----+------------+------------------------------------+---------------+--------------------+----------+---------------------+---------------------+-------------+--------------+
|  1 | admin      | $P$***Oav/ | admin         | [email protected] |          | 2016-09-19 10:58:22 |                     |           0 | admin        |
+----+------------+------------------------------------+---------------+--------------------+----------+---------------------+---------------------+-------------+--------------+
1 row in set (0.04 sec)

Обратите внимание, что при создании WebApp с WordPress, который использует ClearDB – в Application Settins этого WebApp будет добавлена Connection StringdefaultConnection“:

mysq-in-app-7

Которая создаётся самим Azure для подключения WordPress к его ClearDB базе.

Возвращаемся к WebApp, и подключаем MySQL In App:

mysq-in-app-8

Через KUDU => ProcessExplorer – проверяем наличие процесса mysqld (появился не сразу – иногда полминуты, иногда 5 минут):

mysq-in-app-9

Через KUDU => DebugConsole – проверяем наличие файла MYSQLCONNSTR_localdb.txt (тоже появился не сразу):

mysq-in-app-10

Дальше – потребовался “хак”: удаляем defaultConnection из Application Settings – и открываем phpMyAdmin (WebApp => MySQL In App => Manage):

mysq-in-app-12

Без удаления этой Connection StringphpMyAdmin открывал ClearDB сервер и старую базу (Hello, Azure!). Впрочем – строка через минуту вернулась (потом пропала 🙂 ), но работать с phpMyAdmin уже можно.

С помощью App Service Editor (https://<app-name>.scm.azurewebsites.net/dev/wwwroot/wp-config.php) – обновляем настройки WordPress.

Т.к. в данном примере – WP устанавливался через Marketplace – у него уже есть все необходимые параметры. В случае ручной установки – необходимо отредактировать файл wp-config.php и добавить вызов preg_replace():

...
foreach ($_SERVER as $key => $value) {
    if (strpos($key, "MYSQLCONNSTR_") !== 0) {
        continue;
    }
    
    $connectstr_dbhost = preg_replace("/^.*Data Source=(.+?);.*$/", "\\1", $value);
    $connectstr_dbname = preg_replace("/^.*Database=(.+?);.*$/", "\\1", $value);
    $connectstr_dbusername = preg_replace("/^.*User Id=(.+?);.*$/", "\\1", $value);
    $connectstr_dbpassword = preg_replace("/^.*Password=(.+?)$/", "\\1", $value);
}

// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME', $connectstr_dbname);

/** MySQL database username */
define('DB_USER', $connectstr_dbusername);

/** MySQL database password */
define('DB_PASSWORD', $connectstr_dbpassword);

/** MySQL hostname */
define('DB_HOST', $connectstr_dbhost);

/** Database Charset to use in creating database tables. */
define('DB_CHARSET', 'utf8');

/** The Database Collate type. Don't change this if in doubt. */
define('DB_COLLATE', '');
...

mysq-in-app-11

Создаём дамп старый ClearDB базы (ну, или не создаём: Azure: почему никогда UPD #14):

$ mysqldump -h eu-cdbr-azure-west-d.cloudapp.net -u olduser -p old_database > old_database.sql

И загружаем дамп (до 8 мб, свыше – см. тут>>>) через phpMyAdmin (т.к. удалённого доступа к этому инстансу MySQL нет):

mysq-in-app-13

Проверяем WordPress:

mysq-in-app-14

Что бы проверить какая база используется – добавляем пользователя:

mysq-in-app-15

И проверяем таблицу wp_users базы:

mysq-in-app-16

Готово.

Подключение MySQL In App к новому пустому WebApp

Создаём “голое” WebApp, активируем MySQL In App. После появления процесса mysqld – через 20-30 минут появился файл MYSQLCONNSTR_localdb.txt (проверяем наличие файла через https://<app-name>.scm.azurewebsites.net/DebugConsolme/?shell=powershell), база и пользователь.

Создаём скрипт:

<?php

$server = '127.0.0.1:53917';
$database = 'azuredb';
$user = 'azure';
$password = 'password';

$dblink = mysql_connect($server, $user, $password);

if ($dblink)
    echo "Connection to the DB server OK\n";
else
    die("Connection to the DB server FAIL\n");

$selected = mysql_select_db($database, $dblink);

if ($selected)
    echo "Connection to the database OK\n";
else
    die("Connection to the database FAIL\n");

?>

Клонируем репозиторий:

$ git clone https://[email protected]:443/jm-nowp-mysql-inapp-test.git
Cloning into 'jm-nowp-mysql-inapp-test'...
Password for 'https://[email protected]:443': 
warning: You appear to have cloned an empty repository.
Checking connectivity... done.
$ cd jm-nowp-mysql-inapp-test/

Добавляем скрипт, пушим:

$ git add mysqltest.php && git commit -m "InitMySQL" && git push

Проверяем:

$ curl http://jm-nowp-mysql-inapp-test.azurewebsites.net/mysqltest.php
Connection to the DB server OK
Connection to the database OK

Готово.

Сравнение Azure MySQL in-app vs Azure ClearDB

Устанавлваем Apache Bench:

$ sudo apt-get install apache2-utils

Проверяем при работе с MySQL In App:

$ ab -n 100 -c 10 http://jm-wp-cleardb-to-mysql-inapp.azurewebsites.net/
This is ApacheBench, Version 2.3 <$Revision: 1528965 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking jm-wp-cleardb-to-mysql-inapp.azurewebsites.net (be patient).....done


Server Software:        Microsoft-IIS/8.0
Server Hostname:        jm-wp-cleardb-to-mysql-inapp.azurewebsites.net
Server Port:            80

Document Path:          /
Document Length:        12012 bytes

Concurrency Level:      10
Time taken for tests:   4.236 seconds
Complete requests:      100
Failed requests:        0
Total transferred:      1247500 bytes
HTML transferred:       1201200 bytes
Requests per second:    23.61 [#/sec] (mean)
Time per request:       423.617 [ms] (mean)
Time per request:       42.362 [ms] (mean, across all concurrent requests)
Transfer rate:          287.59 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       41   42   0.9     42      46
Processing:   201  374 198.9    320    1146
Waiting:      159  331 198.8    277    1104
Total:        243  416 199.4    362    1190

Percentage of the requests served within a certain time (ms)
  50%    362
  66%    390
  75%    418
  80%    424
  90%    658
  95%    977
  98%   1118
  99%   1190
 100%   1190 (longest request)

В Portal – отключаем MySQL In App и переключаемся на ClearDB (defaultConnection в Application Settings приложения должна быть на месте, если нету – добавьте) – и проверяем работу через ClearDB:

$ ab -n 100 -c 10 http://jm-wp-cleardb-to-mysql-inapp.azurewebsites.net/
This is ApacheBench, Version 2.3 <$Revision: 1528965 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking jm-wp-cleardb-to-mysql-inapp.azurewebsites.net (be patient).....done


Server Software:        Microsoft-IIS/8.0
Server Hostname:        jm-wp-cleardb-to-mysql-inapp.azurewebsites.net
Server Port:            80

Document Path:          /
Document Length:        12012 bytes

Concurrency Level:      10
Time taken for tests:   19.200 seconds
Complete requests:      100
Failed requests:        0
Total transferred:      1247500 bytes
HTML transferred:       1201200 bytes
Requests per second:    5.21 [#/sec] (mean)
Time per request:       1920.027 [ms] (mean)
Time per request:       192.003 [ms] (mean, across all concurrent requests)
Transfer rate:          63.45 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       41   42   1.7     42      52
Processing:   246  942 1318.4    360   11330
Waiting:      204  900 1318.3    318   11287
Total:        293  985 1318.4    401   11371

Percentage of the requests served within a certain time (ms)
  50%    401
  66%    711
  75%   1978
  80%   1995
  90%   2346
  95%   2383
  98%   2836
  99%  11371
 100%  11371 (longest request)

Разница заметная.

MySQL In App:

...
Time taken for tests:   4.236 seconds
...
Requests per second: 23.61 [#/sec] (mean) 
Time per request: 423.617 [ms] (mean) 
Time per request: 42.362 [ms] (mean, across all concurrent requests)
Transfer rate: 287.59 [Kbytes/sec] received
...

ClearDB:

...
Time taken for tests:   19.200 seconds
...
Requests per second: 5.21 [#/sec] (mean)
Time per request: 1920.027 [ms] (mean)
Time per request: 192.003 [ms] (mean, across all concurrent requests)
Transfer rate: 63.45 [Kbytes/sec] received
...

Ссылки по теме

Announcing MySQL in-app (Preview) for Web Apps

Exporting your database to MySQL in-app database