go build 编译优化

Go 项目使用容器运行时报以下错误:

standard_init_linux.go:207: exec user process caused "no such file or directory"

网上查了一下原因:CGO has to be disabled for alpine.

Dockerfile 中使用的是 golang:1.14-alpine 镜像,Go build 编译参数如下:

GOOS=linux GOARCH=amd64 go build -ldflags "-w -s" -gcflags "-N -l" -mod=vendor -o ./bin/mytest .

显而易见添加 CGO_ENABLED=0 编译之后即可运行成功。CGO_ENABLED 默认是开启的,允许在 Go 代码中调用 C 代码。

go build 编译生产环境下使用的可执行文件一般会加一些优化参数,简单复习一下。

......

Grafana 企业微信告警配置

Grafana 支持的告警方式非常多,对于即时通讯类软件不支持微信和企业微信。

如何让 Grafana 支持企业微信告警,网上有不少开源的解决方案。

  • 基于 Grafana 支持企业微信的分支源码重新编译

参考:Add a new notifier : WeChat Work

  • 使用 Grafana Alerting webhook 功能

参考:g2ww wechat-work-message-push-go

......

InfluxDB 高可用

influxdb 开源版本不支持集群模式,社区开源的方案有多种,本文主要介绍官方提供的高可用方案 influxdb-relay

架构图

        ┌─────────────────┐                 
        │writes & queries │                 
        └─────────────────┘                 
                 │                          
                 ▼                          
         ┌───────────────┐                  
         │               │                  
┌────────│ Load Balancer │─────────┐        
│        │               │         │        
│        └──────┬─┬──────┘         │        
│               │ │                │        
│               │ │                │        
│        ┌──────┘ └────────┐       │        
│        │ ┌─────────────┐ │       │┌──────┐
│        │ │/write or UDP│ │       ││/query│
│        ▼ └─────────────┘ ▼       │└──────┘
│  ┌──────────┐      ┌──────────┐  │        
│  │ InfluxDB │      │ InfluxDB │  │        
│  │ Relay    │      │ Relay    │  │        
│  └──┬────┬──┘      └────┬──┬──┘  │        
│     │    |              |  │     │        
│     |  ┌─┼──────────────┘  |     │        
│     │  │ └──────────────┐  │     │        
│     ▼  ▼                ▼  ▼     │        
│  ┌──────────┐      ┌──────────┐  │        
│  │          │      │          │  │        
└─▶│ InfluxDB │      │ InfluxDB │◀─┘        
   │          │      │          │           
   └──────────┘      └──────────┘         
......

MySQL 中 utf8 和 utf8mb4 编码

最近在开发过程中碰到数据库写入失败的情况。

“Incorrect string value: ‘\xF0\x9F\x91\x91M\xE3…” for column ‘nick_name’ at row 1”

排查发现是由于该用户的昵称含有 emoji 表情包导致的,含有表情包和普通字符串有什么区别呢?

原来 MySQL 的默认 utf8 (也称 utf8mb3) 只支持三个字节的字符。而 emoji 表情包需要四个字节表示。所以存储就会报错。不过 MySQL 在 5.5.3 之后增加了这个 utf8mb4 的编码,用来兼容四字节的 Unicode。

为了解决这个问题,需要修改数据库的字符编码。

......