MariaDB
 sql >> Teknologi Basis Data >  >> RDS >> MariaDB

Otomasi Basis Data dengan Wayang:Menyebarkan Replikasi MySQL &MariaDB

Wayang adalah alat manajemen sistem sumber terbuka untuk memusatkan dan mengotomatisasi manajemen konfigurasi. Alat otomatisasi membantu meminimalkan tugas manual dan berulang, serta dapat menghemat banyak waktu.

Wayang bekerja secara default dalam model server/agen. Agen mengambil "katalog" mereka (keadaan akhir yang diinginkan) dari master dan menerapkannya secara lokal. Kemudian mereka melaporkan kembali ke server. Katalog dihitung tergantung pada “fakta” ​​yang dikirimkan mesin ke server, input pengguna (parameter) dan modul (kode sumber).

Di blog ini, kami akan menunjukkan kepada Anda cara menerapkan dan mengelola instance MySQL/MariaDB melalui Puppet. Ada sejumlah teknologi di sekitar MySQL/MariaDB seperti replikasi (master-slave, Galera atau replikasi grup untuk MySQL), penyeimbang beban berbasis SQL seperti ProxySQL dan MariaDB MaxScale, alat pencadangan dan pemulihan, dan banyak lagi yang akan kami bahas dalam artikel ini. seri blog. Ada juga banyak modul yang tersedia di Puppet Forge yang dibuat dan dikelola oleh komunitas yang dapat membantu kita menyederhanakan kode dan menghindari penciptaan kembali roda. Di blog ini, kita akan fokus pada Replikasi MySQL.

puppetlabs/mysql

Ini adalah modul Wayang paling populer untuk MySQL dan MariaDB (dan mungkin yang terbaik di pasar) saat ini. Modul ini mengelola instalasi dan konfigurasi MySQL, serta memperluas Wayang untuk memungkinkan pengelolaan sumber daya MySQL, seperti database, pengguna, dan hibah.

Modul ini secara resmi dikelola oleh tim Puppet (melalui repositori Github puppetlabs) dan mendukung semua versi utama Puppet Enterprise 2019.1.x, 2019.0.x, 2018.1.x, Puppet>=5.5.10 <7.0.0 di RedHat, Ubuntu, Platform Debian, SLES, Scientific, CentOS, OracleLinux. Pengguna memiliki opsi untuk menginstal MySQL, MariaDB dan Server Percona dengan menyesuaikan repositori paket

Contoh berikut menunjukkan cara menggunakan server MySQL. Pada dalang, instal modul MySQL dan buat file manifes:

(puppet-master)$ puppet module install puppetlabs/mysql
(puppet-master)$ vim /etc/puppetlabs/code/environments/production/manifests/mysql.pp

Tambahkan baris berikut:

node "db1.local" {
  class { '::mysql::server':
    root_password => 't5[sb^D[+rt8bBYu',
    remove_default_accounts => true,
    override_options => {
      'mysqld' => {
        'log_error' => '/var/log/mysql.log',
        'innodb_buffer_pool_size' => '512M'
      }
      'mysqld_safe' => {
        'log_error' => '/var/log/mysql.log'
      }
    }
  }
}

Kemudian pada node agen boneka, jalankan perintah berikut untuk menerapkan katalog konfigurasi:

(db1.local)$ puppet agent -t

Saat pertama kali dijalankan, Anda mungkin mendapatkan kesalahan berikut:

Info: Certificate for db1.local has not been signed yet

Jalankan saja perintah berikut pada master Wayang untuk menandatangani sertifikat:

(puppet-master)$ puppetserver ca sign --certname=db1.local
Successfully signed certificate request for db1.local

Coba lagi dengan perintah "puppet agent -t" untuk memulai kembali koneksi dengan sertifikat yang ditandatangani.

Definisi di atas akan menginstal paket standar terkait MySQL yang tersedia di repositori distribusi OS. Misalnya, di Ubuntu 18.04 (Bionic), Anda akan menginstal paket MySQL 5.7.26:

(db1.local) $ dpkg --list | grep -i mysql
ii  mysql-client-5.7                5.7.26-0ubuntu0.18.04.1           amd64        MySQL database client binaries
ii  mysql-client-core-5.7           5.7.26-0ubuntu0.18.04.1           amd64        MySQL database core client binaries
ii  mysql-common                    5.8+1.0.4                         all          MySQL database common files, e.g. /etc/mysql/my.cnf
ii  mysql-server                    5.7.26-0ubuntu0.18.04.1           all          MySQL database server (metapackage depending on the latest version)
ii  mysql-server-5.7                5.7.26-0ubuntu0.18.04.1           amd64        MySQL database server binaries and system database setup
ii  mysql-server-core-5.7           5.7.26-0ubuntu0.18.04.1           amd64        MySQL database server binaries

Anda dapat memilih vendor lain seperti Oracle, Percona atau MariaDB dengan konfigurasi tambahan pada repositori (lihat bagian README untuk detailnya). Definisi berikut akan menginstal paket MariaDB dari repositori apt MariaDB (memerlukan modul Wayang apt):

$ puppet module install puppetlabs/apt
$ vim /etc/puppetlabs/code/environments/production/manifests/mariadb.pp
# include puppetlabs/apt module
include apt

# apt definition for MariaDB 10.3
apt::source { 'mariadb':
  location => 'http://sgp1.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,
  },
}

# MariaDB configuration
class {'::mysql::server':
  package_name     => 'mariadb-server',
  service_name     => 'mysql',
  root_password    => 't5[sb^D[+rt8bBYu',
  override_options => {
    mysqld => {
      'log-error' => '/var/log/mysql/mariadb.log',
      'pid-file'  => '/var/run/mysqld/mysqld.pid',
    },
    mysqld_safe => {
      'log-error' => '/var/log/mysql/mariadb.log',
    },
  }
}

# Deploy on db2.local
node "db2.local" {
Apt::Source['mariadb'] ->
Class['apt::update'] ->
Class['::mysql::server']
}

Perhatikan nilai key->id, di mana ada cara khusus untuk mengambil id 40 karakter seperti yang ditunjukkan dalam artikel ini:

$ sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
$ apt-key adv --list-public-keys --with-fingerprint --with-colons
uid:-::::1459359915::6DC53DD92B7A8C298D5E54F950371E2B8950D2F2::MariaDB Signing Key <[email protected]>::::::::::0:
sub:-:4096:1:C0F47944DE8F6914:1459359915::::::e::::::23:
fpr:::::::::A6E773A1812E4B8FD94024AAC0F47944DE8F6914:

Dimana nilai id berada pada baris yang diawali dengan "fpr", yaitu 'A6E773A1812E4B8FD94024AAC0F47944DE8F6914'.

Setelah katalog Wayang diterapkan, Anda dapat langsung mengakses konsol MySQL sebagai root tanpa kata sandi eksplisit karena modul mengonfigurasi dan mengelola ~/.my.cnf secara otomatis. Jika kita ingin mereset kata sandi root ke sesuatu yang lain, cukup ubah nilai root_password dalam definisi Wayang dan terapkan katalog pada simpul agen.

Penyebaran Replikasi MySQL

Untuk menyebarkan setup Replikasi MySQL, kita harus membuat setidaknya dua jenis konfigurasi untuk memisahkan konfigurasi master dan slave. Master akan menonaktifkan baca-saja untuk mengizinkan baca/tulis sementara budak akan dikonfigurasi dengan hanya-baca diaktifkan. Dalam contoh ini, kita akan menggunakan replikasi berbasis GTID untuk menyederhanakan konfigurasi (karena konfigurasi semua node akan sangat mirip). Kami ingin memulai link replikasi ke master tepat setelah slave aktif.

Misalkan kita memiliki 3 node replikasi master-slave MySQL:

  • db1.local - master
  • db2.local - budak #1
  • db3.local - budak #2

Untuk memenuhi persyaratan di atas, kami dapat menuliskan manifes kami seperti ini:

# Puppet manifest for MySQL GTID-based replication MySQL 5.7 on Ubuntu 18.04 (Puppet v6.4.2) 
# /etc/puppetlabs/code/environments/production/manifests/replication.pp

