WHM i cPanel to bez wątpienia najpopularniejszy panel kontrolny hostingu dla środowisk opartych na systemie Linux. Obsługuje wiele backendów baz danych - MySQL, MariaDB i PostgreSQL jako magazyn danych aplikacji. WHM obsługuje tylko samodzielne konfiguracje baz danych i można je wdrożyć lokalnie (konfiguracja domyślna) lub zdalnie, poprzez integrację z zewnętrznym serwerem bazy danych. To drugie byłoby lepsze, jeśli chcesz mieć lepszą dystrybucję obciążenia, ponieważ WHM/cPanel obsługuje wiele procesów i aplikacji, takich jak HTTP(S), FTP, DNS, MySQL i tym podobne.
W tym poście na blogu pokażemy, jak bezproblemowo zintegrować zewnętrzną konfigurację replikacji MySQL z WHM, aby poprawić dostępność bazy danych i odciążyć serwer hostingowy WHM/cPanel. Dostawcy hostingu, którzy uruchamiają MySQL lokalnie na serwerze WHM, wiedzieliby, jak wymagający jest MySQL pod względem wykorzystania zasobów (w zależności od liczby hostowanych kont i specyfikacji serwera).
Replikacja MySQL na WHM/cPanel
Domyślnie WHM natywnie obsługuje zarówno MariaDB, jak i MySQL jako samodzielną konfigurację. Możesz dołączyć zewnętrzny serwer MySQL do WHM, ale będzie on działał jako samodzielny host. Ponadto użytkownicy cPanel muszą znać adres IP serwera MySQL i ręcznie określić zewnętrzny host w swojej aplikacji internetowej, jeśli ta funkcja jest włączona.
W tym poście na blogu zamierzamy użyć pliku gniazda ProxySQL UNIX, aby oszukać WHM/cPanel w połączeniu z zewnętrznym serwerem MySQL za pomocą pliku gniazda UNIX. W ten sposób masz wrażenie, że działasz lokalnie MySQL, więc użytkownicy mogą używać "localhost" z portem 3306 jako hosta bazy danych MySQL.
Poniższy diagram ilustruje ostateczną architekturę:
Mamy nowy serwer WHM z zainstalowanym WHM/cPanel 80.0 (kompilacja 18). Następnie mamy kolejne trzy serwery - jeden dla ClusterControl i dwa dla replikacji master-slave. ProxySQL zostanie zainstalowany na samym serwerze WHM.
Wdrażanie replikacji MySQL
W chwili pisania tego tekstu używamy WHM 80.0 (kompilacja 18), który obsługuje tylko do MySQL 5.7 i MariaDB 10.3. W tym przypadku użyjemy MySQL 5.7 firmy Oracle. Zakładamy, że zainstalowałeś już ClusterControl na serwerze ClusterControl.
Najpierw skonfiguruj bezhasłowe SSH z serwera ClusterControl do serwerów replikacji MySQL. Na serwerze ClusterControl wykonaj:
$ ssh-copy-id 192.168.0.31
$ ssh-copy-id 192.168.0.32
Upewnij się, że możesz uruchomić następujące polecenie w ClusterControl bez pytania o hasło pomiędzy:
$ ssh 192.168.0.31 "sudo ls -al /root"
$ ssh 192.168.0.32 "sudo ls -al /root"
Następnie przejdź do ClusterControl -> Deploy -> MySQL Replication i wprowadź wymagane informacje. W drugim kroku wybierz Oracle jako dostawcę i 5.7 jako wersję bazy danych:
Następnie podaj adres IP urządzenia nadrzędnego i podrzędnego:
Zwróć uwagę na zielony haczyk tuż przed adresem IP. Oznacza to, że ClusterControl może połączyć się z serwerem i jest gotowy do następnego kroku. Kliknij Wdróż, aby rozpocząć wdrażanie. Proces wdrażania powinien zająć od 15 do 20 minut.
Wdrażanie ProxySQL na WHM/cPanel
Ponieważ chcemy, aby ProxySQL przejął domyślny port MySQL 3306, musimy najpierw zmodyfikować istniejący serwer MySQL zainstalowany przez WHM, aby nasłuchiwał innego portu i innego pliku typu socket. W /etc/my.cnf zmodyfikuj następujące wiersze (dodaj je, jeśli nie istnieją):
socket=/var/lib/mysql/mysql2.sock
port=3307
bind-address=127.0.0.1
Następnie uruchom ponownie serwer MySQL na serwerze cPanel:
$ systemctl restart mysqld
W tym momencie lokalny serwer MySQL powinien nasłuchiwać na porcie 3307, wiązać się tylko z localhost (zamykamy go przed dostępem z zewnątrz, aby był bezpieczniejszy). Teraz możemy przystąpić do wdrożenia ProxySQL na hoście WHM, 192.168.0.16 przez ClusterControl.
Najpierw skonfiguruj bezhasłowe SSH z węzła ClusterControl do serwera WHM, na którym chcemy zainstalować ProxySQL:
(clustercontrol)$ ssh-copy-id [email protected]
Upewnij się, że możesz uruchomić następujące polecenie w ClusterControl bez pytania o hasło pomiędzy:
(clustercontrol)$ ssh 192.168.0.16 "sudo ls -al /root"
Następnie przejdź do ClusterControl -> Zarządzaj -> Load Balancers -> ProxySQL -> Wdróż ProxySQL i podaj wymagane informacje:
Wypełnij wszystkie niezbędne szczegóły, jak zaznaczono strzałkami powyżej na schemacie. Adres serwera to serwer WHM, 192.168.0.16. Port nasłuchiwania to 3306 na serwerze WHM, który przejmuje lokalny MySQL, który już działa na porcie 3307. W dalszej części podajemy administratora ProxySQL i hasło monitorujących użytkowników. Następnie uwzględnij oba serwery MySQL w zestawie równoważenia obciążenia, a następnie wybierz „Nie” w sekcji Transakcje niejawne. Kliknij Wdróż ProxySQL, aby rozpocząć instalację.
Nasz ProxySQL jest teraz zainstalowany i skonfigurowany z dwiema grupami hostów dla replikacji MySQL. Jeden dla grupy zapisującej (grupa hostów 10), gdzie wszystkie połączenia będą przekazywane do mastera i grupy czytającej (grupa hostów 20) dla wszystkich obciążeń tylko do odczytu, które będą równoważone do obu serwerów MySQL.
Następnym krokiem jest przyznanie użytkownikowi root MySQL i zaimportowanie go do ProxySQL. Czasami WHM w jakiś sposób łączy się z bazą danych przez połączenie TCP, z pominięciem pliku gniazda UNIX. W tym przypadku musimy zezwolić na dostęp root MySQL zarówno z [email protected], jak i [email protected] (adres IP serwera WHM) w naszym klastrze replikacji.
Dlatego konieczne jest uruchomienie następującej instrukcji na serwerze głównym (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;
Następnie zaimportuj użytkownika 'root'@'localhost' z naszego serwera MySQL do użytkownika ProxySQL, przechodząc do ClusterControl -> Węzły -> wybierz węzeł ProxySQL -> Użytkownicy -> Importuj użytkowników . Zostanie wyświetlone następujące okno dialogowe:
Zaznacz pole wyboru [email protected] i kliknij Dalej. W Ustawieniach użytkownika wybierz grupę hostów 10 jako domyślną grupę hostów dla użytkownika:
Następnie możemy zweryfikować, czy ProxySQL działa poprawnie na serwerze WHM/cPanel za pomocą następującego polecenia:
$ 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
Port 3306 jest tym, czego ProxySQL powinien nasłuchiwać, aby akceptować wszystkie połączenia MySQL. Port 6032 to port administratora ProxySQL, gdzie połączymy się, aby skonfigurować i monitorować komponenty ProxySQL, takie jak użytkownicy, grupy hostów, serwery i zmienne.
W tym momencie, jeśli przejdziesz do ClusterControl -> Topologia , powinieneś zobaczyć następującą topologię:
Konfigurowanie gniazda MySQL UNIX
W środowisku Linux, jeśli zdefiniujesz hosta MySQL jako "localhost", klient/aplikacja będzie próbowała połączyć się przez plik gniazda UNIX, który domyślnie znajduje się w /var/lib/mysql/mysql.sock na serwerze cPanel. Korzystanie z pliku typu socket jest najbardziej zalecanym sposobem uzyskania dostępu do serwera MySQL, ponieważ wiąże się on z mniejszym obciążeniem w porównaniu z połączeniami TCP. Plik typu socket w rzeczywistości nie zawiera danych, przenosi je. Jest jak lokalny potok, którego serwer i klienci na tej samej maszynie mogą używać do łączenia się i wymiany żądań i danych.
To powiedziawszy, jeśli Twoja aplikacja łączy się przez „localhost” i port 3306 jako host i port bazy danych, połączy się ona za pomocą pliku typu socket. Jeśli użyjesz "127.0.0.1" i portu 3306, najprawdopodobniej aplikacja połączy się z bazą danych przez TCP. To zachowanie jest dobrze wyjaśnione w dokumentacji MySQL. W prostych słowach, użyj pliku gniazda (lub "localhost") do lokalnej komunikacji i użyj TCP, jeśli aplikacja łączy się zdalnie.
W cPanel plik gniazda MySQL jest monitorowany przez proces cpservd i byłby połączony z innym plikiem gniazda, gdybyśmy skonfigurowali inną ścieżkę niż domyślna. Załóżmy na przykład, że skonfigurowaliśmy inny niż domyślny plik gniazda MySQL, tak jak skonfigurowaliśmy w poprzedniej sekcji:
$ cat /etc/my.cnf | grep socket
socket=/var/lib/mysql/mysql2.sock
cPanel za pośrednictwem procesu cpservd naprawi to, tworząc dowiązanie symboliczne do domyślnej ścieżki gniazda:
(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
Aby uniknąć automatycznego ponownego korygowania tego przez cpservd (cPanel ma termin „automagicznie”), musimy wyłączyć monitorowanie MySQL, przechodząc do WHM -> Menedżer usług (i tak nie będziemy używać lokalnego MySQL) i odznacz pole wyboru „Monitoruj” dla MySQL, jak pokazano na poniższym zrzucie ekranu:
Zapisz zmiany w WHM. Teraz można bezpiecznie usunąć domyślny plik gniazda i utworzyć dowiązanie symboliczne do pliku gniazda ProxySQL za pomocą następującego polecenia:
(whm)$ ln -s /tmp/proxysql.sock /var/lib/mysql/mysql.sock
Sprawdź, czy plik gniazda MySQL gniazda jest teraz przekierowywany do pliku gniazda 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
Musimy również zmienić domyślne dane logowania w /root/.my.cnf w następujący sposób:
(whm)$ cat ~/.my.cnf
[client]
#password="T<y4ar&cgjIu"
user=root
password='[email protected]'
socket=/var/lib/mysql/mysql.sock
Trochę wyjaśnienia - Pierwsza linia, którą skomentowaliśmy, to hasło root MySQL wygenerowane przez cPanel dla lokalnego serwera MySQL. Nie będziemy tego używać, dlatego „#” znajduje się na początku linii. Następnie dodaliśmy hasło root MySQL dla naszej konfiguracji replikacji MySQL i ścieżkę gniazda UNIX, która jest teraz dowiązaniem symbolicznym do pliku gniazda ProxySQL.
W tym momencie na serwerze WHM powinieneś mieć dostęp do naszego klastra replikacji MySQL jako użytkownik root, wpisując po prostu "mysql", na przykład:
(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>
Zwróć uwagę, że wersja serwera to 5.5.30 (ProxySQL). Jeśli możesz połączyć się jak powyżej, możemy skonfigurować część integracji zgodnie z opisem w następnej sekcji.
Integracja WHM/cPanel
WHM obsługuje szereg serwerów baz danych, a mianowicie MySQL 5.7, MariaDB 10.2 i MariaDB 10.3. Ponieważ WHM widzi teraz tylko ProxySQL i jest wykrywany jako wersja 5.5.30 (jak wspomniano powyżej), WHM będzie narzekał na nieobsługiwaną wersję MySQL. Możesz przejść do WHM -> Usługi SQL -> Zarządzaj profilami MySQL i kliknij przycisk Zatwierdź. Powinieneś otrzymać czerwone powiadomienie tostera w prawym górnym rogu informujące o tym błędzie.
Dlatego musimy zmienić wersję MySQL w ProxySQL na tę samą wersję, co nasz klaster replikacji MySQL. Możesz uzyskać te informacje, uruchamiając następującą instrukcję na serwerze głównym:
mysql> SELECT @@version;
+------------+
| @@version |
+------------+
| 5.7.26-log |
+------------+
Następnie zaloguj się do konsoli administracyjnej ProxySQL, aby zmienić mysql-server_version zmienna:
(whm)$ mysql -uproxysql-admin -p -h192.168.0.16 -P6032
Użyj instrukcji SET jak poniżej:
mysql> SET mysql-server_version = '5.7.26';
Następnie załaduj zmienną do środowiska wykonawczego i zapisz ją na dysku, aby była trwała:
mysql> LOAD MYSQL VARIABLES TO RUNTIME;
mysql> SAVE MYSQL VARIABLES TO DISK;
Na koniec sprawdź wersję, którą będzie reprezentować ProxySQL:
mysql> SHOW VARIABLES LIKE 'mysql-server_version';
+----------------------+--------+
| Variable_name | Value |
+----------------------+--------+
| mysql-server_version | 5.7.26 |
+----------------------+--------+
Jeśli spróbujesz ponownie połączyć się z MySQL, uruchamiając polecenie "mysql", powinieneś teraz uzyskać w terminalu "Wersja serwera:5.7.26 (ProxySQL)".
Teraz możemy zaktualizować hasło root MySQL w WHM -> Usługi SQL -> Zarządzaj profilami MySQL . Edytuj profil hosta lokalnego, zmieniając pole Hasło u dołu na hasło roota MySQL naszego klastra replikacji. Po zakończeniu kliknij przycisk Zapisz. Następnie możemy kliknąć „Weryfikuj”, aby sprawdzić, czy WHM może poprawnie uzyskać dostęp do naszego klastra replikacji MySQL za pośrednictwem usługi ProxySQL. Powinieneś dostać następujący zielony toster w prawym górnym rogu:
Jeśli otrzymasz powiadomienie o zielonym tosterze, możemy przystąpić do integracji ProxySQL za pomocą haka cPanel.
Integracja ProxySQL przez cPanel Hook
ProxySQL jako pośrednik między replikacją WHM i MySQL musi mieć nazwę użytkownika i hasło dla każdego użytkownika MySQL, który będzie przez niego przechodził. Przy obecnej architekturze, jeśli utworzymy użytkownika poprzez panel sterowania (WHM poprzez tworzenie konta lub cPanel poprzez kreator bazy danych MySQL), WHM automatycznie utworzy użytkownika bezpośrednio w naszym klastrze replikacji MySQL używając [email protected] (który został zaimportowany do ProxySQL). Jednak ten sam użytkownik bazy danych nie zostanie automatycznie dodany do tabeli mysql_users ProxySQL.
Z perspektywy użytkownika końcowego nie zadziałałoby to, ponieważ wszystkie połączenia z hostami lokalnymi w tym momencie powinny być przekazywane przez ProxySQL. Potrzebujemy sposobu na integrację cPanel z ProxySQL, dzięki czemu w przypadku wszelkich operacji związanych z użytkownikiem MySQL wykonywanych przez WHM i cPanel, ProxySQL musi zostać powiadomiony i wykonać niezbędne czynności, aby dodać/usunąć/zaktualizować swoją wewnętrzną tabelę mysql_users.
Najlepszym sposobem na zautomatyzowanie i zintegrowanie tych komponentów jest użycie znormalizowanego systemu haków cPanel. Standaryzowane hooki uruchamiają aplikacje, gdy cPanel i WHM wykonują akcję. Użyj tego systemu, aby wykonać niestandardowy kod (kod akcji zaczepienia), aby dostosować sposób działania cPanel i WHM w określonych scenariuszach (zdarzenia, które można zaczepić).
Najpierw utwórz plik modułu Perl o nazwie ProxysqlHook.pm w katalogu /usr/local/cpanel:
$ touch /usr/local/cpanel/ProxysqlHook.pm
Następnie skopiuj i wklej linie stąd. Aby uzyskać więcej informacji, sprawdź repozytorium Github w ProxySQL cPanel Hook.
Skonfiguruj interfejs administratora ProxySQL od linii 16 do 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';
Teraz, gdy zaczep jest na miejscu, musimy zarejestrować go w systemie zaczepów cPanel:
(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
Z powyższych danych wyjściowych ten moduł łączy się z wieloma zdarzeniami cPanel i WHM:
- Whostmgr::Accounts::Create - WHM -> Funkcje konta -> Utwórz nowe konto
- Whostmgr::Accounts::Remove - WHM -> Funkcje konta -> Zamknij konto
- Cpanel::UAPI::Mysql::create_user - cPanel -> Bazy danych -> Bazy danych MySQL -> Dodaj nowego użytkownika
- Cpanel::Api2::MySQLFE::createdbuser - cPanel -> Bazy danych -> Bazy danych MySQL -> Dodaj nowego użytkownika (wymaga integracji Softaculous).
- Cpanel::UAPI::Mysql::delete_user - cPanel -> Bazy danych -> Bazy danych MySQL -> Usuń użytkownika
- Cpanel::Api2::MySQLFE::deletedbuser - cPanel -> Bazy danych -> Bazy danych MySQL -> Dodaj nowego użytkownika (wymaga integracji Softaculous).
- Cpanel::UAPI::Mysql::set_privileges_on_database - cPanel -> Bazy danych -> Bazy danych MySQL -> Dodaj użytkownika do bazy danych
- Cpanel::Api2::MySQLFE::setdbuserprivileges - cPanel -> Bazy danych -> Bazy danych MySQL -> Dodaj użytkownika do bazy danych (wymaga integracji Softaculous).
- Cpanel::UAPI::Mysql::rename_user - cPanel -> Bazy danych -> Bazy danych MySQL -> Zmień nazwę użytkownika
- Cpanel::UAPI::Mysql::set_password - cPanel -> Bazy danych -> Bazy danych MySQL -> Zmień hasło
Jeśli powyższe zdarzenie zostanie wyzwolone, moduł wykona niezbędne działania, aby zsynchronizować tabelę mysql_users w ProxySQL. Wykonuje operacje za pośrednictwem interfejsu administratora ProxySQL działającego na porcie 6032 na serwerze WHM. Dlatego ważne jest, aby określić prawidłowe dane logowania dla administratora ProxySQL, aby upewnić się, że wszyscy użytkownicy będą poprawnie synchronizowani z ProxySQL.
Zwróć uwagę, że ten moduł, ProxysqlHook.pm, nigdy nie był testowany w prawdziwym środowisku hostingowym (z wieloma kontami i wieloma wtyczkami innych firm) i oczywiście nie obejmuje wszystkich zdarzeń związanych z MySQL w cPanel. Przetestowaliśmy go z bezpłatną edycją Softaculous i działało świetnie za pośrednictwem zaczepów cPanel API2. Pewne dalsze modyfikacje mogą być wymagane w celu objęcia pełnej automatyzacji.
Na razie to wszystko. W następnej części przyjrzymy się operacjom po wdrożeniu i tym, co możemy zyskać dzięki naszemu wysoce dostępnemu rozwiązaniu serwerowemu MySQL dla naszych serwerów hostingowych w porównaniu ze standardową samodzielną konfiguracją MySQL.