网站建设重庆招聘,psd模板怎么做网站,茌平网站建设费用,单页销售型网站现象
某日#xff0c;运营反馈#xff0c;在某个时间区间丢失了一段日志#xff0c;让看看是什么问题。
排查
查看项目日志有无错误 发现项目日志有报错信息Error 1062 Duplicate entry 149059529550598144 for key PRIMARY,很显然#xff0c;问题在此#xff0c;数据库…现象
某日运营反馈在某个时间区间丢失了一段日志让看看是什么问题。
排查
查看项目日志有无错误 发现项目日志有报错信息Error 1062 Duplicate entry 149059529550598144 for key PRIMARY,很显然问题在此数据库主键冲突无法插入数据导致这部分数据被丢弃。那么问题来了我们使用的雪花算法为什么会生成重复的ID呢
进一步排查 猜想可能早成该问题的原因可能有两个 1. 两个项目用了同样的MachineId然而并没有我们是单体应用 2. 时钟回拨存疑需进一步确定大概率是这个问题 进一步查看代码bwmarrin/snowflake库的生成方法
// Generate creates and returns a unique snowflake ID
// To help guarantee uniqueness
// - Make sure your system is keeping accurate system time
// - Make sure you never have multiple nodes running with the same node ID
func (n *Node) Generate() ID {n.mu.Lock()now : time.Since(n.epoch).Nanoseconds() / 1000000if now n.time {n.step (n.step 1) n.stepMaskif n.step 0 {for now n.time {now time.Since(n.epoch).Nanoseconds() / 1000000}}} else {n.step 0}n.time nowr : ID((now)n.timeShift |(n.node n.nodeShift) |(n.step),)n.mu.Unlock()return r
}可以看出确实没对 now n.time做判定而且方法的注释中有说明Make sure your system is keeping accurate system time要自己保障系统时间的准确性。 3. 进一步找运营确认情况运营老哥说问题是自两天前才有的想想两天前我对服务器做了什么。两天前我把项目的容器内编译改为了本地编译采用挂载时区的方式来设置时区。
FROM golang:1.16 as builder
ENV GO111MODULEon \CGO_ENABLED0 \GOOSlinux \GOARCHamd64 \GOPROXYhttps://goproxy.cn,direct
WORKDIR /go/release
COPY go.mod .
COPY go.sum .
RUN go mod download
RUN go build -ldflags-s -w -installsuffix cgo -o serve .
FROM scratch as prod
COPY --frombuilder /usr/share/zoneinfo /usr/share/zoneinfo
ENV TZAsia/Shanghai
COPY --frombuilder /go/release/* ./
CMD [/serve]//以上每次部署需要3分钟左右我觉得太慢改为宿主机执行go build 然后直接把二进制镜像丢给scratch镜像
FROM scratch
ENV TZAsia/Shanghai
COPY . /
CMD [/serve]
//启动容器时挂载时区
docker run -p 8080:8080 -v /usr/share/zoneinfo:/usr/share/zoneinfo:ro -d test:v1.0.0但是我没想到的是宿主机会通过NTP对时间进行矫正每次矫正都会造成时钟回拨生成的ID重复。
解决方案
让容器读自己的时区信息
FROM alpine:latest as base
RUN echo https://mirrors.aliyun.com/alpine/v3.8/main/ /etc/apk/repositories \ echo https://mirrors.aliyun.com/alpine/v3.8/community/ /etc/apk/repositories \ apk add --no-cache tzdata \ cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ echo Asia/Shanghai /etc/timezone
FROM scratch
COPY --frombase /usr/share/zoneinfo /usr/share/zoneinfo
ENV TZAsia/Shanghai
COPY . /
CMD [/serve]