查看服務(wù)器環(huán)境
主從兩臺(tái)MySQL服務(wù)器均使用以下環(huán)境添祸。
shell > lsb_release -a
LSB Version: :core-4.1-amd64:core-4.1-noarch
Distributor ID: CentOS
Description: CentOS Linux release 7.3.1611 (Core)
Release: 7.3.1611
Codename: Core
查看MySQL版本
shell > mysql -u root -p
// 服務(wù)器 A
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 128
Server version: 5.7.18-log MySQL Community Server (GPL)
// 服務(wù)器 B
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 22
Server version: 5.7.19-log MySQL Community Server (GPL)
觀察到服務(wù)器版本略有差異,應(yīng)用在生產(chǎn)環(huán)境時(shí)最好將MySQL的版本保持一致篓跛。最不濟(jì)也要保證前兩位(5.7)版本保持一致,不要出現(xiàn)主(5.7)從(5.1)這種跨版本的情況坦刀。
設(shè)置復(fù)制主機(jī)配置
要配置主機(jī)以使用基于二進(jìn)制日志文件位置的復(fù)制愧沟,您必須啟用二進(jìn)制日志記錄并建立唯一的服務(wù)器ID。
shell > service mysqld stop
關(guān)閉 mysqld 服務(wù) 并 編輯 my.cnf 鲤遥,配置 server-id 時(shí)需要注意:此ID用于標(biāo)識(shí)組內(nèi)的各個(gè)服務(wù)器沐寺,并且必須為1到(2 32)-1 之間的正整數(shù)。
[mysqld]
log-bin = mysql-bin
server-id = 1
read-only = 0 # 主庫(kù)讀寫(xiě)都可以
binlog-do-db = test # 需要備份的庫(kù)盖奈,多個(gè)庫(kù)寫(xiě)多行
binlog-ignore-db = mysql # 無(wú)需備份的庫(kù)混坞,多個(gè)庫(kù)寫(xiě)多行
注意:test 庫(kù)是一個(gè)新庫(kù)
。采用新庫(kù)的目的是避免主從庫(kù)的結(jié)構(gòu)、數(shù)據(jù)的不同導(dǎo)致主從復(fù)制失敗究孕。實(shí)際在生產(chǎn)環(huán)境下啥酱,主從庫(kù)結(jié)構(gòu)數(shù)據(jù)同步這步是漏不掉的。
創(chuàng)建用戶(hù)進(jìn)行復(fù)制
任何一個(gè)已被授予 REPLICATION SLAVE
權(quán)限的用戶(hù)都可以連接到主機(jī)并執(zhí)行復(fù)制操作厨诸∠庖螅可以專(zhuān)門(mén)為為每個(gè)從機(jī)創(chuàng)建復(fù)制帳戶(hù),也可以多個(gè)從機(jī)使用一個(gè)帳戶(hù)微酬。但需要注意的是僅授予其復(fù)制過(guò)程中需要的權(quán)限(白名單原則)绘趋,以減少因此引入的危害。
[mysql] > CREATE USER 'repl'@'slave-ip-address' IDENTIFIED BY 'slave-password';
[mysql] > GRANT REPLICATION SLAVE ON *.* TO 'repl'@'slave-ip-address';
需要注意:
slave-ip-address
表示 從機(jī)服務(wù)器的ip地址颗管;
slave-password
表示 從機(jī)新用戶(hù)的密碼陷遮;
復(fù)制主二進(jìn)制日志坐標(biāo)
MySQL [(none)]> use mysql;
MySQL [mysql]> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000016 | 154 | test | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
生成數(shù)據(jù)快照
使用mysqldump創(chuàng)建數(shù)據(jù)快照。當(dāng)主庫(kù)與從庫(kù)之間信息不對(duì)等時(shí)垦江,可以在啟動(dòng)復(fù)制之前先將主庫(kù)數(shù)據(jù)導(dǎo)入到從庫(kù)帽馋。
mysqldump -u root -p --databases test --master-data > dbdump.db
-
--databases test
表示只選擇 test 庫(kù) -
--ignore-table
選項(xiàng)排除數(shù)據(jù)庫(kù)中的所有表 。 - 更多信息可以參考鏈接:選擇數(shù)據(jù)快照的方法疫粥。
設(shè)置復(fù)制從站
[mysqld]
server-id = 2
要注意 server-id
與其它主機(jī)或從機(jī)均不同茬斧。修改完需要重啟mysqld
」4可以不啟用該從機(jī)的二進(jìn)制日志功能项秉,除非它需要作為其它從機(jī)的主機(jī)。
在從站上設(shè)置主站配置
要設(shè)置從站與主站進(jìn)行通信以進(jìn)行復(fù)制慷彤,請(qǐng)使用必要的連接信息配置從站娄蔼。為此,請(qǐng)?jiān)趶恼旧蠄?zhí)行以下語(yǔ)句底哗,將選項(xiàng)值替換為與系統(tǒng)相關(guān)的實(shí)際值:
MySQL [mysql]> CHANGE MASTER TO
-> MASTER_HOST = '主庫(kù)IP地址',
-> MASTER_USER = 'repl',
-> MASTER_PASSWORD = '主庫(kù)用戶(hù)repl的密碼',
-> MASTER_LOG_FILE = 'mysql-bin.000016',
-> MASTER_LOG_POS = 154;
Query OK, 0 rows affected, 2 warnings (0.04 sec)
MASTER_LOG_FILE
與MASTER_LOG_POS
可見(jiàn)上面復(fù)制主二進(jìn)制日志坐標(biāo)查詢(xún)出的結(jié)果岁诉。
最后啟動(dòng)從服務(wù)器,執(zhí)行此過(guò)程后跋选,從服務(wù)器連接到主服務(wù)器涕癣,并復(fù)制從快照?qǐng)?zhí)行以來(lái)在主服務(wù)器上發(fā)生的任何更新。
MySQL [mysql]> START SLAVE;
Query OK, 0 rows affected (0.00 sec)
最后檢查是否主從復(fù)制配置生效
查看從機(jī)的狀態(tài)前标,如果Slave_IO_Running
與Slave_SQL_Running
都是Yes
則說(shuō)明主從配置成功坠韩。
MySQL [mysql]> SHOW SLAVE STATUS\G;
//...
Slave_IO_Running: Connecting
Slave_SQL_Running: Yes
//...
如果出現(xiàn)一直Connecting
則需要進(jìn)行排查。查看從機(jī)的錯(cuò)誤日志炼列,位置可以通過(guò)查看文件/etc/my.cnf
得到錯(cuò)誤日志的位置只搁。
tail -f /data/mysql/mysql-error.log
2017-08-07T09:29:39.327901Z 18 [ERROR] Slave I/O for channel '': error connecting to master 'repl@47.**.**.**:3306' - retry-time: 60 retries: 38, Error_code: 1130
遇到錯(cuò)誤可以查看MySQL錯(cuò)誤碼清單(服務(wù)端),MySQL錯(cuò)誤清單(客戶(hù)端)依據(jù)錯(cuò)誤碼可以方便的定位錯(cuò)誤俭尖。
我的錯(cuò)誤排查過(guò)程
Error_code: 1130
我遇到的錯(cuò)誤是Error_code: 1130
氢惋,對(duì)應(yīng)的解釋是Message: Host '%s' is not allowed to connect to this MySQL server
洞翩。
原因是我配置連接主庫(kù)時(shí),我錄入的是從庫(kù)的ip地址焰望。所以導(dǎo)致從庫(kù)嘗試連接從庫(kù)骚亿,但是使用的是從庫(kù)不存在的用戶(hù)。所以即報(bào)了上述錯(cuò)誤柿估。
Error_code: 2003
修改完上述問(wèn)題后循未,又出現(xiàn)Error_code: 2003
,對(duì)應(yīng)的解釋是Message: Can't connect to MySQL server on '%s' (%d)
秫舌。
1)檢查主機(jī)是否開(kāi)啟tcp連接的妖。
lsof -i tcp:3306
如果沒(méi)有tcp連接,則需要去/etc/my.cnf
中設(shè)置bind-address = 0.0.0.0
足陨。
2)檢查主機(jī)防火墻是否攔截了該連接嫂粟。
service iptables stop
在測(cè)試遠(yuǎn)程連接mysql -u repl@'%' -p -P3306 -h 47.**.**.**;
,登錄正常墨缘。
無(wú)論是測(cè)試環(huán)境還是生產(chǎn)環(huán)境星虹,關(guān)閉iptables只為取悅mysql
都是不恰當(dāng)?shù)淖龇āK晕覀冃枰獮樘囟ǖ?code>ip地址開(kāi)放3306
端口镊讼,有關(guān)安全方面都建議使用最小權(quán)限原則(白名單)
宽涌。
# 僅允許指定ip地址
iptables -A INPUT -p tcp --dport 3306 -s 47.**.**.** -j ACCEPT
# 保存規(guī)則
/sbin/service iptables save
# 重啟iptables
service iptables restart
- CentOS下針對(duì)iptables管理,可以參考 《Saving IPTables Rules》蝶棋。
- 有關(guān)iptables的基本操作卸亮,可以參考《Guide to Using Iptables》。