自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

柳清风的专栏

行者程序员

  • 博客(241)
  • 资源 (8)
  • 收藏
  • 关注

原创 海恩法则和监控

就是说一个事情都是关联,当出现一个故障的之前,已经有300的相关的事情发生以及29个危险的事情发生。金字塔的结构,越是向上约靠近真相,越是危险。其实这个可以作为监控系统的理论支撑,从大量的分散的数据中,提取出最有用的价值点,从而能够提前预知并解决问题。避免最后那个 1 的发生。...

2021-07-07 19:14:40 517

原创 nc一把瑞士军刀

TCP# nc -z -v [hostname/IP address] [port number]DEMO# nc -z -v 192.168.10.12 22Connection to 192.118.20.95 22 port [tcp/ssh] succeeded!发送HTTP请求printf “GET / HTTP/1.0\r\n\r\n” | nc google.com 80UDP# nc -z -v -u [hostname/IP address]...

2021-07-07 13:31:18 351

原创 rust cmd stdio demo

use std::process::{Command, Stdio};use std::io::{BufRead, BufReader, Write, stdin, Read};use std::fmt::Error;use std::thread::{spawn};fn main() { run();}fn run() -> Result<(),Error> { let result = Command::new("sh") //.arg(

2021-05-09 10:12:42 375

原创 rust 编写hello world redis

服务端代码use mini_redis::{Connection, Frame};use tokio::net::{TcpListener, TcpStream};use std::sync::{Arc,Mutex};use std::collections::HashMap;use bytes::Bytes;type Db = Arc<Mutex<HashMap<String, Bytes>>>;#[tokio::main]pub async f

2021-04-13 16:06:23 281

原创 rust内存安全--借用

rust的内存安全在编译期间就可以被检查出来。关于借用,总结一句话是“共享不可变,可变不共享”譬如这段代码,是可以通过编译的fn main() { let i = 1; let p1 = &i; let p2 = &i; println!("{} {} {}", i, p1, p2);}虽然发送了共享,但没有修改其内容,是安全的。如果共享给了p1后,i 值又发生了变化,违反了共享不可变fn main() { let mut i = 0;

2021-04-05 14:44:59 302 1

原创 rust函数

基本的函数定义fn add3(x: i32, y: i32) -> i32 { x+y}除了返回值类型需要使用 -> 标识以外,rust函数还有个特别之处,就是可以省略return函数也是头等公民,可以赋值给一个变量let f = add3;println!("{}",f(3, 4))和很多其他语言一样,有个特殊的函数就是main可以在main里面通过std::env::args()获取启动参数或者通过match std::env::var(&a

2021-03-24 21:28:39 231

原创 稳定性不是创可贴

在一次内部的分享中,有位同事分享了稳定性的话题,有句话是这样说的”稳定性不是创可贴“,深有感触,从多年的工作经历分享我对稳定性的认识。一、定义稳定性简单来说就是不出故障,通常理解的稳定性就是几个9,就是一年的服务不可用时间占全年的占比多少。譬如三个9(99.9%) 也就是(1-0.999)36524 =8.76 个小时四个9(99.99%)52.6 分钟五个9(99.999%)5.26 分钟9越多,稳定性越搞,无限趋近1.二、相关因素这个我想分享的重点,通常的观点是认为稳定性就是线上运维

2021-03-21 11:55:04 442 2

原创 diff pprof heap

dump heapcurl -s http://127.0.0.1:8080/debug/pprof/heap > 1231.heap休息十分钟curl -s http://127.0.0.1:8080/debug/pprof/heap > 1241.heapdiffgo tool pprof --http :9090 --base 1231.heap 1241.heap耗费内存最多的并非是泄露的地方,这是一个容易混淆的地方!...

2021-02-08 14:43:17 1420

原创 rust学习笔记-变量和类型

变量通常一门的语言的变量是没有啥可以说道的,无法就是变量命名规则:以字母、下划线和数字组成,并且数字不能开头,没啥好说的。但rust的变量奇怪的地方是,变量不可变譬如这样一个简单到不能再简单的代码fn main() { let a =4; a = 3; println!("{}",a)}编译的时候就会报错3 | a = 3; | ^^^^^ cannot assign twice to immutable variable不能二次分配不可变变

2021-01-24 15:06:42 966

原创 让我们开始rust (一)环境安装

为啥我想学rust呢?无它,没有gc的STW。既有c的速度,又具有安全的内存使用,还不用gc,why not try it!首先是rust运行时安装如果是mac非常方便brew install rust但如果还需要安装一些格式化如:rustfmt等组件的话,通过下面脚本安装curl https://sh.rustup.rs -sSf | sh 我这边是是vscode做rust开发,配置plugin,rust-analyzer这个插件使用起来还是挺方便的。配置完环境后,按照惯例开始我们第

2021-01-22 11:36:37 313

原创 window容器

先问大家一个问题,window上可以跑docker吗?当然可以,其实这句话有两层意思,第一层意思是,window上可以安装docker桌面版本,跑linux容器,本质上,是在window上面启动一个virtualbox的linux,然后在上面跑docker,毕竟runc的namespace和cgroup特性都需要内核支持,那么这就存在一个问题,如果是window的应用如何迁移到容器环境呢?这里引入第二个概念,在window上面跑window容器。废话不多说,我们先来个hello world可以看到成功

2021-01-14 21:06:50 608

原创 谈谈我对云原生的理解

这里我不想再引用Pivotal的Matt Stine的定义,只是想从个人角度思考一下什么是云原生。云原生是啥?在我看来是一套思想,一套完整的方法论和体系。是不是太虚了,的确,云原生就是一套指导意见。它主要有几个核心的工具:容器和基于容器的面向服务设计这个是云原生的的基石,容器镜像将程序和依赖环境打包到一个镜像里面,然后这个镜像就可以随处分发启动,再通过k8s等管理平台编排的调度,对外提供服务能力。面向服务的架构设计和管理,摆脱繁杂的IaaS资源配置。不仅如此Devops的发布流程也离不开容器镜像的支持

2021-01-09 12:01:52 802 2

原创 阿里云logtail学习笔记

最近一直在做logtail的集成工作。发现logtail的确是一个设计精美的日志采集组件。首先它的配置都动态加载的,中心的配置,logtail的组件能够自动同步日志采集配置。logtail还支持各种采集配置,如下所示但最精巧的设计还是他的配置设置。它有几个核心概念:日志库日志库直接负责日志存储,所有Logtail采集的数据最终都会存储到日志库中。日志库由项目进行管理,项目和日志库的关系类似于数据库和表之间的关系。采集配置一个日志库中可包含多个不同的采集配置,日志库下的采集配置默认将数

2021-01-09 11:42:23 786 1

原创 go并发小工具errgroup

先看demopackage mainimport ( "fmt" "golang.org/x/sync/errgroup" "net/http")func main() { var g errgroup.Group var urls = []string{ "http://www.golang.org/", "http://www.xxxzzzzzzxxxx.com", "http://www.google.com/", } for i := range urls {

2020-12-30 09:42:03 731 1

原创 深入理解containerd里面snapshot

先问大家问题,containerd的snapshot是什么鬼? 难道是给容器做快照的吗?答案是: 是也不是为什么说是呢?它的确可以实现部分快照的功能,但他和常规意义的虚拟机快照又不是一回事。我们先看一下containerd是干嘛的?譬如我们拉镜像可以看到snapshot的服务作用是准备rootfs的,就是通过mount各个层,提供容器的rootfs。所有。content只是保存tar和mainfest和config文件的,是OCI那套东西,我们需要将他们逐一解压、mount后提供给容器。所以p

2020-12-26 11:41:47 3757

原创 两个老年人的ssh小工具

在mac的终端中经常需要登录到多个终端,每个终端的IP地址不一样,记住那么多IP实在是一个让人头疼的事情,毕竟年龄大了,脑子开始不好使了。言归正传,第一我们可以使用 ~/.ssh/config 这个文件,Host webserver HostName 192.168.225.22 User timHost db HostName 192.168.225.23 User duncan然后我们就可以通过ssh命令直接登录目标机器了,如下所示:ssh webser

2020-12-14 09:22:50 323 1

原创 k8s都开始抛弃dockerd了,ctr需要搞起了

明年的k8s将剔除docker shim,在未来dockerd大概率会淘汰,是时候搞起ctr。ctr是containerd客户端,虽然目前很多功能做的还没有docker那么完善,但基本功能已经具备了。下面我就来实操一下。主要有几个常用的自命名镜像镜像下载镜像列表查询这里需要注意PLATFORMS,它是镜像的能够运行的平台标识。其他从操作也都类似# ctr i -hNAME: ctr images - manage imagesUSAGE: ctr images comma

2020-12-13 20:11:32 4853 4

原创 再次思考一下go网络包中的接口设计

我们经常使用的http包,无论是客户端还是服务端,都有很多值得推敲的地方。首先是服务端设计;上上篇 我们通过监听一个UDS提供一个http服务,代码大概是这样的 unixListener, err := net.Listen("unix", os.Args[1]) if err != nil { panic(err) } server.Serve(unixListener)这里创建一个listener,然后交给serve去处理。这就体现了接口的作用,把监听交给服务去处理,这里监听其实只

2020-12-09 19:54:40 278

原创 奇技淫巧之dummy网卡

在我们日常工作中,是否有这种需求,在断网的情况下,假装网络可以通,仍然可以通过类似192.168.1.1 这样的IP 访问服务 。除了我们经常使用本例换回口127.0.0.1以外,今天介绍一个神器:dummy网卡。ip link add nodelocaldns type dummyip addr add 169.254.20.10 dev nodelocaldnsip addr add 10.96.0.10 dev nodelocaldns创建网卡后,就可以本地ping通了# ip a1:

2020-12-09 19:19:16 2569

原创 通过unix socket建立http连接

除了我们熟知的tcp连接以外还可以通过本地socket建立通信,Unix Domain Socket的英文简称是UDS,就是一种常用的方式,但它只支持建立本地连接,它的好处是通过路径而非端口建立连接,好处是可以避免端口占用。首先看服务端代码package mainimport ( "fmt" "net" "net/http" "os")func main() { if len(os.Args) < 2 { fmt.Fprintln(os.Stderr, "usage:",

2020-12-05 16:00:27 2246 1

原创 在阿里云神龙上面玩KVM

安装kvm# yum install qemu-kvm libvirt libguestfs-tools virt-install查看网络# virsh net-dumpxml default网卡加入网桥# vi /etc/sysconfig/network-scripts/enp3s0BRIDGE=br0创建网桥 vi /etc/sysconfig/network-scripts/ifcfg-br0DEVICE="br0"# I am getting ip from DHCP s

2020-11-24 10:20:28 333

原创 beego write header 坑

一个普通公共方法,主要是处理json个数数据返回。// Response return responsefunc (c *BaseController) Response(code int, data interface{}) { c.Ctx.ResponseWriter.WriteHeader(code) c.Data["json"] = data c.ServeJSON()}ServeJSON里面调用JSON方法,如下func (output *BeegoOutput) JSON(da

2020-08-18 09:58:23 1419

原创 k8s configmap subpath bug

下面是我们生产环境容器的重启日志,可以看到是configm挂载失败了。但奇怪的是只有一个pod发生了这个现象。登录到主机后,发现mount挂载已经不存在了。# cat /proc/self/mountinfo |grep subpath3254 61 253:0 /var/lib/kubelet/pods/a90fef26-916e-11e9-b408-d2840e89eb12/volumes/kubernetes.io~configmap/fsosmpc-x0/..2019_06_18_02_13

2020-07-12 18:10:15 1652

原创 promethus 的 relabel_configs 和 metric_relabel_configs

很多童鞋在群里面反馈 relabel_configs 和 metric_relabel_configs 两个配置使用区别。都是relabel譬如relabel_configs的relabel如下: - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape] separator: ; regex: "true" replacement: $1 action: keep - sourc

2020-07-12 16:56:12 2421

原创 http 301 302 303 307 308 傻傻分不清

http的重定向我们经常是张口就来,“小明,在nginx上做一个重定向就行了”。整个流程非常简单,服务端HTTP返回码是30x,头里面的Location字段代表新的URL。如下图所示:但重定向也还是有需要深入探讨地方,返回码不仅有我们经常使用301和303还有302 307 308 它们有啥区别呢。可以按照是否缓存和重定向方法,两个维度去拆分。缓存(永久重定向)不缓存(临时重定向)转GET301302、303方法保持308307如果是永久重定向那么浏览器客户端

2020-07-04 16:37:48 1662 1

原创 把对象存储转为文件存储,到底香不香?

目前开源的文件存储有很多,譬如NFS、GlusterFS、CephFS等,但实话实话这些文件存储都存在一定的问题,譬如NFS的多集群要折腾、GlusterFS的小文件存储性能差、CephFS的运维复杂度和稳定性不高。结合公司的业务场景:图片、pdf、文档 存储的特性,在公司内部主推的是对象存储。但在推广对象存储的时候,也面临一些老系统的改造压力,这些老系统之前都是使用商业NAS,如果迁移到对象存储需要改造的点有很多,而且还需要考虑历史数据的读取。如果对象存储能够保持和之前商业NAS一样的有个文件系统,通过

2020-05-14 09:52:19 1372

原创 linux内核的oom score是咋算出来的

本篇文章主要和大家分享linux的oom_score的工作原理。关于kubernetes的Qos在之前的blog已经分享过了,感兴趣的童鞋可以去看一下。k8s的Qos底层便是依赖内核的OOM机制。linux的OOM killer是为了在内存不足的情况下,杀掉消耗内存最多、优先级最低的任务,从而保障系统不被搞挂。这里有两个取决因素:(1)oom_score内核通过内存消耗计算得出 (2)oom_...

2020-04-23 09:49:05 7500 2

原创 raft算法-顺带处理前任的事-看似随心却是精心

今天在跑raft算法的时候,突然发现一个有意思的细节:如何处理前任未提交的日志。我们都知道raft选举的时候会综合考虑任期(term)和日志索引(index),优先选择具备最新的数据的节点成为master,这个其实非常容易理解,这是为了最大化保持数据。但这里面有个小细节就是,如下图所示,S3在任期7的时候提交了一个日志,但它还没来得及复制就挂了。之后master切换到其他节点。如果此时其他...

2020-04-05 14:45:59 316

原创 记录ceph对象存储的一个bug

我们的对象存储是基于ceph的对象存储搭建的,测试环境是N版本的,生产环境是M版本的。业务使用的是doesObjectExist这个API,核心Java代码如下 boolean exists = s3Client.doesObjectExist(bucketName, object+"ss"); if (exists) { System.ou...

2020-04-04 12:39:19 597

原创 TCP漫谈之为啥需要timewait状态

tcp的状态状态转化图如下所示,其中Time_awit状态是CLOSED之前的一个状态,等待2个MSL时间。为啥需要time_awit状态呢?为啥不直接进入closed状态呢?这样不就能更快的释放资源给新的连接使用了吗?而是还需要等待2MSL(linux默认)时间。有两个原因,第一个原因是为了防止“迷路的数据包”,如下图所示,如果在第一个连接里面第三个数据包由于底层网络故障延迟送达。等待新的...

2020-03-30 16:47:20 803

原创 TCP漫谈之keepalive

tcp是一个有状态通讯协议,所谓的有状态是指通信过程中通信的双方各自维护连接的状态。先简单回顾一下TCP的连接建立和断开的整个过程。这里主要考虑主流程(关于丢包、拥塞、窗口、失败重试等情况后面详细讨论),首先是客户端发送syn(Synchronize Sequence Numbers:同步序列编号)包给服务端,告诉服务端我要连接你,syn包里面主要携带了客户端的seq序列号。服务端回发一个syn...

2020-03-30 16:20:33 1591

原创 写Dockerfile的一个小坑

下面是是一个简单的Dockerfile。FROM centosENV LANG en_US.UTF-8ENV TZ Asia/ShanghaiCOPY softs/jdk1.8.0_161 /opt/RUN set -ex && \rm /bin/sh && \ln -sv /bin/bash /bin/sh && \chmod ...

2020-03-30 15:57:20 674

原创 linux内核网络参数tcp_tw_recycle 和 tcp_tw_reuse 你搞清楚了吗?

今天在生产环境遇到了一个奇怪的网络现象,通过抓包发现,SYN包没有ACK。可以ping通,防火墙开放的情况下,基本确定对方服务器问题。首先排除端口是否已经耗尽,发现仍有很多富余那么可能就是linux内核网络参数tcp_tw_recycle捣鬼。登录对方主机发现这个参数的确被设置成1.# sysctl -a|grep tcp_tw_recyclenet.ipv4.tcp_tw_recycle...

2019-10-21 15:05:35 14141

原创 磨刀不误砍柴工(1)stress 和 pidstat

stress命令stress命令是一个常用的压测工具常用参数解析:-t指定超时时间 -t, --timeout N 超时时间,指定stress执行多长时间 -c, --cpu N 启动N个线程执行开方操作,目的就是把这N个核跑满 -i, --io N 启动N个线程执行sync()操作刷磁盘 -m, --vm N 启动N个线程执行malloc()/free(...

2019-03-23 11:48:26 785

原创 golang的slice你真的搞懂了吗

golang slice先看一个简单的代码块package mainimport ( &quot;fmt&quot;)func main() { //case 1 a := []int{} a = append(a, 1) a = append(a, 2) b := append(a, 3) c := append(a, 4) fmt.Println(&quot;a: &quot;, a, &quot;\nb: &quot;,..

2019-02-12 15:41:38 482

原创 轻松一刻,算法求最大蓄水面积

一个有意思的题目,求最大蓄水面积简单介绍一下,找到两个柱子,使其“蓄水”面积最大譬如Input: [1,8,6,2,5,4,8,3,7]Output: 49如果是直接暴力破解当然可以,两层for循环,组合所有可能,搞定当着肯定不是最好的方式,我们仔细思考一下,就会发现这个面积取决两个因素:长 * 宽这不是废话吗!当这个“水池”的左右两个边分别是开始和结束的柱子,那么它的长最大了,对...

2018-12-06 10:16:40 1278

原创 flannel 最新版网络实现解析

我发布在公司网站上,在此连接记录一下:http://college.creditease.cn/#/detail/15/176

2018-10-25 08:46:18 1085

原创 kubernetes 问题汇总

invalid容器创建的容器有个创建的时长的选项age,测试环境发现有的容器时间是invalid,通过代码查看原来是时间不对 因为每个kubelet是定时上报的,上报是基于本地当前时间的。wildfly-rc-1l9qv 0/1 ContainerCreating 0 &lt;invalid&gt;解决办法,在每个机器安装ntp服务。保持每个节点...

2018-09-12 10:59:28 3763

原创 linux网络hack用法之onlink路由

在单网卡机器上,如果配置eth0的地址为192.168.40.249/32,那么别指望用常规的方式添加任何路由,这是因为链路层直连路由已经不存在了,我们如下的尝试: route add -net 192.168.0.0/16 gw 192.168.40.254 将失败,因为网关地址并不和本地地址同在任何一个网段,那么如何是好呢?Linux的iproute2工具包提供了一个onlink参数,可以...

2018-09-12 10:53:54 5967

原创 linux的网络hack用法之arp

arp我们都知道arp协议在网络中重要位置,如果没有arp整个二层和三层的网络将全部瘫痪,那么linux 内核在arp上面有哪些细节和特殊用法吗,下面我们逐一介绍 首先看一下各种状态 这里我们看到arp表所有的状态信息,我特地标注黄色的stale状态是一个最特殊的状态。 然后再看看各个状态的切换图 首先是arp的表的配置在/proc/sys/net/ipv4/neigh/*...

2018-09-03 10:23:26 1407 1

kustomize_v4.2.0_darwin_amd64.tar.gz

kustomize_v4.2.0_darwin_amd64.tar.gz

2021-08-26

helm-v3.6.3-linux-amd64.tar.gz

linux helm 二进制

2021-08-26

helm-v3.6.3-darwin-amd64.tar.gz

mac helm 二进制

2021-08-26

go1.16.7.linux-amd64.tar.gz

go1.16.7.linux-amd64.tar.gz

2021-08-17

linux网络实现分析

linux操作系统网络实现

2016-07-27

pygame msi安装包

基于win64位 python2.7的pygame包,可以用于python音乐游戏开发

2016-07-27

zookeeper安装包

zookeeper安装,在linux环境下部署安装zookeeper

2014-12-24

CSS编辑器 TopStylePortable.exe

最实用CSS开发工具不仅有各个浏览器支持说明而且还有很多提示。非常实用

2013-04-13

空空如也

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

TA关注的人

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