sql >> Databáze >  >> RDS >> MariaDB

Srovnávání manuálního nasazení databáze vs. automatizovaná nasazení

Existuje několik způsobů nasazení databáze. Můžete jej nainstalovat ručně, můžete se spolehnout na široce dostupné nástroje pro orchestraci infrastruktury jako Ansible, Chef, Puppet nebo Salt. Tyto nástroje jsou velmi oblíbené a je docela snadné najít skripty, recepty, playbooky, co si jen vzpomenete, které vám pomohou zautomatizovat instalaci databázového clusteru. Existují také specializovanější platformy pro automatizaci databází, jako je ClusterControl, které lze také použít k automatizovanému nasazení. Jaký by byl nejlepší způsob nasazení vašeho clusteru? Kolik času budete skutečně potřebovat k jeho nasazení?

Nejprve si ujasněme, co chceme dělat. Předpokládejme, že budeme nasazovat Percona XtraDB Cluster 5.7. Bude se skládat ze tří uzlů a k tomu využijeme tři virtuální stroje Vagrant s Ubuntu 16.04 (obraz bento/ubuntu-16.04). Pokusíme se nasadit cluster ručně, poté pomocí Ansible a ClusterControl. Uvidíme, jak budou vypadat výsledky.

Ruční nasazení

Nastavení úložiště – 1 minuta, 45 sekund.

Nejprve musíme nakonfigurovat úložiště Percona na všech uzlech Ubuntu. Rychlé vyhledávání Google, ssh do virtuálních strojů a spuštění požadovaných příkazů trvá 1 m 45 s

Našli jsme následující stránku s pokyny:
https://www.percona.com/doc/percona-repo-config/percona-release.html

a provedli jsme kroky popsané v části „DEB-BASED GNU/LINUX DISTRIBUTIONS“. Také jsme spustili aktualizaci apt, abychom obnovili mezipaměť apt.

Instalace uzlů PXC – 2 minuty 45 sekund

Tento krok v podstatě spočívá ve spuštění:

[email protected]:~# apt install percona-xtradb-cluster-5.7

Zbytek většinou závisí na rychlosti vašeho internetového připojení při stahování balíčků. Bude také potřeba váš vstup (budete předávat heslo pro superuživatele), aby se nejednalo o bezobslužnou instalaci. Když je vše hotovo, skončíte se třemi běžícími uzly Percona XtraDB Cluster:

root     15488  0.0  0.2   4504  1788 ?        S    10:12   0:00 /bin/sh /usr/bin/mysqld_safe
mysql    15847  0.3 28.3 1339576 215084 ?      Sl   10:12   0:00  \_ /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --wsrep-provider=/usr/lib/galera3/libgalera_smm.so --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --wsrep_start_position=00000000-0000-0000-0000-000000000000:-1

Konfigurace uzlů PXC – 3 minuty, 25 sekund

Zde začíná ošemetná část. Je opravdu těžké kvantifikovat zkušenosti a kolik času by člověk potřeboval, aby skutečně pochopil, co je potřeba udělat. Co je dobré, google vyhledávání „jak nainstalovat percona xtrabdb cluster“ ukazuje na dokumentaci Percona, která popisuje, jak by měl proces vypadat. Stále to může trvat více nebo méně času, v závislosti na tom, jak dobře jste obeznámeni s PXC a Galerou obecně. V nejhorším případě nebudete vědět o žádných dalších požadovaných akcích a připojíte se ke svému PXC a začnete s ním pracovat, aniž byste si uvědomili, že ve skutečnosti máte tři uzly, z nichž každý tvoří svůj vlastní shluk.

Předpokládejme, že se řídíme doporučením společnosti Percona a načasujeme provedení právě těchto kroků. Stručně řečeno, upravili jsme konfigurační soubory podle pokynů na webu Percona, také jsme se pokusili zavést první uzel:

[email protected]:~# /etc/init.d/mysql bootstrap-pxc
mysqld: [ERROR] Found option without preceding group in config file /etc/mysql/my.cnf at line 10!
mysqld: [ERROR] Fatal error in defaults handling. Program aborted!
mysqld: [ERROR] Found option without preceding group in config file /etc/mysql/my.cnf at line 10!
mysqld: [ERROR] Fatal error in defaults handling. Program aborted!
mysqld: [ERROR] Found option without preceding group in config file /etc/mysql/my.cnf at line 10!
mysqld: [ERROR] Fatal error in defaults handling. Program aborted!
mysqld: [ERROR] Found option without preceding group in config file /etc/mysql/my.cnf at line 10!
mysqld: [ERROR] Fatal error in defaults handling. Program aborted!
 * Bootstrapping Percona XtraDB Cluster database server mysqld                                                                                                                                                                                                                     ^C

Nevypadalo to správně. Bohužel pokyny nebyly křišťálově jasné. Opět, pokud nevíte, co se děje, strávíte více času snahou porozumět tomu, co se stalo. Naštěstí je stackoverflow.com velmi užitečný (ačkoli to není první odpověď na seznamu, kterou jsme dostali) a měli byste si uvědomit, že vám v souboru /etc/mysql/my.cnf chybí záhlaví sekce [mysqld]. Přidání tohoto na všechny uzly a opakování procesu bootstrap problém vyřešilo. Celkem jsme strávili 3 minuty a 25 sekund (bez googlování na chybu, protože jsme si okamžitě všimli, v čem byl problém).

Konfigurace pro SST, přivedení dalších uzlů do clusteru – od 8 minut do nekonečna

Pokyny na webu Percona jsou celkem jasné. Jakmile budete mít jeden uzel v provozu, začněte se zbývajícími uzly a budete v pořádku. Zkusili jsme to a nebyli jsme schopni vidět více uzlů připojujících se ke clusteru. Zde je prakticky nemožné říci, jak dlouho bude trvat diagnostika problému. Trvalo nám to 6-7 minut, ale abyste to mohli udělat rychle, musíte:

  1. Seznamte se s tím, jak je strukturována konfigurace PXC:
    [email protected]:~# tree  /etc/mysql/
    /etc/mysql/
    ├── conf.d
    │   ├── mysql.cnf
    │   └── mysqldump.cnf
    ├── my.cnf -> /etc/alternatives/my.cnf
    ├── my.cnf.fallback
    ├── my.cnf.old
    ├── percona-xtradb-cluster.cnf
    └── percona-xtradb-cluster.conf.d
        ├── client.cnf
        ├── mysqld.cnf
        ├── mysqld_safe.cnf
        └── wsrep.cnf
  2. Zjistěte, jak fungují direktivy !include a !includedir v konfiguračních souborech MySQL
  3. Zjistěte, jak MySQL zpracovává stejné proměnné obsažené ve více souborech
  4. Vědět, co hledat, a být si vědomi konfigurací, které by vedly k tomu, že se uzel sám zavede a vytvoří klastr.

Problém souvisel s tím, že instrukce nezmiňovaly žádný soubor kromě /etc/mysql/my.cnf, kde jsme ve skutečnosti měli upravovat /etc/mysql/percona-xtradb-cluster.conf.d/wsrep .cnf. Tento soubor obsahoval prázdnou proměnnou:

wsrep_cluster_address=gcomm://

a taková konfigurace nutí uzel k bootstrap, protože nemá informace o dalších uzlech, ke kterým by se mohl připojit. Tuto proměnnou jsme nastavili v /etc/mysql/my.cnf, ale později byl zahrnut soubor wsrep.cnf, který přepsal naše nastavení.

Tento problém může být vážným blokátorem pro lidi, kteří nejsou ve skutečnosti obeznámeni s tím, jak MySQL a Galera fungují, což má za následek dokonce hodiny, ne-li více, ladění.

Celková doba instalace – 16 minut (pokud jste MySQL DBA jako já)

Percona XtraDB Cluster se nám podařilo nainstalovat za 16 minut. Musíte mít na paměti několik věcí - konfiguraci jsme neladili. To je něco, co bude vyžadovat více času a znalostí. Uzel PXC přichází s jednoduchou konfigurací, která se týká především binárního protokolování a replikace zapisovací sady Galera. Neexistuje žádné ladění InnoDB. Pokud nejste obeznámeni s interními prvky MySQL, jsou to hodiny, ne-li dny, kdy budete číst a seznamovat se s interními mechanismy. Další důležitou věcí je, že se jedná o proces, který byste museli znovu použít pro každý cluster, který nasadíte. Nakonec se nám podařilo problém identifikovat a vyřešit velmi rychle díky našim zkušenostem s Percona XtraDB Cluster a MySQL obecně. Příležitostný uživatel s největší pravděpodobností stráví podstatně více času snahou porozumět tomu, co se děje a proč.

