Linux、docker、kubernetes、MySql、Shell、kafka、RabbitMQ运维快餐
检查端口占用
lsof -i:[port]
netstat -anp |grep [port]
监控网络客户TCP连接数
netstat -anp | grep tcp |wc -l
获取某进程中运行中的线程数量
ls /proc/[PID]/task | wc -l
输出进程内存的状况,分析线程堆栈
pmap
统计文档容量
du -sh [目录|文件|正则]
例如:查看日志文件大小,从而判定日志是否被入侵者清理掉。
du -sh /var/log/*
查看文件系统挂载点容量
df -h |grep /dev/
Linux排查大文件
cd [目录];
du -h --max-depth=1;
查看磁盘分区信息
root> # 查看挂载哪些磁盘
root> df -h |grep /dev/
root> # 选择其中一块磁盘
root> fdisk -l /dev/xvda2
列出系统中已被格式化的设备
blkid
查询 Ext 家族 superblock 信息
dumpe2fs [-bh] 设备文件名
有用的快捷键
服务器所有网卡带宽使用情况
iftop <-i [interface]>
查看内核日志
tail -f /var/log/messages
查看账号登录操作日志
tail -f /var/log/secure
统计服务器进程数量
ps -aux|wc -l
查看全部容器资源使用情况
docker stats $(docker ps -a --format="{{.Names}}")
统计cpu处理器数量
grep "model name" /proc/cpuinfo | wc -l
查询ip讯息
ifconfig eth0 | grep 'inet'
ifconfig eth0 | grep 'inet' | sed 's/.inet//g' | sed 's/netmask.$//g'
通过脚本设置密码
echo "999999" | passwd --stdin "justmine"
重启系统网络
/etc/init.d/network restart
查看主机启动了哪些网络服务
netstat -tulnp
备注:这个命令很有用,可以一目了然地看出主机开放了哪些端口,以及端口是否对整个Internete开放,占用的应用程序。
查看网络请求连接数,比如监听端口8083
netstat –nat | grep 8083
kubernetes 清理空的副本集(Replica Set)
#!/bin/bash
IFS=$'\n\n'
declare namespace="namespace"
for row in $(kubectl -n ${namespace} get rs)
do
# echo ${row}
declare name=$(echo "${row}"|awk '{print $1}')
declare desired=$(echo "${row}"|awk '{print $2}')
# echo "replica set: ${name}, desired: ${desired}"
if [ $((${desired})) == 0 ]; then
# echo ${name}
kubectl -n ${namespace} delete rs ${name}
fi
done
备注:替换成自己的namespace即可。
判断kubernetes是否准备就绪
以deployment为单位,准备就绪的条件为实例的当前数量、期望数量、最新数量相等,间隔10秒watch一次。可以将该脚本加入CI/D管道中。
#!/bin/bash
IFS=$'\n\n'
#1: ready, 0: not ready.
declare ready=0
while [ $((${ready})) == 0 ]
do
sleep 10s
echo ""
declare AllIsReady=1
for row in $(kubectl -n [namespace] get deployment)
do
echo ""
declare name=$(echo "${row}"|awk '{print $1}')
declare desired=$(echo "${row}"|awk '{print $2}')
declare current=$(echo "${row}"|awk '{print $3}')
declare uptodate=$(echo "${row}"|awk '{print $4}')
declare available=$(echo "${row}"|awk '{print $5}')
echo "deployment: ${name}, desired: ${desired}, current: ${current}, uptodate: ${uptodate}, available: ${available}"
if [ $((${desired})) == $((${current})) -a $((${current})) == $((${uptodate})) -a $((${uptodate})) == $((${available})) ]; then
echo "${name} has been ready.";
else
echo "${name} has been not ready.";
AllIsReady=0
fi
done
if [ $((${AllIsReady})) == 1 ]; then
ready=1
fi
done
备注:替换成自己的namespace即可。其他的资源类型同理,大家可以举一反三。
Linux获取UUID
cat /proc/sys/kernel/random/uuid
mysql还原数据库,后台静默运行。
nohup mysql -S /home/mysql/port-3306/3306_mysql.sock -h[domain name] -P3306 -u[user name] -p[password] [database name] < [databaseBackupedsql file full path] >/dev/null 2>&1 &
docker 统计资源占用情况
docker system df
kubernetes 统计资源占用情况(CPU、内存)
kubectl top node
kubectl top pod --all-namespaces
备注:此命令需要先安装metrics_server
Linux 查看隐藏进程,使其现出原形。
echo "" > /etc/ld.so.preload
top
备注:排查隐藏的挖矿程序。
Linux配置SSH互信
客户机:192.168.1.113,服务器:192.168.13.110,用户:root。
目的
让客户机可以免密登录服务器。
步骤
1. 在客户机(192.168.1.113)上生成一对SSH密钥、公钥。
ssh-keygen -t rsa 或 ssh-keygen -b 4096 -t rsa
备注:-t表示密钥类型,-b表示密钥长度,默认1028。可以一路【回车】到底,也可以输入SSH密钥的加密密码,即pub_key。
2. 将SSH公钥上传到服务器(192.168.13.110)
ssh-copy-id root@192.168.13.110
备注:这一步需要输入服务器账户root的密码。
2.1. 异常处理
如果发生ERROR: @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!等错误,执行命令:
ssh-keygen -R 192.168.13.110
然后再次执行命令ssh-copy-id root@192.168.13.110
。
注意:如果在步骤1输入了公钥Key,那么第一次SSH登录时,需要输入SSH密钥的加密密码。
从Linux远程服务器下载和上传文件。
从服务器(192.168.1.110)下载指定文件(/home/mysql.tar.gz)到客户机指定目录(/home/mysql)。
scp root@192.168.1.110:/home/mysql.tar.gz /home/mysql
备注:输入服务器root用户密码开始下载。
客户机上传指定文件(/root/mysql.tar.gz)到服务器(192.168.1.110)的指定目录(/home/mysql)。
scp -r /root/mysql.tar.gz root@192.168.1.110:/home/mysql
备注:需要先配置SSH互信,参照上面【Linux配置SSH互信】配置即可。
linux shell脚本按长度获取本机指定端口范围内的可用端口数。
#!/bin/bash
IFS=$'\n\n'
function check_port() {
netstat -tlpn | grep "\b$1\b"
}
function getAvailablePorts()
{
echo "port range[$1 $2], the size of available ports: $3"
declare ports=$(seq $3)
declare index=0
for((i=$1;i<$2;i++));
do
if check_port $i; then
echo "$i port has been occupied"
else
ports[$index]=$i
let index++
if [ $(($index)) == $(($3)) ]; then
break
fi
fi
done
echo ${ports[*]}
}
declare ports=$(getAvailablePorts 30000 32767 10)
echo "the available ports of kubernetes is: ${ports[*]}"
测试用例:按长度获取kubernetes noteport端口范围内的可用端口数。
调用其它shell文件脚本的函数
首先引入其他shell脚本文件,比如:. ./getAvailablePorts.sh。语法:. [filepath]。然后就可以像本地一样调用函数,比如:declare ports=$(getAvailablePorts 30000 32767 10)。
linux shell 解析json数组
示例
#!/bin/bash
IFS=$'\n\n'
declare routes=$(curl -X GET http://127.0.0.1:81/services/light/routes)
echo $routes
declare JQ_EXEC=`which jq`
declare routeid=$(echo $routes | ${JQ_EXEC} .data[0].id | sed 's/\"//g')
echo ""
echo $routeid
单个对象属性
.[对象名],例如:.data。
Json数组某个对象属性值
.[对象名][下标].属性名,例如:.data[0].id。
利用kubernetes傻瓜式迁移elasticsearch数据。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nodejs-hello-world
namespace: tools
spec:
selector:
matchLabels:
app: nodejs-hello-world
replicas: 1
template:
metadata:
labels:
app: nodejs-hello-world
spec:
containers:
- name: nodejs-hello-world
image: taskrabbit/elasticsearch-dump
imagePullPolicy: Always
ports:
- containerPort: 3000
args:
- "--input=http://192.168.1.123:9200"
- "--output=http://192.168.1.123:9200"
- "--type=data"
备注:input表示旧地址,output表示新地址;创建Deployment,将自动执行,全程无需参与,也不用安装nodejs的环境npm。
Linux shell脚本调试,即打印整个执行过程
sh -x [shell文件路径]
Linux shell curl 弹性http请求
# 允许整个操作花费的最大秒数。
declare maxTime=10
# 最大连接时间
declare maxConnectTime=2
# 重试次数
declare retryCount=5
# 示例
curl --request GET --connect-timeout $maxConnectTime --max-time $maxTime --retry $retryCount --url [API地址]
同步Linux服务器标准时间
yum install ntp -y;
ntpdate cn.pool.ntp.org;
Linux shell 转义Json
yum install jq -y;
cat [json file full name] | jq tostring
Dockerfile设置中国标准时区(CST)
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
kubernetes起一个临时的MySql客户端,通过内部dns直接访问MySql服务器,无需额外开放端口,如NodePort:
kubectl run mysql-client-cluster --image=mysql:5.7 -i -t --rm --restart=Never --\
mysql -h "server dns name" -P"端口" -u 用户名 -p'密码' -e "执行的sql语句"
备注:当测试部署到kubernetes中的mysql时,很有用。
查看MySql当前进程信息
show full processlist
linux shell function返回值
function pass_back_a_string() {
eval "$1='foo bar rab oof'"
}
return_var=''
pass_back_a_string return_var
echo $return_var
备注:不要将eval写成echo,亲测可用,通过return \(?、\)()获取返回值都是不行的。
删除kafka消费组
bin/kafka-consumer-groups.sh --bootstrap-server <cluster-addr-list> --delete --group <group-name>
示例:
bin/kafka-consumer-groups.sh --bootstrap-server 182.168.1.12:4523,182.168.1.13:4524 --delete --group tianmao.production
备注:此命令只适用于新版kafka,删除前,先去zookeeper查询
ls /consumers
,没数据,即代表kafka未将消费组元数据存储到zookeeper;只有旧版本kafka消费组元数据会储存到zookeeper,删掉zookeeper对应的元数据即可。
Linux shell 删除内容第一行数据
# 比如:删除目录列表第一行total汇总信息
ls -l /root | awk 'NR>1'
Linux shell 字符串全部替换
function Replace()
{
declare input=$1
declare sourceExpr=$2
declare targetExpr=$3
declare output=${input//${sourceExpr}/${targetExpr}}
eval $4=${output}
}
# 例子
Replace "microservice-autodevopspipeline-v0" '-' '.' value
echo ${value}
Linux shell 字符串转小写
function ToLower()
{
declare input=$1
declare output=($(echo "${input}" | tr 'A-Z' 'a-z'))
eval $2=${output}
}
# 例子
ToLower "Microservice-Autodevopspipeline-V0" value
echo ${value}
Linux shell 动态变量取值
#!/bin/bash
function DynamicVariableValueOf()
{
declare prefix=$1
declare suffix=$2
eval "output=\$$prefix$suffix"
eval $3=${output}
}
# 例子
BasketPublishable="1"
DynamicVariableValueOf "Basket" "Publishable" value
echo ${value}
Linux shell 首字母大写
#!/bin/bash
function FirstCharUpperCase()
{
declare input=$1
declare output=($(echo ${input} | sed -e "s/\b\(.\)/\u\1/g"))
eval $2=${output}
}
# 例子
FirstCharUpperCase "foo" value
echo ${value}
GitLab调试CI管道脚本
# 设置
CI_DEBUG_TRACE: "true"
# 开启Job调试参考脚本
staging-k8s-configmap_job:
stage: staging-k8s-configmap
variables:
CI_DEBUG_TRACE: "true"
......
# 开启全局调试
项目仓库 => setrings => ci/cd => Secret variables =>
添加变量:CI_DEBUG_TRACE: "true"
Linux shell 去掉第一行标题
# 设置
awk 'NR > 1'
# 例子
kubectl -n microservice-autodevopspipeline-v1 get rs|awk 'NR > 1'
RabbitMQ 添加管理员并授权
# 1. 添加用户
rabbitmqctl add_user username password
# 2. 设置用户角色为管理员
rabbitmqctl set_user_tags username administrator
# 3. 列举所有用户
rabbitmqctl list_users
# 4. 授权
rabbitmqctl set_permissions -p / username '.*' '.*' '.*'
# 5. 查看权限
## 指定用户
rabbitmqctl list_user_permissions username
## 所有用户
rabbitmqctl list_permissions
# 6. 清除权限
rabbitmqctl clear_permissions [-p VHostPath] username
MySql 查看锁情况
# 锁的概况
select * from information_schema.innodb_locks;
# InnoDB整体状态,其中包括锁的情况。
show engine innodb status;
# 查看隔离级别
## 全局
select @@global.tx_isolation
## 本次会话
select @@tx_isolation;
kubernetes 几大组件排查及重启(仅限二进制服务形式安装参考)
## 调度
systemctl status kube-scheduler
systemctl restart kube-scheduler
## 网络
systemctl status kube-proxy
systemctl restart kube-proxy
## 代理办事人
systemctl status kubelet
systemctl restart kubelet
## 控制管理器
systemctl status kube-controller-manager
systemctl restart kube-controller-manager
## api-server
systemctl status kube-apiserver
systemctl restart kube-apiserver
Linux 查看机器最近成功和最后一次不成功的登录事件
lastlog
Linux 查看机器当前登录的全部用户
who
Linux 查看机器创建以来登陆过的用户
last
Linux 分析/var/log/secure
cat /var/log/secure | grep -i "accepted password"
Linux 查看文件被哪些进程所打开
lsof | grep /var/log/secure
kubernetes 平滑地启动一个应用
# 示例:
kubectl run busybox -it --image=busybox --restart=Never --rm
kubernetes 查询kube-proxy运行模式(ProxyMode:iptables)
# 在master主机执行命令
# Kube-proxy 通过一个 proxyMode endpoint 暴露它的模式
curl localhost:10249/proxyMode
kubernetes 获取yaml或json文件项值
# 获取服务nodeport
kubectl -n [命名空间] get -o jsonpath="{.spec.ports[0].nodePort}" services [服务名称]
# 获取node ip地址
kubectl get nodes -o jsonpath='{ $.items[*].status.addresses[?(@.type=="InternalIP")].address }'
Linux修改网关、dns
# 文件
vi /etc/network/interfaces
# 重启
/etc/init.d/networking restart
MySql修改表结构,添加平滑检查(存在即添加,不存在则不受影响)
/*============== 示例:订单表(orders)新增列(createtime) =====================*/
drop procedure if exists schema_change;
delimiter ';;'
create procedure schema_change() begin
if not exists (select * from information_schema.columns where table_name = 'orders' and column_name = 'createtime') then
alter table orders add column `createtime` tinyint(1) DEFAULT '0' COMMENT '创建时间';
end if;
end;;
delimiter ';'
call schema_change();
drop procedure if exists schema_change;
MySql flush hosts
如果同一个ip(host)在短时间内产生大量错误数据库连接,达到阈值max_connection_errors时,MySql将阻塞新建立的连接,解决方法如下:
# 连接Mysql数据库执行如下命令:
## 方法一 (治标)
show variables like '%max_connection_errors%';
set global max_connect_errors = 新阈值;
## 方法二(治本)
mysqladmin -u usename -p'password' -h host -Pport flush-hosts;
MySql 查看日志
# 开启日志
SET global general_log = 1;
SET global log_output = 'table';
# 查看日志
SELECT * FROM mysql.general_log ORDER BY event_time DESC LIMIT 100;
# 停止日志(日志对性能影响较大,生产环境除排查问题外,不建议开启)
SET global general_log = 0;
(PostgreSQ) 切换/选择数据库架构模式 - switch/select scheme
select [scheme name]
PgSql创建、删除、查看索引。
select * from pg_indexes where tablename='表名';
DROP INDEX {数据库架构}.{索引名称};
CREATE UNIQUE INDEX {索引名称}ON {数据库架构}.{表} USING btree (列,列);
Docker快速清理方案
# 删除所有停止的容器
docker container prune;
# 删除所有停止的资源(容器、镜像、IO)
docker system prune -af;
排查PostgreSQL高CPU的Sql语句
命令:top;
键盘操作:shift+p,根据CPU排序
命令:psql -U [用户名] -d [数据库] -p[端口] -h [主机]
键盘操作:shift+insert,输入密码
命令:SELECT procpid, START, now() - START AS lap, current_query FROM ( SELECT backendid, pg_stat_get_backend_pid (S.backendid) AS procpid,
pg_stat_get_backend_activity_start (S.backendid) AS START,pg_stat_get_backend_activity (S.backendid) AS current_query FROM (SELECT
pg_stat_get_backend_idset () AS backendid) AS S) AS S WHERE current_query <> '<IDLE>' and procpid=[CPU高的PgSql进程号] ORDER BY lap DESC;
备注:进程号可能会频繁变动,请快速处理。
Linux、docker、kubernetes、MySql、Shell、kafka、RabbitMQ运维快餐的更多相关文章
- Rabbitmq 运维
Rabbitmq 运维 一.安装: 安装ncurses wget http://ftp.gnu.org/gnu/ncurses/ncurses-6.1.tar.gz tar zxf ncurses-6 ...
- Linux Shell交互式自动化运维程序
Expect是Linux操作系统下的一个用来处理交互操作,系统默认是没有安装expect库,所以执行expect会提示找不到命令,需要手动安装,其它安装也比较简单,可以通过二进制源码包编译配置进行安装 ...
- mysql分享一:运维角度浅谈MySQL数据库优化
转于:http://lizhenliang.blog.51cto.com/7876557/1657465 1.数据库表设计要合理避免慢查询.低效的查询语句.没有适当建立索引.数据库堵塞(死锁)等 2. ...
- 转 移动云基于MySQL Galera的PXC运维实战
##sample 1 : mysql 监控 1.phpadmin 比较简单,适合上手 2.mysql_web python 写的, https://github.com/ycg/mysql_web/ ...
- mysql操作及自动化运维
备份恢复工具:percona-xtrabackup-2.0.0-417.rhel6.x86_64.rpm mysql主从配置命令: 主: 1.编辑主MYSQL 服务器的MySQL配置文件my.cnf, ...
- Docker 搭建开源跳板机_jumpserver (运维开源堡垒机_jumpserver) Centos_7.0
最近看到一个开源项目(jumpserver) 很不错 还是用Docker 部署得 ... 抽了点时间拿来学习一下 部署 分析 简单使用一下 ....好了先搭起来 准备 工作: ...
- [转]MySQL数据库的优化-运维架构师必会高薪技能,笔者近六年来一线城市工作实战经验
本文转自:http://liangweilinux.blog.51cto.com/8340258/1728131 年,嘿,废话不多说,下面开启MySQL优化之旅! 我们究竟应该如何对MySQL数据库进 ...
- MySQL数据库的优化-运维架构师必会高薪技能,笔者近六年来一线城市工作实战经验
原文地址:http://liangweilinux.blog.51cto.com/8340258/1728131 首先在此感谢下我的老师年一线实战经验,我当然不能和我的老师平起平坐,得到老师三分之一的 ...
- Linux的简单介绍和开发基本运维时候用到的命令
先简单介绍下Linux文件夹目录 1./ linux下的根目录 实际上等同于window的我的电脑点进去 2./etc /usr 一个是系统配置文件存放的地方,一个是系统资源(应用程序)放的地方这俩文 ...
随机推荐
- Universal USB Installer – Easy as 1 2 3
Universal USB Installer aka UUI is a Live Linux Bootable USB Creator that allows you to choose from ...
- macOS High Sierra Terminal巨卡问题的解决
输入命令特别卡,拖拽窗口也特别卡,想到可能和界面渲染有关系,到设置里面把不透明度调成满值,问题解决. 真正的技术原因是看iOS开发相关的书的时候,书里面有这方面渲染消耗的提示说明.
- 使用springmvc时静态的文件获取不到,比如说样式丢失的问题。
当使用springmvc时前台所有的样式全部都消失不见了,查了很多资料,简单的说就是我在配置web.xml中的过滤器时将<url-pattern></url-pattern>中 ...
- stm8开发环境
网上大致有两种环境: 1.stvp+stvd 也就是st自家的sttoolsetpack包 stvd的界面有点古板,有点像vc++6.0,具体使用感觉怎样我也不知道,我没有使用这个环境. stvp这个 ...
- 在网页中使用particlesjs实现背景的动态粒子特效
先上一张效果图: 这种动态的背景特效,制作起来其实非常简单. 使用了particles.js particles.js可以从github网站下载到最新的源码,网址是 https://github.co ...
- Key-Value Store Indexer(Lily HBase Indexer) 小型采坑
环境: Cloudera Express 5.12.1 JDK 1.8.0_92 CentOS 7 步骤1:数据导入到Hbase中(非正题,跳过) hbase中表为allDoc,两个Family:fu ...
- 浏览器选择最新IE渲染
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
- 洛谷 P1057 解题报告
P1057 传球游戏 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹 ...
- 团队项目第二阶段个人进展——Day10
一.昨天工作总结 冲刺第十天,做程序的测试,并修复一些小的bug 二.遇到的问题 无 三.今日工作规划 继续对程序进行测试优化
- jsp 增删改查
使用Idea创建项目 1.新建web application项目 Idea 选择 Java Enterprise -> web application 2.新版本没有web-inf文件夹 解决方 ...