MySQL 的主從複製原理詳解高級

首先要明白爲什麼要用 mysql 的主從複製:
1–在從服務器可以執行查詢工作 (即我們常說的讀功能),降低主服務器壓力;(主庫寫,從庫讀,降壓)
2–在從主服務器進行備份,避免備份期間影響主服務器服務;(確保數據安全)
3–當主服務器出現問題時,可以切換到從服務器。(提升性能)

來說一下主從複製的實現原理


mysql 複製過程分爲三步(如上圖所示):
1.mster 將改變記錄到二進制日誌 (binary log) 當中 這些記錄過程叫做二進制日誌事件 binary log events;
2.slave 將 master 的 binary log events 拷貝到它的中繼日誌 (relay log) 當中;
3.slave 重做中繼日誌中的事件 將改變應用到自己的數據庫當中 mysql 複製是異步的且串行化的 3.slave 重做中繼日誌中的事件 將改變應用到自己的數據庫當中 mysql 複製是異步的且串行化的

複製的基本原則:

每個 slave 只有一個 master
每個 slave 只能有一個唯一的服務器 id
每個 master 可以有多個 slave
複製的最大問題:
從主機複製數據達到從機可能會有延時!

都說 master 主機和 slave 從機的 mysql 版本號要一致 我就沒一致
master 主機上是 5.6 slave 從機上是 5.7 一樣搞
拿過來一臺服務器你不得先找 mysql 嗎?mysql 在哪裏 配置文件在哪裏?
執行命令:

which mysql
/usr/bin/mysql --verbose --help | grep -A 1 'Default options'
結果如圖所示:


先去找 /etc/my.cnf 再去找 /etc/mysql/my.cnf 然後就是後邊
我的是在 /etc/my.cnf
修改 my.cnf 配置文件如下:


重啓 mysql 服務器執行命令:

service mysqld restart;
解釋:
server-id=1 // 複製組中的每臺服務器都要配置唯一的 Server ID,取值範圍是 1 到 (232)−1,你自己決定取值
log-bin=master-bin // 日誌文件名以 “master-bin” 作爲前綴
binlog-do-db=finance_online // 要同步的 finance_online 數據庫
如要同步多個數據庫,就多加幾個 replicate-db-db = 數據庫名
binlog-ignore-db=mysql // 要忽略的數據庫
read-only // 主機 讀寫都可以 (必須)
登錄上 mysql 然後執行:

show master status;
結果如下:


記住裏面的 File 和 Position 的值 待會會用到!

在主數據中創建一個同步賬號(可不創建使用現有的),如果僅僅爲了主從複製創建賬號,只需要授予 REPLICATION SLAVE 權限
創建一個賬號,賬號:zcfz 密碼: 123456
這個賬號是專門用來搞主從複製用的哈

CREATE USER 'zcfz'@'%' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
GRANT REPLICATION SLAVE ON *.* TO 'zcfz'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
上述 主服務器配置完成

slave 從服務器配置開始:


重啓 mysql 服務器:

service mysqld restart;
進入到 slave 從機的 mysql 命令行執行命令:

stop  slave;
CHANGE MASTER TO MASTER_HOST='10.10.20.120',
MASTER_USER='zcfz',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='master-bin.000005',
MASTER_LOG_POS=3878614;
解釋:
MASTER_HOST 就是 master 主服務器的 ip
MASTER_USER 就是 master 主服務器裏面的專門複製複製的用戶 zcfz
MASTER_PASSWORD 就是 zcfz 賬戶的密碼
MASTER_LOG_FILE 就是我們上邊讓您保存的 file 對應的值
MASTER_LOG_POS 就是我們上邊讓您保存的 Position 的值
然後執行命令:

show slave status\G
結果如圖所示:


wating for master to send evnet 說明已經在待命狀態了
另外必須注意的是 slave_io_runing 以及 slave_sql_runing 都同時必須爲 yes 才行!!!
截止到此刻說明主從複製的道路打通了!
然後執行命令:

start slave;
驗證階段:
執行命令創建數據庫:

CREATE DATABASE finance_online DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
這個時候 master 和 slave 上都有了數據庫
然後你再導入數據到 master 主機上的 finance_online 那麼 slave 從機上也就有了然後你再導入數據到 master 主機上的 finance_online 那麼 slave 從機上也就有了

另外如果你不想複製這個庫了 想換一個
那麼去修改 master 主機上的 my.cnf 當中的 binlog-do-db=tprbac 然後重啓 mysql 服務
然後 show master status 看看 file 和 positon
然後再去 linux 服務器上停止 slave 在 mysql 當中執行 stop slave;
然後再執行:
CHANGE MASTER TO MASTER_HOST=’10.10.20.120’,
MASTER_USER=’zcfz’,
MASTER_PASSWORD=’123456’,
MASTER_LOG_FILE=‘你看到的 file’,
MASTER_LOG_POS = 你看到的 positon;
然後在 start slave;
就完事了!
這樣就會主從複製你想要複製的數據庫了!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章