- Обзор
- Создание WordPress WebApp с in-app MySQL
- Подключение MySQL In App к существующему WebApp WordPress
- Подключение MySQL In App к новому пустому WebApp
- Сравнение Azure MySQL in-app vs Azure ClearDB
Содержание
Обзор
Не так давно 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:
Выбираем MySQL In App, после развёртывания самого приложения – переходим по его URL-у, и заканчиваем установку как обычно:
Что бы проверить текущие настройки подключения 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', ''); ...
Функция 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):
Подключение MySQL In App к существующему WebApp WordPress
Создаём WordPress WebApp, указав Database Provider == ClearDB.
Продолжаем установку, как обычно:
Проверяем базу:
$ 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 String “defaultConnection“:
Которая создаётся самим Azure для подключения WordPress к его ClearDB базе.
Возвращаемся к WebApp, и подключаем MySQL In App:
Через KUDU => ProcessExplorer – проверяем наличие процесса mysqld
(появился не сразу – иногда полминуты, иногда 5 минут):
Через KUDU => DebugConsole – проверяем наличие файла MYSQLCONNSTR_localdb.txt
(тоже появился не сразу):
Дальше – потребовался “хак”: удаляем defaultConnection из Application Settings – и открываем phpMyAdmin (WebApp => MySQL In App => Manage):
Без удаления этой Connection String – phpMyAdmin открывал 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', ''); ...
Создаём дамп старый ClearDB базы (ну, или не создаём: Azure: почему никогда UPD #14):
$ mysqldump -h eu-cdbr-azure-west-d.cloudapp.net -u olduser -p old_database > old_database.sql
И загружаем дамп (до 8 мб, свыше – см. тут>>>) через phpMyAdmin (т.к. удалённого доступа к этому инстансу MySQL нет):
Проверяем WordPress:
Что бы проверить какая база используется – добавляем пользователя:
И проверяем таблицу wp_users
базы:
Готово.
Подключение 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