Mycat--实践--16--mycat全局主键的生成方式

Mycat–实践–16–mycat全局主键的生成方式

1、Mycat全局主键方式

1.1、本地文件方式

使用服务器本地磁盘文件的方式

1.2、数据库方式(不推荐。要写数据库函数)

使用数据库的方式

1.3、本地时间戳方式

使用时间戳方式

1.4、分布式zookeeper生成ID

2、验证–本地文件方式

2.1、验证

步骤1、修改 server.xml 配置
vim /usr/local/mycat/conf/server.xml 


在这里插入图片描述

步骤2、修改 schema.xml 配置

在这里插入图片描述

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

	<!-- 逻辑库 TESTDB-->
	<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
	 <!-- 
	 逻辑表 sys_user,存在3个数据节点中,分别是dn1,dn2,dn3
	 sharding-by-intfile 是 枚举分片
	 -->
		<!-- 枚举 分片测试 -->
		<table name="sys_user" dataNode="dn1,dn2,dn3" rule="sharding-by-intfile" /> 
		
		<!-- 取模 分片测试 -->
		<table name="sys_dept" dataNode="dn1,dn2,dn3" rule="mod-long" /> 
		
		<!-- 范围约定 分片测试 -->
		<table name="sys_test1" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" /> 
		
		<!-- 固定分片hash算法 分片测试 -->
		<table name="sys_test2" dataNode="dn1,dn2,dn3" rule="rule2" /> 
		
		<!-- jump Consistent hash 分片测试 -->
		<table name="sys_test3" dataNode="dn1,dn2,dn3" rule="jch" /> 
		
		<!-- 自然月  分片测试 -->
		<table name="sys_test4" dataNode="dn1,dn2,dn3,dn4,dn5,dn6,dn7,dn8,dn9,dn10,dn11,dn12" rule="sharding-by-month" /> 
		
		
		<!-- 全局表 -->
		<table name="sys_test5"  dataNode="dn1,dn2,dn3"  primaryKey="ID"  type="global" /> 
		
		<!-- 非全局表 -->
		<table name="sys_test6"  dataNode="dn1,dn2,dn3"  primaryKey="ID" /> 
		
		
		
		<!-- ER表-->
		<!-- 范围约定 分片测试 -->
		<table name="customer" primaryKey="ID" dataNode="dn1,dn2,dn3"  rule="auto-sharding-long"> 
			 <!-- customer_id 是 orders的字段,和customer表的id关联-->
			<childTable name="orders" primaryKey="ID" joinKey="customer_id" 	parentKey="id">
					
				<!-- order_id 是 order_items 的字段,和orders表的id关联-->
				<childTable name="order_items" joinKey="order_id" parentKey="id" />
							
			</childTable>
			<childTable name="customer_addr" primaryKey="ID" joinKey="customer_id" parentKey="id" />
						
		</table>
		
		
		<!-- 主键id》》》本地文件方式 -->
		<table name="sys_test7"  dataNode="dn1,dn2,dn3"  primaryKey="ID" autoIncrement="true" /> 
	</schema>
 
  <!-- 
	 数据节点,因为dataHost都是localhost1,所有dataHost主机有3个库,分别db1,db2,db3
	 
	 -->
	<dataNode name="dn1" dataHost="localhost1" database="db1" />
	<dataNode name="dn2" dataHost="localhost1" database="db2" />
	<dataNode name="dn3" dataHost="localhost1" database="db3" />
 	<dataNode name="dn4" dataHost="localhost1" database="db4" />
	<dataNode name="dn5" dataHost="localhost1" database="db5" />
	<dataNode name="dn6" dataHost="localhost1" database="db6" />
	<dataNode name="dn7" dataHost="localhost1" database="db7" />
	<dataNode name="dn8" dataHost="localhost1" database="db8" />
	<dataNode name="dn9" dataHost="localhost1" database="db9" />
	<dataNode name="dn10" dataHost="localhost1" database="db10" />
	<dataNode name="dn11" dataHost="localhost1" database="db11" />
	<dataNode name="dn12" dataHost="localhost1" database="db12" />
	
 <!-- 
 数据库最大连接是1000,最小连接是10,
 balance="0" 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上
 writeType="0" :所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeHost
 switchType="1":主从切换策略,自动切换
 	 -->
	<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<!-- 心跳检测语句 -->
		<heartbeat>select user()</heartbeat>
		
		<!-- M1主节点 -->
		<writeHost host="M1" url="192.168.187.130:3307" user="root" password="root"> 
			<!-- 从节点 -->
			<readHost host="M1S1" url="192.168.187.130:3308" user="root" password="root" />
			<readHost host="M1S2" url="192.168.187.130:3309" user="root" password="root" />  
		</writeHost>
		  
		
	</dataHost>
	 
