База данных в облаке AWS

03/04/2020


Я думаю, что второй облачный ресурс по популярности после виртуальных машин, это различного рода СУБД. Смутно представляю себе современные приложения, которые не используют в качестве одного из основных компонентов базы данных в том или ином виде. Облачные сервисы Amazon AWS дают шикарные варианты по использованию как реляционных, так и не реляционных СУБД. В этой статье хочется показать те удобства, которые получаешь с облачной базой данных MySQL от Amazon. Если выразить основную мысль, которую хотелось бы донести, то облачная СУБД, как и прочие облачные продукты, дает простоту и комфорт в использовании. При этом усилия по администрированию СУБД сводятся к минимуму. Это я думаю особенно важно многим разработчикам, у которых нет времени и желания заниматься вопросами администрирования.

Сервис, который позволяет использовать данный облачный сервис, у AWS называется – RDS (Relational Database Service). С помощью него можно создать и использовать MySQL, MariaDB, PostgreSQL, Oracle SQL, Microsoft SQL Server. Также есть вариант SQL СУБД от Amazon – Aurora. Он представляет собой прокачанный аналог полностью совместимый как с MySQL, так и с PostgreSQL. Amazon заявляет о чуть ли не 5 кратном увеличении производительности базы данных при использовании ее версии продукта. Как бы то ни было, возможность выбора облачной СУБД у Amazon, я думаю, удовлтетворит большинство пользователей. В случае же использования специфичных вариантов и наличия соответствующих знаний, всегда можно развернуть СУБД на своей собственной инфраструктуре.

Пример работы с облачной СУБД

Когда-то в этом блоге уже затрагивал тематику публичных облаков и в частности именно сервисов AWS. Это была статья – Коммандная строка для облака — AWS CLI. Дальше по тексту будем предполагать, что у Вас уже есть доступ к консоли Amazon AWS и сосредоточимся на взаимодействии с сервисом облачной SQL СУБД. Итак перейдем в панели управления AWS в Services -> Database -> RDS. Здесь выбираем сразу Create Database. Откроется страничка с мастером по созданию нужного нам сервера с SQL базой данных. Скриншот экрана с верхней частью страницы представлен ниже.

Как видите, можно выбрать несколько типов СУБД. В нашем конкретном примере мы остановимся на MySQL. При этом дальше в визарде мы можем указать нужную версию MySQL, объем дискового простанства, логин и пароль, а также возможность доступа из Интернета и другие базовые настройки. Заполнив нужные параметры, нажимаем внизу на кнопочку Create Database. Через несколько минут получим готовую СУБД. Скриншот из консоли AWS привожу ниже.

Итак, мы создали СУБД MySQL в облаке, давайте попробуем подключиться к ней и поиграться с ней. Для этого узнаем в свойствах созданной СУБД DNS имя хоста, куда надо подключаться. И в командной строке нашей рабочей системы воспользуемся стандартной утилитой mysql для подключения к СУБД.

# mysql -u admin -p -h mydb2.cj7vsecsdgn46.us-east-2.rds.amazonaws.com 
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 814
Server version: 5.7.22 Source distribution

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.

mysql>                                                                        

Все произойдет так, как будет мы работаем с обычно базой, установленной локально или на соседней виртуалке. Попробуем создать пользователя и отдельную базу для наших эксперементов. Выполним следующие команды в открывшемся mysql клиенте.

mysql> CREATE DATABASE `GlobeData`;

mysql> CREATE USER 'myuser1' IDENTIFIED BY 'Some@Password1';

mysql> GRANT ALL PRIVILEGES ON `GlobeData`.* TO 'myuser1’@‘%’;

mysql> FLUSH PRIVILEGES;

После того как база будет создана, создадим тестовую таблицу, которую будем использовать для эксперементов по записи и чтению из нее. Это делается абсолютно теми же командами, которые используются и при работе с локальной MySQL. Пример команды ниже.

mysql> use GlobeData;
mysql> CREATE TABLE IF NOT EXISTS Countries (
	 country_id INT AUTO_INCREMENT PRIMARY KEY,
	 country_name VARCHAR(255) NOT NULL,
	 quantity_infected INT
);

После того как наша база и табличка в ней созданы, давайте попробуем с помощью скриптов на языке Python записать в них что-то, а после этого считать из базы информацию. Ниже содержание простенько скрипта mysql_insert_db.py, который запишет в нашу БД несколько записей.

import mysql.connector
from mysql.connector import Error

try:
    connection = mysql.connector.connect(host='mydb2.ccj7vsecsdgn46.us-east-2.rds.amazonaws.com',
                                         database='GlobeData',
                                         user='myuser1',
                                         password='Some@Password1')

    mySql_insert_query = """INSERT INTO Countries (country_id, country_name, quantity_infected)
                           VALUES (%s, %s, %s) """

    records_to_insert = [(1, 'China', 81554),
                         (2, 'Italy', 110574),
                         (3, 'Spain', 104118)]

    cursor = connection.cursor()
    cursor.executemany(mySql_insert_query, records_to_insert)
    connection.commit()
    print(cursor.rowcount, "Record inserted successfully into Countries table")

except mysql.connector.Error as error:
    print("Failed to insert record into MySQL table {}".format(error))

finally:
    if (connection.is_connected()):
        cursor.close()
        connection.close()
        print("MySQL connection is closed")

Наши скрипты для обращения к MySQL будут использовать модуль mysql-connector. Чтобы все работало необходимо его установить в систему с помощью команды pip.

# pip install mysql-connector-python

Далее приведен скрипт mysql_query_db.py, который будет считывать данные из нашей базы. При этом так же будет использоваться библиотека mysql-connector.

import mysql.connector
from mysql.connector import Error

try:
    connection = mysql.connector.connect(host='mydb2.cj7vsecsdgn46.us-east-2.rds.amazonaws.com',
                                         database='GlobeData',
                                         user='myuser1',
                                         password='Some@Password1')

    mySql_query = """SELECT country_name, quantity_infected FROM Countries """


    cursor = connection.cursor()
    cursor.execute(mySql_query)
    myresult = cursor.fetchall()

    for row in myresult:
          country = row[0]
          quantity = row[1]
          out = country + " " + str(quantity)
          print(out)

except mysql.connector.Error as error:
    print("Failed to insert record into MySQL table {}".format(error))

finally:
    if (connection.is_connected()):
        cursor.close()
        connection.close()
        print("MySQL connection is closed")

Попробуем запустить наши скрипты и посмотреть, что из этого получится.

# python ./mysql_insert_db.py
(3L, 'Record inserted successfully into Countries table')
MySQL connection is closed
# python ./mysql_query_db.py
China 81554
Italy 110574
Spain 104118
MySQL connection is closed  

Как видим, все работает. Мы можем писать в созданную базу и читать из нее, так как будто она находится на одной из наших виртуальных машин. Нам нужно только указать нужный хост, логин и пароль и все. Остальные заботы по поддержанию работоспособности нашей базы данных берет на себя Amazon.

Выводы

Использование облачной СУБД – один из очередных шагов, который делают многие, переводя свою инфраструктуру в облака. В этой статье хотел показать, что это делается предельно просто и может дать ряд конкретных преимуществ при использовании. Квалифицированных IT специалистов, способных поддерживать на соответствующем уровне в работе СУБД не так много, да и стоимость их времени высока. Облачная СУБД реально может помочь во многих случаях, как при разработке, так уже и в продакшене. Поэтому знание такой возможности будет крайне полезным для IT специалистов.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *