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

Otomasi Basis Data dengan Wayang:Menerapkan MySQL &MariaDB Galera Cluster

Dalam posting blog sebelumnya, kami menunjukkan kepada Anda beberapa langkah dasar untuk menerapkan dan mengelola server MySQL mandiri serta pengaturan Replikasi MySQL menggunakan modul MySQL Puppet. Dalam instalasi kedua ini, kita akan membahas langkah-langkah serupa, tetapi sekarang dengan penyiapan Galera Cluster.

Galera Cluster dengan Wayang

Seperti yang Anda ketahui, Galera Cluster memiliki tiga penyedia utama:

  • MySQL Galera Cluster (Codership)
  • Kluster Percona XtraDB (Percona)
  • Cluster MariaDB (disematkan ke Server MariaDB oleh MariaDB)

Praktik umum dengan penerapan Galera Cluster adalah memiliki lapisan tambahan di atas cluster database untuk tujuan penyeimbangan beban. Namun, itu adalah proses kompleks yang layak mendapatkan postingannya sendiri.

Ada sejumlah modul Wayang tersedia di Wayang Forge yang dapat digunakan untuk menyebarkan Cluster Galera. Ini dia beberapa di antaranya..

  • puppetlabs/mysql - hanya MariaDB Galera
  • fraenki/galera - Percona XtraDB Cluster dan MySQL Galera dari Codership
  • edestecd/mariadb - Khusus MariaDB Cluster
  • filiadata/percona - Percona XtraDB Cluster

Karena tujuan kami adalah memberikan pemahaman dasar tentang cara menulis manifes dan mengotomatiskan penerapan untuk Galera Cluster, kami akan membahas penerapan MariaDB Galera Cluster menggunakan modul puppetlabs/mysql. Untuk modul lainnya, Anda selalu dapat melihat dokumentasi masing-masing untuk instruksi atau tips tentang cara menginstal.

