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=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.使用集群會有很多的局限
3.mysql表函數
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包(避免踩坑):https://mvnrepository.com/
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.instance.filter.regex=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/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=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