讀寫分離要做的事情就是對於一條SQL該選擇哪個數據庫去執行,至於誰來做選擇數據庫這件事兒,無非兩個,要麼中間件幫我們做,要麼程序自己做。下面就來講講利用maycat中間件實現
Mycat數據庫分庫分表中間件 簡介
阿里大牛開發的開源免費產品,面向企業應用開發的大數據庫集羣 ;核心技術即使分表分片,我們不用在代碼中配置很多數據源,只需要在mycat中就可以,增加節點很靈活,降低了和代碼的耦合度;同時,這也是對分佈式的數據庫的支持,支持事務。
可以把mycat看作一個代理,根據負載均衡策略實現這樣的分佈式數據。
更多詳細的介紹請看官網:http://www.mycat.io/
官網文檔電子書:http://www.mycat.io/document/mycat-definitive-guide.pdf
主備配置方式:https://blog.csdn.net/c237821375/article/details/105529568
主從配置方式:https://blog.csdn.net/c237821375/article/details/105292036
一、 mycat安裝
官網下載1.6版本的解壓,據說這個比較穩定,目錄如下:
目錄 | 說明 |
---|---|
bin | mycat命令,啓動、重啓、停止等 |
catlet | mycatlet爲Mycat的一個擴展功能 |
conf | mycatlet爲Mycat的一個擴展功能 |
lib | Mycat 配置信息,重點關注 |
logs | 日誌文件,包括Mycat啓動的日誌和運行的日誌 |
我們所有的配置都在conf下,重點時這三個文件
文件 | 說明 |
---|---|
server.xml | Mycat的配置文件,設置賬號、參數等 |
schema.xml | Mycat對應的物理數據庫和數據庫表的配置 |
rule.xml | Mycat分片(分庫分表)規則 |
二、設置配置文件
1、配置server.xml
這裏注意:<property name="schemas">mycatDatabase</property>
2、配置schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="mycatDatabase" checkSQLschema="false" sqlMaxLimit="100" >
<table name="student" dataNode="dn1"></table>
<table name="security_guard" dataNode="dn2"></table>
<table name="teacher" dataNode="dn2"></table>
</schema>
<!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"
/> -->
<!-- 數據庫 school -->
<dataNode name="dn1" dataHost="MydataHost" database="school" />
<!-- 數據庫 人員 -->
<dataNode name="dn2" dataHost="MydataHost1" database="staff_record" />
<dataHost name="MydataHost" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>show status like 'wsrep%'</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="severMast1" url="localhost:3318" user="root" password="root">
</writeHost>
<writeHost host="severMast2" url="localhost:3328" user="root" password="root">
</writeHost>
<!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
</dataHost>
<dataHost name="MydataHost1" maxCon="1000" minCon="10" balance="2"
writeType="0" dbType="mysql" dbDriver="native" switchType="3" slaveThreshold="100">
<heartbeat>show status like 'wsrep%'</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="severMast" url="localhost:3308" user="root" password="root">
<readHost host="severSlave1" url="localhost:3309" user="root" password="root"/>
<readHost host="severSlave2" url="localhost:3310" user="root" password="root"/>
</writeHost>
<!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
</dataHost>
<!--
<dataHost name="sequoiadb1" maxCon="1000" minCon="1" balance="0" dbType="sequoiadb" dbDriver="jdbc">
<heartbeat> </heartbeat>
<writeHost host="hostM1" url="sequoiadb://1426587161.dbaas.sequoialab.net:11920/SAMPLE" user="jifeng" password="jifeng"></writeHost>
</dataHost>
<dataHost name="oracle1" maxCon="1000" minCon="1" balance="0" writeType="0" dbType="oracle" dbDriver="jdbc"> <heartbeat>select 1 from dual</heartbeat>
<connectionInitSql>alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'</connectionInitSql>
<writeHost host="hostM1" url="jdbc:oracle:thin:@127.0.0.1:1521:nange" user="base" password="123456" > </writeHost> </dataHost>
<dataHost name="jdbchost" maxCon="1000" minCon="1" balance="0" writeType="0" dbType="mongodb" dbDriver="jdbc">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM" url="mongodb://192.168.0.99/test" user="admin" password="123456" ></writeHost> </dataHost>
<dataHost name="sparksql" maxCon="1000" minCon="1" balance="0" dbType="spark" dbDriver="jdbc">
<heartbeat> </heartbeat>
<writeHost host="hostM1" url="jdbc:hive2://feng01:10000" user="jifeng" password="jifeng"></writeHost> </dataHost> -->
<!-- <dataHost name="jdbchost" maxCon="1000" minCon="10" balance="0" dbType="mysql"
dbDriver="jdbc"> <heartbeat>select user()</heartbeat> <writeHost host="hostM1"
url="jdbc:mysql://localhost:3306" user="root" password="123456"> </writeHost>
</dataHost> -->
</mycat:schema>
數據庫展示
三、運行與測試
運行mycat startup_nowrap.bat
mycat默認端口:8066
使用server.xml裏配置的賬號鏈接
最後中間件的到數據庫mycatDatabase
如此就能直接在myacat裏連表查詢,完成了分庫關聯
4、個人建議
要完成更復雜的分庫分表需要更靈活的配置
個人建議認真閱讀官方給出的pdf,裏面有很多配置技巧,例如以下說明