Java面试篇【MyCat】常见面试题(2024最新)

Mycat

1.Mycat

分库分表中间件,将存放在一个数据库的数据存放在不同的多个数据库中。来分散负载。
在这里插入图片描述

  1. scheme 逻辑库,对应mysql的数据库,一个逻辑库定义了包含的所有table.是数据库集群对外的统一访问接口。
  2. table 逻辑表,和物理数据库存储的一张表类似。
    这里的表格需要声明所存储的逻辑数据节点,datanode。这里可以指定分片规则。
  3. DataNode 逻辑数据节点,存放table的具体物理节点,通过datasource来关联到后端的某个具体数据库上
  4. datasource,定义某个物理库的访问地址,用于捆绑到datanode上。

2.垂直切分与水平切分的不同

垂直切分,一个表很大字段很多,将它拆成多个表。比如订单表,有一些常见的不变的字段,比如订单金额之类的,下单人,电话留言等信息。还有一些状态信息,下单时间,发货时间,付款时间,退货时间以及对应的状态变化等等,将这两个就可以垂直拆分成两个表。
优点:拆分后业务清晰,拆分规则明确。
缺点:部分业务表无法join,只能通过接口解决,提高系统复杂度。
水平切分:根据表中的数据的逻辑关系,将一张表的数据按照某种条件拆分到多台数据库上面。
比如将用户id,取模,为1进第一个库,为2,3,0进2,3,4库。
优点:负载均衡的更好。
缺点:拆分规则不好想象,扩展和维护比较难,join比较难。

3.核心配置文件

scheme.xml 配置逻辑库,逻辑表,数据节点,节点主机

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
    <schema name="mydatabase" checkSQLschema="true" sqlMaxLimit="100">
        <table name="t_user" dataNode="dn1,dn2,dn3" primaryKey="id" rule="auto-sharding-long">
            <childTable name="t_loginlog" primaryKey="id" joinKey="user_id" parentKey="id"></childTable>
        </table>
        <table name="t_student" dataNode="dn1,dn3" primaryKey="id" rule="student_id" />
        <table name="t_dictionaries" dataNode="dn1,dn2,dn3" type="global" />
        <table name="t_teacher" dataNode="dn1" />
    </schema>
        <dataNode name="dn1" dataHost="dtHost1" database="db1" />
        <dataNode name="dn2" dataHost="dtHost1" database="db2" />
        <dataNode name="dn3" dataHost="dtHost2" database="db3" />
    <!--
    name:节点名称,在上方dataNode标签中调用
    maxCon:底层数据库的链接最大数
    minCon:底层数据库的链接最小数
    balance:值可以为0,1,2,3,分别表示对当前datahost中维护的数据库们的读操作逻辑
    0:不开启读写分离,所有的读写操作都在最小的索引号的writeHost(第一个writeHost标签)
    1:全部的readHost和备用writeHost都参与读数据的平衡,如果读的请求过多,负责写的第一个writeHost也分担一部分
    2 :所有的读操作,都随机的在所有的writeHost和readHost中进行
    3 :所有的读操作,都到writeHost对应的readHost上进行(备用writeHost不参加了),在集群中没有配置ReadHost的情况下,读都到第一个writeHost完成
    writeType:控制当前datahost维护的数据库集群的写操作
    0:所有的写操作都在第一个writeHost标签的数据库进行
    1:所有的写操作,都随机分配到所有的writeHost(mycat1.5完全不建议配置了)
    dbtype:数据库类型(不同数据库配置不同名称,mysql)
    dbDriver:数据库驱动,native,动态获取
    switchType:切换的逻辑
    -1:故障不切换
    1:故障切换,当前写操作的writeHost故障,进行切换,切换到下一个writeHost;
    slaveThreshold:标签中的<heartbeat>用来检测后端数据库的心跳sql语句;本属性检查从节点与主节点的同步情况(延迟时间数),配合心
    跳语句show slave status; 读写分离时,所有的readHost的数据都可靠
    -->
    <dataHost name="dtHost1" maxCon="1000" minCon="10" balance="1"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <!--用于验证心跳,这个是mysql主库的配置-->
        <heartbeat>select user()</heartbeat>
        <writeHost host="127.0.0.1" url="192.168.199.11:3306" user="root" password="123456">
            <readHost host="127.0.0.1" url=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你不懂、、、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值