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

Automatizace databáze pomocí Puppet:Nasazení MySQL &MariaDB Galera Cluster

V předchozím příspěvku na blogu jsme vám ukázali některé základní kroky k nasazení a správě samostatného serveru MySQL a také nastavení replikace MySQL pomocí modulu MySQL Puppet. V této druhé instalaci se budeme zabývat podobnými kroky, ale nyní s nastavením Galera Cluster.

Cluster Galera s loutkou

Jak možná víte, Galera Cluster má tři hlavní poskytovatele:

  • MySQL Galera Cluster (Codership)
  • Percona XtraDB Cluster (Percona)
  • Cluster MariaDB (vložený do serveru MariaDB společností MariaDB)

Běžnou praxí u nasazení Galera Cluster je mít na databázovém clusteru další vrstvu pro účely vyrovnávání zátěže. To je však složitý proces, který si zaslouží svůj vlastní příspěvek.

V Puppet Forge je k dispozici řada modulů Puppet, které lze použít k nasazení Galera Cluster. Zde jsou některé z nich..

  • puppetlabs/mysql – pouze MariaDB Galera
  • fraenki/galera – Percona XtraDB Cluster a MySQL Galera od Codership
  • edestecd/mariadb – pouze klastr MariaDB
  • filiadata/percona – Percona XtraDB Cluster

Protože naším cílem je poskytnout základní znalosti o tom, jak psát manifest a automatizovat nasazení pro Galera Cluster, budeme pokrývat nasazení MariaDB Galera Cluster pomocí modulu puppetlabs/mysql. U ostatních modulů se vždy můžete podívat do příslušné dokumentace, kde najdete pokyny nebo tipy k instalaci.

