分庫分表和讀寫分離是mycat提供的兩種功能,下文将分别介紹如何落地。
1.分庫分表
1.修改schema.xml
将以下配置複制到檔案中。可變配置請參照修改。
1. <?xml version="1.0"?>
2. <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
3. <mycat:schema xmlns:mycat="http://io.mycat/">
4. <!-- name:server中配置的mycat服務名 -->
5. <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
6. <!-- name:表名 datanode 是資料庫别名 意思是 dn1,dn2中的user表 在mycat服務中生成,是以需要在datanode中的資料庫都需要有user表 rule則是分片政策 而mod-long為分片政策-->
7. <table name="user" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2" rule="mod-long" />
8. </schema>
9.
10. <!-- dn1 dn2對應着上面配置的datanode datahost是下面配置資料源的别名 database:l連接配接到的mysql服務的test資料庫 -->
11. <dataNode name="dn1" dataHost="localhost1" database="test" />
12. <dataNode name="dn2" dataHost="localhost2" database="test" />
13.
14. <!-- name對應着上面 datehost中配置 指定datahost的資料源 -->
15. <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
16. writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
17. <heartbeat>select user()</heartbeat>
18. <!-- can have multi write hosts -->
19. <writeHost host="hostM1" url="localhost:3306" user="root"
20. password="root">
21. </writeHost>
22. </dataHost>
23.
24. <dataHost name="localhost2" maxCon="1000" minCon="10" balance="0"
25. writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
26. <heartbeat>select user()</heartbeat>
27. <!-- can have multi write hosts -->
28. <writeHost host="hostS2" url="192.168.2.134:3306" user="root"
29. password="123">
30. </writeHost>
31. </dataHost>
32. </mycat:schema>
33. 複制代碼
2.效果
當我們往mycat服務插入一條時,在資料庫,dn1和dn2中輪着插入一條資料。
2.讀寫分離
1. <?xml version="1.0"?>
2. <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
3. <mycat:schema xmlns:mycat="http://io.mycat/">
4.
5. <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
6. <!-- auto sharding by id (long) -->
7. <table name="user" primaryKey="id" autoIncrement="true" dataNode="dn1" />
8.
9. </schema>
10.
11. <dataNode name="dn1" dataHost="localhost1" database="test" />
12.
13. <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
14. writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
15. <heartbeat>select user()</heartbeat>
16. <!-- can have multi write hosts -->
17. <writeHost host="hostM1" url="localhost:3306" user="root"
18. password="root">
19. <readHost host="hostM1" url="192.168.2.134:3306" user="root" password="123">
20. </readHost>
21. </writeHost>
22. </dataHost>
23.
24. </mycat:schema>
25. 複制代碼
讀和寫分别操作不同的資料庫。
3.引申
樓主被面試問到了好幾次 :mycat是主庫資料複制到從庫和直接執行sql操作從庫有什麼不同?
1.答案
因為主庫通過io的形式發送binary log 到從庫的relay log中,從庫的relay log存放在 os 緩存中。因為是io操作,是以比執行sql更快。
2.複制的原理概括
- master将改變記錄到二進制日志(binary log)中(這些記錄叫做二進制日志事件,binary log events);
- slave将master的binary log events拷貝到它的中繼日志(relay log);
- slave重做中繼日志中的事件,将更改應用到自己的資料上。
3.複制的原理詳解
- 該過程的第一部分就是master記錄二進制日志。在每個事務更新資料完成之前,master在二日志記錄這些改變。MySQL将事務串行的寫入二進制日志,即使事務中的語句都是交叉執行的。在事件寫入二進制日志完成後,master通知存儲引擎送出事務。
- 下一步就是slave将master的binary log拷貝到它自己的中繼日志。首先,slave開始一個工作線程——I/O線程。I/O線程在master上打開一個普通的連接配接,然後開始binlog dump process。Binlog dump process從master的二進制日志中讀取事件,如果已經跟上master,它會睡眠并等待master産生新的事件。I/O線程将這些事件寫入中繼日志。 SQL slave thread(SQL從線程)處理該過程的最後一步。SQL線程從中繼日志讀取事件,并重放其中的事件而更新slave的資料,使其與master中的資料一緻。隻要該線程與I/O線程保持一緻,中繼日志通常會位于OS的緩存中,是以中繼日志的開銷很小。
- 此外,在master中也有一個工作線程:和其它MySQL的連接配接一樣,slave在master中打開一個連接配接也會使得master開始一個線程。複制過程有一個很重要的限制——複制在slave上是串行化的,也就是說master上的并行更新操作不能在slave上并行操作。
要點:負責在主、從伺服器傳輸各種修改動作的媒介是主伺服器的二進制變更日志,這個日志記載着需要傳輸給從伺服器的各種修改動作。是以,主伺服器必須激活二進制日志功能。從伺服器必須具備足以讓它連接配接主伺服器并請求主伺服器把二進制變更日志傳輸給它的權限。