1. 程式人生 > >Mycat實戰之主鍵數據庫自增方式

Mycat實戰之主鍵數據庫自增方式

cas 字節 glob 範圍 整數 switch ats efault db2

創建一個 person表,主鍵為Id,hash方式分片,主鍵自增(采用數據庫方式)

#person表結構如下
Id,主鍵,Mycat自增主鍵
name,字符串,16字節最長
school,畢業學校,數字,1-1000範圍,是學校編號
age,年齡,18-60
addr,地址,32字節,建議為 gz-tianhe(城市-地區兩級 枚舉的仿真數據)
zcode,郵編,
birth,生日,為日期類型,  1980到2010年之間隨機的日期
score,得分,0-100分

1. 機器環境

192.168.2.136   mycat1
192.168.2.135   mysql
192.168.2.134   test

2. mycat參數文件配置

編輯server.xml

[root@localhost conf]# more /usr/local/mycat/conf/server.xml |grep sequnceHandlerType
                <!--<property name="sequnceHandlerType">0</property>-->


#0 代表文件方式,
#1 代表數據庫方式
#2 代表本地時間戳方式

技術分享圖片

重啟mycat生效 登陸管理端口驗證

[root@localhost conf]# mycat restart
Stopping Mycat-server...
Stopped Mycat-server.
Starting Mycat-server...

技術分享圖片

3.數據庫配置,創建 sequence 相關的表以及 function

#所有操作都在 db1 上
#創建 MYCAT_SEQUENCE 表
DROP TABLE IF EXISTS MYCAT_SEQUENCE;
– name sequence 名稱
– current_value 當前 value
– increment 增長步長!   mycat在數據庫中一次讀取多少個sequence 

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;

#插入一條 sequence
INSERT INTO MYCAT_SEQUENCE(name,current_value,increment) VALUES (‘PERSON’,
100000, 100);

#創建相關 function
#獲取當前 sequence 的值 (返回當前值,增量)
DROP FUNCTION IF EXISTS mycat_seq_currval;
DELIMITER ;;
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 ;


#設置 sequence 值
DROP FUNCTION IF EXISTS mycat_seq_setval;
DELIMITER ;;
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 ;

#獲取下一個 sequence 值
DROP FUNCTION IF EXISTS `mycat_seq_nextval`;
DELIMITER ;;
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 ;

4.修改mycat 相關配置

sequence_db_conf.properties

[root@mysqldb conf]# vi sequence_db_conf.properties
#sequence stored in datanode
GLOBAL=dn1
COMPANY=dn1
CUSTOMER=dn1
ORDERS=dn1
PERSON=dn1

配置schema.xml

<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
            <table name="person" primaryKey="id" autoIncrement="true"
                   dataNode="dn1,dn2,dn3" rule="sharding-by-murmurperson" />
        
    </schema>


    <dataNode name="dn1" dataHost="mysqlserver" database="db1" />
    <dataNode name="dn2" dataHost="mysqlserver" database="db2" />
    <dataNode name="dn3" dataHost="mysqlserver" database="db3" />


    <!--######### TESTDB  ########-->
    <dataHost name="mysqlserver" maxCon="1000" minCon="10" balance="0"
            writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
            <heartbeat>select user()</heartbeat>
            <writeHost host="hostM1" url="192.168.2.135:3306" user="root" password="root123">
            </writeHost>
    </dataHost>
</mycat:schema> 

配置rule.xml


id
murmur

     <function name="murmur"
            class="org.opencloudb.route.function.PartitionByMurmurHash">
            <property name="seed">0</property><!-- 默認是0 -->
            <property name="count">2</property><!-- 要分片的數據庫節點數量,必須指定,否則沒法分片 -->
            <property name="virtualBucketTimes">160</property><!-- 一個實際的數據庫節點被映射為這麽多虛擬節點,默認是160倍,也就是虛擬節點數是物理節點數的160倍 -->
            <!-- <property name="weightMapFile">weightMapFile</property> 節點的權重,沒有指定權重的節點默認是1。以properties文件的格式填寫,以從0開始到count-1的整數值也就是節點索引為key,以節點權重值為值。所有權重值必須是正整數,否則以1代替 -->
            <!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property> 
                    用於測試時觀察各物理節點與虛擬節點的分布情況,如果指定了這個屬性,會把虛擬節點的murmur hash值與物理節點的映射按行輸出到這個文件,沒有默認值,如果不指定,就不會輸出任何東西 -->
    </function>

重啟mycat

[root@mycat conf]# mycat restart
Stopping Mycat-server...
Mycat-server was not running.

[mysql@mycat ~]$  mysql -utest -ptest  -h192.168.2.136 -P8066
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.5.8-mycat-1.5.1-RELEASE-20161130213509 MyCat Server (OpenCloundDB)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
mysql> 
mysql> use TESTDB;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+------------------+
| Tables in TESTDB |
+------------------+
| person           |
+------------------+
1 row in set (0.00 sec)

5 mycat中創建person表並插入數據驗證

#創建 person 表:
CREATE TABLE person(id INT AUTO_INCREMENT PRIMARY KEY,NAME VARCHAR(16),school INT, 
             age INT, addr VARCHAR(32),zcode VARCHAR(6),birth DATETIME,score INT) ;

#插入數據 
insert into person(id,name, school, age, addr, zcode, birth, score) 
       values(NEXT VALUE FOR MYCATSEQ_PERSON,'xiaoxu', 100, 30,
       'shanghai-jiuting','072450','1987-02-01',100);

技術分享圖片

插入成功!!!

Mycat實戰之主鍵數據庫自增方式