zoukankan      html  css  js  c++  java
  • Linux、docker、kubernetes、MySql、Shell、kafka、RabbitMQ、PostgreSQ运维快餐

    检查端口占用

    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=$'
    
    '
    
    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=$'
    
    '
    
    #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=$'
    
    '
    
    function check_port() {
      netstat -tlpn | grep "$1"
    }
    
    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=$'
    
    '
    
    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/(.)/u1/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"
    

    参考链接:https://docs.gitlab.com/ce/ci/variables/README.html

    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;
    

    备注:进程号可能会频繁变动,请快速处理。

  • 相关阅读:
    1-5-03:均值
    1-5-01:求平均年龄
    1-04-t6993:二进制位处理
    1-4-20:求一元二次方程的根
    1-4-19:简单计算器
    1-4-18:点和正方形的关系
    1-4-17:判断闰年
    1-4-16:三角形判断
    1-4-15:最大数输出
    停止IIS服务
  • 原文地址:https://www.cnblogs.com/justmine/p/9103517.html
Copyright © 2011-2022 走看看