BingoStack

Long way to full stack!


  • 首页

  • 标签

  • 分类

  • 归档

杀死那些与我没有亲缘关系的进程

发表于 2021-04-04 | 更新于: 2021-04-05 | 分类于 linux工具 , shell
字数统计: 1.5k | 阅读时长 ≈ 6

人不为己,天诛地灭。
直到这一天,某个进程也决定要这么去做。
而你,也决定做个幕后黑手,助他一臂之力。

需求

指定一个文件路径,所有访问这个文件的进程,除目标进程外,全部杀掉。
因为自己也在访问这个文件,所以不能直接lsof后全部杀死。
而因为系统机制,父进程及祖先进程也不能杀死。
而子进程可能是目标进程启动的子任务,因此也不能杀死。
悲催的是,pstree等第三包的命令不允许使用。

基本方法

不能杀死父进程,以及祖先进程,否则可能会被一窝端。
也不能杀死子孙进程:不孝有三,无后为大。
但是叔叔辈、伯伯辈以及他们的子孙分支,那就只能 say sorry 了。

阅读全文 »

使用ansible执行shell命令的正确姿势

发表于 2021-03-27 | 更新于: 2021-04-04 | 分类于 linux工具 , ansible
字数统计: 1k | 阅读时长 ≈ 4

背景

ansible 本身提供了很多内置模块用于完成各种功能。
这样做的好处,一是屏蔽系统差异,比如包管理,你不需要再去操心yum还是apt。(当然包名其实也不省心。)
二是面向终态的设计,避免了过程式的问题。
好处很多,可有些时候你就是不想用。
放弃吧,让 ansible shell 模块拯救你于水火。

基本用法

ad-hoc直接运行,瞬间上手。常用于一次性任务或者测试:
ansible localhost -m shell -a 'ls'

play用法

支持一条、多条命令,可以通过 ignore_errors 忽略返回值,可以引用 ansible 变量。

阅读全文 »

Redis lua基本使用最佳实践

发表于 2019-04-05 | 更新于: 2021-04-06 | 分类于 Redis
字数统计: 529 | 阅读时长 ≈ 1

最佳实践有点大了,其实就是几个使用建议。

背景知识

redis 的单条命令可保证原子性,但多条命令无法保证。
甚至分布式场景下, mget 这种会被分拆的命令也无法保证原子性。
而如何保证多条命令的原子性呢?此时可以使用 lua。

典型使用场景有rate limit等。

使用建议

先说结论,后续详细解释:

  • 正确的使用方法
    1. lua 脚本维护在代码中
    2. 找个测试服务器,SCRIPT LOAD此lua脚本,拿到sha值
    3. 执行脚本时,先EVALSHA,如果报找不到脚本错误,再执行EVAL+lua脚本内容(可以提前预热)
    4. 随着所有节点都执行过EVAL,之后只需要执行EVALSHA就可以
  • lua 脚本尽量简单,负责可能会影响其它请求
  • 参数一定要通过KEYS和ARGV传入,而且一定要区分二者区别
  • 不要在代码里面动态修改lua脚本,那样每次请求都是一个新的lua脚本,消耗大量内存
阅读全文 »

使用redis实现分布式锁的正确姿势

发表于 2018-11-12 | 更新于: 2020-11-03 | 分类于 Redis
字数统计: 1.5k | 阅读时长 ≈ 6

锁是我们在实现大多数系统时绕不过的话题。一旦有竞态条件出现,任何不经保护的操作,都可能带来问题。

而现代系统大多为分布式系统,这就引入了分布式锁,要求具有在分布各处的服务上保护资源的能力。

而实现分布式锁,目前大多有以下3种方式:

  • 使用数据库实现
  • 使用redis等缓存系统实现
  • 使用zookeeper等分布式协调系统实现

其中redis简便灵活,高可用分布式,且支持持久化。本文即介绍基于redis实现分布式锁。

阅读全文 »

TCP的KeepAlive使用简介

发表于 2018-04-12 | 更新于: 2020-11-03 | 分类于 网络编程
字数统计: 2.7k | 阅读时长 ≈ 12

在现代应用系统实现中,我们一般使用长连接与服务端进行交互,以减少建立连接的开销。
同时使用连接池,维护特定数量的连接以备随时使用。
但是在NAT等有中间设备的情况下,长连接很可能因为某些原因被断开。
从而导致连接池失去应有的作用。

基于这些需求,就需要使用TCP的keepalive功能。
它能提供一种自动、高效、可灵活配置,相比应用层心跳包更轻量的连接保活方式。

背景介绍

当我们需要对外提供服务的时候,尤其是KV存储这种对稳定性更高的中间件服务,一般会使用VIP, 而不是让用户直连:

  • 减少变更时对用户的影响:如proxy替换、扩容、维护
  • 高可用:更方便的高可用,用户无需探活健康检查等
  • 隐藏拓扑细节:更高的安全性

使用VIP时需要注意的是,长时间idle的连接会被reset。
原因是LVS一般配置为保持连接有时间限制,如果超过此时间后连接上一直没有报文,LVS就会发送RST报文断开链接。
这么做的原因是为了节省连接资源,也避免攻击。

但是在实际使用场景中,用户一般使用资源池维护长连接。
在连接池中预留部分多余连接是合理的,此部分连接应该保证长期有效。

这就需要用到TCP的keepalive功能。

