Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Cara Bootstrap MySQL atau MariaDB Galera Cluster - Diperbarui

Tidak seperti server MySQL standar dan MySQL Cluster, cara memulai MySQL/MariaDB Galera Cluster sedikit berbeda. Galera mengharuskan Anda untuk memulai sebuah node dalam sebuah cluster sebagai titik referensi, sebelum node yang tersisa dapat bergabung dan membentuk cluster. Proses ini dikenal sebagai cluster bootstrap. Bootstrap adalah langkah awal untuk memperkenalkan node database sebagai komponen utama, sebelum orang lain melihatnya sebagai titik referensi untuk menyinkronkan data.

Bagaimana Cara Kerjanya?

Ketika Galera memulai dengan perintah bootstrap pada sebuah node, node tersebut akan mencapai status Primer (periksa nilai wsrep_cluster_status). Node yang tersisa hanya akan membutuhkan perintah start normal dan mereka akan secara otomatis mencari Komponen Utama (PC) yang ada di dalam cluster dan bergabung untuk membentuk sebuah cluster. Sinkronisasi data kemudian terjadi melalui transfer status inkremental (IST) atau transfer status snapshot (SST) antara joiner dan donor.

Jadi pada dasarnya, Anda hanya perlu mem-bootstrap kluster jika Anda ingin memulai kluster baru atau ketika tidak ada node lain di kluster dalam status PRIMARY. Kehati-hatian harus dilakukan saat memilih tindakan yang akan diambil, jika tidak, Anda mungkin akan berakhir dengan kelompok yang terpecah atau kehilangan data.

Contoh skenario berikut mengilustrasikan kapan harus mem-bootstrap kluster tiga simpul berdasarkan status simpul (wsrep_local_state_comment) dan status kluster (wsrep_cluster_status):

Negara Bagian Galera Aliran Bootstrap
  1. Mulai ulang simpul INISIALISASI.
  1. Mulai ulang simpul INISIALISASI.
  2. Setelah selesai, mulai simpul baru.
  1. Bootstrap node tercanggih menggunakan “pc.bootstrap=1”.
  2. Mulai ulang node yang tersisa, satu node pada satu waktu.
  1. Mulai simpul baru.
  1. Mulai simpul baru, satu simpul pada satu waktu.
  1. Bootstrap simpul apa pun.
  2. Mulai node yang tersisa, satu node pada satu waktu.

Bagaimana Memulai Cluster Galera?

3 vendor Galera menggunakan perintah bootstrap yang berbeda (berdasarkan versi terbaru perangkat lunak). Pada simpul pertama, jalankan:

  • MySQL Galera Cluster (Codership):

    $ service mysql bootstrap # sysvinit
    $ galera_new_cluster # systemd
    $ mysqld_safe --wsrep-new-cluster # command line
  • Percona XtraDB Cluster (Percona):

    $ service mysql bootstrap-pxc # sysvinit
    $ systemctl start [email protected] # systemd
  • Klaster Galera MariaDB (MariaDB):

    $ service mysql bootstrap # sysvinit
    $ service mysql start --wsrep-new-cluster # sysvinit
    $ galera_new_cluster # systemd
    $ mysqld_safe --wsrep-new-cluster # command line

Perintah di atas hanyalah pembungkus dan yang sebenarnya dilakukannya adalah memulai instance MySQL pada node tersebut dengan gcomm:// sebagai variabel wsrep_cluster_address. Anda juga dapat secara manual menentukan variabel di dalam my.cnf dan menjalankan perintah start/restart standar. Namun, jangan lupa untuk mengubah kembali wsrep_cluster_address untuk memuat alamat ke semua node setelah start.

Saat node pertama aktif, jalankan perintah berikut pada node berikutnya:

$ service mysql start
$ systemctl start mysql

Node baru terhubung ke anggota cluster seperti yang didefinisikan oleh parameter wsrep_cluster_address. Sekarang akan secara otomatis mengambil peta cluster dan terhubung ke node lainnya dan membentuk sebuah cluster.

Peringatan:Jangan pernah melakukan bootstrap saat Anda ingin menghubungkan kembali sebuah node ke cluster yang ada, dan JANGAN PERNAH menjalankan bootstrap di lebih dari satu node.

Tanda Aman untuk Bootstrap

Galera yang dimulai dengan versi 3.19 hadir dengan flag baru bernama “safe_to_bootstrap” di dalam grastate.dat. Bendera ini memfasilitasi keputusan dan mencegah pilihan yang tidak aman dengan melacak urutan node dimatikan. Node yang terakhir dimatikan akan ditandai sebagai “Safe-to-Bootstrap”. Semua node lain akan ditandai sebagai tidak aman untuk bootstrap.

