MySQL 主從配置

主從數據庫原理

主庫 master

當 master 每作一次 write 操做,就會將操做的命令記錄到 master 的 Binary-log(bin-log)日誌中。mysql

從庫 slave

slave 中默認會有兩條線程sql

IO Thread:讀取 master 中的 bin-log 內容,寫入到 slave 中的 relay-log。shell

SQL Thread:slave 讀取 relay-log,將操做寫入到 slave 數據庫。數據庫

1、雲服務器配置

1.1 騰訊雲

(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.2 阿里雲

(1)修改主機 MySQL 配置文件:阿里雲

vi /etc/mysql/mysql.conf.d/mysqld.cnf

bind_address 一行註釋掉。

(2)而後在阿里雲 ECS 控制檯上,爲主機添加網絡安全組規則:

入方向
協議類型選擇 MySQL(3306)
受權類型改成地址段訪問
受權對象輸入:0.0.0.0/0

從機能夠不用對外開放端口 3306。

2、MySQL 主機 master 配置

2.0 建立主機 MySQL 數據庫

建立主機數據庫:mytest

create database mytest default character set utf8;

2.1 修改 MySQL 配置文件

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;

2.2 建立一個 MySQL 數據庫用戶,提供給從機 slave 訪問

CREATE USER 'username'@'host' IDENTIFIED BY 'password';

說明:

  • username - 你將建立的用戶名

  • host - 指定該用戶在哪一個主機上能夠登錄。若是是本地用戶可用 localhost, 若是想讓該用戶能夠從任意遠程主機登錄,可使用通配符 %

  • password - 該用戶的登錄密碼,密碼能夠爲空,若是爲空則該用戶能夠不須要密碼登錄服務器.。

舉例:

CREATE USER 'mytest'@'%' IDENTIFIED BY 'mytest123!@#';

2.3 給剛纔建立的用戶受權

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 表示建立的這個用戶還能夠爲其餘用戶繼續賦予這些權限。

2.4 賦予從機複製主機數據的權力

從機能夠經過主機建立的這個用戶鏈接上主機數據庫,而後複製主機的數據到從機數據庫。

GRANT REPLICATION SLAVE ON *.* TO 'mytest'@'%' IDENTIFIED BY 'mytest123!@#';

2.5 重啓主機 MySQL 服務

sudo /etc/init.d/mysql restart

2.6 登陸主機 MySQL,檢查主機 master 的狀態:

show master status;

會顯示以下內容(例子):

+------------------+----------+--------------+------------------+
   | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
   +------------------+----------+--------------+------------------+
   | mysql-bin.000001 |      154 |              |                  |
   +------------------+----------+--------------+------------------+
   1 row in set (0.00 sec)

注意記錄 FilePosition 的值,在從機 slave 配置時會用到該屬性。

注:執行完此步驟後不要再操做主服務器 MySQL,防止主服務器 master 狀態值變化。若是對主機數據庫作了增刪改操做,會致使 Position 值發生變化。

若是是在主節點開啓主從配置以前就已經建立的表,是不會同步到從節點中。

3、MySQL 從機 slave 配置

3.1 修改從機 MySQL 配置文件

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,而從機與主機不同,注意區分。

3.2 重啓從機 MySQL 服務

sudo /etc/init.d/mysql restart

3.3 登陸從機 MySQL,配置與主服務器 master 的鏈接

使用 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 的值,不然有可能出現同步失敗。

3.4 在從服務器上建立同名從數據庫和同名用戶

該數據庫名稱須要與主服務器上 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;  -- 更新權限,使之生效

注意:「建立同名用戶」 這一步是非必需的,但爲了方便讀寫,建議對 masterslave 數據庫訪問採用一樣的一套用戶名密碼。

3.5 重啓 從服務器(slave)上的 MySQL 服務

/etc/init.d/mysql restart

3.6 登陸從機 MySQL,啓用 slave 數據同步

登陸 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 相關的命令:

  1. 中止當前在運行的 slave
stop slave;
  1. 顯示當前 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

相關文章
相關標籤/搜索