阅读全文 »

解密Redis持久化

发表于 2017-04-22 | 更新于: 2020-11-03 | 分类于 Redis
字数统计: 838 | 阅读时长 ≈ 2

本文主要是对antirez博客的翻译。其实nosqlfan已经有一篇译文,但不知道为什么省略了很多重要的细节,因此完整翻译了本篇。

首先antirez感觉到,他看到的所有针对Redis的文章和讨论中,对Redis持久化的误解是最大的。因此在这篇文章中,他将尝试真正的公正一些:不做Redis的广告,不尝试跳过任何细节以避免使Redis模糊不清。作者想做的仅是提供一个清晰易懂的描绘,介绍Redis持久化的工作原理,Redis的持久化如何可靠,以及与其它数据库的对比。

操作系统和磁盘

写操作的流程

我们应该考虑的第一件事是对于数据库的持久化,我们的期望是什么。因此我们将一个简单的写操作中发生的事情可视化:

  1. 客户端发送写命令到数据库(数据库在客户端内存中)
  2. 数据库接收到写操作(数据在服务器内存中)
  3. 数据库调用系统调用,将数据写入磁盘(数据在内核缓冲区中)
  4. 操作系统将写缓冲区的数据转移到磁盘控制器上(数据在磁盘缓存中)
  5. 磁盘控制器真正将数据写入到物理介质(数据真正落在磁盘上)
    阅读全文 »

新域名启用

发表于 2016-07-16 | 更新于: 2020-11-03 | 分类于 Life
字数统计: 190 | 阅读时长 ≈ 1

2020更新:
感觉可以做一个我曾经用过的域名的列表了:

  • adeploy.com:被创业公司抢注
  • stackeye.com:被godaddy拿去拍卖几万刀
  • kvguru.com:主动放弃
  • bingostack.com:我买了3年
    阅读全文 »

使用ffjson加快golang中json序列化的速度

发表于 2016-05-29 | 更新于: 2020-11-03 | 分类于 golang
字数统计: 2.2k | 阅读时长 ≈ 9

ffjson是一个开源的golang工具库,它能大幅度提高json序列化、反序列化的性能,根据作者数据比标准库快2-3倍。
本文旨在分析ffjson的原理及实现,同时分析了ffjson作者对golang程序进行性能优化的思路。

go中的json为什么慢

json序列化是指将实体类转化成json字符串的过程,而反序列是此过程的逆向操作。
官方提供的标准库是encoding/json。我们可以猜想下标准库是怎么实现的:

  • 给出一个struct,如何将其json序列化?最简单的解决办法是逐个字段读取,然后按json格式拼接字符串即可。前提是我们需要知道这个struct的结构。
  • 任意给出一个struct,如何json序列化?这时必须首先对struct的内部结构进行探测。
    对于动态类型语言,如python这很容易,在python中一切皆为对象,其成员也是对象,其中保持了其类型及成员的信息。给定一个对象,通过方法items()可以轻易得到其全部成员,然后对每个成员调用__str__()方法转化为字符串。
    虽然go是静态类型语言,但这个方法在go中也可以实现,通过使用reflect包也可在运行时动态探测到变量的结构,从而对实现序列化。

一个标准库提供的接口,肯定不能只适用于某些struct,而要写出通用的方法,必须要动态识别其成员及类型,然后进行转化。

阅读全文 »

Kolla:Openstack容器化部署简介

发表于 2016-03-15 | 更新于: 2020-11-03 | 分类于 openstack
字数统计: 3.7k | 阅读时长 ≈ 13

Kolla是Openstack的容器化部署项目。

本文主要对Kolla项目进行简单介绍,对其诞生的意义、内部的大概实现做出介绍,以便于读者快速理解项目以投入使用、快速进行自定义开发。

以下主要针对Kolla的Mitaka版本。开始写这篇文章时,Mitaka还尚未发布,因此使用的其实是master版本。

为什么要做容器化部署

Openstack之美

参考下图,OpenStack的架构设计是很漂亮的:清晰定义的服务,完美的原子操作,独立运行的可能,组件尽量无状态易于扩展。这是一个几乎做到极致的分布式架构。
the beauty of openstack

Openstack之殇

但是现实是残酷的:

  • 服务之间往往有严重的依赖,使得部署复杂,修改麻烦,服务的管理困难;
  • 配置复杂,有时候可能仅仅是一个微小的配置错误,就会导致整个集群功能异常;
  • 而且随着OpenStack的发展,架构及配置只会越来越复杂。

运维成本很高,效率低,严重影响了使用体验。

阅读全文 »

Kolla中服务启动实现分析

发表于 2016-03-01 | 更新于: 2020-11-03 | 分类于 openstack
字数统计: 702 | 阅读时长 ≈ 3

Kolla是Openstack的容器化部署项目。
在Kolla中使用ansible启动容器,服务运行于各容器内。
很多情况下,我们需要自定义服务启动的某些参数,这就需要我们对Kolla中服务的启动有详细的了解。

服务启动流程

以下是对Kolla中一个完整服务的分析,以horizon为例。

阅读全文 »

12…4
bingostack

bingostack

软件工程师的自我修养

34 日志
14 分类
55 标签
© 2021 bingostack | Site words total count: 62.1k
由 Hexo 强力驱动
|
主题 — NexT.Mist v5.1.4