环境 Logback + Filebeat + Kafka + ClicksHoue + Metabase
问题一,生产环境发现 Clickhouse 不再消费 Kafka 中数据。
涉及到的各项配置:
filebeat:
apiVersion: v1
kind: ConfigMap
metadata:
name: 名称
labels:
k8s-app: 名称
data:
OUTPUT_KAFKA_HOSTS: kafka地址
filebeat.yml: |-
filebeat.config.inputs:
enabled: true
reload.enabled: true
reload.period: 10s
filebeat.inputs:
- type: log
paths:
- /文件地址
output.kafka:
enabled: true
hosts: '${OUTPUT_KAFKA_HOSTS}'
topics:
- topic: "topic1"
when.contains:
message: "\"标识字段\":\"标识字段内容1\""
- topic: "topic2"
when.contains:
message: "\"标识字段\":\"标识字段内容2\""
partition.round_robin:
reachable_only: false
version: '2.6.0'
required_acks: 1
compression: gzip
codec.format:
string: '%{[message]}'
Kafka 买的现成的
clickhouse 虽说是买的现成的,但是表还是自己创建的,
就是官网拔下来的也不贴了。
排查思路:
查看clickhouse报错
select * from system.errors
Cannot parse input: expected '{' before: '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0'
又去看了kafka topic 里的内容发现确实是有 \0x00。
cat命令是看不到的。 用的vi看到的。
定位下是 logback 问题 还是 Filebeat 问题
grep -Pa ‘\x00\x00\x00\x00\x00’ /日志目录 -nr 发现没有,初步定位问题为 Filebeat 导致的。 但是自己重现不了。 考虑到 filebeat的input 目前是按文本字符串来处理日志的,改为 json形式获取
解决,修改 filebeat 配置。
修改后
apiVersion: v1
kind: ConfigMap
metadata:
name: 名字
labels:
k8s-app: 名字
data:
OUTPUT_KAFKA_HOSTS: kafka地址
filebeat.yml: |-
filebeat.config.inputs:
enabled: true
reload.enabled: true
reload.period: 10s
filebeat.inputs:
- type: log
paths:
- /日志目录
json.keys_under_root: true
json.overwrite_keys: true
json.add_error_key: true
json.ignore_decoding_error: true
output.kafka:
enabled: true
hosts: '${OUTPUT_KAFKA_HOSTS}'
topics:
- topic: "topic1"
when.equals:
标识字段: "标识字段内容1"
- topic: "topic2"
when.equals:
标识字段: "标识字段内容2"
partition.round_robin:
reachable_only: false
version: '2.6.0'
required_acks: 1
compression: gzip
问题二 一个输出想入到clickhouse俩个字段中
解决方案:改sql ,放弃 select * ,改为自定义
CREATE TABLE 库.XXX_queue ON CLUSTER `集群名`
(
`eventStartTime` UInt64,
其他字段
)
ENGINE = Kafka 其他kafka配置。
CREATE MATERIALIZED VIEW 库.XXX_mv ON CLUSTER `集群名` TO 库.XXX AS
select
`ts` as `eventStartTimeTs`,
`dtts` as `eventStartTime`,
其他字段
from (
SELECT *,eventStartTime as ts,fromUnixTimestamp64Milli(toInt64(`eventStartTime`)) as dtts
FROM 库.XXX_queue
) tmp_source;
问题三: MetaBase Clickhouse时区问题。
定位问题所使用的命令
clickhouse 涉及 命令,(最终发现所有clickhouse的时区都是 Asia/Shanghai)
查看 时区相关设置
select * from system.settings where name like '%zone%'
查看时区
SELECT timezone()
查看配置文件中的时区,默认是注释掉的
cat /etc/clickhouse-server/config.xml
查看服务器时区
date +%z
修改metabse使用的链接参数
use_client_time_zone=1
se_time_zone=UTC+8&use_server_time_zone=UTC+8
Metabase 涉及命令 (同样Metabase的时区也都是 Asia/Shanghai)
查看服务器时区
date +%z
查看 env是否成功配置
env
metabase sql 执行窗口 来验证时区是否生效。
select now(),toString(now()),timezone()
以及直接打开表来验证 datetime 类型的是否显示正确。
最终确定问题为 clickhouse.metabase-driver.jar 问题。
当使用 0.7.5 版本时可以正常显示 当使用 0.8.1 版本时不可以正常显示
涉及的组件部署文件:
version: "3"
services:
server:
image: yandex/clickhouse-server
ports:
- "8123:8123"
- "9000:9000"
- "9009:9009"
volumes:
- D:\docker\clickhouse\tmp:/tmp
- D:\docker\clickhouse\data/:/var/lib/clickhouse/data
environment:
TZ: Asia/Shanghai
ulimits:
nproc: 65535
nofile:
soft: 262144
hard: 262144
client:
image: yandex/clickhouse-client
command: ['--host', 'server']
version: "3"
services:
metabase:
image: metabase/metabase:v0.41.3.1
entrypoint: [ "bash", "-c", "apk add --no-cache tzdata && wget -P /plugins https://github.com/enqueue/metabase-clickhouse-driver/releases/download/0.7.5/clickhouse.metabase-driver.jar && /app/run_metabase.sh"]
volumes:
- C:\Windows\System32\drivers\etc\hosts:/etc/hosts
ports:
- "3000:3000"
environment:
TZ: Asia/Shanghai
JAVA_TIMEZONE: Asia/Shanghai
MB_DB_TYPE: mysql
MB_DB_DBNAME: metabase
MB_DB_PORT: 3306
MB_DB_USER: root
MB_DB_PASS: 123456
MB_DB_HOST: host.docker.internal
|