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

news2025/1/18 2:00:43

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="192.168.199.12:3306" user="root" password="123456" />
        </writeHost>
    </dataHost>
    <dataHost name="dtHost2" 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.13:3306" user="root" password="123456">
            <readHost host="127.0.0.1" url="192.168.199.13:3306" user="root" password="123456" />
        </writeHost>
    </dataHost>
</mycat:schema>

server.xml 连接mycat的用户信息,账号密码

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
    <system>
    <!--配置的端口号-->
    <property name="serverPort">8066</property>
    <property name="nonePasswordLogin">0</property> <!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户-->
    <property name="useHandshakeV10">1</property>
    <property name="useSqlStat">0</property>  <!-- 1为开启实时统计、0为关闭 -->
    <property name="useGlobleTableCheck">0</property>  <!-- 1为开启全加班一致性检测、0为关闭 -->
        <property name="sequnceHandlerType">2</property>
    <property name="subqueryRelationshipCheck">false</property> <!-- 子查询中存在关联查询的情况下,检查关联字段中是否有分片字段 .默认 false -->
        <!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena | type 2 NettyBufferPool -->
        <property name="processorBufferPoolType">0</property>
        <!--默认是65535 64K 用于sql解析时最大文本长度 -->
        <!--<property name="maxStringLiteralLength">65535</property>-->
        <!--<property name="sequnceHandlerType">0</property>-->
        <!--<property name="backSocketNoDelay">1</property>-->
        <!--<property name="frontSocketNoDelay">1</property>-->
        <!--<property name="processorExecutor">16</property>-->
        <!--
            <property name="serverPort">8066</property> <property name="managerPort">9066</property> 
            <property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property> 
            <property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> -->
        <!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,但是记录分布式事务日志-->
        <property name="handleDistributedTransactions">0</property>
            <!--
            off heap for merge/order/group/limit      1开启   0关闭
        -->
        <property name="useOffHeapForMerge">1</property>
        <!--
            单位为m
        -->
        <property name="memoryPageSize">64k</property>
        <!--
            单位为k
        -->
        <property name="spillsFileBufferSize">1k</property>
        <property name="useStreamOutput">0</property>
        <!--
            单位为m
        -->
        <property name="systemReserveMemorySize">384m</property>
        <!--是否采用zookeeper协调切换  -->
        <property name="useZKSwitch">false</property>
        <!-- XA Recovery Log日志路径 -->
        <!--<property name="XARecoveryLogBaseDir">./</property>-->
        <!-- XA Recovery Log日志名称 -->
        <!--<property name="XARecoveryLogBaseName">tmlog</property>-->
        <!--如果为 true的话 严格遵守隔离级别,不会在仅仅只有select语句的时候在事务中切换连接-->
        <property name="strictTxIsolation">false</property>
        <property name="useZKSwitch">true</property>
    </system>
    <!-- 全局SQL防火墙设置 -->
    <!--白名单可以使用通配符%或着*-->
    <!--例如<host host="127.0.0.*" user="root"/>-->
    <!--例如<host host="127.0.*" user="root"/>-->
    <!--例如<host host="127.*" user="root"/>-->
    <!--例如<host host="1*7.*" user="root"/>-->
    <!--这些配置情况下对于127.0.0.1都能以root账户登录-->
    <!-- 此处是开放了本机和外网的请求链接,因为我的mycat安装在虚拟机上,所以本机是通过ip链接
    192.*是为了让navicat可以连接使用(配置完整的虚拟机IP也可以)
    127.*是为了让虚拟机本身可以通过命令连接-->
    <firewall>
       <whitehost>
          <host host="192.*" user="root"/>
          <host host="127.*" user="root"/>
       </whitehost>
       <blacklist check="false">
       </blacklist>
    </firewall>
    <!-- 此处定义了一个root用户,可以管理的逻辑库为mydatabase,对应schema.xml中的<schema name="mydatabase" > -->
    <user name="root" defaultAccount="true">
        <property name="password">123456</property>
        <property name="schemas">mydatabase</property>
        <!-- 表级 DML 权限设置 -->
        <!--         
        <privileges check="false">
            <schema name="TESTDB" dml="0110" >
                <table name="tb01" dml="0000"></table>
                <table name="tb02" dml="1111"></table>
            </schema>
        </privileges>        
         -->
    </user>
    <!--<user name="user">
        <property name="password">123456</property>
        <property name="schemas">mycat1,test3</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/">
<!--schema.xml中配置的rule="student_id" 所对应的规则,规则对应主键,
列名为id需要与数据库的列名对应algorithm对应下方function-->
    <tableRule name="student_id">
        <rule>
            <columns>id</columns>
            <algorithm>student_text</algorithm>
        </rule>
    </tableRule>
    <tableRule name="rule1">
        <rule>
            <columns>id</columns>
            <algorithm>func1</algorithm>
        </rule>
    </tableRule>
    <tableRule name="rule2">
        <rule>
            <columns>user_id</columns>
            <algorithm>func1</algorithm>
        </rule>
    </tableRule>
    <tableRule name="sharding-by-intfile">
        <rule>
            <columns>sharding_id</columns>
            <algorithm>hash-int</algorithm>
        </rule>
    </tableRule>
    <tableRule name="auto-sharding-long">
        <rule>
            <columns>id</columns>
            <algorithm>rang-long</algorithm>
        </rule>
    </tableRule>
    <tableRule name="mod-long">
        <rule>
            <columns>id</columns>
            <algorithm>mod-long</algorithm>
        </rule>
    </tableRule>
    <tableRule name="sharding-by-murmur">
        <rule>
            <columns>id</columns>
            <algorithm>murmur</algorithm>
        </rule>
    </tableRule>
    <tableRule name="crc32slot">
        <rule>
            <columns>id</columns>
            <algorithm>crc32slot</algorithm>
        </rule>
    </tableRule>
    <tableRule name="sharding-by-month">
        <rule>
            <columns>create_time</columns>
            <algorithm>partbymonth</algorithm>
        </rule>
    </tableRule>
    <tableRule name="latest-month-calldate">
        <rule>
            <columns>calldate</columns>
            <algorithm>latestMonth</algorithm>
        </rule>
    </tableRule>
    <tableRule name="auto-sharding-rang-mod">
        <rule>
            <columns>id</columns>
            <algorithm>rang-mod</algorithm>
        </rule>
    </tableRule>
    <tableRule name="jch">
        <rule>
            <columns>id</columns>
            <algorithm>jump-consistent-hash</algorithm>
        </rule>
    </tableRule>
<!--在conf中需要添加student_text.txt规则文件-->
<!--
文件内容:
    0-1M=0
    1M-2M=1
-->
 <function name="student_text"
        class="io.mycat.route.function.AutoPartitionByLong">
        <property name="mapFile">student_text.txt</property>
    </function>
    <function name="murmur"
        class="io.mycat.route.function.PartitionByMurmurHash">
        <property name="seed">0</property><!-- 默认是0 -->
        <property name="count">2</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 -->
        <property name="virtualBucketTimes">160</property><!-- 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,也就是虚拟节点数是物理节点数的160倍 -->
        <!-- <property name="weightMapFile">weightMapFile</property> 节点的权重,没有指定权重的节点默认是1。以properties文件的格式填写,以从0开始到count-1的整数值也就是节点索引为key,以节点权重值为值。所有权重值必须是正整数,否则以1代替 -->
        <!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property> 
            用于测试时观察各物理节点与虚拟节点的分布情况,如果指定了这个属性,会把虚拟节点的murmur hash值与物理节点的映射按行输出到这个文件,没有默认值,如果不指定,就不会输出任何东西 -->
    </function>
    <function name="crc32slot"
              class="io.mycat.route.function.PartitionByCRC32PreSlot">
    </function>
    <function name="hash-int"
        class="io.mycat.route.function.PartitionByFileMap">
        <property name="mapFile">partition-hash-int.txt</property>
    </function>
    <function name="rang-long"
        class="io.mycat.route.function.AutoPartitionByLong">
        <property name="mapFile">autopartition-long.txt</property>
    </function>
    <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
        <!-- how many data nodes -->
        <property name="count">3</property>
    </function>
    <function name="func1" class="io.mycat.route.function.PartitionByLong">
        <property name="partitionCount">8</property>
        <property name="partitionLength">128</property>
    </function>
    <function name="latestMonth"
        class="io.mycat.route.function.LatestMonthPartion">
        <property name="splitOneDay">24</property>
    </function>
    <function name="partbymonth"
        class="io.mycat.route.function.PartitionByMonth">
        <property name="dateFormat">yyyy-MM-dd</property>
        <property name="sBeginDate">2015-01-01</property>
    </function>
    <function name="rang-mod" class="io.mycat.route.function.PartitionByRangeMod">
            <property name="mapFile">partition-range-mod.txt</property>
    </function>
    <function name="jump-consistent-hash" class="io.mycat.route.function.PartitionByJumpConsistentHash">
        <property name="totalBuckets">3</property>
    </function>
</mycat:rule>

未完待续,祝大家明天面试顺利。很多知识目前都是为了面试,很凌乱,以后补充。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1496560.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++的类与对象(三)

目录 类的6个默认成员函数 构造函数 语法 特性 析构函数 特性 对象的销毁顺序​​​​​​​ 类的6个默认成员函数 问题&#xff1a;一个什么成员都没的类叫做空类&#xff0c;空类中真的什么都没有吗&#xff1f; 基本概念&#xff1a;任何类在什么都不写时&#xff…

【Linux C | 网络编程】多播的概念、多播地址、UDP实现广播的C语言例子

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

[OpenWrt 22.03] ttylogin添加登录密码与禁止登录的配置

ttylogin 的使用 Openwrt 串口默认是没有密码的。Openwrt启动后,一个默认的密码将被启用去保护ssh登录和页面(http)登录,而串口登录密码却是空缺的。 对于 Openwrt,当内核初始化后,就会启动第一个进程 init,init进程会进行一系列的系统初始化工作,然后会读取 /etc/in…

vue 使用element plus 菜单时,折叠文字不消失

问题&#xff1a; 菜单折叠时&#xff0c;title文本无法消失&#xff0c;同时下拉箭头还会存在 解决方法&#xff1a; 查看项目中是否有div标签 原因 div和p标签都是块级元素&#xff0c;可能是这个原因 所以把项目中的p标签改为span标签 div改为template即可解决

java当中的栈和队列

一、Java中的栈 1.常用方法 注意上面的peek()方法和pop()方法的区别&#xff01; 2.实例 import java.util.Stack; public class StackTest { public static void main(String[] args) { Stack<String> stack new Stack<String>(); System.out.println(&qu…

Clion调试QT程序qDebug()、cout控制台无输出的可能解决方法

qDebug()不输出 在当前项目配置中添加一个环境变量 方法一、单独为配置 QT_ASSUME_STDERR_HAS_CONSOLE1 方法二、全局配置&#xff08;系统变量&#xff09; 一劳永逸 效果 cout不输出 Clion在debug调试C/C的时候&#xff0c;printf/cout不会实时输出情况 结果同上~ 谢阅…

NoSQL--2.MongoDB配置(Windows版)

目录 2.MongdoDB配置 2.1 Windows环境下操作 2.1.1 注册MongDB Atlas&#xff1a; 2.1.2 MongoDB Community Server Download&#xff1a; 2.1.3 启动MondgoDB服务&#xff1a; 2.1.3.1 命令行参数的方式启动MongoDB服务&#xff1a; 2.1.3.2 使用配置文件方式启动Mongo…

电脑怎么改照片大小kb?让你的照片尺寸更合适!

随着数字摄影的普及&#xff0c;我们经常需要处理各种大小的照片。有时候&#xff0c;为了上传至特定的网站或平台&#xff0c;或者为了节省存储空间&#xff0c;我们需要调整照片的大小&#xff0c;特别是其KB&#xff08;千字节&#xff09;值。那么&#xff0c;电脑怎么改照…

react tab选项卡吸顶实现

