/alexander

distribute sequence service

Primary LanguageJava

##alexander

##intro

anlexander is a distribute sequence service,use multi database generate the unique sequence but not sequential.it is high performance and failure tolerate with multi database except they are all failed.

##key note if we us 4 db generate the unique sequence,the snapshot value of the start time just like form1.

+-----+-----+
| db  |value|
+-----+-----+
| db1 | 0   |
+-----+-----+
| db2 | 1000|   form1
+-----+-----+
| db3 | 2000|
+-----+-----+
| db4 | 3000|
+-----+-----+

when the sequence server try to get the sequence or range, it may be get from the db2,the value will change to 6000, this guarantee the server get the 1000-1999 without get twice.just like form2.

+-----+-----+
| db  |value|
+-----+-----+
| db1 | 0   |
+-----+-----+
| db2 | 6000|  form2
+-----+-----+
| db3 | 2000|
+-----+-----+
| db4 | 3000|
+-----+-----+

we keep such contract in all sequence server ,so the sequence will never be duplicated.

##usage 1.checkout the code and config the sequence.properties in alexander\src\test\resources\conf\

2.create the table in database you config,just like

CREATE TABLE `sequence` (
   `name` VARCHAR(50) COLLATE gbk_chinese_ci DEFAULT NULL,
   `value` INTEGER(11) DEFAULT NULL,
   `gmt_modified` DATETIME DEFAULT NULL,
   `id` INTEGER(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
)ENGINE=InnoDB

3.assembly the package

mvn -Dtest -DfailIfNoTests=false clean package -P build

3.get the alexander-v0.0.1-SNAPSHOT.tar.gz package from the target,and tar -zxvf alexander-v0.0.1-SNAPSHOT.tar.gz,cd xxx/bin,type the start.sh

./start.sh

4.use mysql client to make a connection

$>mysql -ujunyu -p123 -P8507 -hxxx.xxx.xxx.xxx

5.type the command to get the next sequence

mysql>select next_val() where cluster='cluster1' and slice='slice1';
+----------+--------+-------+
| CLUSTER  | SLICE  | VALUE |
+----------+--------+-------+
| cluster1 | slice1 |  7001 |
+----------+--------+-------+
1 row in set (0.02 sec)

or type command to get the next range

mysql>  select next_range() where cluster='cluster1' and slice='slice1';
+----------+--------+-------+-------+
| CLUSTER  | SLICE  | START | END   |
+----------+--------+-------+-------+
| cluster1 | slice1 | 18001 | 19000 |
+----------+--------+-------+-------+
1 row in set (0.01 sec)