Mycat讀寫分離的簡單實現
1、Mycat讀寫分離的配置
1.1、Mycat是什麼
Mycat是一個開源資料庫中間件,是一個實現了MySQL協議的的資料庫中間件伺服器,我們可以把它看作是一個資料庫代理,用MySQL客戶端工具和命令行訪問Mycat,而Mycat再使用用MySQL原生(Native)協議與多個MySQL伺服器通訊,也可以用JDBC協議與大多數主流資料庫伺服器通訊,包括SQL Server、Oracle、DB2、PostgreSQL等主流資料庫,也支援MongoDB這種新型NoSQL方式的存儲,未來還會支援更多類型的存儲。
1.2、Mycat能幹什麼
1.2.1、資料庫的讀寫分離
1、通過Mycat可以自動實現寫數據時操作主資料庫,讀數據時操作從資料庫,這樣能有效地減輕資料庫壓力,也能減輕IO壓力。
2、實現讀寫分離,當主出現故障後,Mycat自動切換到另一個主上,進而提供高可用的資料庫服務,當然我們需要部署多主多從的模式
1.2.1.1、資料庫讀寫分離圖解
這裡是一主一從的圖解

1.2.2、資料庫分庫分表
分庫分表指的是對資料庫數據的拆分,分為兩種:水平拆分和垂直拆分
1.2.2.1、水平拆分(分庫)
根據表中數據的邏輯關係,將同一個表中的數據按照某種條件拆分到多台資料庫伺服器上面
1.2.2.2、垂直拆分(分表)
按照不同的表來拆分分到不同的資料庫伺服器之上,根據表的類型不同來拆分
1.3、Mycat的搭建
1.3.1、前期準備
1、要將Mycat準備好可以去官網下載 //www.mycat.org.cn/
2、需要兩台或者兩台以上的伺服器或者虛擬機
3、保證每台伺服器上已經安裝好了mysql並且主從複製已經搭建完成
主從複製搭建可以參考這裡://blog.csdn.net/qq_45334037/article/details/118708689
1.3.2、搭建環境
主伺服器ip:176.20.92.71
從伺服器ip:176.20.92.73
Mycat版本:1.6.7.1
MySQL版本:5.7.18
Linux版本:centos7
1.3.3、Mycat的安裝啟動關閉
1、Mycat解壓即用
將Mycat解壓到/usr/local目錄下
2、啟動Mycat 需要切換到Mycat中的bin目錄下
./mycat start
3、登錄mycat 需要進入mysql中的bin目錄下
./mysql -umycat -p -P8066 -h127.0.0.1
4、Mycat的關閉
./mycat stop
1.3.4、Mycat的配置文件
- server.xml: 用於配置mycat所需要的伺服器資訊。常用於配置:
1、配置序列生成方式
2、配置mycat邏輯資料庫
3、配置mycat的訪問賬戶和密碼 - schema.xml: 用於配置的邏輯資料庫的映射、表、分片規則、數據結點及真實的資料庫資訊。常用於配置:
1、配置邏輯庫映射
2、配置垂直切分的表
3、配置真實的資料庫
4、配置讀寫結點 - rule.xml: 用於定義分片規則
1.3.5、server.xml文件的配置
只需設置連接mycat時的用戶名和密碼, 邏輯庫即可,將默認的修改為你想要的
<user name="mycat" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">mycatdb</property>
</user>
1.3.6、schema.xml文件的配置
1.3.6.1、schema配置
因為只做讀寫分離,不做分庫分表,Mycat只是幫我們轉發一下請求,寫轉發到主庫,讀轉發到從庫,所以schema標籤裡面不用配置table
配置如下
<schema name="mycatdb" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
1.3.6.2、dataNode配置
dataNode標籤的作用
dataNode定義了Mycat中的數據節點,也就是我們通常說所的數據分片,一個dataNode標籤就是一個獨立的數據分片,通俗理解,一個分片就是一個物理資料庫
配置如下
<dataNode name="dn1" dataHost="host1" database="testdb" />
name屬性:定義數據節點的名字,這個名字需要是唯一的,這個名字在schema裡面會使用到
dataHost屬性:用於定義該分片屬於哪個資料庫實例的,屬性值是引用dataHost標籤上定義的name屬性
database屬性:用於對應真實的資料庫名,必須是真實存在的
1.3.6.3、dataHost配置
dataHost標籤的作用
定義具體的資料庫實例、讀寫分離配置和心跳語句
配置如下
<dataHost name="host1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="176.20.92.71:3306" user="root" password="123456">
<readHost host="hostS1" url="176.20.92.73:3306" user="root" password="123456" />
</writeHost>
</dataHost>
balance屬性:負載均衡類型,目前的取值有4種
switchType屬性:用於指定主伺服器發生故障後的切換類型
heartbeat標籤:用於和後端資料庫進行心跳檢查的語句,檢測MySQL資料庫是否正常運行
writeHost標籤:將後端的資料庫的相關配置給mycat,用於實例化後端連接池,寫實例
readHost標籤:將後端的資料庫的相關配置給mycat,用於實例化後端連接池,讀實例
在一個dataHost內可以定義多個writeHost和readHost。但是,如果writeHost指定的後端資料庫宕機,那麼這個writeHost綁定的所有readHost都將不可用。另一方面,由於這個writeHost宕機系統會自動的檢測到,並切換到備用的writeHost上去
1.3.6.4、完整配置
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="//io.mycat/">
<schema name="mycatdb" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<dataNode name="dn1" dataHost="host1" database="testdb" />
<dataHost name="host1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="176.20.92.71:3306" user="root" password="123456">
<readHost host="hostS1" url="176.20.92.73:3306" user="root" password="123456" />
</writeHost>
</dataHost>
</mycat:schema>
在此我們的mycat讀寫分離配置就全部完成了,重啟mycat進行測試
1.4、讀寫分離測試

在mycat中的邏輯資料庫mycatdb的t_user表中插入數據 可以發現主從資料庫都被插入了數據

在mycat中查詢t_user中的數據

到此mycat讀寫分離的搭建和測試就全部完成了

