WHMCS je řešení pro správu, fakturaci a podporu klientů typu vše v jednom pro webhostingové společnosti. Je to jeden z lídrů ve světě automatizace hostingu, který se používá vedle samotného ovládacího panelu hostingu. WHMCS běží na zásobníku LAMP s MySQL/MariaDB jako poskytovatelem databáze. Obvykle se WHMCS instaluje jako samostatná instance (aplikace a databáze) nezávisle podle instalační příručky WHMCS nebo pomocí nástrojů pro instalaci softwaru, jako je cPanel Site Software nebo Softaculous. Databáze může být vysoce dostupná migrací do Galera Cluster 3 uzlů.
V tomto příspěvku na blogu vám ukážeme, jak migrovat databázi WHMCS ze samostatného serveru MySQL (poskytovaného samotným serverem WHM/cPanel) na externí tříuzlový cluster MariaDB Galera Cluster, aby se zlepšila dostupnost databáze. Samotná aplikace WHMCS bude spuštěna na stejném serveru cPanel. Poskytneme vám také několik tipů pro optimalizaci výkonu.
Nasazení databázového klastru
- Instalujte ClusterControl:
Postupujte podle pokynů, dokud nebude instalace dokončena. Poté přejděte na http://192.168.55.50/clustercontrol (192.168.55.50 je IP adresa hostitele ClusterControl) a zaregistrujte uživatele superadmin s heslem a dalšími požadovanými údaji.$ whoami root $ wget https://severalnines.com/downloads/cmon/install-cc $ chmod 755 install-cc $ ./install-cc
- Nastavit SSH bez hesla z ClusterControl do všech uzlů databáze:
$ whoami root $ ssh-keygen -t rsa # Press enter on all prompts $ ssh-copy-id 192.168.55.51 $ ssh-copy-id 192.168.55.52 $ ssh-copy-id 192.168.55.53
- Nakonfigurujte nasazení databáze pro náš 3uzlový cluster MariaDB Galera. Budeme používat nejnovější podporovanou verzi MariaDB 10.3: Ujistěte se, že po stisknutí klávesy Enter při přidávání podrobností o uzlu máte všechny zelené zaškrtnutí. Počkejte, dokud se úloha nasazení nedokončí a měli byste vidět, že klastr databáze je uveden v ClusterControl.
- Nasaďte uzel ProxySQL (umístíme jej společně s uzlem ClusterControl) tak, že přejdete na Správa -> Load Balancer -> ProxySQL -> Nasazení ProxySQL . Uveďte následující požadované podrobnosti: V části "Přidat uživatele databáze" můžete požádat ClusterControl o vytvoření nového uživatele ProxySQL a MySQL při nastavování , proto uvedeme uživatele jako "portal_whmcs", kterému jsou přiřazena VŠECHNA PRIVILEGACE v databázi "portal_whmcs.*". Poté zaškrtněte všechna políčka pro „Zahrnout“ a nakonec vyberte „false“ pro „Používáte implicitní transakce?“.
Po dokončení nasazení byste měli v zobrazení Topologie vidět něco takového:
Související zdroje Nejlepší australský poskytovatel hostingu využívá ClusterControl k poskytování prvotřídních zkušeností pro své uživatele a načítání dat MySQL MariaDB s ProxySQL – výukový program Vysoká dostupnost MySQL na cPanel s Galera ClusterNasazení naší databáze je nyní dokončeno. Mějte na paměti, že v tomto blogovém příspěvku se nezabýváme redundancí úrovně vyrovnávání zatížení. Toho můžete dosáhnout přidáním sekundárního vyrovnávače zátěže a spojením s Keepalived. Chcete-li se o tom dozvědět více, podívejte se na Výukové programy ProxySQL v kapitole "4.2. Vysoká dostupnost pro ProxySQL".
Instalace WHMCS
Pokud již máte nainstalovaný a spuštěný WHMCS, můžete tento krok přeskočit.
Vezměte na vědomí, že WHMCS vyžaduje platnou licenci, kterou si musíte předem zakoupit, abyste mohli software používat. Neposkytují bezplatnou zkušební licenci, ale nabízejí 30denní záruku vrácení peněz bez otázek, což znamená, že předplatné můžete kdykoli zrušit před vypršením nabídky, aniž by vám byly účtovány poplatky.
Pro zjednodušení instalačního procesu použijeme software cPanel Site Software (můžete se rozhodnout pro ruční instalaci WHMCS) na jednu z našich subdomén, selfportal.mytest.io. Po vytvoření účtu ve WHM přejděte na cPanel> Software> Site Software> WHMCS a nainstalujte webovou aplikaci. Přihlaste se jako uživatel správce a aktivujte licenci, abyste mohli začít používat aplikaci.
V tuto chvíli naše instance WHMCS běží jako samostatné nastavení a připojuje se k místnímu serveru MySQL.
ClusterControlSingle Console pro celou vaši databázovou infrastrukturu Zjistěte, co je ještě nového v ClusterControl Nainstalujte ClusterControl ZDARMAMigrace databáze WHMCS do MariaDB Galera Cluster
Spuštění WHMCS na samostatném serveru MySQL vystavuje aplikaci z hlediska databáze riziku single-point-of-failure (SPOF). MariaDB Galera Cluster poskytuje redundanci datové vrstvě s vestavěnými funkcemi shlukování a podporou architektury s více hlavními servery. Zkombinujte to s nástrojem pro vyrovnávání zatížení databáze, například ProxySQL, a můžeme zlepšit dostupnost databáze WHMCS s minimálními změnami v samotné aplikaci.
Existuje však řada osvědčených postupů, které musí WHMCS (nebo jiné aplikace) dodržovat, aby na Galera Cluster fungovaly efektivně, zejména:
- Všechny tabulky musí běžet na úložišti InnoDB/XtraDB.
- Všechny tabulky by měly mít definovaný primární klíč (je podporován primární klíč s více sloupci, jedinečný klíč se nepočítá).
V závislosti na nainstalované verzi v naší instalaci testovacího prostředí (cPanel/WHM 11.78.0.23, WHMCS 7.6.0 prostřednictvím Site Software) výše uvedené dva body nesplňovaly požadavek. Výchozí konfigurace cPanel/WHM MySQL přichází s následujícím řádkem uvnitř /etc/my.cnf:
default-storage-engine=MyISAM
Výše uvedené by způsobilo, že by další tabulky spravované doplňkovými moduly WHMCS byly vytvořeny ve formátu úložiště MyISAM, pokud jsou tyto moduly povoleny. Zde je výstup modulu úložiště poté, co jsme povolili 2 moduly (nové TLD a nástěnka zaměstnanců):
MariaDB> SELECT tables.table_schema, tables.table_name, tables.engine FROM information_schema.tables WHERE tables.table_schema='whmcsdata_whmcs' and tables.engine <> 'InnoDB';
+-----------------+----------------------+--------+
| table_schema | table_name | engine |
+-----------------+----------------------+--------+
| whmcsdata_whmcs | mod_enomnewtlds | MyISAM |
| whmcsdata_whmcs | mod_enomnewtlds_cron | MyISAM |
| whmcsdata_whmcs | mod_staffboard | MyISAM |
+-----------------+----------------------+--------+
Podpora MyISAM je v Galeře experimentální, což znamená, že byste ji neměli spouštět v produkci. V některých horších případech by to mohlo ohrozit konzistenci dat a způsobit selhání replikace zápisové sady kvůli netransakční povaze.
Dalším důležitým bodem je, že každá tabulka musí mít definovaný primární klíč. V závislosti na instalační proceduře WHMCS, kterou jste provedli (jako u nás jsme k instalaci WHMCS použili software cPanel Site Software), některé tabulky vytvořené instalačním programem nepřicházejí s definovaným primárním klíčem, jak ukazuje následující výstup:
MariaDB [information_schema]> SELECT TABLES.table_schema, TABLES.table_name FROM TABLES LEFT JOIN KEY_COLUMN_USAGE AS c ON (TABLES.TABLE_NAME = c.TABLE_NAME AND c.CONSTRAINT_SCHEMA = TABLES.TABLE_SCHEMA AND c.constraint_name = 'PRIMARY' ) WHERE TABLES.table_schema <> 'information_schema' AND TABLES.table_schema <> 'performance_schema' AND TABLES.table_schema <> 'mysql' and TABLES.table_schema <> 'sys' AND c.constraint_name IS NULL;
+-----------------+------------------------------------+
| table_schema | table_name |
+-----------------+------------------------------------+
| whmcsdata_whmcs | mod_invoicedata |
| whmcsdata_whmcs | tbladminperms |
| whmcsdata_whmcs | tblaffiliates |
| whmcsdata_whmcs | tblconfiguration |
| whmcsdata_whmcs | tblknowledgebaselinks |
| whmcsdata_whmcs | tbloauthserver_access_token_scopes |
| whmcsdata_whmcs | tbloauthserver_authcode_scopes |
| whmcsdata_whmcs | tbloauthserver_client_scopes |
| whmcsdata_whmcs | tbloauthserver_user_authz_scopes |
| whmcsdata_whmcs | tblpaymentgateways |
| whmcsdata_whmcs | tblproductconfiglinks |
| whmcsdata_whmcs | tblservergroupsrel |
+-----------------+------------------------------------+
Jako vedlejší poznámka, Galera by stále umožňovala existenci tabulek bez primárního klíče. Operace DELETE však nejsou v těchto tabulkách podporovány a navíc by vás to vystavilo mnohem větším problémům, jako je pád uzlů, snížení výkonu certifikace zapisovací sady nebo se řádky mohou na různých uzlech objevit v jiném pořadí.
Abychom tomu zabránili, náš plán migrace musí zahrnovat další krok k opravě úložiště a struktury schématu, jak je uvedeno v další části.
Plán migrace
Kvůli omezením vysvětleným v předchozí kapitole musí náš plán migrace vypadat nějak takto:
- Povolte režim údržby WHMCS
- Zálohujte databázi whmcs pomocí logické zálohy
- Upravte soubory výpisu, aby splňovaly požadavky Galera (převod úložiště)
- Vyvolejte jeden z uzlů Galera a nechte zbývající uzly vypnout
- Obnovit do vybraného uzlu Galera
- Opravte strukturu schématu tak, aby splňovala požadavky Galera (chybějící primární klíče)
- Zaveďte cluster z vybraného uzlu Galera
- Spusťte druhý uzel a nechte jej synchronizovat
- Spusťte třetí uzel a nechte jej synchronizovat
- Změňte databázi směřující na příslušný koncový bod
- Zakažte režim údržby WHMCS
Novou architekturu lze ilustrovat následovně:
Název naší databáze WHMCS na serveru cPanel je „whmcsdata_whmcs“ a budeme tuto databázi migrovat do externího tříuzlového clusteru MariaDB Galera Cluster nasazeného společností ClusterControl. Nad databázovým serverem máme ProxySQL (co-locate s ClusterControl), který funguje jako nástroj pro vyrovnávání zatížení MariaDB a poskytuje jediný koncový bod naší instanci WHMCS. Název databáze v clusteru se místo toho změní na „portal_whmcs“, abychom jej mohli snadno rozlišit.
Nejprve povolte režim údržby pro celý web tím, že přejdete na WHMCS> Nastavení> Obecná nastavení> Obecné> Režim údržby> Zaškrtnutím povolíte – zabrání přístupu do klientské oblasti, když je povoleno . Tím zajistíte, že během operace zálohování databáze nedojde k žádné aktivitě ze strany koncového uživatele.
Protože musíme provést drobné úpravy struktury schématu, aby se dobře vešlo do Galery, je dobré vytvořit dva samostatné soubory výpisu. Jeden pouze se schématem a druhý pouze pro data. Na serveru WHM spusťte následující příkaz jako root:
$ mysqldump --no-data -uroot whmcsdata_whmcs > whmcsdata_whmcs_schema.sql
$ mysqldump --no-create-info -uroot whmcsdata_whmcs > whmcsdata_whmcs_data.sql
Potom musíme všechny výskyty MyISAM v souboru výpisu schématu nahradit 'InnoDB':
$ sed -i 's/MyISAM/InnoDB/g' whmcsdata_whmcs_schema.sql
Ověřte, že v souboru výpisu již nemáme řádky MyISAM (nemělo by to nic vrátit):
$ grep -i 'myisam' whmcsdata_whmcs_schema.sql
Přeneste soubory výpisu ze serveru WHM do mariadb1 (192.168.55.51):
$ scp whmcsdata_whmcs_* 192.168.55.51:~
Vytvořte databázi MySQL. Z ClusterControl přejděte na Správa -> Schémata a uživatelé -> Vytvořit databázi a zadejte název databáze. Zde používáme jiný název databáze s názvem „portal_whmcs“. Jinak můžete databázi vytvořit ručně pomocí následujícího příkazu:
$ mysql -uroot -p
MariaDB> CREATE DATABASE 'portal_whmcs';
Vytvořte pro tuto databázi uživatele MySQL s jeho oprávněními. Z ClusterControl přejděte na Správa -> Schémata a uživatelé -> Uživatelé -> Vytvořit nového uživatele a zadejte následující:
V případě, že se rozhodnete vytvořit uživatele MySQL ručně, spusťte následující příkazy:
$ mysql -uroot -p
MariaDB> CREATE USER 'portal_whmcs'@'%' IDENTIFIED BY 'ghU51CnPzI9z';
MariaDB> GRANT ALL PRIVILEGES ON portal_whmcs.* TO [email protected]'%';
Vezměte na vědomí, že vytvořený uživatel databáze musí být importován do ProxySQL, aby se aplikace WHMCS mohla ověřit proti nástroji pro vyrovnávání zatížení. Přejděte na Nodes -> vyberte uzel ProxySQL -> Users -> Import Users a vyberte "portal_whmcs"@"%", jak je znázorněno na následujícím snímku obrazovky:
V dalším okně (User Settings) zadejte Hostgroup 10 jako výchozí hostitelskou skupinu:
Nyní je fáze přípravy obnovy dokončena.
V Galeře je obnova velké databáze přes mysqldump na clusteru s jedním uzlem efektivnější, což výrazně zkracuje dobu obnovy. Jinak by každý uzel v clusteru musel certifikovat každý příkaz ze vstupu mysqldump, což by trvalo déle.
Vzhledem k tomu, že již máme spuštěný tříuzlový klastr MariaDB Galera Cluster, zastavme službu MySQL na mariadb2 a mariadb3, jeden uzel po druhém, abychom mohli elegantně snížit. Chcete-li vypnout uzly databáze, z ClusterControl jednoduše přejděte na Nodes -> Node Actions -> Stop Node -> Proceed . Zde je to, co byste viděli na řídicím panelu ClusterControl, kde je velikost clusteru 1 a stav db1 je Synchronizováno a Primární:
Poté na mariadb1 (192.168.55.51) podle toho obnovte schéma a data:
$ mysql -uportal_whmcs -p portal_whmcs < whmcsdata_whmcs_schema.sql
$ mysql -uportal_whmcs -p portal_whmcs < whmcsdata_whmcs_data.sql
Po importu musíme opravit strukturu tabulky, abychom přidali nezbytný sloupec "id" (kromě tabulky "tblaffiliates") a také přidali primární klíč do všech tabulek, ve kterých nějaký chybí:
$ mysql -uportal_whmcs -p
MariaDB> USE portal_whmcs;
MariaDB [portal_whmcs]> ALTER TABLE `tblaffiliates` ADD PRIMARY KEY (id);
MariaDB [portal_whmcs]> ALTER TABLE `mod_invoicedata` ADD `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
MariaDB [portal_whmcs]> ALTER TABLE `tbladminperms` ADD `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
MariaDB [portal_whmcs]> ALTER TABLE `tblconfiguration` ADD `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
MariaDB [portal_whmcs]> ALTER TABLE `tblknowledgebaselinks` ADD `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
MariaDB [portal_whmcs]> ALTER TABLE `tbloauthserver_access_token_scopes` ADD `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
MariaDB [portal_whmcs]> ALTER TABLE `tbloauthserver_authcode_scopes` ADD `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
MariaDB [portal_whmcs]> ALTER TABLE `tbloauthserver_client_scopes` ADD `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
MariaDB [portal_whmcs]> ALTER TABLE `tbloauthserver_user_authz_scopes` ADD `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
MariaDB [portal_whmcs]> ALTER TABLE `tblpaymentgateways` ADD `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
MariaDB [portal_whmcs]> ALTER TABLE `tblproductconfiglinks` ADD `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
MariaDB [portal_whmcs]> ALTER TABLE `tblservergroupsrel` ADD `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
Nebo můžeme výše opakované příkazy přeložit pomocí smyčky v bash skriptu:
#!/bin/bash
db_user='portal_whmcs'
db_pass='ghU51CnPzI9z'
db_whmcs='portal_whmcs'
tables=$(mysql -u${db_user} "-p${db_pass}" information_schema -A -Bse "SELECT TABLES.table_name FROM TABLES LEFT JOIN KEY_COLUMN_USAGE AS c ON (TABLES.TABLE_NAME = c.TABLE_NAME AND c.CONSTRAINT_SCHEMA = TABLES.TABLE_SCHEMA AND c.constraint_name = 'PRIMARY' ) WHERE TABLES.table_schema <> 'information_schema' AND TABLES.table_schema <> 'performance_schema' AND TABLES.table_schema <> 'mysql' and TABLES.table_schema <> 'sys' AND c.constraint_name IS NULL;")
mysql_exec="mysql -u${db_user} -p${db_pass} $db_whmcs -e"
for table in $tables
do
if [ "${table}" = "tblaffiliates" ]
then
$mysql_exec "ALTER TABLE ${table} ADD PRIMARY KEY (id)";
else
$mysql_exec "ALTER TABLE ${table} ADD id INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST";
fi
done
V tomto okamžiku je bezpečné spustit zbývající uzly pro synchronizaci s mariadb1. Začněte s mariadb2 tím, že přejdete na Nodes -> pick db2 -> Node Actions -> Start Node . Sledujte průběh úlohy a před spuštěním mariadb3 se ujistěte, že je mariadb2 ve stavu Synced a Primary (podrobnosti najdete na stránce Přehled).
Nakonec změňte databázi ukazující na hostitele ProxySQL na portu 6033 v konfiguračním souboru WHMCS, jako v našem případě se nachází na /home/whmcsdata/public_html/configuration.php:
$ vim configuration.php
<?php
$license = 'WHMCS-XXXXXXXXXXXXXXXXXXXX';
$templates_compiledir = 'templates_c';
$mysql_charset = 'utf8';
$cc_encryption_hash = 'gLg4oxuOWsp4bMleNGJ--------30IGPnsCS49jzfrKjQpwaN';
$db_host = 192.168.55.50;
$db_port = '6033';
$db_username = 'portal_whmcs';
$db_password = 'ghU51CnPzI9z';
$db_name = 'portal_whmcs';
$customadminpath = 'admin2d27';
Nezapomeňte deaktivovat režim údržby WHMCS tak, že přejdete do WHMCS> Nastavení> Obecná nastavení> Obecné> Režim údržby> zrušte zaškrtnutí políčka "Zaškrtnutím povolíte - zabrání přístupu do klientské oblasti, když je povoleno" . Naše cvičení migrace databáze je nyní dokončeno.
Testování a ladění
Můžete si ověřit, zda se podíváte na položky dotazů ProxySQL v části Nodes -> ProxySQL -> Top Queries :
U nejčastěji opakovaných dotazů pouze pro čtení (můžete je seřadit podle Count Star) je můžete uložit do mezipaměti, abyste zlepšili dobu odezvy a snížili počet přístupů k backendovým serverům. Jednoduše přejděte na libovolný dotaz a klikněte na Dotaz do mezipaměti a zobrazí se následující vyskakovací okno:
Co musíte udělat, je vybrat pouze cílovou hostitelskou skupinu a kliknout na "Přidat pravidlo". Poté můžete ověřit, zda byl dotaz uložený v mezipaměti nalezen na kartě „Pravidla“:
Ze samotného pravidla dotazu můžeme říci, že čtení (všechny SELECT kromě SELECT .. FOR UPDATE) jsou předávány do hostitelské skupiny 20, kde jsou připojení distribuována do všech uzlů, zatímco zápisy (jiné než SELECT) jsou předávány do hostitelské skupiny 10, kde jsou připojení jsou předávány pouze jednomu uzlu Galera. Tato konfigurace minimalizuje riziko uváznutí, které může být způsobeno nastavením s více hlavními servery, což zlepšuje výkon replikace jako celku.
To je prozatím vše. Šťastné shlukování!