百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

Java面试问题(十四)——数据库集群和Mycat

bigegpt 2025-05-24 12:23 4 浏览

集群概述

数据切分模式都有什么?切分要注意的问题是什么?

数据的切分根据其切分规则的类型,可以分为两种切分模式。一种是按照不同的表(或者Schema)来切分到不同的数据库之上,这种切分可以称之为数据的垂直切分;另外一种则是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库上面,这种切分称为水平切分
切分要注意:
第一:能不切分尽量不要切分。
第二:如果要切分一定要选择合适的切分规则,提前规划好。
第三:数据切分尽量通过数据冗余或表分组来降低跨库join的可能。
第四:由于数据库中间件对数据join实现优劣难以把握,而且实现高性能难度极大,业务读取尽量少用join

Mycat基本概念和知识点

Mycat主要功能有什么?

  1. 数据库读写分离,主从切换
    通过Mycat可以自动实现写数据时操作主数据库,读数据时操作从数据库,这样能有效地减轻数据库压力,也能减轻IO压力。实现读写分离,当主出现故障后,Mycat自动切换到另一个主上,进而提供高可用的数据库服务,当然需要部署多主多从的模式。
  2. 数据库分库分表
    分库分表指的是对数据库数据的拆分,分为两种:水平拆分和垂直拆分。

Mycat的工作原理是什么?

Mycat的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的SQL语句,首先对SQL语句做了一些特定的分析:如分片分析,路由分析,读写分离分析,缓存分析等,然后将此SQL发往后端的真实数据库,并将返回的结果做适当的处理,最终返回给用户。

具体的工作流程:

sql解析 ->数据源分配 -> 请求响应 -> 结果整合

什么叫分片节点(dataNode)和节点主机(dataHost)?

  • 数据切分后,一个大表被分到不同的分片数据库上面,每个表分片所在的数据库就是分片节点(dataNode).
  • 数据切分后,每个分片节点不一定会独占一台机器,同一机器上面可以有多个分片,这样一个或多个分片节点所在的机器就是节点主机,为了避免单节点主机并发数限制,尽量将读写压力高的分片节点均衡放置在不同的节点主机。

什么叫逻辑库和逻辑表?

  • 逻辑库
    通常对实际应用来说,并不需要知道中间件的存在,业务开发人员只需要知道数据库的概念,所以数据库中间件可以被看做是一个或多个数据库集群构成的逻辑库
  • 逻辑表
    对应用来说,读写数据的表就是逻辑表。逻辑表,可以是数据切分后,分布在一个或多个分库中,也可以不做数据切分,不分片,只有一个表构成。

什么叫分片表,E-R表,全局表?

  • 全局表
    比如字典类数据的表,在各个数据节点上都会用到,所以需要做到数据冗余,数据量不大。
    全局表具有以下特性:
  1. 全局表的插入、更新操作会实时在所有节点上执行,保持各个分片的数据一致性
  2. 全局表的查询操作,只从一个节点获取(前提每个节点数据一致性)。
  3. 全局表可以跟任何一个表进行 JOIN 操作(前提每个节点上都冗余)。
  • 分片表
    就是按照一定的规则,表按照设置的primaryKey来分配到不同的数据节点上。
  • ER表(关联表)
    ER表也叫父子表,父表的数据存在哪个分片上子表的数据就存在哪个分片上,从而避免了跨库查询,子表的分片规则是有父表来决定的,就算你给子表指定了分片规则但是该分片规则是不起作用的,这种情况会造成数据库子表的数据分布不均匀。

常见的分片规则都有什么?

  • 分片枚举
    通过在配置文件中配置可能的枚举 id,自己配置分片,本规则适用于特定的场景,比如有些业务需要按照省份或区县来做保存,而全国省份区县固定的,这类业务使用本条规则。
  • 固定分片 hash 算法
  • 范围约定
    适用于提前规划好分片字段某个范围属于哪个分片。
  • 取模
    对分片字段求摸运算。
  • 按日期(天)分片
  • 应用指定
  • 一致性 hash

总结下来就是枚举分片,日期时间分片,取模分片,hash算法分片,应用指定分片,或者几个的结合。

常见的全局序列号的生成规则都有哪些?

  • 本地文件方式。
  • 数据库方式。
  • 本地时间戳方式。
  • 程序方式(雪花算法,UUID等等)

搭建Mycat的核心配置文件有哪些?作用分别是什么?

  • server.xml配置文件
    server.xml配置文件包含了mycat的系统配置信息,对应的源码使systemconfig.jar。它有两个重要的标签,分别是user和system,system标签的各属性时mycat调优的关键,比如CPU核心数,线程池线程数量,缓存大小控制
  • schema.xml配置文件
    schema.xml作为mycat中重要的配置文件之一,涵盖了mycat的逻辑库,表,分片规则,分片节点及数据源的配置。
  • rule配置文件
    rule.xml里面就定义了我们对表进行拆分所涉及到的规则定义。

Mycat读写分离和主从配置

说一下主从复制原理?

  • master将操作记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary logevents);
  • Slave通过I/O Thread异步将master的binary logevents拷贝到它的中继日志(relay log);
  • Slave执行中继日志中的事件,匹配自己的配置将需要执行的数据,在slave服务上执行一遍从而达到复制数据的目的。

说一下主从复制读写分离的配置?

  1. 在Mycat上配置读写分离
  • 首先配置逻辑库库名。
  • 配置分片节点,也就是真实的物理数据库,并和逻辑库绑定。
  • 配置节点主机,在节点主机中指定读写主机,以及切换方式。
  1. 在mysql配置文件中配置MySQL主从复制

master配置

server-id=137 // 唯一
log-bin=dbstore_binlog //日志
binlog-do-db=db_store //需要同步的db 可以不写,同步所有
skip-name-resolve //禁止dns 反解析,也可以不配置,需要配置/etc/hosts 文件,域名和IP的对应关系。

slave配置

server-id=1
log-bin=dbstore_binlog

Mycat双主双从配置

说一下双主双从的具体配置

整体思路也就是:
准备四台数据库,两两互为主从,两个master互为主从(主要是实现宕机后故障转移)。

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!--只做读写分离,不做分库分表,Mycat只是帮我们转发一下请求,读转发到从库,写转发到主库,则schema标签里面不用配置table-->
<schema name="mycatdb" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"/>
<!--配置真实存在的物理数据库-->
<dataNode name="dn1" dataHost="localhost1" database="my_test" />

<dataHost name="localhost1"
          maxCon="1000"
          minCon="10"
          balance="1"
          writeType="0"
          dbType="mysql"
          dbDriver="native"
          switchType="1"
          slaveThreshold="100">
    <heartbeat>select user()</heartbeat>
    <writeHost host="hostM3308" url="192.168.119.11:3308" user="root" password="123456">
        <readHost host="hostS3309" url="192.168.119.11:3309" user="root" password="123456" />
         <readHost host="hostS3310" url="192.168.119.11:3310" user="root" password="123456" />
    </writeHost>
    <writeHost host="hostM3310" url="192.168.119.11:3310" user="root" password="123456">
        <readHost host="hostS3311" url="192.168.119.11:3311" user="root" password="123456" />
        <readHost host="hostS3308" url="192.168.119.11:3308" user="root" password="123456" />
    </writeHost>
</dataHost>
</mycat:schema>

Mycat分库分表配置

分库分表的时候数据拆分规则怎么取舍?

  1. 达到一定数量级才拆分(800 万)
  2. 不到 800 万但跟大表(超 800 万的表)有关联查询的表也要拆分,在此称为大表关联表
  3. 大表关联表如何拆:小于 100 万的使用全局表;大于 100 万小于 800 万跟大表使用同样的拆分策略;无法跟大表使用相同规则的,可以考虑从 java 代码上分步骤查询,不用关联查询,或者破例使用全局表。
  4. 能不拆的就尽量不拆。如果某个表不跟其他表关联查询,数据量又少,直接不拆分,使用单库即可。

Mycat集群和实现原理

Mycat的实现原理是什么?

Mycat的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的SQL语句,首先对SQL语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。

当Mycat收到一个SQL时,会先解析这个SQL,查找涉及到的表,然后看此表的定义,如果有分片规则,则获取到SQL里分片字段的值,并匹配分片函数,得到该SQL对应的分片列表,然后将SQL发往这些分片去执行,最后收集和处理所有分片返回的结果数据,并输出到客户端。以select * from Orders where prov=?语句为例,查到prov=wuhan,按照分片函数,wuhan返回dn1,于是SQL就发给了MySQL1,去取DB1上的查询结果,并返回给用户。

如果上述SQL改为select * from Orders where prov in (‘wuhan’,‘beijing’),那么,SQL就会发给MySQL1与MySQL2去执行,然后结果集合并后输出给用户。但通常业务中我们的SQL会有Order By 以及Limit翻页语法,此时就涉及到结果集在Mycat端的二次处理,这部分的代码也比较复杂,而最复杂的则属两个表的Jion问题,为此,Mycat提出了创新性的ER分片、全局表、HBT(Human Brain Tech)人工智能的Catlet、以及结合Storm/Spark引擎。

Mycat的自身怎么保证它的稳定性?

Mycat自身是无法进行集群的,所以它需要借助两个工具,一个是HaProxy(HA代理),一个是Keepalived,实现HaProxy+Keepalived+Mycat高可用集群配置,部署图如下:



集群部署图理解:
1、keepalived和haproxy必须装在同一台机器上(如192.168.46.161机器上,keepalived和haproxy都要安装),keepalived负责为该服务器抢占vip(虚拟ip),抢占到vip后,对该主机的访问可以通过原来的ip(192.168.46.161)访问,也可以直接通过vip(192.168.46.180)访问。

