[TOC]
主從數(shù)據(jù)庫原理
主庫 master
當(dāng) master 每做一次 write 操作具则,就會將操作的命令記錄到 master 的 Binary-log(bin-log)日志中宫莱。
從庫 slave
slave 中默認(rèn)會有兩條線程
IO Thread:讀取 master 中的 bin-log 內(nèi)容壕探,寫入到 slave 中的 relay-log教藻。
SQL Thread:slave 讀取 relay-log墓捻,將操作寫入到 slave 數(shù)據(jù)庫致板。
一交煞、云服務(wù)器配置
1.1 騰訊云
(1)在騰訊云控制臺上,設(shè)置主數(shù)據(jù)庫外網(wǎng)訪問權(quán)限
(2)修改 MySQL配置文件斟或,設(shè)置 3306 端口外部訪問權(quán)限
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
將 bind_address
的值由 '127.0.0.1'
改成你騰訊云內(nèi)網(wǎng)IP地址素征。
重啟 MySQL 服務(wù)器,然后輸入 netstat -anpt|grep 3306
檢查3306端口是否顯示騰訊云的內(nèi)網(wǎng)IP。
1.2 阿里云
(1)修改主機(jī) MySQL 配置文件:
vi /etc/mysql/mysql.conf.d/mysqld.cnf
將 bind_address
一行注釋掉稚茅。
(2)然后在阿里云 ECS 控制臺上纸淮,為主機(jī)添加網(wǎng)絡(luò)安全組規(guī)則:
入方向
協(xié)議類型選擇 MySQL(3306)
授權(quán)類型改為地址段訪問
授權(quán)對象輸入:0.0.0.0/0
從機(jī)可以不用對外開放端口 3306。
二亚享、MySQL 主機(jī) master 配置
2.0 創(chuàng)建主機(jī) MySQL 數(shù)據(jù)庫
創(chuàng)建主機(jī)數(shù)據(jù)庫:mytest
create database mytest default character set utf8;
2.1 修改 MySQL 配置文件
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
在 [mysqld]
模塊下添加如下內(nèi)容(默認(rèn)是注釋的咽块,解除注釋即可):
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = mytest # 需要做主從分離,主服務(wù)器 MySQL 的數(shù)據(jù)庫名
binlog_ignore_db = mysql # 在主服務(wù)器上需要忽略的 MySQL 數(shù)據(jù)庫欺税,避免從服務(wù)器對主服務(wù)器的安全性影響
數(shù)據(jù)表名忽略大小寫侈沪,在 [mysqld]
模塊下添加如下內(nèi)容:
lower_case_table_names=1
修改完之后,記得要重啟 MySQL 服務(wù):
/etc/init.d/mysql restart;
2.2 創(chuàng)建一個(gè) MySQL 數(shù)據(jù)庫用戶晚凿,提供給從機(jī) slave 訪問
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
說明:
username - 你將創(chuàng)建的用戶名
host - 指定該用戶在哪個(gè)主機(jī)上可以登陸亭罪。如果是本地用戶可用
localhost
, 如果想讓該用戶可以從任意遠(yuǎn)程主機(jī)登陸歼秽,可以使用通配符%
应役。password - 該用戶的登陸密碼,密碼可以為空燥筷,如果為空則該用戶可以不需要密碼登陸服務(wù)器.箩祥。
舉例:
CREATE USER 'mytest'@'%' IDENTIFIED BY 'mytest123!@#';
2.3 給剛才創(chuàng)建的用戶授權(quán)
grant all privileges on *.* to 'mytest'@'%'identified by 'mytest123!@#' with grant option;
flush privileges; -- 更新權(quán)限,使之生效
-
all privileges
表示授權(quán)全部的權(quán)限肆氓。如果單獨(dú)指定權(quán)限袍祖,可以替換成:insert、select谢揪、update蕉陋、delete 等等; -
*.*
表示這些權(quán)限是對所有的 數(shù)據(jù)庫.表 等生效拨扶。如果要單獨(dú)指定凳鬓,可以按照此格式databasename.tablename
;
-
with grant option
表示創(chuàng)建的這個(gè)用戶還可以為其他用戶繼續(xù)賦予這些權(quán)限患民。
2.4 賦予從機(jī)復(fù)制主機(jī)數(shù)據(jù)的權(quán)力
從機(jī)可以通過主機(jī)創(chuàng)建的這個(gè)用戶連接上主機(jī)數(shù)據(jù)庫村视,然后復(fù)制主機(jī)的數(shù)據(jù)到從機(jī)數(shù)據(jù)庫。
GRANT REPLICATION SLAVE ON *.* TO 'mytest'@'%' IDENTIFIED BY 'mytest123!@#';
2.5 重啟主機(jī) MySQL 服務(wù)
sudo /etc/init.d/mysql restart
2.6 登錄主機(jī) MySQL酒奶,檢查主機(jī) master 的狀態(tài):
show master status;
會顯示如下內(nèi)容(例子):
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 154 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
注意記錄 File
和 Position
的值蚁孔,在從機(jī) slave 配置時(shí)會用到該屬性。
注:執(zhí)行完此步驟后不要再操作主服務(wù)器 MySQL惋嚎,防止主服務(wù)器 master 狀態(tài)值變化杠氢。如果對主機(jī)數(shù)據(jù)庫做了增刪改操作,會導(dǎo)致 Position
值發(fā)生變化另伍。
如果是在主節(jié)點(diǎn)開啟主從配置之前就已經(jīng)創(chuàng)建的表鼻百,是不會同步到從節(jié)點(diǎn)中绞旅。
三、MySQL 從機(jī) slave 配置
3.1 修改從機(jī) MySQL 配置文件
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
在 [mysqld]
模塊中添加如下內(nèi)容:
server-id = 2
relay-log = slave-relay-bin
relay-log-index = slave-relay-bin.index
主機(jī)中是 server-id = 1
温艇,而從機(jī)與主機(jī)不一樣因悲,注意區(qū)分。
3.2 重啟從機(jī) MySQL 服務(wù)
sudo /etc/init.d/mysql restart
3.3 登錄從機(jī) MySQL勺爱,配置與主服務(wù)器 master 的連接
使用 root
帳號登錄到從機(jī) MySQL晃琳,執(zhí)行以下命令,將從機(jī)與主機(jī)關(guān)聯(lián):
-- 例子
change master to master_host='120.77.219.39',master_port=3306,master_user='mytest',master_password='mytest123!@#',master_log_file='mysql-bin.000001',master_log_pos=154;
說明:
-
master_host
對應(yīng)主服務(wù)器的外網(wǎng)IP地址120.77.219.39
-
master_port
對應(yīng)主服務(wù)器的端口(3306) -
master_log_file
對應(yīng) show master status 顯示的 File 列:mysql-bin.000001
-
master_log_pos
對應(yīng)前面記錄主機(jī)中顯示的Position
的值琐鲁,否則有可能出現(xiàn)同步失敗卫旱。
3.4 在從服務(wù)器上創(chuàng)建同名從數(shù)據(jù)庫和同名用戶
該數(shù)據(jù)庫名稱需要與主服務(wù)器上 MySQL 配置文件中定義的 binlog_do_db = mytest
名稱一致:
create database mytest default character set utf8;
創(chuàng)建與主數(shù)據(jù)庫同名的用戶(非必需):
CREATE USER 'mytest'@'%' IDENTIFIED BY 'mytest123!@#';
grant all privileges on *.* to 'mytest'@'%'identified by 'mytest123!@#' with grant option;
flush privileges; -- 更新權(quán)限,使之生效
注意:“創(chuàng)建同名用戶” 這一步是非必需的围段,但為了方便讀寫顾翼,建議對 master
或 slave
數(shù)據(jù)庫訪問采用同樣的一套用戶名密碼。
3.5 重啟 從服務(wù)器(slave)上的 MySQL 服務(wù)
/etc/init.d/mysql restart
3.6 登錄從機(jī) MySQL奈泪,啟用 slave 數(shù)據(jù)同步
登錄 MySQL 后适贸,執(zhí)行如下命令:
start slave;
如果出現(xiàn)錯(cuò)誤:
mysql> start slave;
ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository
說明 relay log 即 mysql.slave_relay_log_info
表中保留了以前的主從復(fù)制信息,導(dǎo)致新從庫啟動時(shí)無法找到對應(yīng)文件涝桅,那么我們只需要清理掉該表中的記錄就可以了拜姿。注意,不要手動刪該表數(shù)據(jù)苹支,MySQL 已經(jīng)提供了解決方法,輸入命令:
reset slave;
執(zhí)行成功后误阻,再來執(zhí)行一遍啟動 slave 同步:
start slave;
補(bǔ)充幾個(gè)個(gè)與 slave 相關(guān)的命令:
- 停止當(dāng)前在運(yùn)行的 slave
stop slave;
- 顯示當(dāng)前 slave 的狀態(tài)
show slave status;