1. 程式人生 > >MySQL服務器主從服務詳解

MySQL服務器主從服務詳解

leg 開啟 water soc 數據分布 ide 功能 ant true

MySQL主從復制概念
  • Mysql內建的復制功能是構建大型,高性能應用程序的基礎。將Mysql的數據分布到多個系統上去,這種分布的機制,是通過將Mysql的某一臺主機的數據復制到其它主機(slaves)上,並重新執行一遍來實現的。復制過程中一個服務器充當主服務器,而一個或多個其它服務器充當從服務器。主服務器將更新寫入二進制日誌文件,並維護文件的一個索引以跟蹤日誌循環。這些日誌可以記錄發送到從服務器的更新。當一個從服務器連接主服務器時,它通知主服務器從服務器在日誌中讀取的最後一次成功更新的位置。從服務器接收從那時起發生的任何更新,然後封鎖並等待主服務器通知新的更新。

  • 註:在進行mysql復制時,所有對復制中的表的更新必須在主服務器上進行。否則必須要小心,以避免用戶對主服務器上的表進行的更新與對從服務器上的表所進行的更新之間的沖突。

MySQL主從復制原理

(1)MySQL支持復制類型

  • 基於語句的復制: 在主服務器上執行的SQL語句,在從服務器上執行同樣的語句。MySQL默認采用基於語句的復制,效率比較高。一旦發現沒法精確復制時,會自動選著基於行的復制。
  • 基於行的復制:把改變的內容復制過去,而不是把命令在從服務器上執行一遍. 從mysql5.0開始支持
  • 混合類型的復制: 默認采用基於語句的復制,一旦發現基於語句的無法精確的復制時,就會采用基於行的復制。

(2)MySQL主從復制過程

  • MySQL主從復制基本流程圖:

技術分享圖片

  • 復制過程詳解:

  • 1、在每個事物更新數據完成之前,master主服務器在二進制日誌記錄這些改變,寫入二進制日誌完成後,master通知存儲引擎提交事物。
  • 2、slave將master主服務器的二進制日誌Binary log 復制到其中繼日誌Relay log,首先slave(從服務器)開始一個工作線程——I/O線程,I/O線程在master上打開一個普通的連接,然後開始Binlog dump process,該進程從master的二進制日誌中讀取事件,如果已經跟上master,它會睡眠並等待master產生新的事件,而I/O線程將這些事件寫入中繼日誌。
  • 3、SQLslave thread(SQL從線程)處理該過程的最後一步,SQL線程從中繼日誌中讀取事件,並重放其中的事件而更新salve數據,使其與master中數據保持一致,只要該線程與I/O線程保持一致,中繼日誌通常會位於OS緩存中(也就是內存當中),所以中繼開銷很小。

(3)主從復制註意點

  • 1、master將操作語句記錄到binlog日誌中,然後授予slave遠程連接的權限(master一定要開啟binlog二進制日誌功能;通常為了數據安全考慮,slave也開啟binlog功能)。
  • 2、slave開啟兩個線程:IO線程和SQL線程。其中:IO線程負責讀取master的binlog內容到中繼日誌relay log裏;SQL線程負責從relay log日誌裏讀出binlog內容,並更新到slave的數據庫裏,這樣就能保證slave數據和master數據保持一致了。
  • 3、Mysql復制至少需要兩個Mysql的服務,當然Mysql服務可以分布在不同的服務器上,也可以在一臺服務器上啟動多個服務。
  • 4、Mysql復制最好確保master和slave服務器上的Mysql版本相同(如果不能滿足版本一致,那麽要保證master主節點的版本低於slave從節點的版本)。
  • 5、master和slave兩節點間時間需同步。

MySQL主從服務部署

實驗環境

服務器 服務器系統 IP地址 所需服務
MySQL主服務器 centos7.3 192.168.144.128 ntp,mysql5.7
MySQL從服務器 centos7.3 192.168.144.129 ntp,mysql5.7

MySQL主服務器

  • 設置主服務器為本地時鐘源
    安裝時間同步軟件:

yum install ntp -y
vim /etc/ntp.conf

末行添加:

server 127.127.144.0                    //設置本地是時鐘源,註意自己所在網段是144段
fudge 127.127.144.0 stratum 8          //設置時間層級為8(限制在15內)

service ntpd start
service iptables stop
setenforce 0

  • 安裝MySQL軟件

這裏在centos7上安裝MySQL5.7版本,詳細過程請參見LAMP-mysql搭建

  • 安裝好MySQL後:

vim /etc/my.cnf

[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 10              //設置主從服務器身份唯一標識
log-bin=master-bin          //開啟二進制日誌
log-slave-updates=true      //開啟主從功能

systemctl restart mysqld.service

mysql -u root -p

GRANT REPLICATION SLAVE ON *.* TO ‘myslave‘@‘192.168.144.%‘ IDENTIFIED BY ‘123456‘;  //將從服務器權限賦予賬號myslave,可以在192.168.144.0網段登錄,密碼為123456 

FLUSH PRIVILEGES;     //刷新狀態

show master status;  //查看主服務器狀態
  • 切記主服務器狀態!

技術分享圖片

MySQL從服務器

  • 安裝ntp時間同步軟件,由於主服務器已經設置了時間源,從服務器只需打開時間同步服務,並跟主服務器同步即可。

yum install ntp -y
systemctl restart mysqld.service
systemctl stop firewalld/service
setenforce 0
/usr/sbin/ntpdate 192.168.144.128 //進行時間同步//

  • 安裝MySQL軟件

vim /etc/my.cnf

[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 20              //設置唯一身份標識
relay-log=relay-log-bin     //打開中繼日誌功能
relay-log-index=slave-relay-bin.index   //定義relay-log的位置和名稱
  • 進入數據庫

mysql -u root -p //

change master to master_host=‘192.168.144.128‘,master_user=‘myslave‘,master_password=‘123456‘,master_log_file=‘master-bin.000001‘,master_log_pos=604;   //切記根據主服務器狀態更改相應二進制日誌文件和偏移量;

start slave;    //開啟從服務器狀態

show slave status\G;     //查看狀態

技術分享圖片

驗證主從結果

  • 當選擇在主MySQL服務器中創建數據,從服務器中也會同步更新數據文件。

技術分享圖片

技術分享圖片

MySQL服務器主從服務詳解