MySQL主從複製與讀寫分離

MySQL主從複製原理

  1. MySQL支持的複製類型

1)基於語句的複製。在服務器上執行sql語句,在從服務器上執行同樣的語句,mysql默認採用基於語句的複製,執行效率高。

2)基於行的複製。把改變的內容複製過去,而不是把命令在從服務器上執行一遍。

3)混合類型的複製。默認採用基於語句的複製,一旦發現基於語句無法精確複製時,就會採用基於行的複製。

2.複製的工作過程

image.png

1)在每個事務更新數據完成之前,master在二進制日誌記錄這些改變。寫入二進制日誌完成後,master通知存儲引擎提交事務。

2)Slave將master的binary log複製到其中繼日誌。首先slave開始一個工作線程(I/O),I/O線程在master上打開一個普通的連接,然後開始binlog  dump  process。binlog  dump  process從master的二進制日誌中讀取事件,如果已經跟上master,它會睡眠並等待master產生新的事件,I/O線程將這些事件寫入中繼日誌

3)Sql  slave  threadsql從線程)處理該過程的最後一步,sql線程從中繼日誌讀取事件,並重放其中的事件而更新slave數據,使其與master中的數據一致,只要該線程與I/O線程保持一致,中繼日誌通常會位於os緩存中,所以中繼日誌的開銷很小。

MySQL讀寫分離原理

讀寫分離就是在主服務器上修改,數據會同步到從服務器,從服務器只能提供讀取數據,不能寫入,實現備份的同時也實現了數據庫性能的優化,以及提升了服務器安全。

image.png

目前較爲常見的MySQL讀寫分離分爲兩種:

1)基於程序代碼內部實現

         在代碼中根據select 、insert進行路由分類,這類方法也是目前生產環境下應用最廣泛的。優點是性能較好,因爲程序在代碼中實現,不需要增加額外的硬件開支,缺點是需要開發人員來實現,運維人員無從下手。

2)基於中間代理層實現

         代理一般介於應用服務器和數據庫服務器之間,代理數據庫服務器接收到應用服務器的請求後根據判斷後轉發到,後端數據庫,有以下代表性的程序。

(1)mysql_proxy。mysql_proxy是Mysql的一個開源項目,通過其自帶的lua腳本進行sql判斷。

(2)Atlas。是由 Qihoo 360, Web平臺部基礎架構團隊開發維護的一個基於MySQL協議的數據中間層項目。它是在mysql-proxy 0.8.2版本的基礎上,對其進行了優化,增加了一些新的功能特性。360內部使用Atlas運行的mysql業務,每天承載的讀寫請求數達幾十億條。支持事物以及存儲過程。

(3)Amoeba。由阿里巴巴集團在職員工陳思儒使用序java語言進行開發,阿里巴巴集團將其用戶生產環境下,但是它並不支持事物以及存數過程。

不是所有的應用都能夠在基於程序代碼中實現讀寫分離,像一些大型的java應用,如果在程序代碼中實現讀寫分離對代碼的改動就較大,所以,像這種應用一般會考慮使用代理層來實現,那麼今天就使用Amoeba爲例,完成主從複製和讀寫分離。

 

實驗拓撲圖

image.png

主機
操作系統
IP地址
主要軟件
Master(主節點服務器)

CentOS 6.5 x86_64

192.168.1.30

cmake-2.8.6.tar.gz

mysql-5.5.22.tar.gz

Slave1(從節點服務器1)
CentOS 6.5 x86_64192.168.1.40

cmake-2.8.6.tar.gz

mysql-5.5.22.tar.gz

Slave2(從節點服務器2)
CentOS 6.5 x86_64192.168.1.50

cmake-2.8.6.tar.gz

mysql-5.5.22.tar.gz

Amoeba
CentOS 6.5 x86_64192.168.1.20

amoeba-mysql-binary-2.2.0.tar.gz

jdk-6u14-linux-x64.bin

客戶機
CentOS 6.5 x86_64192.168.1.10

cmake-2.8.6.tar.gz

mysql-5.5.22.tar.gz

 實驗過程:

一、搭建MySQL主從複製

1.建立時間同步環境,在主節點上搭建時間同步服務器

(1)安裝NTP

2018-02-04_131925.png

(2)配置NTP

2018-02-01_203428.png

2018-02-01_174218.png

(3)重啓服務

2018-02-01_203715.png

2.在從節點上進行時間同步

2018-02-04_132500.png


