0
点赞
收藏
分享

微信扫一扫

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

黄昏孤酒 2024-01-26 阅读 9

面试题:如何快速解决跨库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”语法来指定远程服务器的地址等信息。


举报

相关推荐

0 条评论