2、192.168.46.162上的keepalived也会去抢占vip,抢占vip时有优先级,配置keepalived.conf中的(priority 150 #数值愈大,优先级越高,192.168.46.162上改为120,master和slave上该值配置不同)决定。但是一般哪台主机上的keepalived服务先启动就会抢占到vip,即使是slave,只要先启动也能抢到。

3、haproxy负责将对vip的请求分发到mycat上,起到负载均衡的作用,同时haproxy也能检测到mycat是否存活,haproxy只会将请求转发到存活的mycat上

4、如果一台服务器(keepalived+haproxy服务器)宕机,另外一台上的keepalived会立刻抢占vip并接管服务。如果一台mycat服务器宕机,haporxy转发时不会转发到宕机的mycat上,所以mycat依然可用

相关推荐

程序员请收好:10个非常有用的 Visual Studio Code 插件

一个插件列表,可以让你的程序员生活变得轻松许多。作者|Daan译者|Elle出品|CSDN(ID:CSDNnews)以下为译文:无论你是经验丰富的开发人员还是刚刚开始第一份工作的初级开发人...

PADS在WIN10系统中菜单显示不全的解决方法

决定由AD转PADS,打开发现菜单显示不正常,如下图所示:这个是由于系统的默认字体不合适导致,修改一下系统默认字体即可,修改方法如下:打开开始菜单-->所有程序-->Windows系统--...

一文讲解Web前端开发基础环境配置

先从基本的HTML语言开始学习。一个网页的所有内容都是基于HTML,为了学好HTML,不使用任何集成工具,而用一个文本编辑器,直接从最简单的HTML开始编写HTML。先在网上下载notepad++文...

TCP/IP协议栈在Linux内核中的运行时序分析

本文主要是讲解TCP/IP协议栈在Linux内核中的运行时序,文章较长,里面有配套的视频讲解,建议收藏观看。1Linux概述  1.1Linux操作系统架构简介Linux操作系统总体上由Linux...

从 Angular Route 中提前获取数据

#头条创作挑战赛#介绍提前获取意味着在数据呈现在屏幕之前获取到数据。本文中,你将学到,在路由更改前怎么获取到数据。通过本文,你将学会使用resolver,在AngularApp中应用re...

边做游戏边划水: 基于浅水方程的水面交互、河道交互模拟方法

以下文章来源于腾讯游戏学堂,作者Byreave篇一:基于浅水方程的水面交互本文主要介绍一种基于浅水方程的水体交互算法,在基本保持水体交互效果的前提下,实现了一种极简的水面模拟和物体交互方法。真实感的...

Nacos介绍及使用

一、Nacos介绍Nacos是SpringCloudAlibaba架构中最重要的组件。Nacos是一个更易于帮助构建云原生应用的动态服务发现、配置和服务管理平台,提供注册中心、配置中心和动态DNS...

Spring 中@Autowired,@Resource,@Inject 注解实现原理

使用案例前置条件:现在有一个Vehicle接口,它有两个实现类Bus和Car,现在还有一个类VehicleService需要注入一个Vehicle类型的Bean:publicinte...

一文带你搞懂Vue3 底层源码

作者:妹红大大转发链接:https://mp.weixin.qq.com/s/D_PRIMAD6i225Pn-a_lzPA前言vue3出来有一段时间了。今天正式开始记录一下梗vue3.0.0-be...

一线开发大牛带你深度解析探讨模板解释器,解释器的生成

解释器生成解释器的机器代码片段都是在TemplateInterpreterGenerator::generate_all()中生成的,下面将分小节详细展示该函数的具体细节,以及解释器某个组件的机器代码...

Nacos源码—9.Nacos升级gRPC分析五

大纲10.gRPC客户端初始化分析11.gRPC客户端的心跳机制(健康检查)12.gRPC服务端如何处理客户端的建立连接请求13.gRPC服务端如何映射各种请求与对应的Handler处理类14.gRP...

聊聊Spring AI的Tool Calling

序本文主要研究一下SpringAI的ToolCallingToolCallbackorg/springframework/ai/tool/ToolCallback.javapublicinter...

「云原生」Containerd ctr,crictl 和 nerdctl 命令介绍与实战操作

一、概述作为接替Docker运行时的Containerd在早在Kubernetes1.7时就能直接与Kubelet集成使用,只是大部分时候我们因熟悉Docker,在部署集群时采用了默认的dockers...

在MySQL登录时出现Access denied for user ~~ (using password: YES)

Windows~~~在MySQL登录时出现Accessdeniedforuser‘root‘@‘localhost‘(usingpassword:YES),并修改MySQL密码目录适用...

mysql 8.0多实例批量部署script

背景最近一个项目上,客户需要把阿里云的rdsformysql数据库同步至线下,用作数据的灾备,需要在线下的服务器上部署mysql8.0多实例,为了加快部署的速度,写了一个脚本。解决方案#!/bi...