Redis(5.0)集群分析 – JavaBoy的博客 – CSDN博客

https://blog.csdn.net/xj80231314/article/details/88689898

看的想吐的redis集群

  1. 无法做到无感知的添加和删除节点
  2. 官方的cluster模式比简单的客户端hash好不了多少,只是能自动主从替换而已
  3. 从redis每次sync操作都要sync全量数据,还要触发一次master的全量落地(全量落地可能不是每次sync都做吧)
  4. 主从同步是异步的,无法保证主写入后,从就能读出来,不过这个和mysql逻辑上是一致的,但如何实现选择性地读主库呢?
  5. redis集群作为cachce还能接受,最终存储就不太好
  6. 连接redis集群为啥写所有的节点的地址?假如只写一个节点的话,该节点挂掉的时候,客户端就起不来了,如果保证客户端肯定不重启也没有问题

php 之conf.d ini目录修改

php中参考的conf.d 目录是在编译时指定的,不能在运行时修改,如果非要修改,也不是不行,可以直接用sed来修改php这个二进制文件:

如果是签名或者有摘要校验的二进制文件如phar文件,则不能直接使用sed修改

由于学习swoole的时候,需要使用swoole扩展,但是偶尔又想单步调试一些逻辑,不得不使用xdebug扩展,但是swoole扩展和xdebug扩展势不两立,有不能通过参数来切换是否使用xdebug,于是通过此法搞了两个php二进制文件,二者使用不同的conf.d 目录,就可以单独配置扩展了。

但是phpstorm中单个项目不能同时使用两个php解释器,只好在使用时临时切换php解释器了

linux 连接捕获

A进程总是连接B进程listen的1158端口,而且连接到断开的持续时间很短,由于知道1158端口,所以,B进程很容易被找到,现在不知道A进程是哪个,只知道是本机的某进程来连接1158端口的。

如何找到A进程呢?

对于持续时间不太短的连接,我们通常可以使用ss -anp来查看,但是对于持续时间足够短的连接,ss是不太容易抓到的。毕竟,当机器上进程数多的时候,每个连接都扫一遍所有的进程下的fd,会明显感觉很慢的。

所以,一种办法是:

不使用ss的-p选项,只使用ss -an,从结果中拿到感兴趣的端口后,再去/proc/*/fd/* 中找对应的fd,但是,进程的fd中对应的socket的id并不出现在ss的结果中,无法对应起来。

另一种办法:

直接去 /proc/net/tcp 中查找感兴趣的连接,基本逻辑如下:

其中的 :0486 是我们感兴趣的端口号的16进制表示, 23774779 是我们不感兴趣的连接

 

其实,这样也未必能抓到感兴趣的连接,毕竟连接消失的太快。

比较靠谱的办法是:

让B进程休眠,这样,A进程进入的连接不能被及时处理,就不会立即断开,然后使用ss -anp就可以了,除非A进程设置了非常短的超时,那么,可能我们就需要研究一下systemtap了

 

Zephir Documentation

https://docs.zephir-lang.com/0.12/en/motivation

zephir是为开发PHP扩展而发明的一门语言,而且只能用来开发PHP扩展,通常,PHP的扩展都是编译运行的,但是zephir却是把自己编译成字节码给zend解释执行的,但是他也能进一步编译成机器语言
Zephir was not created to replace PHP or C. Instead, we think it is a complement to them, allowing PHP developers to venture into code compilation and static typing. Zephir is an attempt to join good things from the C and PHP worlds, looking for opportunities to make applications faster.

只能写带名字空间的class
Code in Zephir must be placed in classes. The language is intended to create object-oriented libraries/frameworks, so code outside of a class is not allowed. Additionally, a namespace is required:

他可以直接调用PHP语言定义的函数

必须写注释:

In most languages, comments are simply text ignored by the compiler/interpreter. In Zephir, multi-line comments are also used as docblocks, and they’re exported to the generated code, so they’re part of the language!

If a docblock is not located where it is expected, the compiler will throw an exception.

zephir相当于是跑在zend上的另一门语言

linux 调试工具之perf-tools

  1. 实时查看系统正在派生哪些进程:
    1. execsnoop 不能跟踪到clone出来的进程
  2. 实时查看系统正在打开哪些文件:
  3. 实时查看哪些进程在访问IO以及IO延迟:
  4. 更加方便地分析IO延迟:
  5. 查看IO请求的块儿大小分布情况:
  6. cache大小及命中率分析:
  7. 系统调用次数分析:
  8. 查看tcp连接异常:
    注意:
    1)  这里的重传是内核层面的,如果应用层设置连接超时为1s,失败则重新连接,则不算重传,也基本不会触发内核层的重传
    2)   这里的PID通常为零,因为重传操作基本都是内核触发的超时重传
  9. 查看慢的内核函数调用:

DB2 自动化脚本引发的思考

实用的脚本:

脚本基本逻辑是:

  1. 连接数据库
  2. 获取所有表的表名
  3. 然后做想做的事(如:导出表数据)

脚本很简单,但是,还是写出问题来了

其实,短短的代码里面藏着很多知识呢

上述的错误的写法之所以错,是因为db2进程的PPid不是当前的bash,但是和正确的写法差别不大呀,为什么PPid就不一样了呢? 可以参考: https://phpor.net/blog/post/12836

为什么db2 那么关心PPid ?可以参考:https://phpor.net/blog/post/12806

更新:

就算非常小心的去写,bash中通过函数内部使用db2命令,很容易就进入的不同的环境,所以,为了能让db2和bash很好的结合,我创造了一个db2cli,其架构就是:

bash中定义函数调用自定义的db2函数,该db2函数内部通过curl访问一个httpserver,让本次会话的db2命令都在同一个httpserver进程内部执行,httpserver地址:https://github.com/phpor/go-example/tree/master/app/db2-proxy

db2cli地址:

bash之返回值判断

场景:

想执行一个命令,如果命令成功,则不输出任何信息,如果命令失败,输出错误信息;

 

通常来讲,特别简单:

就行; 但是,如果 $cmd 会通过标准错误输出一些debug信息呢?这样的话,即使命令成功也会看到一些不必要的信息,那么如何改进呢?

基本思路就是,把标准输出扔掉(可选),标准错误重定向到标准输出,然后赋值给一个变量:

这个没有问题;

但是,当我们试图把这个逻辑写到函数中时,似乎就不太对了,因为函数中的变量尽量local声明,而且,声明和赋值写在一起显得紧凑、美观、有修养;如下:

这是,和我们预期不一样了 ; $? 已经不是no_such_cmd 的返回值了,为什么?

参看下面截图:

显然,第一个函数中 $? 其实是local语句的返回值了(local的返回值和变量被赋了什么值没有关系,参看: help local),所以,正确的姿势是,先声明变量,再使用