</mycat:schema>

步骤3、修改 sequence_conf.properties 注意名字

在这里插入图片描述

# 表名要大写,这里定义主键生成规则
SYS_TEST7.HISIDS=
# 最小id
SYS_TEST7.MINID=1001
# 最大id
SYS_TEST7.MAXID=2000
# 当前id
SYS_TEST7.CURID=1000

步骤4、重启mycat
/usr/local/mycat/bin/mycat  restart
步骤5、创建真实表:sys_test7
CREATE TABLE sys_test7(
  id INT PRIMARY KEY ,
  testname VARCHAR(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

步骤6、插入数据测试
INSERT INTO sys_test7(testname) VALUES('测试1');
INSERT INTO sys_test7(testname) VALUES('测试2');
INSERT INTO sys_test7(testname) VALUES('测试3');
INSERT INTO sys_test7(testname) VALUES('测试4');
INSERT INTO sys_test7(testname) VALUES('测试5');
INSERT INTO sys_test7(testname) VALUES('测试6');
INSERT INTO sys_test7(testname) VALUES('测试7');
INSERT INTO sys_test7(testname) VALUES('测试8');
INSERT INTO sys_test7(testname) VALUES('测试9');
INSERT INTO sys_test7(testname) VALUES('测试10');
INSERT INTO sys_test7(testname) VALUES('测试11');
INSERT INTO sys_test7(testname) VALUES('测试12');

在这里插入图片描述

3、本地时间戳方式

3.1、优缺点

优点

不存在mycat重新发布影响seq的问题,

缺点

如果有时间有波动有问题。

3.2、验证

步骤1、修改 server.xml 配置
vim /usr/local/mycat/conf/server.xml 


在这里插入图片描述

步骤2、修改 schema.xml 配置

在这里插入图片描述

<!-- 主键id》》》本地时间戳方式 -->
<table name="sys_test8"  dataNode="dn1,dn2,dn3"  primaryKey="ID"   type="global"  autoIncrement="true" /> 

步骤3、修改 conf/sequence_time_conf.properties

不动

步骤4、重启mycat
/usr/local/mycat/bin/mycat  restart
步骤5、创建真实表:sys_test8
CREATE TABLE sys_test8(
  id BIGINT  PRIMARY KEY ,
  testname VARCHAR(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

步骤6、插入数据测试
INSERT INTO sys_test8(testname) VALUES('测试1');
INSERT INTO sys_test8(testname) VALUES('测试2');
INSERT INTO sys_test8(testname) VALUES('测试3');
INSERT INTO sys_test8(testname) VALUES('测试4');
INSERT INTO sys_test8(testname) VALUES('测试5');
INSERT INTO sys_test8(testname) VALUES('测试6');
INSERT INTO sys_test8(testname) VALUES('测试7');
INSERT INTO sys_test8(testname) VALUES('测试8');
INSERT INTO sys_test8(testname) VALUES('测试9');
INSERT INTO sys_test8(testname) VALUES('测试10');
INSERT INTO sys_test8(testname) VALUES('测试11');
INSERT INTO sys_test8(testname) VALUES('测试12');

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值