MariaDB
 sql >> база данни >  >> RDS >> MariaDB

MySQL репликация с ProxySQL на WHM/cPanel сървъри:Част първа

WHM и cPanel без съмнение е най-популярният хостинг контролен панел за Linux базирани среди. Той поддържа редица бекендове на база данни - MySQL, MariaDB и PostgreSQL като хранилище за данни на приложението. WHM поддържа само самостоятелни настройки на база данни и можете да я разгърнете локално (конфигурация по подразбиране) или отдалечено, като се интегрирате с външен сървър на база данни. Последното би било по-добре, ако искате да имате по-добро разпределение на натоварването, тъй като WHM/cPanel обработва редица процеси и приложения като HTTP(S), FTP, DNS, MySQL и други.

В тази публикация в блога ще ви покажем как да интегрирате безпроблемно външна настройка за репликация на MySQL в WHM, за да подобрите наличността на базата данни и да разтоварите хостинг сървъра на WHM/cPanel. Доставчиците на хостинг, които изпълняват MySQL локално на сървъра на WHM, ще знаят колко взискателен е MySQL по отношение на използването на ресурсите (в зависимост от броя акаунти, които хоства, и спецификациите на сървъра).

Репликация на MySQL на WHM/cPanel

По подразбиране WHM поддържа както MariaDB, така и MySQL като самостоятелна настройка. Можете да прикачите външен MySQL сървър към WHM, но той ще действа като самостоятелен хост. Освен това потребителите на cPanel трябва да знаят IP адреса на MySQL сървъра и ръчно да посочат външния хост в своето уеб приложение, ако тази функция е активирана.

В тази публикация в блога ще използваме ProxySQL UNIX сокет файл, за да подмамим WHM/cPanel да се свърже с външния MySQL сървър чрез UNIX сокет файл. По този начин получавате усещането, че изпълнявате MySQL локално, така че потребителите да могат да използват „localhost“ с порт 3306 като техен хост на MySQL база данни.

Следната диаграма илюстрира крайната архитектура:

Имаме нов WHM сървър, инсталиран с WHM/cPanel 80.0 (build 18). След това имаме още три сървъра - един за ClusterControl и два за репликация главен-подчинен. ProxySQL ще бъде инсталиран на самия WHM сървър.

Разгръщане на MySQL репликация

По време на това писане ние използваме WHM 80.0 (build 18), който поддържа само до MySQL 5.7 и MariaDB 10.3. В този случай ще използваме MySQL 5.7 от Oracle. Предполагаме, че вече сте инсталирали ClusterControl на сървъра на ClusterControl.

Първо, настройте SSH без парола от сървъра ClusterControl към сървърите за репликация на MySQL. На сървъра на ClusterControl направете:

$ ssh-copy-id 192.168.0.31
$ ssh-copy-id 192.168.0.32

Уверете се, че можете да изпълните следната команда на ClusterControl без подкана за парола между тях:

$ ssh 192.168.0.31 "sudo ls -al /root"
$ ssh 192.168.0.32 "sudo ls -al /root"

След това отидете на ClusterControl -> Deploy -> MySQL Replication и въведете необходимата информация. На втората стъпка изберете Oracle като доставчик и 5.7 като версия на базата данни:

След това посочете IP адреса на главния и подчинения:

Обърнете внимание на зелената отметка точно преди IP адреса. Това означава, че ClusterControl може да се свърже със сървъра и е готов за следващата стъпка. Щракнете върху Разгръщане, за да започнете внедряването. Процесът на внедряване трябва да отнеме 15 до 20 минути.

Разгръщане на ProxySQL на WHM/cPanel

Тъй като искаме ProxySQL да поеме MySQL порта по подразбиране 3306, първо трябва да модифицираме съществуващия MySQL сървър, инсталиран от WHM, за да слуша друг порт и друг файл на сокет. В /etc/my.cnf променете следните редове (добавете ги, ако не съществуват):

socket=/var/lib/mysql/mysql2.sock
port=3307
bind-address=127.0.0.1

След това рестартирайте MySQL сървъра на cPanel сървър:

$ systemctl restart mysqld

В този момент локалният MySQL сървър трябва да слуша на порт 3307, да се свързва само с localhost (ние го затваряме от външен достъп, за да бъдем по-сигурни). Сега можем да продължим с внедряването на ProxySQL на хоста WHM, 192.168.0.16 чрез ClusterControl.

Първо, настройте SSH без парола от възела ClusterControl към WHM сървъра, на който искаме да инсталираме ProxySQL:

(clustercontrol)$ ssh-copy-id [email protected]

Уверете се, че можете да изпълните следната команда на ClusterControl без подкана за парола между тях:

(clustercontrol)$ ssh 192.168.0.16 "sudo ls -al /root"

След това отидете на ClusterControl -> Manage -> Load Balancers -> ProxySQL -> Deploy ProxySQL и посочете необходимата информация:

Попълнете всички необходими подробности, както е подчертано от стрелките по-горе на диаграмата. Адресът на сървъра е WHM сървърът, 192.168.0.16. Портът за слушане е 3306 на WHM сървъра, поемайки локалния MySQL, който вече работи на порт 3307. По-нататък ние определяме администраторската парола на ProxySQL и паролата за наблюдение на потребителите. След това включете и двата MySQL сървъра в комплекта за балансиране на натоварването и след това изберете "Не" в секцията Неявни транзакции. Щракнете върху Разгръщане на ProxySQL, за да започнете внедряването.

Нашият ProxySQL вече е инсталиран и конфигуриран с две хост групи за MySQL репликация. Един за групата за записване (hostgroup 10), където всички връзки ще бъдат препратени към главната и групата за четене (hostgroup 20) за всички работни натоварвания само за четене, които ще бъдат балансирани към двата MySQL сървъра.

Следващата стъпка е да предоставите root потребител на MySQL и да го импортирате в ProxySQL. Понякога WHM по някакъв начин се свързва с базата данни чрез TCP връзка, заобикаляйки UNIX сокет файла. В този случай трябва да разрешим MySQL root достъп както от [email protected], така и от [email protected] (IP адресът на WHM сървъра) в нашия клъстер за репликация.

По този начин е необходимо да изпълните следния оператор на главния сървър (192.168.0.31):

(master)$ mysql -uroot -p
mysql> GRANT ALL PRIVILEGES ON *.* TO [email protected]'192.168.0.16' IDENTIFIED BY '[email protected]' WITH GRANT OPTION;

След това импортирайте потребител 'root'@'localhost' от нашия MySQL сървър в потребител на ProxySQL, като отидете на ClusterControl -> Nodes -> изберете възела ProxySQL -> Потребители -> Импортиране на потребители . Ще ви бъде представен следният диалогов прозорец:

Поставете отметка в квадратчето [email protected] и щракнете върху Напред. В Потребителски настройки страница, изберете хостгрупа 10 като хостгрупа по подразбиране за потребителя:

След това можем да проверим дали ProxySQL работи правилно на сървъра WHM/cPanel, като използваме следната команда:

$ netstat -tulpn | grep -i proxysql
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      17306/proxysql
tcp        0      0 0.0.0.0:6032            0.0.0.0:*               LISTEN      17306/proxysql

Порт 3306 е това, което ProxySQL трябва да слуша, за да приеме всички MySQL връзки. Порт 6032 е администраторският порт на ProxySQL, където ще се свържем, за да конфигурираме и наблюдаваме компоненти на ProxySQL като потребители, хостгрупи, сървъри и променливи.

В този момент, ако отидете на ClusterControl -> Топология , трябва да видите следната топология:

Конфигуриране на MySQL UNIX сокет

В Linux среда, ако дефинирате MySQL хост като "localhost", клиентът/приложението ще се опита да се свърже чрез UNIX сокетния файл, който по подразбиране се намира в /var/lib/mysql/mysql.sock на cPanel сървъра. Използването на сокет файла е най-препоръчителният начин за достъп до MySQL сървър, тъй като има по-малко излишни разходи в сравнение с TCP връзките. Файлът на сокет всъщност не съдържа данни, той ги транспортира. Това е като локална тръба, която сървърът и клиентите на една и съща машина могат да използват за свързване и обмен на заявки и данни.

Като каза това, ако вашето приложение се свърже чрез "localhost" и порт 3306 като хост на базата данни и порт, то ще се свърже чрез сокет файл. Ако използвате "127.0.0.1" и порт 3306, най-вероятно приложението ще се свърже с базата данни чрез TCP. Това поведение е добре обяснено в документацията на MySQL. С прости думи, използвайте сокет файл (или „localhost“) за локална комуникация и използвайте TCP, ако приложението се свързва отдалечено.

В cPanel MySQL файлът на сокета се наблюдава от процес cpservd и би бил свързан с друг файл на сокет, ако конфигурираме различен път от този по подразбиране. Например, да предположим, че сме конфигурирали MySQL сокет файл, който не е по подразбиране, както конфигурирахме в предишния раздел:

$ cat /etc/my.cnf | grep socket
socket=/var/lib/mysql/mysql2.sock

cPanel чрез процес cpservd ще коригира това, като създаде символна връзка към пътя на сокета по подразбиране:

(whm)$ ls -al /var/lib/mysql/mysql.sock
lrwxrwxrwx. 1 root root 34 Jul  4 12:25 /var/lib/mysql/mysql.sock -> ../../../var/lib/mysql/mysql2.sock

За да избегнем cpservd да коригира автоматично това (cPanel има термин за това поведение, наречен "автомагически"), трябва да деактивираме наблюдението на MySQL, като отидем на WHM -> Service Manager (все пак няма да използваме локалния MySQL) и премахнете отметката от квадратчето „Монитор“ за MySQL, както е показано на екранната снимка по-долу:

Запазете промените в WHM. Вече е безопасно да премахнете файла на сокет по подразбиране и да създадете символна връзка към ProxySQL файл на сокет със следната команда:

(whm)$ ln -s /tmp/proxysql.sock /var/lib/mysql/mysql.sock

Уверете се, че сокетният файл MySQL вече е пренасочен към ProxySQL сокет файл:

(whm)$ ls -al /var/lib/mysql/mysql.sock
lrwxrwxrwx. 1 root root 18 Jul  3 12:47 /var/lib/mysql/mysql.sock -> /tmp/proxysql.sock

Също така трябва да променим идентификационните данни по подразбиране в /root/.my.cnf, както следва:

(whm)$ cat ~/.my.cnf
[client]
#password="T<y4ar&cgjIu"
user=root
password='[email protected]'
socket=/var/lib/mysql/mysql.sock

Малко обяснение - Първият ред, който коментирахме, е паролата за root на MySQL, генерирана от cPanel за локалния MySQL сървър. Няма да използваме това, следователно "#" е в началото на реда. След това добавихме MySQL root паролата за нашата настройка за репликация на MySQL и пътя на UNIX сокета, който вече е символна връзка към ProxySQL сокет файла.

В този момент на WHM сървъра трябва да имате достъп до нашия MySQL репликационен клъстер като root потребител, като просто напишете „mysql“, например:

(whm)$ mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 239
Server version: 5.5.30 (ProxySQL)

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>

Обърнете внимание, че версията на сървъра е 5.5.30 (ProxySQL). Ако можете да се свържете както по-горе, можем да конфигурираме интегриращата част, както е описано в следващия раздел.

Интеграция на WHM/cPanel

WHM поддържа редица сървъри на база данни, а именно MySQL 5.7, MariaDB 10.2 и MariaDB 10.3. Тъй като WHM вече вижда само ProxySQL и той се открива като версия 5.5.30 (както е посочено по-горе), WHM ще се оплаква от неподдържана версия на MySQL. Можете да отидете на WHM -> SQL услуги -> Управление на MySQL профили и щракнете върху бутона Потвърди. Трябва да получите червено известие за тостер в горния десен ъгъл, което разказва за тази грешка.

Следователно, трябва да променим версията на MySQL в ProxySQL на същата версия като нашия клъстер за репликация на MySQL. Можете да получите тази информация, като изпълните следния оператор на главния сървър:

mysql> SELECT @@version;
+------------+
| @@version  |
+------------+
| 5.7.26-log |
+------------+

След това влезте в администраторската конзола на ProxySQL, за да промените mysql-server_version променлива:

(whm)$ mysql -uproxysql-admin -p -h192.168.0.16 -P6032

Използвайте оператора SET, както следва:

mysql> SET mysql-server_version = '5.7.26';

След това заредете променливата във времето за изпълнение и я запишете на диск, за да я направите постоянна:

mysql> LOAD MYSQL VARIABLES TO RUNTIME;
mysql> SAVE MYSQL VARIABLES TO DISK;

Накрая проверете версията, която ProxySQL ще представлява:

mysql> SHOW VARIABLES LIKE 'mysql-server_version';
+----------------------+--------+
| Variable_name        | Value  |
+----------------------+--------+
| mysql-server_version | 5.7.26 |
+----------------------+--------+

Ако опитате отново да се свържете с MySQL, като изпълните командата "mysql", сега трябва да получите "Версия на сървъра:5.7.26 (ProxySQL)" в терминала.

Сега можем да актуализираме MySQL root паролата под WHM -> SQL Services -> Manage MySQL Profiles . Редактирайте профила на localhost, като промените полето Password в долната част с MySQL root паролата на нашия клъстер за репликация. Щракнете върху бутона Запазване, след като сте готови. След това можем да щракнем върху „Проверка“, за да проверим дали WHM може правилно да получи достъп до нашия MySQL клъстер за репликация чрез услугата ProxySQL. Трябва да получите следния зелен тостер в горния десен ъгъл:

Ако получите известието за зелен тостер, можем да продължим с интегрирането на ProxySQL чрез cPanel кука.

Интегриране на ProxySQL чрез cPanel Hook

ProxySQL като посредник между WHM и MySQL репликацията трябва да има потребителско име и парола за всеки потребител на MySQL, който ще минава през него. С текущата архитектура, ако човек създаде потребител през контролния панел (WHM чрез създаване на акаунт или cPanel чрез съветника за MySQL Database), WHM автоматично ще създаде потребителя директно в нашия MySQL репликационен клъстер, използвайки [email protected] (който е импортиран в ProxySQL предварително). Същият потребител на базата данни обаче няма да бъде добавен автоматично в таблицата mysql_users на ProxySQL.

От гледна точка на крайния потребител, това няма да работи, защото всички локални връзки към този момент трябва да се предават през ProxySQL. Нуждаем се от начин да интегрираме cPanel с ProxySQL, при което за всякакви операции, свързани с MySQL потребители, извършвани от WHM и cPanel, ProxySQL трябва да бъде уведомен и да извърши необходимите действия за добавяне/премахване/актуализиране на вътрешната си таблица mysql_users.

Най-добрият начин за автоматизиране и интегриране на тези компоненти е чрез използване на стандартизираната система за куки на cPanel. Стандартизираните куки задействат приложения, когато cPanel &WHM извършва действие. Използвайте тази система, за да изпълните персонализиран код (код за действие с кука), за да персонализирате как функционират cPanel &WHM в конкретни сценарии (събития, които могат да се закачат).

Първо, създайте файл на Perl модул, наречен ProxysqlHook.pm в директорията /usr/local/cpanel:

$ touch /usr/local/cpanel/ProxysqlHook.pm

След това копирайте и поставете редовете от тук. За повече информация вижте хранилището на Github в ProxySQL cPanel Hook.

Конфигурирайте администраторския интерфейс на ProxySQL от ред 16 до 19:

my $proxysql_admin_host = '192.168.0.16';
my $proxysql_admin_port = '6032';
my $proxysql_admin_user = 'proxysql-admin';
my $proxysql_admin_pass = 'mys3cr3t';

Сега, когато куката е на мястото си, трябва да я регистрираме в системата cPanel hook:

(whm)$ /usr/local/cpanel/bin/manage_hooks add module ProxysqlHook
info [manage_hooks] **** Reading ProxySQL information: Host: 192.168.0.16, Port: 6032, User: proxysql-admin *****
Added hook for Whostmgr::Accounts::Create to hooks registry
Added hook for Whostmgr::Accounts::Remove to hooks registry
Added hook for Cpanel::UAPI::Mysql::create_user to hooks registry
Added hook for Cpanel::Api2::MySQLFE::createdbuser to hooks registry
Added hook for Cpanel::UAPI::Mysql::delete_user to hooks registry
Added hook for Cpanel::Api2::MySQLFE::deletedbuser to hooks registry
Added hook for Cpanel::UAPI::Mysql::set_privileges_on_database to hooks registry
Added hook for Cpanel::Api2::MySQLFE::setdbuserprivileges to hooks registry
Added hook for Cpanel::UAPI::Mysql::rename_user to hooks registry
Added hook for Cpanel::UAPI::Mysql::set_password to hooks registry

От изхода по-горе този модул се свързва с редица cPanel и WHM събития:

  • Whostmgr::Accounts::Create - WHM -> Функции на акаунта -> Създаване на нов акаунт
  • Whostmgr::Accounts::Remove - WHM -> Функции на акаунта -> Прекратяване на акаунт
  • Cpanel::UAPI::Mysql::create_user - cPanel -> Бази данни -> MySQL бази данни -> Добавяне на нов потребител 
  • Cpanel::Api2::MySQLFE::createdbuser - cPanel -> Бази данни -> MySQL бази данни -> Добавяне на нов потребител (изисква за Softaculous интеграция).
  • Cpanel::UAPI::Mysql::delete_user - cPanel -> Бази данни -> MySQL бази данни -> Изтриване на потребител
  • Cpanel::Api2::MySQLFE::deletedbuser - cPanel -> Бази данни -> MySQL бази данни -> Добавяне на нов потребител (изисква за Softaculous интеграция).
  • Cpanel::UAPI::Mysql::set_privileges_on_database - cPanel -> Бази данни -> MySQL бази данни -> Добавяне на потребител към базата данни
  • Cpanel::Api2::MySQLFE::setdbuserprivileges - cPanel -> Бази данни -> MySQL бази данни -> Добавяне на потребител към базата данни (изисква за Softaculous интеграция).
  • Cpanel::UAPI::Mysql::rename_user - cPanel -> Бази данни -> MySQL бази данни -> Преименуване на потребител
  • Cpanel::UAPI::Mysql::set_password - cPanel -> Бази данни -> MySQL бази данни -> Промяна на парола

Ако събитието по-горе се задейства, модулът ще изпълни необходимите действия за синхронизиране на таблицата mysql_users в ProxySQL. Той извършва операциите чрез ProxySQL администраторски интерфейс, работещ на порт 6032 на WHM сървъра. По този начин е жизненоважно да посочите правилните потребителски идентификационни данни за администратора на ProxySQL, за да сте сигурни, че всички потребители ще бъдат синхронизирани правилно с ProxySQL.

Обърнете внимание, че този модул, ProxysqlHook.pm, никога не е тестван в реалната хостинг среда (с много акаунти и много плъгини на трети страни) и очевидно не покрива всички събития, свързани с MySQL в cPanel. Тествахме го с безплатното издание на Softaculous и работи отлично чрез cPanel API2 кукички. Може да са необходими някои допълнителни модификации, за да се постигне пълна автоматизация.

Това е всичко за сега. В следващата част ще разгледаме операциите след внедряването и какво бихме могли да спечелим с нашето високодостъпно MySQL сървърно решение за нашите хостинг сървъри в сравнение със стандартната самостоятелна настройка на MySQL.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Обработка на големи транзакции с поточно репликация и MariaDB 10.4

  2. Как да стартирате и конфигурирате ProxySQL 2.0 за MySQL Galera Cluster на Docker

  3. Как EXTRACT() работи в MariaDB

  4. Как да постигнем PCI съответствие за MySQL и MariaDB с ClusterControl - Повторението

  5. Балансиране на натоварването на базата данни с ProxySQL &AWS Aurora