提示:文章寫完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔
目錄
前言
一、MySQL?Replication概述
1.1 MySQL?Replication優(yōu)點(diǎn):
二、MySQL復(fù)制類型
2.1 異步復(fù)制(Asynchronous?repication)
2.2 全同步復(fù)制(Fully?synchronous?replication)
2.3半同步復(fù)制(Semisynchronous?replication)
三、MySQL支持的復(fù)制方式
3.1 基于SQL語(yǔ)句的復(fù)制
3.2 基于行的復(fù)制
3.3 混合模式復(fù)制
3.4 復(fù)制的工作過程:?
四、復(fù)制過程的限制
? ? ??部署MySQL主從異步復(fù)制
總結(jié)
前言
? ? ? ? ?數(shù)據(jù)庫(kù)主從復(fù)制(Database Master-Slave Replication)是一種常用的數(shù)據(jù)庫(kù)復(fù)制技術(shù),用于實(shí)現(xiàn)數(shù)據(jù)的備份和故障恢復(fù)。主從復(fù)制通過將主數(shù)據(jù)庫(kù)上的數(shù)據(jù)變更操作(如插入、更新、刪除)復(fù)制到一個(gè)或多個(gè)從數(shù)據(jù)庫(kù)中,從而保持主數(shù)據(jù)庫(kù)和從數(shù)據(jù)庫(kù)之間的數(shù)據(jù)一致性。
提示:以下是本篇文章正文內(nèi)容,下面案例可供參考
一、MySQL?Replication概述
? ? ? ? MySQL?Replication俗稱MySQL?AB復(fù)制、主從復(fù)制、主從同步,是MySQL官方推薦的數(shù)據(jù)同步技術(shù)。數(shù)據(jù)同步基本過程為從數(shù)據(jù)庫(kù)會(huì)實(shí)時(shí)去讀取主數(shù)據(jù)庫(kù)的二進(jìn)制日志文件,按照日志中記錄對(duì)從庫(kù)進(jìn)行同樣的操作,以達(dá)到數(shù)據(jù)同步效果。
1.1 MySQL?Replication優(yōu)點(diǎn):
- 通過增加從服務(wù)器來提高數(shù)據(jù)庫(kù)平臺(tái)的可靠性。在主服務(wù)器上執(zhí)行寫入和更新,在從服務(wù)器上向外提供讀功能,可以動(dòng)態(tài)地調(diào)整從服務(wù)器地?cái)?shù)量,從而調(diào)整數(shù)據(jù)庫(kù)平臺(tái)地高性能。
- 提高數(shù)據(jù)安全性,因?yàn)閿?shù)據(jù)已復(fù)制到從服務(wù)器,主數(shù)據(jù)庫(kù)異常時(shí),可以將從服務(wù)器復(fù)制進(jìn)程終止來達(dá)到保護(hù)數(shù)據(jù)完整性地特點(diǎn)。
- 在主服務(wù)器上生成實(shí)時(shí)數(shù)據(jù),而在從服務(wù)器上分析這些數(shù)據(jù),從而緩解主服務(wù)器地性能壓力。
二、MySQL復(fù)制類型
2.1 異步復(fù)制(Asynchronous?repication)
? ? ? ? MySQL默認(rèn)地復(fù)制是異步地,主庫(kù)在執(zhí)行完客戶端提交地事務(wù)后會(huì)立刻將結(jié)果返回給客戶端,并不關(guān)心從庫(kù)是否已經(jīng)接受并處理了事務(wù),這樣就會(huì)有一個(gè)問題,主庫(kù)如果down掉了,此時(shí)主上已經(jīng)提交地事務(wù)可能沒有傳到從庫(kù)服務(wù)器上,如果此時(shí),強(qiáng)制將從提升為主,可能會(huì)導(dǎo)致新主上的數(shù)據(jù)不完整。默認(rèn)情況下MySQL5.5/5.6/5.7和mariaDB10.0/10.1的復(fù)制功能是異步的。
2.2 全同步復(fù)制(Fully?synchronous?replication)
? ? ? ? 指當(dāng)主庫(kù)執(zhí)行完一個(gè)事務(wù),所有的從庫(kù)都執(zhí)行了該事務(wù)才返回給客戶端。因?yàn)樾枰却袕膸?kù)執(zhí)行完該事務(wù)才能返回,所以全同步復(fù)制的性能必然會(huì)收到嚴(yán)重的影響,返回客戶端的響應(yīng)速度也會(huì)被拖慢。
2.3半同步復(fù)制(Semisynchronous?replication)
? ? ? ? ?MySQL由Google貢獻(xiàn)的補(bǔ)丁才開始支持半同步復(fù)制模式,介于異步復(fù)制和全同步復(fù)制之間,主庫(kù)在執(zhí)行完客戶端提交的事務(wù)后不是立刻返回給客戶端,而是等待至少一個(gè)從庫(kù)接受到并寫到relay?log中才返回給客戶端。相對(duì)于異步復(fù)制,半同步復(fù)制提高了數(shù)據(jù)的安全性,同時(shí)它也造成了一定程度的延遲,這個(gè)延遲最少是一個(gè)TCP/IP往返的時(shí)間。所以,半同步復(fù)制最好在低延時(shí)的網(wǎng)絡(luò)中使用。當(dāng)出現(xiàn)超時(shí)情況時(shí),源主服務(wù)器會(huì)暫時(shí)切換到異步復(fù)制模式,直到至少有一臺(tái)設(shè)置為半同步復(fù)制模式的從服務(wù)器及時(shí)收到信息為止。
半同步復(fù)制模式在主服務(wù)器和從服務(wù)器同時(shí)啟用,否則主服務(wù)器默認(rèn)使用異步復(fù)制模式
三、MySQL支持的復(fù)制方式
3.1 基于SQL語(yǔ)句的復(fù)制
? ? ? 在主服務(wù)器上執(zhí)行的SQL語(yǔ)句,在從服務(wù)器上執(zhí)行同樣的SQL語(yǔ)句,效率比較高。
3.2 基于行的復(fù)制
? ? ? ?主服務(wù)器把表的行變化作為事件寫入到二進(jìn)制日志中,主服務(wù)器把代表了行變化的事件復(fù)制到從服務(wù)器中。
3.3 混合模式復(fù)制
? ? ? ?先采用基于語(yǔ)句的復(fù)制,一旦發(fā)現(xiàn)基于語(yǔ)句無法精確復(fù)制時(shí),再采用行。
3.4 復(fù)制的工作過程:?
?
- 在每個(gè)事務(wù)更新完成數(shù)據(jù)之前,Master會(huì)在二進(jìn)制日志中記錄這些數(shù)據(jù)的語(yǔ)句,當(dāng)MySQL將事務(wù)串行的寫入二進(jìn)制日志完成后,Master通知存儲(chǔ)引擎提交事務(wù)并將數(shù)據(jù)寫入磁盤
- Slave開啟一個(gè)I/O工作線程,在Master之間建立一個(gè)連接,然后開始Binlog?dump?process,Binlog?dump?process會(huì)從Master的二進(jìn)制日志中讀取操作事件,如果已經(jīng)跟Master達(dá)到一致狀態(tài),它會(huì)催眠并等待Master產(chǎn)生新的操作事件,I/O線程將這些改變數(shù)據(jù)的事件寫入自己的中繼日志。
- SQL Slave?Thread(SQL工作線程)是處理MySQL?Replication過程的最后一步。SQL線程從中繼日志讀取操作事件,重放其中的事件從而更新Slave服務(wù)器的數(shù)據(jù),使slave與Master中的數(shù)據(jù)保持一致,只要該線程與I/O線程保持一致,中繼日志通常會(huì)在OS的緩存中,所以中繼日志的開銷很小。
四、復(fù)制過程的限制
- MySQL5.6之前的版本復(fù)制操作在slave上執(zhí)行的是串行化的,也就是Master上的并行更新會(huì)導(dǎo)致數(shù)據(jù)復(fù)制延遲
- 所有MySQL服務(wù)器的版本都要高于3.2,還有一個(gè)基本的原則就是從服務(wù)器的數(shù)據(jù)庫(kù)版本可以高于主服務(wù)器數(shù)據(jù)庫(kù)的版本,但是不可以低于主服務(wù)器的數(shù)據(jù)庫(kù)版本。
部署MySQL主從異步復(fù)制
MySQL?Master?IP:192.168.10.136
MySQL?Slave1?IP:192.168.10.3
MySQL?Slave2?IP:192.168.10.4
配置MySQL?Master服務(wù)器
1、在/etc/my.cnf中修改或者增加如下內(nèi)容:
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
server-id=1
log-bin=mysql-binlog
log-slave-updates=true
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
server-id=1
log-bin=mysql-binlog
log-slave-updates=true
重啟MySQL服務(wù)器
[root@localhost ~]# systemctl start mariadb
[root@localhost ~]# netstat -lnpt | grep 3306
tcp ???????0 ?????0 0.0.0.0:3306 ???????????0.0.0.0:* ??????????????LISTEN ?????10073/mysqld
[root@localhost ~]# systemctl start mariadb
[root@localhost ~]# netstat -lnpt | grep 3306
tcp ???????0 ?????0 0.0.0.0:3306 ???????????0.0.0.0:* ??????????????LISTEN ?????10073/mysqld
?
2、創(chuàng)建Replication用戶
[root@localhost ~]# mysql -uroot -p123456
MariaDB [(none)]> grant replication slave on *.* to 'myslave'@'192.168.10.%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
[root@localhost ~]# mysql -yroot -p123456
MariaDB [(none)]> grant replication slave on *.* to 'myslave'@'192.168.10.%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> flush privileges;?
Query OK, 0 rows affected (0.00 sec)
3、獲得Master?DB的相關(guān)信息
MariaDB [(none)]> show master status;
+---------------------+----------+--------------+------------------+
| File ???????????????| Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------------+----------+--------------+------------------+
| mysql-binlog.000003 |? ? ? 2245?| ?????????????| ?????????????????|
+---------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
MariaDB [(none)]> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 | 2245 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
?4、備份Master原有數(shù)據(jù)
如果在生產(chǎn)環(huán)境中Master服務(wù)器已經(jīng)運(yùn)行一段時(shí)間,或者M(jìn)aster服務(wù)器上已經(jīng)存在數(shù)據(jù),為了保證所有數(shù)據(jù)的一致性,需要先將Master目前已有的數(shù)據(jù)全部導(dǎo)給Slave服務(wù)器。
備份的方法有很多,可以直接備份數(shù)據(jù)文件,也可以使用mysqldump工具。全新搭建的環(huán)境不存在數(shù)據(jù)備份問題。
[root@mysql-master ~]# mysqldump -uroot --all-databases > /root/alldbbackup.sql
[root@mysql-master ~]# scp /root/ alldbbackup.sql root@192.168.10.3:/root/
[root@mysql-master ~]# scp /root/ alldbbackup.sql root@192.168.10.4:/root/
?
?5、在MySQL?Slave上的配置
導(dǎo)入Master的備份腳本
[root@localhost ~]# systemctl start mariadb
[root@localhost ~]# mysql -uroot -p < /root/alldbbackup.sql
?
?從庫(kù)連接主庫(kù)進(jìn)行測(cè)試,如果連接成功說明主庫(kù)配置成功
[root@localhost ~]# mysql -u myslave -p123456 -h 192.168.10.136?
?修改MySQL配置文件
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
server-id=2
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
[mysqld]
server-id=2
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
修改完后重啟數(shù)據(jù)庫(kù)
[root@localhost ~]# systemctl restart mariadb
?在Slave服務(wù)器授權(quán),啟動(dòng)從庫(kù),進(jìn)行主從庫(kù)數(shù)據(jù)同步
[root@localhost ~]# mysql
MariaDB [(none)]> stop slave;
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='192.168.10.136',MASTER_USER='myslave',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=2245;
MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.200.111
Master_User: myslave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-binlog.000003
Read_Master_Log_Pos: 2245
Relay_Log_File: relay-log-bin.000002
Relay_Log_Pos: 529
Relay_Master_Log_File: mysql-binlog.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 2245
Relay_Log_Space: 821
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
1 row in set (0.00 sec)
6、測(cè)試復(fù)制是否成功
在Master服務(wù)器上創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)或者表,到Slave服務(wù)器上查看,如果配置成功就可以成功同步。
主庫(kù)查看當(dāng)前存在的庫(kù)
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema
| class
class_five
| mysql |
| performance_schema |
| test |
+--------------------+
4 rows in set (0.00 sec)
?從庫(kù)查看當(dāng)前存在庫(kù)
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql
class
class_five
| performance_schema |
| test |
+--------------------+
4 rows in set (0.00 sec)
主庫(kù)服務(wù)器創(chuàng)建庫(kù)和表:
MariaDB [(none)]> create database sampdb;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> use sampdb;
Database changed
MariaDB [sampdb]> create table new(name char(20),phone char(20));
Query OK, 0 rows affected (0.01 sec)
?從庫(kù)驗(yàn)證:
MariaDB [(none)]> show databases;
+--------------------+
| Database ??????????|
+--------------------+
| information_schema |
| mysql ?????????????|
| performance_schema |
| sampdb?????????????|
| test ??????????????|
+--------------------+
5 rows in set (0.00 sec)
MariaDB [(none)]> use sampdb
MariaDB [sampdb]> show tables;
+------------------+
| Tables_in_sampdb |
+------------------+
| new??????????????|
+------------------+
1 row in set (0.00 sec)
?說明主從數(shù)據(jù)庫(kù)創(chuàng)建成功。文章來源:http://www.zghlxwxcb.cn/news/detail-613135.html
總結(jié)
? ? ? ? 數(shù)據(jù)庫(kù)主從復(fù)制是一種常用的數(shù)據(jù)備份和故障恢復(fù)技術(shù),通過將主數(shù)據(jù)庫(kù)上的數(shù)據(jù)變更操作復(fù)制到一個(gè)或多個(gè)從數(shù)據(jù)庫(kù)中來保持?jǐn)?shù)據(jù)一致性。主從復(fù)制的好處包括數(shù)據(jù)備份、負(fù)載均衡、數(shù)據(jù)分析和全球分布等。主從復(fù)制的實(shí)現(xiàn)方式有多種,如基于日志的復(fù)制、基于行的復(fù)制和基于語(yǔ)句的復(fù)制等。主流的數(shù)據(jù)庫(kù)系統(tǒng),如MySQL、PostgreSQL和MongoDB等,都支持主從復(fù)制,并提供相應(yīng)的配置和管理工具。文章來源地址http://www.zghlxwxcb.cn/news/detail-613135.html
到了這里,關(guān)于MySQL主從復(fù)制(三十五)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!