Příručka Ansible

Nyní k automatizaci s Ansible. Zkusme najít a použít ansible playbook, který bychom mohli znovu použít pro všechna další nasazení. Uvidíme, jak dlouho to bude trvat.

Konfigurace připojení SSH – 1 minuta

Ansible vyžaduje připojení SSH napříč všemi uzly, aby je bylo možné připojit a nakonfigurovat. Vygenerovali jsme klíč SSH a ručně jej distribuovali mezi uzly.

Finding Ansible Playbook – 2 minuty 15 sekund

Hlavním problémem je, že je k dispozici tolik herních knih, že není možné rozhodnout, co je nejlepší. Proto jsme se rozhodli použít 3 nejlepší výsledky Google a pokusit se vybrat jeden. Rozhodli jsme se pro https://github.com/cdelgehier/ansible-role-XtraDB-Cluster, protože se zdá být lépe konfigurovatelný než ty zbývající.

Klonování úložiště a instalace Ansible – 30 sekund

Je to rychlé, vše, co jsme potřebovali, bylo

apt install ansible git
git clone https://github.com/cdelgehier/ansible-role-XtraDB-Cluster.git

Příprava souboru inventáře – 1 minuta 10 sekund

Tento krok byl také velmi jednoduchý, vytvořili jsme inventární soubor na příkladu z dokumentace. Právě jsme nahradili IP adresy uzlů tím, co jsme nakonfigurovali v našem prostředí.

Příprava příručky – 1 minuta 45 sekund

Rozhodli jsme se použít nejrozsáhlejší ukázku z dokumentace, která zahrnuje i trochu toho ladění konfigurace. Připravili jsme správnou strukturu pro Ansible (v dokumentaci taková informace nebyla):

/root/pxcansible/
├── inventory
├── pxcplay.yml
└── roles
    └── ansible-role-XtraDB-Cluster

Pak jsme to spustili, ale okamžitě jsme dostali chybu:

[email protected]:~/pxcansible# ansible-playbook pxcplay.yml
 [WARNING]: provided hosts list is empty, only localhost is available

ERROR! no action detected in task

The error appears to have been in '/root/pxcansible/roles/ansible-role-XtraDB-Cluster/tasks/main.yml': line 28, column 3, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:


- name: "Include {{ ansible_distribution }} tasks"
  ^ here
We could be wrong, but this one looks like it might be an issue with
missing quotes.  Always quote template expression brackets when they
start a value. For instance:

    with_items:
      - {{ foo }}

Should be written as:

    with_items:
      - "{{ foo }}"

To trvalo 1 minutu a 45 sekund.

Oprava problému se syntaxí Playbooku – 3 minuty 25 sekund

Chyba byla zavádějící, ale obecným pravidlem je vyzkoušet novější verzi Ansible, což jsme udělali. Vygooglili jsme a našli jsme dobrý návod na webu Ansible. Další pokus o spuštění playbooku také selhal:

TASK [ansible-role-XtraDB-Cluster : Delete anonymous connections] *****************************************************************************************************************************************************************************************************************
fatal: [node2]: FAILED! => {"changed": false, "msg": "The PyMySQL (Python 2.7 and Python 3.X) or MySQL-python (Python 2.X) module is required."}
fatal: [node3]: FAILED! => {"changed": false, "msg": "The PyMySQL (Python 2.7 and Python 3.X) or MySQL-python (Python 2.X) module is required."}
fatal: [node1]: FAILED! => {"changed": false, "msg": "The PyMySQL (Python 2.7 and Python 3.X) or MySQL-python (Python 2.X) module is required."}

Nastavení nové verze Ansible a spuštění playbooku do této chyby trvalo 3 minuty a 25 sekund.