Di Galera Cluster, pemesanan saat memulai node sangat penting. Untuk memulai cluster baru dengan benar, satu node harus disiapkan sebagai node referensi. Node ini akan dimulai dengan string koneksi host kosong (gcomm://) untuk menginisialisasi cluster. Proses ini disebut bootstrap.

Setelah dimulai, node akan menjadi komponen utama dan node yang tersisa dapat dimulai menggunakan perintah standar mysql start (systemctl start mysql atau layanan mysql mulai ) diikuti dengan string koneksi host lengkap (gcomm://db1,db2,db3). Bootstrap hanya diperlukan jika tidak ada komponen utama yang dipegang oleh node lain di cluster (periksa dengan wsrep_cluster_status status).

Proses startup cluster harus dilakukan secara eksplisit oleh pengguna. Manifes itu sendiri TIDAK boleh memulai cluster (bootstrap node apa pun) saat pertama kali dijalankan untuk menghindari risiko kehilangan data. Ingat, manifes Wayang harus ditulis se-idempoten mungkin. Manifes harus aman agar dapat dieksekusi beberapa kali tanpa memengaruhi instance MySQL yang sudah berjalan. Ini berarti kita harus fokus terutama pada konfigurasi repositori, instalasi paket, konfigurasi pra-jalan, dan konfigurasi pengguna SST.

Opsi konfigurasi berikut ini wajib untuk Galera:

  • wsrep_on :Bendera untuk mengaktifkan API replikasi writeset untuk Galera Cluster (khusus MariaDB).
  • wsrep_cluster_name :Nama klaster. Harus identik pada semua node yang merupakan bagian dari cluster yang sama.
  • wsrep_cluster_address :String koneksi komunikasi Galera, awalan dengan gcomm:// dan diikuti oleh daftar node, dipisahkan dengan koma. Daftar node kosong berarti inisialisasi cluster.
  • wsrep_provider :Jalur tempat perpustakaan Galera berada. Jalurnya mungkin berbeda tergantung pada sistem operasinya.
  • bind_address :MySQL harus dapat dijangkau secara eksternal sehingga nilai '0.0.0.0' adalah wajib.
  • wsrep_sst_method :Untuk MariaDB, metode SST yang disukai adalah mariabackup.
  • wsrep_sst_auth :Pengguna dan kata sandi MySQL (dipisahkan dengan titik dua) untuk melakukan transfer snapshot. Biasanya, kami menentukan pengguna yang memiliki kemampuan untuk membuat cadangan lengkap.
  • wsrep_node_address :Alamat IP untuk komunikasi dan replikasi Galera. Gunakan Puppet facter untuk memilih alamat IP yang benar.
  • wsrep_node_name :nama host FQDN. Gunakan Puppet facter untuk memilih nama host yang benar.

Untuk penerapan berbasis Debian, skrip pasca-instalasi akan mencoba memulai server MariaDB secara otomatis. Jika kita mengkonfigurasi wsrep_on=ON (tandai untuk mengaktifkan Galera) dengan alamat lengkap di wsrep_cluster_address variabel, server akan gagal selama instalasi. Ini karena tidak ada komponen utama untuk dihubungkan.

Untuk memulai cluster di Galera dengan benar, node pertama (disebut bootstrap node) harus dikonfigurasi dengan string koneksi kosong (wsrep_cluster_address =gcomm://) untuk memulai node sebagai komponen utama. Anda juga dapat menjalankan skrip bootstrap yang disediakan, yang disebut galera_new_cluster, yang pada dasarnya melakukan hal serupa di latar belakang.

Penerapan Galera Cluster (MariaDB)

Penerapan Galera Cluster memerlukan konfigurasi tambahan pada sumber APT untuk menginstal repositori versi MariaDB yang disukai.

Perhatikan bahwa replikasi Galera tertanam di dalam Server MariaDB dan tidak memerlukan paket tambahan untuk diinstal. Karena itu, tanda tambahan diperlukan untuk mengaktifkan Galera dengan menggunakan wsrep_on=ON. Tanpa tanda ini, MariaDB akan bertindak sebagai server mandiri.

Di lingkungan berbasis Debian kami, opsi wsrep_on hanya dapat ditampilkan dalam manifes setelah penerapan pertama selesai (seperti yang ditunjukkan lebih jauh dalam langkah penerapan). Ini untuk memastikan start awal pertama bertindak sebagai server mandiri bagi Puppet untuk menyediakan node sebelum benar-benar siap menjadi node Galera.

Mari kita mulai dengan menyiapkan konten manifes seperti di bawah ini (ubah bagian variabel global jika perlu):

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

Sedikit penjelasan diperlukan pada saat ini. 'wsrep_node_address' harus diarahkan ke alamat IP yang sama dengan yang dideklarasikan di wsrep_cluster_address. Dalam lingkungan ini, host kami memiliki dua antarmuka jaringan dan kami ingin menggunakan antarmuka kedua (disebut enp0s8) untuk komunikasi Galera (di mana jaringan 192.168.0.0/24 terhubung). Itu sebabnya kami menggunakan Puppet facter untuk mendapatkan informasi dari node dan menerapkannya ke opsi konfigurasi. Selebihnya cukup jelas.

Pada setiap node MariaDB, jalankan perintah berikut untuk menerapkan katalog sebagai pengguna root:

$ puppet agent -t

Katalog akan diterapkan ke setiap node untuk instalasi dan persiapan. Setelah selesai, kita harus menambahkan baris berikut ke dalam manifes kita di bawah bagian "override_options => mysqld":

      'wsrep_on'                 => 'ON',

Di atas akan memenuhi persyaratan Galera untuk MariaDB. Kemudian, terapkan katalog pada setiap node MariaDB sekali lagi:

$ puppet agent -t

Setelah selesai, kami siap untuk mem-bootstrap cluster kami. Karena ini adalah cluster baru, kita dapat memilih salah satu node untuk menjadi node referensi alias node bootstrap. Mari kita pilih db1.local (192.168.0.161) dan jalankan perintah berikut:

$ galera_new_cluster #db1

Setelah node pertama dimulai, kita dapat memulai node yang tersisa dengan perintah start standar (satu node pada satu waktu):

$ systemctl restart mariadb #db2 and db3

Setelah dimulai, intip log kesalahan MySQL di /var/log/mysql/error.log dan pastikan log berakhir dengan baris berikut:

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

Di atas memberitahu kita bahwa node disinkronkan dengan grup. Kami kemudian dapat memverifikasi status dengan menggunakan perintah berikut:

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

Pastikan pada semua node, wsrep_cluster_size , wsrep_cluster_status dan wsrep_local_state_comment masing-masing adalah 3, "Utama" dan "Tersinkron".

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

Kontrol Layanan

Cara teraman saat menyediakan Galera Cluster dengan Puppet adalah dengan menangani semua operasi kontrol layanan secara manual (jangan biarkan Puppet menanganinya). Untuk restart rolling cluster sederhana, perintah layanan standar akan dilakukan. Jalankan perintah berikut satu per satu.

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

Namun, jika terjadi partisi jaringan dan tidak ada komponen utama yang tersedia (periksa dengan wsrep_cluster_status ), node paling mutakhir harus di-bootstrap agar klaster kembali beroperasi tanpa kehilangan data. Anda dapat mengikuti langkah-langkah seperti yang ditunjukkan pada bagian penerapan di atas. Untuk mempelajari lebih lanjut tentang proses bootstrap dengan contoh skenario, kami telah membahas ini secara rinci dalam posting blog ini, Cara Bootstrap MySQL atau MariaDB Galera Cluster.

Sumber Daya Basis Data

Gunakan 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']
  } 

Definisi di atas dapat diberikan ke setiap node karena setiap node dalam Galera Cluster adalah master.

Cadangkan dan Pulihkan

Karena kami membuat pengguna SST menggunakan kelas xtrabackup, Wayang akan mengonfigurasi semua prasyarat untuk pekerjaan pencadangan - membuat pengguna cadangan, menyiapkan jalur tujuan, menetapkan kepemilikan dan izin, menyetel tugas cron dan menyiapkan opsi perintah pencadangan untuk digunakan dalam skrip cadangan yang disediakan. Setiap node akan dikonfigurasi dengan dua pekerjaan cadangan (satu untuk mingguan penuh dan satu lagi untuk tambahan harian) default ke 11:05 seperti yang Anda tahu dari output 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

Jika Anda ingin menjadwalkan mysqldump sebagai gantinya, gunakan 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'
  }

Di atas memberitahu Wayang untuk mengonfigurasi skrip cadangan di /usr/local/sbin/mysqlbackup.sh dan menjadwalkannya pada 11:30 setiap hari. Jika Anda ingin membuat cadangan segera, cukup panggil:

$ mysqlbackup.sh

Untuk 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.

Manajemen 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')
}
Panduan Manynines DevOps untuk Manajemen DatabasePelajari tentang apa yang perlu Anda ketahui untuk mengotomatisasi dan mengelola database open source AndaUnduh Gratis

