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準備好可以去官網下載 http://www.mycat.org.cn/
2、需要兩臺或者兩臺以上的伺服器或者虛擬機器
3、保證每臺伺服器上已經安裝好了mysql並且主從複製已經搭建完成
主從複製搭建可以參考這裡:https://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="http://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讀寫分離的搭建和測試就全部完成了