使用 kubeadm 搭建 kubernetes 集群
kubernetes notes准备4台虚拟机,拓扑为一个 master, 3 个 node 节点,操作系统均为 CentOS 7.9,网络采用桥接模式,设置静态IP。
机器名 | IP |
---|---|
master | 192.168.3.200 |
node1 | 192.168.3.201 |
node2 | 192.168.3.202 |
node3 | 192.168.3.203 |
准备4台虚拟机,拓扑为一个 master, 3 个 node 节点,操作系统均为 CentOS 7.9,网络采用桥接模式,设置静态IP。
机器名 | IP |
---|---|
master | 192.168.3.200 |
node1 | 192.168.3.201 |
node2 | 192.168.3.202 |
node3 | 192.168.3.203 |
从一个需求开发的完整生命周期来看,大约会包含以下过程:
从上属流程可以看出,代码写完了会有专业的测试同事来进行全方位的测试,那么为什么还要 code review 呢?其次,合格的程序员理论上都会 review 自己的代码,还有没有必要请同事来 review 呢?
一个 bug,可能在代码 review 的时候被发现;也可能在测试的时候被发现;最坏的情况下,被用户发现,当然,此时很可能给用户、产品带来损失。越早发现问题,受影响的人员越少,修复成本就越小。
开发人员有时也有一个误区,觉得自己完成 “代码开发” 这一步就万事大吉了,测试的事情就应交给 QA 去执行。但很多时候,QA 更多从功能角度去验证代码,有时候黑箱测试也很难覆盖到全部情况,比如异常、安全性问题、版本依赖。况且现在很多公司都逐渐去掉专门的 Test,开发得自己测试,但思维定势导致很难发现自己的问题,对自己代码的 review 也是如此。另外,知道自己的代码也被人“拿着放大镜仔细观察”,自然写代码的时候也认真一些。
另外,从上述流程可以看出:
在我们的实践中,对于复杂的系统,会要求现先设计 review。而对于简单的、或者开发比较有把握的功能,则是将设计 review 与代码 review 合并。本文讨论的 code review 其实就是后者:既关注设计,又关注核心代码。
Read more...在理解弱引用之前,我们需要先了解 python 中的对象引用和垃圾回收的基本概念,这样更有助于对弱引用的理解。
在 Python 中,一切皆为对象,包括变量、函数、类以及其实例化的对象。我们要是有对象就必须通过赋值语句来创建一个引用(可以理解为标签),比如 a = 1
,这里 a
就是对象 1
的引用。每个引用的所指向的对象都可以通过 id()
函数来查看,两个引用是否相同可以通过 is
运算符来比较。
(==
和 is
的区别:==
运算符比较对象的值(对象中保存的数据),而 is
比较引用的对象是否为同一个。)
如果想要查看一个对象的内引用次数,可以通过 sys.getrefcount(a) -1
查看(减1是因为调用 sys.getrefcount 函数传递参数时会增加一次引用)。
为了说明后面的弱引用,我们将计数的引用成为强引用。
Read more...Django 是一个全能的高级 Python Web 框架,它使得开发人员可以快速构建 Web 应用程序。Django 的一个关键特性就是它对多种数据库的支持。开发人员可以使用各种数据库后端来存储数据,如 SQLite、PostgreSQL、MySQL、Oracle 等等。但是,有时开发人员需要编写自定义数据库后端来支持一些 Django 默认不支持的特定数据库。在本文,我们将学习如何在 Django 中编写自定义数据库的后端。
Read more...在 MogDB 中,参数 synchronous_standby_names
用于配置同步复制设置。特别是当这个参数设置为 '*'
时,表示可以使用任何一个可用的同步备库作为同步备库。这个配置允许任何一个当前连接的备库都可以被用作同步备库,而不需要明确指定备库的名称。
如果你是一名开发人员,你可能每天都会使用 git 作为版本控制系统。这个工具的使用对于应用程序的开发过程是至关重要的,无论是在团队协作还是单独工作。但是,常常会遇到混乱的项目库,提交的 commit 信息不明确,不能传达有用的内容,以及滥用分支等问题。了解如何正确使用 git 并遵循良好的实践对于那些想要在就业市场中脱颖而出的人来说是必不可少的。
Read more...对于一个后端程序员来说,在工作中免不了要和繁杂的服务器打交道,ssh 是不可或缺的开发工具。但每次登录都需要输入密码的行为,对于认为一切皆可自动化的程序员来说,肯定是有点繁琐的(如果您是使用图形化界面的用户可忽略)。
所以我在前段时间考虑,我应该自己实现一个 ssh 客户端,它不需要拥有许多复杂的功能,只需要满足我以下这几个需求即可满足日常使用:
于是乎,近期我在业余时间就设计并编写了 ssx 这个轻量级的具有记忆的 ssh 客户端。它完美的实现了上面我所需要的功能,也已经被我愉快的应用到了日常的开发中。
Read more...如果要查看 Psycopg2 不同接口之间批量操作对比测试,请访问这篇笔记
组件 | 说明 |
---|---|
客户端操作系统 | Rocky Linux 8 |
服务端配置 | 2C6G, 40G HDD |
CPU | Intel Xeon Processor (Icelake) |
数据库 | MogDB 5.0 |
网络 | 300M宽带 |
Python | 3.6.8 |
Psycopg2 | vimiix/openGauss-connector-python-psycopg2 |
Read more...注意:
- 由于真正的性能和服务器的配置,网络情况相关性也比较大,本测试所有的测试用例环境条件一致,只有参数作为变量,所以请不要注重数值本身,重点关注不同情况下的性能比例
- 本测试只取了 100/1000/10000 这个page_size,具有一定的性能趋势,但不代表一味的增大 page_size 就可以提高性能,必然存在一个性能拐点的参数值,而且不同的场景存在不同的性能拐点,要找到性能拐点仍需根据实际情况进行更多的测试。
本测试基于 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 |
网络 | 本地回路网卡 |
Python | 3.6.8 |
优点:
一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项。这被称为CAP理论,已经被证实。
假设服务器目前有多个盘,vdb1
这块分区盘专门用于数据库程序的数据目录,我们就用 vdb1
这个盘来模拟只读故障场景。
umount /dev/vdb1
想要如期卸载掉,需要确保该盘上没有被正在运行进程依赖,如果有运行中的进程依赖这个盘,会报如下报 target is busy
的错误:
umount: /opt: target is busy.
遇到该错误时,可以通过lsof [mountpoint]
命令来查看有哪些进程依赖这块盘,kill 掉相应的进程后重新卸载。
由于 openGauss 数据库本身也开源不久,所以周边基础设施也正处于遍地开花的阶段,所以本文不保证长期的时效性,仅针对现阶段的问题,提出一种解决方案。
按照官网的介绍,openGauss 是一款高性能,高安全,高可靠的开源关系型数据库管理系统,采用木兰宽松许可证v2发行。openGauss内核早期源自开源数据库PostgreSQL,融合了华为在数据库领域多年的内核经验,在架构、事务、存储引擎、优化器及ARM架构上进行了适配与优化。
openGauss 在2020年6月30日开放源代码,代码托管在 gitee 上。
目前我所在公司也主要是做数据库方面的事情,且也基于 openGauss 内核研发了一款商业版的数据库 MogDB,感兴趣的也可以去了解一下。
Read more...C#、Lua、Python 的用户可能会发现 Go 的 goroutine 和协程之间有很多相似之处,没错,从命名上也可以看出二者具有相似性。
但二者之间也有些区别:
Channel
)进行通信;协程通过 yield
和 next
操作进行通信一般来说,goroutine 比协程更强大。而且,我们可以很容易地将协程的逻辑移植到 goroutine 来获得更好的并行效果。
Read more...本质上是通过调用 windows 的一个 API —— LogonUserW
,来实现对于用户密码的校验。
仅适用于在本地校验,不支持远程连接校验
用一个示例代码来进行说明,下面是目录结构中,main.go
是程序入口文件,auth 包中,我们仅实现 windows 系统的校验代码,其他平台不属于本文介绍内容,就直接返回 nil 即可。
beanstalkd 是一个简单快速的分布式工作队列系统,协议基于 ASCII 编码运行在 tcp 上。其最初设计目的是通过后台异步执行耗时任务方式降低高容量 Web 应用的页面延时。而其简单、轻量、易用等特点,和对任务优先级、延时/超时重发等控制,以及众多语言版本的客户端的良好支持,使其可以很好的在各种需要队列系统的场景中应用。
Beanstalk 的应用场景主要有:
原文链接:https://martinfowler.com/articles/richardsonMaturityModel.html
Leonard Richardson 提出的一个模型,将实现 REST 方法的主要元素分解为三个步骤,分别包括:资源(Resources)、HTTP 动词(HTTP Verbs,如GET
、POST
等)和超媒体控制(Hypermedia Controls)。
在Rest In Practice一书中,解释了如何使用 Restful Web Service 来处理企业面临的许多集成问题。本书的核心观点是,Web 就是一个大规模可扩展的分布式系统存在、并可以很好的工作的证明,而我们可以根据这一观点更容易地构建集成系统。
RTB 广告是一种实时竞价广告,就是在针对每个广告位有展示机会的时候,会实时多方竞价,价格最有优势的广告主会竞得这次展示机会,在媒体测在拿到素材的时候,需将本次成交的价格,上报给指定的监控服务器,这时就需要将实时价格按照指定的加密方案加密后,替换 GET 链接中的请求参数中的价格宏来上报。
官方给出的源代码有 Java 和 C++ 版本, 下载地址: https://code.google.com/archive/p/privatedatacommunicationprotocol/source/default/source
本文主要通过 golang 来实现的 google 的价格加密方案。
Read more...当昨天把 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
在 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...