1、数据库集群如何考虑数据库自增唯一性
    UUID
    设置起始值和步长

    1. 在数据库集群环境下,默认自增方式存在问题,因为都是从1开始自增,可能会存在重复,应该设置每台节点自增步长不同。
    2. 查询自增的步长
    3. SHOW VARIABLES LIKE 'auto_inc%'
    4. 修改自增的步长
    5. SET @@auto_increment_increment=10;
    6. 修改起始值
    7. SET @@auto_increment_offset=5;
    8. 假设有两台mysql数据库服务器
    9. 节点①自增 1 3 5 7 9 11 ….
    10. 节点②自增 2 4 6 8 10 12 ….
    11. 注意:在最开始设置好了每台节点自增方式步长后,确定好了mysql集群数量后,无法扩展新的mysql,不然生成步长的规则可能会发生变化

    2、垂直拆分与水平拆分
    2019-11-05_172212.png
    垂直**拆分是把不同的表拆到不同的数据库中,而水平拆分是把同一个表拆到不同的数据库中**。

    当mysql中一张表数据超过500万条数据的时候,数据的查询会慢,比如我们一张表有好几亿的数据,那么数据的查询效果就会十分的差;因此就诞生了分库分表

    怎样配置分库分表:
    分库分表过程中最重要的就是采取什么策略来进行分库分表?
    2019-11-05_183839.png

    schema.xml配置中配置了Mycat虚拟数据库与真实数据库的映射关系,以及分表分表的路由策略,还有主从复制的配置;
    server.xml中配置了连接Mycat虚拟数据库连接中的账号密码信息,可以配置相应的读写权限配合动态切换数据源AbstractRoutingDatasource来进行读写分离;
    rule.xml中配置了相应的分库分表具体的策略;

    枚举算法:

    1. <?xml version="1.0"?>
    2. <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
    3. <mycat:schema xmlns:mycat="http://io.mycat/">
    4. <!-- TESTDB1 是mycat的逻辑库名称,链接需要用的 -->
    5. <schema name="mycat_testdb" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
    6. <table name="order_info" dataNode="dn1,dn2,dn3" rule="role2" />
    7. </schema>
    8. <!-- database 是MySQL数据库的库名 -->
    9. <dataNode name="dn1" dataHost="localhost1" database="user_db1" />
    10. <dataNode name="dn2" dataHost="localhost1" database="user_db2" />
    11. <dataNode name="dn3" dataHost="localhost1" database="user_db3" />
    12. <dataHost name="localhost1" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
    13. <heartbeat>select user()</heartbeat>
    14. <!-- 可以配置多个主从 -->
    15. <writeHost host="hostM1" url="192.168.212.202:3306" user="root" password="root">
    16. <!-- 可以配置多个从库 -->
    17. <readHost host="hostS2" url="192.168.212.203:3306" user="root" password="root" />
    18. </writeHost>
    19. </dataHost>
    20. </mycat:schema>
    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <!DOCTYPE mycat:server SYSTEM "server.dtd">
    3. <mycat:server xmlns:mycat="http://io.mycat/">
    4. <!-- 读写都可用的用户 -->
    5. <user name="root" defaultAccount="true">
    6. <property name="password">123456</property>
    7. <property name="schemas">mycat_testdb</property>
    8. </user>
    9. <!-- 只读用户 -->
    10. <user name="user">
    11. <property name="password">user</property>
    12. <property name="schemas">mycat_testdb</property>
    13. <property name="readOnly">true</property>
    14. </user>
    15. </mycat:server>

    rule.xml

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <!DOCTYPE mycat:rule SYSTEM "rule.dtd">
    3. <mycat:rule xmlns:mycat="http://io.mycat/">
    4. <tableRule name="role2">
    5. <rule>
    6. <columns>name</columns>
    7. <algorithm>hash-int</algorithm>
    8. </rule>
    9. </tableRule>
    10. <function name="hash-int" class="io.mycat.route.function.PartitionByFileMap">
    11. <property name="mapFile">partition-hash-int.txt</property>
    12. <!-- 如果是数字则为0,如果不是数字则为1--->
    13. <property name="type">1</property>
    14. <!-- 如果不在枚举内则默认在第一个库中--->
    15. <property name="defaultNode">1</property>
    16. </function>
    17. </mycat:rule>

    partition-hash-int.txt

    1. wuhan=0
    2. shanghai=1
    3. suzhou=2

    求模算法:

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <!DOCTYPE mycat:rule SYSTEM "rule.dtd">
    3. <mycat:rule xmlns:mycat="http://io.mycat/">
    4. <tableRule name="role1">
    5. <rule>
    6. <columns>id</columns>
    7. <algorithm>mod-long</algorithm>
    8. </rule>
    9. </tableRule>
    10. <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
    11. <!--指定分片数量,不可以被更改-->
    12. <property name="count">3</property>
    13. </function>
    14. </mycat:rule>

    数据库技术-MyCat分表分库策略资料.zip

    原理剖析:
    QQ图片20191105190813.jpg

    QQ图片20191105190805.jpg