WHM a cPanel jsou bezpochyby nejoblíbenějším hostitelským ovládacím panelem pro prostředí založená na Linuxu. Podporuje řadu databázových backendů - MySQL, MariaDB a PostgreSQL jako úložiště dat aplikací. WHM podporuje pouze nastavení samostatné databáze a můžete ji nasadit lokálně (výchozí konfigurace) nebo vzdáleně integrací s externím databázovým serverem. To druhé by bylo lepší, pokud chcete mít lepší rozložení zátěže, protože WHM/cPanel zvládá řadu procesů a aplikací jako HTTP(S), FTP, DNS, MySQL a podobně.
V tomto příspěvku na blogu vám ukážeme, jak bezproblémově integrovat nastavení externí replikace MySQL do WHM, zlepšit dostupnost databáze a snížit zátěž hostitelského serveru WHM/cPanel. Poskytovatelé hostingu, kteří provozují MySQL lokálně na serveru WHM, by věděli, jak náročná je MySQL z hlediska využití zdrojů (v závislosti na počtu účtů, které hostuje, a na specifikacích serveru).
Replikace MySQL na WHM/cPanel
Ve výchozím nastavení WHM nativně podporuje MariaDB i MySQL jako samostatné nastavení. K WHM můžete připojit externí server MySQL, ale bude fungovat jako samostatný hostitel. Uživatelé cPanelu navíc musí znát IP adresu serveru MySQL a ručně zadat externího hostitele ve své webové aplikaci, pokud je tato funkce povolena.
V tomto příspěvku na blogu použijeme soubor soketu ProxySQL UNIX k oklamání WHM/cPanel při připojení k externímu serveru MySQL prostřednictvím souboru soketu UNIX. Tímto způsobem získáte pocit, že spouštíte MySQL lokálně, takže uživatelé mohou používat "localhost" s portem 3306 jako hostitele databáze MySQL.
Následující diagram znázorňuje konečnou architekturu:
Máme nový server WHM, nainstalovaný s WHM/cPanel 80.0 (sestavení 18). Pak tu máme další tři servery – jeden pro ClusterControl a dva pro replikaci master-slave. ProxySQL se nainstaluje na samotný server WHM.
Nasazení replikace MySQL
V době psaní tohoto článku používáme WHM 80.0 (sestavení 18), který podporuje pouze MySQL 5.7 a MariaDB 10.3. V tomto případě použijeme MySQL 5.7 od společnosti Oracle. Předpokládáme, že jste již nainstalovali ClusterControl na server ClusterControl.
Nejprve nastavte SSH bez hesla ze serveru ClusterControl na replikační servery MySQL. Na serveru ClusterControl proveďte:
$ ssh-copy-id 192.168.0.31
$ ssh-copy-id 192.168.0.32
Ujistěte se, že můžete v ClusterControl spustit následující příkaz bez výzvy k zadání hesla:
$ ssh 192.168.0.31 "sudo ls -al /root"
$ ssh 192.168.0.32 "sudo ls -al /root"
Poté přejděte na ClusterControl -> Deploy -> MySQL Replication a zadejte požadované informace. Ve druhém kroku vyberte Oracle jako dodavatele a 5.7 jako verzi databáze:
Poté zadejte IP adresu hlavního a podřízeného zařízení:
Věnujte pozornost zelenému zaškrtnutí těsně před IP adresou. To znamená, že ClusterControl je schopen se připojit k serveru a je připraven na další krok. Kliknutím na Deploy zahájíte nasazení. Proces nasazení by měl trvat 15 až 20 minut.
Nasazení ProxySQL na WHM/cPanel
Protože chceme, aby ProxySQL převzal výchozí MySQL port 3306, musíme nejprve upravit existující MySQL server nainstalovaný WHM, aby naslouchal jinému portu a jinému soketovému souboru. V /etc/my.cnf upravte následující řádky (přidejte je, pokud neexistují):
socket=/var/lib/mysql/mysql2.sock
port=3307
bind-address=127.0.0.1
Poté restartujte server MySQL na serveru cPanel:
$ systemctl restart mysqld
V tuto chvíli by měl místní server MySQL naslouchat na portu 3307, vázat se pouze na localhost (uzavřeme jej před externím přístupem, abychom byli bezpečnější). Nyní můžeme přistoupit k nasazení ProxySQL na hostiteli WHM, 192.168.0.16 přes ClusterControl.
Nejprve nastavte SSH bez hesla z uzlu ClusterControl na server WHM, na který chceme nainstalovat ProxySQL:
(clustercontrol)$ ssh-copy-id [email protected]
Ujistěte se, že můžete v ClusterControl spustit následující příkaz bez výzvy k zadání hesla:
(clustercontrol)$ ssh 192.168.0.16 "sudo ls -al /root"
Poté přejděte na ClusterControl -> Spravovat -> Load Balancers -> ProxySQL -> Nasadit ProxySQL a zadejte požadované informace:
Vyplňte všechny potřebné údaje, jak je zvýrazněno šipkami nahoře na obrázku. Adresa serveru je server WHM, 192.168.0.16. Naslouchací port je 3306 na WHM serveru, přebírá lokální MySQL, která již běží na portu 3307. Dále specifikujeme ProxySQL admin a monitorovací heslo uživatelů. Poté zahrňte oba servery MySQL do sady pro vyrovnávání zátěže a poté v části Implicitní transakce zvolte „Ne“. Kliknutím na Deploy ProxySQL zahájíte nasazení.
Naše ProxySQL je nyní nainstalováno a nakonfigurováno se dvěma hostitelskými skupinami pro replikaci MySQL. Jeden pro skupinu zapisovače (skupina hostitelů 10), kde budou všechna připojení předávána hlavnímu serveru a skupině čtenářů (skupina hostitelů 20) pro všechny pracovní zátěže pouze pro čtení, které budou vyváženy pro oba servery MySQL.
Dalším krokem je udělení kořenového uživatele MySQL a jeho import do ProxySQL. Občas se WHM nějakým způsobem připojí k databázi přes TCP spojení, čímž obchází soubor soketu UNIX. V tomto případě musíme v našem replikačním clusteru povolit kořenový přístup MySQL z adresy [email protected] a [email protected] (IP adresa serveru WHM).
Je tedy nutné spustit následující příkaz na hlavním serveru (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;
Poté importujte uživatele 'root'@'localhost' z našeho serveru MySQL do uživatele ProxySQL tak, že přejdete na ClusterControl -> Nodes -> vyberte uzel ProxySQL -> Uživatelé -> Importovat uživatele . Zobrazí se následující dialog:
Zaškrtněte políčko [email protected] a klikněte na Další. V Uživatelských nastaveních vyberte hostitelskou skupinu 10 jako výchozí hostitelskou skupinu pro uživatele:
Poté můžeme ověřit, zda ProxySQL běží správně na serveru WHM/cPanel pomocí následujícího příkazu:
$ 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 by měl ProxySQL naslouchat, aby akceptoval všechna připojení MySQL. Port 6032 je administrátorský port ProxySQL, kam se připojíme za účelem konfigurace a monitorování komponent ProxySQL, jako jsou uživatelé, hostitelské skupiny, servery a proměnné.
V tomto okamžiku, pokud přejdete na ClusterControl -> Topologie , měli byste vidět následující topologii:
Konfigurace MySQL UNIX Socket
Pokud v prostředí Linuxu definujete hostitele MySQL jako "localhost", klient/aplikace se pokusí připojit přes soubor soketu UNIX, který je standardně umístěn na /var/lib/mysql/mysql.sock na serveru cPanel. Použití soketového souboru je nejvíce doporučený způsob přístupu k MySQL serveru, protože má menší režii ve srovnání s TCP spojeními. Soubor soketu ve skutečnosti data neobsahuje, ale přenáší je. Je to jako místní kanál, který mohou server a klienti na stejném počítači používat k připojení a výměně požadavků a dat.
Pokud se však vaše aplikace připojí přes „localhost“ a port 3306 jako hostitel a port databáze, připojí se přes soubor soketu. Pokud použijete "127.0.0.1" a port 3306, s největší pravděpodobností se aplikace připojí k databázi přes TCP. Toto chování je dobře vysvětleno v dokumentaci MySQL. Jednoduše řečeno, použijte soubor soketu (nebo "localhost") pro místní komunikaci a použijte TCP, pokud se aplikace připojuje vzdáleně.
V cPanel je soubor soketu MySQL monitorován procesem cpservd a byl by propojen s jiným souborem soketu, pokud bychom nakonfigurovali jinou cestu, než je výchozí. Předpokládejme například, že jsme nakonfigurovali jiný než výchozí soubor soketu MySQL, jak jsme nakonfigurovali v předchozí části:
$ cat /etc/my.cnf | grep socket
socket=/var/lib/mysql/mysql2.sock
cPanel prostřednictvím procesu cpservd by to napravil vytvořením symbolického odkazu na výchozí cestu soketu:
(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
Abychom se vyhnuli tomu, že cpservd toto automaticky znovu opraví (cPanel má pro toto chování výraz nazvaný „automaticky“), musíme deaktivovat monitorování MySQL přechodem do WHM -> Service Manager (místní MySQL stejně nebudeme používat) a zrušte zaškrtnutí políčka "Monitor" pro MySQL, jak je znázorněno na obrázku níže:
Uložte změny ve WHM. Nyní je bezpečné odebrat výchozí soubor soketu a vytvořit symbolický odkaz na soubor soketu ProxySQL pomocí následujícího příkazu:
(whm)$ ln -s /tmp/proxysql.sock /var/lib/mysql/mysql.sock
Ověřte, zda je soubor soketu MySQL nyní přesměrován na soubor soketu 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
Musíme také změnit výchozí přihlašovací údaje v /root/.my.cnf následovně:
(whm)$ cat ~/.my.cnf
[client]
#password="T<y4ar&cgjIu"
user=root
password='[email protected]'
socket=/var/lib/mysql/mysql.sock
Trochu na vysvětlení – První řádek, který jsme okomentovali, je kořenové heslo MySQL generované cPanelem pro místní server MySQL. Nebudeme to používat, proto je '#' na začátku řádku. Poté jsme přidali kořenové heslo MySQL pro naše nastavení replikace MySQL a cestu soketu UNIX, která je nyní symbolickým odkazem na soubor soketu ProxySQL.
V tomto okamžiku byste na serveru WHM měli mít přístup k našemu replikačnímu clusteru MySQL jako uživatel root jednoduše zadáním „mysql“, například:
(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>
Všimněte si, že verze serveru je 5.5.30 (ProxySQL). Pokud se můžete připojit jako výše, můžeme nakonfigurovat integrační část, jak je popsáno v další části.
Integrace WHM/cPanel
WHM podporuje řadu databázových serverů, jmenovitě MySQL 5.7, MariaDB 10.2 a MariaDB 10.3. Protože WHM nyní vidí pouze ProxySQL a je detekován jako verze 5.5.30 (jak je uvedeno výše), WHM si bude stěžovat na nepodporovanou verzi MySQL. Můžete přejít na WHM -> Služby SQL -> Správa profilů MySQL a klikněte na tlačítko Ověřit. V pravém horním rohu by se mělo zobrazit červené oznámení o této chybě.
Proto musíme změnit verzi MySQL v ProxySQL na stejnou verzi jako náš replikační cluster MySQL. Tyto informace můžete získat spuštěním následujícího příkazu na hlavním serveru:
mysql> SELECT @@version;
+------------+
| @@version |
+------------+
| 5.7.26-log |
+------------+
Poté se přihlaste do administrátorské konzole ProxySQL a změňte verze_mysql-serveru proměnná:
(whm)$ mysql -uproxysql-admin -p -h192.168.0.16 -P6032
Použijte příkaz SET, jak je uvedeno níže:
mysql> SET mysql-server_version = '5.7.26';
Poté načtěte proměnnou do runtime a uložte ji na disk, aby byla trvalá:
mysql> LOAD MYSQL VARIABLES TO RUNTIME;
mysql> SAVE MYSQL VARIABLES TO DISK;
Nakonec ověřte verzi, kterou bude ProxySQL reprezentovat:
mysql> SHOW VARIABLES LIKE 'mysql-server_version';
+----------------------+--------+
| Variable_name | Value |
+----------------------+--------+
| mysql-server_version | 5.7.26 |
+----------------------+--------+
Pokud se znovu pokusíte připojit k MySQL spuštěním příkazu "mysql", měli byste nyní v terminálu získat "Server version:5.7.26 (ProxySQL)".
Nyní můžeme aktualizovat kořenové heslo MySQL v části WHM -> Služby SQL -> Spravovat profily MySQL . Upravte profil localhost změnou pole Heslo ve spodní části pomocí kořenového hesla MySQL našeho replikačního clusteru. Po dokončení klikněte na tlačítko Uložit. Poté můžeme kliknout na "Validate" a ověřit, zda WHM může správně přistupovat k našemu replikačnímu clusteru MySQL prostřednictvím služby ProxySQL. V pravém horním rohu byste měli získat následující zelený toustovač:
Pokud obdržíte zelené upozornění na toustovač, můžeme přistoupit k integraci ProxySQL pomocí háčku cPanel.
Integrace proxySQL prostřednictvím cPanel Hook
ProxySQL jako prostředník mezi WHM a replikací MySQL potřebuje mít uživatelské jméno a heslo pro každého uživatele MySQL, který přes něj bude procházet. Pokud se současnou architekturou vytvoříte uživatele prostřednictvím ovládacího panelu (WHM prostřednictvím vytvoření účtu nebo cPanel pomocí průvodce databáze MySQL), WHM automaticky vytvoří uživatele přímo v našem replikačním clusteru MySQL pomocí [email protected] (který byl importován do ProxySQL předem). Stejný uživatel databáze by však nebyl automaticky přidán do tabulky ProxySQL mysql_users.
Z pohledu koncového uživatele by to nefungovalo, protože všechna připojení k localhost by v tomto bodě měla být předána přes ProxySQL. Potřebujeme způsob, jak integrovat cPanel s ProxySQL, přičemž u všech operací souvisejících s uživatelem MySQL prováděných WHM a cPanel musí být ProxySQL upozorněno a musí provést nezbytné akce k přidání/odebrání/aktualizaci své interní tabulky mysql_users.
Nejlepší způsob, jak automatizovat a integrovat tyto komponenty, je použití standardizovaného hákového systému cPanel. Standardizované háky spouštějí aplikace, když cPanel &WHM provede akci. Použijte tento systém ke spuštění vlastního kódu (kód akce háku) k přizpůsobení toho, jak cPanel a WHM fungují ve specifických scénářích (události háknutí).
Nejprve vytvořte soubor modulu Perl s názvem ProxysqlHook.pm v adresáři /usr/local/cpanel:
$ touch /usr/local/cpanel/ProxysqlHook.pm
Poté zkopírujte a vložte řádky odtud. Pro více informací se podívejte na úložiště Github na ProxySQL cPanel Hook.
Nakonfigurujte administrátorské rozhraní ProxySQL od řádku 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';
Nyní, když je háček na svém místě, musíme jej zaregistrovat pomocí systému háčků 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 výše uvedeného výstupu se tento modul zapojuje do řady událostí cPanel a WHM:
- Whostmgr::Accounts::Create - WHM -> Funkce účtu -> Vytvořit nový účet
- Whostmgr::Accounts::Remove - WHM -> Funkce účtu -> Ukončit účet
- Cpanel::UAPI::Mysql::create_user - cPanel -> Databáze -> Databáze MySQL -> Přidat nového uživatele
- Cpanel::Api2::MySQLFE::createdbuser - cPanel -> Databáze -> Databáze MySQL -> Přidat nového uživatele (vyžaduje integraci Softaculous).
- Cpanel::UAPI::Mysql::delete_user - cPanel -> Databáze -> Databáze MySQL -> Smazat uživatele
- Cpanel::Api2::MySQLFE::deletedbuser - cPanel -> Databáze -> Databáze MySQL -> Přidat nového uživatele (vyžaduje integraci Softaculous).
- Cpanel::UAPI::Mysql::set_privileges_on_database - cPanel -> Databáze -> Databáze MySQL -> Přidat uživatele do databáze
- Cpanel::Api2::MySQLFE::setdbuserprivileges - cPanel -> Databáze -> Databáze MySQL -> Přidat uživatele do databáze (vyžaduje integraci Softaculous).
- Cpanel::UAPI::Mysql::rename_user - cPanel -> Databáze -> Databáze MySQL -> Přejmenovat uživatele
- Cpanel::UAPI::Mysql::set_password - cPanel -> Databáze -> Databáze MySQL -> Změnit heslo
Pokud je spuštěna výše uvedená událost, modul provede nezbytné akce k synchronizaci tabulky mysql_users v ProxySQL. Operace provádí přes ProxySQL admin rozhraní běžící na portu 6032 na WHM serveru. Proto je důležité zadat správná uživatelská pověření pro ProxySQL, aby bylo zajištěno, že všichni uživatelé budou správně synchronizováni s ProxySQL.
Vezměte na vědomí, že tento modul, ProxysqlHook.pm, nebyl nikdy testován ve skutečném hostingovém prostředí (s mnoha účty a mnoha pluginy třetích stran) a zjevně nepokrývá všechny události související s MySQL v rámci cPanel. Testovali jsme to s bezplatnou edicí Softaculous a fungovalo to skvěle pomocí háčků cPanel API2. Aby byla zajištěna plná automatizace, mohou být nutné další úpravy.
To je prozatím vše. V další části se podíváme na operace po nasazení a na to, co bychom mohli získat s naším vysoce dostupným serverovým řešením MySQL pro naše hostingové servery ve srovnání se standardním samostatným nastavením MySQL.