这问题困扰我了接近三天时间。之所以困扰这么久,总结下来一个是自己太急了,本来是已经开发完的功能,然后文件一多就json解析不通过。然后最近工期忙,所以心态更急,越急越是慌不择路,反而没啥用。第二个就是测试周期长,只有在程序跑了二三十分钟的时候才会出问题。
我每分析一个文件,就产生一个md5命名的json文件,然后通过logstash导入到es当中,然后显出json文件,继续分析下一个文件。
问题的现象就是,logstash再导入一些文件后,会报json解析的错误,我打印结果显示读取的json不全。然后我看生成的json文件为全的,所以感觉是读和写之间的逻辑有问题,然后疯狂尝试,但是效果没有。我尝试了flush文件,现在想想确实没啥用,所以对问题进行冷静分析很重要。然后让我觉得是logstash的插件有bug,然后我查了github的提交记录和issue都没找到相关内容。然后又去看插件源码,比较复杂,心态也导致根本看不进去。最后又绕回文档,看参数相关的配置。
然后为看到logstash能根据inode识别出文件重命名的文档后,意识到我删除文件重新创建文件可能导致文件重用inode,然后我搜索了一下文档关键字。logstash确实提供了一个参数去按照过期时间删除文件读取的偏移记录。让我确定是因为我删除文件又创建新文件导致的inode重用,然后logstash根据之前记录的偏移地址去读取的文件,导致json不全,然后报错。
最终我使用truncate清空文件,然后再创建新文件去解决的问题。
Read more...
Archive for 常用工具
ansible这库终于能用了
最近又在写ansible相关的东西,因为得集成python项目,我开始都想之间命令方式调用ansible了。因为之前搞了好几个版本的ansible集成,每次都是大折腾一段时间,而且最早的时候,因为要集成或者解决问题,需要查看ansible源码,发现就是一坨。我好像不止一次跟别的同事说ansible是看过的最垃圾的开源代码。
最近又开始折腾了,虽然封装的接口还是不好用,但是看源码和修改给的example,最起码折腾起来轻松一点点了。源码也写的比之前好太多了。
playbook这玩意更坑,可能也是我写的不太多。
Read more...
mysql 主从模式搭建
面试面到这个问题,以前只知道dba大概用的啥工具,从来没想自己搞过,现在面试要求有这方面技能,回答的不是太好,我只知道通过binlog可以支持异步同步,具体不知道怎么做。配置软件的事还要问,也是醉了。
先搞最简单的模式,mysql自带的replication,这个应该就是最普通读写分离的主从模式了,可以一写多读。流量不高还是可以的,然后需要加一下主备,我看之前一般是通过keepalived去做的,多主这种一般使用percona的工具去做的,支持强一致的模式,这些都没搞过。我看mysql文档,mysql支持innodb集群,支持多主,这个文档还没看,后面再研究。还提到一个NDB Cluster。
我的mysql是安装的8.0.26,看官网不但支持普通的replication模式,通过binlog日志和同步的位置来同步,还支持global transaction identifiers (GTIDs) 的模式,这个replication模式不需要binlog了,看名字是事务相关。相关的文档还没看,只是先走了一下普通的模式。
首先,需要设置实例的server_id,这个需要集群里唯一,可在/etc/my.cnf里面加一条
[mysqld]
server-id=142
主从库都需要配置。
主库需要开启binlog,这个默认是开启的。从库视情况,如果需要作为别的从库的主库,也是必须要开启的。
从库需要配置一下relay-log,默认是按照主机名配置的,说是防止主机名变动,导致错误。
relay-log=/var/lib/mysql/re-relay-log
relay-log-index=/var/lib/mysql/re-relay-log.i
创建用于同步的专属用户
mysql> CREATE USER 'repl'@'%.example.com' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.example.com';
官网说,这个用户的密码是明文保存在从库中的,所以为了安全还是有必要创建一个的。
然后需要确定binlog同步的位置
先在主库加表的读锁,这样会阻塞写事务的提交。
mysql> FLUSH TABLES WITH READ LOCK;
新启动一个mysqlsession,执行SHOW MASTER STATUS,查看binary log的文件名和位置。文档说如果之前主库禁止了binlog,这个命令会返回空,在后边需要用到这俩值的时候,文件名为'',位置为4
释放锁的命令, UNLOCK TABLES;
最后一步是涉及在从库配置刚刚日志位置信息和主库信息。分两种情况,一种是新搭建的集群,另一种是主库本来有数据的情况。
我是刚搭建的环境,先用第一种。不同版本的mysql有两种方式,从8.0.23版本开始使用下面的语句
CHANGE REPLICATION SOURCE TO SOURCE_HOST='10.1.11.142', SOURCE_USER='repl', SOURCE_PASSWORD='123456', SOURCE_LOG_FILE='binlog.000001', SOURCE_LOG_POS=1012;
使用START REPLICA 启动同步
查看从库状态: show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
这两个状态为yes基本就没啥问题了
第二种情况,需要手动先把已有的数据从主库同步到从库中,其他一致。官方推荐使用mysqldump,特别是使用innodb引擎的时候。这种模式需要保持表锁不释放,不能退出session。
mysqldump 添加--master-data参数会包含CHANGE REPLICATION SOURCE 语句。然后导入到从库中。文档说有mysql插件可以方便做到数据迁移和从库配置。
又大概看了一些replication实现的文档,主实例有一个dump线程, SHOW PROCESSLIST里为Binlog Dump。从库两个线程,一个线程接受主库的dump线程的数据,写到单独日志文件,上边状态的Slave_IO_running为这个线程状态。一个线程应用前一个线程的relay日志的线程。多从的情况,主库会为每个从库配置一个dump线程。
复制的数据格式,有三种模式,一种基于语句的( statement-based replication),这种的在特定语句引擎会造成数据不一致。默认是基于行数据的( row-based logging),这种好像是复制更改内容的。还有一种是混合模式,是前两种的结合。
Read more...
haproxy编译安装
本来以为很快安装完了,没想到安装过程中缺少不少文件,就决定再记录一下吧。
看系统软件库里版本太低,我就想直接源码编译安装。官网下载了2.4.3的版本。
编译命令:make -j $(nproc) TARGET=linux-glibc USE_OPENSSL=1 USE_LUA=1 USE_PCRE=1 USE_SYSTEMD=1,这个是开启所有模式的编译方式,可看INSTALL文件配置
需要安装gcc:yum install gcc.x86_64
需要pcre:yum install pcre-devel.x86_64
需要openssl: yum install openssl.x86_64 openssl-devel.x86_64
需要安装lua,需要5.3版本以上,我从lua官网下载了5.4.3版本,可以直接make后,指定lua目录。make -j $(nproc) TARGET=linux-glibc USE_OPENSSL=1 USE_LUA=1 USE_PCRE=1 USE_SYSTEMD=1 LUA_INC=/opt/source/lua-5.4.3/src/ LUA_LIB=/opt/source/lua-5.4.3/src/
需要systemd-dev:yum install systemd-devel.x86_64
然后我现在记录才发现,就是参数指定的都需要额外安装的软件。
haproxy 配置文件
mkdir /etc/haproxy
cp examples/option-http_proxy.cfg /etc/haproxy/haproxy.cfg
配置systemd
cd admin/systemd/
make
会生成一个haproxy.service,我看就执行了替换bin目录
cp haproxy.service /usr/lib/systemd/system/
systemctl enable haproxy
直接start还是有问题,日志查看错误,需要改一下默认的配置文件和设置ulimit。
具体的详细配置还没看,只先瞟了一眼logging的配置。
Read more...
texlive在ubuntu上的安装
准备玩点高级一点的东西了,xelatex看着不错,搜了一番,感觉texlive比较不错。也下载了Texmacs,那个只支持原生的latex,xelatex的导入导出不支持。现在已经懒得折腾东西,但是想想还是折腾折腾吧。直接apt安装的版本是2017的,感觉有点老,所以还是装个新的玩吧。
安装基本靠官网文档
首先下载一个安装工具,解压,执行perl install-tl 。
这里要看一下安装目录是否有权限,texlive的安装不需要root权限,但是默认安装目录是/usr/local/texlive/2020,最后一级目录是区分不同版本的,所以只要创建texlive目录,然后保证有权限就行了。
然后i开始安装,看着好像要下载四千多个文件,我使用的默认的镜像,速度还挺快的。主要看下载安装工具的时候速度就挺快。
还有gui版本的安装工具,包括安装完成后gui工具的使用,这个需要perl的tk库,sudo apt-get install perl-tk进行安装。比如:tlmgr -gui
更新系统使用命令:tlmgr update -all
Read more...
gcc分支预测工具简单使用-gcov
linux内核使用许多likely和unlikely宏,这两个宏的内容为:
#define likely(x) (__builtin_expect(!!(x), 1))
#define unlikely(x) (__builtin_expect(!!(x), 0))
是用来告诉编译器,当前判断条件是否常用或者不常用。编译器根据提示,生成的二进制的代码流程会有相应改变,以达到让cpu尽可能的顺序执行的目的。gcc官方文档里说,使用-fprofile-arcs来进行实际的性能测试,说程序员对自己的程序的预测一般都是错误的。
然后我搜到是用gcov去做,使用了一下确实很直观。编译的时候,参数加上“-fprofile-arcs -ftest-coverage”。然后运行会生成 .gcda .gcno文件。用gcov source.c会生成相应代码的.gcov文件。vim编辑这些文件,就能看到源码形式的,每一行都执行了多少次。
这里说个疑问,前边说预测不准确,我当时看到那里还说真的是不准确。我之前就感觉明明会大概率走这个分支,然后加上提示后,速度却变慢了。但是当我用gcov去做完统计之后,发现确实很大很大概率走的那个分支,但是不知道为啥会变慢。我O2开反汇编发现内容是一样的,也可能是我测试的时候没开O2也许有不同。
Read more...
pyenv安装本地源码包的方法
先说一下pyenv的安装方式,只有两步,第一步是将github项目clone到目录,第二步是添加环境变量。所以pyenv完全可以离线安装,比如操作系统版本一致的时候,直接把装好的pyenv环境和virtualenv环境复制到目标系统就可以了。然后添加一下环境变量。
我之前安装过pyenv了,更新pyenv进入pyenv目录后,执行git pull。
然后我复制了一份新的代码,改变环境变量,切换到新pyenv目录。然后卸载之前直接安装的python版本。pyenv uninstall 3.7.3
进入.pyenv_bak,mkdir cache.将源码包放到cache目录下。
进入.pyenv_bak/plugins/python-build/share/python-build目录,编辑3.7.3文件
#require_gcc
prefer_openssl11
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl
install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline
if has_tar_xz_support; then
install_package "Python-3.7.3" "https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tar.xz#da60b54064d4cfcd9c26576f6df2690e62085123826cff2e667e72a91952d318" ldflags_dirs standard verify_py37 copy_python_gdb ensurepip
else
install_package "Python-3.7.3" "https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tgz#d62e3015f2f89c970ac52343976b406694931742fbde2fed8d1ce8ebb4e1f8ff" ldflags_dirs standard verify_py37 copy_python_gdb ensurepip
fi
改成
install_package "Python-3.7.3" "/root/.pyenv_bak/cache/Python-3.7.3.tar.xz" ldflags_dirs standard verify_py37 copy_python_gdb ensurepip
安装
pyenv install 3.7.3
安装完成后执行pyenv virtualenvwrapper,我发现需要重新安装这个插件,不知道为什么。我之前是安装了的,可能版本问题。
然后基本就可以了。virtualenv也是可以直接复制的,所以基本可以复制分发了。
Read more...
mac vpn连接,L2TP需要共享密钥的问题
远程办公啊,自己笔记本没有配置公司vpn,还要现搞。
系统偏好设置-网络-添加vpn,然后选择L2tp,填写配置后连接提示
共享密钥丢失的问题
网上找到解决方法。
sudo vim /etc/ppp/options
内容:
plugin L2TP.ppp
l2tpnoipsec
然后连接就可以了
Read more...
rootkit hunter进行系统检测
rootkit hunter能检查一下系统是否被安装后门,听说很厉害。
去官网下载一个tar包,解压
安装
./installer.sh --layout custom /opt/temp/rkhunter --install
这个是指定安装目录,日志都会打到/var/log/rkhunter.log
更新rootkit hunter的数据库
/opt/temp/rkhunter/bin/rkhunter --update
进行检查
/opt/temp/rkhunter/bin/rkhunter --checkall
然后查看结果
cat /var/log/rkhunter.log|grep "Warning\|Vulnerable"
cat /var/log/rkhunter.log|grep -A 30 "System checks summary"
这个关键字可能不准确,具体看看总结,再细看检查的过程。
Read more...
mac ios 安装php开发环境
本来没想在mac上搭建开发环境,但是我搜索php安装的时候。发现有mac安装就看一下麻不麻烦。然后发现自带php5,并且自带Apache,卧槽那还用啥虚拟机。
安装方法和官网还是有出入的。我大体看了一下配置,没有盲目修改。
sudo vim /private/etc/apache2/httpd.conf
将LoadModule php5_module libexec/apache2/libphp5.so注释去掉。另一个,没搜到。
Include /private/etc/apache2/other/*.conf这个里边有个php5 的conf,将下边的也插入进去了,所以不用添加。
项目的根目录是/Library/WebServer/Documents.
插入个<?php phpinfo(); ?>,成功。
重启apache, sudo apachectl restart
rewrite_module模块开启
LoadModule rewrite_module libexec/apache2/mod_rewrite.so
AllowOverride All
Read more...