PS:以下内容,网友提供 欢迎投稿 cyylog@aliyun.com
三剑客
awk
- 统计日志中某个时间范围的 IP 访问量,并进行排序
$ start_dt='10/May/2018:23:47:43
$ end_dt='10/May/2018:23:49:05'
$ awk -v st=${start_dt} -v ent=${end_dt} -F'[][ ]' '$5 == st,$5 == ent {print $1}' app.log |sort |uniq -c |sort -nr |head -n 10
66 223.13.142.15
6 110.183.13.212
4 1.69.17.127
1 113.25.94.69
1 110.183.58.144
awk '$4>="[30/May/2020:01:08:25" && $4<="[30/May/2020:01:10:25"{a[$2]++} END {for(v in a) print v,a[v]}' access.log
awk '$4>="[29/May/2020:20:39:11" && $4<="[30/May/2020:01:08:27" {a[$1]++} END {for(v in a)print v,a[v]}' access.log
[29/May/2020:18:53:53
[29/May/2020:18:54:23
- 按URL的请求数排序,出访问这些url的ip
按URL的请求数排序
awk -F\" '{print $2}' access.log | awk '{print $2}' | sort | uniq -c | sort -r
找出访问这些url的ip
awk -F\" '($2 ~ "/phpmyadmin/index.php"){print $1}' access.log | awk '{print $1}' | sort | uniq -c | sort -r
- 查看http的并发请求数与其TCP连接状态**
netstat -n |awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
uptime | awk '{print $11}' | tr -d ,
sed
关闭selinux
sed -ri s/SELINUX=enforcing/SELINUX=disabled/g /etc/selinux/config setenforce 0
将nginx.conf中的所有server_name中baidu.com替换成linkdood.cn
sed -ri s/server\_name/baidu\.com/g nginx.conf
grep
- 用命令如何查找/opt/目录下文件名qypay.conf的文件中是否有redis=127.0.0.1的配置
grep "redis\=127\.0\.0\.1"/opt/qypay.conf
find
- 查找/data目录下5天前,大于100M的文件并删除
find /data -type -size +100M -atime +5 -exec rm -rf {} \;
find /data -type -size +100M -atime +5|xargs -i rm -rf
shell
- 写脚本找到本机的IP地址
获取当前主机ens33的ip
ifconfig ens33 | grep "inet " | sed 's/^.*inet //g' | sed 's/ *netmask.*$//g'
ip addr | awk '/^[0-9]+: / {}; /inet.*global/ {print gensub(/(.*)\/(.*)/, "\\1", "g", $2)}'
ip addr | awk '/^[0-9]+: / {}; /inet.*global/ {print gensub(/(.*)\/(.*)/, "\\1", "g", $2)}'
命令解释
ifconfig -a 和window下执行此命令一样道理,返回本机所有ip信息
grep inet 截取包含ip的行
grep -v 127.0.0.1 去掉本地指向的那行
grep -v inet6 去掉包含inet6的行
awk { print $2} $2 表示默认以空格分割的第二组 同理 $1表示第一组
tr -d "addr: 删除"addr:"这个字符串
- 如何查看系统每个ip的连接数
netstat -tan| awk '/tcp & gt; /{ split ($5,ip,":"); count[ip[1]]++} END {for(i in count) { print i, count[i]} }'
统计80端口所有连接状态
netstat -tn|grep ":80" |awk '{print $6}'|sort|uniq -c
编写脚本,快速找出192.168.1.0/24网段中已经使用的IP地址
#!/bin/bash/env bash
echo "-----------------------------------------"
echo "可以 ping 通的 ip 在当前目录的111.txt文件"
echo "不可以 ping 通的 ip 在当前目录的222.txt文件"
echo "-----------------------------------------"
echo > ./111.txt
echo > ./222.txt
read -p "请输入IP的第三位数字即可:" num3
i=1
IP3="192.168.$num3"
for i in {1..254}
do
{
ping -c1 $IP3.$i >>/dev/null
if [ $? -eq 0 ];then
echo "$IP3.$i" >>./111.txt
else
echo "$IP3.$i" >>./222.txt
fi
} &
done
wait
echo "finish...ok"
- curl测试网页响应时间
连接时间:
curl -s -o /dev/null -w "%{time_connect}\n" https://www.cyylog.cn
传输时间:
curl -s -o /dev/null -w "%{time_starttransfer}\n" https://www.cyylog.cn
总时间:
curl -s -o /dev/null -w "%{time_total}\n" https://www.cyylog.cn
curl对网站响应时间监控:
[root@localhost script]# curl -o /dev/null -s -w "time_connect: %{time_connect}\ntime_starttransfer: %{time_starttransfer}\ntime_total: %{time_total}\n" " https://www.cyylog.cn"
time_connect: 0.015
time_starttransfer: 0.394
time_total: 0.433
负载均衡
- HAproxy, LVS, Nginx 有何区别,工作中会怎么选择
LVS: 是基于四层的转发
HAproxy: 是基于四层和七层的转发,是专业的代理服务器
Nginx: 是WEB服务器,缓存服务器,又是反向代理服务器,可以做七层的转发
区别: LVS由于是基于四层的转发所以只能做端口的转发
而基于URL的、基于目录的这种转发LVS就做不了
工作选择:
HAproxy和Nginx由于可以做七层的转发,所以URL和目录的转发都可以做
在很大并发量的时候我们就要选择LVS,像中小型公司的话并发量没那么大
选择HAproxy或者Nginx足已,由于HAproxy由是专业的代理服务器
配置简单,所以中小型企业推荐使用HAproxy
灰度发布
- 灰度发布过程中出现问题,数据库中有脏数据怎么解决
灰度发布大部分用户都是公司中的人,少部分是外面的用户,如果出现错误,叫DBA进行数据库回滚就可以的,在灰度发布的数据中都有标记
,外面的用户只能叫DBA进行修改
Iptables
- 本地80端口的请求转发到8080端口,当前主机IP为192.168.2.1
iptables -t nat -A PREROUTING -d 192.168.2.1 -p tcp -dport 80 -j DNAT -to 192.168.2.1:8080
- 允许本机对外连接80端口(本机能连外界服务器为80)
iptables -A OUTPUT -p tcp –dport 80 -j ACCEPT
- 禁止外界ping本服务器
iptables -A INPUT -p icmp -j DROP
MySQL
- 查看最近一次innodb表锁记录
show ENGINE INNODB STATUS ;
- 列出数据库所有线程
show full processlist
- MySQL 的每天的数据量,主从,mysql主库数据量大造成从库同步延迟怎么办
带宽,配置不当,性能不一致,待补充
- 用SQL语名查询年龄小于平均年龄的作者姓名、图书名、出版社并按姓名降序排序。 图书(图书号,图书名,作者编号,出版社,出版日期) 作者(作者姓名,作者编号,年龄,性别)
select aname,bname,pub from anthor a join book b on (a.ano = b.ano) where age < (select avg(age) from author)
- mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?
mysql的innodb如何定位锁问题:
在使用 show engine innodb status检查引擎状态时,发现了死锁问题
在5.5中,information_schema 库中增加了三个关于锁的表(MEMORY引擎)
innodb_trx ## 当前运行的所有事务
innodb_locks ## 当前出现的锁
innodb_lock_waits ## 锁等待的对应关系
mysql如何减少主从复制延迟:
如果延迟比较大,就先确认以下几个因素:
1. 从库硬件比主库差,导致复制延迟
2. 主从复制单线程,如果主库写并发太大,来不及传送到从库
就会导致延迟。更高版本的mysql可以支持多线程复制
3. 慢SQL语句过多
4. 网络延迟
5. master负载
主库读写压力大,导致复制延迟,架构的前端要加buffer及缓存层
6. slave负载
一般的做法是,使用多台slave来分摊读请求,再从这些slave中取一台专用的服务器
只作为备份用,不进行其他任何操作.另外, 2个可以减少延迟的参数:
–slave-net-timeout=seconds 单位为秒 默认设置为 3600秒
#参数含义:当slave从主数据库读取log数据失败后,等待多久重新建立连接并获取数据
–master-connect-retry=seconds 单位为秒 默认设置为 60秒
#参数含义:当重新建立主从连接时,如果连接建立失败,间隔多久后重试
通常配置以上2个参数可以减少网络问题导致的主从数据同步延迟
MySQL数据库主从同步延迟解决方案
最简单的减少slave同步延时的方案就是在架构上做优化,尽量让主库的DDL快速执行
还有就是主库是写,对数据安全性较高,比如sync_binlog=1,innodb_flush_log_at_trx_commit
= 1 之类的设置,而slave则不需要这么高的数据安全,完全可以讲sync_binlog设置为0或者关闭binlog
innodb_flushlog也可以设置为0来提高sql的执行效率。另外就是使用比主库更好的硬件设备作为slave
网络基础
- 从技术角度描述一下用户打开https://cyylog.netlify.app所经过的所有过程,越详细越好。 (DNS+HTTP协议)
1. 域名解析
2. 发起TCP的3次握手
3. 建立TCP连接后发起HTTP请求
4. 服务器端响应http请求,浏览器得到html代码
5. 浏览器解析html代码,并请求html代码中的资源
6. 浏览器对页面进行渲染呈现给用户
- tcpdump 抓本机 192.168.23.1 的80端口
tcpdump -i ens33 host 192.168.23.1 port 80
CICD
Zabbix
ELK
Redis
常用web服务器
Apache、Nginx、Tomcat
Ansible
docker
K8S
Other
Keepalived的工作原理
在一个虚拟路由器中,只有作为MASTER的VRRP路由器会一直发送VRRP通告信息,
BACKUP不会抢占MASTER,除非它的优先级更高。当MASTER不可用时(BACKUP收不到通告信息)
多台BACKUP中优先级最高的这台会被抢占为MASTER。这种抢占是非常快速的(<1s),以保证服务的连续性
由于安全性考虑,VRRP包使用了加密协议进行加密。BACKUP不会发送通告信息,只会接收通告信息