# node's configuration
class mysql {
  class {'::mysql::server':
    root_password           => '[email protected]#',
    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',
        'server-id'               => $mysql_server_id,
        'read_only'               => $mysql_read_only,
        'gtid-mode'               => 'ON',
        'enforce_gtid_consistency'=> 'ON',
        'log-slave-updates'       => 'ON',
        'sync_binlog'             => 1,
        'log-bin'                 => '/var/log/mysql-bin',
        'read_only'               => 'OFF',
        'binlog-format'           => 'ROW',
        'log-error'               => '/var/log/mysql/error.log',
        'report_host'             => ${fqdn},
        'innodb_buffer_pool_size' => '512M'
      },
      'mysqld_safe' => {
        'log-error'               => '/var/log/mysql/error.log'
      }
    }
  }
  
  # create slave user
  mysql_user { "${slave_user}@192.168.0.%":
      ensure        => 'present',
      password_hash => mysql_password("${slave_password}")
  }

  # grant privileges for slave user
  mysql_grant { "${slave_user}@192.168.0.%/*.*":
      ensure        => 'present',
      privileges    => ['REPLICATION SLAVE'],
      table         => '*.*',
      user          => "${slave_user}@192.168.0.%"
  }

  # /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';
  }

  # executes change master only if $master_host is defined
  if $master_host {
    exec { 'change master':
      path    => '/usr/bin:/usr/sbin:/bin',
      command => "mysql --defaults-extra-file=/root/.my.cnf -e \"CHANGE MASTER TO MASTER_HOST = '$master_host', MASTER_USER = '$slave_user', MASTER_PASSWORD = '$slave_password', MASTER_AUTO_POSITION = 1; START SLAVE;\"",
      unless  => "mysql --defaults-extra-file=/root/.my.cnf -e 'SHOW SLAVE STATUS\G' | grep 'Slave_SQL_Running: Yes'"
    }
  }
}

## node assignment

# global vars
$master_host = undef
$slave_user = 'slave'
$slave_password = 'Replicas123'

# master
node "db1.local" {
  $mysql_server_id = '1'
  $mysql_read_only = 'OFF'
  include mysql
}

# slave1
node "db2.local" {
  $mysql_server_id = '2'
  $mysql_read_only = 'ON'
  $master_host = 'db1.local'
  include mysql
}

# slave2
node "db3.local" {
  $mysql_server_id = '3'
  $mysql_read_only = 'ON'
  $master_host = 'db1.local'
  include mysql
}

Paksa agen untuk menerapkan katalog:

(all-mysql-nodes)$ puppet agent -t

Pada master (db1.local), kita dapat memverifikasi semua slave yang terhubung:

mysql> SHOW SLAVE HOSTS;
+-----------+-----------+------+-----------+--------------------------------------+
| Server_id | Host      | Port | Master_id | Slave_UUID                           |
+-----------+-----------+------+-----------+--------------------------------------+
|         3 | db3.local | 3306 |         1 | 2d0b14b6-8174-11e9-8bac-0273c38be33b |
|         2 | db2.local | 3306 |         1 | a9dfa4c7-8172-11e9-8000-0273c38be33b |
+-----------+-----------+------+-----------+--------------------------------------+

Berikan perhatian ekstra pada bagian "exec { 'change master' :", yang artinya perintah MySQL akan dijalankan untuk memulai tautan replikasi jika kondisinya terpenuhi. Semua sumber daya "exec" yang dijalankan oleh Wayang harus idempoten, artinya operasi yang akan memiliki efek yang sama apakah Anda menjalankannya sekali atau 10,001 kali. Ada sejumlah atribut kondisi yang dapat Anda gunakan seperti "kecuali", "hanya jika" dan "buat" untuk menjaga status yang benar dan mencegah Wayang mengacaukan pengaturan Anda. Anda dapat menghapus/memberi komentar pada bagian tersebut jika Anda ingin memulai tautan replikasi secara manual.

Pengelolaan MySQL

Modul ini dapat digunakan untuk melakukan sejumlah tugas manajemen MySQL:

  • opsi konfigurasi (ubah, terapkan, konfigurasi khusus)
  • sumber daya basis data (basis data, pengguna, hibah)
  • cadangan (membuat, menjadwalkan, membuat cadangan pengguna, penyimpanan)
  • pemulihan sederhana (khusus mysqldump)
  • instalasi/aktivasi plugin

Sumber Daya Basis Data

Seperti yang Anda lihat dalam contoh manifes di atas, kami telah mendefinisikan dua sumber daya MySQL - mysql_user dan mysql_grant - untuk membuat pengguna dan memberikan hak istimewa untuk pengguna tersebut. Kami juga dapat menggunakan kelas mysql::db untuk memastikan database dengan pengguna terkait dan hak istimewa ada, misalnya:

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

