Mycat目錄說明
- bin:啟動目錄
-
conf:配置文件目錄
- server.xml:是Mycat服務(wù)器參數(shù)調(diào)整和用戶授權(quán)的配置文件
- schema.xml:是邏輯庫定義和表以及分片定義的配置文件
- rule.xml: 是分片規(guī)則的配置文件朽合,分片規(guī)則的具體一些參數(shù)信息單獨(dú)存放為文件产捞,也在這個目錄下,配置文件修改需要重啟MyCAT
- log4j.xml: 日志存放在logs/log中房交,每天一個文件岛宦,日志的配置是在conf/log4j.xml中套耕,根據(jù)自己的需要可以調(diào)整輸出級別為debug规婆,debug級別下隘谣,會輸出更多的信息,方便排查問題
- autopartition-long.txt,partition-hash-int.txt,sequence_conf.properties破婆, sequence_db_conf.properties 分片相關(guān)的id分片規(guī)則配置文件
- lib:jar包目錄
- logs :日志目錄
- tmlogs:臨時日志目錄
配置文件目錄說明圖:
3大配置文件說明
server.xml
??包含了Mycat需要的系統(tǒng)配置信息涮总,用戶配置信息以及邏輯庫配置信息,源代碼中的映射類為:SystemConfig.class
- 添加如下配置:相當(dāng)于建立了一個叫做mycat用戶祷舀,對應(yīng)密碼為mycat瀑梗,該用戶管理了mycats這個邏輯庫。當(dāng)然了裳扯,也可以為用戶添加管理多個邏輯庫抛丽,以,(英文逗號)分隔開即可
<user name="mycat">
<property name="password">mycat</property>
<property name="schemas">mycats</property><!--schemas:邏輯庫名稱,具體配置在scheme.xml中-->
</user>
schema.xml
??可以說是最重要的配置文件饰豺,管理著 MyCat 的邏輯庫亿鲜、表、分片規(guī)則冤吨、DataNode 以及 DataSource
- schema是實(shí)際邏輯庫的配置狡门,多個schema代表多個邏輯庫
- dataNode是邏輯庫對應(yīng)的分片,如果配置多個分片則需要添加多個dataNode即可
- dataHost是實(shí)際的物理庫配置锅很,可以根據(jù)業(yè)務(wù)需要配置多主其馏、主從等其他配置,多個dataHost代表分片對應(yīng)的物理庫地址爆安,下面的writeHost叛复、readHost代表該分片是否配置多寫,主從扔仓,讀寫分離等高級特性
- 添加如下配置:水平切分褐奥,數(shù)據(jù)按Id取模均勻劃分到兩個數(shù)據(jù)庫中
<schema name="mycats" checkSQLschema="false" sqlMaxLimit="100">
<!-- 邏輯表配置 -->
<table name="tb_user" dataNode="dn1,dn2" rule="mod-long" /><!--name:實(shí)際物理庫的數(shù)據(jù)表名;dataNode:表對應(yīng)的分片翘簇;rule:分片規(guī)則名稱撬码,具體配置在rule.xml中-->
</schema>
<dataNode name="dn1" dataHost="host1" database="mycat1" /><!--name:分片名稱;database:實(shí)際物理庫的數(shù)據(jù)庫名-->
<dataNode name="dn2" dataHost="host1" database="mycat2" />
<dataHost name="host1" maxCon="100" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user()</heartbeat><!--mysql心跳檢測命令-->
<writeHost host="hostM1" url="localhost:3306" user="root" password="xxx" /><!--實(shí)際物理庫的配置信息-->
</dataHost>
rule.xml
??定義了表拆分所涉及到的規(guī)則定義版保。根據(jù)業(yè)務(wù)可以靈活的對表使用不同的分片算法(目前已實(shí)現(xiàn)十余種不同的分片規(guī)則呜笑,對應(yīng)所在源碼包為:io.mycat.route.function)夫否,或者對表使用相同的算法但具體的參數(shù)不同。
- 添加如下配置:水平切分叫胁,數(shù)據(jù)按Id取模均勻劃分到兩個數(shù)據(jù)庫中
<tableRule name="mod-long"> <!-- 對應(yīng)表的分片規(guī)則 -->
<rule>
<columns>id</columns><!-- 對應(yīng)數(shù)據(jù)表要取模的字段名稱 -->
<algorithm>mod-long</algorithm><!-- 對應(yīng)function的名稱 -->
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod"><!-- name:對應(yīng)tableRule的名稱凰慈;class:切分規(guī)則對應(yīng)的切分類 -->
<!-- scheme.xml中有多少個dataNode就改成多少個 -->
<property name="count">2</property>
</function>
代碼測試(SpringBoot + JPA)
- 準(zhǔn)備:在對應(yīng)的數(shù)據(jù)庫中建好相關(guān)的表(下一篇文章將給出JPA自動建表解決方案)
DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user` (
`id` bigint(20) NOT NULL,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
- 添加application.yml:
spring:
jpa:
show-sql: true
hibernate:
ddl-auto: update
naming:
strategy: org.hibernate.cfg.ImprovedNamingStrategy
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL5Dialect
datasource:
url: jdbc:mysql://localhost:8066/mycats?characterEncoding=UTF-8&useSSL=false&autoReconnect=true&rewriteBatchedStatements=true
username: mycat
password: mycat
- 添加User Entity
@Entity
@Table(name = "tb_user")
@Data
public class User {
@Id
private Long id;
private String name;
}
- 添加UserDao
public interface UserDao extends JpaRepository<User, Long> {
Page<User> findByNameLike(String name, Pageable pageable);
}
- 測試添加
@Test
public void testAdd() {
for (long i = 0; i < 50; i++) {
User user = new User();
user.setId(i);
user.setName("ls" + i);
userDao.save(user);
}
}
測試結(jié)果:數(shù)據(jù)按id取模的方式劃分到了兩個數(shù)據(jù)庫中
- 測試模糊查詢+分頁
@Test
public void testFind() {
Pageable pageable = new PageRequest(0, 10, Sort.Direction.ASC, "id");
List<User> userList = userDao.findByNameLike("%ls1%", pageable).getContent();
userList.forEach(System.out::println);
}
測試結(jié)果:按照模糊匹配及id升序的方式輸出結(jié)果
- 刪除及修改請自行測試
參考鏈接
Mycat官網(wǎng)
Mycat從零開始
Mycat權(quán)威指南
GitHub:Mycat-Server
Wiki:Mycat-Server
Issues:Mycat-Server
mysql中間件研究(Atlas,Cobar驼鹅,TDDL)
mysql中間件研究(Atlas微谓,Cobar,TDDL输钩,Mycat豺型,Heisenberg,Oceanus买乃,Vitess姻氨,OneProxy)