clickhouse-mysql数据同步
clickhouse版本:22.1.2.2
fileinputstream父类1.Mysql引擎(不推荐)
CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster]
ENGINE = MySQL('host:port', ['database' | database], 'user', 'password')
引擎参数
host:port — MySQL服务地址
database — MySQL数据库名称
user — MySQL⽤户名
password — MySQL⽤户密码
这个引擎⾮常不推荐使⽤,MySQL引擎将远程的MySQL服务器中的表映射到ClickHouse中,MySQL数
据库引擎会将对其的查询转换为MySQL语法并发送到MySQL服务器中(吐槽:这跟直接⽤mysql有什么区别,⽆语)
2.MaterializedMySQL(不推荐)
这个引擎创建ClickHouse数据库,包含MySQL中所有的表,以及这些表中的所有数据。ClickHouse服务器作为MySQL副本⼯作。它读取binlog并执⾏DDL和DML查询。
CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster]
ENGINE = MaterializeMySQL('host:port', ['database' | database], 'user', 'password') [SETTINGS ...]
引擎参数
host:port — MySQL服务地址
database — MySQL数据库名称
user — MySQL⽤户名
password — MySQL⽤户密码
引擎配置
max_rows_in_buffer — 允许数据缓存到内存中的最⼤⾏数(对于单个表和⽆法查询的缓存数据)。当超过⾏数时,数据将被物化。默认值: 65505。
max_bytes_in_buffer — 允许在内存中缓存数据的最⼤字节数(对于单个表和⽆法查询的缓存数据)。当超过⾏数时,数据将被物化。默认值: 1048576.
max_rows_in_buffers — 允许数据缓存到内存中的最⼤⾏数(对于数据库和⽆法查询的缓存数据)。当超过⾏数时,数据将被物化。默认值: 65505.
max_bytes_in_buffers — 允许在内存中缓存数据的最⼤字节数(对于数据库和⽆法查询的缓存数据)。当超过⾏数时,数据将被物化。默认值: 1048576.
max_flush_data_time — 允许数据在内存中缓存的最⼤毫秒数(对于数据库和⽆法查询的缓存数据)。当超过这个时间时,数据将被物化。默认值: 1000.
justifiable
max_wait_time_when_mysql_unavailable — 当MySQL不可⽤时重试间隔(毫秒)。负值禁⽌重试。默认值: 1000.
织梦防站教程allows_query_when_mysql_lost — 当mysql丢失时,允许查询物化表。默认值: 0 (false).
eg:
CREATE DATABASE mysql ENGINE = MaterializeMySQL('localhost:3306', 'db', 'user', '***')
SETTINGS
allows_query_when_mysql_lost=true,
max_wait_time_when_mysql_unavailable=10000;
使⽤步骤:
1.修改mysql的配置,重启
gtid_mode=ON
enforce_gtid_consistency=1
binlog_format=ROW
log_bin=mysql-bin
expire_logs_days=7
max_binlog_size = 256m
binlog_cache_size = 4m
max_binlog_cache_size = 512m
server-id=1
2.使⽤以下命令即可
set allow_experimental_database_materialized_mysql = 1;
CREATE DATABASE test ENGINE = MaterializeMySQL('ip:端⼝', 'mysql的库', 'mysql账户', 'mysql密码');
问题:
1.此引擎⼤⼤⽅便了mysql导⼊数据到clickhouse,但是官⽅提⽰还在实验中,不要⽤在⽣产环境
2.查询时要带上虚拟列_version ,否则会默认使⽤final,效率很低
3.使⽤集会有很多的局限
clickhouse允许对存储在远程MySQL服务器上的数据执⾏SELECT和INSERT查询
mysql('host:port', 'database', 'table', 'user', 'password'[, replace_query, 'on_duplicate_clause']);
参数
host:port — MySQL服务器地址.
database — 远程数据库名称.
table — 远程表名称.
user — MySQL⽤户.
password — ⽤户密码.
replace_query — 将INSERT INTO查询转换为REPLACE INTO的标志。如果replace_query=1`,查询被替换。
on_duplicate_clause — 添加 ON DUPLICATE KEY on_duplicate_clause 表达式到 INSERT 查询。明确规定只能使⽤ replace_query = 0 ,如果你同时设置replace_query = 1和on_duplicate_clause`,ClickHouse将产⽣异常
将mysql的全部数据导⼊clickhouse
1.创建clickhouse的表
2.执⾏命令
INSERT INTO table SELECT * FROM mysql('ip:port', 'database', 'table', 'user', 'password') [where]
注意:1.如果这⾥直接使⽤*,clickhouse字段顺序要和mysql⼀致,不然会有问题,如果只需要部分字段可以⼿动指定
2.这⾥可以⾃⼰带查询条件导⼊
3.clickhouse是会出现数据重复的情况的,就算是ReplacingMergeTree也是可能会出现重复数据的
4.canal同步
1.准备好jar包(避免踩坑):mvnrepository/
clickhouse-jdbc-0.2.6.jar
httpclient-4.5.13.jar
httpcore-4.4.13.jar
lz4-1.5.0.jar
lz4-java-1.8.0.jar
druid-1.2.8.jar(这个版本不能太低,否则druid连接池不⽀持clickhouse)
2.docker安装Canal-Server
哈夫曼编码课程设计docker run --name canal-server -p 11111:11111 -d canal/canal-server:latest
3.进⼊容器
复制/home/admin/canal-server/conf/example为你要创建的新数据库实例名称,这⾥使⽤example2
4.修改example2下的instance.properties配置
#MySQL地址
canal.instance.master.address=127.0.0.1:3306
#mysql账户
canal.instance.dbUsername=root
canal.instance.dbPassword=root
#过滤规则
canal.=example2\\*
5.修改/home/admin/canal-server/conf/canal.properties配置
canal.serverMode = tcp
canal.destinations = example2
6.安装canal-adapter(你也可以⽤kafka)
docker run --name canal-adapter -p 8081:8081 -d slpcat/canal-adapter:v1.1.5
7.修改canal-adapter的/opt/canal-adapter/l配置⽂件(容器内)
# 此处注意模式
mode: tcp
flatMessage: true
zookeeperHosts:mysql无法连接到服务器
syncBatchSize: 1000
retries: 0
timeout:
accessKey:
secretKey:
consumerProperties:
# 此处注意canal服务的地址
int和float的区别
srcDataSources:
# 此处注意mysql连接
defaultDS:
url: jdbc:mysql://127.0.0.1:3306/example2?useUnicode=true
username: root
password: root
canalAdapters:
- instance: example2
groups:
- groupId: g1
outerAdapters:
- name: logger
- name: rdb
key: mysql1
# clickhouse的配置
properties:
jdbc.driverClassName: ru.yandex.clickhouse.ClickHouseDriver
jdbc.url: jdbc:clickhouse://127.0.0.1:8123
jdbc.username: default
jdbc.password: default
8.修改/opt/canal-adapter/conf/rdb下的l
dataSourceKey: defaultDS
destination: example2
groupId: g1
outerAdapterKey: mysql
concurrent: true
dbMapping:
mirrorDb: true
database: example2
9.重启server和adapter
往mysql⾥插⼊数据查看是否有数据同步过来,如果没有查看⽇志排查问题注意点
gtid_mode=ON
enforce_gtid_consistency=1
binlog_format=ROW
log_bin=mysql-bin
expire_logs_days=7
max_binlog_size = 256m
binlog_cache_size = 4m
max_binlog_cache_size = 512m
server-id=1
3.docker配置⽤127.0.0.1时要注意使⽤主机模式,否则容器之间时⽆法通信的
4.如果mysql或者clickhouse⽆法连接成功,检查⼀下驱动的版本和jdbc连接写得对不对
5.其他的⽅案:红帽的debezium

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。