MySQL主從複製

 一、主從複製介紹mysql

MySQL支持單雙向、鏈式級聯、異步複製。在複製過程當中,一個服務器充當主服務器(Master),而一個或多個其餘的服務器充當從服務器(Slave)c++

若是設置了鏈式級聯複製,那麼,從(slave)服務器自己除 了充當從服務器外,也會同時充當下面從服務器的主服務器。鏈式級聯複製相似A-->B-->C-->D的複製形式。sql

當配置好主從複製後,全部對數據庫內容的更新就必須在主服務器上進行,以免用戶對主服務器上 數據庫內容的更新與對從服務器上數據庫內容的更新之間發生衝突。生產環境中通常會,忽略受權表同步,而後對從服務器上的用戶僅受權select讀權限,或在my.cnf配置文件中加read-only參數來確保從庫只讀,固然兩者同時操做效果更佳。數據庫

、主從服務器架構的設置,能夠大大的增強數據庫架構的健壯性。當主服務器出現問題時,咱們能夠切換到從服務器繼續提供服務器。vim

、主從服務器架構可實現對用戶的請求讀寫分離,即經過從服務器上處理用戶select查詢請求,下降查詢響應時間,及讀寫給主服務器帶來的壓力。對於更新的數據(updateinsertdelete)仍然交給主服務器處理,確保主服務器和從服務器保持實時同步。安全

若是網站是以非更新爲主的業務,如blog,www首頁展現等業務,讀請求比較多,這時從服務器的負載均衡策略就頗有效了,這就是傳說中的讀寫分離數據庫結構。bash

、能夠把幾個不一樣的從服務器,根據公司的業務進行拆分。有爲外部用戶提供查詢服務的從服務器,有用來備份的從服務器,還有提供公司內部後臺、腳本、日誌分析及開發人員服務的從服務器。這樣除了減輕主服務器的壓力外。使得對外用戶瀏覽、對內處理公司內部用戶業務,及DBA 備份業務互不影響。具體可使用下面的簡單架構來講明:服務器

M-->S1 ==>對外部用戶提供服務(瀏覽帖子、瀏覽博客)網絡

  -->S2==>對外部用戶提供服務(瀏覽帖子、瀏覽博客)架構

  -->S2==>對外部用戶提供服務(瀏覽帖子、瀏覽博客)

  -->S2==>對內部用戶提供服務(後臺訪問、腳本任務、數據分析、開發人員瀏覽)

  -->S2==>數據庫備份服務(開啓從服務器binlog功能,可實現增量備份及恢復)

 

二、主從複製原理

MySQL的主從複製是一個異步複製過程(但看起來也是實時的),數據庫數據從一個MySQL數據庫(咱們稱之爲Master)複製到另外一個MySQL數據庫(咱們稱之爲Slave)。在MasterSlave之間實現整個主從複製的過程有三個線程參與完成。其中有兩個線程(SQL線程IO線程)在Slave端,另外一個線程(IO線程)在Master端。

要實現MySQL的主從複製,首先必須打開Master端的Binlog功能,不然沒法實現主從複製。由於整個複製過程實際就是SlaveMaster端獲取Binlog日誌,而後再再Slave自身上以相同順序執行Binlog日誌中所記錄的各類操做。打開MySQLBinlog能夠經過在MySQL的配置文件my.cnf中的mysqld模塊增長」log-bin」參數項。

 

三、主從複製過程描述

Slave服務器執行start slave,開啓主從複製開關。;

.此時,Slave服務器的IO線程會經過在Master上受權的複製用戶請求鏈接Master服務器,並請求從指定Binlog日誌文件的指定位置(日誌文件和位置是在配置主從服務器時change master時指定的)以後的Binlog日誌內容;

Master服務器接收到來自Slave服務器的IO線程請求後,Master服務器上負責複製的IO線程根據Slave服務器的IO線程請求的信息讀取指定的Binlog日誌文件指定位置以後的Binlog日誌信息,而後返回給Slave端的IO線程。返回的信息中除了日誌內容外,還有本次返回的日誌內容後再Master服務器端的新的Binlog文件名稱以及在Binlog中的指定位置;

.當slave服務器的IO線程獲取到來自Master服務器上的IO線程發送日誌內容以及日誌文件及位置點後,將Binlog日誌內容依次寫入到Slave端自身的Relay Log(即中繼日誌)文件的最末端,並將新的Binlog文件名和位置記錄到master-info文件中,以便下一次讀取Master端新binlog日誌時可以告訴Master服務器須要重新Binlog日誌的哪一個文件哪一個位置開始請求新的Binlog日誌內容;

