Назад | Перейти на главную страницу

Облако географической репликации MySQL

В настоящее время у меня есть стандартная локальная установка LAMP (2 веб-сервера, главный / подчиненный MySQL, балансировщик нагрузки). Это меня сильно раздражает локально, но мои глобальные пользователи испытывают медлительность.

Я хочу установить несколько узлов amazon ec2 на нескольких континентах. Веб-часть не является проблемой, поскольку я могу развернуть код на всех географических веб-серверах. Однако всем им для работы нужны данные из базы данных.

Как лучше всего иметь единый дизайн базы данных для всех географических регионов? Я думал о том, чтобы иметь локальные базы данных в каждом месте и реплицировать их в другие места. Записи из одного места не нужно сразу же читать из другого, но мне определенно нужна скорость его локальной базы данных.

Как бы я сделал это без конфликтующих первичных ключей и тому подобного?

Есть ли лучший архитектурный проект?

Спасибо за вашу помощь.

Шаг 1: Настройте репликацию MySQL Master / Slave с SSL: Запустите два экземпляра 64-битного экземпляра EC2 с базой данных MySQL на EC2. Вся настройка выполняется в облаке AWS Classic, а не в Amazon VPC. Главный MySQL Amazon EC2 находится в регионе US-EAST (Master US-East-1a), а One Amazon EC2 для подчиненного сервера MySQL в Азиатско-Тихоокеанском регионе Сингапура (ap-southeast-1a)

Шаг 2. Настройте следующие шаги на MySQL Master и Slave Amazon EC2. Чтобы включить SSL, отредактируйте файл my.cnf

  vim /etc/my.cnf

Добавьте строку со словом ssl в раздел [mysqld]:
ssl перезапустить MySQL

  mysql> show variables like '%ssl%';
  +---------------+-------+
  | Variable_name | Value |
  +---------------+-------+
  | have_openssl  | YES   |
  | have_ssl      | YES   |
  | ssl_ca        |       |
  | ssl_capath    |       |
  | ssl_cert      |       |
  | ssl_cipher    |       |
  | ssl_key       |       |
  +---------------+-------+

7 рядов в наборе (0,00 сек)

Ответ показывает, что теперь SSL включен.

Шаг 3. Шаги по созданию сертификатов SSL в MySQL EC2 Теперь нам нужно создать сертификаты CA, сервера и клиента, необходимые для SSL-соединений. Создайте эти сертификаты в каталоге / etc / mysql / certs /

Шаг 3.1: В MySQL Master EC2 - создайте сертификат CA / Server / Client: mkdir -p / etc / mysql / certs cd / etc / mysql / certs openssl genrsa 2048> ca-key.pem openssl req -new -x509 -nodes - дней 1000 -key ca-key.pem> ca-cert.pem

Создать сертификат сервера: openssl req -newkey rsa: 2048 -days 1000 -nodes -keyout server-key.pem> server-req.pem openssl x509 -req -in server-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem - set_seial 01> server-cert.pem

Создать сертификат клиента:

  openssl req -newkey rsa:2048 -days 1000 -nodes -keyout client-key.pem > client-req.pem
  openssl x509 -req -in client-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem

ПРИМЕЧАНИЕ. Используйте «Уникальные общие имена» при создании сертификатов, иначе SSL не будет работать. Добавьте следующие строки ssl-ca, ssl-cert и ssl-key в раздел [mysqld] в /etc/my.cnf

 [mysqld]
 ssl
 ssl-ca=/etc/mysql/certs/ca-cert.pem
 ssl-cert=/etc/mysql/certs/server-cert.pem
 ssl-key=/etc/mysql/certs/server-key.pem

Перезапустите MySQL, чтобы загрузить конфигурации SSL.

Шаг 3.2: Настройте сертификаты на MySQL Slave EC2 Скопируйте следующие файлы сертификатов в MySQL Slave EC2 с помощью SCP в новый каталог с именем /etc/mysql/certs/ca-cert.pem,client-cert.pem,client-key.pem , server-cert.pem, server-key.pem Добавьте следующее в MySQL Slave /etc/my.cnf в [mysqld]

  [mysqld]
  ssl
  ssl-ca=/etc/mysql/certs/ca-cert.pem
  ssl-cert=/etc/mysql/certs/client-cert.pem
  ssl-key=/etc/mysql/certs/client-key.pem

Перезапустите MySQL, чтобы загрузить конфигурацию SSL.

Шаг 4: Настройка параметров репликации Шаг 4.1: В MySQL Master Amazon EC2 Добавьте следующее в /etc/my.cnf под [mysqld] server_id = 1 log_bin = /var/log/mysql/mysql-bin.log #log_bin_index = / var /log/mysql/mysql-bin.log.index max_binlog_size = 100M expire_logs_days = 1

Перезагрузите MySQL

  service mysqld restart

Выполните следующее в терминале оболочки MySQL EC2 Мастера:
Примечание. Строка REQUIRE SSL не является обязательной; если вы его оставите, slave_user будет разрешено подключаться через зашифрованные, а также через незашифрованные соединения. Если вы используете REQUIRE SSL, то между ведомым и ведущим разрешены только зашифрованные соединения.

  $ mysql -u root -p
  mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave_user1'@'%' IDENTIFIED BY 'mysql_mslave1' REQUIRE SSL;
  mysql> FLUSH PRIVILEGES;
  mysql> FLUSH TABLES WITH READ LOCK;
  mysql> show master status;
  +------------------+----------+--------------+------------------+
  | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
  +------------------+----------+--------------+------------------+
  | mysql-bin.000001 |      335  |              |                  |
  +------------------+----------+--------------+------------------+
  1 row in set (0.00 sec)

  mysql> unlock tables;
  mysql> quit

Шаг 4.2: В экземпляре MySQL Slave EC2: отредактируйте файл my.cnf server-id = 2 log_bin = /var/log/mysql/mysql-bin.log #log_bin_index = /var/log/mysql/mysql-bin.log. индекс max_binlog_size = 100M expire_logs_days = 1

Перезапустить службу MySQL mysqld restart

Выполните следующее в терминале оболочки MySQL EC2 Slave:

 mysql -u root -p
 mysql slave stop;
 mysql> CHANGE MASTER TO MASTER_HOST='ec2-IP-49.compute-1.amazonaws.com',    MASTER_USER='slave_user1', MASTER_PASSWORD='mysql_mslave1', MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=107,MASTER_SSL=1, MASTER_SSL_CA = '/etc/mysql/certs/ca-cert.pem', MASTER_SSL_CERT = '/etc/mysql/certs/client-cert.pem', MASTER_SSL_KEY = '/etc/mysql/certs/client-key.pem';
 mysql> START SLAVE;
 mysql> SHOW SLAVE STATUS;
 ** there should be a message "Waiting for master to send event"
 mysql>quit

Шаг 5: Проверка межрегиональной репликации MySQL AWS между ведущим и ведомым MySQL: на экземпляре MySQL Master EC2 mysql -u root -pmysql> создать базу данных rep_test_US_APAC; mysql> используйте rep_test_US_APAC; mysql> СОЗДАТЬ ТАБЛИЦУ t1 (c1 int, c2 var (100));

Примечание. В MySQL Slave Amazon EC2 в APAC вы можете найти эту базу данных, и таблица будет создана. Следующий шаг, вставьте данные в главный сервер MySQL EC2, через несколько секунд / минут после проверки задержки репликации вы обнаружите, что данные присутствуют на ведомом устройстве. Прекратите вставлять записи в ведущее устройство и убедитесь, что ведомое устройство обновлено, проверьте состояние задержки репликации на ведомом EC2, применив следующую команду

 $ mysql -u root -p -e 'show slave status\G' | grep -i seconds
 Seconds_Behind_Master: 0

 SHOW SLAVE STATUS \G

Примечание. Важно, чтобы и Slave_IO_Running, и Slave_SQL_Running имели в выходных данных значение «Да» (в противном случае что-то пошло не так, и вам следует снова проверить шаги конфигурации и / var / log / syslog, чтобы узнать о любых ошибках); поскольку сейчас вы используете SSL-соединение, вы также должны найти значения в полях Master_SSL_Allowed, Master_SSL_CA_File, Master_SSL_Cert и Master_SSL_Key.

Докажите, что проблема в сетевых задержках

Есть много причин, по которым пользователи испытывают медлительность.

Хотя вы можете попробовать решить эту проблему с локальными экземплярами MySQL во многих географических точках, такая настройка будет сложной (и довольно дорогой).

Если возможно, вам следует изучить другие варианты (например, логику базы данных и приложения).

Ваше приложение

Вы исследовали логику своего приложения?

У вас может быть слишком много вызовов базы данных, которые замедляют работу вашего приложения в целом. Следует изучить такие вещи, как индексы базы данных, механизмы хранения, типы полей базы данных и другие варианты оптимизации.

Вы можете воспользоваться преимуществами AWS ElastiCache (http://aws.amazon.com/elasticache/) или используйте другие методы кэширования для хранения локальных копий данных в вашем приложении в течение коротких периодов времени.

Вы также можете рассмотреть возможность использования NoSQL для частей вашего приложения, если вы не можете полностью заменить MySQL.

Подобные изменения могут иметь огромное влияние на относительную медлительность вашего приложения.

RDS - База данных отношений

У Amazon есть сервис под названием Amazon Relational Database Service (Amazon RDS).

http://aws.amazon.com/rds/

Если вам необходимо использовать реляционную базу данных, вы можете найти RDS полезным. В частности, следующие функции могут дать вам желаемый прирост производительности.

Предоставленный IOPS - Вы можете преобразовать стандартное хранилище в хранилище с выделенным IOPS и получить стабильную пропускную способность и низкие задержки ввода-вывода.

Читать реплики которые можно использовать вместе для повышения доступности базы данных

Хотя это не поможет с задержкой в ​​сети, с которой могут столкнуться ваши пользователи. Прежде чем двигаться дальше, вы должны убедиться, что проблема заключается в задержке сети (и что проблема не только в медленном интернет-провайдере или ссылке на стороне клиента).

Другие решения БД (NoSQL)

У AWS есть еще несколько вариантов, http://aws.amazon.com/running_databases/

С помощью SimpleDB или DynamoDB может лучше соответствовать вашим потребностям.

http://aws.amazon.com/dynamodb/

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

http://aws.amazon.com/simpledb/

Amazon SimpleDB - полностью управляемый сервис, обеспечивающий базу данных без схемы, надежность и многое другое.