Membangun InnoDB cluster dari mysql 5.7 pada centos 7

Halo semuanya!

Setelah tugas muncul di pekerjaan - tampaknya ada tes innoDB cluster yang dikonfigurasi pada beberapa mesin virtual dengan centos 7.5, Anda perlu mempelajarinya dan menambahkan beberapa node lagi. Anda dapat merusak dan mengejek sesuka Anda. Kedengarannya menggoda.

Sebelum itu, saya tidak punya pengalaman dengan cluster seperti itu, tetapi Google untuk membantu.
Dengan beberapa pengecualian, semua tautan di dalamnya dan di Yandex ada di dev.mysql.com, atau di artikel tentang Habr ini . Sepertinya sekelompok dua node telah dikonfigurasi di atasnya.

Yah, saya membaca artikel itu, saya agak terkejut dengan kompleksitas menambahkan node dan kurangnya banyak detail, tapi oh well. Dengan dosa, saya menambahkan setengah simpul baru (beberapa perintah tidak berguna, beberapa umumnya merusak semuanya), setelah itu saya mulai bereksperimen dengan me-restart node, dll.

Setelah beberapa pendekatan dan kematian sel saraf yang tak terhitung jumlahnya, gugus itu tidak tahan. Satu node tidak ingin ditambahkan dalam kondisi apa pun, yang lain menutup ketika mencoba akses ke database, yang ketiga berpura-pura bahwa semuanya sudah beres. Saya harus menembak dan mulai dari awal.

Saat membuat cluster baru, sayangnya, banyak masalah dan ketidakkonsistenan muncul. Mungkin intinya ada di versi perangkat lunak, saya mencoba mysql 5.7. Mungkin dalam distribusinya. Akibatnya, saya menghentikan upaya sembrono untuk melakukan segalanya pada selembar kertas dan mulai memasangnya dengan mengetik. Dan google.

Beberapa malam dan malam yang menyenangkan dan gugus berkumpul dan bahkan menolak untuk hancur.
Pada saat yang sama, metode pembuatannya terasa berbeda dari upaya sebelumnya dan saya ingin membaginya, karena Di Internet, saya tidak menemukan petunjuk terperinci yang relevan lainnya yang dapat dipahami untuk mengatur kluster inndoDB.

Jadi, kami memiliki tiga mesin virtual identik dengan Centos 7.5 minimal 1804 yang baru diinstal dan selinux dan firewalld dinonaktifkan:

1.1.1.1
1.1.1.2
1.1.1.3

Untuk pekerjaan, saya menggunakan mysql 5.7, jadi kami menggunakannya. Mari kita mulai dengan 1.1.1.1:

1. Instal repositori mysql-community:

rpm -i https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm 

Matikan repositori untuk 8, nyalakan untuk 5.7 dan periksa - jika semuanya baik-baik saja, kemudian instal mysql:

 yum install yum-utils yum-config-manager --disable mysql80-community yum-config-manager --enable mysql57-community yum repolist yum install mysql-community-server mysql-shell 