Slave服務器的SQL線程會實時的檢測本地Relay Log中新增長了日誌內容,而後及時的把Log文件中的內容解析成在Master端曾經執行的SQL語句的內容,並在自身Slave服務器上按語句的順序執行應用這些SQL語句;

.通過上面的過程,就能夠確保在Master端和Slave端執行了一樣的SQL語句。當複製狀態正常的狀況下,Master端和Slave端的數據是徹底同樣的。

 

四、部署MySQL主從複製(異步)

 環境

 系統版本CentOS release 6.4 (Final),最小化安裝i686

 MySQL版本mysql-5.6.11.tar.gz

 主庫(mysql matsertest1     ip192.168.3.100  

 從庫(mysql slave)  test2     ip192.168.3.101  

 

安裝MySQL5.6.11(主從機安裝步驟同樣)

安裝相應的軟件依賴包

#yum -y install gcc gcc-c++ cmake make ncurses-devel libxml2-devel libtool bison zlib-devel

爲數據庫建立用戶及組帳戶,MySQL編譯安裝完成後,爲軟件主目錄設置正確的用戶及組

groupadd mysql
useradd -r -s /sbin/nologin -g mysql mysql
tar zxf mysql-5.6.11.tar.gz 
cd mysql-5.6.11
cmake . -DENABLE_DOWNLOADS=1
make && make install

 初始化數據庫,完成後將MySQL配置文件my.cnf複製一份到/etc目錄下

/usr/local/mysql/scripts/mysql_install_db  \
--user=mysql --basedir=/usr/local/mysql/  \
--datadir=/usr/local/mysql/data
cp /usr/local/mysql/my.cnf  /etc/my.cnf 

設置MySQL的啓動腳原本管理服務進程

cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld 
chkconfig mysqld on
PATH=$PATH:/usr/local/mysql/bin/
echo "export PATH=$PATH:/usr/local/mysql/bin/" >>/etc/profile 

默認沒有設置密碼,爲了安全給root用戶設置密碼

# service mysqld start
# mysqladmin -uroot -p password '463951510'
Enter password:

 

②主服務器上的設置

在生產環境中,可能在咱們尚未部署數據複製錢,數據庫中就已經存在大量的數據。因此這裏事先建立一個測試用數據庫及數據表,用來演示如何對已經存在的數據進行數據同步。

[root@test1 ~]# mysql -uroot -p
mysql> create database hr;
mysql> use hr;
mysql> create table employees(
    -> employee_id int not null auto_increment,
    -> name char(20) not null,
    -> e_mail varchar(50),
    -> primary key(employee_id));
mysql> insert into employees values
    -> (1,'TOM','tom@example.com'),
    -> (2,'Jerry','jerry@example.com');
mysql> exit

咱們須要在主服務器上開啓二進制日誌並設置服務器編號,服務器編號必須是1232-1之間的整數,根據本身的實際狀況進行設置。進行這些設置須要關閉MySQL數據庫並編輯my.cnfmy.ini文件,而後在[mysqld]設置段添加相應的配置選項

[root@test1 ~]# vim /etc/my.cnf
[mysqld]
log_bin = mysql-bin
server-id = 1
[root@test1 ~]# service mysqld restart

檢查配置是否生效

[root@test1 ~]# egrep 'log_bin|server_id' /etc/my.cnf 
log_bin = mysql-bin
server_id = 1

 

③從服務器的設置

若是從服務ID編號沒有設置,或服務器ID編號與主服務器有衝突,就必須關閉MySQL服務,並從新編輯配置文件,設置惟一的服務器編號,最後重啓MySQL服務。若是有多臺從服務器,則全部的服務器ID編號都必須是惟一的。能夠考慮將服務器ID編號與服務器IP地址關聯,這樣ID編號能夠同時惟一標識一臺服務器計算機,如採用IP地址最後一位做爲MySQL服務器ID編號。 

[root@test2 ~]# vim /etc/my.cnf
[mysqld]
server-id = 2
[root@test2 ~]# service mysqld restart

對複製而言,MySQL從服務器上二進制日誌功能是不須要開啓的。可是,你也能夠經過啓用從服務器的二進制日誌功能,實現數據備份與恢復。此外,在一些更復雜的拓撲環境中,MySQL從服務器也能夠扮演其餘從服務器的主服務器

 

④建立複製帳號

執行數據複製時,全部從服務器都須要使用帳戶與密碼鏈接MySQL主服務器,因此在主服務器上必須存在至少一個用戶帳戶及相應的密碼供從服務器鏈接。這個帳戶必須擁有REPLICATION SLAVE權限,你能夠爲不一樣的從服務器建立不一樣的帳戶與密碼,也可使用統一的帳戶和密碼。MySQL可使用CREATE USER語句建立用戶,使用GRANT語句爲帳戶賦權。若是該用戶僅爲數據庫複製所用,則該帳戶僅須要REPLICATION SLAVE權限便可

root@test1 ~]# mysql -uroot -p
mysql> create user 'slave_cp'@'192.168.3.%' identified by '123456';
mysql> grant replication slave on *.* to 'slave_cp'@'192.168.3.%';
mysql> flush privileges;

 

