首页 > 其他分享 >【解答】面试题:如何快速解决跨库join表关联?

【解答】面试题:如何快速解决跨库join表关联?

时间:2024-01-26 12:06:01浏览次数:36  
标签:面试题 join tspider 跨库 MySQL 存储 引擎 mysql data

面试题:如何快速解决跨库join表关联?

有一天产品经理提了一个需求,要关联查询A库的xxx表和B库的xxx表(跨库join),做实时分析(查询的表不固定,后期业务还会调整)。Java研发更改代码实现比较困难,大数据团队反馈可以,但不能保证实时性,会有30分钟左右的数据延迟。


产品经理说我这个需求很急,30分钟数据延迟业务不能接受。


那么问题来了,如何解决? 明天就上线。


【解决方案】

第一种、利用MySQL 多源复制技术,只同步产品经理需要的两张表

https://dev.mysql.com/doc/refman/8.0/en/replication-multi-source-adding-binlog-master.html

并设置并行复制replica_parallel_type = DATABASE

优点: MySQL InnoDB自身同步复制速度快(OLTP行式存储特性),优于大数据产品(OLAP列式存储),可以完美解决数据实时性入库。

缺点: 今后如果产品经理再需要同步其他表,需要再次导数据(数据搬运工)费时费事。


第二种、拒绝数据搬运工,1分钟解决战斗

我们采用MariaDB Spider存储引擎特性(映射远程InnoDB的表,相当于做一个超链接,Spider存储引擎本身并不存储数据),类似Clickhouse的mysql表引擎。

https://clickhouse.com/docs/en/integrations/mysql#1-configure-mysql

如果你熟悉MySQL FEDERATED存储引擎,Spider存储引擎相当于FEDERATED存储引擎的升级版,因为MySQL FEDERATED存储引擎已经停止维护了,生产环境不可用。

The FEDERATED Storage Engine is a legacy storage engine no longer being supported.

https://mariadb.com/kb/en/federated-storage-engine/

Spider存储引擎在生产环境成功案例是腾讯游戏,固我们采用该引擎。

Tencent Games. They handle 100TB data on 396 Spider nodes and 2800 data nodes. They use this cluster for their online games.

https://mariadb.com/kb/en/spider-case-studies/


安装部署腾讯版TSpider

# 下载腾讯版MariaDB TSpider

shell> https://github.com/Tencent/TenDBCluster-TSpider/releases/download/tspider-3.7.8/mariadb-10.3.7-linux-x86_64-tspider-3.7.8-gcs.tar.gz

# 解压软链介质

shell> tar xzvf mariadb-10.3.7-linux-x86_64-tspider-3.7.8-gcs.tar.gz -C /usr/local/

shell> ln -s mariadb-10.3.7-linux-x86_64-tspider-3.7.8-gcstspider

shell> chown -R mysql.mysql mariadb-10.3.7-linux-x86_64-tspider-3.7.8-gcs/

# 初始化TSpider

shell> cd /usr/local/tspider && ./scripts/mysql_install_db --defaults-file=/etc/my_tspider.cnf --user=mysql

# 启动TSpider

shell> ./bin/mysqld_safe --defaults-file=/etc/my_tspider.cnf --user=mysql &

my_tspider.cnf配置文件

[client]

port=25000

socket=/tmp/mysql_tspider.sock


[mysqld]

basedir=/usr/local/tspider

datadir=/data/mysql/tspider/data

log-bin  =  /data/mysql/tspider/binlog/mysql-bin

tmpdir=/data/mysql/tspider/tmp

character-set-server=utf8mb4

port=25000

socket=/tmp/mysql_tspider.sock

default-storage-engine=spider

slow_query_log=1

slow_query_log_file=/data/mysql/tspider/slowlog/slow-query.log

long_query_time=3

log_slow_admin_statements=ON

performance_schema=ON

skip-name-resolve

skip-external-locking

skip-symbolic-links

sql_mode=''


###### Tspider config ######

spider_conn_recycle_mode=1

spider_bgs_mode=1

optimizer_switch= 'engine_condition_pushdown=on'

###### Tspider END ######


[mysql]

default-character-set=utf8mb4

no-auto-rehash

port=25000

socket=/tmp/mysql_tspider.sock

TSpider引擎的重要参数说明如下

spider_conn_recycle_mode=1

连接复用,类似于连接池的功能。

spider_bgs_mode=1

TSpider集群在接受应用层的SQL语句请求后,将判定SQL语句需要路

由到后端的哪些MySQL/MariaDB实例上执行,然后在对应的后端

MySQL/MariaDB实例上依次轮询执行,最后统一汇总结果。该参数取

值为0时表示不开启并行功能(即串行执行);取值为1时表示开启并行

功能。

optimizer_switch= 'engine_condition_pushdown=on'

引擎下推,将查询推送到后端数据库,然后将查询结果返回给TSpider做聚合。

更详细的参数说明:

https://tendbcluster.com/book-cn/Documentation/re-book/tspider-parameter.html


Spider引擎在Federated场景应用

Federated:允许MySQL服务器通过远程连接访问多个数据库来联合查询数据。

一、配置mysql.servers路由表

create server backend1

foreign data wrapper mysql

options(

     host  '127.0.0.1',

     database  'aa',

     user  'admin',

     password  '123456',

     port  6666

);


create server backend2

foreign data wrapper mysql

options(

     host  '127.0.0.1',

     database  'bb',

     user  'admin',

     password  '123456',

     port  3346

);

这里后端服务器的名字为backend1,数据库的名字为aa,后端MySQL/MariaDB服务器的IP地址为127.0.0.1,用户名为admin(权限为ALL),密码为123456,端口为6666。

注:如果配置有误,可以直接truncate mysql.servers路由表


二、创建表的“超链接”(将远程服务器的表映射为本地表)

CREATE TABLE `ta` (

 `id` int(11) NOT NULL AUTO_INCREMENT,

 `cid` int(11) DEFAULT NULL,

 `uid` int(11) DEFAULT NULL,

 PRIMARY KEY (`id`),

 KEY `cid` (`cid`)

) ENGINE=SPIDER COMMENT='wrapper "mysql" , table "ta" , srv "backend1"';


CREATE TABLE `tb` (

 `id` int NOT NULL,

 `cid` int DEFAULT NULL,

 `name` varchar(10) DEFAULT NULL,

 PRIMARY KEY (`id`)

) ENGINE=SPIDER COMMENT='wrapper "mysql" , table "tb" , srv "backend2"';

这里通过设置COMMENT注释来调用后端的表,然后就可以访问TSpider查看ta表和tb表的数据了。

当创建一个Spider存储引擎的ta/tb表时,该表指向后端MySQL/MariaDB服务器上对应的表结构和名字相同的ta/tb表,就像在Linux系统中创建软链接一样。远程服务器上的表可以是任何存储引擎的表。在执行“CREATE TABLE”命令创建Spider引擎的表时,需要添加“COMMENT”或“CONNECTION”语法来指定远程服务器的地址等信息。


标签:面试题,join,tspider,跨库,MySQL,存储,引擎,mysql,data
From: https://blog.51cto.com/hcymysql/9427170

相关文章

  • [SQLAlchemy] sqlAlchemy学习笔记(3): 在orm中使用join
    JOIN连接表➡️官方文档⬅️在sqlalchemy中实现JOIN/ON语句,需要用到Select.join()或者Select.join_from()假设我们有两张表(在python中就变成了两个类)User和Address,User表中有一列addresses,表示该用户使用的所有地址的集合(反映到代码中,就是Address对象的集合);同时Ad......
  • 每日一道Java面试题:方法重载与方法重写,这把指定让你明明白白!
    写在开头请聊一聊Java中方法的重写和重载?这个问题应该是各大厂面试时问的最多的话题之一了,它们几乎贯穿了我们日常的开发工作,在过往的博客中我们多多少少都提到过重载与重写,而今天我们就一起来详细的学习一下这二者的功能与区别!重载与重写的定义重写:类实现接口或者子类继承......
  • LVS常见面试题
    一、Linux集群有哪些Linux集群主要有以下几种类型:负载均衡集群(LoadBalancingCluster,LB)这种类型的集群主要用于分发网络流量,确保服务的稳定性和高效性。它将客户端的请求分配给后端的一组服务器,以平衡整体负载,并防止任何单个服务器过载。常见的软件实现包括LinuxVirtualSer......
  • git笔试面试题
     收集整理几个git相关的笔试面试题 1、你们公司版本是如何管理的?细说一下 2、如何创建分支? 3、gitclone、gitpull、gitfetch、gitpush的区别是? 4、merge和rebase的区别是? 5、gitpull和gitpull--rebase的区别是? 6、代码提交到本地仓库后,发现提交日志写......
  • SQL优化--使用 EXISTS 代替 IN 和 inner join来选择正确的执行计划
       在使用Exists时,如果能正确使用,有时会提高查询速度:     1,使用Exists代替innerjoin     2,使用Exists代替in  1,使用Exists代替innerjoin例子:    在一般写sql语句时通常会遇到如下语句:     两个表连接时,取一个表的数据,一般的写法通过关联查询(inne......
  • 软件测试必问必背面试题
    软件测试必问必背面试题 01软件测试理论部分1.1测试概念1.请你分别介绍一下单元测试、集成测试、系统测试、验收测试、回归测试单元测试:完成最小的软件设计单元(模块)的验证工作,目标是确保模块被正确的编码集成测试:通过测试发现与模块接口有关的问题系统测试:是基于系......
  • ClickHouse中“大列”造成的JOIN的内存超限问题
    ClickHouse中“大列”造成的JOIN的内存超限问题“大列”是指单行数据量非常大的列,通常是100KiB以上。这样的列会导致JOIN(通常LEFTJOIN和INNERJOIN)出现内存超限的异常。常用的JOIN算法这里讨论的是常用的JOIN算法:partialmergejoin与hashjoin。Directjoin算法不在本文......
  • Redis常见面试题
    一、Redis做什么的,在哪些场景下使用Redis是一个开源的内存数据存储系统,它被广泛用于缓存、消息队列、实时统计分析、任务队列等场景。以下是一些常见的使用场景:缓存:Redis的主要用途之一是作为缓存层。它可以将经常访问的数据存储在内存中,以提高读取速度。常见的应用场景包括页面缓......
  • 二叉树面试题进阶
    二叉树面试题进阶1.二维数组存储层序遍历结果难点: 如何存储每一层的节点?根据队列节点的个数判断每一层classSolution{publicList<List<Integer>>levelOrder(TreeNoderoot){List<List<Integer>>retList=newArrayList<>();if(root==nu......
  • 45个经典Linux面试题!赶紧收藏!
    问题一:绝对路径用什么符号表示?当前目录、上层目录用什么表示?主目录用什么表示?切换目录用什么命令?答案:绝对路径:如/etc/init.d当前目录和上层目录:./../主目录:~/切换目录:cd问题二:怎么查看当前进程?怎么执行退出?怎么查看当前路径?答案:查看当前进程:ps执行退出:exit查看当前路径:pwd问题三......