2018-02-01_204204.png

3.在每臺服務器上關閉iptables或者指定端口進行開放

2018-02-01_204230.png

4.安裝MySQL 數據庫(此步驟省略)

5.配置MySQL  Master主服務器

(1)在/etc/my.cnf中修改或者增加下面內容

2018-02-01_204509.png

2018-02-01_174657.png

(2)重啓MySQL服務

2018-02-01_204544.png

(3)登錄MySQL程序,給從服務器以授權

2018-02-01_204444.png

2018-02-01_204643.png

6.配置從服務器

(1)在/etc/my.cnf中修改或者增加下面內容

2018-02-01_174759.png

(2)重啓MySQL服務

(3)登錄MySQL,配置同步

按主服務器結構更改下面命令中的master_log_filemaster_log_pos參數

2018-02-01_205118.png

(4)啓動同步

2018-02-01_205215.png

(5)查看Slave狀態,確保以下兩個值爲YES

2018-02-01_205258.png

7.驗證主從複製結果

(1)在主、從服務器上登錄MySQL,查看現有數據庫

2018-02-01_205434.png

(2)在主服務器新建數據庫

2018-02-01_205655.png

(3)在從服務器上查看數據庫,顯示數據庫

2018-02-01_205808.png

2018-02-01_205855.png

二、搭建MySQL讀寫分離

Amoeba(變形蟲)項目開源框架於2008年發佈一款Amoeba  for  MySQL軟件。這個軟件致力於MySQL的分佈式數據庫前端代理層,它主要爲應用層訪問MySQL的時候充當SQL路由功能,並具有負載均衡、高可用性、SQL過濾、讀寫分離、可路由相關的到目標數據庫、可併發請求多臺數據庫。通過Amoeba能夠完成多數據源的高可用、負載均衡、數據切片的功能.

  1. 在主機Amoeba上安裝Java環境

2018-02-01_210450.png

2018-02-01_210509.png

2018-02-01_210857.png

2018-02-01_211015.png

修改/etc/profile文件

2018-02-01_211046.png

export JAVA_HOME=/usr/local/jdk1.6  //設置jdk的根目錄

export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jire/lib //將jdk的程序文件賦予CLASSPATH變量

export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin:$PATH:$HOME/bin  //將jdk的程序文件賦予PATH變量

export AMOEBA_HOME=/usr/local/amoeba        //定義AMOEBA的根目錄

export PATH=$PATH:$AMOEBA_HOME/bin  將amoeba的程序文件複製給PATH變量

2018-02-01_175025.png

執行該文件,使其生效

2018-02-04_132500.png

2018-02-01_211112.png

JAVA環境已配置成功

2.安裝並配置Amoeba軟件

2018-02-01_211210.png

3.配置Amoeba讀寫分離,兩個Slave讀負載均衡

(1)Master、Slave1、Slave2中開放權限給Amoeba訪問

2018-02-01_211349.png

(2)編輯amoeba.xml配置文件

2018-02-01_211518.png

修改帶下劃線的內容

2018-02-01_211629.png


2018-02-01_211713.png

(3)編輯dbServers.xml配置文件

2018-02-01_211924.png

修改帶下劃線的內容

2018-02-01_175454.png


2018-02-01_175527.png


2018-02-01_175608.png

4.配置無誤後,可以啓動Amoeba軟件,其默認端口爲tcp  8066

2018-02-01_212129.png

2018-02-01_212250.png

4.編寫防火牆規則

Amoeba服務器: iptables -I INPUT -p tcp --dport 8066 -j ACCEPT

master、slave1、slave2都需要開放3306端口入站:iptables -I INPUT -p tcp --dport 3306 -j ACCEPT

5.測試

(1)通過代理訪問MySQL

2018-02-01_212349.png

(2)在Master上創建一個表,插入一條數據,同步到從服務器

2018-02-01_212745.png

2018-02-01_212857.png

2018-02-01_213012.png

(3)關掉各從服務器的Slave功能,再插入語句

2018-02-01_212607.png

2018-02-01_213218.png

2018-02-01_213253.png

4.在客戶機上測試讀操作

2018-02-01_213713.png

5.測試寫操作

(1)在客戶機上插入一條語句

2018-02-01_213900.png

在客戶機上查詢不到剛插入的語句,只有在主服務器上才能看到,因爲寫操作只有master有,另外兩臺負責讀取數據。

2018-02-01_214202.png


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