Perhatikan bahwa dalam replikasi MySQL, semua penulisan harus dilakukan hanya pada master. Jadi, pastikan bahwa sumber daya di atas ditetapkan ke master. Jika tidak, transaksi yang salah dapat terjadi.

Cadangkan dan Pulihkan

Biasanya, hanya satu host cadangan yang diperlukan untuk seluruh cluster (kecuali jika Anda mereplikasi subset data). Kita dapat menggunakan kelas mysql::server::backup untuk menyiapkan sumber daya cadangan. Misalkan kita memiliki deklarasi berikut dalam manifes kita:

  # 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',
    optional_args     => ['--set-gtid-purged=OFF'] #extra argument if GTID is enabled
  }

Wayang akan mengonfigurasi semua prasyarat sebelum menjalankan pencadangan - membuat pengguna pencadangan, menyiapkan jalur tujuan, menetapkan kepemilikan dan izin, menyetel tugas cron dan menyiapkan opsi perintah pencadangan untuk digunakan dalam skrip pencadangan yang disediakan yang terletak di /usr/local /sbin/mysqlbackup.sh. Terserah pengguna untuk menjalankan atau menjadwalkan skrip. Untuk membuat cadangan segera, cukup panggil:

$ mysqlbackup.sh

Jika kita mengekstrak perintah mysqldump yang sebenarnya berdasarkan di atas, inilah tampilannya:

$ mysqldump --defaults-extra-file=/tmp/backup.NYg0TR --opt --flush-logs --single-transaction --events --set-gtid-purged=OFF --all-databases

Bagi mereka yang ingin menggunakan alat pencadangan lain seperti Percona Xtrabackup, MariaDB Backup (Hanya MariaDB) atau MySQL Enterprise Backup, modul ini menyediakan kelas privat berikut:

  • mysql::backup::xtrabackup (Percona Xtrabackup dan MariaDB Backup)
  • mysql::backup::mysqlbackup (MySQL Enterprise Backup)

Contoh deklarasi dengan Percona Xtrabackup:

  class { 'mysql::backup::xtrabackup':
    xtrabackup_package_name => 'percona-xtrabackup',
    backupuser     => 'xtrabackup',
    backuppassword => 'passw0rd',
    backupdir      => '/home/xtrabackup',
    backupdirowner => 'mysql',
    backupdirgroup => 'mysql',
    backupdirmode  => '755',
    backupcompress => true,
    backuprotate   => 15,
    include_routines  => true,
    time              => ['23','30'], #backup starts at 11:30PM
    include_triggers  => true,
    maxallowedpacket  => '64M',
    incremental_backups => true
  }

Di atas akan menjadwalkan dua pencadangan, satu pencadangan penuh setiap hari Minggu pukul 23:30 dan satu pencadangan tambahan setiap hari kecuali hari Minggu pada waktu yang sama, seperti yang ditunjukkan oleh output cron job setelah manifes di atas diterapkan:

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

Untuk detail lebih lanjut dan opsi yang tersedia untuk kelas ini (dan kelas lainnya), lihat referensi opsi di sini.

Untuk aspek restorasi, modul hanya mendukung restorasi dengan metode backup mysqldump, dengan mengimpor file SQL langsung ke database menggunakan kelas mysql::db, misalnya:

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
}

File SQL akan dimuat hanya sekali dan tidak setiap kali dijalankan, kecuali jika menggunakan force_sql => true.

Opsi Konfigurasi

Dalam contoh ini, kami menggunakan manage_config_file => true dengan override_options untuk menyusun baris konfigurasi kami yang nantinya akan didorong oleh Wayang. Modifikasi apa pun pada file manifes hanya akan mencerminkan konten file konfigurasi MySQL target. Modul ini tidak akan memuat konfigurasi ke runtime atau memulai ulang layanan MySQL setelah memasukkan perubahan ke dalam file konfigurasi. Ini adalah tanggung jawab sysadmin untuk memulai kembali layanan untuk mengaktifkan perubahan.

Untuk menambahkan konfigurasi MySQL kustom, kita dapat menempatkan file tambahan ke "includedir", default ke /etc/mysql/conf.d. Ini memungkinkan kita untuk mengganti pengaturan atau menambahkan pengaturan tambahan, yang berguna jika Anda tidak menggunakan override_options di kelas mysql::server. Memanfaatkan template Wayang sangat dianjurkan di sini. Tempatkan file konfigurasi khusus di bawah direktori template modul (default ke , /etc/puppetlabs/code/environments/production/modules/mysql/templates) dan kemudian tambahkan baris berikut dalam manifes:

# 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')
}

Untuk mengimplementasikan parameter khusus versi, gunakan direktif versi, misalnya [mysqld-5.5]. Ini memungkinkan satu konfigurasi untuk versi MySQL yang berbeda.

Puppet vs ClusterControl

Tahukah Anda bahwa Anda juga dapat mengotomatiskan penerapan replikasi MySQL atau MariaDB dengan menggunakan ClusterControl? Anda dapat menggunakan modul ClusterControl Puppet untuk menginstalnya, atau cukup dengan mengunduhnya dari situs web kami.

Jika dibandingkan dengan ClusterControl, Anda dapat mengharapkan perbedaan berikut:

  • Sedikit kurva pembelajaran untuk memahami sintaksis Wayang, pemformatan, struktur sebelum Anda dapat menulis manifes.
  • Manifes harus diuji secara teratur. Sangat umum Anda akan mendapatkan kesalahan kompilasi pada kode terutama jika katalog diterapkan untuk pertama kalinya.
  • Puppet menganggap kode-kode itu idempoten. Kondisi uji/periksa/verifikasi berada di bawah tanggung jawab penulis untuk menghindari gangguan pada sistem yang sedang berjalan.
  • Puppet membutuhkan agen di node terkelola.
  • Ketidakcocokan mundur. Beberapa modul lama tidak dapat berjalan dengan benar pada versi baru.
  • Pemantauan database/host harus disiapkan secara terpisah.

Wizard penerapan ClusterControl memandu proses penerapan:

Atau, Anda dapat menggunakan antarmuka baris perintah ClusterControl yang disebut "s9s" untuk mencapai hasil yang serupa. Perintah berikut membuat kluster replikasi MySQL tiga simpul (disediakan tanpa kata sandi untuk semua simpul yang telah dikonfigurasi sebelumnya):

$ s9s cluster --create \
  --cluster-type=mysqlreplication \
      --nodes=192.168.0.41?master;192.168.0.42?slave;192.168.0.43?slave;192.168.0.44?master; \
  --vendor=oracle \
  --cluster-name='MySQL Replication 8.0' \
  --provider-version=8.0 \
  --db-admin='root' \
  --db-admin-passwd='$ecR3t^word' \
  --log
Referensi terkait Modul Wayang untuk ClusterControl - Menambahkan Manajemen dan Pemantauan ke Cluster Database Anda yang Ada Cara Mengotomatiskan Penerapan MySQL Galera Cluster menggunakan s9s CLI dan Chef Panduan DevOps untuk Otomasi Infrastruktur Database untuk eCommerce - Putar Ulang &Slide

Pengaturan replikasi MySQL/MariaDB berikut didukung:

  • Replikasi master-slave (berbasis file/posisi)
  • Replikasi master-slave dengan GTID (MySQL/Percona)
  • Replikasi master-slave dengan MariaDB GTID
  • Replikasi master-master (semi-sinkronisasi/asinkron)
  • Replikasi rantai master-slave (semi-sinkronisasi/asinkron)

Setelah penerapan, node/cluster dapat dipantau dan dikelola sepenuhnya oleh ClusterControl, termasuk deteksi kegagalan otomatis, master failover, promosi slave, pemulihan otomatis, manajemen pencadangan, manajemen konfigurasi, dan sebagainya. Semua ini dibundel bersama dalam satu produk. Edisi komunitas (gratis selamanya!) menawarkan penerapan dan pemantauan. Rata-rata, cluster database Anda akan aktif dan berjalan dalam waktu 30 menit. Yang dibutuhkan hanyalah SSH tanpa kata sandi ke node target.

Di bagian selanjutnya, kami akan memandu Anda melalui penerapan Galera Cluster menggunakan modul Wayang yang sama. Tetap disini!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Menginstal MariaDB di CentOS 8

  2. MariaDB JSON_REMOVE() Dijelaskan

  3. MariaDB JSON_LOOSE() Dijelaskan

  4. Perencanaan Kapasitas untuk MySQL dan MariaDB - Dimensi Ukuran Penyimpanan

  5. Perbaiki "ERROR 1222 (21000):Pernyataan SELECT yang digunakan memiliki jumlah kolom yang berbeda" saat menggunakan UNION di MariaDB