Oprava chybějícího modulu Python – 3 minuty 20 sekund

Role, kterou jsme použili, se zjevně nestarala o své předpoklady a chyběl modul Python pro připojení a zabezpečení clusteru Galera. Nejprve jsme zkusili nainstalovat MySQL-python přes pip, ale ukázalo se, že to bude trvat déle, protože to vyžaduje mysql_config:

[email protected]:~# pip install MySQL-python
Collecting MySQL-python
  Downloading https://files.pythonhosted.org/packages/a5/e9/51b544da85a36a68debe7a7091f068d802fc515a3a202652828c73453cad/MySQL-python-1.2.5.zip (108kB)
    100% |████████████████████████████████| 112kB 278kB/s
    Complete output from command python setup.py egg_info:
    sh: 1: mysql_config: not found
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-build-zzwUtq/MySQL-python/setup.py", line 17, in <module>
        metadata, options = get_config()
      File "/tmp/pip-build-zzwUtq/MySQL-python/setup_posix.py", line 43, in get_config
        libs = mysql_config("libs_r")
      File "/tmp/pip-build-zzwUtq/MySQL-python/setup_posix.py", line 25, in mysql_config
        raise EnvironmentError("%s not found" % (mysql_config.path,))
    EnvironmentError: mysql_config not found

    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-zzwUtq/MySQL-python/

To poskytují vývojové knihovny MySQL, takže bychom je museli instalovat ručně, což bylo v podstatě zbytečné. Rozhodli jsme se jít s PyMySQL, který nevyžadoval instalaci dalších balíčků. To nás přivedlo k dalšímu problému:

TASK [ansible-role-XtraDB-Cluster : Delete anonymous connections] *****************************************************************************************************************************************************************************************************************
fatal: [node3]: FAILED! => {"changed": false, "msg": "unable to connect to database, check login_user and login_password are correct or /root/.my.cnf has the credentials. Exception message: (1698, u\"Access denied for user 'root'@'localhost'\")"}
fatal: [node2]: FAILED! => {"changed": false, "msg": "unable to connect to database, check login_user and login_password are correct or /root/.my.cnf has the credentials. Exception message: (1698, u\"Access denied for user 'root'@'localhost'\")"}
fatal: [node1]: FAILED! => {"changed": false, "msg": "unable to connect to database, check login_user and login_password are correct or /root/.my.cnf has the credentials. Exception message: (1698, u\"Access denied for user 'root'@'localhost'\")"}
    to retry, use: --limit @/root/pxcansible/pxcplay.retry

Do této chvíle jsme strávili 3 minuty a 20 sekund.

Oprava chyby „Přístup odepřen“ – 18 minut 55 sekund

Podle chyby jsme zajistili, že konfigurace MySQL je připravena správně a že obsahuje správného uživatele a heslo pro připojení k databázi. To bohužel nefungovalo podle očekávání. Prozkoumali jsme dále a zjistili jsme, že role nevytvořila uživatele root správně, i když označila krok jako dokončený. Provedli jsme krátký průzkum, ale rozhodli jsme se provést ruční opravu, místo abychom se pokoušeli ladit playbook, což by zabralo mnohem více času než kroky, které jsme udělali. Právě jsme ručně vytvořili uživatele [email protected] a [email protected] se správnými hesly. To nám umožnilo přejít tento krok a na další chybu:

TASK [ansible-role-XtraDB-Cluster : Start the master node] ************************************************************************************************************************************************************************************************************************
skipping: [node1]
skipping: [node2]
skipping: [node3]

TASK [ansible-role-XtraDB-Cluster : Start the master node] ************************************************************************************************************************************************************************************************************************
skipping: [node1]
skipping: [node2]
skipping: [node3]

TASK [ansible-role-XtraDB-Cluster : Create SST user] ******************************************************************************************************************************************************************************************************************************
skipping: [node1]
skipping: [node2]
skipping: [node3]

TASK [ansible-role-XtraDB-Cluster : Start the slave nodes] ************************************************************************************************************************************************************************************************************************
fatal: [node3]: FAILED! => {"changed": false, "msg": "Unable to start service mysql: Job for mysql.service failed because the control process exited with error code. See \"systemctl status mysql.service\" and \"journalctl -xe\" for details.\n"}
fatal: [node2]: FAILED! => {"changed": false, "msg": "Unable to start service mysql: Job for mysql.service failed because the control process exited with error code. See \"systemctl status mysql.service\" and \"journalctl -xe\" for details.\n"}
fatal: [node1]: FAILED! => {"changed": false, "msg": "Unable to start service mysql: Job for mysql.service failed because the control process exited with error code. See \"systemctl status mysql.service\" and \"journalctl -xe\" for details.\n"}
    to retry, use: --limit @/root/pxcansible/pxcplay.retry

Na tuto sekci jsme strávili 18 minut a 55 sekund.

Oprava problému „Start the Slave Nodes“ (část 1) – 7 minut 40 sekund

K vyřešení tohoto problému jsme vyzkoušeli několik věcí. Pokusili jsme se specifikovat uzel pomocí jeho názvu, zkusili jsme přepnout názvy skupin, nic problém nevyřešilo. Rozhodli jsme se vyčistit prostředí pomocí skriptu uvedeného v dokumentaci a začít od nuly. Nevyčistilo to, ale vše ještě zhoršilo. Po 7 minutách a 40 sekundách jsme se rozhodli vymazat virtuální stroje, znovu vytvořit prostředí a začít od nuly v naději, že když přidáme závislosti Pythonu, vyřeší to náš problém.

Oprava problému „Start the Slave Nodes“ (část 2) – 13 minut 15 sekund

Nastavení předpokladů Pythonu bohužel vůbec nepomohlo. Rozhodli jsme se dokončit proces ručně, bootstrapovat první uzel a poté nakonfigurovat uživatele SST a spustit zbývající slave. Tím bylo dokončeno „automatizované“ nastavení a trvalo nám 13 minut a 15 sekund, než jsme odladili a pak konečně přijali, že to nebude fungovat tak, jak návrhář playbooku očekával.

Další ladění – 10 minut 45 sekund

Nezastavili jsme se tam a rozhodli jsme se, že zkusíme ještě jednu věc. Místo toho, abychom se spoléhali na proměnné Ansible, pouze uvedeme IP jednoho z uzlů jako hlavní uzel. Tím byla tato část problému vyřešena a skončili jsme takto:

TASK [ansible-role-XtraDB-Cluster : Create SST user] ******************************************************************************************************************************************************************************************************************************
skipping: [node2]
skipping: [node3]
fatal: [node1]: FAILED! => {"changed": false, "msg": "unable to connect to database, check login_user and login_password are correct or /root/.my.cnf has the credentials. Exception message: (1045, u\"Access denied for user 'root'@'::1' (using password: YES)\")"}

Toto byl konec našich pokusů - pokusili jsme se přidat tohoto uživatele, ale nefungovalo to správně prostřednictvím ansible playbook, zatímco jsme mohli použít adresu IPv6 localhost pro připojení při použití klienta MySQL.

Celková doba instalace – neznámá (automatická instalace se nezdařila)

Celkem jsme strávili 64 minut a stále se nám nepodařilo rozběhnout věci automaticky. Zbývající problémy jsou vytvoření hesla root, které, jak se zdá, nefunguje, a následné spuštění Galera Cluster (problém uživatele SST). Těžko říct, jak dlouho bude trvat další ladění. Je to určitě možné - jen je to těžké kvantifikovat, protože to opravdu závisí na zkušenostech s Ansible a MySQL. Rozhodně to není něco, co si kdokoli může jen tak stáhnout, nakonfigurovat a spustit. No, možná by jiná příručka fungovala jinak? Je to možné, ale může to také vést k různým problémům. Dobře, takže je tu křivka učení, kterou je třeba vylézt a provést ladění, ale až budete mít vše připraveno, spustíte pouze skript. No, to je tak trochu pravda. Dokud změny zavedené správcem neporuší něco, na čem jste závislí, nebo nová verze Ansible naruší herní příručku nebo správce na projekt prostě zapomene a přestane jej vyvíjet (pro roli, kterou jsme použili, čeká docela užitečná žádost o stažení již téměř rok, což by mohlo vyřešit problém se závislostí Pythonu - nebylo začleněno). Pokud nepřijmete, že budete muset tento kód udržovat, nemůžete se skutečně spolehnout na to, že bude 100% přesný a bude fungovat ve vašem prostředí, zejména vzhledem k tomu, že původní vývojář nemá žádné pobídky k udržování kódu v aktuálním stavu. A co další verze? Tuto konkrétní příručku nemůžete použít k instalaci PXC 5.6 nebo jakékoli verze MariaDB. Jistě, můžete najít i další příručky. Budou fungovat lépe, nebo možná strávíte další hodiny tím, že se budete snažit, aby fungovaly?

ClusterControlSingle Console pro celou vaši databázovou infrastrukturu Zjistěte, co je ještě nového v ClusterControl Nainstalujte ClusterControl ZDARMA

ClusterControl

Nakonec se podívejme, jak lze ClusterControl použít k nasazení Percona XtraDB Cluster.

Konfigurace připojení SSH – 1 minuta

ClusterControl vyžaduje připojení SSH napříč všemi uzly k jejich připojení a konfiguraci. Vygenerovali jsme klíč SSH a ručně jej distribuovali mezi uzly.

Nastavení ClusterControl – 3 minuty 15 sekund

Rychlé vyhledávání „instalace ClusterControl“ nás nasměrovalo na příslušnou stránku dokumentace ClusterControl. Hledali jsme „jednodušší způsob instalace ClusterControl“, proto jsme sledovali odkaz a našli jsme následující pokyny.

Stažení skriptu a jeho spuštění trvalo 3 minuty a 15 sekund, během instalace jsme museli provést několik akcí, aby se nejednalo o bezobslužnou instalaci.

Přihlášení do uživatelského rozhraní a zahájení nasazení – 1 minuta 10 sekund

Nasměrovali jsme náš prohlížeč na IP uzlu ClusterControl.

Předali jsme požadované kontaktní informace a zobrazila se nám uvítací obrazovka:

Další krok – vybrali jsme možnost nasazení.

Museli jsme předat podrobnosti o připojení SSH.

Také jsme se rozhodli pro dodavatele, verzi, heslo a hostitele, které použijeme. Celý tento proces trval 1 minutu a 10 sekund.

Nasazení klastru Percona XtraDB – 12 minut 5 sekund

Zbývalo jen počkat, až ClusterControl dokončí nasazení. Po 12 minutách a 5 sekundách byl cluster připraven:

Celková doba instalace – 17 minut 30 sekund

Související zdroje ClusterControl for MySQL ClusterControl for MariaDB ClusterControl for Galera Cluster

ClusterControl a následně PXC cluster pomocí ClusterControl se nám podařilo nasadit za 17 minut a 30 sekund. Samotné nasazení PXC trvalo 12 minut a 5 sekund . Na konci máme fungující cluster, nasazený podle osvědčených postupů. ClusterControl také zajišťuje, že konfigurace clusteru dává smysl. Stručně řečeno, i když vlastně nevíte nic o MySQL nebo Galera Cluster, můžete mít cluster připravený pro produkci nasazený během několika minut. ClusterControl není jen nástroj pro nasazení, je to také platforma pro správu – lidem, kteří nemají zkušenosti s MySQL a Galera, ještě více usnadňuje identifikaci problémů s výkonem (prostřednictvím poradců) a provádění akcí správy (škálování clusteru nahoru a dolů, spouštění záloh, vytváření asynchronní slave Galera). Co je důležité, ClusterControl bude vždy zachován a lze jej použít k nasazení všech variant MySQL (a nejen MySQL/MariaDB, podporuje také TimeScaleDB, PostgreSQL a MongoDB). Fungovalo to také hned po vybalení, což se nedá říci o jiných metodách, které jsme testovali.

Pokud byste chtěli zažít totéž, můžete si zdarma stáhnout ClusterControl. Dejte nám vědět, jak se vám to líbilo.


  1. Analýza statistik tabulky PostgreSQL

  2. Jak BIN() funguje v MariaDB

  3. Chyba PHP (MySQL):Upozornění:mysql_num_rows() očekává, že parametr 1 bude zdrojem

  4. Oracle SQL – součet a seskupovat data podle týdne