====================
== Hi, I'm Vimiix ==
====================
Get hands dirty.

使用 kubeadm 搭建 kubernetes 集群

kubernetes notes

准备4台虚拟机,拓扑为一个 master, 3 个 node 节点,操作系统均为 CentOS 7.9,网络采用桥接模式,设置静态IP。

机器名IP
master192.168.3.200
node1192.168.3.201
node2192.168.3.202
node3192.168.3.203
Read more...

如何做code review

code review notes project

为什么要做code review

从一个需求开发的完整生命周期来看,大约会包含以下过程:

  1. 需求分析,考虑人员情况、功能预期上线时间、技术难度等诸多因素,与 PM 讨论合理调整需求,分配资源;
  2. 整体设计,对设计进行 review;
  3. 代码开发;
  4. 开发自我 review,观察、思考与整体设计的出入,保证代码遵循团队规范(至少得通过静态代码检查);
  5. 添加相应的单元测试,并保证已有的单元测试不受影响;
  6. code review,请相关同事对代码进行 review,修复 review 中发现的问题
  7. 提交代码给 QA 测试,QA 会进行功能测试、集成测试、性能测试、压力测试等;
  8. 修复测试发现的 bug 后功能上线。

从上属流程可以看出,代码写完了会有专业的测试同事来进行全方位的测试,那么为什么还要 code review 呢?其次,合格的程序员理论上都会 review 自己的代码,还有没有必要请同事来 review 呢?

一个 bug,可能在代码 review 的时候被发现;也可能在测试的时候被发现;最坏的情况下,被用户发现,当然,此时很可能给用户、产品带来损失。越早发现问题,受影响的人员越少,修复成本就越小。

开发人员有时也有一个误区,觉得自己完成 “代码开发” 这一步就万事大吉了,测试的事情就应交给 QA 去执行。但很多时候,QA 更多从功能角度去验证代码,有时候黑箱测试也很难覆盖到全部情况,比如异常、安全性问题、版本依赖。况且现在很多公司都逐渐去掉专门的 Test,开发得自己测试,但思维定势导致很难发现自己的问题,对自己代码的 review 也是如此。另外,知道自己的代码也被人“拿着放大镜仔细观察”,自然写代码的时候也认真一些。

另外,从上述流程可以看出:

  • 其实应该有两次定位不同的 review:对整体设计的 review,主要目的是从大方向上保证设计确实能满足需求;其次是 code review,保证代码实现符合设计约束,且编码没有明显的缺陷。
  • 用来 code review 的代码,应该既满足团队代码规范,又基本保证功能的正确。

在我们的实践中,对于复杂的系统,会要求现先设计 review。而对于简单的、或者开发比较有把握的功能,则是将设计 review 与代码 review 合并。本文讨论的 code review 其实就是后者:既关注设计,又关注核心代码。

Read more...

Python中的弱引用

python weakref notes

前言

在理解弱引用之前,我们需要先了解 python 中的对象引用和垃圾回收的基本概念,这样更有助于对弱引用的理解。

对象引用

在 Python 中,一切皆为对象,包括变量、函数、类以及其实例化的对象。我们要是有对象就必须通过赋值语句来创建一个引用(可以理解为标签),比如 a = 1,这里 a 就是对象 1 的引用。每个引用的所指向的对象都可以通过 id() 函数来查看,两个引用是否相同可以通过 is 运算符来比较。

(==is 的区别:== 运算符比较对象的值(对象中保存的数据),而 is 比较引用的对象是否为同一个。)

如果想要查看一个对象的内引用次数,可以通过 sys.getrefcount(a) -1 查看(减1是因为调用 sys.getrefcount 函数传递参数时会增加一次引用)。

为了说明后面的弱引用,我们将计数的引用成为强引用。

Read more...

自定义 Django 中数据库的后端

django python notes database

Django 是一个全能的高级 Python Web 框架,它使得开发人员可以快速构建 Web 应用程序。Django 的一个关键特性就是它对多种数据库的支持。开发人员可以使用各种数据库后端来存储数据,如 SQLite、PostgreSQL、MySQL、Oracle 等等。但是,有时开发人员需要编写自定义数据库后端来支持一些 Django 默认不支持的特定数据库。在本文,我们将学习如何在 Django 中编写自定义数据库的后端。

Read more...

MogDB 中 synchronous_standby_names 参数的工作机制

mogdb synchronous_standby_names notes

在 MogDB 中,参数 synchronous_standby_names 用于配置同步复制设置。特别是当这个参数设置为 '*' 时,表示可以使用任何一个可用的同步备库作为同步备库。这个配置允许任何一个当前连接的备库都可以被用作同步备库,而不需要明确指定备库的名称。

Read more...

[译]做一个拥有 Git 好习惯的开发者

translation git best-practices

