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

Bermigrasi dari replikasi tradisional ke GTID

Dalam artikel ini, kita akan membahas migrasi dari replikasi tradisional ke GTID,

kita akan membahas bagaimana melakukannya secara online sepenuhnya. Pertama, mari kita bahas beberapa opsi konfigurasi terkait GTID. Mode GTID menentukan bahwa server menggunakan GTID atau tidak, ini tidak hanya memengaruhi login biner replikasi juga karena log biner akan memiliki GTID di dalamnya. Opsi penegakan konsistensi GTID memastikan bahwa server hanya mengizinkan pernyataan yang aman untuk dieksekusi dalam mode GTID. Pernyataan-pernyataan yang tidak aman untuk dieksekusi seperti create table as select, ada beberapa lagi kebanyakan di sekitar, hingga gtid_owned yang berharga mereka dapat memantau GTID pada transaksi dalam penerbangan. Ini sangat berguna saat mereka mematikan GTID secara online.

Mari kita bahas beberapa dan tepatnya itu hanya satu variabel status terkait GTID. ONGOING_ANONYMOUS_TRANSACTION_ COUNT adalah rekanan dari GTID yang dimiliki tetapi dalam kasus migrasi seperti tentang ONGOING_ANONYMOUS_TRANSACTION_COUNT, Disebut transaksi anonim karena tidak memiliki pengenal yang merupakan GTID.

Semua operasi perlu dilakukan pada salah satu node dalam topologi replikasi dan akhirnya pada semua node. Praktik terbaik adalah melakukan slave terlebih dahulu dan master, tetapi dalam kasus banyak operasi, urutannya tidak terlalu penting selama itu dilakukan pada setiap contoh topologi replikasi.

Di lingkungan ini, saya memiliki tiga mesin virtual, dua di antaranya adalah database dan salah satunya adalah mesin sysbench untuk menghasilkan lalu lintas, jadi mari kita mulai.

Guru:192.168.66.5

Budak:  192.168.66.7

Pada node sysbench mari kita jalankan perintah yang sudah disiapkan untuk membuat database sysbench, Anda tinggal copy-paste dari bawah.

sysbench \
--db-driver=mysql \
--mysql-user=sbtest_user \
--mysql_password= password \
--mysql-db=sbtest \
--mysql-host=192.168.66.5 \
--mysql-port=3306 \
--tables=16 \
--table-size=10000 \
/usr/share/sysbench/oltp_read_write.lua prepare

Pada node sysbench menjalankan beberapa beban kerja terhadap master yang kami jalankan selama durasi tugas.

sysbench \
--db-driver=mysql \
--mysql-user=sbtest_user \
--mysql_password=password \
--mysql-db=sbtest \
--mysql-host=192.168.66.5 \
--mysql-port=3306 \
--tables=16 \
--table-size=10000 \
--threads=4 \
--time=0 \
--events=0 \
--rate=10 \
--report-interval=1 \
/usr/share/sysbench/oltp_read_write.lua run

Mari kita mulai klien MySQL di semua node, semua node database. Mari kita periksa daftar proses pertunjukan pada master sehingga Anda dapat melihat ini sedang berjalan di sini.

mysql> show processlist;
+----+-----------------+--------------------+--------+-------------+------+---------------------------------------------------------------+------------------+
| Id | User            | Host               | db     | Command     | Time | State                                                         | Info             |
+----+-----------------+--------------------+--------+-------------+------+---------------------------------------------------------------+------------------+
|  5 | event_scheduler | localhost          | NULL   | Daemon      | 2350 | Waiting on empty queue                                        | NULL             |
|  8 | root            | localhost          | sbtest | Query       |    0 | starting                                                      | show processlist |
| 15 | syncstndby      | 192.168.66.7:47894 | NULL   | Binlog Dump |  156 | Master has sent all binlog to slave; waiting for more updates | NULL             |
| 17 | sbtest_user     | 192.168.66.6:38130 | sbtest | Sleep       |    0 |                                                               | NULL             |
| 18 | sbtest_user     | 192.168.66.6:38132 | sbtest | Sleep       |    1 |                                                               | NULL             |
| 19 | sbtest_user     | 192.168.66.6:38134 | sbtest | Sleep       |    0 |                                                               | NULL             |
| 20 | sbtest_user     | 192.168.66.6:38136 | sbtest | Sleep       |    0 |                                                               | NULL             |
+----+-----------------+--------------------+--------+-------------+------+---------------------------------------------------------------+------------------+
7 rows in set (0.00 sec)

