背景

某项目有两个外网的站点a.site1.comb.site2.com需要通过definesys.com进行代理,代理后的地址

  • a.definesys.com => a.site1.com
  • b.definesys.com => b.site2.com

a和b都是托管在vps站点上。

CNAME

接到这个任务时,以为很简单,到definesys.com域名后台增加两个域名,并且将CNAME指向代理的站点即可,但还是想简单了,这里简单介绍下vps托管站点的原理,vps就是大家所说的虚拟主机,相比云服务器,vps具有价格低,部署简单,监控方便等特点,所以很多站点都会托管到vps上,但我们都知道vps供应商不可能一台服务器只部署一个站点,肯定想法设法压榨服务器资源,一台服务器可能部署了上千个站点,那么是如何实现几千个站点都可以通过80端口进行访问,我在之前的这篇文章中有介绍过方法,就是根据访问的host进行路由达到访问不同站点的目的。

Read the rest of this entry

背景

某项目OIM资源历史记录时间显示时区不对,比北京时间少了8个小时

正常时间:

导致了跨时区用户无法登录,账户被锁,在修改了所有跟时区有关的环境信息后(包括操作系统时区,数据库时区,jvm时区,oim时区)依然无法解决。

Read the rest of this entry

背景

某项目数据库磁盘告警,磁盘使用率接近100%

$ df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/vda1      ext4       99G   60G   35G  64% /
devtmpfs       devtmpfs   32G     0   32G   0% /dev
tmpfs          tmpfs      32G   69M   32G   1% /dev/shm
tmpfs          tmpfs      32G  7.8M   32G   1% /run
tmpfs          tmpfs      32G     0   32G   0% /sys/fs/cgroup
/dev/vdc1      ext4       99G   94G   52M 100% /u01/oracle
/dev/vdb4      ext3       99G   30G   64G  32% /soa
tmpfs          tmpfs     6.3G     0  6.3G   0% /run/user/1002
tmpfs          tmpfs     6.3G   52K  6.3G   1% /run/user/1003
tmpfs          tmpfs     6.3G     0  6.3G   0% /run/user/1005

可以看到/dev/vdc1使用率已经100%

Read the rest of this entry

背景

某项目Oracle 11g RAC其中一个节点vip服务offline,集群从双节点变为单节点

排查

  • crsctl命令查看集群状态

Read the rest of this entry

,

背景

某项目OIM修改密码异常的慢,修改一次密码需要耗费15分钟时间,该功能基本已不可用,通过curl工具调用OIM rest api进行修改密码也需要十几分钟的时间

curl -X PUT \
http://10.10.10.10:14000/iam/governance/selfservice/api/v1/users/61729/password \
-H 'accept-language: zh-CN,en-US;q=0.8,zh;q=0.7,zh-TW;q=0.5,zh-HK;q=0.3,en;q=0.2' \
-H 'authorization: Basic xxxxxxxxxxxxxxxxxxxxx' \
-H 'cache-control: no-cache' \
-H 'content-type: application/json' \
-H 'postman-token: e86578e5-6c12-6bd0-3304-7588cae0f60a' \
-H 'x-requested-by: xx' \
-d '{
"oldPassword": "welcome@2020",
"newPassword": "welcome@2020238",
"confirmPassword": "welcome@2020238"
}'

排查

获取源码

后台并无报错,也没相关有价值的日志,因此考虑从源码入手,api源码位于oim这个应用中,你可以登录console查看ear包路径

Read the rest of this entry

背景

某项目服务器响应慢,cpu严重超负荷运行,并且有大量的netstat进程,如图:

进程由oracle用户启动,说明是通过oracle用户并非root用户启动。

排查

这种情况,第一直觉就是中毒了,大概率是挖矿程序,Linux中毒第一步就是排查是否有cron记录,大部分病毒都是通过cron进行自启动,cron还能保证进程关闭后能够再次启动,达到死而复生的目的。crontab -l命令显示果然有病毒的定时任务程序脚本

Read the rest of this entry

背景

某项目测试环境jenkins突然执行不了脚本,错误如下:

$ /bin/sh -xe /tmp/jenkins3171686575384136508.sh
FATAL: command execution failed
java.io.IOException: error=13, Permission denied
	at java.lang.UNIXProcess.forkAndExec(Native Method)
	at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
	at java.lang.ProcessImpl.start(ProcessImpl.java:134)
	at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
Caused: java.io.IOException: Cannot run program "/bin/sh" (in directory "/data/jenkins/workspace/yc-notice-service"): error=13, Permission denied
	at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
	at hudson.Proc$LocalProc.<init>(Proc.java:249)
	at hudson.Proc$LocalProc.<init>(Proc.java:218)
	at hudson.Launcher$LocalLauncher.launch(Launcher.java:935)
	at hudson.Launcher$ProcStarter.start(Launcher.java:454)
	at hudson.tasks.CommandInterpreter.perform(CommandInterpreter.java:109)
	at hudson.tasks.CommandInterpreter.perform(CommandInterpreter.java:66)
	at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:20)
	at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:744)
	at hudson.maven.MavenModuleSetBuild$MavenModuleSetBuildExecution.build(MavenModuleSetBuild.java:945)
	at hudson.maven.MavenModuleSetBuild$MavenModuleSetBuildExecution.doRun(MavenModuleSetBuild.java:683)
	at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:504)
	at hudson.model.Run.execute(Run.java:1819)
	at hudson.maven.MavenModuleSetBuild.run(MavenModuleSetBuild.java:543)
	at hudson.model.ResourceController.execute(ResourceController.java:97)
	at hudson.model.Executor.run(Executor.java:429)
Build step 'Execute shell' marked build as failure
Finished: FAILURE

测试环境在更改jenkins工作目录后问题解决,这个改动量其实蛮大的,需要迁移原工作目录数据,还要更改工作目录配置。然后生产环境也出现同样的问题,这边记录下解决的过程。

Read the rest of this entry

背景

某项目weblogic AdminServer在启动后会慢慢消耗内存,并且超过-Xmx设置的大小,最终消耗完整个服务器的内存。

  • 内存使用情况
[root@esb-osb1 ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:          31996       30878         229         195         888         358
Swap:          8063        5793        2270

背景

某项目生产环境负载过高,现象为系统响应慢,命令执行卡顿甚至无法通过ssh登录到服务器。

排查

uptime出系统当前负载情况

# uptime
 16:09:11 up 38 days,  5:40,  2 users,  load average: 73.33, 73.72, 73.66

uptime是检查当前系统负载情况非常重要的命令,它显示了当前操作系统从开机到当前运行了多长时间,当前有几个登录用户,最重要的是告诉我们当前系统的负载情况(load average),三个数字表示了系统在1分钟内,5分钟内,15分钟内的负载情况,平均负载表示当前系统平均运行的线程数,这些线程包括正在运行线程(runnable)和不可中断(uninterruptable)线程,正在运行线程表示当前正在使用CPU或者等待使用CPU的线程,不可中断线程指当前在等待IO的线程,比如当前正在读取文件线程,这样解释可能比较难懂,简单说

  • 对于一个CPU系统,如果负载是1,表示当前CPU使用率是100%,如果超过1表示当前处于超载状态,有线程需要等待。
  • 对于多核CPU系统,如果CPU个数是N,那么负载如果=N表示所有的CPU使用率都处于满载状态,如果>N表示处于超载状态,如果

Read the rest of this entry

背景

如果你是通过rke安装kubernetes,并且rke版本在v0.2.0之前,或者通过rancher安装,并且rancher版本在Rancher v2.0.14、v2.1.9之前,默认的证书有效期是1年,这实在是个大坑,之后的版本rancher更改为10年,证书过期后对现有的服务不影响,服务依然能正常使用,但无法部署新的服务,并且api server不能提供服务,api server如果无法使用,集群基本就废了。

通过openssl工具查看证书有效期

openssl x509 -in /etc/kubernetes/ssl/kube-apiserver.pem -noout -dates
notBefore=Jan  11 10:17:38 2019 GMT
notAfter=Jan  11 10:17:39 2020 GMT

如果当前日期在notAfter之后,那么很不幸,你的证书过期了,此时kubectl命令不可用

$ kubectl get nodes
Unable to connect to the server: x509: certificate has expired or is not yet valid

Read the rest of this entry