Melihat konten grastate.dat (default berada di bawah MySQL datadir) dan Anda akan melihat tanda pada baris terakhir:

# GALERA saved state
version: 2.1
uuid:    8bcf4a34-aedb-14e5-bcc3-d3e36277729f
seqno:   2575
safe_to_bootstrap: 0

Saat mem-bootstrap cluster baru, Galera akan menolak untuk memulai node pertama yang ditandai sebagai tidak aman untuk bootstrap. Anda akan melihat pesan berikut di log:

“Mungkin tidak aman untuk mem-bootstrap cluster dari node ini. Itu bukan yang terakhir meninggalkan cluster dan mungkin tidak berisi semua pembaruan.

Untuk memaksa cluster bootstrap dengan node ini, edit file grastate.dat secara manual dan setel safe_to_bootstrap ke 1 .”

Dalam kasus shutdown yang tidak bersih atau hard crash, semua node akan memiliki "safe_to_bootstrap:0", jadi kita harus berkonsultasi dengan mesin penyimpanan InnoDB untuk menentukan node mana yang telah melakukan transaksi terakhir di cluster. Ini dapat dicapai dengan memulai mysqld dengan variabel “--wsrep-recover” pada setiap node, yang menghasilkan output seperti ini:

$ mysqld --wsrep-recover
...
2016-11-18 01:42:15 36311 [Note] InnoDB: Database was not shutdown normally!
2016-11-18 01:42:15 36311 [Note] InnoDB: Starting crash recovery.
...
2016-11-18 01:42:16 36311 [Note] WSREP: Recovered position: 8bcf4a34-aedb-14e5-bcc3-d3e36277729f:114428
...

Nomor setelah string UUID pada baris "Posisi yang dipulihkan" adalah yang harus dicari. Pilih node yang memiliki angka tertinggi dan edit grastate.dat untuk mengatur “safe_to_bootstrap:1”, seperti yang ditunjukkan pada contoh di bawah ini:

# GALERA saved state
version: 2.1
uuid:    8bcf4a34-aedb-14e5-bcc3-d3e36277729f
seqno:   -1
safe_to_bootstrap: 1

Anda kemudian dapat melakukan perintah bootstrap standar pada node yang dipilih.

Bagaimana jika Node Telah Divergen?

Dalam keadaan tertentu, node dapat menyimpang satu sama lain. Status semua node dapat berubah menjadi Non-Primary karena pemisahan jaringan antar node, cluster crash, atau jika Galera menemukan pengecualian saat menentukan Komponen Utama. Anda kemudian harus memilih node dan mempromosikannya menjadi Komponen Utama.

Untuk menentukan node mana yang perlu di-bootstrap, bandingkan nilai wsrep_last_committed pada semua node DB:

node1> SHOW STATUS LIKE 'wsrep_%';
+----------------------+-------------+
| Variable_name        | Value       |
+----------------------+-------------+
| wsrep_last_committed | 10032       |
...
| wsrep_cluster_status | non-Primary |
+----------------------+-------------+
node2> SHOW STATUS LIKE 'wsrep_%';
+----------------------+-------------+
| Variable_name        | Value       |
+----------------------+-------------+
| wsrep_last_committed | 10348       |
...
| wsrep_cluster_status | non-Primary |
+----------------------+-------------+
node3> SHOW STATUS LIKE 'wsrep_%';
+----------------------+-------------+
| Variable_name        | Value       |
+----------------------+-------------+
| wsrep_last_committed |   997       |
...
| wsrep_cluster_status | non-Primary |
+----------------------+-------------+

Dari output di atas, node2 memiliki data terbaru. Dalam hal ini, semua node Galera sudah dimulai, jadi Anda tidak perlu mem-bootstrap cluster lagi. Kita hanya perlu mempromosikan node2 menjadi Komponen Utama:

node2> SET GLOBAL wsrep_provider_options="pc.bootstrap=1";

Node yang tersisa kemudian akan terhubung kembali ke Komponen Utama (node2) dan menyinkronkan ulang datanya berdasarkan node ini.

Jika Anda menggunakan ClusterControl (coba gratis), Anda dapat menentukan wsrep_last_committed dan wsrep_cluster_status langsung dari ClusterControl> Overview halaman:

Atau dari ClusterControl> Performance> DB Status halaman:


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MYSQL sum() untuk baris yang berbeda

  2. Bagaimana cara menyimpan Karakter Emoji di Database MySQL

  3. Bagaimana cara mengubah hasil SQL Query ke Struktur Data PANDAS?

  4. Bisakah kita menghubungkan database MySQL jarak jauh di Android menggunakan JDBC?

  5. Menyimpan nilai hash SHA1 di MySQL