Puppet vs ClusterControl

Tahukah Anda bahwa Anda juga dapat mengotomatiskan penerapan MySQL atau MariaDB Galera 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 Percona XtraDB Cluster tiga simpul (disediakan tanpa kata sandi untuk semua simpul yang telah dikonfigurasi sebelumnya):

$ 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
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 Database Automation dengan Puppet:Menyebarkan Replikasi MySQL &MariaDB

Selain itu, ClusterControl mendukung penerapan penyeimbang beban untuk Galera Cluster - HAproxy, ProxySQL, dan MariaDB MaxScale - bersama dengan alamat IP virtual (disediakan oleh Keepalive) untuk menghilangkan satu titik kegagalan untuk layanan database Anda.

Setelah penerapan, node/cluster dapat dipantau dan dikelola sepenuhnya oleh ClusterControl, termasuk deteksi kegagalan otomatis, pemulihan otomatis, manajemen pencadangan, manajemen penyeimbang beban, pemasangan slave asinkron, manajemen konfigurasi, dan sebagainya. Semua ini dibundel bersama dalam satu produk. Rata-rata, cluster database Anda akan aktif dan berjalan dalam waktu 30 menit. Yang dibutuhkan hanyalah SSH tanpa kata sandi ke node target.

Anda juga dapat mengimpor Galera Cluster yang sudah berjalan, yang digunakan oleh Wayang (atau cara lain apa pun) ke ClusterControl untuk melengkapi cluster Anda dengan semua fitur keren yang menyertainya. Edisi komunitas (gratis selamanya!) menawarkan penerapan dan pemantauan.

Di episode berikutnya, kami akan memandu Anda melalui penerapan penyeimbang beban MySQL menggunakan Wayang. 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. Bagaimana SUBSTRING_INDEX() Bekerja di MariaDB

  2. Menggunakan Replikasi Cluster Galera MySQL untuk Membuat Cluster Geo-Distributed:Bagian Satu

  3. Penerapan Multi-Cloud untuk Replikasi MariaDB Menggunakan WireGuard

  4. Memulai dengan ProxySQL - Tutorial Load Balancing MySQL &MariaDB

  5. 4 Cara Mendaftar Semua Tampilan di Database MariaDB