全局序列号 - 数据库方式配置

MyCat Nicholas 2018-11-28 289浏览
相关标签: MyCat

image.png

数据库配置方式:

在数据库中建立一张表,存放sequence 名称(name) sequence 当前值(current-value),步长(increment int 类型每次读取多少个 sequence,假设为 K)等信息


创建全局序列表:

CREATE TABLE MYCAT_SEQUENCE
    (`name` VARCHAR(50) NOT NULL,
    current_value INT NOT NULL,
    increment INT NOT NULL DEFAULT 100,
    PRIMARY KEY(`name`)
) ENGINE=INNODB;


创建分片表:

CREATE TABLE T_CMS_ORDER (
    order_id INT NOT NULL AUTO_INCREMENT  ,
    SERIAL_NUMBER VARCHAR(40),
    tname VARCHAR(10),
    PRIMARY KEY (`order_id`)
);

向 MYCAT_SEQUENCE 插入数据

INSERT INTO mycat_sequence VALUES(UPPER('T_CMS_ORDER'),10000,100);


函数创建函数.sql

###当前值
DELIMITER $$

USE `mycat_node1`$$

DROP FUNCTION IF EXISTS `mycat_seq_currval`$$

CREATE DEFINER=`root`@`%` FUNCTION `mycat_seq_currval`(seq_name VARCHAR(50)) RETURNS VARCHAR(64) CHARSET utf8
    DETERMINISTIC
BEGIN
DECLARE retval VARCHAR(64);
SET retval="-999999999,null";
SELECT CONCAT(CAST(current_value AS CHAR),",",CAST(increment AS CHAR)) INTO retval FROM
MYCAT_SEQUENCE WHERE NAME = seq_name;
RETURN retval;
END$$

DELIMITER ;

//下一值
DELIMITER $$

USE `mycat_node1`$$

DROP FUNCTION IF EXISTS `mycat_seq_nextval`$$

CREATE DEFINER=`root`@`%` FUNCTION `mycat_seq_nextval`(seq_name VARCHAR(50)) RETURNS VARCHAR(64) CHARSET utf8
    DETERMINISTIC
BEGIN
UPDATE MYCAT_SEQUENCE
SET current_value = current_value + increment WHERE NAME = seq_name;
RETURN mycat_seq_currval(seq_name);
END$$

DELIMITER ;

//设置值
DELIMITER $$

USE `mycat_node1`$$

DROP FUNCTION IF EXISTS `mycat_seq_setval`$$

CREATE DEFINER=`root`@`%` FUNCTION `mycat_seq_setval`(seq_name VARCHAR(50),VALUE INTEGER) RETURNS VARCHAR(64) CHARSET utf8
    DETERMINISTIC
BEGIN
UPDATE MYCAT_SEQUENCE
SET current_value = VALUE
WHERE NAME = seq_name;
RETURN mycat_seq_currval(seq_name);
END$$

DELIMITER ;


函数以及数据表mycat_sequence 需创建在同一节点上. 只在一个节点创建就可以.


server.xml 的配置

<property name="sequnceHandlerType">1</property>


sequence_db_conf.properties 的配置

T_CMS_ORDER=dn_hash1


schema.xml 的配置

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
    <schema name="mycat" checkSQLschema="true" sqlMaxLimit="100">
        <table name ="T_CMS_ORDER" primaryKey="order_id" dataNode="dn_hash1,dn_hash2" autoIncrement="true" rule="sharding-by-murmur" />
        <table name="mycat_sequence" primaryKey="name" dataNode="dn_hash1" />
    </schema>
    <dataNode name="dn_hash1" dataHost="jdbchost1" database="mycat_node1" />
    <dataNode name="dn_hash2" dataHost="jdbchost2" database="mycat_node1" />
    <dataHost name="jdbchost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
        <heartbeat>select 1</heartbeat>
        <writeHost host="db195" url="192.168.1.195:3306" user="root" password="zhujie1986">
            <readHost host="db18" url="192.168.1.18:3310" user="root" password="zhujie1986" />
        </writeHost>
    </dataHost>