V Galera Cluster je pořadí při spuštění uzlu kritické. Aby bylo možné správně spustit nový klastr, musí být jeden uzel nastaven jako referenční uzel. Tento uzel bude spuštěn s prázdným připojovacím řetězcem hostitele (gcomm://), aby se inicializoval cluster. Tento proces se nazývá bootstrapping.

Po spuštění se uzel stane primární komponentou a zbývající uzly lze spustit pomocí standardního příkazu mysql start (systemctl start mysql nebo spuštění služby mysql ) následovaný úplným připojovacím řetězcem hostitele (gcomm://db1,db2,db3). Bootstrapping je vyžadován pouze v případě, že žádný jiný uzel v clusteru nezadržuje primární komponentu (zkontrolujte pomocí wsrep_cluster_status stav).

Proces spuštění clusteru musí být proveden explicitně uživatelem. Samotný manifest NESMÍ spustit cluster (bootstrap žádný uzel) při prvním spuštění, aby se zabránilo jakémukoli riziku ztráty dat. Pamatujte, že manifest Puppet musí být napsán tak, aby byl co možná nejidempotentnější. Manifest musí být bezpečný, aby mohl být proveden vícekrát, aniž by to ovlivnilo již běžící instance MySQL. To znamená, že se musíme zaměřit především na konfiguraci úložiště, instalaci balíčků, konfiguraci před spuštěním a konfiguraci uživatele SST.

Následující možnosti konfigurace jsou pro Galera povinné:

  • wsrep_on :Příznak pro zapnutí replikačního API zápisu pro Galera Cluster (pouze MariaDB).
  • wsrep_cluster_name :Název clusteru. Musí být identické na všech uzlech, které jsou součástí stejného clusteru.
  • wsrep_cluster_address :Komunikační připojovací řetězec Galera, předpona s gcomm:// a následovaný seznamem uzlů, oddělený čárkou. Prázdný seznam uzlů znamená inicializaci clusteru.
  • wsrep_provider :Cesta, kde se nachází knihovna Galera. Cesta se může lišit v závislosti na operačním systému.
  • bind_address :MySQL musí být dosažitelné externě, takže hodnota '0.0.0.0' je povinná.
  • wsrep_sst_method :Pro MariaDB je preferovanou metodou SST mariabackup.
  • wsrep_sst_auth :Uživatel a heslo MySQL (oddělené dvojtečkou) k provedení přenosu snímku. Obvykle určujeme uživatele, který má možnost vytvořit úplnou zálohu.
  • wsrep_node_address :IP adresa pro komunikaci a replikaci Galera. Pomocí Puppet facter vyberte správnou IP adresu.
  • wsrep_node_name :název hostitele FQDN. Pomocí Puppet facter vyberte správný název hostitele.

U nasazení založených na Debianu se poinstalační skript pokusí automaticky spustit server MariaDB. Pokud jsme nakonfigurovali wsrep_on=ON (příznak pro povolení Galery) s úplnou adresou v wsrep_cluster_address proměnnou, server by během instalace selhal. Je to proto, že nemá žádnou primární komponentu, ke které se lze připojit.

Pro správné spuštění clusteru v Galeře musí být první uzel (nazývaný bootstrap node) nakonfigurován s prázdným připojovacím řetězcem (wsrep_cluster_address =gcomm://), aby byl uzel spuštěn jako primární komponenta. Můžete také spustit poskytnutý bootstrap skript nazvaný galera_new_cluster, který v podstatě dělá podobnou věc, ale na pozadí.

Nasazení Galera Cluster (MariaDB)

Nasazení Galera Cluster vyžaduje další konfiguraci na zdroji APT pro instalaci preferovaného úložiště verzí MariaDB.

Všimněte si, že replikace Galera je zabudována do serveru MariaDB a nevyžaduje instalaci dalších balíčků. Jak již bylo řečeno, pro aktivaci Galery pomocí wsrep_on=ON je vyžadován další příznak. Bez tohoto příznaku bude MariaDB fungovat jako samostatný server.

V našem prostředí založeném na Debianu se možnost wsrep_on může objevit v manifestu až po dokončení prvního nasazení (jak je znázorněno dále v krocích nasazení). To má zajistit, aby první, počáteční spuštění fungovalo jako samostatný server pro Puppet, aby zajistil uzel dříve, než bude zcela připraven stát se uzlem Galera.

Začněme přípravou obsahu manifestu, jak je uvedeno níže (v případě potřeby upravte sekci globálních proměnných):

# Puppet manifest for Galera Cluster MariaDB 10.3 on Ubuntu 18.04 (Puppet v6.4.2) 
# /etc/puppetlabs/code/environments/production/manifests/galera.pp

# global vars
$sst_user         = 'sstuser'
$sst_password     = 'S3cr333t$'
$backup_dir       = '/home/backup/mysql'
$mysql_cluster_address = 'gcomm://192.168.0.161,192.168.0.162,192.168.0.163'


# node definition
node "db1.local", "db2.local", "db3.local" {
  Apt::Source['mariadb'] ~>
  Class['apt::update'] ->
  Class['mysql::server'] ->
  Class['mysql::backup::xtrabackup']
}

# apt module must be installed first: 'puppet module install puppetlabs-apt'
include apt

# custom repository definition
apt::source { 'mariadb':
  location => 'http://sfo1.mirrors.digitalocean.com/mariadb/repo/10.3/ubuntu',
  release  => $::lsbdistcodename,
  repos    => 'main',
  key      => {
    id     => 'A6E773A1812E4B8FD94024AAC0F47944DE8F6914',
    server => 'hkp://keyserver.ubuntu.com:80',
  },
  include  => {
    src    => false,
    deb    => true,
  },
}

# Galera configuration
class {'mysql::server':
  package_name            => 'mariadb-server',
  root_password           => '[email protected]#',
  service_name            => 'mysql',
  create_root_my_cnf      => true,
  remove_default_accounts => true,
  manage_config_file      => true,
  override_options        => {
    'mysqld' => {
      'datadir'                 => '/var/lib/mysql',
      'bind_address'            => '0.0.0.0',
      'binlog-format'           => 'ROW',
      'default-storage-engine'  => 'InnoDB',
      'wsrep_provider'          => '/usr/lib/galera/libgalera_smm.so',
      'wsrep_provider_options'  => 'gcache.size=1G',
      'wsrep_cluster_name'      => 'galera_cluster',
      'wsrep_cluster_address'   => $mysql_cluster_address,
      'log-error'               => '/var/log/mysql/error.log',
      'wsrep_node_address'      => $facts['networking']['interfaces']['enp0s8']['ip'],
      'wsrep_node_name'         => $hostname,
      'innodb_buffer_pool_size' => '512M',
      'wsrep_sst_method'        => 'mariabackup',
      'wsrep_sst_auth'          => "${sst_user}:${sst_password}"
    },
    'mysqld_safe' => {
      'log-error'               => '/var/log/mysql/error.log'
    }
  }
}

# force creation of backup dir if not exist
exec { "mkdir -p ${backup_dir}" :
  path   => ['/bin','/usr/bin'],
  unless => "test -d ${backup_dir}"
}

# create SST and backup user
class { 'mysql::backup::xtrabackup' :
  xtrabackup_package_name => 'mariadb-backup',
  backupuser              => "${sst_user}",
  backuppassword          => "${sst_password}",
  backupmethod            => 'mariabackup',
  backupdir               => "${backup_dir}"
}

# /etc/hosts definition
host {
  'db1.local': ip => '192.168.0.161';
  'db2.local': ip => '192.169.0.162';
  'db3.local': ip => '192.168.0.163';
}

V tomto bodě je potřeba trochu vysvětlení. 'wsrep_node_address' musí ukazovat na stejnou IP adresu, jaká byla deklarována v wsrep_cluster_address. V tomto prostředí mají naši hostitelé dvě síťová rozhraní a my chceme použít druhé rozhraní (nazvané enp0s8) pro komunikaci Galera (kde je připojena síť 192.168.0.0/24). To je důvod, proč používáme Puppet facter k získání informací z uzlu a jejich aplikování na možnost konfigurace. Zbytek je docela samozřejmý.

Na každém uzlu MariaDB spusťte následující příkaz a použijte katalog jako uživatel root:

$ puppet agent -t

Katalog bude aplikován na každý uzel pro instalaci a přípravu. Po dokončení musíme do našeho manifestu v části „override_options => mysqld“ přidat následující řádek:

      'wsrep_on'                 => 'ON',

Výše uvedené uspokojí požadavek Galera pro MariaDB. Poté použijte katalog na každý uzel MariaDB ještě jednou:

$ puppet agent -t

Po dokončení jsme připraveni spustit náš cluster. Protože se jedná o nový cluster, můžeme vybrat kterýkoli uzel jako referenční uzel neboli bootstrap uzel. Vyberme db1.local (192.168.0.161) a spusťte následující příkaz:

$ galera_new_cluster #db1

Jakmile je spuštěn první uzel, můžeme spustit zbývající uzel standardním příkazem start (po jednom uzlu):

$ systemctl restart mariadb #db2 and db3

Po spuštění nahlédněte do protokolu chyb MySQL na adrese /var/log/mysql/error.log a ujistěte se, že protokol končí následujícím řádkem:

2019-06-10  4:11:10 2 [Note] WSREP: Synchronized with group, ready for connections

Výše uvedené nám říká, že uzly jsou synchronizovány se skupinou. Poté můžeme ověřit stav pomocí následujícího příkazu:

$ mysql -uroot -e 'show status like "wsrep%"'

Ujistěte se, že na všech uzlech je wsrep_cluster_size , wsrep_cluster_status a wsrep_local_state_comment jsou 3, „Primární“ a „Synchronizované“.

Správa MySQL

Tento modul lze použít k provádění řady úloh správy MySQL...

  • možnosti konfigurace (upravit, použít, vlastní konfigurace)
  • zdroje databáze (databáze, uživatel, granty)
  • záloha (vytvoření, plánování, zálohování uživatele, úložiště)
  • jednoduché obnovení (pouze mysqldump)
  • instalace/aktivace pluginů

Řízení služeb

Nejbezpečnějším způsobem při zřizování Galera Cluster pomocí Puppet je zpracovávat všechny operace řízení služeb ručně (nenechejte Puppet, aby to řídil). Pro jednoduchý postupný restart clusteru by stačil standardní příkaz service. Spusťte následující příkaz jeden uzel po druhém.

$ systemctl restart mariadb # Systemd
$ service mariadb restart # SysVinit

Pokud však dojde k vytvoření síťového oddílu a není k dispozici žádná primární komponenta (viz wsrep_cluster_status ), je třeba zavést nejaktuálnější uzel, aby byl cluster opět funkční bez ztráty dat. Můžete postupovat podle kroků uvedených ve výše uvedené části nasazení. Chcete-li se dozvědět více o procesu bootstrapování s příklady scénáře, podrobně jsme to probrali v tomto příspěvku na blogu Jak zavést MySQL nebo MariaDB Galera Cluster.

Zdroj databáze

Použijte třídu mysql::db, abyste zajistili přítomnost databáze s přidruženým uživatelem a oprávněními, například:

  # make sure the database and user exist with proper grant
  mysql::db { 'mynewdb':
    user          => 'mynewuser',
    password      => 'passw0rd',
    host          => '192.168.0.%',
    grant         => ['SELECT', 'UPDATE']
  } 

Výše uvedenou definici lze přiřadit libovolnému uzlu, protože každý uzel v clusteru Galera je hlavní.

Zálohování a obnovení

Protože jsme vytvořili uživatele SST pomocí třídy xtrabackup, Puppet nakonfiguruje všechny předpoklady pro úlohu zálohování – vytvoření uživatele zálohování, příprava cílové cesty, přiřazení vlastnictví a oprávnění, nastavení úlohy cron a nastavení možností příkazu zálohování, které se mají používat. v poskytnutém zálohovacím skriptu. Každý uzel bude nakonfigurován se dvěma úlohami zálohování (jedna pro týdenní plné a druhá pro denní přírůstkové) výchozí nastavení na 23:05, jak můžete zjistit z výstupu crontab:

$ crontab -l
# Puppet Name: xtrabackup-weekly
5 23 * * 0 /usr/local/sbin/xtrabackup.sh --target-dir=/home/backup/mysql --backup
# Puppet Name: xtrabackup-daily
5 23 * * 1-6 /usr/local/sbin/xtrabackup.sh --incremental-basedir=/home/backup/mysql --target-dir=/home/backup/mysql/`date +%F_%H-%M-%S` --backup

Pokud byste místo toho chtěli naplánovat mysqldump, použijte k přípravě záložních zdrojů třídu mysql::server::backup. Předpokládejme, že máme v manifestu následující prohlášení:

  # Prepare the backup script, /usr/local/sbin/mysqlbackup.sh
  class { 'mysql::server::backup':
    backupuser     => 'backup',
    backuppassword => 'passw0rd',
    backupdir      => '/home/backup',
    backupdirowner => 'mysql',
    backupdirgroup => 'mysql',
    backupdirmode  => '755',
    backuprotate   => 15,
    time           => ['23','30'],   #backup starts at 11:30PM everyday
    include_routines  => true,
    include_triggers  => true,
    ignore_events     => false,
    maxallowedpacket  => '64M'
  }

Výše uvedené říká Puppetovi, aby nakonfiguroval zálohovací skript na /usr/local/sbin/mysqlbackup.sh a naplánoval jej každý den ve 23:30. Pokud chcete provést okamžitou zálohu, jednoduše vyvolejte:

$ mysqlbackup.sh

Pro obnovu modul podporuje pouze obnovu pomocí metody zálohování mysqldump, a to importem souboru SQL přímo do databáze pomocí třídy mysql::db, například:

mysql::db { 'mydb':
  user     => 'myuser',
  password => 'mypass',
  host     => 'localhost',
  grant    => ['ALL PRIVILEGES'],
  sql      => '/home/backup/mysql/mydb/backup.gz',
  import_cat_cmd => 'zcat',
  import_timeout => 900
}

Soubor SQL bude načten pouze jednou a ne při každém spuštění, pokud není použito force_sql => true.

Správa konfigurace

V tomto příkladu jsme použili manage_config_file => true s override_options ke strukturování našich konfiguračních řádků, které později vytlačí Puppet. Jakákoli úprava souboru manifestu bude odrážet pouze obsah cílového konfiguračního souboru MySQL. Tento modul po vložení změn do konfiguračního souboru ani nenačte konfiguraci do runtime, ani nerestartuje službu MySQL. Je odpovědností správce systému restartovat službu, aby se změny aktivovaly.

Chcete-li přidat vlastní konfiguraci MySQL, můžeme umístit další soubory do "includedir", výchozí do /etc/mysql/conf.d. To nám umožňuje přepsat nastavení nebo přidat další, což je užitečné, pokud nepoužíváte override_options ve třídě mysql::server. Zde se důrazně doporučuje použití šablony Puppet. Umístěte vlastní konfigurační soubor do adresáře šablony modulu (výchozí je /etc/puppetlabs/code/environments/production/modules/mysql/templates) a poté do manifestu přidejte následující řádky:

# Loads /etc/puppetlabs/code/environments/production/modules/mysql/templates/my-custom-config.cnf.erb into /etc/mysql/conf.d/my-custom-config.cnf

file { '/etc/mysql/conf.d/my-custom-config.cnf':
  ensure  => file,
  content => template('mysql/my-custom-config.cnf.erb')
}
Několik nines DevOps Průvodce správou databázíZjistěte, co potřebujete vědět k automatizaci a správě vašich databází s otevřeným zdrojovým kódemStáhněte si zdarma

Puppet vs ClusterControl

Věděli jste, že nasazení MySQL nebo MariaDB Galera můžete také automatizovat pomocí ClusterControl? Modul ClusterControl Puppet můžete použít k instalaci nebo jednoduše stažením z našich webových stránek.

Ve srovnání s ClusterControl můžete očekávat následující rozdíly:

  • Trochu křivka učení, abyste porozuměli syntaxi, formátování a strukturám Puppet, než budete moci psát manifesty.
  • Manifest je nutné pravidelně testovat. Je velmi běžné, že se u kódu zobrazí chyba kompilace, zejména pokud je katalog použit poprvé.
  • Puppet předpokládá, že kódy jsou idempotentní. Stav testu/kontroly/ověření spadá do odpovědnosti autora, aby nedošlo k záměně s běžícím systémem.
  • Puppet vyžaduje agenta na spravovaném uzlu.
  • Zpětná nekompatibilita. Některé staré moduly by v nové verzi nefungovaly správně.
  • Monitorování databáze/hostitele musí být nastaveno samostatně.

Průvodce nasazením ClusterControl vede proces nasazení:

Alternativně můžete k dosažení podobných výsledků použít rozhraní příkazového řádku ClusterControl nazvané „s9s“. Následující příkaz vytvoří tříuzlový klastr Percona XtraDB (za předpokladu, že všechny uzly byly předem nakonfigurovány bez hesla):

$ s9s cluster --create \
  --cluster-type=galera \
  --nodes='192.168.0.21;192.168.0.22;192.168.0.23' \
  --vendor=percona \
  --cluster-name='Percona XtraDB Cluster 5.7' \
  --provider-version=5.7 \
  --db-admin='root' \
  --db-admin-passwd='$ecR3t^word' \
  --log
Související zdroje Modul Puppet pro ClusterControl – Přidání správy a monitorování do vašich stávajících databázových clusterů Jak automatizovat nasazení clusteru MySQL Galera pomocí s9s CLI a Chef Database Automation with Puppet:Nasazení replikace MySQL a MariaDB

ClusterControl navíc podporuje nasazení vyvažovačů zátěže pro Galera Cluster – HAproxy, ProxySQL a MariaDB MaxScale – spolu s virtuální IP adresou (poskytovanou Keepalived) pro odstranění jakéhokoli jediného bodu selhání vaší databázové služby.

Po nasazení mohou být uzly/klastry monitorovány a plně spravovány pomocí ClusterControl, včetně automatické detekce selhání, automatického obnovení, správy zálohování, správy vyvažování zátěže, připojení asynchronního podřízeného zařízení, správy konfigurace atd. To vše je spojeno v jednom produktu. V průměru bude váš databázový cluster zprovozněn do 30 minut. Potřebuje pouze SSH bez hesla do cílových uzlů.

Můžete také importovat již běžící Galera Cluster, nasazený Puppetem (nebo jakýmkoli jiným způsobem) do ClusterControl, abyste svůj cluster naplnili všemi skvělými funkcemi, které s ním jsou. Komunitní edice (zdarma navždy!) nabízí nasazení a monitorování.

V další epizodě vás provedeme nasazením nástroje pro vyrovnávání zatížení MySQL pomocí Puppet. Zůstaňte naladěni!


  1. Ekvivalent k externím tabulkám Oracle v SQL Server

  2. Přístup odepřen pro uživatele 'root'@'localhost' (s použitím hesla:ANO) - Žádná oprávnění?

  3. Získejte den z data v PostgreSQL

  4. Rozdělení dat pro rozsáhlé aplikace