⑤獲取主服務器二進制日誌信息

在進行主從數據複製以前,咱們來了解一些主服務器的二進制日誌文件的基本信息,這些信息在對從服務器的設置中須要用到,它包括主服務器二進制文件名稱及當前日誌記錄位置,這樣從服務器就能夠知道從哪裏開始進行復制操做。咱們可使用以下操做查看主服務器二進制日誌數據信息。

mysql> flush tables with read lock;
mysql> show master status;
+-------------------+----------+---------------+--------------------+-------------0------+
|       File       | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+---------------+--------------------+---------------------+
| mysql-bin.000001 |  518   |              |                |                  |
+-------------------+----------+--------------+---------------------+---------------------+
mysql> unlock tables;

其中,File列顯示的是二進制日誌文件名,Position爲當前日誌記錄位置

flush tables with read lock命令的做用是對全部數據庫的表執行只讀鎖定,只讀鎖定後全部數據庫的寫操做將被拒絕,但讀操做能夠繼續。執行鎖定能夠防止在查看二進制日誌信息的同時有人對數據進行修改操做,最後使用unlock tables語句對全局鎖執行結束操做。

 

⑥對現有數據進行備份

若是在使用二進制日誌進行數據複製之前,MySQL數據庫系統中已經存在大量的數據資源,對這些資料進行數據備份的一種方法是使用mysqldump工具,在主服務器上使用該工具對數據備份後,便可對從服務器上進行數據還原。當但願的數據達到一致後,就可使用數據複製功能進行自動同步操做。 

[root@test1 ~]# mysqldump -uroot -p --all-databases --lock-all-tables >/tmp/dbdump.sql
[root@test1 ~]# scp /tmp/dbdump.sql 192.168.3.101:/tmp/
[root@test2 ~]# mysql -uroot -p </tmp/dbdump.sql 

 

⑦配置從服務器鏈接主服務器進行數據複製

數據複製的關鍵操做是配置從服務器去鏈接主服務器進行數據複製,咱們須要告知從服務器創建網絡鏈接全部必要的信息。使用CHANGE MASTER TO 語句完成該項工做

[root@test2 ~]# mysql -uroot -p
mysql> change master to                          #這些信息保存在數據目錄data/master.info中
    -> master_host='192.168.3.100',
    -> master_port=3306,
    -> master_user='slave_cp',
    -> master_password='123456',
    -> master_log_file='mysql-bin.00001',
    -> master_log_pos=518;
mysql> start slave;

查看狀態
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.3.100
Master_User: slave_cp
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 1599
Relay_Log_File: test2-relay-bin.000002
Relay_Log_Pos: 283
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes    #顯示YES表示同步狀態成功
Slave_SQL_Running: Yes
......
Seconds_Behind_Master: 0   #和主庫同步延遲的描述,這個參數很重要
......

 

⑧數據同步驗證

全部主從服務器設置完畢後,咱們能夠經過在主服務器上建立新的數據資料,而後在從服務器上查看,全部的數據將自動同步。

[root@test1 ~]# mysql -uroot -p
mysql> create database heboan;
mysql> use heboan;
mysql> create table h_table( name char(20),age int, note varchar(50));
mysql> insert into h_table values ('linda','23','Beijing'), ('jerry','33','Shanghai');

在從庫查看是否同步
[root@test2 ~]# mysql -uroot -p'463951510' -e "show databases;"

[root@test2 ~]# mysql -uroot -p'463951510' -e "select * from heboan.h_table;"

相關文章
相關標籤/搜索