Oke mulai sekarang kita kerja sama salep dulu dan masternya.

Jadi pertama-tama kita akan mengatur force_gtid_consistency ='peringatkan' pada slave, menjadi slave master.

Budak 192.168.66.7

set global enforce_gtid_consistency = 'warn';

Kuasai 192.168.66.5

set global enforce_gtid_consistency = 'warn';

kita selesai di sini dan kita akan memeriksa kesalahan MySQL lihat log kesalahan ini seharusnya baik-baik saja; Anda tidak akan melihat kesalahan apa pun di log kesalahan. Langkah selanjutnya adalah menjalankan set global force_gtid_consistency='on' di mana-mana, lalu centang tanda panah lagi.

Budak 192.168.66.7

set global enforce_gtid_consistency='on';

Kuasai 192.168.66.5

set global enforce_gtid_consistency='on';

Jadi, langkah selanjutnya adalah menyetel global gtid_mode='off_permissive'; jadi sekali lagi saya akan memulai klien MySQL dan mengaturnya. Dan kemudian kami memeriksa log kesalahan

Budak 192.168.66.7

set global gtid_mode='off_permissive';

Kuasai  192.168.66.5

set global gtid_mode='off_permissive';

Di setiap server kita akan mengatur gtid_mode='on_permissive'; sehingga kami menghasilkan transaksi GTID pada saat ini.

Budak 192.168.66.7

set global gtid_mode='on_permissive';

Kuasai  192.168.66.5

set global gtid_mode='on_permissive';

Jadi, sudah diatur di mana-mana. Mari kita periksa log kesalahan

Baiklah, jadi sekarang kita akan memeriksa apakah ada node yang memiliki transaksi anonim yang sedang berlangsung karena jika sudah, saat kita menyetel gtid_mode='on', server tidak lagi menerima transaksi anonim dan kita akan mendapatkan kesalahan.

Budak 192.168.66.7

mysql> show status like 'ongoing_anonymous_transaction_count';
+-------------------------------------+-------+
| Variable_name                       | Value |
+-------------------------------------+-------+
| Ongoing_anonymous_transaction_count | 0     |
+-------------------------------------+-------+
1 row in set (0.22 sec)

Kuasai 192.168.66.5

mysql> show status like 'ongoing_anonymous_transaction_count';
+-------------------------------------+-------+
| Variable_name                       | Value |
+-------------------------------------+-------+
| Ongoing_anonymous_transaction_count | 0     |
+-------------------------------------+-------+
1 row in set (0.04 sec)

Jadi kedua server tidak memiliki yang berarti kami siap untuk mengaktifkan GTID. Saya akan mengaktifkan gtid_mode =on.

Kuasai 192.168.66.5

mysql> set global gtid_mode='on';

Query OK, 0 rows affected (0.03 sec)

Budak 192.168.66.7

mysql> set global gtid_mode='on';

Query OK, 0 rows affected (0.03 sec)

Sekarang pada slave, kita perlu menginisialisasi ulang replikasi untuk menggunakan master-auto-position=1

Budak 192.168.66.7

stop slave;
change master to master_auto_position=1;
start slave;

Jadi, apa fungsinya, "change master" ini di sini, jika utas salep sudah dikonfigurasikan maka jika beberapa parameter tidak disentuh oleh perintah master ubah, itu hanya akan dibiarkan pada nilai saat ini.

Mari kita periksa tampilkan status budak pada budak dan tampilkan status master pada master. semuanya saya harus berjalan dengan baik.

mysql> show salve status\G;

mysql> show master status;

Sekarang migrasi selesai:

Seperti yang kita ketahui tidak ada upgrade yang berhasil jika Anda tidak memiliki rencana rollback, untuk melakukan roll back silahkan klik link di bawah ini untuk membaca artikel selanjutnya.

Kembali ke Replikasi Tradisional Dari GTID


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ASCII() Contoh – MySQL

  2. Tanda hubung dalam nama kolom di MySQL DB

  3. Cara Menemukan Catatan Duplikat di MySQL

  4. Menggunakan Fungsi Agregat (SUM, AVG, MAX, MIN, COUNT, DISTINCT) di MySQL

  5. Escape string Python untuk MySQL