MySQL主從復(fù)制是數(shù)據(jù)庫(kù)高可用性和負(fù)載均衡的基礎(chǔ),允許一個(gè)主數(shù)據(jù)庫(kù)(Master)將其數(shù)據(jù)同步到一個(gè)或多個(gè)從數(shù)據(jù)庫(kù)(Slave)中。通過(guò)主從復(fù)制,可以將數(shù)據(jù)庫(kù)的讀取負(fù)載分?jǐn)偟綇膸?kù),提升系統(tǒng)的性能和可靠性。以下是詳細(xì)的MySQL主從復(fù)制配置教程,幫助你搭建一個(gè)主從復(fù)制環(huán)境。
一、前提條件
MySQL版本:MySQL 5.6 或以上版本。
網(wǎng)絡(luò)環(huán)境:確保主從服務(wù)器之間可以互相通信。
操作系統(tǒng):Linux(如Ubuntu, CentOS)環(huán)境。
二、準(zhǔn)備工作
主服務(wù)器:假設(shè)主服務(wù)器的IP地址為 192.168.1.100。
從服務(wù)器:假設(shè)從服務(wù)器的IP地址為 192.168.1.101。
三、主服務(wù)器配置
編輯MySQL配置文件
在主服務(wù)器上,找到并編輯MySQL配置文件 my.cnf(或 my.ini,具體路徑根據(jù)操作系統(tǒng)有所不同)。
Ubuntu/Debian: /etc/mysql/mysql.conf.d/mysqld.cnf
CentOS/RHEL: /etc/my.cnf
打開文件,添加或修改以下配置:
iniCopy Code[mysqld]
server-id = 1 # 唯一的服務(wù)器ID(主服務(wù)器的ID)
log_bin = /var/log/mysql/mysql-bin.log # 啟用二進(jìn)制日志
binlog_do_db = testdb # 指定需要復(fù)制的數(shù)據(jù)庫(kù)(可以根據(jù)需求選擇)
重啟MySQL服務(wù)
修改完配置文件后,重啟MySQL服務(wù)以應(yīng)用更改:
bashCopy Codesudo systemctl restart mysql # 或使用 service mysql restart
創(chuàng)建復(fù)制賬號(hào)
登錄到主服務(wù)器的MySQL數(shù)據(jù)庫(kù),創(chuàng)建一個(gè)用于復(fù)制的專用賬號(hào),并授予復(fù)制權(quán)限:
sqlCopy CodeCREATE USER 'replicator'@'%' IDENTIFIED BY 'replicator_password';
GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%';
FLUSH PRIVILEGES;
這將創(chuàng)建一個(gè)名為 replicator 的賬號(hào),并授予 REPLICATION SLAVE 權(quán)限,允許從服務(wù)器連接并復(fù)制數(shù)據(jù)。
查看主服務(wù)器的二進(jìn)制日志位置
繼續(xù)在MySQL中執(zhí)行以下命令,查看當(dāng)前的二進(jìn)制日志文件和位置。稍后在從服務(wù)器上配置時(shí)需要用到這些信息:
sqlCopy CodeSHOW MASTER STATUS;
記下 File 和 Position 字段的值,稍后需要在從服務(wù)器配置時(shí)使用。
四、從服務(wù)器配置
編輯從服務(wù)器的MySQL配置文件
同樣,在從服務(wù)器上編輯MySQL的配置文件 my.cnf,修改以下內(nèi)容:
iniCopy Code[mysqld]
server-id = 2 # 唯一的服務(wù)器ID(從服務(wù)器的ID)
請(qǐng)確保從服務(wù)器的 server-id 不與主服務(wù)器相同。
重啟MySQL服務(wù)
配置完成后,重啟MySQL服務(wù):
bashCopy Codesudo systemctl restart mysql # 或使用 service mysql restart
配置從服務(wù)器進(jìn)行復(fù)制
登錄到從服務(wù)器的MySQL,執(zhí)行以下命令進(jìn)行復(fù)制配置:
sqlCopy CodeCHANGE MASTER TO
MASTER_HOST = '192.168.1.100', # 主服務(wù)器的IP地址
MASTER_USER = 'replicator', # 主服務(wù)器上的復(fù)制賬號(hào)
MASTER_PASSWORD = 'replicator_password', # 復(fù)制賬號(hào)的密碼
MASTER_LOG_FILE = 'mysql-bin.000001', # 主服務(wù)器的二進(jìn)制日志文件名
MASTER_LOG_POS = 107; # 主服務(wù)器的日志位置
在這里,MASTER_HOST 是主服務(wù)器的IP地址,MASTER_USER 和 MASTER_PASSWORD 是您在主服務(wù)器上創(chuàng)建的復(fù)制賬號(hào)和密碼,MASTER_LOG_FILE 和 MASTER_LOG_POS 是從主服務(wù)器上獲得的二進(jìn)制日志文件和位置。
啟動(dòng)復(fù)制進(jìn)程
執(zhí)行以下命令,啟動(dòng)從服務(wù)器的復(fù)制進(jìn)程:
sqlCopy CodeSTART SLAVE;
查看復(fù)制狀態(tài)
使用以下命令檢查從服務(wù)器的復(fù)制狀態(tài),確保沒有錯(cuò)誤:
sqlCopy CodeSHOW SLAVE STATUS\G
如果配置正確,您應(yīng)該看到類似以下內(nèi)容:
plaintextCopy CodeSlave_IO_Running: Yes
Slave_SQL_Running: Yes
如果這兩個(gè)值都是 Yes,說(shuō)明復(fù)制正在正常工作。如果有任何問(wèn)題,可以根據(jù) Last_Error 字段的提示進(jìn)行排查。
五、驗(yàn)證主從復(fù)制是否正常
在主服務(wù)器上插入數(shù)據(jù)
在主服務(wù)器上執(zhí)行一些插入操作:
sqlCopy CodeUSE testdb;
INSERT INTO test_table (name) VALUES ('test data');
檢查從服務(wù)器數(shù)據(jù)同步
登錄到從服務(wù)器并檢查數(shù)據(jù)是否已經(jīng)同步:
sqlCopy CodeUSE testdb;
SELECT * FROM test_table;
如果數(shù)據(jù)成功同步,說(shuō)明主從復(fù)制配置正確。
六、常見問(wèn)題排查
從服務(wù)器的復(fù)制狀態(tài)為“No”:
檢查主服務(wù)器的 log_bin 是否啟用,并確保 binlog_do_db 配置正確。
檢查 MASTER_LOG_FILE 和 MASTER_LOG_POS 是否正確。
確保從服務(wù)器的 server-id 唯一且與主服務(wù)器不同。
復(fù)制延遲或丟失數(shù)據(jù):
檢查網(wǎng)絡(luò)連接是否正常。
確保主服務(wù)器和從服務(wù)器的時(shí)間同步,避免由于時(shí)區(qū)差異導(dǎo)致的復(fù)制問(wèn)題。
使用 SHOW SLAVE STATUS\G 命令檢查 Seconds_Behind_Master 字段,查看復(fù)制延遲。
通過(guò)上述步驟,您應(yīng)該已經(jīng)成功配置了MySQL的主從復(fù)制環(huán)境。主從復(fù)制能夠有效地分擔(dān)數(shù)據(jù)庫(kù)的讀取壓力,提升數(shù)據(jù)庫(kù)的可用性和性能。在生產(chǎn)環(huán)境中,您可以通過(guò)增加多個(gè)從服務(wù)器來(lái)進(jìn)一步提升系統(tǒng)的可擴(kuò)展性和容錯(cuò)性。