Mycat實現Mysql數據庫讀寫分離

1、概述

輸入圖片說明

Mycat在應用中的做用描述以下圖:java

輸入圖片說明

其中Mysql master爲主庫負責讀寫,Mysql slave爲從庫負責讀。經過這樣的方式可讓程序員只須要關心業務代碼的編寫,而不用擔憂後端數據庫集羣的負載均衡,讀寫分離,分庫分表的數據分片邏輯的編寫,只要直接鏈接Mycat就能夠了。mysql

環境:linux

咱們須要三臺服務器,在此我用VirtutualBox開啓三個虛擬機,信息以下:git

10.10.11.167 :安裝Mycat
10.10.11.142:master主庫,負責讀寫
10.10.11.163:slave從庫,負責讀
*:系統均爲centos7

2、Mysql安裝

Centos安裝Mysql程序員

3、Mysql配置主從同步

一、修改主庫配置my.cnf:github

[mysqld]
server-id=1    #惟一標識
log_bin=mysql-bin   #日誌文件
binlog-do-db=test   #須要同步的庫
binlog-ignore-db=mysql  #不須要同步的庫

二、在主數據庫上建立同步帳號sql

GRANT REPLICATION SLAVE,FILE ON *.* TO 'root'@'10.10.11.163' IDENTIFIED BY '123456';

驗證配置是否成功:數據庫

mysql> show master status;

成功如圖所示,若是出現Empty set (0.00 sec)證實上一步配置有問題,返回仔細檢查一下。 輸入圖片說明後端

此處須要記住File和Posittion,後面配置從庫會用到。centos

三、修改從庫My.cnf:

[mysqld]
server-id=2    #惟一標識
log_bin=mysql-bin   #日誌文件
binlog-do-db=test   #須要同步的庫
binlog-ignore-db=mysql  #不須要同步的庫

基本跟主庫配置相同,注意server-id惟一

這裏能夠看到,在MySQL5.6以後的版本中沒有指定master-host,user和password,由於若是你在MySQL5.6和以後的版本中配置從庫的時候,設置到了上邊的內容,即指定了master-host、master-user等信息的話,重啓MySQL的時候就會報錯。

修改完/etc/my.cnf 文件以後,重啓一下MySQL

mysql> stop slave;  #關閉Slave
mysql> change master to master_host='10.10.11.142',master_user='root',master_password='123456',master_log_file='mysql-bin.000003', master_log_pos=120;

mysql> start slave;  #開啓Slave

在這裏指定Master的信息,master_log_file是在配置Master的時候的File選項, master_log_pos是在配置Master的Position 選項,這裏要進行對應。

而後能夠經過mysql> show slave status; 查看配置的信息:

四、測試 在主庫中新增數據庫表,而後觀察從庫變化

4、Mycat配置

Mycat下載地址

下載以後解壓便可,啓動命令:mycat/bin/mycat start,端口默認爲8066

一、配置JDK並設置Mycat環境變量

Mycat是用java編寫的,因此須要jre運行環境

export MYCAT_HOME=/sorin/java/mycat
export PATH=$PATH:$MYCAT_HOME/bin

刷新配置文件使生效:source /etc/profile

二、修改mycat配置文件

進入mycat目錄下conf文件,此處咱們須要更改兩個配置文件,schema.xml和server.xml

server.xml配置以下:

<!-- 注意這裏的TESTDB 不必定是你數據庫上的真實庫名.能夠任意指定.只要和接下來的schema.xml的配置文件中的庫名統一便可 -->
	<user name="root">
		<property name="password">123456</property>
		<property name="schemas">TESTDB</property>
	</user>
	<user name="user">
		<property name="password">user</property>
		<property name="schemas">TESTDB</property>
		<property name="readOnly">true</property>
	</user>

schema.xml配置以下:

<mycat:schema xmlns:mycat="http://io.mycat/">
	<!-- 定義MyCat的邏輯庫 --> 
	<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="pcxNode"></schema>
	<!-- 定義MyCat的數據節點 -->  
    <dataNode name="pcxNode" dataHost="dtHost" database="test" />  
  
      
    <!-- 定義數據主機dtHost,鏈接到MySQL讀寫分離集羣 ,schema中的每個dataHost中的host屬性值必須惟一-->  
    <!-- dataHost實際上配置就是後臺的數據庫集羣,一個datahost表明一個數據庫集羣 -->  
    <!-- balance="1",所有的readHost與stand by writeHost參與select語句的負載均衡-->  
    <!-- writeType="0",全部寫操做發送到配置的第一個writeHost,這裏就是咱們的hostmaster,第一個掛了切到還生存的第二個writeHost-->  
    <dataHost name="dtHost" maxCon="500" minCon="20" balance="1"  
        writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">  
        <!--心跳檢測 -->  
        <heartbeat>show slave status</heartbeat>  
          
        <!--配置後臺數據庫的IP地址和端口號,還有帳號密碼 -->  
        <writeHost host="hostMaster" url="10.10.11.142:3306" user="root" password="123456">
			<!-- can have multi read hosts -->
			<readHost host="hostSlave" url="10.10.11.163:3306" user="root" password="123456" />
		</writeHost>
    </dataHost> 
</mycat:schema>

dataHost裏面屬性的具體含義自行百度吧,這裏只涉及讀寫分離

5、測試

若是一切順利,此時能夠用mysql客戶端連接mycat服務了

測試是否讀寫分離,停掉從庫同步服務mysql>stop slave; 此時經過mycat新增數據,若是主庫能查詢到而mycat和從庫查詢不到,證實成功!

最後按照慣例,來幾張成功的結果:)

經過mycat新增一條數據,在master主庫上面是能夠查詢到:

輸入圖片說明

經過slave從庫查詢不到剛纔新增的數據,由於已經關閉了主從同步:

輸入圖片說明

經過mycat查詢,若是查詢的結果和slave的結果一致證實走的從庫查詢,成功:

輸入圖片說明

日誌信息以下:

輸入圖片說明

*:mycat並非一個數據庫,可是它假裝成一個數據庫,也就是虛擬數據庫,在咱們的應用程序裏面鏈接mycat服務便可,而不用去動態管理數據源。

*:mycat很強大,有不少其餘的功能,後續再學習,學無止境....

相關文章
相關標籤/搜索