自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(100)
  • 收藏
  • 关注

原创 k8s遇 The connection to the server :6443 was refused

The connection to the server xxxx:6443 was refused - did you specify the right host or port?

2023-01-31 10:07:01 9386 1

原创 解决/bin/sh进去的容器运行可执行文件报not found的问题

解决/bin/sh进去的容器运行可执行文件报not found的问题

2022-07-06 18:21:26 2484

原创 搭建docker镜像仓库

docker镜像仓库的搭建

2022-06-27 20:05:54 2157

原创 golang docker-compose api拉取依赖项报undefined: fileutils.MatchInfo

docker-compose 依赖项报undefined fileutils.MatchInfo

2022-06-07 11:51:29 528 1

原创 TiDB分表唯一主键ID——sequence 与gorm无法获取主键的解决

按理说用了TiDB后就不用去考虑分库分表的问题了,但是由于业务场景上同时也要支持MySQL,且确实数据上存在一定隔离性,因此通过数据类型进行水平分表了。MySQL水平分表后的主键id通过snowflake来写入,而TiDB的主键id决定通过tidb的sequenceID来实现SequenceSequence 是数据库系统按照一定规则自增的数字序列,具有唯一和单调递增的特性。在官方 SQL 2003 标准中,其被定义为"生成连续数值的一种机制,Sequence 既可以是内部对象,也可以是外部对象"。因为

2022-04-21 10:55:01 2117

原创 TiDB删除大数据的处理

在 TiDB 的架构中,所有数据以一定 key range 被切分成若干 Region 分布在多个 TiKV 实例上。随着数据的写入,一个集群中会产生上百万个甚至千万个 Region。单个 TiKV 实例上产生过多的 Region 会给集群带来较大的负担,影响整个集群的性能表现。数据删除后查询速度为何会变慢?大量删除数据后,会有很多无用的 key 存在,影响查询效率。可以尝试开启 Region Merge 功能,具体看参考最佳实践中的删除数据部分。开启 Region Merge开启 Region M

2022-04-20 10:04:14 3047 1

原创 redis丢key和bigkey的问题

丢key (缓存污染现象:现场老是出现redis-key丢失的情况,昨天的key今天就没了排查角度:1、key是否设置过期时间2、检查key的删除逻辑3、查看redis中已使用的内存是否接近maxmemory,导致触发了内存淘汰策略如果是第三种情况,则根据业务场景需要设置一下config修改redis-config修改maxmemory修改maxmemory-policy 由 allkeys-lru改为 volatile-lru查看哪些key占用了比较多的内存(bigke

2022-04-18 09:52:29 946

原创 grpc长连接keepalive

背景项目中碰到了grpc双向流和单向流出现了服务端流context报错:context cancel error,而客户端无感知连接断开,依然认为还在连接中,导致数据传输中断。遇到这种情况从以下几个维度去思考问题发生的可能:网络是否稳定,能否复现客户端和服务端是否有对context进行cancel客户端和服务端是否有去处理context的cancel信号由于出现的问题不是在开发环境中,因此开始只能看日志进行排查,但是日志中只得到了服务端会收到context的cancel信号,而客户端没有任何

2022-04-11 11:24:57 4138

原创 MySQL中的锁与事务

MVCCNext-key Lock 解决幻读的问题事务隔离级别

2022-03-31 15:06:51 667

原创 docker容器报x509:certificate signed by unknown authority错误

解决证书验证的问题,x509:certificate signed by unknown authority我们在构建 docker 镜像时一般使用的是 linux(centos或者ubuntu等待) 系统,默认是不带 ca-certificates 根证书的,导致无法识别外部 https 携带的数字证书。如图:所以可能会有以下这个错误。那么,在访问的时候就会抛出 x509: certificate signed by unknown authority 的错误,导致 docker 容器的接口服务返回

2022-03-30 16:08:01 23743

原创 使用MySQL/Tidb数据库的一些经验【缓慢更新中...】

使用MySQL和Tidb作为存储数据库时遇到的一些经验总结插入批量插入拼接sql语句,一次性发送多条(注意拼接的sql大小,数据库一般都有限制sql语句的大小)REPLACE INTO主键会被更新,本质上是先删除再新增INSERT INTO xxx ON DUPLICATE KEY没有记录则新增,有则在原有行上更新对应列插入重复数据package mainimport ( "database/sql" "github.com/sirupsen/logrus".

2022-03-29 19:17:55 1140

原创 k8s init-container

Init容器Init容器是一种特殊容器,在Pod内的应用容器启动之前运行。Init容器可以包括一些应用镜像中不存在的实用工具和安装脚本。可以在Pod的规约中与用来描述应用容器的containers数组平行的位置指定init容器 理解Init容器每个Pod中可以包含多个容器,应用运行在这些容器里面,同时Pod也可以有一个或多个先于应用容器启动的init容器。Init容器与普通容器很像,除了以下两点:他们总是运行到完成每个都必须在下一个启动之前成功完成如果Pod的Init容器失败,kubel

2022-03-24 15:25:26 1118

原创 kubectl命令自动补齐

安装bash-completionapt-get install bash-completion然后将下面内容添加到~/.bashrcsource /usr/share/bash-completion/bash_completion重新加载shell,输入命令type _init_completion来验证bash-completion 的安装状态启动kubectl自动补全功能#当前用户echo 'source <(kubectl completion bash)' >>

2022-03-24 15:17:15 2813

原创 浅谈流量限制

I/O密集型和CPU密集型对于IO/Network瓶颈类的程序,其表现是网卡/磁盘IO会先于CPU打满,这种情况即使优化CPU的使用也不能提高整个系统的吞吐量,只能提高磁盘的读写速度,增加内存大小,提升网卡的带宽来提升整体性能。而CPU瓶颈类的程序,则是在存储和网卡未打满之前CPU占用率先到达100%,CPU忙于各种计算任务,IO设备相对则较闲。无论哪种类型的服务,在资源使用到极限的时候都会导致请求堆积,超时,系统hang死,最终伤害到终端用户。对于分布式的Web服务来说,瓶颈还不一定总在系统内部,也有

2022-03-24 15:15:02 291

原创 浅谈分布式锁

为什么需要锁单机程序,在多线程并发情况下,操作同一资源时,需要对其进行加锁等同步措施来保证原子性。举一个多线程自增的例子:package mainimport ( "sync")// 全局变量var counter intfunc main() { var wg sync.WaitGroup for i := 0; i < 100; i++ { wg.Add(1) go func() { counter++

2022-03-24 15:12:26 3162

原创 Golang内存逃逸

逃逸分析内存逃逸:栈上的内存逃逸到了堆上的现象就称为内存逃逸概念程序在编译阶段根据代码来确认哪些变量分配在栈区,哪些变量分配在堆区。这样可以防止过多内存在堆上分配,减轻GC压力以及程序STW的时间原理指向栈对象的指针不能存储在堆中指向栈对象的指针不能超过该对象的存活期,也就是指针不能再栈对象被销毁后依然存活如何查看通过如下方式编译代码可以看到逃逸分析go build -gcflags='-m -m -l' -m -m 能看到所有编译器优化-l 禁用掉内联优化分析

2022-03-15 17:15:31 993

原创 k8s nginx-ingress crashbackoff

今天线上打镜像发现编译机出问题了,查看了pod发现k8s的nginx-ingress一直在crash,于是查看了日志,发现一直在报:2022/03/02 02:43:29 [emerg] 36#36: bind() to 0.0.0.0:80 failed (98: Address already in use)2022/03/02 02:43:29 [emerg] 36#36: bind() to 0.0.0.0:80 failed (98: Address already in use)2022/

2022-03-02 18:01:22 2042 2

原创 configmap

创建ConfigMap注意: ConfigMap 中的键名必须是一个合法的 DNS 域,仅包含数字字母、破折号、下画线以及圆点,首位的圆点符号是可选的使用命令kubectl创建ConfigMap$ kubectl create configmap app-config --from-literal=qos=1这条命令创建了一个叫做app-config的ConfigMap,且仅包含配置项qos=1如下所示:root@VM-16-4-ubuntu:~/code/charts/stable# k

2022-02-15 15:23:59 1101

原创 k8s服务注册与发现

一、服务注册服务注册过程指的是在服务注册表中登记一个服务,以便让其它服务发现。Kubernetes 使用 DNS 作为服务注册表。为了满足这一需要,每个 Kubernetes 集群都会在 kube-system 命名空间中用 Pod 的形式运行一个 DNS 服务(kube-dns/coredns),通常称之为集群 DNS。1.1 注册过程1、向API Server用POST方式提交一个新的Service定义2、这个请求需要晶哥认证、鉴权以及其他的准入策略检查过程之后才会放行3、Servic

2022-02-12 16:24:04 5436

原创 Docker Compose 文件转换为Kubernetes资源

使用转换工具Kompose,将Docker Compose转换成容器编排器所能识别的形式。安装Kompose# Linuxcurl -L https://github.com/kubernetes/kompose/releases/download/v1.24.0/kompose-linux-amd64 -o kompose# macOScurl -L https://github.com/kubernetes/kompose/releases/download/v1.24.0/kompose-

2022-01-26 10:49:28 1132

原创 k8s指定pod抓包

查看pod的iflink号kubectl exec -ti minio-0 -n fileserver -- sh -c 'cat /sys/class/net/eth0/iflink'上面命令的返回值62即是我们需要的iflink号在pod所在节点查看pod对应的虚拟网卡基于网卡来抓包

2022-01-26 10:47:06 1004

原创 logrus设置日志格式与输出函数名

参考:https://juejin.cn/post/6844904061393698823普通日志设置func InitLogger() { level := GetLogLevel(viper.GetString("LOG_LEVEL")) log.SetLevel(level) formatter := &log.TextFormatter{ ForceColors: true,//设置颜色 FullTimestamp: .

2022-01-26 10:30:56 585

原创 使用kubeadm安装kuberneters

k8s安装kubeadm/kubectl/kubelet安装1、更新apt包索引并安装使用Kubernetes apt仓库所需要的包sudo apt-get updatesudo apt-get install -y apt-transport-https ca-certificates curl2、下载Google Cloud公开签名秘钥:sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https

2022-01-24 16:27:25 715

原创 Golang select优先级执行

select关键词go语言中select关键词用于监听case语句对应的chan,并执行其下相应的代码,直到case下的代码执行结束才会执行另一个发生的chan下面的代码。有点类似于switch。select {case x := <-ch1: fmt.Println(x)case ch2 <- 1: fmt.Println("push 1")}空selectselect{ }空的 select 语句会直接阻塞当前的goroutine,使得该gorout

2022-01-10 14:44:28 1723

原创 Gorm V2的使用感受和Save方法

Gorm V2的使用感受和Save方法和v1对比gorm-v2不支持多表情况下软硬删除的混合链式调用,否则会panicgorm-v2的create如果在select后调用,会出现插入空值的情况,可以通过select().create或者用db.session来解决https://github.com/go-gorm/gorm/issues/4778gorm-v2不需要subQuery了gorm-v2没有newScope方法来获取表名了给我目前最大的方便:可以进行批量插

2021-12-30 17:15:34 4088

原创 Docker buildx构建多架构镜像

Docker buildx构建多架构镜像Docker 19.03及以上的版本支持docker buildx build命令使用 BuildKit 来构建镜像。通过--platform参数可以支持构建多架构的Docker镜像。新建builder实例Docker for Linux不支持构建 ARM 架构镜像,我们可以运行一个新的容器让其支持该特性docker run --rm --privileged tonistiigi/binfmt:latest --install all运行结果如下所示:

2021-12-30 15:58:50 7995

原创 golang - sync.Map

Go语言中的 map 在并发情况下,只读是线程安全的,同时读写是线程不安全的// 创建一个int到int的映射m := make(map[int]int)// 开启一段并发代码go func() { // 不停地对map进行写入 for { m[1] = 1 }}()// 开启一段并发代码go func() { // 不停地对map进行读取 for { _ = m[1] }}()// 无限循环,

2021-12-02 11:48:26 208

原创 Go语言一些容易踩坑的地方

1、可变参数是空接口类型func main() { var a = []interface{}{1, 2, 3} fmt.Println(a) fmt.Println(a...)}不管是否展开,编译器都无法发现错误,但是输出是不同的:[1 2 3]1 2 32、数组是值传递在函数调用参数中,数组是值传递,无法通过修改数组类型的参数返回结果,因此必要时使用切片3、map遍历顺序不固定map是一种hash表的实现,每次遍历的顺序可能都不一样4、返回值被屏

2021-12-02 11:45:40 500

原创 浅谈分布式的负载均衡

一、常见的负载均衡思路1.1、按顺序挑:round robin式,例如上次选了第一台,那么这次就选第二台,下次第三台;如果到了最后一台,那么下次从第一台开始。1.2、随机挑一个:每次都随机挑,真随机伪随机均可。假设选择了第x台机器,那么x可被描述为rand.Intn()%n1.3、根据某种权重挑选对下游节点进行排序,选择权重最大/小那一个实际场景下我们不可能无脑轮询或者无脑随机,如果对下游请求失败了,我们还需要某种机制来进行重试,如果纯粹的随机算法,存在一定可能性下次仍然随机到这次的问题

2021-12-02 11:41:32 2151

原创 分布式id生成器

分布式id生成一、 MySQL自增ID二、Twitter的snowflake算法2.1 snowflake的id生成首先确定我们的数值是64位,int64类型,被划分为五部分:第一个bit位不用,代表符号位用41位来表示收到请求时的时间戳,单位为毫秒5位数表示数据中心的ID再5位数表示机器的实例ID最后是12位的循环自增ID,到达 1111 1111 1111 后会归0这样的机制可以支持我们在同一台机器上,同一毫秒内产生2^12 = 4096条消息,一秒则可以生成409.6w条消息,

2021-11-11 14:55:30 477

原创 GO&CGO的条件编译

GO条件编译go build 参数附加参数备注-v编译时显示包名-p n开启并发编译,默认情况下为CPU核数-a强制重新构建所有的文件-n打印编译时会用的所有命令,但不真正执行-x打印编译时会用到的所有命令-race开启竞态检测,支持linux/amd64,freebsd/amd64,darwin/amd64,windows/amd64-work打印临时工作目录的名称-o指定输出文件-tags构建出带tag的版本

2021-10-29 17:45:13 1627

原创 Docker Compose

Docker Compose能够以单引擎模式进行多容器应用的部署和管理安装win10在win10上安装标准Docker时,默认已经有Docker Compose了,可以通过以下命令查看docker-compose --versionLinux使用curl命令下载二进制文件,然后使用chmod命令将其可运行最新发行的版本地址:https://github.com/docker/compose/releases#Step1:sudo curl -L "https://github.co

2021-07-03 14:35:49 125

原创 Docker容器与win10访问wsl中的docker中容器

容器容器和镜像的区别镜像可以理解为一种构建时(build-time)结构,而容器可以理解为一种运行时(run-time)结构。容器和虚拟机的区别虚拟机和容器最大的区别是容器更快并且更轻量级——与虚拟机运行在完整的操作系统之上相比,容器会共享其所在主机的操作系统/内核。容器和虚拟机都依赖于宿主机才能运行。宿主机可以是笔记本,是数据中心的物理服务器,也可以是公有云的某个实例。在下面的示例中,假设宿主机是一台需要运行 4 个业务应用的物理服务器。虚拟机:需要创建 4 个虚拟机并安装 4 个操作系

2021-06-16 10:50:10 6209

原创 docker Ubuntu安装

ubuntu docker 安装手动安装卸载旧版本 sudo apt-get remove docker docker-engine docker.io containerd runc设置仓库更新apt包索引sudo apt-get update安装apt依赖包sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg-agent \ softwar

2021-05-20 19:25:16 131

原创 FFmpeg中的pts、dts、time_base与AVRational

PTSPresentation Time Stamp。PTS主要用于度量解码后的视频帧什么时候被显示出来DTSDecode Time Stamp。DTS主要是标识读入内存中的bit流在什么时候开始送入解码器中进行解码time_base也就是pts反映帧什么时候开始显示,dts反映数据流什么时候开始解码怎么理解这里的“什么时候”呢?如果有某一帧,假设它是第10秒开始显示。那么它的pts是多少呢。是10?还是10s?还是两者都不是。为了回答这个问题,先引入FFmpeg中时间基的概念,也就是time

2021-05-19 00:16:44 835

原创 chan和goroutine泄露

go chanchan 类型<发送/写>型 chan<-<接收/读>型 <-chan双向型 chanchan 操作构造/初始化 make()关闭 close()判等 ==<发送/写>数据 chan <- send_data<接收/读>数据 recv_data := <- chanchan 关闭或有数据,读操作不阻塞chan 未关闭且无数据,读操作阻塞package mainimport "fmt"

2021-05-19 00:03:05 324 1

原创 I帧、P帧、B帧

I帧、P帧、B帧简单地说,I帧是关键帧,属于帧内压缩。就是和AVI的压缩是一样的。P是向前搜索的意思。B是双向搜索。他们都是基于I帧来压缩数据。I帧表示***关键帧***,你可以理解为这一帧画面的完整保留;解码时只需要本帧数据就可以完成(因为包含完整画面)P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据)B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别(具体比

2021-05-16 00:37:22 8831

原创 FFmpeg Muxing流程

介绍FFmpeg的Muxing主要分为三步操作:avformat_write_header : 写文件头av_write_frame/av_interleaved_write_frame: 写packetav_write_trailer : 写文件尾1、av_format_write_head/** * Allocate the stream private data and write the stream header to * an output media file. * .

2021-05-16 00:34:45 1067 4

原创 FFmpeg源代码结构图-解码

参考雷神的博客以及4.0版本FFmpeg的改动 https://blog.csdn.net/leixiaohua1020/article/details/44220151解码流程:1、av_register_all(现在4.0以上的ffmpeg不需要这个了):先调用avcodec_register_all来注册所有config.h里面开放的编解码器,然后会注册所有的Muxer和Demuxer(也就是封装格式),最后注册所有的Protocol(即协议层的东西)2、avformat_allo.

2021-05-16 00:33:11 202 2

原创 go panic和recover

在golang当中不存在tye … catch 异常处理逻辑。在golang当中使用defer, panic和recover来控制程序执行流程,借此来达到处理异常的目的。PanicPanic是一个可以停止程序执行流程的内置函数。 假设当前F函数当中某处代码触发panic函数,则F函数停止后面代码的执行,转而执行F函数内部的defer函数(如果已经声明了defer函数的话…),然后结束F函数,将当前处理权转给F的调用函数。对于F的调用方M来说,F是调用panic函数结束的,而不是执行return结.

2021-05-16 00:27:28 289

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除