• Golang: 深入理解panic and recover

    panic recover 通过panic+recover来简化错误处理 recover是怎么实现的 defer recovery是如何切回来的 panic是怎么退出的 下文会介绍panic/recover的通常使用方法,并试图深入挖掘其实现原理,在这个过程中顺便介绍了defer的实现。 panic Golang里比较常见的错误处理方法是返回error给调用者,但如果是无法恢复的错误,返回error也没有意义,此时可以选择go die:主动触发panic。 除了...


  • minio是怎么解决数据可靠性的?

    同事新部署了一个minio集群,用了3台服务器,每个服务器上配置了3个目录;还有一个集群,也是3台服务器,每个服务器上配置了2个目录。 那么,能不能用3台服务器,每个服务器上1个目录呢? 不能。minio的备份机制与HDFS、盘古之类不同。 HDFS、盘古,是一份数据3份副本,只要还有一个机器在,数据就不会丢失。但这样磁盘的利用率其实挺低的,只有原始容量的1/3。 而minio使用erasure code(纠删码)的机制来解决数据的可靠性。这个机制对目录数有要求。 纠删码通过算法将原始的数...


  • Google BBR拥塞算法

    问题 Congestion and Bottlenecks loss-based congestion control bufferbloat,缓冲膨胀 状态机切换 计算公式 施工中… 问题 手机蜂窝用户、wifi用户,上网速度很慢。虽然基础设施已经有Gbps为单位的带宽了,但是洲际用户却只能得到Mbps的连接。 原因是:TCP将报文丢失视为网络拥塞。这在1980年的时候是正确的,但随着网络硬件技术的发展,带宽从Mbps升级到了Gbps,硬件存储也从KB...


  • 源地址审计:追踪 kubernetes flannel网络的SNAT

    在前文源地址审计:追踪 kubernetes 服务的SNAT ,我介绍了kubernetes的svc的SNAT,以及如何避免的方法,但实际应用时,还会遇到另一种SNAT的情况:flannel。 有关flannel请参考我的另外两篇文章:kubernets的网络插件:flannel 和kubernetes flannel代码解析。 先来介绍下背景。 我们某个产品由于某些不可告人的原因,server需要多实例,并且需要server对外提供服务的端口号是不变的(可以参考云上的RDS,假设是3306)...


  • 自己动手,更换撞破的佳能相机外屏

    这次去新西兰,回来的时候,相机是放在行李箱托运的。行李箱里还有两瓶红酒(长相思什么的)。红酒用衣服包裹的很好,回来一滴没洒,相机却把外屏撞破了。 这是别人家撞破的外屏,我的跟这个差不多,只是我撞坏的是右上角。不补的话,势必会进去很多灰,也很难清理。 最好是换一个。上网查教程,刚好前几天因为不可描述的原因,G家用不了,只好用百度和必应试着查了查说明,却没有找到。淘宝有卖外屏,但说明只是卖给维修同行,心下惴惴,不敢下单。 看到有卖钢化膜,心想要是这玩意能贴在撞破的外屏外面,包住了应该也凑合能用...


  • ssh over socks5:通过socks5 proxy来连接ssh服务器

    最近因为不可描述的原因,我在aws soul的云主机访问不了,ssh、80、ss全部都被禁掉了。 80端口在chrome配置SwitchyOmega就可以了,但ssh不太好办,shell上配置http_proxy对ssh没什么用。 其实ssh自己就支持proxy。 注意这跟在ssh端口转发:远程和本地中介绍过使用ssh作为proxy的方法不同,ssh -D是为了用ssh做proxy,而不是通过proxy来连接ssh服务器。 TL;DR ssh -o ProxyCommand='nc -x 1...


  • 新西兰自驾游

    航班 车辆事故救援 Kaikoura Punakaiki Hokitika Fox glacier Wanaka Queenstown Glenorchy Mount Cook 总的来说 休了个长假,来新西兰🇳🇿转转。 去年在澳洲转了两星期,本来想写个游记,但每每想开始写的时候就觉得无从下手,所以这次索性就边走边写。 理想是每天写一写,但现实很困难,比如有时候喝多了有时候太累了什么的。现在等转机,随便写写吧。 航班 我们是上午乘坐香港航...


  • 源地址审计:追踪 kubernetes 服务的SNAT

    现象:无法审计的客户端地址 原因:不得不做的SNAT 实现:iptables 解决方法:externalTrafficPolicy,跳过SNAT 现象:无法审计的客户端地址 对于运行在kubernetes上、且允许从集群外访问的应用来说,使用nodePort是一个不错的方案。客户端可以使用集群任一节点+nodePort来访问,如果再配置一个vip,就更方便了。 但nodePort有一个问题是,在容器中运行的应用,无法正确的审计客户端的ip地址:容器中看到的socket连接的源...


  • 阿里云 kubernetes yum 仓库镜像

    安装kubernetes的时候,需要安装kubelet, kubeadm等包,但k8s官网给的yum源是packages.cloud.google.com,国内访问不了,此时我们可以使用阿里云的yum仓库镜像。 阿里云上没有附Help说明连接,简单摸索了下,如下设置可用(centos)。注意不要开启check。 cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=ht...


  • dnsmasq动态更新

    kube-dns在kubernetes中负责域名解析,其中真正在提供dns服务的是dnsmasq容器。我们为了能让kubernetes上的容器也能根据主机名来访问宿主机,将宿主机的/etc/hosts文件以configmap volume的形式挂载到了dnsmasq容器中,让dnsmasq读取改hosts文件,从而提供宿主机的域名解析。 [root@m1 ~]# kubectl exec -it kube-dns-75qmb sh -n kube-system -c dnsmasq / # ps ...