如果你是一名开发人员,你可能每天都会使用 git 作为版本控制系统。这个工具的使用对于应用程序的开发过程是至关重要的,无论是在团队协作还是单独工作。但是,常常会遇到混乱的项目库,提交的 commit 信息不明确,不能传达有用的内容,以及滥用分支等问题。了解如何正确使用 git 并遵循良好的实践对于那些想要在就业市场中脱颖而出的人来说是必不可少的。

Read more...

SSX,一个有记忆的 ssh 客户端

golang ssx ssh tools

需求来源

对于一个后端程序员来说,在工作中免不了要和繁杂的服务器打交道,ssh 是不可或缺的开发工具。但每次登录都需要输入密码的行为,对于认为一切皆可自动化的程序员来说,肯定是有点繁琐的(如果您是使用图形化界面的用户可忽略)。

所以我在前段时间考虑,我应该自己实现一个 ssh 客户端,它不需要拥有许多复杂的功能,只需要满足我以下这几个需求即可满足日常使用:

  • 和 ssh 保持差不多的使用习惯
  • 仅在第一次登录时询问我密码,后续使用无需再提供密码
  • 可以给服务器它任意的标签,这样我就可以自由地通过IP 或者标签来登录

于是乎,近期我在业余时间就设计并编写了 ssx 这个轻量级的具有记忆的 ssh 客户端。它完美的实现了上面我所需要的功能,也已经被我愉快的应用到了日常的开发中。

Read more...

psycopg2基于openGauss中execPramasBatch和execPreparedBatch接口测试

driver psycopg2 benchmark

如果要查看 Psycopg2 不同接口之间批量操作对比测试,请访问这篇笔记

测试环境

组件说明
客户端操作系统Rocky Linux 8
服务端配置2C6G, 40G HDD
CPUIntel Xeon Processor (Icelake)
数据库MogDB 5.0
网络300M宽带
Python3.6.8
Psycopg2vimiix/openGauss-connector-python-psycopg2

注意:

  1. 由于真正的性能和服务器的配置,网络情况相关性也比较大,本测试所有的测试用例环境条件一致,只有参数作为变量,所以请不要注重数值本身,重点关注不同情况下的性能比例
  2. 本测试只取了 100/1000/10000 这个page_size,具有一定的性能趋势,但不代表一味的增大 page_size 就可以提高性能,必然存在一个性能拐点的参数值,而且不同的场景存在不同的性能拐点,要找到性能拐点仍需根据实际情况进行更多的测试。
Read more...

psycopg2 批量操作接口性能测试

driver psycopg2 benchmark

测试版本

本测试基于 openGauss 版本的 psycopg2 驱动

import psycopg2 as pg
>>> pg.__libpq_version__
90204
>>> pg.__version__
'2.8.6 (dt dec pq3 ext)'

测试环境

组件说明
客户端Rocky Linux 8 虚拟机
数据库openGauss 3.0.3 in docker
网络本地回路网卡
Python3.6.8
Read more...

Shell 函数实现Go语言多版本管理轻量级方案

golang solution multi-version

现有的工具方案

我的方案

优点:

  • 原生:基于 go 语言本身支持多版本的能力实现,可以下载任何官方发布的版本
  • 简单:shell 函数实现,直接集成到 bashrc 或 zshrc 中即可使用,无需额外配置
  • 可定制化:代码简单可根据自身需求定制
Read more...

分布式事务笔记(XA,TCC,Saga)

distributed note

基础理论

CAP理论

一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项。这被称为CAP理论,已经被证实。

  • 一致性(Consistency) :在分布式系统中所有的数据备份,在同一时刻都保持一致状态,如无法保证状态一致,直接返回错误。
  • 可用性(Availability):在集群中一部分节点故障,也能保证客户端访问系统并得到正确响应,允许一定时间内数据状态不一致。
  • 分区容错性(Partition tolerance):分布式系统在遇到任何网络分区故障时,仍然能保证对外提供满足一致性和可用性的服务,除非整个网络环境都发生故障。
Read more...

磁盘只读(readonly)故障场景模拟

disk simulate test

假设服务器目前有多个盘,vdb1这块分区盘专门用于数据库程序的数据目录,我们就用 vdb1 这个盘来模拟只读故障场景。

image-20210901154323971

1. 卸载指定盘

umount /dev/vdb1

想要如期卸载掉,需要确保该盘上没有被正在运行进程依赖,如果有运行中的进程依赖这个盘,会报如下报 target is busy 的错误:

umount: /opt: target is busy.

遇到该错误时,可以通过lsof [mountpoint] 命令来查看有哪些进程依赖这块盘,kill 掉相应的进程后重新卸载。

Read more...

使用SQLAlchemy以多IP方式连接openGauss数据库

SQLAlchemy Python openGauss

前置声明

由于 openGauss 数据库本身也开源不久,所以周边基础设施也正处于遍地开花的阶段,所以本文不保证长期的时效性,仅针对现阶段的问题,提出一种解决方案。

openGauss 介绍

