AWS: RDS Aurora db.t2.medium vs t2.nano и MariaDB

Автор: | 13/12/2016

Сравнение работы RTFM при использовании базы на AWS RDS Aurora db.t2.medium – и t2.nano с MariaDB 10.0.

Причина поиска альтернативы AWS Aurora – простая:

За 12 дней.

Вынес базу временно, так как во время использования MariaDB на одном с web-сервером инстансе – Load Average у него временами поднималась до 5.0-6.0, причём большая часть времени уходила на Steal time (хороший обзор на эту тему и AWS есть тут>>>). Перезд на другой инстанс не помог, а вот смена хоста для баз данных – помогла.

Собственно, ниже – просто сравнение работы блога по результатам Apache Bench при использовании разных серверов баз данных, плюс описание процесса создания нового EC2 инстанса в приватной сети и установки MariaDB на него.

RDS Aurora db.t2.medium

Текущие результаты (AWS RDS Aurora):

$ ab -n 100 -c 10 https://rtfm.co.ua/
...
Concurrency Level:      10
Time taken for tests:   33.438 seconds
Complete requests:      100
Failed requests:        7
   (Connect: 0, Receive: 0, Length: 7, Exceptions: 0)
Total transferred:      10662686 bytes
HTML transferred:       10621186 bytes
Requests per second:    2.99 [#/sec] (mean)
Time per request:       3343.758 [ms] (mean)
Time per request:       334.376 [ms] (mean, across all concurrent requests)
Transfer rate:          311.41 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:      170  177   9.1    173     208
Processing:  1108 3072 463.4   3081    4197
Waiting:      485 2168 425.8   2173    3213
Total:       1304 3249 460.7   3254    4401
...

MariaDB на t2.nano

Подготовка сети

Подробнее про работу с VPC и подсетями – см. в посте AWS: VPC – EC2 в public и private подсетях, NAT и Internet Gateway.

Создаём приватную посеть в default VPC:

$ aws ec2 create-subnet --vpc-id vpc-3941cb5c --cidr-block 172.31.64.0/24 
{
    "Subnet": {
        "VpcId": "vpc-3941cb5c", 
        "CidrBlock": "172.31.64.0/24", 
        "State": "pending", 
        "AvailabilityZone": "eu-west-1a", 
        "SubnetId": "subnet-4490cc32", 
        "AvailableIpAddressCount": 251
    }
}

Добавляем теги:

$ aws ec2 create-tags --resources subnet-4490cc32 --tags Key=Name,Value=rtfm_db_private

Создаём security group:

$ aws ec2 create-security-group --group-name rtfm_db_private --vpc-id vpc-3941cb5c --description "RTFM DB instance access"
{
    "GroupId": "sg-ffb92599"
}

Находим текущую группу RTFM веб-сервера:

$ aws ec2 describe-instances --instance-ids i-a00cfd36 --query '[Reservations[*].Instances[*].SecurityGroups[*].GroupId]' --output text
sg-4753d121

И разрешаем доступ из сети веб-сервера RTFM к новой подсети на порты 3306 и 22:

$ aws ec2 authorize-security-group-ingress --group-id sg-ffb92599 --protocol tcp --port 3306 --source-group sg-4753d121
$ aws ec2 authorize-security-group-ingress --group-id sg-ffb92599 --protocol tcp --port 22 --source-group sg-4753d121

Добавляем NAT-gateway.

Получаем EIP:

$ aws ec2 allocate-address --domain vpc
{
    "PublicIp": "52.212.226.5", 
    "Domain": "vpc", 
    "AllocationId": "eipalloc-00063364"
}

В публичной сети (там же, где RTFM-веб) создаём NAT-gateway:

$ aws ec2 create-nat-gateway --subnet-id subnet-0ee86857 --allocation-id eipalloc-00063364
{
    "NatGateway": {
        "NatGatewayAddresses": [
            {
                "AllocationId": "eipalloc-00063364"
            }
        ], 
        "VpcId": "vpc-3941cb5c", 
        "State": "pending", 
        "NatGatewayId": "nat-0838bcea448529665", 
        "SubnetId": "subnet-0ee86857", 
        "CreateTime": "2016-12-12T14:20:06.847Z"
    }
}

Создаём route table:

$ aws ec2 create-route-table --vpc-id vpc-3941cb5c
{
    "RouteTable": {
        "Associations": [], 
        "RouteTableId": "rtb-32120d56", 
        "VpcId": "vpc-3941cb5c", 
        "PropagatingVgws": [], 
        "Tags": [], 
        "Routes": [
            {
                "GatewayId": "local", 
                "DestinationCidrBlock": "172.31.0.0/16", 
                "State": "active", 
                "Origin": "CreateRouteTable"
            }
        ]
    }
}

Добавляем правило маршрутизации всего трафика через созданный NAT:

$ aws ec2 create-route --route-table-id rtb-32120d56 --nat-gateway-id nat-0838bcea448529665 --destination-cidr-block 0.0.0.0/0
{
    "Return": true
}

Подключаем эту таблицу маршрутизации к приватной сети:

$ aws ec2 associate-route-table --route-table-id rtb-32120d56 --subnet-id subnet-4490cc32 
{
    "AssociationId": "rtbassoc-b7b9fad0"
}

Запуск EC2

Находим AMI тут>>> и запускаем инстанс с Debian 8:

$ aws ec2 run-instances --image-id ami-7d45150e --key-name rtfm_prod --count 1 --instance-type t2.nano --subnet-id subnet-4490cc32 --security-group-ids sg-ffb92599
{
    "OwnerId": "264418146286",
    "ReservationId": "r-0bb77681",
...

Добавляем теги:

$ aws ec2 create-tags --resources i-1ef9bdfe --tags Key=Name,Value=rtfm_db_prod

Копируем ключ на web-инстанс (т.к. доступа “снаружи” к DB-серверу нет – подключаемся через web):

$ scp ~/.ssh/rtfm_prod.pem [email protected]:/home/setevoy

Подключаемся, проверяем доступ к DB:

$ ssh [email protected] -i .ssh/rtfm_prod.pem 
...
admin@ip-172-31-64-60:~$

Проверяем сеть в мир:

admin@ip-172-31-64-60:~$ ping ya.ru -c 1
PING ya.ru (213.180.193.3) 56(84) bytes of data.
64 bytes from www.yandex.ru (213.180.193.3): icmp_seq=1 ttl=44 time=62.5 ms

--- ya.ru ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 62.559/62.559/62.559/0.000 ms

Установка MariaDB

Устанавливаем:

# apt-get install software-properties-common
# apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db
# add-apt-repository 'deb [arch=amd64,i386] http://mirror.23media.de/mariadb/repo/10.1/debian jessie main'
# apt-get update && apt-get install mariadb-server

Т.к. по умолчанию MariaDB слушает localhost – редактируем файл /etc/mysql/my.cnf, и обновляем:

bind-address            = 127.0.0.1

на:

bind-address            = 172.31.64.60

Перезагружаем, проверяем:

# service mysql restart
# netstat -anp | grep 3306
tcp        0      0 172.31.64.60:3306       0.0.0.0:*               LISTEN      11231/mysqld    

Копируем базу:

# mysqldump -h rtfm-prod.cluster-chcmj9clr1dt.eu-west-1.rds.amazonaws.com -u username -p rtfm_db1 > rtfm_db1_aurora_12_12_2016_bkp.sql

На новом инстансе создаём базу и пользователя:

MariaDB [(none)]> create database rtfm_db1;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> grant all privileges on rtfm_db1.* to 'username'@'%' identified by 'password';
Query OK, 0 rows affected (0.01 sec)

Заливаем в неё дамп базы:

# mysql -u username -p rtfm_db1 < rtfm_db1_aurora_12_12_2016_bkp.sql 
Enter password: 

В файле /var/www/vhosts/rtfm/rtfm.co.ua/wp-config.php обновляем настройки WordPress:

...
/** MySQL hostname */
//define('DB_HOST', 'localhost');
//define('DB_HOST', 'rtfm-prod.cluster-chcmj9clr1dt.eu-west-1.rds.amazonaws.com');
define('DB_HOST', '172.31.64.60');
...

Готово.

Сравнение Aurora vs MariaDB

И, наконец-то – сравниваем время ответа блога при использовании MariaDB:

$ ab -n 100 -c 10 https://rtfm.co.ua/
...
Concurrency Level:      10
Time taken for tests:   40.148 seconds
Complete requests:      100
Failed requests:        11
   (Connect: 0, Receive: 0, Length: 11, Exceptions: 0)
Total transferred:      10731886 bytes
HTML transferred:       10690386 bytes
Requests per second:    2.49 [#/sec] (mean)
Time per request:       4014.842 [ms] (mean)
Time per request:       401.484 [ms] (mean, across all concurrent requests)
Transfer rate:          261.04 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:      169  177  26.1    173     432
Processing:  1250 3611 840.3   3536    6927
Waiting:      488 2648 747.3   2592    5445
Total:       1422 3787 839.1   3711    7099

Напомню результаты Aurora:

$ ab -n 100 -c 10 https://rtfm.co.ua/
...
Concurrency Level:      10
Time taken for tests:   33.438 seconds
Complete requests:      100
Failed requests:        7
   (Connect: 0, Receive: 0, Length: 7, Exceptions: 0)
Total transferred:      10662686 bytes
HTML transferred:       10621186 bytes
Requests per second:    2.99 [#/sec] (mean)
Time per request:       3343.758 [ms] (mean)
Time per request:       334.376 [ms] (mean, across all concurrent requests)
Transfer rate:          311.41 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:      170  177   9.1    173     208
Processing:  1108 3072 463.4   3081    4197
Waiting:      485 2168 425.8   2173    3213
Total:       1304 3249 460.7   3254    4401

На Aurora немного быстрее, но стоимость t2.nano и db.t2.medium – $0.0070/час (~5 у.е./мес) и $0.088/час (~60 у.е./мес) соответсвенно (Ирландия, eu-west).

Посмотрим – как новый инстанс будет вести себя в “прайм-тайм”.