當 master 每作一次 write 操做,就會將操做的命令記錄到 master 的 Binary-log(bin-log)日誌中。mysql
slave 中默認會有兩條線程sql
IO Thread:讀取 master 中的 bin-log 內容,寫入到 slave 中的 relay-log。shell
SQL Thread:slave 讀取 relay-log,將操做寫入到 slave 數據庫。數據庫
(1)在騰訊雲控制檯上,設置主數據庫外網訪問權限安全
(2)修改 MySQL配置文件,設置 3306 端口外部訪問權限服務器
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
將 bind_address
的值由 '127.0.0.1'
改爲你騰訊雲內網IP地址。網絡
重啓 MySQL 服務器,而後輸入 netstat -anpt|grep 3306
檢查3306端口是否顯示騰訊雲的內網IP。ide
(1)修改主機 MySQL 配置文件:阿里雲
vi /etc/mysql/mysql.conf.d/mysqld.cnf
將 bind_address
一行註釋掉。
(2)而後在阿里雲 ECS 控制檯上,爲主機添加網絡安全組規則:
入方向 協議類型選擇 MySQL(3306) 受權類型改成地址段訪問 受權對象輸入:0.0.0.0/0
從機能夠不用對外開放端口 3306。
建立主機數據庫:mytest
create database mytest default character set utf8;
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
在 [mysqld]
模塊下添加以下內容(默認是註釋的,解除註釋便可):
server-id = 1 log_bin = /var/log/mysql/mysql-bin.log binlog_do_db = mytest # 須要作主從分離,主服務器 MySQL 的數據庫名 binlog_ignore_db = mysql # 在主服務器上須要忽略的 MySQL 數據庫,避免從服務器對主服務器的安全性影響
數據表名忽略大小寫,在 [mysqld]
模塊下添加以下內容:
lower_case_table_names=1
修改完以後,記得要重啓 MySQL 服務:
/etc/init.d/mysql restart;
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
說明:
username - 你將建立的用戶名
host - 指定該用戶在哪一個主機上能夠登錄。若是是本地用戶可用 localhost
, 若是想讓該用戶能夠從任意遠程主機登錄,可使用通配符 %
。
password - 該用戶的登錄密碼,密碼能夠爲空,若是爲空則該用戶能夠不須要密碼登錄服務器.。
舉例:
CREATE USER 'mytest'@'%' IDENTIFIED BY 'mytest123!@#';
grant all privileges on *.* to 'mytest'@'%'identified by 'mytest123!@#' with grant option; flush privileges; -- 更新權限,使之生效
all privileges
表示受權所有的權限。若是單獨指定權限,能夠替換成:insert、select、update、delete 等等;*.*
表示這些權限是對全部的 數據庫.表 等生效。若是要單獨指定,能夠按照此格式 databasename.tablename
;
with grant option
表示建立的這個用戶還能夠爲其餘用戶繼續賦予這些權限。
從機能夠經過主機建立的這個用戶鏈接上主機數據庫,而後複製主機的數據到從機數據庫。
GRANT REPLICATION SLAVE ON *.* TO 'mytest'@'%' IDENTIFIED BY 'mytest123!@#';
sudo /etc/init.d/mysql restart
show master status;
會顯示以下內容(例子):
+------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000001 | 154 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
注意記錄 File
和 Position
的值,在從機 slave 配置時會用到該屬性。
注:執行完此步驟後不要再操做主服務器 MySQL,防止主服務器 master 狀態值變化。若是對主機數據庫作了增刪改操做,會致使 Position
值發生變化。
若是是在主節點開啓主從配置以前就已經建立的表,是不會同步到從節點中。
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
在 [mysqld]
模塊中添加以下內容:
server-id = 2 relay-log = slave-relay-bin relay-log-index = slave-relay-bin.index
主機中是 server-id = 1
,而從機與主機不同,注意區分。
sudo /etc/init.d/mysql restart
使用 root
賬號登陸到從機 MySQL,執行如下命令,將從機與主機關聯:
-- 例子 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; change master to master_host='101.201.66.147',master_port=3306,master_user='mytest',master_password='mytest123!@#',master_log_file='mysql-bin.000005',master_log_pos=154;
說明:
master_host
對應主服務器的外網IP地址 120.77.219.39
master_port
對應主服務器的端口(3306)master_log_file
對應 show master status 顯示的 File 列:mysql-bin.000001
master_log_pos
對應前面記錄主機中顯示的 Position
的值,不然有可能出現同步失敗。該數據庫名稱須要與主服務器上 MySQL 配置文件中定義的 binlog_do_db = mytest
名稱一致:
create database mytest default character set utf8;
建立與主數據庫同名的用戶(非必需):
CREATE USER 'mytest'@'%' IDENTIFIED BY 'mytest123!@#'; grant all privileges on *.* to 'mytest'@'%'identified by 'mytest123!@#' with grant option; flush privileges; -- 更新權限,使之生效
注意:「建立同名用戶」 這一步是非必需的,但爲了方便讀寫,建議對 master
或 slave
數據庫訪問採用一樣的一套用戶名密碼。
/etc/init.d/mysql restart
登陸 MySQL 後,執行以下命令:
start slave;
若是出現錯誤:
mysql> start slave; ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository
說明 relay log 即 mysql.slave_relay_log_info
表中保留了之前的主從複製信息,致使新從庫啓動時沒法找到對應文件,那麼咱們只須要清理掉該表中的記錄就能夠了。注意,不要手動刪該表數據,MySQL 已經提供瞭解決放哪廣發,輸入命令:
reset slave;
執行成功後,再來執行一遍啓動 slave 同步:
start slave;
補充幾個個與 slave 相關的命令:
stop slave;
show slave status;
關於 relay log 的問題,我參考了這篇文章:
[Relay log 致使主從複製啓動失敗]: https://www.cnblogs.com/mysql-dba/p/7201513.html
關於 MySQL 採用 Amoeba 實現讀寫分離,能夠參考 青衫lys 的這篇文章,寫的很詳細:https://www.cnblogs.com/liuyisai/p/6009379.html