1. 程式人生 > >【Mycat】資料庫效能提升利器(三)——Mycat實現Mysql主從複製和讀寫分離

【Mycat】資料庫效能提升利器(三)——Mycat實現Mysql主從複製和讀寫分離

一、前言       在前一篇文章中,小編向大家 介紹了使用Mycat水平切分資料庫。可以說,使用了水平分庫後,資料庫提升還是很高的。如果想更高的提高資料庫效能,就可以考慮對Mysql進行主從複製和讀寫分離了。

      在這篇部落格中,小編就向大家介紹基於Mycat的Mysql主從複製和讀寫分離。

二、環境要求       跟著上一篇部落格的環境:

Centos 7

jdk-8u131-linux-x64.rpm

Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

mysql

Navicat資料庫管理工具

      設計思路:建立兩個資料庫,分別存放在192.168.137.16 和192.168.137.17,這兩個資料庫有相同的資料庫版本,主從同步的資料庫名字相同都為master。其中16上的master庫為主庫,負責寫入操作。17上的master庫為從庫,負責讀取操作。

三、使用logbin二進位制檔案實現主從複製

3.1 主從複製要求條件 主DB server和從 DB server資料庫版本一致,小編5.6

主DB server和從DB server資料庫資料名稱要一致 ,小編就犯了這個錯誤。

主DB server開啟二進位制日誌,主DB server和DB server的server_id都必須唯一

3.2 Mysql主伺服器配置 第一步:修改my.conf檔案:

      在[mysqld]段下新增:

#主從複製的資料庫的名字 binlog-do-db=master #忽略mysql資料庫 binlog-ignore-db=mysql #啟用二進位制日誌 log-bin=mysql-bin #伺服器唯一ID,一般取IP最後一段 server-id=16  

第二步:重啟mysql服務 service mysqld restart 第三步:建立帳戶並授權slave mysql>GRANT FILE ON *.* TO 'backup'@'%' IDENTIFIED BY '123456'; mysql>GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* to 'backup'@'%' identified by '123456';        注意:一般不用root帳號,“%”表示所有客戶端都可能連,只要帳號,密碼正確,此處可用具體客戶端IP代替,如192.168.145.226,加強安全。

      重新整理許可權

mysql> FLUSH PRIVILEGES;       第四步:查詢master的狀態

mysql> show master status;  

      注意:這裡會生成二進位制檔案,mysql-bin.000004,指明瞭position為120,Binlog_Do_DB是master,小編就在這裡出了錯誤,修改了my.conf後,沒有重新啟動mysql的服務,就沒有產生新的二進位制檔案。

3.3 Mysql從伺服器配置       第一步:修改my.conf檔案

[mysqld] server-id=17

      第二步:配置從伺服器

mysql>change master to master_host='192.168.137.16',master_port=3306,master_user='backup',master_password='123456',master_log_file='mysql-bin.000004',master_log_pos=120;       注意語句中間不要斷開,master_port為mysql伺服器埠號(無引號),master_user為執行同步操作的資料庫賬戶,“120”無單引號(此處的120就是show master status 中看到的position的值,這裡的mysql-bin.000001就是file對應的值)。

      第二步:啟動從伺服器複製功能

Mysql>start slave;   

      第三步:檢查從伺服器複製功能狀態:

mysql> show slave status ……………………(省略部分) Slave_IO_Running: Yes //此狀態必須YES Slave_SQL_Running: Yes //此狀態必須YES ……………………(省略部分)       注:Slave_IO及Slave_SQL程序必須正常執行,即YES狀態,否則都是錯誤的狀態(如:其中一個NO均屬錯誤)。

注意:

      如果出現此錯誤:

Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work. 1       因為是mysql是克隆的系統所以mysql的uuid是一樣的,所以需要修改。        解決方法:        刪除/var/lib/mysql/auto.cnf檔案,重新啟動服務。

3.4 效果展示       16為主,17為從。

      16插入一條資料,17也會新增。如果向17新增一條資料,16是不會新增的,這個只是主向從的同步。

四、使用mycat配置Mysql讀寫分離 4.1 讀寫分離配置       當MySQL按照之前的主從複製方式配置好叢集以後,可以開啟Mycat的讀寫分離機制,Mycat 1.4 支援MySQL主從複製狀態繫結的讀寫分離機制,讓讀更加安全可靠,以以下的配置為例,表明一個從節點hostS1與一個主節點hostM1組成了標準的一主一從的讀寫分離模式:

      修改schema.xml檔案:

<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/">

          <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="database1"></schema>  

        <dataNode name="database1" dataHost="localhost1" database="master" />  

        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="2"  slaveThreshold="100">                   <heartbeat>show slave status</heartbeat>                   <writeHost host="cluster1" url="192.168.137.16:3306" user="root" password="root">                           <readHost host="slave1" url="192.168.137.17:3306" user="root" password="root" />                   </writeHost>                   <writeHost host="cluster2" url="192.168.137.17:3306" user="root" password="root">          </dataHost>  

</mycat:schema>       配置server.xml:

<user name="user">     <property name="password">user</property>     <property name="schemas">TESTDB</property>     <property name="readOnly">false</property> </user>       說明:

      balance:決定了哪些MySQL伺服器參與到讀SQL的負載均衡中,

0為不開啟讀寫分離

1為全部的readHost與standby writeHost參與select語句的負載均衡

比如我們配置了1主3從的MySQL主從環境,並把第一個從節點MySQL配置為dataHost中的第二個writeHost,以便主節點宕機後,Mycat自動切換到這個writeHost上來執行寫操作,此時balance=1就意味著第一個writeHost不參與讀SQL的負載均衡,其他3個都參與;

balance=2則表示所有的writeHost不參與,此時,只有2個readHost參與負載均衡。這裡有一個細節需要你知道,readHost是從屬於writeHost的,即意味著它從那個

writeHost獲取同步資料,因此,當它所屬的writeHost宕機了,則它也不會再參與到讀寫分離中來,即“不工作了”,這是因為  此時,它的資料已經“不可靠”了。基於這個考慮,目前mycat 1.3和1.4版本中,若想支援MySQL一主一從的標準配置,並且在  主節點宕機的情況下,從節點還能讀取資料,則需要在Mycat裡配置為兩個writeHost並設定banlance=1。

      WriteType引數設定:

writeType=“0”, 所有寫操作都發送到可用的writeHost上。

writeType=“1”,所有寫操作都隨機的傳送到readHost。

writeType=“2”,所有寫操作都隨機的在writeHost、readhost分上發。

“readHost是從屬於writeHost的,即意味著它從那個writeHost獲取同步資料,因此,當它所屬的writeHost宕機了,則它也不會再參與到讀寫分離中來,即“不工作了”,這是因為此時,它的資料已經“不可靠”了。基於這個考慮,目前mycat 1.3和1.4版本中,若想支援MySQL一主一從的標準配置,並且在主節點宕機的情況下,從節點還能讀取資料,則需要在Mycat裡配置為兩個writeHost並設定banlance=1。”

switchType 目前有三種選擇:

-1:表示不自動切換

1 :預設值,自動切換

2 :基於MySQL主從同步的狀態決定是否切換

“Mycat心跳檢查語句配置為 show slave status ,dataHost 上定義兩個新屬性: switchType=”2” 與slaveThreshold=”100”,此時意味著開啟MySQL主從複製狀態繫結的讀寫分離與切換機制。Mycat心跳機制通過檢測 show slave status 中的 “Seconds_Behind_Master”, “Slave_IO_Running”, “Slave_SQL_Running” 三個欄位來確定當前主從同步的狀態以及Seconds_Behind_Master主從複製時延。“

4.2 效果展示       查詢:

      寫入:

      主節點16宕機後,查詢:

      主節點16宕機後,寫入:17作為了主,成功上位。

      小編髮現:當16重新啟動後,17依然為主,沒有改變。讀寫都由17做了。

五、小結       Mysql的讀寫分離是必要的步驟,這些可以提升資料庫的效能,具體提升多少,小編還沒有測試。留在以後測試吧!讀寫分離和主從複製就講到這裡了。