ByteHouse MaterializedMySQL 增强优化
更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群
前言
社区版 ClickHouse 推出了MaterializedMySQL数据库引擎,用于将 MySQL 中的表映射到 ClickHouse 中。ClickHouse 服务作为 MySQL 副本,读取 Binlog 并执行 DDL 和 DML 请求,实现了基于 MySQL Binlog 机制的业务数据库实时同步功能。
这样不依赖其他数据同步工具,就能将 MySQL 整库数据实时同步到 ClickHouse,从而能基于 ClickHouse 构建实时数据仓库。
ByteHouse 是基于 ClickHouse 增强自研的云原生数据仓库,在社区版 ClickHouse 的 MaterializedMySQL 之上进行了功能增强,让数据同步更稳定,支持便捷地处理同步异常问题。
社区版 MaterializedMySQL 简介
ClickHouse 社区版通过 DDL 语句在 ClickHouse 上创建一个 database,并将 MySQL 中的指定的一个 database 的全量数据迁移至 ClickHouse,并实时读取 MySQL 的 binlog 日志,将 MySQL 中的增量数据实时同步至 ClickHouse 中。
详细介绍:[experimental] MaterializedMySQL | ClickHouse Docs
同步示例
同步一个 MySQL 库至 ClickHouse 的示例创建语句如下:
CREATE DATABASE db_name ENGINE = MaterializedMySQL(...)
SETTINGS materialized_mysql_tables_list='user_table,catalog_sales'
TABLE OVERRIDE user_table(
COLUMNS (
userid UUID,
category LowCardinality(String),
timestamp DateTime CODEC(Delta, Default)
)
PARTITION BY toYear(timestamp)
),
TABLE OVERRIDE catalog_sales(
COLUMNS (
client_ip String TTL created + INTERVAL 72 HOUR
)
SAMPLE BY ip_hash
)
功能优势
MaterializedMySQL 数据同步方案的优势有:
简单易用:使用一个 DDL 语句就能创建整库同步任务,能将数百数千张表一键同步至 ClickHouse,操作简单。
架构简单:使用 ClickHouse 本身的计算资源进行数据增量同步,无需搭建其他的数据同步工具,数据架构简单。
时效性好:支持实时同步源端数据,ClickHouse 端几乎是毫秒和秒级延迟,时效体验非常好。
ByteHouse 功能增强
社区版 MaterializedMySQL 很大程度了解决了 MySQL 库到 ClickHouse 之间的数据实时同步问题,但也存在不少问题导致其很难应用到生产应用中,主要问题如下:
配置选项少
社区版 MaterializedMySQL 不支持同步到分布式表,不支持跳过不兼容 DDL 等功能,缺乏这些功能很难将 MaterializedMySQL 用于实际应用中。
运维困难
社区版 MaterializedMySQL 不支持同步异常重新同步命令,没有同步状态和日志信息,同步任务失败后很难短时间定位问题和恢复同步。
ByteHouse 的 MaterializedMySQL 功能针对使用过程中的问题和困难,做了多处增强,提高了易用性,降低了运维成本。
数据去重
通过 MaterializedMySQL 同步到 ByteHouse 的表默认采用 HaUniqueMergeTree 表引擎,该表引擎支持配置 UNIQUE KEY 唯一键,提供 upsert 更新写语义,源端数据的更新操作在目标端可以实时去重更新。不需要依赖_version、_sign 虚拟列来标记删除更新,简化了业务逻辑,提高了易用性。
同步范围
通过 SETTINGS 参数中配置 include_tables 和 exclude_tables 列表,指定该数据库下需要同步的表清单或者不需要同步的表清单,否则同步该库所有的表。
在实际应用中,一个数据库通常有数百乃至数千张表,其中有些表无需同步、或者数据可能存在异常,可以将这些表加入 exclude_tables 清单,不影响其他表的数据同步。
异常处理
数据同步链路无法避免发生异常情况导致同步中断,ByteHouse 提高了多个功能来简化异常问题处理。
跳过不支持的语句
MySQL 支持的 DDL 语句非常丰富,有很多语法与 clickhouse 不兼容,在 ClickHouse 端执行会报错中断同步任务。
可以通过设置 skip_ddl_patterns 参数,用 1 个或多个正则表达式将匹配的 DDL 语句过滤掉,从而避免了报错和中断同步任务。
系统日志表
ByteHouse 提供两个系统表:system.materialize_mysql_status,system.materialize_mysql_log,分别记录了每个同步任务的状态,参数设置和运行日志。便于实时查看同步状态和排查异常问题。
出错后运维
当同步任务出现了同步异常后,通过查看运行日志系统表定为问题。
针对性处理了异常问题后,通过 resync 命令重启同步任务。
分布式模式
社区版 MaterializedMySQL 的每个同步任务会将源端的一个库同步至 ClickHouse 的某个节点,不支持按分片逻辑将数据分布到所有节点,无法利用 ClickHouse 集群的分布式计算存储能力;如果在集群中每个节点都建一个同步库,则源端一份数据会被同步一份全量至每个 ClickHouse 节点,既浪费了存储空间,降低了查询性能,又会对源端产生巨大的压力。
ByteHouse 支持构建分布式模式的 MaterializedMySQL 库,将每个表都对应同步至 ByteHouse 的一个分布式表,数据不重复存储,能充分利用分布式集群的计算能力,又降低了对源端的同步压力。
可视化运维
ByteHouse 同时提供了可视化运维模块,能实时查看同步状态,暴露同步异常,支持在线修复同步异常问题和重启同步任务。
最佳实践
下午将演示将 MySQL 库中的若干张表同步至 ByteHouse 的全过程。
源端配置
在 MySQL 数据库端需要配置的参数如下。
开启 Binlog
设置默认的认证插件
开启 GTID 模式
用户权限 MaterializeMySQL 表引擎用户必须具备 MySQL 库的 RELOAD、REPLICATION SLAVE、REPLICATION CLIENT 以及 SELECT PRIVILEGE 权限 支持的 MySQL 版本 5.65.78.0
源端数据准备
在 MySQL 数据库里面创建一个 database,创建两张表,并插入若干数据。
Show databases;
--【MySQL】Mysql中创建库
create database db;
use db;
--【MySQL】Mysql中创建表
CREATE TABLE `user` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(64) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COMMENT='user info'; CREATE TABLE `data` (
`id` bigint(20) unsigned NOT NULL,
`date_time` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COMMENT='time';
--【MySQL】Mysql中插入数据
INSERT INTO yangxi.user(id,name) VALUES (111,'step1-1111'),(222,'step1-2222');
INSERT INTO yangxi.data(id,date_time) VALUES (111,now()),(222,now()),(333,now());
创建 MaterializeMySQL
在 ByteHouse 的控制台数据查询窗口,创建 MaterializeMySQL 库。
#【worksheet】创建物化Mysql库,
--【Clickhouse】在集群名称是 bytehouse的集群上创建物化库,集群名称是个变量
CREATE DATABASE shard_mode_true_mysql_sync on cluster bytehouse
ENGINE = MaterializeMySQL('10.137.xx.xx:3309', 'db', 'username', 'password')
settings shard_mode=true,allows_query_when_mysql_lost=1,include_tables='user,data'
TABLE OVERRIDE data( PARTITION BY toYYYYMMDD(date_time)) ;
参数解释:
shard_mode:true 表示是同步至分布式表。
allows_query_when_mysql_lost:1 表示同步中断的时候也允许查询数据。
include_tables:同步源端 db 库中 user 和 data 两张表,其他表跳过不同步。
OVERRIDE :ByteHouse 中的 data 表按照 date_time 字段分区。
查看同步状态
切换到 ByteHouse 数据管理模块,搜索 shard_mode_true_mysql_sync 库,并查看库同步状态
同步任务管理
库-停止同步/开始同步
创建库后默认是同步状态
可以手动停止同步
停止中的库可以手动开始同步
库-重置同步
选择一个同步库,点击“重置同步”可以从头开始重新同步整库
表-重置同步
选择一个同步中的表 A,点击“重置同步”按钮,系统将执行以下行为:
关闭同步任务
从源端全量拉取该表的数据至临时表(A_CHTMP,表名后缀会加上_CHTMP)
删除目标端原有表 A(如果存在)
将临时表 A_CHTMP RENAME 为 A
开始增量同步
删除库
删除 ByteHouse 中的库以及同步关系。
异常处理
系统运维表
在 ByteHouse 管理控制台,通过下列语句查看任务同步状态和错误信息。
select * from cluster('bytehouse','system.materialize_mysql_status',(1,2))
select * from cluster('bytehouse','system.materialize_mysql_log',(1,2))
单表异常恢复
在源端执行下列 Alter table 语句以后,库同步会失败
--修改字段类型
mysql> ALTER TABLE db.test ADD COLUMN h tinyint;
mysql> ALTER TABLE db.test MODIFY h int default 0;
mysql>ALTER TABLE db.test MODIFY h tinyint default 0;
恢复办法:
在 ByteHouse 界面上进入表详情,点击重新同步按钮。
进入库详情页面,点击开始同步按钮,即可恢复同步。
在 ByteHouse 中执行下列语句,也可以恢复数据同步
--通过下述命令,或者可视化界面,可以重启同步
--shard_mode=true情况
:) system resync materialize mysql table on cluster bytehouse shard_mode_true_mysql_sync.test;
:) system restart sync materialize mysql on cluster bytehouse shard_mode_true_mysql_sync;
其他操作
设置跳过 DDL
:) CREATE DATABASE db_mysql_sync_skip on cluster bytehouse
ENGINE = MaterializeMySQL('10.xx.xx.xx:3309', 'db', 'username', 'password')
SETTINGS include_tables='user,date_time',skip_ddl_patterns='.*add column.*,.*MODIFY.*'
TABLE OVERRIDE data( PARTITION BY toYYYYMMDD(date_time)) ;
修改 include 和 exclude
通过下列语句修改 include 和 exclude 参数,来修改同步表范围。
:) alter database shard_mode_true_mysql_sync on cluster bytehouse modify setting include_tables='user,data,date_time,test';
:) alter database shard_mode_true_mysql_sync on cluster bytehouse
modify setting include_tables='',exclude_tables='test3';
异常报警
ByteHouse 提供监控报警功能,在库同步异常停止或单表同步失败的时候,可以向管理员发送报警信息。
点击跳转 ByteHouse云原生数据仓库 了解更多
ByteHouse MaterializedMySQL 增强优化的更多相关文章
- 最新GHOST XP系统下载旗舰增强版 V2016年
系统来自:系统妈:http://www.xitongma.com 深度技术GHOST xp系统旗舰增强版 V2016年3月 系统概述 深度技术ghost xp系统旗舰增强版集合微软JAVA虚拟机IE插 ...
- 最新深度技术GHOST XP系统旗舰增强版 V2016年
来自系统妈:http://www.xitongma.com 深度技术GHOST xp系统旗舰增强版 V2016年 系统概述 深度技术ghost xp系统旗舰增强版集合微软JAVA虚拟机IE插件,增强浏 ...
- 软件产品案例分析----K米app
第一部分 调研.评测 1.1评测 1.1.1 第一次上手体验 1.1.2 bug 1.1.2.1 bug定义 1.1.2.2 栗子 1.1.2.2.1 A级 1.1.2.2.2 B级 1.1.2.2. ...
- Win7旗舰版-X86-X64-快速装机版
装机版作品简介 Win7 32/64位旗舰版 6.5z 专注于Win7,致力于做更好用的系统!一如既往的品质,不流氓,不欺骗,不夸大!一直在改进,只为做得更好!万千用户的信赖,作者的品质保证! 作品摘 ...
- oneM2M启动Release 3标准化,华为引领物联网技术布局
http://developer.huawei.com/cn/ict/news/cn/2016/06/onem2m [韩国,首尔,2016年6月] 国际权威的物联网组织oneM2M召开第23次技术全会 ...
- [tools] Sublime text 3 神器
同事给了一个Sublime text 3 增强优化版.<---神器 问题:中文文件名乱码:[因为我电脑调整了dpi] 解决: 在sublime text 3中,Preference, Set ...
- Xamainr 地图之webview初探
一 说几点 当下移动开发主要实现方式有传统的Native以及新的混合开发想Rect.js,nodejs这些前段框架,其本质要么是原生控件来实现UI,要么html来实现UI.Xamarin其实也只是取巧 ...
- Maven学习(三)
maven相关概念 maven坐标 Maven世界拥有大量构建,当我们需要引用依赖包是,需要用一个用来唯一标识去确定唯一的一个构建.如果拥有了统一规范,就可以把查找工作交给机器. 类似于空间找点的坐标 ...
- 关于Python的那些话
1.第一个选择:版本2还是3,我选择2,保守谨慎,3的成熟周期会很长2.三种基本的文本操作: 2.1.解析数据并将数据反序列化到程序的数据结构中 2.2.将数据以某种方式转化为另一种相 ...
- iOS----------UITextField实现过滤选中状态拼音
2018年上班的第二天,就这样背了一个大锅.我们项目中有一个搜索功能,在这一期的版本中,为了增强优化,去除了过滤空格的请求,这样或许能增加很好的用户体验,恰恰相反,偷鸡不成蚀把米.没想到苹果系统的输入 ...
随机推荐
- GBDT中损失函数的负梯度用来拟合的一些理解
将\(L(y_i,f(x_i))\)在\(f(x_i)=f_{m-1}(x_i)\)处泰勒展开到一阶(舍去余项,故为近似) \[L(y_i,f(x_i))\approx L(y_i,f_{m-1}(x ...
- TensorFlow架构
Tensorflow基本信息 Tensorflow所需处理器 CPU,GPU,TPU(Google为AI研发的专用芯片) 平台 Windows,Linux,Android,iOS,Raspberry ...
- HDFS、Ceph、GFS、GPFS、Swift、Lustre……容器云选择哪种分布式存储更好?
HDFS.Ceph.GFS.GPFS.Swift.Lustre--容器云选择哪种分布式存储更好?-51CTO.COM 容器云在使用分布式存储时,HDFS.CEPH.GFS.GPFS.Swift等分布式 ...
- JAVA 作业
1.让用户分2次输入2个整数,输出2个数的最大值,最小值 import java.util.Scanner;class Demo01 { public static void main(String[ ...
- doy 18 定时任务
1.定时任务 1.什么是定时任务 类似日常生活之中的闹钟:主要用于定时执行某些命令,达到定时处理数据的作用. 2.定时任务的软件的种类 1.linux操作系统自带的软件:crontab 2.第三方的定 ...
- Python使用socks代理
Python使用socks代理 参考:How to make python Requests work via socks proxy - Stack Overflow 使用pysocks库 - Ji ...
- 1004 Counting Leaves (30分)
今天在热心网友的督促下完成了第一道PAT编程题. 太久没有保持训练了,整个人都很懵. 解题方法: 1.读懂题意 2.分析重点 3.确定算法 4.代码实现 该题需要计算每层的叶子节点个数,所以选用BFS ...
- vue input有值但还是验证不通过
验证失败原因: 因为input自动把输入的值转换为string类型,导致验证失败. 解决方案: 一. Input中的v-model改为v-model.number: 二.rules里面需要加type: ...
- 8.forEach的使用
1 List<customer> list //一个类是customer的列表 2 3 /* for(int i = 0;i < list.size();i++){ 4 System ...
- Windows 10 输入法(仅桌面) %100 解决
大家好,今天我遇到了一件非常难受的一件事,那就是 WIndows 自带的输入发问题,无法输入中文!!! 这时我去网上找找解决方案,总结了一下几个: 文件检查 步骤 以管理员身份运行PowerShell ...