Rumah pangkalan data tutorial mysql 【原创】使用 Rotate Master 实现MySQL 多主复制_MySQL

【原创】使用 Rotate Master 实现MySQL 多主复制_MySQL

Jun 01, 2016 pm 01:49 PM

bitsCN.com

背景:

众所周知,MySQL只支持一对多的主从复制,而不支持多主(multi-master)复制。

当然,5.6的GUID功能的出现也带来了multi-master的无限可能,不过这个已经是题外话了。

本文主要介绍一种非实时的适用于各版本MySQL的multi-master方法。

 

内容简介:

最初的思路来源于一位国外DBA的blog : http://thenoyes.com/littlenoise/?p=117

基本原理就是通过SP记录当前 master-log的name和pos记录到表中,然后读取下一个master记录,执行stop slave / change master / start slave。以此循环反复。

个人对他的方法进行了改进,增加了以下功能:

1. master可以根据业务流量设置权重值

2. 各个master-slave运行情况的监控

3. 各个master可以实时退出多主的架构

 

具体操作过程:

1. 创建保存各个master信息的表

use mysql;<br>CREATE TABLE `rotate_master` (                                                                                  `id` int(11) NOT NULL AUTO_INCREMENT,                                                                         `master_host` varchar(255) DEFAULT NULL comment 'master地址',                                                                      `master_port` int(10) unsigned DEFAULT NULL comment 'master端口' ,                                                                  `master_log_file` varchar(255) DEFAULT NULL ‘上次停止时的master-log文件’,                                                                  `master_log_pos` int(10) unsigned DEFAULT NULL comment '上次停止时的master-log-pos',                                                               `IS_Slave_Running` varchar(10) DEFAULT NULL comment '上次停止时主从是否有异常',                                                                  `in_use` tinyint(1) DEFAULT '0' comment '是否是当前正在同步的数据行',                                                                              `weight` int(11) NOT NULL DEFAULT '1' comment '该master的权重,即重复执行多少个时间片',                                                                        `repeated_times` int(11) NOT NULL DEFAULT '0' comment '当前已经重复执行的时间片数',                                                                `LastExecuteTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP comment '上次执行的时间',                   PRIMARY KEY (`id`)                                                                                          ) ENGINE=InnoDB  DEFAULT CHARSET=utf8
Salin selepas log masuk

 


新增加一个master :

insert  into `rotate_master`(`master_host`,`master_port`,`master_log_file`,`master_log_pos`,`in_use`,`weight`) values -- 1号master,权重=1,并设置为当前master('192.168.0.1',3307,'mysqlbinlog.000542',4,1,1),-- 2号master,权重=2('192.168.0.2',3306,'mysqlbinlog.000702',64762429,0,2),-- 3号master,权重=5('192.168.0.3',3306,'mysqlbinlog.000646',22157422,0,5)
Salin selepas log masuk

 

手工把master 调整到当前的配置项:

change master to master_host='192.168.0.1', master_port=3306,master_log_file='mysqlbinlog.000542',master_log_pos=4,master_user='repl',master_password='repl';start slave; 
Salin selepas log masuk

 

创建rotate master SP: 

注意:代码中用于连接master的用户名和密码是 :  repl / repl ,请根据自己的情况修改。

DELIMITER $$DROP PROCEDURE IF EXISTS `mysql`.`rotate_master`$$CREATE DEFINER=`root`@`localhost` PROCEDURE `rotate_master`()BEGINDECLARE _info text;DECLARE _master_file varchar(255);DECLARE _master_pos int unsigned;DECLARE _master_host varchar(255);DECLARE _master_port int unsigned;DECLARE _is_slave_running varchar(10);DECLARE _id int;DECLARE _weight int;DECLARE _repeated_times int;select VARIABLE_VALUE from information_schema.GLOBAL_STATUS where VARIABLE_NAME = 'Slave_running' into _is_slave_running;STOP SLAVE;SELECT LOAD_FILE(@@relay_log_info_file) INTO _info;SELECTSUBSTRING_INDEX(SUBSTRING_INDEX(_info, '/n', 3), '/n', -1),SUBSTRING_INDEX(SUBSTRING_INDEX(_info, '/n', 4), '/n', -1)INTO _master_file, _master_pos;UPDATE mysql.rotate_master SET `master_log_file` = _master_file, `master_log_pos` = _master_pos, id = LAST_INSERT_ID(id), `IS_Slave_Running` =  _is_slave_running WHERE in_use = 1;select weight,repeated_times into _weight,_repeated_times from mysql.rotate_master where in_use =1;if(_weight ', master_user="repl"',<br>', master_password="repl"'<br>);PREPARE myStmt FROM @sql;EXECUTE myStmt;UPDATE mysql.rotate_master SET in_use = 0,repeated_times=0 WHERE in_use = 1;UPDATE mysql.rotate_master SET in_use = 1,repeated_times=1 WHERE id = _id;ELSEUPDATE mysql.rotate_master SET `repeated_times`=`repeated_times`+1 WHERE in_use = 1;END IF;START SLAVE;END$$DELIMITER ;
Salin selepas log masuk

 

创建Event:

每2分钟运行一次,rotate_master() ,即时间片大小是2分钟

DELIMITER $$CREATE EVENT `rotate_master` ON SCHEDULE EVERY 120 SECOND STARTS '2011-10-13 14:09:40' ON COMPLETION NOT PRESERVE ENABLE DO CALL mysql.rotate_master()$$DELIMITER ;
Salin selepas log masuk

 

至此,多主复制已经搭建完成。

由于时间片长度是2分钟。

Master1 在执行 1*2 分钟后,stop slave,然后change master to Master2;

Master2 在执行 2*2 分钟后,stop slave,然后change master to Master3;

Master3 在执行 5*2 分钟后,stop slave,然后change master to Master2;

并以此循环往复。

如果希望把其中一个master移除多主复制,可以将他的配置项权重设置为0;

即: update rotate_master set weigh=0 where id = #ID# ; 

 

 

 

 

 

 

 

 

 

 

bitsCN.com
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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana anda mengubah jadual di MySQL menggunakan pernyataan Alter Table? Bagaimana anda mengubah jadual di MySQL menggunakan pernyataan Alter Table? Mar 19, 2025 pm 03:51 PM

Artikel ini membincangkan menggunakan pernyataan jadual Alter MySQL untuk mengubah suai jadual, termasuk menambah/menjatuhkan lajur, menamakan semula jadual/lajur, dan menukar jenis data lajur.

Terangkan keupayaan carian teks penuh InnoDB. Terangkan keupayaan carian teks penuh InnoDB. Apr 02, 2025 pm 06:09 PM

Keupayaan carian teks penuh InnoDB sangat kuat, yang dapat meningkatkan kecekapan pertanyaan pangkalan data dan keupayaan untuk memproses sejumlah besar data teks. 1) InnoDB melaksanakan carian teks penuh melalui pengindeksan terbalik, menyokong pertanyaan carian asas dan maju. 2) Gunakan perlawanan dan terhadap kata kunci untuk mencari, menyokong mod boolean dan carian frasa. 3) Kaedah pengoptimuman termasuk menggunakan teknologi segmentasi perkataan, membina semula indeks dan menyesuaikan saiz cache untuk meningkatkan prestasi dan ketepatan.

Bagaimana saya mengkonfigurasi penyulitan SSL/TLS untuk sambungan MySQL? Bagaimana saya mengkonfigurasi penyulitan SSL/TLS untuk sambungan MySQL? Mar 18, 2025 pm 12:01 PM

Artikel membincangkan mengkonfigurasi penyulitan SSL/TLS untuk MySQL, termasuk penjanaan sijil dan pengesahan. Isu utama menggunakan implikasi keselamatan sijil yang ditandatangani sendiri. [Kira-kira aksara: 159]

Apakah beberapa alat GUI MySQL yang popular (mis., MySQL Workbench, phpmyadmin)? Apakah beberapa alat GUI MySQL yang popular (mis., MySQL Workbench, phpmyadmin)? Mar 21, 2025 pm 06:28 PM

Artikel membincangkan alat MySQL GUI yang popular seperti MySQL Workbench dan PHPMyAdmin, membandingkan ciri dan kesesuaian mereka untuk pemula dan pengguna maju. [159 aksara]

Bagaimana anda mengendalikan dataset besar di MySQL? Bagaimana anda mengendalikan dataset besar di MySQL? Mar 21, 2025 pm 12:15 PM

Artikel membincangkan strategi untuk mengendalikan dataset besar di MySQL, termasuk pembahagian, sharding, pengindeksan, dan pengoptimuman pertanyaan.

Bagaimana anda menjatuhkan jadual di MySQL menggunakan pernyataan jadual drop? Bagaimana anda menjatuhkan jadual di MySQL menggunakan pernyataan jadual drop? Mar 19, 2025 pm 03:52 PM

Artikel ini membincangkan jadual menjatuhkan di MySQL menggunakan pernyataan Jadual Drop, menekankan langkah berjaga -jaga dan risiko. Ia menyoroti bahawa tindakan itu tidak dapat dipulihkan tanpa sandaran, memperincikan kaedah pemulihan dan bahaya persekitaran pengeluaran yang berpotensi.

Bagaimana anda membuat indeks pada lajur JSON? Bagaimana anda membuat indeks pada lajur JSON? Mar 21, 2025 pm 12:13 PM

Artikel ini membincangkan membuat indeks pada lajur JSON dalam pelbagai pangkalan data seperti PostgreSQL, MySQL, dan MongoDB untuk meningkatkan prestasi pertanyaan. Ia menerangkan sintaks dan faedah mengindeks laluan JSON tertentu, dan menyenaraikan sistem pangkalan data yang disokong.

Terangkan pelbagai jenis indeks MySQL (B-Tree, Hash, Full-Text, Spatial). Terangkan pelbagai jenis indeks MySQL (B-Tree, Hash, Full-Text, Spatial). Apr 02, 2025 pm 07:05 PM

MySQL menyokong empat jenis indeks: B-Tree, Hash, Full-Text, dan Spatial. 1. B-Tree Index sesuai untuk carian nilai yang sama, pertanyaan dan penyortiran. 2. Indeks hash sesuai untuk carian nilai yang sama, tetapi tidak menyokong pertanyaan dan penyortiran pelbagai. 3. Indeks teks penuh digunakan untuk carian teks penuh dan sesuai untuk memproses sejumlah besar data teks. 4. Indeks spatial digunakan untuk pertanyaan data geospatial dan sesuai untuk aplikasi GIS.

See all articles