</mycat:schema>
mysql> select * from mycat_sequence;
+-------------+---------------+-----------+
| name        | current_value | increment |
+-------------+---------------+-----------+
| T_CMS_ORDER |         10000 |       100 |
+-------------+---------------+-----------+
mysql> insert into t_cms_order(SERIAL_NUMBER,tname) values(uuid(),'hihi');
mysql> insert into t_cms_order(SERIAL_NUMBER,tname) values(uuid(),'hihi');
mysql> select * from t_cms_order where tname='hihi';
+----------+--------------------------------------+-------+
| order_id | SERIAL_NUMBER                        | tname |
+----------+--------------------------------------+-------+
|    10100 | 701159e2-e5cb-11e5-aa55-000c2933ef5a | hihi  |
|    10101 | 70beba98-e5cb-11e5-aa55-000c2933ef5a | hihi  |
+----------+--------------------------------------+-------+

############mycat_seq_nextval('T_CMS_ORDER')
insert into t_cms_order(order_id,SERIAL_NUMBER,tname) values(mycat_seq_nextval('T_CMS_ORDER'),uuid(),'hihi');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> show warnings;
Empty set (0.01 sec)
mysql> insert into t_cms_order(order_id,SERIAL_NUMBER,tname) values(mycat_seq_nextval('T_CMS_ORDER'),uuid(),'hihi');
Query OK, 1 row affected, 1 warning (0.01 sec)


相关标签: MyCat
相关文章
1. 问题:分表的自增主键重复 现象: 对point_msg_his和broadcast_msg_his表进行了分表操作,该表有自增主键id,分表键使用的是其他字段。 在sqlmap中的insert语句: <!--table insert--> <insert id="insert" parameterClass="pointMsgHisDO" > insert into&nb继续阅读>>
2018-12-01 600浏览 2个赞
分片规则: 1:官方建议是做成MyCAT Cluster  ,但是测试环境中开启两个MyCAT,会有时而连不上的问题; 2:MyCAT 在修改配置文件之后,可以通过 reload @@config ,在不重启的情况下更新配置:比如修改schema.xml  <table /> <dataNode /> <dataHost />,server.xml 。但是在管理端口看不到修改后的配置信息。 3:对节点、表的扩展操作可以执继续阅读>>
2018-11-28 347浏览 0个赞
数据库配置方式: 在数据库中建立一张表,存放sequence 名称(name) sequence 当前值(current-value),步长(increment int 类型每次读取多少个 sequence,假设为 K)等信息 创建全局序列表: CREATE TABLE MYCAT_SEQUENCE     (`name` VARCHAR(50) NOT NULL,    继续阅读>>
2018-11-28 288浏览 0个赞
表 tdate 的数据水平分布在3 个数据库上 新建3个数据库: CREATE DATABASE db1; CREATE DATABASE db2; CREATE DATABASE db3; 每个数据库新建表: CREATE TABLE `tdate` (    `id` INT(11) NOT NULL,   &nbs继续阅读>>
2018-11-28 411浏览 0个赞
水平拆分:通俗来讲就是将大表按行还拆分 在一般的应用系统中,用户表及其密切相关的关联表,可根据“用户表”(eg:t_user)中的“用户ID”(user_id)进行水平切分,并基于MyCAT的E-R关系分片策略将其密切相关的表(eg:t_user_class_rel)也分到对应的库中。 多(2)实例实现水平拆分:192.168.1.195:3306、192.168.1.18:3306 在每个实例上新建库、表: CREATE DATABAS继续阅读>>
2018-11-28 259浏览 1个赞
垂直切分即常说的分库,降低数据库耦合性。可以配置同一个实例下不同库,不同实例下不同库 schema.xml 配置 <?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://org.opencloudb/"> 继续阅读>>
2018-11-28 184浏览 0个赞
1、安装 JAVA 环境,必须是 JDK7 或更高版本 yum search JDK yum install java-1.7.0 java -version     java version "1.7.0_95"     OpenJDK Runtime Environment (rhel-继续阅读>>
2018-11-28 287浏览 2个赞
版权声明
本站的文章和资源来自互联网或者站长的原创。如果有侵犯版权的资源请尽快联系站长,我们会在24h内删除有争议的资源。