Penguasaan lengkap seni bina replikasi MySQL

WBOY
Lepaskan: 2022-04-06 20:16:02
ke hadapan
2098 orang telah melayarinya

Artikel ini membawa anda pengetahuan yang berkaitan tentang mysql, yang terutamanya memperkenalkan isu yang berkaitan dengan seni bina replikasi, termasuk seni bina replikasi tuan-hamba, seni bina replikasi lata dan replikasi berbilang tuan-hamba seni bina, dsb., saya harap ia akan membantu semua orang.

Penguasaan lengkap seni bina replikasi MySQL

Pembelajaran yang disyorkan: tutorial video mysql

Seni bina replikasi satu tuan dan berbilang hamba

Dalam senario aplikasi sebenar , Lebih daripada 90% replikasi MySQL ialah model seni bina di mana satu Master mereplikasi kepada satu atau lebih Hamba.

Dalam senario di mana tekanan permintaan baca perpustakaan utama sangat tinggi, anda boleh mengkonfigurasi seni bina replikasi berbilang hamba satu induk untuk mencapai pemisahan baca-tulis dan memisahkan sejumlah besar data yang tidak mempunyai keperluan masa nyata yang sangat tinggi diedarkan kepada berbilang perpustakaan hamba melalui pengimbangan beban (permintaan baca dengan keperluan masa nyata yang tinggi boleh dibaca dari perpustakaan induk), mengurangkan tekanan bacaan pada perpustakaan induk. , seperti yang ditunjukkan dalam rajah di bawah.

Penguasaan lengkap seni bina replikasi MySQL

Kelemahan:

  • Induk tidak boleh ditutup, dan ia tidak boleh menerima permintaan tulis apabila ia ditutup
  • Akan ada kelewatan jika terlalu ramai hamba

Oleh kerana tuan perlu ditutup untuk penyelenggaraan rutin, adalah perlu untuk menukar hamba kepada tuan yang mana satu untuk dipilih?

Apabila hamba menjadi tuan, akan terdapat ketidakkonsistenan antara data tuan semasa dan tuan sebelumnya, dan tuan sebelumnya tidak menyimpan fail binlog dan lokasi pos nod tuan semasa.

Seni bina replikasi berbilang induk

Seni bina replikasi berbilang induk menyelesaikan masalah satu titik kegagalan induk dalam seni bina replikasi berbilang hamba induk tunggal.

Penguasaan lengkap seni bina replikasi MySQL

Anda boleh menggunakan alat pihak ketiga, seperti keepalived, untuk mencapai drift IP dengan mudah, supaya penyelenggaraan penutupan induk tidak akan menjejaskan operasi tulis.

Seni bina replikasi bertingkat

Satu tuan dan banyak hamba, tekanan I/O dan tekanan rangkaian perpustakaan induk akan meningkat dengan peningkatan perpustakaan hamba, kerana. setiap Pustaka hamba akan mempunyai benang Dump BINLOG bebas pada perpustakaan induk untuk menghantar acara, dan seni bina replikasi lata menyelesaikan tekanan I/O dan rangkaian tambahan pada perpustakaan induk dalam master-multiple-slave senario.

Seperti yang ditunjukkan dalam gambar di bawah.

Penguasaan lengkap seni bina replikasi MySQL

Berbanding dengan seni bina satu induk-berbilang-hamba, replikasi lata hanya menyalin daripada pangkalan data induk kepada sebilangan kecil pangkalan data hamba dan pangkalan data hamba lain disalin daripada sebilangan kecil pangkalan data hamba ini Salin data, dengan itu mengurangkan tekanan pada Master pangkalan data utama.

Sudah tentu, terdapat juga kelemahan: Replikasi tradisional MySQL adalah tidak segerak Dalam senario replikasi lata, data dalam pangkalan data induk perlu menjalani dua replikasi sebelum mencapai pangkalan data hamba yang lain dengan senario replikasi satu induk dan berbilang hamba Ia adalah masalah besar jika ia hanya melalui satu salinan pada masa akan datang.