react tab选项卡吸顶实现&#xff0c;直接上代码&#xff08;代码有注释&#xff09; tsx代码 /* eslint-disable react-hooks/exhaustive-deps */ import React, { useEffect, useState } from "react"; import DocumentTitle from react-document-title import s…

【HTML】HTML基础7.2(有序列表)

目录 标签 效果 注意 标签 <ol> <li>列表内容</li> <li>列表内容</li> <li>列表内容</li> <li>列表内容</li> 。。。。。。 </ol> 效果 代码 <ol><li>银河护卫队 10000000000</li><l…

关于 selinux 规则

1. 查看selinux状态 SELinux的状态&#xff1a; enforcing&#xff1a;强制&#xff0c;每个受限的进程都必然受限 permissive&#xff1a;允许&#xff0c;每个受限的进程违规操作不会被禁止&#xff0c;但会被记录于审计日志 disabled&#xff1a;禁用 相关命令&#xf…

算法DFS 复习

思路&#xff1a;for 代表的是每一位的纵向&#xff0c;数字变化&#xff0c;dfs 代表的是横向的&#xff0c;位置变化。vis 来做到每个枚举的数不重复&#xff0c;并且要在搜索前记录&#xff0c;搜索后还原。模拟该样例 dfs3 的时候是输出&#xff0c;dfs0&#xff0c;1&…

链路负载均衡之策略路由

一、策略路由的概念 一般来说&#xff0c;防火墙是根据目的地址查看路由&#xff0c;这种情况下只能根据报文的目的地址为用户提供服务&#xff0c;没办法更加灵活对内网用户进行区分&#xff0c;让不同用户流量走不同的链路转发&#xff0c;如根据源地址、应用协议等区分流量…

Django模型层(附带test环境)

Django模型层(附带test环境) 目录 Django模型层(附带test环境)开启测试环境数据的增加数据的删除修改数据查询数据查询所有数据去重查询排序查询统计剔除指定数据多表查询校验数据是否存在字段的筛选查询 开启测试环境 首先在app下找到tests.py文件并进入 MyDJ.settings要换成…

第3部分 原理篇3可验证凭证(VC)(1)

3.3. 可验证凭证 3.3.1. 本节内容概述 本聪老师&#xff1a;今天开始去中心化身份中另一个最重要的概念可验证凭证&#xff08;verifiable credential&#xff09;的学习。凭证&#xff0c;也就是证件&#xff0c;在人类生活中不可或缺。可验证凭证实现了凭证的机器可读、加密…

车牌定位识别企业版

车牌定位识别企业版&#xff0c;只需要OPENCV&#xff0c;采用YOLOV8NANO检测车牌区域&#xff0c;然后使用PADDLE OCR检测车牌&#xff0c;能识别各国车牌&#xff0c;支持C,PYTHON开发 车牌定位识别企业版&#xff0c;只需要OPENCV&#xff0c;支持C,python

3.5 力扣 交错字符串

97. 交错字符串 给定三个字符串 s1、s2、s3&#xff0c;请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下&#xff0c;其中每个字符串都会被分割成若干 非空 子字符串&#xff1a; s s1 s2 ... snt t1 t2 ... tm|n - m| &…

基于springboot+vue的经方药食两用服务平台

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

Vmware创建共享文件夹

具体设置步骤如下&#xff1a; 打开 “设置 -> 选项 -> 共享文件夹” 点击 “选项 -> 共享文件夹 ->选择总是开启 ->添加” 添加共享文件夹 选择主机路径和设置名称 选择启用此共享&#xff0c;并且点击完成退出。 挂载操作 在root用户下执行具体命令如下&…

HTTP有什么缺陷,HTTPS是怎么解决的

缺陷 HTTP是明文的&#xff0c;谁都能看得懂&#xff0c;HTTPS是加了TLS/SSL加密的&#xff0c;这样就不容易被拦截和攻击了。 SSL是TLS的前身&#xff0c;他俩都是加密安全协议。前者大部分浏览器都不支持了&#xff0c;后者现在用的多。 对称加密 通信双方握有加密解密算法…