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

MySQL InnoDB Cluster 8.0 - Panduan Penerapan Lengkap:Bagian Satu

MySQL InnoDB Cluster terdiri dari 3 komponen:

  • Replikasi Grup MySQL (sekelompok server database yang saling mereplikasi dengan toleransi kesalahan).
  • MySQL Router (router kueri ke node database yang sehat)
  • MySQL Shell (pembantu, klien, alat konfigurasi)

Di bagian pertama panduan ini, kita akan menerapkan MySQL InnoDB Cluster. Ada sejumlah tutorial langsung yang tersedia secara online tetapi panduan ini mencakup semua langkah/perintah yang diperlukan untuk menginstal dan menjalankan cluster di satu tempat. Kami akan membahas operasi pemantauan, pengelolaan, dan penskalaan serta beberapa gotcha saat menangani MySQL InnoDB Cluster di bagian kedua entri blog ini.

Diagram berikut mengilustrasikan arsitektur pasca penerapan kami:

Kami akan menerapkan total 4 node; Replikasi Grup MySQL tiga node dan satu node router MySQL terletak bersama di dalam server aplikasi. Semua server berjalan di Ubuntu 18.04 Bionic.

Menginstal MySQL

Langkah-langkah berikut harus dilakukan pada semua node database db1, db2 dan db3.

Pertama, kita harus melakukan pemetaan host. Ini sangat penting jika Anda ingin menggunakan nama host sebagai pengidentifikasi host di InnoDB Cluster dan ini adalah cara yang disarankan untuk dilakukan. Petakan semua host sebagai berikut di dalam /etc/hosts:

$ vi /etc/hosts
192.168.10.40   router apps
192.168.10.41   db1 db1.local
192.168.10.42   db2 db2.local
192.168.10.43   db3 db3.local
127.0.0.1       localhost localhost.localdomain

Hentikan dan nonaktifkan AppArmor:

$ service apparmor stop
$ service apparmor teardown
$ systemctl disable apparmor

Unduh repositori konfigurasi APT terbaru dari situs web repositori MySQL Ubuntu di https://repo.mysql.com/apt/ubuntu/pool/mysql-apt-config/m/mysql-apt-config/ . Pada saat penulisan ini, yang terbaru adalah tanggal 15-Okt-2019 yaitu mysql-apt-config_0.8.14-1_all.deb:

$ wget https://repo.mysql.com/apt/ubuntu/pool/mysql-apt-config/m/mysql-apt-config/mysql-apt-config_0.8.14-1_all.deb

Instal paket dan konfigurasikan untuk "mysql-8.0":

$ dpkg -i mysql-apt-config_0.8.14-1_all.deb

Instal kunci GPG:

$ apt-key adv --recv-keys --keyserver ha.pool.sks-keyservers.net 5072E1F5

Perbarui repolis:

$ apt-get update

Instal Python dan diikuti oleh server MySQL dan shell MySQL:

$ apt-get -y install mysql-server mysql-shell

Anda akan disajikan dengan wizard konfigurasi berikut:

  1. Setel kata sandi root - Tentukan kata sandi yang kuat untuk pengguna root MySQL.
  2. Setel metode autentikasi - Pilih "Gunakan Metode Otentikasi Lama (Pertahankan Kompatibilitas MySQL 5.x)"

MySQL seharusnya sudah diinstal pada saat ini. Verifikasi dengan:

$ systemctl status mysql

Pastikan Anda mendapatkan status "aktif (berjalan)".

Menyiapkan Server untuk Cluster InnoDB

Langkah-langkah berikut harus dilakukan pada semua node database db1, db2 dan db3.

Konfigurasi server MySQL untuk mendukung Group Replication. Cara termudah dan direkomendasikan untuk melakukannya adalah dengan menggunakan MySQL Shell baru:

$ mysqlsh

Otentikasi sebagai pengguna root lokal dan ikuti wizard konfigurasi yang sesuai seperti yang ditunjukkan pada contoh di bawah ini:

MySQL  JS > dba.configureLocalInstance("[email protected]:3306");

Setelah diautentikasi, Anda akan mendapatkan sejumlah pertanyaan seperti berikut:

Tanggapan atas pertanyaan tersebut dengan jawaban sebagai berikut:

  • Pilih 2 - Buat akun admin baru untuk klaster InnoDB dengan hibah minimal yang diperlukan
  • Nama Akun:[email protected]%
  • Kata sandi:mys3cret&&
  • Konfirmasi sandi:mys3cret&&
  • Apakah Anda ingin melakukan perubahan konfigurasi yang diperlukan?:y
  • Apakah Anda ingin memulai ulang instance setelah mengonfigurasinya?:y

Jangan lupa untuk mengulangi hal di atas pada semua node database. Pada titik ini, daemon MySQL harus mendengarkan semua alamat IP dan Replikasi Grup diaktifkan. Sekarang kita dapat melanjutkan untuk membuat cluster.

Membuat Cluster

Sekarang kita siap untuk membuat sebuah cluster. Di db1, hubungkan sebagai admin cluster dari MySQL Shell:

MySQL|JS> shell.connect('[email protected]:3306');
Creating a session to '[email protected]:3306'
Please provide the password for '[email protected]:3306': ***********
Save password for '[email protected]:3306'? [Y]es/[N]o/Ne[v]er (default No): Y
Fetching schema names for autocompletion... Press ^C to stop.
Your MySQL connection id is 9
Server version: 8.0.18 MySQL Community Server - GPL
No default schema selected; type \use <schema> to set one.
<ClassicSession:[email protected]:3306>

Anda harus terhubung sebagai [email protected] (Anda dapat mengetahuinya dengan melihat string prompt sebelum '>'). Sekarang kita dapat membuat cluster baru:

MySQL|db1:3306 ssl|JS> cluster = dba.createCluster('my_innodb_cluster');

Periksa status cluster:

MySQL|db1:3306 ssl|JS> cluster.status()
{
    "clusterName": "my_innodb_cluster",
    "defaultReplicaSet": {
        "name": "default",
        "primary": "db1:3306",
        "ssl": "REQUIRED",
        "status": "OK_NO_TOLERANCE",
        "statusText": "Cluster is NOT tolerant to any failures.",
        "topology": {
            "db1:3306": {
                "address": "db1:3306",
                "mode": "R/W",
                "readReplicas": {},
                "replicationLag": null,
                "role": "HA",
                "status": "ONLINE",
                "version": "8.0.18"
            }
        },
        "topologyMode": "Single-Primary"
    },
    "groupInformationSourceMember": "db1:3306"
}

Pada titik ini, hanya db1 yang merupakan bagian dari cluster. Mode topologi default adalah Single-Primary, mirip dengan konsep kumpulan replika di mana hanya satu node yang menjadi penulis pada satu waktu. Node yang tersisa di cluster akan menjadi pembaca.

Perhatikan status cluster yang bertuliskan OK_NO_TOLERANCE, dan penjelasan lebih lanjut di bawah kunci statusText. Dalam konsep set replika, satu node tidak akan memberikan toleransi kesalahan. Diperlukan minimal 3 node untuk mengotomatiskan failover node utama. Kami akan memeriksanya nanti.

Sekarang tambahkan simpul kedua, db2 dan terima metode pemulihan default, "Klon":

MySQL|db1:3306 ssl|JS> cluster.addInstance('[email protected]:3306');

Tangkapan layar berikut menunjukkan kemajuan inisialisasi db2 setelah kami menjalankan perintah di atas. Operasi sinkronisasi dilakukan secara otomatis oleh MySQL:

Periksa cluster dan status db2:

MySQL|db1:3306 ssl|JS> cluster.status()
{
    "clusterName": "my_innodb_cluster",
    "defaultReplicaSet": {
        "name": "default",
        "primary": "db1:3306",
        "ssl": "REQUIRED",
        "status": "OK_NO_TOLERANCE",
        "statusText": "Cluster is NOT tolerant to any failures.",
        "topology": {
            "db1:3306": {
                "address": "db1:3306",
                "mode": "R/W",
                "readReplicas": {},
                "replicationLag": null,
                "role": "HA",
                "status": "ONLINE",
                "version": "8.0.18"
            },
            "db2:3306": {
                "address": "db2:3306",
                "mode": "R/O",
                "readReplicas": {},
                "replicationLag": null,
                "role": "HA",
                "status": "ONLINE",
                "version": "8.0.18"
            }
        },
        "topologyMode": "Single-Primary"
    },
    "groupInformationSourceMember": "db1:3306"
}

Pada titik ini, kami memiliki dua node di cluster, db1 dan db2. Status masih menunjukkan OK_NO_TOLERANCE dengan penjelasan lebih lanjut di bawah nilai statusText. Seperti yang dinyatakan di atas, MySQL Group Replication membutuhkan setidaknya 3 node dalam sebuah cluster untuk toleransi kesalahan. Itu sebabnya kita harus menambahkan simpul ketiga seperti yang ditunjukkan selanjutnya.

Tambahkan simpul terakhir, db3 dan terima metode pemulihan default, "Klon" mirip dengan db2:

MySQL|db1:3306 ssl|JS> cluster.addInstance('[email protected]:3306');

Tangkapan layar berikut menunjukkan kemajuan inisialisasi db3 setelah kami menjalankan perintah di atas. Operasi sinkronisasi dilakukan secara otomatis oleh MySQL:

Periksa cluster dan status db3:

MySQL|db1:3306 ssl|JS> cluster.status()
{
    "clusterName": "my_innodb_cluster",
    "defaultReplicaSet": {
        "name": "default",
        "primary": "db1:3306",
        "ssl": "REQUIRED",
        "status": "OK",
        "statusText": "Cluster is ONLINE and can tolerate up to ONE failure.",
        "topology": {
            "db1:3306": {
                "address": "db1:3306",
                "mode": "R/W",
                "readReplicas": {},
                "replicationLag": null,
                "role": "HA",
                "status": "ONLINE",
                "version": "8.0.18"
            },
            "db2:3306": {
                "address": "db2:3306",
                "mode": "R/O",
                "readReplicas": {},
                "replicationLag": null,
                "role": "HA",
                "status": "ONLINE",
                "version": "8.0.18"
            },
            "db3:3306": {
                "address": "db3:3306",
                "mode": "R/O",
                "readReplicas": {},
                "replicationLag": null,
                "role": "HA",
                "status": "ONLINE",
                "version": "8.0.18"
            }
        },
        "topologyMode": "Single-Primary"
    },
    "groupInformationSourceMember": "db1:3306"
}

Sekarang cluster terlihat bagus, di mana statusnya OK dan cluster dapat mentolerir hingga satu node kegagalan pada satu waktu. Node utama adalah db1 di mana ia menunjukkan "primer":"db1:3306" dan "mode":"R/W", sementara node lain dalam status "R/O". Jika Anda memeriksa nilai read_only dan super_read_only pada node RO, keduanya ditampilkan sebagai true.

Penerapan Replikasi Grup MySQL kami sekarang telah selesai dan disinkronkan.

Menyebarkan Router

Pada server aplikasi yang akan kita jalankan aplikasinya, pastikan pemetaan host sudah benar:

$ vim /etc/hosts
192.168.10.40   router apps
192.168.10.41   db1 db1.local
192.168.10.42   db2 db2.local
192.168.10.43   db3 db3.local
127.0.0.1       localhost localhost.localdomain

Hentikan dan nonaktifkan AppArmor:

$ service apparmor stop
$ service apparmor teardown
$ systemctl disable apparmor

Kemudian instal paket repositori MySQL, seperti yang kita lakukan saat melakukan instalasi database:

$ wget https://repo.mysql.com/apt/ubuntu/pool/mysql-apt-config/m/mysql-apt-config/mysql-apt-config_0.8.14-1_all.deb
$ dpkg -i mysql-apt-config_0.8.14-1_all.deb

Tambahkan kunci GPG:

$ apt-key adv --recv-keys --keyserver ha.pool.sks-keyservers.net 5072E1F5

Perbarui daftar repo:

$ apt-get update

Instal router dan klien MySQL:

$ apt-get -y install mysql-router mysql-client

MySQL Router sekarang diinstal di bawah /usr/bin/mysqlrouter. Router MySQL menyediakan flag bootstrap untuk secara otomatis mengkonfigurasi operasi router dengan cluster MySQL InnoDB. Yang perlu kita lakukan adalah menentukan string URI ke salah satu node database sebagai pengguna admin cluster InnoDB (clusteradmin).

Untuk menyederhanakan konfigurasi, kita akan menjalankan proses mysqlrouter sebagai root user:

$ mysqlrouter --bootstrap [email protected]:3306 --directory myrouter --user=root

Inilah yang harus kita dapatkan setelah menentukan kata sandi untuk pengguna clusteradmin:

Perintah bootstrap akan membantu kita untuk membuat file konfigurasi router di /root/myrouter/mysqlrouter.conf. Sekarang kita dapat memulai daemon mysqlrouter dengan perintah berikut dari direktori saat ini:

$ myrouter/start.sh

Verifikasi apakah port yang diantisipasi mendengarkan dengan benar:

$ netstat -tulpn | grep mysql
tcp        0 0 0.0.0.0:6446            0.0.0.0:* LISTEN   14726/mysqlrouter
tcp        0 0 0.0.0.0:6447            0.0.0.0:* LISTEN   14726/mysqlrouter
tcp        0 0 0.0.0.0:64470           0.0.0.0:* LISTEN   14726/mysqlrouter
tcp        0 0 0.0.0.0:64460           0.0.0.0:* LISTEN   14726/mysqlrouter

