数据库分片

数据库分片即平时说的分库分表

  • 垂直切分:分库(根据不同的业务来分库,即将一个大库折成多个小库),跨数据库查询必须采用接口形式通讯,提高了复杂性,另外,会涉及到分布式事务。
  • 水平切分:分表(将一个表的数据分到多个库,即把一个大表拆成多个小表),跨库 join 性能较差。

数据库拆分有哪些问题:
①自增id问题:可以通过每行产生不同的 UUID值(不递增)或者步长(即节点数据,一开始就要定好)来解决
②数据关联查询问题(水平拆分):性能会有所下降

数据库做了分库分表后,需要在客户端与 DB 服务器之间添加一个中间层,即中间件。

使用 Mycat 分库分表

目前有两台数据库服务器 128 和 130,两台服务器上都有 demodb 数据库,库中都有 cyt 和 t 表(都是空表)。

现希望访问 cyt 表时(比如插入),只访问 128 主机,访问 t 表时(比如插入),同时使用 128 和 130 主机,也就是说,对 t 做了一个水平切分。

1.配置 server.xml

    <user name="appcat">
        <property name="password">appcat</property>
        <property name="schemas">TESTDB</property>
        <property name="readOnly">false</property>
    </user>

2.配置 schema.xml

    <?xml version="1.0"?>
    <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://io.mycat/">
        <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
                <table name="cyt" primaryKey="id" type="global" dataNode="node_db01" />
                <table name="t" primaryKey="id" dataNode="node_db01,node_db02" rule="mod-long" />
        </schema>
    
        <dataNode name="node_db01" dataHost="dataHost01" database="demodb" />
        <dataNode name="node_db02" dataHost="dataHost02" database="demodb" />
    
        <dataHost name="dataHost01" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="server1" url="192.168.111.128:3306" user="app" password="app" />
        </dataHost>
        <dataHost name="dataHost02" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="server1" url="192.168.111.130:3306" user="app" password="app" />
        </dataHost>
    </mycat:schema>

3.修改 rule.xml
我们这儿只有两个节点,而默认 rule.xml 中定义的 mod-long 有3个节点,所以需要修改。

    <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
        <!-- how many data nodes -->
        <property name="count">2</property>
    </function>

4.启动mycat

./bin/mycat star

5.客户端连接

$ mysql -uappcat -pappcat -h192.168.111.133 -P8066

连接后,分别对两张表做一些插入操作,就可以看到:
cyt 表只有 128 主机上的数据库中多了记录,查询时,也只会查询 128 主机中的记录。
t 表在两个主机上均匀分配记录,查询时,会把 128 和 130 两台主机中的记录都查询出来。

Mycat 分片策略

MyCat支持10种分片策略

0、求模算法(根据计算出的模植的不同放到不同的数据库)
1、分片枚举(比如将不同地区定义为枚举常量,然后将记录插入到不同地区的数据库)
2、范围约定
3、日期指定
4、固定分片hash算法
5、通配取模
6、ASCll码求模通配
7、编程指定
8、字符串拆分hash解析
9、一致性hash

-- By 许望(RHCA、OCM、VCP)
最后修改:2020 年 01 月 21 日 11 : 19 AM
如果觉得我的文章对你有用,请随意赞赏