Mycat之——设置全局自增id

在《Mycat之——实现MySQL的水平分表》一文中,我们将商城数据库的订单数据库中的order_master数据表,根据customer_id字段进行了水平切分,当我们通过Mycat向order_master数据表中插入数据后,再通过Mycat查询order_master数据表中的数据时,发现通过Mycat查询出来的数据中,order_id字段有很多重复的值。这是由于在orderdb01orderdb04数据库中的order_master数据表的主键order_id都是设置为整型的自增类型,也就是说在orderdb01orderdb04数据库中的order_master数据表的主键都是从1开始自增,这就导致了通过Mycat查询order_master数据表的数据时,出现大量重复的主键值。

那么,如何解决上述问题呢?

Mycat中提供了全局自增id的功能,可以解决这个问题!

如何进行操作呢

此时,我们在Mycat所在的binghe151服务器上,安装MySQL数据库。

如果需要安装MySQL 8.x版本,则可以参考《MySQL之——源码编译MySQL8.x+升级gcc+升级cmake(亲测完整版)

如果需要安装MySQL 5.x版本,则可以参考《MySQL之——CentOS6.5 编译安装MySQL5.6或5.7

安装之后,登录MySQL命令行,如下所示。

[root@binghe151 ~]# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 33926
Server version: 8.0.18 binghe edition

Copyright (c) 2000, 2019, 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命令行,而不是Mycat命令行。接下来,在MySQL命令行新建一个mycat数据库,如下所示。

mysql> create database mycat;
Query OK, 1 row affected (2.52 sec)

注意:其实这个mycat数据库建立在binghe152~binghe158服务器上的任意一个MySQL实例上都可以,这里,我为了将mycat数据库与商城的业务数据库分开,就单独在binghe151服务器上再次安装一个MySQL来创建mycat数据库。

接下来,我们需要在mycat数据库中初始化数据表和一些数据值,需要的数据表和数据值可以通过运行Mycat安装目录下的conf目录下的dbseq.sql脚本来进行初始化。接下来,我们将dbseq.sql脚本导入到mycat数据库中,如下所示。

[root@binghe151 ~]# mysql -uroot -p mycat < /usr/local/mycat/conf/dbseq.sql 
Enter password: 

导入完成后,我们在MySQL命令行查看下mycat下的数据表,如下所示。

mysql> use mycat;
Database changed
mysql> show tables;
+-----------------+
| Tables_in_mycat |
+-----------------+
| mycat_sequence  |
+-----------------+
1 row in set (0.98 sec)

mysql> select * from mycat_sequence;
+--------+---------------+-----------+
| name   | current_value | increment |
+--------+---------------+-----------+
| GLOBAL |             1 |         1 |
+--------+---------------+-----------+
1 row in set (0.03 sec)

查看mycat数据库中存在的函数,如下所示。

mysql> show function status like 'mycat%' \G
*************************** 1. row ***************************
                  Db: mycat
                Name: mycat_seq_currval
                Type: FUNCTION
             Definer: root@localhost
            Modified: 2020-03-01 22:06:11
             Created: 2020-03-01 22:06:11
       Security_type: DEFINER
             Comment: 
character_set_client: utf8mb4
collation_connection: utf8mb4_general_ci
  Database Collation: utf8mb4_0900_ai_ci
*************************** 2. row ***************************
                  Db: mycat
                Name: mycat_seq_nextval
                Type: FUNCTION
             Definer: root@localhost
            Modified: 2020-03-01 22:06:11
             Created: 2020-03-01 22:06:11
       Security_type: DEFINER
             Comment: 
character_set_client: utf8mb4
collation_connection: utf8mb4_general_ci
  Database Collation: utf8mb4_0900_ai_ci
*************************** 3. row ***************************
                  Db: mycat
                Name: mycat_seq_nextvals
                Type: FUNCTION
             Definer: root@localhost
            Modified: 2020-03-01 22:06:12
             Created: 2020-03-01 22:06:12
       Security_type: DEFINER
             Comment: 
character_set_client: utf8mb4
collation_connection: utf8mb4_general_ci
  Database Collation: utf8mb4_0900_ai_ci
*************************** 4. row ***************************
                  Db: mycat
                Name: mycat_seq_setval
                Type: FUNCTION
             Definer: root@localhost
            Modified: 2020-03-01 22:06:12
             Created: 2020-03-01 22:06:12
       Security_type: DEFINER
             Comment: 
character_set_client: utf8mb4
collation_connection: utf8mb4_general_ci
  Database Collation: utf8mb4_0900_ai_ci
4 rows in set (0.00 sec)

接下来,我们还需要对server.xml文件进行相应的修改。这里,将server.xml文件中的system标签下的sequenceHandlerType的值修改为1,没有配置这个选项的话,就增加这个配置项,如下所示。

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

接下来,在schema.xml文件中新增一个dataHost节点,这个节点就是mycat数据库所在的服务器节点,如下所示。

<dataHost name="binghe151" maxCon="1000" minCon="10" balance="1"
          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
    <heartbeat>select user()</heartbeat>
    <writeHost host="binghe51" url="192.168.175.151:3306" user="mycat" password="mycat"/>
</dataHost>

此时,需要在binghe151服务器的MySQL中创建mycat用户。

如果大家安装的是MySQL 8.x版本,则在MySQL命令行执行如下命令。

CREATE USER 'mycat'@'192.168.175.%' IDENTIFIED BY 'mycat';
ALTER USER 'mycat'@'192.168.175.%' IDENTIFIED WITH mysql_native_password BY 'mycat'; 
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE  ON *.* TO 'mycat'@'192.168.175.%';
FLUSH PRIVILEGES;

如果大家安装的是MySQL 5.x版本,则在MySQL命令行执行如下命令。

GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE  ON *.* TO 'mycat'@'192.168.175.%' IDENTIFIED BY 'mycat';
FLUSH PRIVILEGES;

注意:在binghe151服务器上的MySQL数据库中增加的mycat用户除了需要具有对数据库的增删改查权限外,还需要具有执行函数的权限。

接下来,需要在schema.xml文件中新增一个数据节点,如下所示。

<dataNode name="mycat" dataHost="binghe151" database="mycat" />

另外,我们还需要在Mycat安装目录下的conf目录中修改sequence_db_conf.properties文件,如下所示。

vim /usr/local/mycat/conf/sequence_db_conf.properties

修改后的equence_db_conf.properties文件中的内容如下所示。

GLOBAL=mycat
order_master=mycat

接下来,我们在binghe151服务器上登录MySQL命令行,向mycat数据库中的mycat_sequence数据表插入数据,如下所示。

mysql> use mycat;
Database changed
mysql> show tables;
+-----------------+
| Tables_in_mycat |
+-----------------+
| mycat_sequence  |
+-----------------+
1 row in set (0.21 sec)

mysql> insert into mycat_sequence values ('order_master',1,1);
Query OK, 1 row affected (0.65 sec)

mysql> select * from mycat_sequence;
+--------------+---------------+-----------+
| name         | current_value | increment |
+--------------+---------------+-----------+
| GLOBAL       |             1 |         1 |
| order_master |             1 |         1 |
+--------------+---------------+-----------+
2 rows in set (0.00 sec)

此时,可以看到mycat_sequence数据表中多了一条名称为order_master的数据。

接下来就需要告诉Mycat如何使用全局自增id了。

如何使用全局自增id?

需要在schema.xml文件中进行配置,对order_master数据表开启全局自增id,需要在order_master表的配置中新增一个autoIncrement="true"的属性配置,如下所示。

<table name="order_master" primaryKey="order_id" dataNode = "orderdb01,orderdb02,orderdb03,orderdb04" rule="order_master" autoIncrement="true"/>

接下来,重启Mycat,使配置生效。此时,使用Mycat向order_master数据表中插入数据后,再通过Mycat查询order_master数据表中的数据,发现order_id主键的值不再有重复了。说明全局id配置生效。

Mycat之——设置全局自增idMycat之——设置全局自增id 冰 河 博客专家 发布了1322 篇原创文章 · 获赞 2046 · 访问量 518万+ 他的留言板 关注
上一篇:使用mycat做Mysql读写分离


下一篇:强化学习笔记:DQN和DDQN