按照官网的介绍,openGauss 是一款高性能,高安全,高可靠的开源关系型数据库管理系统,采用木兰宽松许可证v2发行。openGauss内核早期源自开源数据库PostgreSQL,融合了华为在数据库领域多年的内核经验,在架构、事务、存储引擎、优化器及ARM架构上进行了适配与优化。

openGauss 在2020年6月30日开放源代码,代码托管在 gitee 上。

目前我所在公司也主要是做数据库方面的事情,且也基于 openGauss 内核研发了一款商业版的数据库 MogDB,感兴趣的也可以去了解一下。

Read more...

Golang的并行模式实践

concurrency golang goroutine

Goroutine

C#、Lua、Python 的用户可能会发现 Go 的 goroutine 和协程之间有很多相似之处,没错,从命名上也可以看出二者具有相似性。

但二者之间也有些区别:

  • goroutine 隐含了并行的特性,一切交给 go 的 runtime 来实现调度,而协程需要应用自己来编写并行代码
  • goroutine 通过信道(Channel)进行通信;协程通过 yieldnext操作进行通信

一般来说,goroutine 比协程更强大。而且,我们可以很容易地将协程的逻辑移植到 goroutine 来获得更好的并行效果。

Read more...

Golang实现Windows系统用户和密码校验

note windows golang

本质上是通过调用 windows 的一个 API —— LogonUserW ,来实现对于用户密码的校验。

仅适用于在本地校验,不支持远程连接校验

用一个示例代码来进行说明,下面是目录结构中,main.go 是程序入口文件,auth 包中,我们仅实现 windows 系统的校验代码,其他平台不属于本文介绍内容,就直接返回 nil 即可。

Read more...

beanstalkd消息队列

beanstalkd note Python MQ

beanstalkd 是一个简单快速的分布式工作队列系统,协议基于 ASCII 编码运行在 tcp 上。其最初设计目的是通过后台异步执行耗时任务方式降低高容量 Web 应用的页面延时。而其简单、轻量、易用等特点,和对任务优先级、延时/超时重发等控制,以及众多语言版本的客户端的良好支持,使其可以很好的在各种需要队列系统的场景中应用。

Beanstalk 的应用场景主要有:

  • 消息异步处理(消息队列的基本需求)
  • 消息延迟处理,实现循环队列
Read more...

[译]Richardson成熟度模型

translation Richardson

原文链接:https://martinfowler.com/articles/richardsonMaturityModel.html

迈向 REST 的荣耀之巅

Leonard Richardson 提出的一个模型,将实现 REST 方法的主要元素分解为三个步骤,分别包括:资源(Resources)、HTTP 动词(HTTP Verbs,如GETPOST等)和超媒体控制(Hypermedia Controls)。

Rest In Practice一书中,解释了如何使用 Restful Web Service 来处理企业面临的许多集成问题。本书的核心观点是,Web 就是一个大规模可扩展的分布式系统存在、并可以很好的工作的证明,而我们可以根据这一观点更容易地构建集成系统。

Read more...

Golang实现Google在RTB广告中价格加密方案

solution golang rtb

RTB

RTB 广告是一种实时竞价广告,就是在针对每个广告位有展示机会的时候,会实时多方竞价,价格最有优势的广告主会竞得这次展示机会,在媒体测在拿到素材的时候,需将本次成交的价格,上报给指定的监控服务器,这时就需要将实时价格按照指定的加密方案加密后,替换 GET 链接中的请求参数中的价格宏来上报。

官方给出的源代码有 Java 和 C++ 版本, 下载地址: https://code.google.com/archive/p/privatedatacommunicationprotocol/source/default/source

本文主要通过 golang 来实现的 google 的价格加密方案

Read more...

Mac 升级10.12.6 mvim 打开文件报错

solution mac mvim

当昨天把 Mac 升级了 10.12.6 Sierra 以后,mvim 打开文件的时候就开始报错,使用该方法已解决~

报错信息

dyld: Library not loaded: /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/libruby.2.0.0.dylib
  Referenced from: /usr/local/Cellar/macvim/8.0-146/MacVim.app/Contents/bin/../MacOS/Vim
  Reason: image not found
[1]    33114 abort      mvim -v
Read more...

Golang如何确保一个类型实现了某个interface

note interface golang

在 golang 中,接口(interface)代表一种『协议』存在,它是一个声明了多个方法的集合。

接口是被隐式实现的,也就是说,我们在开发中定义一个类型(type)的时候,不需要声明这个类型实现了哪个接口。在使用的时候往往通过断言来的 ok-idom 来进行类型判断该类型是否实现了目标接口,放置调用方法失败抛出 panic:

if value, ok := AType.(BInterface) {
  fmt.Println("ok")
} else {
  fmt.Println("no")
}

如果断言失败,那么 ok 的值将会是 false,但是如果断言成功 ok 的值将会是 true,同时 value 将会得到所期待的正确的值。

Read more...
1 of 5 下一页