mysql如何設(shè)置主從數(shù)據(jù)庫的同步
1.業(yè)務(wù)場景
場景1:實現(xiàn)服務(wù)器負(fù)載均衡
若我們所有的業(yè)務(wù)代碼存于一個服務(wù)器上,而這個服務(wù)器有的時候回宕機(jī),導(dǎo)致業(yè)務(wù)停頓,造成影響。這個時候 就需要做高可用,在數(shù)據(jù)庫的處理上如果兩個mysql實現(xiàn)高可用,避免單點(diǎn)問題。
場景2:讀寫分離;master寫,其他slave讀,這種架構(gòu)最大問題I/O壓力集中在Master上;
場景3:通過復(fù)制實現(xiàn)數(shù)據(jù)的異地備份
可以定期的將數(shù)據(jù)從主服務(wù)器上復(fù)制到從服務(wù)器上,這無疑是先了數(shù)據(jù)的異地備份。在傳統(tǒng)的備份體制下,是將數(shù)據(jù)備份在本地。此時備份 作業(yè)與數(shù)據(jù)庫服務(wù)器運(yùn)行在同一臺設(shè)備上,當(dāng)備份作業(yè)運(yùn)行時就會影響到服務(wù)器的正常運(yùn)行。有時候會明顯的降低服務(wù)器的性能。同時,將備份數(shù)據(jù)存放在本地,也 不是很安全。如硬盤因為電壓等原因被損壞或者服務(wù)器被失竊,此時由于備份文件仍然存放在硬盤上,數(shù)據(jù)庫管理員無法使用備份文件來恢復(fù)數(shù)據(jù)。這顯然會給企業(yè) 帶來比較大的損失。
2.實現(xiàn)的目標(biāo)
一臺服務(wù)器充當(dāng)主數(shù)據(jù)庫服務(wù)器,另一臺或多臺服務(wù)器充當(dāng)從數(shù)據(jù)庫服務(wù)器,主服務(wù)器中的數(shù)據(jù)自動復(fù)制到從服務(wù)器之中。
對于多級復(fù)制,數(shù)據(jù)庫服務(wù)器即可充當(dāng)主機(jī),也可充當(dāng)從機(jī)。
一句話表示就是,主數(shù)據(jù)庫做什么,從數(shù)據(jù)庫就跟著做什么。
3.原理
我們的主從復(fù)制基于Mysql Replication來進(jìn)行實現(xiàn)
3.1 什么是Mysql Replication
Replication可以實現(xiàn)將數(shù)據(jù)從一臺數(shù)據(jù)庫服務(wù)器(master)復(fù)制到一臺或多臺數(shù)據(jù)庫服務(wù)器(slave)
- 默認(rèn)情況下屬于異步復(fù)制,無需維持長連接
- 通過配置,可以復(fù)制所有的庫或者幾個庫,甚至庫中的一些表
- 是MySQL內(nèi)建的,本身自帶的
3.2 Mysql Replication的原理
簡單的說就是master將數(shù)據(jù)庫的改變寫入二進(jìn)制日志,slave同步這些二進(jìn)制日志,并根據(jù)這些二進(jìn)制日志進(jìn)行數(shù)據(jù)操作。
注意:
- DML表示SQL操作語句如:update, insert,delete
- Relay log :中繼日志
整體上來說,復(fù)制有3個步驟:
(1) master將改變記錄到二進(jìn)制日志(binary log)中(這些記錄叫做二進(jìn)制日志事件,binary log events)
(2) slave將master的binary log events拷貝到它的中繼日志(relay log)
(3) slave重做中繼日志中的事件,修改salve上的數(shù)據(jù)。
3.3 My Replication的作用
- Fail Over 故障切換
- Backup Server 備份服務(wù),無法對SQL語句執(zhí)行產(chǎn)生的故障恢復(fù),有限的備份
- High Performance 高性能,可以多臺slave,實現(xiàn)讀寫分離
3.4 MySQL主從復(fù)制
第一步:master記錄二進(jìn)制日志
在每個事務(wù)更新數(shù)據(jù)完成之前,master在二進(jìn)制日志記錄這些改變。
MySQL將事務(wù)寫入二進(jìn)制日志,即使事務(wù)中的語句都是交叉執(zhí)行的。
在事件寫入二進(jìn)制日志完成后,master通知存儲引擎提交事務(wù)。
第二步:slave將master的binary log拷貝到它自己的中繼日志
首先,slave開始一個工作線程—I/O線程。
I/O線程在master上打開一個普通的連接,然后開始binlog dump process。
Binlog dump process從master的二進(jìn)制日志中讀取事件,如果已經(jīng)執(zhí)行完master產(chǎn)生的所有文件,它會睡眠并等待master產(chǎn)生新的事件。
I/O線程將這些事件寫入中繼日志。
第三步:SQL slave thread(SQL從線程)處理該過程的最后一步
SQL線程從中繼日志讀取事件,并重新執(zhí)行其中的事件而更新slave的數(shù)據(jù),使其與master中的數(shù)據(jù)一致。
4.My Replication常見方案
One master and Muti salve 一主多備(MS)
一般用來做讀寫分離的,master寫,其他slave讀,這種架構(gòu)最大問題I/O壓力集中在Master上<多臺同步影響IO>
M-S-S
使用一臺slave作為中繼,分擔(dān)Master的壓力,slave中繼需要開啟bin-log,并配置log-slave-updates
Slave中繼可使用Black-hole存儲引擎,不會把數(shù)據(jù)存儲到磁盤,只記錄二進(jìn)制日志。
M-M 雙主互備(互為主從)
每個服務(wù)器需要做同樣的同步更新,破壞了事物的隔離性和數(shù)據(jù)的一致性。
M-M-M
監(jiān)控三臺機(jī)器互相作對方的master
天生的缺陷:復(fù)制延遲,slave上同步要慢于master,如果大并發(fā)的情況那延遲更嚴(yán)重。
mysql在5.6已經(jīng)自身可以實現(xiàn)fail over故障切換
One slave Muti master 一從對多主
好處:節(jié)省成本,將多個master數(shù)據(jù)自動化整合
缺陷:對庫和表數(shù)據(jù)的修改較多
5.實現(xiàn)
5.1 環(huán)境準(zhǔn)備
本地安裝兩個mysql,或者使用虛擬機(jī),或者使用docker安裝,需要準(zhǔn)備兩個mysql,本文使用docker安裝
在docker中先創(chuàng)建兩個mysql服務(wù)器
主服務(wù)器:3308
從服務(wù)器:3309
不會創(chuàng)建?點(diǎn)擊此處
5.2 修改 my.cnf配置文件
master的my.cnf配置文件
#mysql master1 config [mysqld] server-id = 1 # 節(jié)點(diǎn)ID,確保唯一 # log config log-bin = mysql-bin #開啟mysql的binlog日志功能 sync_binlog = 1 #控制數(shù)據(jù)庫的binlog刷到磁盤上去 , 0 不控制,性能最好,1每次事物提交都會刷到日志文件中,性能最差,最安全 binlog_format = mixed #binlog日志格式,mysql默認(rèn)采用statement,建議使用mixed expire_logs_days = 7 #binlog過期清理時間 max_binlog_size = 100m #binlog每個日志文件大小 binlog_cache_size = 4m #binlog緩存大小 max_binlog_cache_size= 512m #最大binlog緩存大 binlog-ignore-db=mysql #不生成日志文件的數(shù)據(jù)庫,多個忽略數(shù)據(jù)庫可以用逗號拼接,或者 復(fù)制這句話,寫多行 auto-increment-offset = 1 # 自增值的偏移量 auto-increment-increment = 1 # 自增值的自增量 slave-skip-errors = all #跳過從庫錯誤
slave1的my.cnf配置文件
[mysqld] server-id = 2 log-bin=mysql-bin relay-log = mysql-relay-bin replicate-wild-ignore-table=mysql.% replicate-wild-ignore-table=test.% replicate-wild-ignore-table=information_schema.%
6.進(jìn)入master數(shù)據(jù)庫,創(chuàng)建復(fù)制用戶并授權(quán)
依次執(zhí)行
CREATE USER repl_user IDENTIFIED BY 'root'; CREATE USER 'repl_user'@'172.17.0.1' IDENTIFIED BY 'root'; CREATE USER 'repl_user'@'192.168.1.2' IDENTIFIED BY 'root';
root表示該用戶的用戶密碼
你只需要修改的是將 192.168.1.2改為你自己主機(jī)的ip地址即可
查看自己創(chuàng)建用戶是否成功
SELECT User, Host FROM mysql.user;
6.1 賦予該用戶復(fù)制的權(quán)利
依次執(zhí)行
grant replication slave on *.* to 'repl_user'@'%'; grant replication slave on *.* to 'repl_user'@'172.17.0.1'; grant replication slave on *.* to 'repl_user'@'192.168.1.2'; FLUSH PRIVILEGES;
注意:我們接下來進(jìn)行一個很重要的步驟,就是修改主庫repl_user的plugin
依次執(zhí)行以操作:
alter user 'repl_user'@'%' identified with mysql_native_password by 'root'; alter user 'repl_user'@'172.17.0.1' identified with mysql_native_password by 'root'; alter user 'repl_user'@'192.168.1.2' identified with mysql_native_password by 'root';
6.2 查看master的狀態(tài)
show master status;
7.配置從庫
登錄進(jìn)入從庫的mysql服務(wù)內(nèi)執(zhí)行以下命令
CHANGE MASTER TO MASTER_HOST = 'localhost', MASTER_USER = 'repl_user', MASTER_PASSWORD = 'root', MASTER_PORT = 3308, MASTER_LOG_FILE='binlog.000002', MASTER_LOG_POS=1374, MASTER_RETRY_COUNT = 60, MASTER_HEARTBEAT_PERIOD = 10000;
注意你要修改以下內(nèi)容:
7.1 啟動從庫slave進(jìn)程
start slave;
附:停止從庫進(jìn)程:stop slave;
7.2 查看是否配置成功
show slave status\G
當(dāng)這兩個信息 都為yes時說明你配置成功啦。
8.測試主從同步
我用navicat連接到主庫和從庫
接下來我先在master中創(chuàng)建一個數(shù)據(jù)庫test1
然后刷新salve
然后會發(fā)現(xiàn)salve中也會出現(xiàn)一個test1數(shù)據(jù)庫
至此我們的主從同步就完全實現(xiàn)了
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于數(shù)據(jù)庫中保留小數(shù)位的問題
本篇文章是對關(guān)于在數(shù)據(jù)庫中保留小數(shù)位的問題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-07-07通過DML更新MySQL數(shù)據(jù)庫數(shù)據(jù)的示例代碼
這篇文章主要給大家介紹了如何通過DML更新MySQL數(shù)據(jù)庫的數(shù)據(jù),通過DML來對數(shù)據(jù)庫種地表的數(shù)據(jù)記錄進(jìn)行增刪改查操作,文中給大家了詳細(xì)的代碼示例供大家參考,具有一定的參考價值,需要的朋友可以參考下2024-01-01MySQL使用MRG_MyISAM(MERGE)實現(xiàn)分表后查詢的示例
這篇文章主要介紹了MySQL使用MRG_MyISAM(MERGE)實現(xiàn)分表后查詢的示例,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下2020-12-12MyEclipse通過JDBC連接MySQL數(shù)據(jù)庫基本介紹
MyEclipse使用Java 通過JDBC連接MySQL數(shù)據(jù)庫的基本測試前提是MyEclipse已經(jīng)能正常開發(fā)Java工程2012-11-11