Anda boleh mengurangkan kependaman replikasi lata dengan memilih enjin meja sebagai LUBANG HITAM pada hamba sekunder. Seperti namanya, enjin BLACKHOLE ialah enjin "lubang hitam" Data yang ditulis pada jadual BLACKHOLE tidak akan ditulis pada cakera Jadual BLACKHOLE sentiasa merupakan jadual kosong, hanya merekodkan peristiwa dalam BINLOG.

Berikut menunjukkan enjin BLACKHOLE:

mysql> CREATE TABLE `user` (
    -> `id` int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> `name` varchar(255) NOT NULL DEFAULT '',
    -> `age` tinyint unsigned NOT NULL DEFAULT 0
    -> )ENGINE=BLACKHOLE charset=utf8mb4;Query OK, 0 rows affected (0.00 sec)mysql> INSERT INTO `user` (`name`,`age`) values("itbsl", "26");Query OK, 1 row affected (0.00 sec)mysql> select * from user;Empty set (0.00 sec)
Salin selepas log masuk

Seperti yang anda lihat, tiada data dalam jadual pengguna yang enjin storannya ialah BLACKHOLE.

Seni bina gabungan berbilang induk dan replikasi lata

Gabungan seni bina replikasi berbilang induk dan lata, ini menyelesaikan masalah induk satu titik dan menyelesaikan masalah kelewatan lata hamba.

Penguasaan lengkap seni bina replikasi MySQL

Membina seni bina replikasi berbilang induk

Perancangan hos:

  • master1: docker, port 3314
  • master2: docker, port 3315

master1 configuration

Configuration file my.cnf:

$ cat /home/mysql/docker-data/3315/conf/my.cnf
[mysqld]
character_set_server=utf8
init_connect='SET NAMES utf8'

symbolic-links=0

lower_case_table_names=1
server-id=1403314
log-bin=mysql-bin
binlog-format=ROW
auto_increment_increment=2 # 几个主库,这里就配几
auto_increment_offset=1 # 每个主库的偏移量需要不一致
gtid_mode=ON
enforce-gtid-consistency=true
binlog-do-db=order      # 要同步的数据库
Salin selepas log masuk

Mulakan docker:

$ docker run --name mysql3314 -p 3314:3306 --privileged=true -ti -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=order -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -v /home/mysql/docker-data/3314/conf:/etc/mysql/conf.d -v /home/mysql/docker-data/3314/data/:/var/lib/mysql -v /home/mysql/docker-data/3314/logs/:/var/log/mysql -d mysql:5.7
Salin selepas log masuk

Tambah pengguna untuk replikasi dan kebenaran:

mysql> GRANT REPLICATION SLAVE,FILE,REPLICATION CLIENT ON *.* TO 'repluser'@'%' IDENTIFIED BY '123456';
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)
Salin selepas log masuk

Dayakan penyegerakan master1 (pengguna di sini berasal daripada master2):

mysql> change master to master_host='172.23.252.98',master_port=3315,master_user='repluser',master_password='123456',master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.03 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
Salin selepas log masuk

konfigurasi master2

master2 The konfigurasi adalah serupa dengan master1.

Perbezaan utama ialah terdapat atribut dalam my.cnf yang perlu tidak konsisten:

auto_increment_offset=2 # 每个主库的偏移量需要不一致
Salin selepas log masuk

Ujian:

Buat jadual dalam master2 dan tambah data :

mysql> create table t_order(id int primary key auto_increment, name varchar(20));
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t_order(name) values("A");
Query OK, 1 row affected (0.01 sec)

mysql> insert into t_order(name) values("B");
Query OK, 1 row affected (0.00 sec)

mysql> select * from t_order;
+----+------+
| id | name |
+----+------+
|  2 | A    |
|  4 | B    |
+----+------+
2 rows in set (0.00 sec)
Salin selepas log masuk

Anda boleh mendapati bahawa saiz langkah id dalam master2 ialah 2, dan ia mula meningkat daripada 2.

