mycat下載
conf下的schema.xml的配置
:表示的是在mycat中的邏輯庫配置,邏輯庫名稱爲:TESTDB
:表示在mycat中的邏輯表配置,邏輯表名稱爲:user,映射到兩個數據庫節點dataNode中,切分規則爲:rule1(在rule.xml配置):表示數據庫節點,這個節點不一定是單節點,可以配置成讀寫分離.
:真實的數據庫的地址配置
:用戶心跳檢測
:寫庫的配置
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="user" primaryKey="id" dataNode="dn01,dn02" autoIncrement="false" rule="rule1"/>
<!-- 未分庫的表 -->
<table name="city" primaryKey="id" dataNode="dn02" autoIncrement="false" rule="rule2"/>
</schema>
<!-- 設置dataNode 對應的數據庫,及 mycat 連接的地址dataHost -->
<dataNode name="dn01" dataHost="dh01" database="springboot_demo" />
<dataNode name="dn02" dataHost="dh01" database="ssm" />
<!-- mycat 邏輯主機dataHost對應的物理主機.其中也設置對應的mysql登陸信息 -->
<dataHost name="dh01" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user()</heartbeat>
<writeHost host="server1" url="127.0.0.1:3306" user="root" password="113506"/>
</dataHost>
</mycat:schema>
分配規則
-
分片枚舉
-
固定分片 hash 算法
-
範圍約定
-
取模 mod-long
-
按日期(天)分片
-
取模範圍約束
-
截取數字做 hash 求模範圍約束
-
應用指定
-
截取數字 hash 解析
-
一致性 hash
-
按單月小時拆分
-
範圍求模分片
-
日期範圍 hash 分片
-
冷熱數據分片
-
自然月分片
conf/rule.xml 配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
<tableRule name="rule1">
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<tableRule name="rule2">
<rule>
<columns>id</columns>
<algorithm>mod-long2</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">2</property>
</function>
<function name="mod-long2" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">1</property>
</function>
</mycat:rule>
在兩個物理數據庫的創建表
CREATE TABLE user
(
id int PRIMARY KEY ,
name VARCHAR(10)
)
springbootd的配置文件 這裏連接的是mycat
#配置數據源
spring.datasource.druid.driver-class-name=com.mysql.jdbc.Driver
#這裏配置的是Mycat中server.xml中配置賬號密碼,不是數據庫的密碼。
spring.datasource.druid.username=root
spring.datasource.druid.password=123456
#mycat的邏輯庫 端口也是mycat的
spring.datasource.druid.url=jdbc:mysql://172.18.9.166:8066/TESTDB
批量插入數據
@Test
void addList() {
List<User> users = new ArrayList<>();
for (int i = 3; i < 100; i++) {
User user = new User();
//必須設置id,即使物理數據庫的id設置爲自增長都不行
user.setId(i);
user.setName("xiaobu" + i);
users.add(user);
}
int count = userMapper.insertList(users);
System.out.println("count = " + count);
}
查詢
package com.xiaobu.controller;
import com.xiaobu.mapper.UserMapper;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* @author xiaobu
* @version JDK1.8.0_171
* @date on 2019/12/6 10:33
* @description
*/
@RestController
@RequestMapping("user")
public class UserController {
@Resource
private UserMapper userMapper;
@GetMapping("insert")
@ResponseBody
public String insert(){
return null;
}
@GetMapping("selectAll")
@ResponseBody
public String selectAll(){
return userMapper.selectAll().toString();
}
}
可以看到數據插入成功了
mycat 連接屬性
數據查詢
兩個物理表數據存儲情況
springboot_demo.user
ssm.user
參考: