Archive for 常用工具

面试面到这个问题,以前只知道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),这种好像是复制更改内容的。还有一种是混合模式,是前两种的结合。

Continue

本来以为很快安装完了,没想到安装过程中缺少不少文件,就决定再记录一下吧。 看系统软件库里版本太低,我就想直接源码编译安装。官网下载了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的配置。

Continue

准备玩点高级一点的东西了,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

Continue

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也许有不同。

Continue

先说一下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也是可以直接复制的,所以基本可以复制分发了。

Continue

远程办公啊,自己笔记本没有配置公司vpn,还要现搞。 系统偏好设置-网络-添加vpn,然后选择L2tp,填写配置后连接提示 共享密钥丢失的问题 网上找到解决方法。 sudo vim /etc/ppp/options 内容: plugin L2TP.ppp l2tpnoipsec 然后连接就可以了

Continue

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" 这个关键字可能不准确,具体看看总结,再细看检查的过程。

Continue

本来没想在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

Continue

下载代码并构建jar包。
git clone https://github.com/medcl/elasticsearch-analysis-ik
cd elasticsearch-analysis-ik
mvn package

复制到es目录里
mkdir -p ~/elasticsearch-2.3.3/plugins/ik
unzip target/releases/elasticsearch-analysis-ik-1.9.3.zip -d ~/elasticsearch-2.3.3/plugins/ik/


启动elasticsearch,
然后发现不能用root启动,只好换用户重新设置。。
默认es监听的127.0.0.1.修改config/elasticsearch.yml
network.host: 0.0.0.0 
我这是在虚拟机里改的。

测试中文分词

参考github上的提示执行了玩了一下。

我只能说目前比sphinx简单多了。

Continue

之前用过sphinx,不选择sphinx的原因是用过,配置过太麻烦了,增量也不友好。之前用的场景也简单,对种子title和内容的检索。 现在决定用个别的试试学习一下,大体查了一下资料elasticsearch安装配置简单,需要安装java,提供http api调用。语言不是问题。 不用solr的原因是不走大流,没意思 哈哈,es的高端用户也挺多。 1 去Elasticsearch官网下载个包,解压。 2 执行./bin/elasticsearch启动,-d参数可以daemon启动 3 执行curl -X GET http://localhost:9200/ { "name" : "Vance Astrovik", "cluster_name" : "elasticsearch", "version" : { "number" : "2.3.3", "build_hash" : "218bdf10790eef486ff2c41a3df5cfa32dadcfde", "build_timestamp" : "2016-05-17T15:40:04Z", "build_snapshot" : false, "lucene_version" : "5.5.0" }, "tagline" : "You Know, for Search" }

Continue