1、数据库集群如何考虑数据库自增唯一性
UUID
设置起始值和步长
在数据库集群环境下,默认自增方式存在问题,因为都是从1开始自增,可能会存在重复,应该设置每台节点自增步长不同。查询自增的步长SHOW VARIABLES LIKE 'auto_inc%'修改自增的步长SET @@auto_increment_increment=10;修改起始值SET @@auto_increment_offset=5;假设有两台mysql数据库服务器节点①自增 1 3 5 7 9 11 ….节点②自增 2 4 6 8 10 12 ….注意:在最开始设置好了每台节点自增方式步长后,确定好了mysql集群数量后,无法扩展新的mysql,不然生成步长的规则可能会发生变化
2、垂直拆分与水平拆分
垂直**拆分是把不同的表拆到不同的数据库中,而水平拆分是把同一个表拆到不同的数据库中**。
当mysql中一张表数据超过500万条数据的时候,数据的查询会慢,比如我们一张表有好几亿的数据,那么数据的查询效果就会十分的差;因此就诞生了分库分表
怎样配置分库分表:
分库分表过程中最重要的就是采取什么策略来进行分库分表?
schema.xml配置中配置了Mycat虚拟数据库与真实数据库的映射关系,以及分表分表的路由策略,还有主从复制的配置;
server.xml中配置了连接Mycat虚拟数据库连接中的账号密码信息,可以配置相应的读写权限配合动态切换数据源AbstractRoutingDatasource来进行读写分离;
rule.xml中配置了相应的分库分表具体的策略;
枚举算法:
<?xml version="1.0"?><!DOCTYPE mycat:schema SYSTEM "schema.dtd"><mycat:schema xmlns:mycat="http://io.mycat/"><!-- TESTDB1 是mycat的逻辑库名称,链接需要用的 --><schema name="mycat_testdb" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"><table name="order_info" dataNode="dn1,dn2,dn3" rule="role2" /></schema><!-- database 是MySQL数据库的库名 --><dataNode name="dn1" dataHost="localhost1" database="user_db1" /><dataNode name="dn2" dataHost="localhost1" database="user_db2" /><dataNode name="dn3" dataHost="localhost1" database="user_db3" /><dataHost name="localhost1" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"><heartbeat>select user()</heartbeat><!-- 可以配置多个主从 --><writeHost host="hostM1" url="192.168.212.202:3306" user="root" password="root"><!-- 可以配置多个从库 --><readHost host="hostS2" url="192.168.212.203:3306" user="root" password="root" /></writeHost></dataHost></mycat:schema>
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mycat:server SYSTEM "server.dtd"><mycat:server xmlns:mycat="http://io.mycat/"><!-- 读写都可用的用户 --><user name="root" defaultAccount="true"><property name="password">123456</property><property name="schemas">mycat_testdb</property></user><!-- 只读用户 --><user name="user"><property name="password">user</property><property name="schemas">mycat_testdb</property><property name="readOnly">true</property></user></mycat:server>
rule.xml
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mycat:rule SYSTEM "rule.dtd"><mycat:rule xmlns:mycat="http://io.mycat/"><tableRule name="role2"><rule><columns>name</columns><algorithm>hash-int</algorithm></rule></tableRule><function name="hash-int" class="io.mycat.route.function.PartitionByFileMap"><property name="mapFile">partition-hash-int.txt</property><!-- 如果是数字则为0,如果不是数字则为1---><property name="type">1</property><!-- 如果不在枚举内则默认在第一个库中---><property name="defaultNode">1</property></function></mycat:rule>
partition-hash-int.txt
wuhan=0shanghai=1suzhou=2
求模算法:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mycat:rule SYSTEM "rule.dtd"><mycat:rule xmlns:mycat="http://io.mycat/"><tableRule name="role1"><rule><columns>id</columns><algorithm>mod-long</algorithm></rule></tableRule><function name="mod-long" class="io.mycat.route.function.PartitionByMod"><!--指定分片数量,不可以被更改--><property name="count">3</property></function></mycat:rule>
原理剖析:

