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

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

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

集群概述

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

数据的切分根据其切分规则的类型,可以分为两种切分模式。一种是按照不同的表(或者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依然可用

相关推荐

Redis集群对比:主从复制、哨兵模式、Cluster一文看懂所有优缺点

在分布式系统中,Redis作为高性能的内存数据库,其集群方案的选择直接影响到系统的稳定性、可用性和扩展性。本文将全面对比Redis的三种主流集群方案:主从复制、哨兵模式和Cluster模式,帮助开发者...

redis的主从复制,读写分离,主从切换

当数据量变得庞大的时候,读写分离还是很有必要的。同时避免一个redis服务宕机,导致应用宕机的情况,我们启用sentinel(哨兵)服务,实现主从切换的功能。redis提供了一个master,多个sl...

# Redis 入门到精通(九)-- 主从复制(3)

#Redis入门到精通(九)--主从复制(3)##一、redis主从复制-常见问题(1)###1、伴随着redis系统的运行,master的数据量会越来越大,一旦master重启...

redis - 主从复制(Redis主从复制时序图)

1引言在上一篇文章中,我们了解了Redis两种不同的持久化方式,Redis服务器通过持久化,把Redis内存中持久化到硬盘当中,当Redis宕机时,我们重启Redis服务器时,可以由RDB文件或AO...

# Redis 入门到精通(九)-- 主从复制(2)

#Redis入门到精通(九)--主从复制(2)##一、redis主从复制--数据同步阶段注意事项###1、数据同步阶段master说明1)如果master数据量巨大,数据同步阶段应...

Redis主从复制(redis主从复制主节点挂了)

介绍Redis有两种不同的持久化方式,Redis服务器通过持久化,把Redis内存中持久化到硬盘当中,当Redis宕机时,我们重启Redis服务器时,可以由RDB文件或AOF文件恢复内存中的数据。不过...

深入解析 Redis 集群的主从复制实现方式

在互联网大厂的后端开发领域,Redis作为一款高性能的内存数据库,被广泛应用于缓存、消息队列等场景。而Redis集群中的主从复制机制,更是保障数据安全、实现读写分离以及提升系统性能的关键所在。今...

Redis主从架构详解(redis主从架构高可用如何实现)

Redis主从架构搭建Redis主节点配置创建主节点目录(/opt/redis-master),复制redis.conf到该目录下,redis.conf配置项修改#后台启动daemonizeyes...

抖音“四大包塘战神”:承包了全网的快乐

在抖音钓鱼垂类领域,"包塘战神"军团正掀起一场黑色幽默风暴。空军华、大表坑、李赔光、透心良四位创作者,以承包鱼塘为舞台,用连续翻车的钓鱼直播构筑起流量奇观。当钓鱼佬在抖音集体转型喜剧人...

ORACLE 11G RAC 安装-通过VM配置共享磁盘

简介:在自己的电脑上通过VM软件搭建Oracle11GRAC,通过修改VM的参数文件来实现磁盘共享!目标:搭建RAC环境实现:使用VMwareWorkstation8.0.0+ORACLE...

Linux操作系统安全配置(linux系统安全配置包括)

一、服务相关命令systemctlenable服务名#开机自启动systemctldisable服务名#禁用开机自启动systemctlstop服务名#停止服务systemctls...

关于Linux性能调优中网络I/O的一些笔记

写在前面和小伙伴分享一些Linux网络优化的笔记,内容很浅,可以用作入门博文内容结合《Linux性能优化》读书笔记整理涉及内容包括常用的优化工具(mii-tool,ethtool,ifconfig,i...

从 Sonatype Nexus Repository Manager 迁移到 Artifactory

1.Nexus1.1下载下载链接:https://help.sonatype.com/repomanager3/product-information/download/download-archiv...

Ubuntu20安装zabbix5.0企业监控系统亲测教程

前言示例主机:zabbix10.0.100.10,将安装在UbuntuServer上教程说明:因使用官方教程无法安装成功,所以本教程与官方教程有所不同安装前提:已安装UbuntuServer2...

Linux内核设计与实现—进程管理(linux内核程序设计)

进程进程就是处于执行期的程序(目标码存放在某种存储介质上)。进并不仅仅局限于一段可执行程序代码(Unix称其为代码段,textsection)。通常进程还要包含其他资源,像打开的文件,挂起的信号,...