mysql主從複製,從原理講到安裝配置,全乾貨

0、爲何須要主從複製?

一、在業務複雜的系統中,有這麼一個情景,有一句sql語句須要鎖表,致使暫時不能使用讀的服務,那麼就很影響運行中的業務,使用主從複製,讓主庫負責寫,從庫負責讀,這樣,即便主庫出現了鎖表的情景,經過讀從庫也能夠保證業務的正常運做。node

二、作數據的熱備mysql

三、架構的擴展。業務量愈來愈大,I/O訪問頻率太高,單機沒法知足,此時作多庫的存儲,下降磁盤I/O訪問的頻率,提升單個機器的I/O性能。git

一、什麼是mysql的主從複製?

MySQL 主從複製是指數據能夠從一個MySQL數據庫服務器主節點複製到一個或多個從節點。MySQL 默認採用異步複製方式,這樣從節點不用一直訪問主服務器來更新本身的數據,數據的更新能夠在遠程鏈接上進行,從節點能夠複製主數據庫中的全部數據庫或者特定的數據庫,或者特定的表。sql

二、mysql複製原理

原理:

(1)master服務器將數據的改變記錄二進制binlog日誌,當master上的數據發生改變時,則將其改變寫入二進制日誌中;數據庫

(2)slave服務器會在必定時間間隔內對master二進制日誌進行探測其是否發生改變,若是發生改變,則開始一個I/OThread請求master二進制事件centos

(3)同時主節點爲每一個I/O線程啓動一個dump線程,用於向其發送二進制事件,並保存至從節點本地的中繼日誌中,從節點將啓動SQL線程從中繼日誌中讀取二進制日誌,在本地重放,使得其數據和主節點的保持一致,最後I/OThread和SQLThread將進入睡眠狀態,等待下一次被喚醒。安全

也就是說:
  • 從庫會生成兩個線程,一個I/O線程,一個SQL線程;服務器

  • I/O線程會去請求主庫的binlog,並將獲得的binlog寫到本地的relay-log(中繼日誌)文件中;架構

  • 主庫會生成一個log dump線程,用來給從庫I/O線程傳binlog;異步

  • SQL線程,會讀取relay log文件中的日誌,並解析成sql語句逐一執行;

注意:

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兩節點間時間需同步

具體步驟:

一、從庫經過手工執行change master to 語句鏈接主庫,提供了鏈接的用戶一切條件(user 、password、port、ip),而且讓從庫知道,二進制日誌的起點位置(file名 position 號); start slave

二、從庫的IO線程和主庫的dump線程創建鏈接。

三、從庫根據change master to 語句提供的file名和position號,IO線程向主庫發起binlog的請求。

四、主庫dump線程根據從庫的請求,將本地binlog以events的方式發給從庫IO線程。

五、從庫IO線程接收binlog events,並存放到本地relay-log中,傳送過來的信息,會記錄到master.info中

六、從庫SQL線程應用relay-log,而且把應用過的記錄到relay-log.info中,默認狀況下,已經應用過的relay 會自動被清理purge

mysql主從複製安裝配置

一、基礎設置準備

#操做系統:
centos6.5
#mysql版本:
5.7
#兩臺虛擬機:
node1:192.168.85.11(主)
node2:192.168.85.12(從)

二、安裝mysql數據庫

#詳細安裝和卸載的步驟參考對應的文檔

三、在兩臺數據庫中分別建立數據庫

--注意兩臺必須所有執行
create database msb;

四、在主(node1)服務器進行以下配置:

#修改配置文件,執行如下命令打開mysql配置文件
vi /etc/my.cnf
#在mysqld模塊中添加以下配置信息
log-bin=master-bin #二進制文件名稱
binlog-format=ROW  #二進制日誌格式,有row、statement、mixed三種格式,row指的是把改變的內容複製過去,而不是把命令在從服務器上執行一遍,statement指的是在主服務器上執行的SQL語句,在從服務器上執行一樣的語句。MySQL默認採用基於語句的複製,效率比較高。mixed指的是默認採用基於語句的複製,一旦發現基於語句的沒法精確的複製時,就會採用基於行的複製。
server-id=1   #要求各個服務器的id必須不同
binlog-do-db=msb   #同步的數據庫名稱

五、配置從服務器登陸主服務器的帳號受權

--受權操做
set global validate_password_policy=0;
set global validate_password_length=1;
grant replication slave on *.* to 'root'@'%' identified by '123456';
--刷新權限
flush privileges;

六、從服務器的配置

#修改配置文件,執行如下命令打開mysql配置文件
vi /etc/my.cnf
#在mysqld模塊中添加以下配置信息
log-bin=master-bin #二進制文件的名稱
binlog-format=ROW #二進制文件的格式
server-id=2 #服務器的id

七、重啓主服務器的mysqld服務

#重啓mysql服務
service mysqld restart
#登陸mysql數據庫
mysql -uroot -p
#查看master的狀態
show master status;

八、重啓從服務器並進行相關配置

#重啓mysql服務
service mysqld restart
#登陸mysql
mysql -uroot -p
#鏈接主服務器
change master to master_host='192.168.150.11',master_user='root',master_password='123456',master_port=3306,master_log_file='master-bin.000001',master_log_pos=334;
#啓動slave
start slave
#查看slave的狀態
show slave status\G(注意沒有分號)

九、此時能夠在主服務器進行相關的數據添加刪除工做,在從服務器看相關的狀態

 

關於數據庫以及其餘Java相關知識,已經上傳到個人碼雲,須要的自取

我的碼雲地址

相關文章
相關標籤/搜索