clickhouse版本:22.1.2.2

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.
  • 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=ONenforce_gtid_consistency=1binlog_format=ROWlog_bin=mysql-binexpire_logs_days=7max_binlog_size = 256mbinlog_cache_size = 4mmax_binlog_cache_size = 512mserver-id=1

2.应用以下命令即可

set allow_experimental_database_materialized_mysql = 1;CREATE DATABASE test ENGINE = MaterializeMySQL('ip:端口', 'mysql的库', 'mysql账户', 'mysql明码');

问题:

1.此引擎大大不便了mysql导入数据到clickhouse,然而官网提醒还在试验中,不要用在生产环境

2.自己测试过,大数据量状况下,效率依然不高,比mysql好一些罢了

3.应用集群会有很多的局限

3.mysql表函数

clickhouse容许对存储在近程MySQL服务器上的数据执行SELECTINSERT查问

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 = 1on_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包(防止踩坑):https://mvnrepository.com/

clickhouse-jdbc-0.2.6.jarhttpclient-4.5.13.jarhttpcore-4.4.13.jarlz4-1.5.0.jarlz4-java-1.8.0.jardruid-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=rootcanal.instance.dbPassword=root#过滤规定canal.instance.filter.regex=example2\\*

5.批改/home/admin/canal-server/conf/canal.properties配置

canal.serverMode = tcpcanal.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/conf/application.yml配置文件(容器内)

canal.conf:# 此处留神模式  mode: tcp   flatMessage: true  zookeeperHosts:  syncBatchSize: 1000  retries: 0  timeout:  accessKey:  secretKey:  consumerProperties:    # 此处留神canal服务的地址    canal.tcp.server.host: 127.0.0.1:11111    canal.tcp.zookeeper.hosts:    canal.tcp.batch.size: 500    canal.tcp.username:    canal.tcp.password:      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下的mytest_user.yml

dataSourceKey: defaultDS  destination: example2  groupId: g1  outerAdapterKey: mysql  concurrent: true  dbMapping:    mirrorDb: true    database: example2 

9.重启server和adapter

往mysql里插入数据查看是否有数据同步过去,如果没有查看日志排查问题

留神点

1.mysql要开启配置
gtid_mode=ONenforce_gtid_consistency=1binlog_format=ROWlog_bin=mysql-binexpire_logs_days=7max_binlog_size = 256mbinlog_cache_size = 4mmax_binlog_cache_size = 512mserver-id=1
2.mysql和clickhouse库和表要提前创立好
3.docker配置用127.0.0.1时要留神应用主机模式,否则容器之间时无奈通信的
4.如果mysql或者clickhouse无奈连贯胜利,检查一下驱动的版本和jdbc连贯写得对不对

5.其余的计划:红帽的debezium