<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Canger_的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Canger_</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Canger_]]></copyright><item><title><![CDATA[k8s遇 The connection to the server :6443 was refused]]></title><link>https://blog.youkuaiyun.com/Canger_/article/details/128812589</link><guid>https://blog.youkuaiyun.com/Canger_/article/details/128812589</guid><author>Canger_</author><pubDate>Tue, 31 Jan 2023 10:07:01 +0800</pubDate><description><![CDATA[The connection to the server xxxx:6443 was refused - did you specify the right host or port?]]></description><category></category></item><item><title><![CDATA[解决/bin/sh进去的容器运行可执行文件报not found的问题]]></title><link>https://blog.youkuaiyun.com/Canger_/article/details/125645417</link><guid>https://blog.youkuaiyun.com/Canger_/article/details/125645417</guid><author>Canger_</author><pubDate>Wed, 06 Jul 2022 18:21:26 +0800</pubDate><description><![CDATA[解决/bin/sh进去的容器运行可执行文件报not found的问题]]></description><category></category></item><item><title><![CDATA[搭建docker镜像仓库]]></title><link>https://blog.youkuaiyun.com/Canger_/article/details/125490983</link><guid>https://blog.youkuaiyun.com/Canger_/article/details/125490983</guid><author>Canger_</author><pubDate>Mon, 27 Jun 2022 20:05:54 +0800</pubDate><description><![CDATA[docker镜像仓库的搭建]]></description><category></category></item><item><title><![CDATA[golang docker-compose api拉取依赖项报undefined: fileutils.MatchInfo]]></title><link>https://blog.youkuaiyun.com/Canger_/article/details/125162416</link><guid>https://blog.youkuaiyun.com/Canger_/article/details/125162416</guid><author>Canger_</author><pubDate>Tue, 07 Jun 2022 11:51:29 +0800</pubDate><description><![CDATA[docker-compose 依赖项报undefined fileutils.MatchInfo]]></description><category></category></item><item><title><![CDATA[TiDB分表唯一主键ID——sequence 与gorm无法获取主键的解决]]></title><link>https://blog.youkuaiyun.com/Canger_/article/details/124316181</link><guid>https://blog.youkuaiyun.com/Canger_/article/details/124316181</guid><author>Canger_</author><pubDate>Thu, 21 Apr 2022 10:55:01 +0800</pubDate><description><![CDATA[按理说用了TiDB后就不用去考虑分库分表的问题了，但是由于业务场景上同时也要支持MySQL，且确实数据上存在一定隔离性，因此通过数据类型进行水平分表了。
MySQL水平分表后的主键id通过snowflake来写入，而TiDB的主键id决定通过tidb的sequenceID来实现
Sequence
Sequence 是数据库系统按照一定规则自增的数字序列，具有唯一和单调递增的特性。在官方 SQL 2003 标准中，其被定义为"生成连续数值的一种机制，Sequence 既可以是内部对象，也可以是外部对象"。因为]]></description><category></category></item><item><title><![CDATA[TiDB删除大数据的处理]]></title><link>https://blog.youkuaiyun.com/Canger_/article/details/124290540</link><guid>https://blog.youkuaiyun.com/Canger_/article/details/124290540</guid><author>Canger_</author><pubDate>Wed, 20 Apr 2022 10:04:14 +0800</pubDate><description><![CDATA[在 TiDB 的架构中，所有数据以一定 key range 被切分成若干 Region 分布在多个 TiKV 实例上。随着数据的写入，一个集群中会产生上百万个甚至千万个 Region。单个 TiKV 实例上产生过多的 Region 会给集群带来较大的负担，影响整个集群的性能表现。
数据删除后查询速度为何会变慢？
大量删除数据后，会有很多无用的 key 存在，影响查询效率。可以尝试开启 Region Merge 功能，具体看参考最佳实践中的删除数据部分。
开启 Region Merge
开启 Region M]]></description><category></category></item><item><title><![CDATA[redis丢key和bigkey的问题]]></title><link>https://blog.youkuaiyun.com/Canger_/article/details/124242437</link><guid>https://blog.youkuaiyun.com/Canger_/article/details/124242437</guid><author>Canger_</author><pubDate>Mon, 18 Apr 2022 09:52:29 +0800</pubDate><description><![CDATA[丢key （缓存污染

现象：现场老是出现redis-key丢失的情况，昨天的key今天就没了
排查角度：

1、key是否设置过期时间
2、检查key的删除逻辑
3、查看redis中已使用的内存是否接近maxmemory，导致触发了内存淘汰策略


如果是第三种情况，则根据业务场景需要设置一下config

修改redis-config

修改maxmemory
修改maxmemory-policy 由 allkeys-lru改为 volatile-lru


查看哪些key占用了比较多的内存(bigke]]></description><category></category></item><item><title><![CDATA[grpc长连接keepalive]]></title><link>https://blog.youkuaiyun.com/Canger_/article/details/124094851</link><guid>https://blog.youkuaiyun.com/Canger_/article/details/124094851</guid><author>Canger_</author><pubDate>Mon, 11 Apr 2022 11:24:57 +0800</pubDate><description><![CDATA[背景
项目中碰到了grpc双向流和单向流出现了服务端流context报错：context cancel error，而客户端无感知连接断开，依然认为还在连接中，导致数据传输中断。
遇到这种情况从以下几个维度去思考问题发生的可能：

网络是否稳定，能否复现
客户端和服务端是否有对context进行cancel
客户端和服务端是否有去处理context的cancel信号

由于出现的问题不是在开发环境中，因此开始只能看日志进行排查，但是日志中只得到了服务端会收到context的cancel信号，而客户端没有任何]]></description><category></category></item><item><title><![CDATA[MySQL中的锁与事务]]></title><link>https://blog.youkuaiyun.com/Canger_/article/details/123870954</link><guid>https://blog.youkuaiyun.com/Canger_/article/details/123870954</guid><author>Canger_</author><pubDate>Thu, 31 Mar 2022 15:06:51 +0800</pubDate><description><![CDATA[MVCC
Next-key Lock 解决幻读的问题
事务隔离级别]]></description><category></category></item><item><title><![CDATA[docker容器报x509:certificate signed by unknown authority错误]]></title><link>https://blog.youkuaiyun.com/Canger_/article/details/123849150</link><guid>https://blog.youkuaiyun.com/Canger_/article/details/123849150</guid><author>Canger_</author><pubDate>Wed, 30 Mar 2022 16:08:01 +0800</pubDate><description><![CDATA[解决证书验证的问题,x509:certificate signed by unknown authority
我们在构建 docker 镜像时一般使用的是 linux(centos或者ubuntu等待) 系统，默认是不带 ca-certificates 根证书的，导致无法识别外部 https 携带的数字证书。
如图：所以可能会有以下这个错误。
那么，在访问的时候就会抛出 x509: certificate signed by unknown authority 的错误，导致 docker 容器的接口服务返回]]></description><category></category></item><item><title><![CDATA[使用MySQL/Tidb数据库的一些经验【缓慢更新中...】]]></title><link>https://blog.youkuaiyun.com/Canger_/article/details/123829453</link><guid>https://blog.youkuaiyun.com/Canger_/article/details/123829453</guid><author>Canger_</author><pubDate>Tue, 29 Mar 2022 19:17:55 +0800</pubDate><description><![CDATA[使用MySQL和Tidb作为存储数据库时遇到的一些经验总结

插入
批量插入

拼接sql语句，一次性发送多条（注意拼接的sql大小，数据库一般都有限制sql语句的大小）

REPLACE INTO
主键会被更新，本质上是先删除再新增
INSERT INTO xxx ON DUPLICATE KEY
没有记录则新增，有则在原有行上更新对应列
插入重复数据
package main

import (
    "database/sql"

    "github.com/sirupsen/logrus"
.]]></description><category></category></item><item><title><![CDATA[k8s init-container]]></title><link>https://blog.youkuaiyun.com/Canger_/article/details/123712119</link><guid>https://blog.youkuaiyun.com/Canger_/article/details/123712119</guid><author>Canger_</author><pubDate>Thu, 24 Mar 2022 15:25:26 +0800</pubDate><description><![CDATA[Init容器
Init容器是一种特殊容器，在Pod内的应用容器启动之前运行。Init容器可以包括一些应用镜像中不存在的实用工具和安装脚本。可以在Pod的规约中与用来描述应用容器的containers数组平行的位置指定init容器 

理解Init容器
每个Pod中可以包含多个容器，应用运行在这些容器里面，同时Pod也可以有一个或多个先于应用容器启动的init容器。
Init容器与普通容器很像，除了以下两点：

他们总是运行到完成
每个都必须在下一个启动之前成功完成

如果Pod的Init容器失败，kubel]]></description><category></category></item><item><title><![CDATA[kubectl命令自动补齐]]></title><link>https://blog.youkuaiyun.com/Canger_/article/details/123711925</link><guid>https://blog.youkuaiyun.com/Canger_/article/details/123711925</guid><author>Canger_</author><pubDate>Thu, 24 Mar 2022 15:17:15 +0800</pubDate><description><![CDATA[安装bash-completion
apt-get install bash-completion

然后将下面内容添加到~/.bashrc
source /usr/share/bash-completion/bash_completion

重新加载shell，输入命令type _init_completion来验证bash-completion 的安装状态
启动kubectl自动补全功能
#当前用户
echo 'source &lt;(kubectl completion bash)' &gt;&gt;]]></description><category></category></item><item><title><![CDATA[浅谈流量限制]]></title><link>https://blog.youkuaiyun.com/Canger_/article/details/123711834</link><guid>https://blog.youkuaiyun.com/Canger_/article/details/123711834</guid><author>Canger_</author><pubDate>Thu, 24 Mar 2022 15:15:02 +0800</pubDate><description><![CDATA[I/O密集型和CPU密集型
对于IO/Network瓶颈类的程序，其表现是网卡/磁盘IO会先于CPU打满，这种情况即使优化CPU的使用也不能提高整个系统的吞吐量，只能提高磁盘的读写速度，增加内存大小，提升网卡的带宽来提升整体性能。而CPU瓶颈类的程序，则是在存储和网卡未打满之前CPU占用率先到达100%，CPU忙于各种计算任务，IO设备相对则较闲。
无论哪种类型的服务，在资源使用到极限的时候都会导致请求堆积，超时，系统hang死，最终伤害到终端用户。对于分布式的Web服务来说，瓶颈还不一定总在系统内部，也有]]></description><category></category></item><item><title><![CDATA[浅谈分布式锁]]></title><link>https://blog.youkuaiyun.com/Canger_/article/details/123711733</link><guid>https://blog.youkuaiyun.com/Canger_/article/details/123711733</guid><author>Canger_</author><pubDate>Thu, 24 Mar 2022 15:12:26 +0800</pubDate><description><![CDATA[为什么需要锁
单机程序，在多线程并发情况下，操作同一资源时，需要对其进行加锁等同步措施来保证原子性。举一个多线程自增的例子：
package main
import (
   "sync"
)
// 全局变量
var counter int
func main() {
   var wg sync.WaitGroup
   for i := 0; i &lt; 100; i++ {
       wg.Add(1)
       go func() {
            counter++
     ]]></description><category></category></item><item><title><![CDATA[Golang内存逃逸]]></title><link>https://blog.youkuaiyun.com/Canger_/article/details/123507378</link><guid>https://blog.youkuaiyun.com/Canger_/article/details/123507378</guid><author>Canger_</author><pubDate>Tue, 15 Mar 2022 17:15:31 +0800</pubDate><description><![CDATA[逃逸分析

内存逃逸：栈上的内存逃逸到了堆上的现象就称为内存逃逸

概念
程序在编译阶段根据代码来确认哪些变量分配在栈区，哪些变量分配在堆区。这样可以防止过多内存在堆上分配，减轻GC压力以及程序STW的时间
原理


指向栈对象的指针不能存储在堆中


指向栈对象的指针不能超过该对象的存活期，也就是指针不能再栈对象被销毁后依然存活


如何查看
通过如下方式编译代码可以看到逃逸分析
go build -gcflags='-m -m -l' 


-m -m 能看到所有编译器优化
-l 禁用掉内联优化

分析]]></description><category></category></item><item><title><![CDATA[k8s nginx-ingress crashbackoff]]></title><link>https://blog.youkuaiyun.com/Canger_/article/details/123236530</link><guid>https://blog.youkuaiyun.com/Canger_/article/details/123236530</guid><author>Canger_</author><pubDate>Wed, 02 Mar 2022 18:01:22 +0800</pubDate><description><![CDATA[今天线上打镜像发现编译机出问题了，查看了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/]]></description><category></category></item><item><title><![CDATA[configmap]]></title><link>https://blog.youkuaiyun.com/Canger_/article/details/122945607</link><guid>https://blog.youkuaiyun.com/Canger_/article/details/122945607</guid><author>Canger_</author><pubDate>Tue, 15 Feb 2022 15:23:59 +0800</pubDate><description><![CDATA[创建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]]></description><category></category></item><item><title><![CDATA[k8s服务注册与发现]]></title><link>https://blog.youkuaiyun.com/Canger_/article/details/122898309</link><guid>https://blog.youkuaiyun.com/Canger_/article/details/122898309</guid><author>Canger_</author><pubDate>Sat, 12 Feb 2022 16:24:04 +0800</pubDate><description><![CDATA[一、服务注册

服务注册过程指的是在服务注册表中登记一个服务，以便让其它服务发现。

Kubernetes 使用 DNS 作为服务注册表。为了满足这一需要，每个 Kubernetes 集群都会在 kube-system 命名空间中用 Pod 的形式运行一个 DNS 服务(kube-dns/coredns)，通常称之为集群 DNS。
1.1 注册过程

1、向API Server用POST方式提交一个新的Service定义
2、这个请求需要晶哥认证、鉴权以及其他的准入策略检查过程之后才会放行
3、Servic]]></description><category></category></item><item><title><![CDATA[Docker Compose 文件转换为Kubernetes资源]]></title><link>https://blog.youkuaiyun.com/Canger_/article/details/122697370</link><guid>https://blog.youkuaiyun.com/Canger_/article/details/122697370</guid><author>Canger_</author><pubDate>Wed, 26 Jan 2022 10:49:28 +0800</pubDate><description><![CDATA[使用转换工具Kompose，将Docker Compose转换成容器编排器所能识别的形式。
安装Kompose
# Linux
curl -L https://github.com/kubernetes/kompose/releases/download/v1.24.0/kompose-linux-amd64 -o kompose

# macOS
curl -L https://github.com/kubernetes/kompose/releases/download/v1.24.0/kompose-]]></description><category></category></item></channel></rss>