Kemudian tanya data dalam master1 dan tambah:

mysql> select * from t_order;
+----+------+
| id | name |
+----+------+
|  2 | A    |
|  4 | B    |
+----+------+
2 rows in set (0.00 sec)

mysql> insert into t_order(name) values("E");
Query OK, 1 row affected (0.00 sec)

mysql> select * from t_order;
+----+------+
| id | name |
+----+------+
|  2 | A    |
|  4 | B    |
|  5 | E    |
+----+------+
3 rows in set (0.00 sec)
Salin selepas log masuk

Anda boleh mendapati bahawa saiz langkah id dalam master1 ialah 2, dan ia mula meningkat daripada 1. Kemudian tanya dalam master2 dan anda boleh mencari id Data 5 menunjukkan bahawa tiada masalah dengan konfigurasi replikasi master-master.

Mengapakah offset kenaikan id dalam dua induk tidak konsisten? Apabila kedua-dua induk menerima permintaan sisipan pada masa yang sama, ia boleh memastikan bahawa ID tidak bercanggah Malah, ini hanya dapat memastikan bahawa data yang dimasukkan tidak bercanggah, tetapi tidak dapat menjamin ketidakkonsistenan data yang disebabkan oleh pemadaman dan pengubahsuaian.

Jadi dalam senario aplikasi sebenar, hanya satu induk boleh didedahkan kepada pelanggan untuk memastikan ketekalan data.

MySQL高可用的搭建

Penguasaan lengkap seni bina replikasi MySQL

这里借助keepalived来对上面的多主复制架构改造来实现MySQL的高可用。

keepalived的安装:

$ sudo apt-get install -y keepalived
Salin selepas log masuk

keepalived.conf

$ cat /etc/keepalived/keepalived3314.conf! Configuration File for keepalived#简单的头部,这里主要可以做邮件通知报警等的设置,此处就暂不配置了;global_defs {
        #notificationd LVS_DEVEL}#预先定义一个脚本,方便后面调用,也可以定义多个,方便选择;vrrp_script chk_haproxy {
    script "/etc/keepalived/chkmysql.sh"  #具体脚本路径
    interval 2  #脚本循环运行间隔}#VRRP虚拟路由冗余协议配置vrrp_instance VI_1 {   #VI_1 是自定义的名称;
    state BACKUP    #MASTER表示是一台主设备,BACKUP表示为备用设备【我们这里因为设置为开启不抢占,所以都设置为备用】
    nopreempt      #开启不抢占
    interface eth0   #指定VIP需要绑定的物理网卡
    virtual_router_id 11   #VRID虚拟路由标识,也叫做分组名称,该组内的设备需要相同
    priority 130   #定义这台设备的优先级 1-254;开启了不抢占,所以此处优先级必须高于另一台

    advert_int 1   #生存检测时的组播信息发送间隔,组内一致
    authentication {    #设置验证信息,组内一致
        auth_type PASS   #有PASS 和 AH 两种,常用 PASS
        auth_pass asd    #密码
    }
    virtual_ipaddress {
        172.23.252.200    #指定VIP地址,组内一致,可以设置多个IP
    }
    track_script {    #使用在这个域中使用预先定义的脚本,上面定义的
        chk_haproxy    }

    #notify_backup "/etc/init.d/haproxy restart"   #表示当切换到backup状态时,要执行的脚本
    #notify_fault "/etc/init.d/haproxy stop"     #故障时执行的脚本}
Salin selepas log masuk

/etc/keepalived/chkmysql.sh

$ cat /etc/keepalived/chkmysql.s.sh#!/bin/bashmysql -uroot -proot -P 3314 -e "show status;" > /dev/null 2>&1if [ $? == 0 ];then
        echo "$host mysql login successfully"
        exit 0else
        echo "$host login failed"
        killall keepalived        exit 2fi
Salin selepas log masuk

推荐学习:mysql视频教程

Atas ialah kandungan terperinci Penguasaan lengkap seni bina replikasi MySQL. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:csdn.net
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!