- HBase + Flink 实时增量同步
CDC 方案选型
采用 Flink-HBase-Connector 2.2(基于 AsyncTableOperator),源库 MySQL 8.0,Binlog Row 模式。
作业拓扑
MySQL → Debezium JSON → Kafka → Flink SQL → HBase
Flink DDL:
sql
CREATE TABLE mysql_user (
id BIGINT PRIMARY KEY,
name STRING,
update_time TIMESTAMP(3)
) WITH (
'connector' = 'kafka',
'topic' = 'db.user',
'properties.bootstrap.servers' = 'kafka1:9092',
'format' = 'debezium-json'
);
CREATE TABLE hbase_user (
rowkey STRING,
info ROW
PRIMARY KEY (rowkey) NOT ENFORCED
) WITH (
'connector' = 'hbase-2.2',
'table-name' = 'user',
'zookeeper.quorum' = 'zk1:2181'
);
INSERT INTO hbase_user
SELECT CONCAT(CAST(id AS STRING), '_', DATE_FORMAT(update_time, 'yyyyMMdd')),
ROW(name)
FROM mysql_user;
并行度 12,Kafka 15 分区,Checkpoint 30 s,Exactly-Once。
性能结果
峰值 8w 条/s,单条 400 B,Kafka 延迟 80 ms,Flink 端到端平均 350 ms,HBase 端写请求 4.5w QPS,RegionServer CPU 38 %,无 back-pressure。
幂等保障
HBase 侧设置 SET newVersionBehavior = true + Versions = 1,用 Put.setTimestampFromServerSide = false,以 Flink 事件时间作为版本,避免重复 Binlog 导致多版本。
2. VM 内存气球(balloon)深入
驱动原理
内核模块 vmw_balloon 通过 vmci 通道接收宿主机要回收的页数,调用 shrinker 接口把匿名页换到 swap,再填充假页返回给宿主机。
实验观察
层一 VM 8 GB,运行 Redis 填充 6 GB,宿主机触发气球:
bash
vmware-vim-cmd hostsvc/mem/claim 1024 # 回收 1 GB
结果:
客户机 free -m 可用内存瞬间降 1 GB,swap 增 900 MB,si/so 峰值 200 MB/s。
Redis 延迟从 0.3 ms 跳到 3 ms,持续 4 s。
调优:
在 VM 内 echo 10 > /proc/sys/vm/swappiness,并加 vm.min_free_kbytes=262144,延迟下降到 1.2 ms。
禁止气球
把 .vmx 加:
sched.mem.maxmemctl = 0
验证:
vmware-toolbox-cmd stat balloon 显示 0 MB,但失去宿主机内存超售能力,适合延迟敏感型 VM。