2. Kami membawa /etc/my.cnf ke formulir ini:

 [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock symbolic-links=0 log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid bind-address=0.0.0.0 port=3301 # Replication part server_id=1 gtid_mode=ON enforce_gtid_consistency=ON master_info_repository=TABLE relay_log_info_repository=TABLE binlog_checksum=NONE log_slave_updates=ON log_bin=binlog binlog_format=ROW plugin-load = group_replication.so # Group replication part transaction_write_set_extraction=XXHASH64 loose-group_replication_start_on_boot = OFF loose-group_replication_local_address = 1.1.1.1:33011 loose-group_replication_bootstrap_group = OFF report_port = 3301 report_host = 1.1.1.1 

Di sini 3301 adalah port di mana mysql akan mendengarkan, dan 33011 adalah port di mana node berkomunikasi satu sama lain.

3. Luncurkan mysql dan lakukan konfigurasi pendahuluan:

 systemctl start mysqld grep 'password' /var/log/mysqld.log mysql_secure_installation 

4. Nah, buat cluster, serta pengguna terpisah untuk mengelolanya. Jika Anda tahu alamat IP dari node tersebut di muka, maka Anda dapat segera mendaftarkannya di ipWhitelist. Kami akan berpura-pura bahwa kami belum tahu tentang 1.1.1.2. dan 1.1.1.3:

 mysqlsh > \c 127.0.0.1:3301 > dba.configureLocalInstance("127.0.0.1:3301", {mycnfPath: "/etc/my.cnf", clusterAdmin: "cladmin", clusterAdminPassword: "SomePassword!123"}) > \c cladmin@1.1.1.1:3301 > dba.checkInstanceConfiguration() > cl=dba.createCluster('TestCluster', {ipWhitelist: '1.1.1.1'}) > dba.configureLocalInstance() > cl.status() 

Selesai! cl.status harus menampilkan sesuatu seperti ini:

 { "clusterName": "TestCluster", "defaultReplicaSet": { "name": "default", "primary": "1.1.1.1:3301", "ssl": "REQUIRED", "status": "OK_NO_TOLERANCE", "statusText": "Cluster is NOT tolerant to any failures.", "topology": { "1.1.1.1:3301": { "address": "1.1.1.1:3301", "mode": "R/W", "readReplicas": {}, "role": "HA", "status": "ONLINE" } } }, "groupInformationSourceMember": "mysql://cladmin@1.1.1.1:3301" } 

Saat mengubah cluster, Anda perlu menjalankan perintah dba.configureLocalInstance () secara lokal di semua node untuk menyimpan perubahan:

 WARNING: On instance '1.1.1.1:3301' membership change cannot be persisted since MySQL version 5.7.23 does not support the SET PERSIST command (MySQL version >= 8.0.11 required). Please use the <Dba>.configureLocalInstance command locally to persist the changes. 

Karena kami akan menambahkan beberapa node lagi, kami tidak menutup koneksi dengan server 1.1.1.1, itu akan berguna bagi kami.

Sekarang mari kita coba menambahkan node 1.1.1.2 ke cluster. Untuk melakukan ini, kami menjalankan semua perintah yang sama hingga 3 langkah inklusif, tidak lupa mengubah server_id, loose-group_replication_local_address, dan report_host.

4. Kami mengeksekusi pada 1.1.1.2:

 mysql -p > set GLOBAL group_replication_allow_local_disjoint_gtids_join=ON; 

Saya mencoba untuk mengatur variabel ini melalui mysqlsh, beralih ke mode sql, tetapi tindakan di sana tidak mempengaruhinya di mysql. Selanjutnya:

 mysqlsh > \c 127.0.0.1:3301 > dba.configureLocalInstance("127.0.0.1:3301", {mycnfPath: "/etc/my.cnf", clusterAdmin: "cladmin", clusterAdminPassword: "SomePassword!123"}) > \c cladmin@1.1.1.2:3301 > dba.checkInstanceConfiguration() 


5. Kembali ke simpul pertama 1.1.1.1. Jika Anda menutup koneksi, maka Anda dapat dengan cepat terhubung ke cluster seperti ini:

 mysqlsh --uri cladmin@1.1.1.1:3301 --cluster > \sql > STOP GROUP_REPLICATION; > SET GLOBAL group_replication_ip_whitelist="1.1.1.1,1.1.1.2"; > START GROUP_REPLICATION; > \js > cluster.addInstance('cladmin@1.1.1.2:3301', {ipWhitelist: '1.1.1.1,1.1.1.2'}) > cluster.status() 

Untuk beberapa alasan, ketika menambahkan node tanpa opsi ipWhitelist, itu tidak secara otomatis dikirim ke sana, jadi kami tentukan secara manual.
Jika daftar putih Anda awalnya dikonfigurasi untuk semua node atau subnet, maka perintah dalam mode sql dapat dilewati.

Jangan lupa untuk mengeksekusi dba.configureLocalInstance () pada semua node untuk menyimpan konfigurasi.

Cluster dua node mereka ternyata:

 { "clusterName": "TestCluster", "defaultReplicaSet": { "name": "default", "primary": "1.1.1.1:3301", "ssl": "REQUIRED", "status": "OK_NO_TOLERANCE", "statusText": "Cluster is NOT tolerant to any failures.", "topology": { "1.1.1.1:3301": { "address": "1.1.1.1:3301", "mode": "R/W", "readReplicas": {}, "role": "HA", "status": "ONLINE" }, "1.1.1.2:3301": { "address": "1.1.1.2:3301", "mode": "R/O", "readReplicas": {}, "role": "HA", "status": "ONLINE" } } }, "groupInformationSourceMember": "mysql://cladmin@1.1.1.1:3301" } 

Yah, ada sekelompok dua node, tetapi dalam "Cluster TIDAK toleran terhadap kegagalan." Mode
Tambahkan yang ketiga, algoritma pada dasarnya sama dengan menambahkan yang kedua.

Jika Anda lagi perlu mengubah daftar putih, maka Anda perlu menjalankan perintah pada r / w node, karena pada r / o node sepertinya tidak mengarah ke apa pun. Dalam hal ini, r / o node akan jatuh dan mereka harus dihubungkan kembali, secara bersamaan melaporkan daftar putih baru.
Dalam kasus kami:

 > cluster.rejoinInstance('cladmin@1.1.1.2:3301', {ipWhitelist: '1.1.1.1,1.1.1.2,1.1.1.3'}) 

Nah, sekali lagi, jangan lupa untuk mengeksekusi dba.configureLocalInstance () pada semua node untuk menyimpan konfigurasi.

Sekelompok tiga node terlihat seperti ini:

 { "clusterName": "TestCluster", "defaultReplicaSet": { "name": "default", "primary": "1.1.1.1:3301", "ssl": "REQUIRED", "status": "OK", "statusText": "Cluster is ONLINE and can tolerate up to ONE failure.", "topology": { "1.1.1.1:3301": { "address": "1.1.1.1:3301", "mode": "R/W", "readReplicas": {}, "role": "HA", "status": "ONLINE" }, "1.1.1.2:3301": { "address": "1.1.1.2:3301", "mode": "R/O", "readReplicas": {}, "role": "HA", "status": "ONLINE" }, "1.1.1.3:3301": { "address": "1.1.1.3:3301", "mode": "R/O", "readReplicas": {}, "role": "HA", "status": "ONLINE" } } }, "groupInformationSourceMember": "mysql://cladmin@1.1.1.1:3301" } 

Jika cluster telah runtuh ke keadaan satu node, itu harus dimulai dengan longgar-group_replication_bootstrap_group = parameter ON di /etc/my.cnf
Setelah memulai, parameter perlu dimatikan lagi, jika tidak, node ini akan selalu dipisahkan dari cluster dan mempertahankannya sendiri.

Menginstal mysql-router dijelaskan dengan baik di sini , jadi saya tidak melihat adanya arti dalam menggandakan.

Itu saja, itu saja, saya harap seseorang akan menemukan pengalaman saya bermanfaat.

Terima kasih atas perhatian anda

Source: https://habr.com/ru/post/id423587/


All Articles