Clickhouse

Clickhouse作为一种数据仓库的产品.

优点

  • 文档清晰且有AI问答工具.
  • 入门难度很低,拥有Mysql的经验即可.
  • 阿里云也有其产品可以购买,生产稳定,出问题概率低.
  • 数据压缩,存储成本低.
  • 索引速度快.
  • 可以直接录入Mysql作为data source.
  • 交互协议上支持Http协议,伪Mysql协议和原生高性能协议.

GUI推荐

DataGrip.

SQL操作

数据管理利用TTL特性进行数据回收.

数据分布

查询

select * from system.parts limit 10;

# 目前转移的数据
select * from system.mutations;

计算表大小

SELECT
    total_bytes/total_rows,
    table,database,
    formatReadableSize(total_bytes) AS total_bytes_on_disk
FROM system.tables
WHERE table = 'table';

表转移

RENAME TABLE  database.exist_table TO database.old_table, database.new_table TO database.exist_table;

数据回收

ALTER TABLE database.table DROP PARTITION '20240925';

修改TTL

ALTER TABLE database.table
MODIFY TTL timestamp + toIntervalMonth(2);

查看表结构

SELECT
    name AS field_name,
    table AS table_name,
    type AS field_type,
    comment AS field_comment
FROM system.columns
WHERE database = 'database' AND table = 'table';

常用函数

易读数量

formatReadableQuantity(count())

时间切割

toStartOfInterval(toDateTime(timestamp), INTERVAL 1 day ) as interval1

截取数据

substring(message, -20) 

数据类型转换

toString

数据拼接

concat(a,'',toString(b))

clickhouse 同步mysql数据

SET allow_experimental_database_materialized_mysql=1;

CREATE DATABASE  new_database
    ENGINE = MaterializedMySQL('host:3306','database', 'user', 'password')
 SETTINGS
        allows_query_when_mysql_lost=true,
        max_wait_time_when_mysql_unavailable=10000;

-- drop database new_database;

mysql 服务端

default_authentication_plugin = mysql_native_password
gtid_mode = on

mysql 表条件

MySQL中的每个表都应包含PRIMARY KEY,并且如果表中包含ENUM字段值超出范围(在ENUM签名中指定),则无法进行复制。

Go 内存泄漏排查

背景

某次发版后,生产机器的内存相比之前相同负载条件下使用率高,业务无异常影响. 而后带来的影响是,数据库连接资源随着pod数量提升占用提高.

间接处理

  • 回滚版本
  • 每隔固定时间定时重新发版
  • 把所有依赖pkg升级至最新,把Go版本升级至最新
  • 服务拆分,让业务链路保持简单.

直接处理

  • 排查内存泄漏与修复

思路

复现生产环境场景

在测试环境里,对比此次版本的功能改动点进行压测,难以压测的直接for循环将变动函数调用增加10倍来调试或者将time.ticker的频率放大10倍.

使用pyroscope分析

pyroscope https://pyroscope.io/ 是基于golang的pprof工具进行采集.

使用pprof

go官方自带的工具 https://github.com/google/pprof

使用perf

perf是个经典的分析工具, https://github.com/google/perf_data_converter 可以将perf的分析报告转化为pprof的格式进行分析

pprof着手分析

下载heap分析文件

接入pprof后,可用curl下载分析文件 curl -o heapfile http://localhost/debug/pprof/heap?seconds=30 . 上述命令可捕获30秒的堆文件分析.

查看pprof官方自带文档

关于pprof的使用说明,请务必看完 https://github.com/google/pprof/blob/main/doc/README.md 该文讲述了

  • pprof字段 flat cum 代表的含义.
  • 可通过web的方式进行UI交互或者cli方式交互. go tool pprof -http :8810 heapfile
  • 调用图里面的颜色,矩形大小,矩形边缘粗细,虚线箭头和实线箭头的含义解释
  • 可对比2个时间段的pprof文件,go tool pprof --base base.heap current.heap

内存采样率控制

runtime.MemProfileRate 采样率控制.

假设runtime.MemProfileRate=N,那么采样为1/N进行.如果觉得采样率小了,可以在测试环境进行调整.

空闲 Heap

http://localhost/debug/pprof/heap?debug=1 有个HeapIdle指标.

linux压测配置优化

背景

临时租赁服务器,进行灰度压测,进行大量并发cURL.测试机器压榨单机极限性能.

修改单进程句柄限制

查看进程最大文件数

# 查看进程最大文件数
ulimit -n

修改进程最大文件数

ulimit -SHn 1048576
  • S 表示设置软限制(soft limit)。软限制是指系统允许进程使用的资源上限,但进程可以尝试超过这个限制。
  • H 表示设置硬限制(hard limit)。硬限制是指系统绝对允许进程使用的资源上限,即使进程尝试超过这个限制,系统也会阻止它。
  • n 表示设置进程可以打开的文件描述符的最大数量
# 防止重启后失效
echo ulimit -HSn 1048576 >> /etc/rc.local
echo ulimit -HSn 1048576 >>/root/.bash_profile

ulimit影响因素

  • fs.nr_open;进程最大文件描述符数
  • fs.file-max;系统最大文件描述符数

修改/etc/sysctl.conf

#  /etc/sysctl.conf
fs.file-max = 1048576 
fs.nr_open=1048576

nf_conntrack_max 开启

防止配置net.nf_conntrack_max报错

linux排查

Linux性能优化实战 笔记 https://time.geekbang.org/column/intro/100020901

模拟工具

stress

stress 是一个 Linux 系统压力测试工具,这里我们用作异常进程模拟平均负载升高的场景

apk add stress-ng

# 一个 CPU 使用率 100%
stress --cpu 1 --timeout 600
# 模拟 I/O 压力
stress -i 1 --timeout 600
# 8个进程
 stress -c 8 --timeout 600

sysbench

sysbench 是一个多线程的基准测试工具,一般用来评估不同系统参数下的数据库负载情况

supervisor搭建

# 下载
pip install supervisor
# 初始化配置
echo_supervisord_conf > /etc/supervisord.conf

vim /etc/supervisord.conf append

[program:process1]
command=/root/process1
autorestart=true
# 载入服务
supervisord -c /etc/supervisord.conf
# 启动
supervisorctl start process1
# 停止
supervisorctl stop process1
# 更新了 /etc/supervisord.conf后
supervisorctl reload