mysql5.7的主從復制+讀寫分離


Mysql主從復制與讀寫分離

目錄:

  1、mysql主從復制工作原理

  2、mysql讀寫分離原理,使用Amoeba中間代理層實現讀寫分離

  3、在vmware中實現mysql主從復制+讀寫分離

  

一、Mysql主從復制的工作原理:

  1、mysql支持的復制類型:

   1)、基於語句的復制。在服務器上執行sql語句,在從服務器上執行同樣的語句,mysql默認采用基於語句的復制,執行效率高。

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

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

2、主從復制的原理

 

根據上圖說明mysql的主從復制原理:

(1)、在mysql_master上更新數據,寫入二進制日志(Binary log),並通知存儲引擎提交事務

(2)、mysql_slave啟用I/O線程將master的binary log復制到slave的中繼日志(Relay log),

(3)、mysql_slave啟用SQL線程從Relay log中讀取事件,並重放其中的事件從而更新slave數據,使其與master中的數據一致,只要該線程與I/O線程保持一致,中繼日志通常會位於os緩存中,所以中繼日志的開銷很小。

3、mysql讀寫分離原理:

  在主從復制的基礎上,master更新數據同步到slave服務器中,master只負責寫入數據,slave只提供讀取數據,從而實現了數據庫性能的優化,以及提升了服務器的安全性。

實現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為例,完成主從復制和讀寫分離。

 

二、實驗案例

1、實驗拓撲:

2、實驗環境:

OS:centos7

mysql-5.7.13

ip規划如拓撲環境

3、實驗步驟:

  首先部署主從復制架構,再實現讀寫分離,使用client測試讀寫分離;

3-1:

1)、主從復制:

配置ntp,在master上搭建時間同步服務器,確保主從服務器時間同步

配置本地yum:

安裝ntp:

  yum -y install ntp

2)、配置NTP時間服務器:

vim  /etc/ntp.conf

添加如下配置:

3)、重啟ntpd服務:

4)、防火牆添加例外:

5)分別slave1和slave2執行時間同步:

分別在slave1 slave2安裝ntp  ntpdate

在salve1和slave2執行命令同步時間:

3-2:

1)、分別在master和slave1,slave2安裝Mysql,安裝步驟略:

mysql版本如下:

2)、mysql_master配置:

修改/etc/my.cnf配置文件:

 

 

注釋:

server-id=1  ##注意主從server-id不可一樣

log-slave-updates=true:一般用於聯機復制中,

log-bin=master-bin:指定binlog日志名

重啟mysqld服務

在master創建用於復制數據用戶,並授權,查看master的binlog日志信息。

4、配置從服務器(slave1和slave2配置一樣)

1)、修改/etc/my.cnf主配置文件:

注釋:

server-id=2:  server-id修改為2

log-bin=mysql-bin:  slave的二進制日志

relay-log=relay-log-bin  :中繼日志文件名

relay-log-index=slave-relay-bin.index : 中繼日志的索引文件名

重啟mysqld服務

systemctl restart mysqld

注意:

  slave2也執行以上操作

3)、在salve1和salve2分別執行change master to操作,用於同步數據:

在master上開啟防火牆的3306端口例外:

注意要記住在master上執行show master status的binlog的二進制名,與位置信息,下面需要指定:

slave2也執行相同操作:

4)、啟動slave(slave1和slave2都執行此操作)

mysql>  start slave;

5)、查看slave狀態,確保以下兩個值為YES

當前Slave_IO_Running:值為No,向下查看錯誤信息:

根據上述信息,可以判斷,我的環境為克隆狀態,所以mysql的UUID值一樣,使用以下方法解決:

修改auto.cnf中的UUID值,隨意更改一個值即可。(slave2也一樣)

重啟mysqld服務:

systemctl restart mysqld

再次登錄mysql,查看主從復制的狀態:

  根據Slave_SQL_Running  和Slave_IO_Running值是否為Yes狀態

 salve1:

 slave2:

 

5、驗證從是否同步數據:

1)、在主服務器上新建數據庫”IT“

創建test表,並插入數據:

在slave1和slave2上查看是否更新數據:

slave1:

slave2:

主從復制配置完畢,接下來配置讀寫分離:

四、讀寫分離:

1、在Amoeba上安裝java環境:

因為Amoeba基於是jdk1.5開發的,所以官方推薦使用jdk1.5或1.6版本,高版本不建議使用

1)、下載jdk的執行程序:

2)、添加x權限,並執行

chmod +x  jdk-6u14-linux-x64.bin

cp  jdk-6u14-linux-x64.bin  /usr/local/

./jdk-6u14-linux-x64.bin  ##執行此程序

安裝過程中提示(yes/no),選擇yes安裝即可,

mv  jdk1.6.0_14/  /usr/local/jdk1.6

3)、修改/etc/profile配置文件,增加以下配置:

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

export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/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變量

如:

4)、立即生效

2、安裝並配置Amoeba軟件:

#mkdir  /usr/local/amoeba    //創建amoeba目錄

#tar zxf  amoeba-mysql-binary-2.2.0.tar.gz -C  /usr/local/amoeba/

#chmod -R 755 /usr/local/amoeba/

#/usr/local/amoeba/bin/amoeba    

顯示以上內容說明amoeba安裝成功。

3、配置amoeba,實現讀寫分離,master負責寫,slave負責讀,負載均衡

1)、在主從三台服務器上登錄mysql,創建amoeba用戶並授權

用戶amoeba,密碼amoeba(因為之前配置了主從復制,所以在slave1 slave2也會存在授權用戶,可以查看)

2)、修改amoeba.xml文件:

定義兩個配置,第一是應用程序使用什么用戶連接amoeba訪問到后端的mysql數據庫,第二個是定義默認寫池以及讀池。

在Amoeba上操作:

vim  /usr/local/conf/amoeba.xml

1)、修改連接amoeba的用戶和密碼

2)、定義讀寫池

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

1)、修改連接mysql的用戶和密碼:

 用戶amoeba 密碼amoeba    ###注意刪除注釋   -->

指定master slave1 slave2主機地址:

定義slave的負載均衡:

4)、啟動amoeba:

4、測試讀寫分離:

1)、在client上安裝mysql,用於遠程連接數據庫測試  (安裝過程略,可以使用yum -y install mysql)

2)、在master salve1 slave2分別開啟3306端口,防火牆添加例外

 

在Amoeba上開啟8066端口:

firewall-cmd  --permanent  --add-port=8066/tcp;

firewall-cmd  --reload

3)、在client上執行mysql命令登錄amoeba

 1)、創建數據庫test

 2)、創建表student;

查看主從同步情況:

master:

slave1:

slave2:

在client上插入數據到student表中,查看從是否同步:

slave1:

slave2

2)、將slave1 slave2執行 stop slave,停止主從復制

     分別在slave1 和salve2 向student表中插入不同的數據,用於在client上測試讀的負載均衡:

slave1:

 

slave2:

在client上進行查詢:

可以看到,第一次查詢的數據是slave2的數據庫,第二次查詢是slave1的數據庫,實現了輪詢算法的負載均衡

 3)、在client上寫入數據,測試寫數據只有在master上會寫入:

從上面可以看出,在client上向student表寫入數據,查詢時,沒有此數據,因為寫操作只在master上生效,讀是在slave上

在master上查看是否有剛寫入的數據:

通過以上測試,mysql的主從復制與讀寫分離部署已完成。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM