Rootop 服务器运维与web架构

2021-08-16
发表者 Venus
skywalking链路追踪已关闭评论

skywalking链路追踪

把skywalking收集的数据存到elasticsearch中。
下载es版skywalking:
https://mirrors.bfsu.edu.cn/apache/skywalking/8.6.0/apache-skywalking-apm-es7-8.6.0.tar.gz

# 这里用docker启动es和kibana(仅用于展示es)
[root@ecs-791d ~]# docker run -dit --name es -v /etc/localtime:/etc/localtime -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
[root@ecs-791d ~]# docker run -dit --name kibana -v /etc/localtime:/etc/localtime --link es:elasticsearch -p 5601:5601 kibana:7.6.2

 

# 配置skywalking指定es存储
[root@ecs-791d config]# cat /home/skywalking/config/application.yml 
storage:
selector: ${SW_STORAGE:elasticsearch7}
关于es的ip端口信息,自行修改。

# 监听的端口12800和11800也在config/application.yml 中修改
core:
  selector: ${SW_CORE:default}
  default:
    restHost: ${SW_CORE_REST_HOST:0.0.0.0}
    restPort: ${SW_CORE_REST_PORT:12800}
    gRPCHost: ${SW_CORE_GRPC_HOST:0.0.0.0}
    gRPCPort: ${SW_CORE_GRPC_PORT:11800}

 

	
# skywalking 图形界面
修改webapp目录下的 webapp.yml ,端口可以自定义。
server:
  port: 40000

 

# 启动服务端
[root@ecs-791d skywalking]# cd bin
[root@ecs-791d bin]# sh startup.sh 

# 启动后会监听3个端口
[root@ecs-791d skywalking]#  netstat -tnlp | grep -E "40000|12800|11800"
tcp6       0      0 :::11800                :::*                    LISTEN      26762/java          
tcp6       0      0 :::12800                :::*                    LISTEN      26762/java          
tcp6       0      0 :::40000                :::*                    LISTEN      26832/java   

注意skywalking web管理界面没有身份认证功能,可以用nginx代理 + baseAuth
(看github老版本上有认证,未测。)

# java应用端配置
skywalking目录下的 agent 目录为应用端会用到的jar包配置等

java -javaagent:./agent/skywalking-agent.jar -Dskywalking.agent.service_name=admin -Dskywalking.collector.backend_service=127.0.0.1:11800 -jar admin.jar

PS:
skywalking-agent.jar路径要正确,最好写完整路径。
-Dskywalking.agent.service_name=admin admin为skywalking界面中会显示的应用名

参考官方文档:https://skywalking.apache.org/docs/main/v8.6.0/readme/

2021-07-27
发表者 Venus
安装oci8和pdo_oci扩展已关闭评论

安装oci8和pdo_oci扩展

下载依赖:
https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html
oracle-instantclient11.1-devel-11.1.0.7.0-1.x86_64.rpm
oracle-instantclient11.1-basic-11.1.0.7.0-1.x86_64.rpm
把2个rpm包安装上。

php版本7.4.20,去官网下载相同版本源码。

进ext目录:

[root@MiWiFi-RA69-srv ext]# ll -d oci8 pdo_oci
drwxrwxr-x 8 root root 4096 Jul 14 10:01 oci8
drwxrwxr-x 3 root root  175 Jun  1 23:41 pdo_oci

oci8和pdo_oci都是php oracle的扩展。

安装pdo_oci:

[root@MiWiFi-RA69-srv pdo_oci]# /www/server/php/74/bin/phpize 
[root@MiWiFi-RA69-srv pdo_oci]# ./configure  --with-php-config=/www/server/php/74/bin/php-config
checking if that is sane... configure: error: You need to tell me where to find your Oracle Instant Client SDK, or set ORACLE_HOME.

[root@MiWiFi-RA69-srv pdo_oci]# rpm -ql oracle-instantclient11.1-basic-11.1.0.7.0-1.x86_64
/usr/lib/oracle/11.1/client64/bin/adrci
/usr/lib/oracle/11.1/client64/bin/genezi
/usr/lib/oracle/11.1/client64/lib/libclntsh.so.11.1
/usr/lib/oracle/11.1/client64/lib/libnnz11.so
/usr/lib/oracle/11.1/client64/lib/libocci.so.11.1
/usr/lib/oracle/11.1/client64/lib/libociei.so
/usr/lib/oracle/11.1/client64/lib/libocijdbc11.so
/usr/lib/oracle/11.1/client64/lib/ojdbc5.jar
/usr/lib/oracle/11.1/client64/lib/ojdbc6.jar

[root@MiWiFi-RA69-srv pdo_oci]# ./configure --help
  --with-pdo-oci[=DIR]    PDO: Oracle OCI support. DIR defaults to
                          $ORACLE_HOME. Use
                          --with-pdo-oci=instantclient,/path/to/instant/client/lib
[root@MiWiFi-RA69-srv pdo_oci]# ./configure  --with-php-config=/www/server/php/74/bin/php-config --with-pdo-oci=instantclient,/usr/lib/oracle/11.1/client64/lib
[root@MiWiFi-RA69-srv pdo_oci]# make && make install

安装oci8:

[root@MiWiFi-RA69-srv oci8]# /www/server/php/74/bin/phpize 
[root@MiWiFi-RA69-srv pdo_oci]# ./configure  --with-php-config=/www/server/php/74/bin/php-config
[root@MiWiFi-RA69-srv pdo_oci]# make && make install

配置php.ini加载模块:

extension=/www/server/php/74/lib/php/extensions/no-debug-non-zts-20190902/pdo_oci.so
extension=/www/server/php/74/lib/php/extensions/no-debug-non-zts-20190902/oci8.so

重启php。

[root@MiWiFi-RA69-srv ext]# /www/server/php/74/bin/php -m | grep -E "oci|OCI"
oci8
PDO_OCI

2021-07-05
发表者 Venus
nginx中几个性能调整的参数已关闭评论

nginx中几个性能调整的参数

worker_processes 1;
#默认1,可以设置为cpu核心数,或者auto自动配置

worker_rlimit_nofile 1024;
#最大文件打开数,这里指 nginx worker 进程的最大打开数,不是 nginx master 进程。
可以通过 cat /proc/nginx worker进程号/limits | grep open 返回的数值验证生效。

events
{
	use epoll;
	worker_connections 1024; 
	#单个进程最大连接数,包括和客户端的连接、反向代理之间的连接。
	
	multi_accept on;
	# 一次性处理所有backlog中的队列。off的话,就是一次一个。
	# backlog队列参考:https://www.rootop.org/pages/4842.html
}


# http 配置段
http
{
	sendfile   on; 
	# 此参数用于提高I/O性能,但不适用于大文件(要平衡磁盘和网络的I/O速度)/反向代理情况下,也就是说文件不在本地,在远程服务器上的不适用(包括文件共享)。
	# 大文件情况下用 aio
	tcp_nopush on;
	# 和sendfile一起出现,用于发送一个完整的数据包,实际是影响socket中TCP_CORK参数效果。
	
	keepalive_timeout 60;
	# nginx服务器与客户端会话结束后仍旧保持连接的最长时间(秒)
	tcp_nodelay on;
	# 开启、关闭nagle算法,和 keepalive_timeout 一起出现,默认on
}

TCP_CORK 资料:https://blog.csdn.net/sinat_20184565/article/details/89682807
TCP_NODELAY 资料:https://blog.csdn.net/lclwjl/article/details/80154565

2021-07-01
发表者 Venus
mysql5.6数据库varchar类型超过字段长度自动截取的问题已关闭评论

mysql5.6数据库varchar类型超过字段长度自动截取的问题

帮群里处理一个问题,说是前台页面post提交的数据,其中一个字段的字符串超过数据库中字段的最大长度限制后出现自动截取的结果。
最终数据库里存的数据为这个字段的最大长度,其余的自动截取了。在我印象里超过长度应该是报错的。

特地研究了一下。
比如有个字段为varchar类型,长度10。当写入数据的时候,mysql5.6和mysql5.7处理方式不一样。
具体原因是由sql_mode模式决定的。

5.7版本插入一串字符串长度为11时,会报错:1406 Data too long for column ‘字段名’。
5.6版本插入时,则会截取到10个字符的长度。

5.7文档中默认的sql-mode值为:

ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_ZERO_IN_DATE NO_ZERO_DATE ERROR_FOR_DIVISION_BY_ZERO NO_AUTO_CREATE_USER NO_ENGINE_SUBSTITUTION

5.6文档中默认的sql-mode值为:

NO_ENGINE_SUBSTITUTION

参考:
https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html
https://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html

当在修改数据库sql-mode模式为 “严格模式” 时,发现用数据库客户端软件测试没效果。

/etc/my.cnf:

[mysqld]
sql-mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

# 最后查进程发现是启动参数里带着sql-mode参数,那么应该是启动脚本里定义的,优先级高于配置文件中。

[root@MiWiFi-RA69-srv mysql]# ps aux | grep mysql
root     29328  0.6  0.0  11820  1580 pts/1    S    13:41   0:00 /bin/sh /www/server/mysql/bin/mysqld_safe --datadir=/www/server/data --pid-file=/www/server/data/MiWiFi-RA69-srv.pid --sql-mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
mysql    29946  8.0  9.0 1297996 327088 pts/1  Sl   13:41   0:00 /www/server/mysql/bin/mysqld --basedir=/www/server/mysql --datadir=/www/server/data --plugin-dir=/www/server/mysql/lib/plugin --user=mysql --sql-mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION --log-error=MiWiFi-RA69-srv.err --open-files-limit=65535 --pid-file=/www/server/data/MiWiFi-RA69-srv.pid --socket=/tmp/mysql.sock --port=3306

# 检查启动脚本

[root@MiWiFi-RA69-srv mysql]# vi /etc/init.d/mysqld 
other_args= #--sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"   # uncommon, but needed when called from an RPM upgrade action

把他注释掉再重启mysql,再次查看进程信息里没有sql-mode参数了。

sql-mode不同值的含义或者直接找百度翻译版:
https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html
https://dev.mysql.com/doc/refman/5.6/en/sql-mode.html

然后再次测试插入过长数据时,就提示错误了。
PS:
我在用sqlyog客户端测的时候发现设置了sql-mode 后通过 “select @@sql_mode;” 取不到设置的值。
但是用navicat可以查到。推测sqlyog连接的时候给临时设置了模式,又浪费了一段时间。

2021-06-29
发表者 Venus
linux通过配置文件配置多ip已关闭评论

linux通过配置文件配置多ip

这里不采用子设备号的方式,即 ifcfg-eth0:0、ifcfg-eth0:1的配置文件方式。
通过一个配置文件方式实现多ip配置。

vi /etc/sysconfig/network-scripts/ifcfg-eth0
# 方法1,适用于不连续ip

主ip配置略```

IPADDR1=10.10.10.10
NETMASK1=255.255.255.0

IPADDR2=10.10.10.11
NETMASK2=255.255.255.0

IPADDR和NETMASK后面的数字要排起来,中间不能有间隔。否则会失败。

# 方法2,适用于连续ip,某个范围内的ip(-range0)。
注意首先要保证主网卡配置文件ifcfg-eth0中配置了 NM_CONTROLLED = no 参数,否则多ip配置重启network服务后依旧看不到ip。
vi /etc/sysconfig/network-scripts/ifcfg-eth0-range0

DEVICE=eth0
ONBOOT=yes
BOOTPROTO=static
IPADDR_START=10.10.10.10
IPADDR_END=10.10.10.20
CLONENUM_START=0
GATEWAY=10.10.10.1
NETMASK=255.255.255.0
NO_ALIASROUTING=yes
ARPCHECK=no

CLONENUM_START=0 是 eth0:0 的意思,从0开始,下一个ip设备名就会是eth0:1
ARPCHECK=no 是禁用arp检查,否则重启网卡的时候arp检查是否有其他主机占用此ip(等待广播包回复需要几秒时间),从而导致重启网络速度很慢。
message日志中会提示 Determining if ip address x.x.x.x is already in use for device xxx

重启网络。