Sekarang aplikasi kita dapat menggunakan port 6446 untuk read/write dan 6447 untuk koneksi MySQL read-only.

Menghubungkan ke Cluster

Mari kita buat pengguna database di node master. Pada db1, sambungkan ke server MySQL melalui shell MySQL:

$ mysqlsh [email protected]:3306

Beralih dari mode Javascript ke mode SQL:

MySQL|localhost:3306 ssl|JS> \sql

Switching to SQL mode... Commands end with ;

Buat basis data:

MySQL|localhost:3306 ssl|SQL> CREATE DATABASE sbtest;

Buat pengguna basis data:

MySQL|localhost:3306 ssl|SQL> CREATE USER [email protected]'%' IDENTIFIED BY 'password';

Berikan pengguna ke database:

MySQL|localhost:3306 ssl|SQL> GRANT ALL PRIVILEGES ON sbtest.* TO [email protected]'%';

Sekarang database dan pengguna kami sudah siap. Mari kita instal sysbench untuk menghasilkan beberapa data pengujian. Di server aplikasi, lakukan:

$ apt -y install sysbench mysql-client

Sekarang kita dapat menguji pada server aplikasi untuk terhubung ke server MySQL melalui router MySQL. Untuk koneksi tulis, sambungkan ke port 6446 dari host router:

$ mysql -usbtest -p -h192.168.10.40 -P6446 -e 'select user(), @@hostname, @@read_only, @@super_read_only'
+---------------+------------+-------------+-------------------+
| user()        | @@hostname | @@read_only | @@super_read_only |
+---------------+------------+-------------+-------------------+
| [email protected] | db1        | 0           | 0                 |
+---------------+------------+-------------+-------------------+

Untuk koneksi hanya baca, sambungkan ke port 6447 dari host router:

$ mysql -usbtest -p -h192.168.10.40 -P6447 -e 'select user(), @@hostname, @@read_only, @@super_read_only'
+---------------+------------+-------------+-------------------+
| user()        | @@hostname | @@read_only | @@super_read_only |
+---------------+------------+-------------+-------------------+
| [email protected] | db3        | 1           | 1                 |
+---------------+------------+-------------+-------------------+

Kelihatan bagus. Kami sekarang dapat menghasilkan beberapa data uji dengan sysbench. Di server aplikasi, buat 20 tabel dengan 100.000 baris per tabel dengan menghubungkan ke port 6446 server aplikasi:

$ sysbench \
/usr/share/sysbench/oltp_common.lua \
--db-driver=mysql \
--mysql-user=sbtest \
--mysql-db=sbtest \
--mysql-password=password \
--mysql-port=6446 \
--mysql-host=192.168.10.40 \
--tables=20 \
--table-size=100000 \
prepare

Untuk melakukan tes baca-tulis sederhana pada port 6446 selama 300 detik, jalankan:

$ sysbench \
/usr/share/sysbench/oltp_read_write.lua \
--report-interval=2 \
--threads=8 \
--time=300 \
--db-driver=mysql \
--mysql-host=192.168.10.40 \
--mysql-port=6446 \
--mysql-user=sbtest \
--mysql-db=sbtest \
--mysql-password=password \
--tables=20 \
--table-size=100000 \
run

Untuk beban kerja hanya-baca, kami dapat mengirim koneksi MySQL ke port 6447:

$ sysbench \
/usr/share/sysbench/oltp_read_only.lua \
--report-interval=2 \
--threads=1 \
--time=300 \
--db-driver=mysql \
--mysql-host=192.168.10.40 \
--mysql-port=6447 \
--mysql-user=sbtest \
--mysql-db=sbtest \
--mysql-password=password \
--tables=20 \
--table-size=100000 \
run

Kesimpulan

Itu dia. Pengaturan MySQL InnoDB Cluster kami sekarang lengkap dengan semua komponennya berjalan dan diuji. Di bagian kedua, kita akan melihat pengelolaan, pemantauan dan penskalaan operasi cluster serta solusi untuk sejumlah masalah umum saat berhadapan dengan MySQL InnoDB Cluster. 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. Dapatkan jumlah catatan untuk semua tabel di database MySQL

  2. SEKARANG () Contoh – MySQL

  3. MySQL, Dapatkan peringkat pengguna

  4. ROW_NUMBER di SQL – Pilih Contoh Teratas di SQL dan SQL Server

  5. Fungsi MySQL LOG10() – Mengembalikan Logaritma Basis-10 dari suatu Nilai