• 个人纪录20220420


    CICD、Devops、docker kvm k8s、haproxy、nginx、kafka、Tomcat、Jboss、jetty、mysql、mongo、shell、Python、ansible、ETL、Oracle、Windows server、Jenkins、zabbix、

    #### 所需重要性如下:
    ***tomcat
    ***nginx
    jetty
    *redis
    *kafka
    *jumpserver
    *jenkins
    ***docker
    ***k8s
    ***mysql
    **CIFS/COS
    ***腾讯云
    **AWS


    #################################################################################################################################################################
    #################################################################################################################################################################
    《LINUX》

    ### 只保留最新的20个日志文件
    rm `ls -t ./ |tail -n +20`


    ### setfacl getfacl
    setfacl命令可以用来细分linux下的文件权限。

    ### PAM
    PAM 的全称为可插拔认证模块(Pluggable Authentication Modules:简称 PAM
    linux上的安全认证机制

    ###
    从日志中统计ip地址: grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" test.txt |sort|uniq
    grep -o 只显示匹配中的字符
    grep -o root /etc/passwd
    grep 中 [0-9]{1,3} 注{}中表示的是0-9数字有1,2,或3位,如3,887,98都会匹配到,如果是[0-9]{2},则只会匹配两位数数字;


    ### last 查看近期用户登录记录
    读取文件:/var/log/wtmp
    第三四五列表示:开始时间,结束时间,持续时间
    reboot表示启动或重启操作

    ### lastb 查看近期用户登录失败记录
    读取文件:/var/log/wtmp


    ### screen -S lai #创建一个名为lai的会话
    ### screen -r lai #回到lai的会话

    ### 环境变量 (20211210_log4j漏洞)
    把变量:FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS 的值设为 true
    export FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS=true
    cat .bash_profile 当前用户的环境变量,

    使之生效:source .bash_profile
    /etc/profile 系统环境变量,

    使之生效:source /etc/profile
    /etc/environment 系统变量(较少用)


    ### if [ -z "$CATALINA_TMPDIR" ] ; then ## -z 是否=0

    ### yum list installed  #列出已安装软件
    yum check-update  #检查有那些软件可更新

    yum list updates #列出可更新软件
    yum info #列出指定安装包信息
    yum search ssh #搜索yum可安装的软件
    yum list updates #列出可更新软件
    #yum localinstall grafana-6.2.5-1.x86_64.rpm #通过下载的包,yum安装,解决依赖问题;

    ### sort 将字符排序, uniq 去除重复(先排序后去重)
    选项:
    -f:忽略大小写;
    -b:忽略每行前面的空白部分;
    -n:以数值型进行排序,默认使用字符串排序;
    -r:反向排序;
    -u:删除重复行。就是 uniq 命令;
    -t:指定分隔符,默认分隔符是制表符;
    -k [n,m]:按照指定的字段范围排序。从第 n 个字段开始,到第 m 个字(默认到行尾);

    # ss -antp |awk -F ' ' '{print $5}' |sort|uniq |awk -F ':' '{print $1 }' |sort|uniq |grep 183
    183.192.170.185
    #find /app/nginx/logs -type f -name '*log*' -mtime -1 -exec awk -F '-' '{print $1}' {} \; |sort|uniq |wc -l
    7632 #统计nginx访问日志中近一天的ip数量。排序去重。


    ### Windows TCP/IP远程代码执行(CVE-2021-24074)漏洞
    netsh int ipv4 set global sourceroutingbehavior=drop
    取消:
    netsh int ipv4 set global sourceroutingbehavior=dontforward

    ### cp 复制一部分文件
    ls |head -n 1000 |xargs -i cp {} /tmp/

    ### touch -t 202101011111 log-cleaner.log.2021-07-11-05 更新mtime

    ### shell 定时任务
    #! /bin/sh

    while true
    do
    number=`ps -ef | grep ibu-gpsp-core-sub | grep -v "grep" | wc -l`
    if [ $number -eq 0 ];
    then
    nohup /bin/bash /app/ibu-gpsp-core-sub/bin/start_pro.sh >> /app/applogs/lomp-sub/monitor.log &
    fi
    sleep "600s"
    done

    ### 后台启动
    sh send_mail.sh >/dev/null 2>&1 &

    ### python3
    yum -y install epel-release #安装epel拓展源
    yum install -y net-tools python3 #安装python3
    yum install python-pip #安装pip


    JUMPS堡垒机安装
    https://docs.jumpserver.org/zh/master/install/setup_by_fast/


    ### jumpserver新增Windowsserver2016服务器
    1 新建管理用户\特权用户
    2 新建资产
    3 新建连接用户
    4 资产授权
    5 winserver2016上,新增用户,并将用户添加允许远程权限。修改远程设置 不要勾选 仅允许运行使用网络级别身份验证的远程桌面的计算机连接(建议)(N) !重要!
    6 重启远程桌面服务

    ### chattr 增加特殊权限 chattr +a a.txt
    lsattr 显示特殊权限
    参数 作用
    i 无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件
    a 仅允许补充(追加)内容,无法覆盖/删除内容(Append Only)
    S 文件内容在变更后立即同步到硬盘(sync)
    s 彻底从硬盘中删除,不可恢复(用0 填充原文件所在硬盘区域)
    A 不再修改这个文件或目录的最后访问时间(atime)

    ### more /etc/sudoers |grep -v ^$|grep -v ^# 去除空行 #开头
    ### cat /app/applogs/lomp-sub/error.log |grep -v '^\s' #去除空格开始的行, ^表示行首,^# 去掉#开头的行,\s表示空格或tab,^\s 去除空格开始的行;
    ==raid 0 磁盘组合,不冗余,性能提升最大。
    ==raid 1 磁盘互为备份。利用率最大50%
    ==raid 5 将一块数据的奇偶校验,存到其他盘,
    ==raid 10 先将磁盘两两制成raid1 ,然后再对两个raid1阵列实施raid0 。

    ### firewalld
    把原本访问本机 888 端口的流量转发到22 端口,要且求当前和长期均有效:
    [root@linuxprobe ~]# firewall-cmd --permanent --zone=public --add-forward-port=port=888:proto=tcp:toport=22:toaddr=192.168.10.10
    success
    [root@linuxprobe ~]# firewall-cmd --reload
    success


    ### dd if=/dev/zero of=./a.file bs=200MB count=1 #生成文件,名为a.file,每个块大小为200m,共计一个块。


    ### 监控程序14282对于cpu使用情况
    pidstat -u -l -p 14282 1
    Linux 2.6.32-642.el6.x86_64 (CNSZ22VL3914) 04/23/2021 _x86_64_ (4 CPU)

    02:46:56 PM PID %usr %system %guest %CPU CPU Command
    02:46:57 PM 14282 0.00 0.99 0.00 0.99 0 /app/jdk/jdk1.8.0_25/bin/java -Djava.util.logging.config.file=/app/kts/tmsserver/conf/logging.properties -Djava.util.logging.ma
    02:46:58 PM 14282 0.00 0.00 0.00 0.00 0 /app/jdk/jdk1.8.0_25/bin/java -Djava.util.logging.config.file=/app/kts/tmsserver/conf/logging.properties -Djava.util.logging.ma
    02:46:59 PM 14282 0.00 0.00 0.00 0.00 0 /app/jdk/jdk1.8.0_25/bin/java -Djava.util.logging.config.file=/app/kts/tmsserver/conf/logging.properties -Djava.util.logging.ma


    ### at 计划任务
    [root@linuxprobe ~]# at 23:30
    at > systemctl restart httpd
    at > 此处请同时按下Ctrl + D 组合键来结束编写计划任务

    crontab -l
    * * * * * commend
    分、时、日、月、星期 命令
    星期 取值为 0~7 的任意整数,其中0 与7 均为星期日

    Configuration summary
    + using system PCRE library
    + using system OpenSSL library
    + using system zlib library

    ### 文件测试运算符 作用
    -d 测试文件是否为目录类型
    -e 测试文件是否存在
    -f 判断是否为一般文件
    -r 测试当前用户是否有权限读取
    -w 测试当前用户是否有权限写入
    -x 测试当前用户是否有权限执行

    [root@linuxprobe ~]# [ ! $USER = root ] && echo "user" || echo "root"
    root

    !取反
    &&前面为真才执行,
    || 前面为假才执行,

    整数比较运算符 作用
    -eq 是否等于
    -ne 是否不等于
    -gt 是否大于
    -lt 是否小于
    -le 是否等于或小于
    -ge 是否大于或等于

    常见的字符串比较运算符
    运算符 作用
    = 比较字符串内容是否相同
    != 比较字符串内容是否不同
    -z 判断字符串内容是否为空

    ### 接收参数:

    $0 对应的是当前Shell 脚本程序的名称,
    $#对应的是总共有几个参数,
    $*对应的是所有位置的参数值,
    $?对应的是显示上一次命令的执行返回值,
    $1、$2、$3……则分别对应着第N 个位置的参数值,

    参数比较参见上面测试语句
    [root@linuxprobe ~]# [ -d /etc/fstab ]
    [root@linuxprobe ~]# echo $?
    1
    ##################################################################################################
    if
    [root@linuxprobe ~]# vim mkcdrom.sh
    #!/bin/bash
    DIR="/media/cdrom"
    if [ ! -e $DIR ]
    then
    mkdir -p $DIR
    fi
    # 如果路径不存在则创建


    crontab
    标准输出
    13 */4 * * * /home/20201109_clean.sh > /dev/null 2>&1 & # 将标准输出和标准错误输出都输出到空设备文件;如果写成 commond > file2 > file ,可能出现标准输出和标准错误输出两个输出抢占管道现象;

    ### ls -d 像文件一样显示目录,而不是显示目录下的文件

    ### pid 和fd (文件描述符)
    文件描述符就是linux内核为了高效管理这些被打开文件而创建的索引,非负整数。用于代指被打开的文件,所有I/O操作都通过文件描述符来实现。
    实际上,
    内核关于文件描述符,维护了三个数据结构:
    进程级的文件描述符表
    系统级的打开文件描述符表---_____这两个表存储了每个打开文件的文件句柄。一个打开文件句柄存储了与一个打开文件相关的所有信息。
    文件系统的i node表----------

    vim一个文件,先复制,再编辑复制出来的文件,如果保存,则用复制文件替换原来文件。 所以i nodeID 是4 ,不是3


    ###
    #!/bin/bash |
    read -p "enter your score (0 - 100):" GRADE |

    if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ]; then |
    echo "$GRADE is excellent !" |
    elif [ $GRADE -ge 60 ] && [ $GRADE -le 85 ]; then |
    echo "$GRADE is pass !" |
    elif [ $GRADE -ge 0 ] && [ $GRADE -le 60 ];then |
    echo "sorry, your score is $GRADE ,not pass." |
    elif [ $GRADE -ge 100 ] || [ $GRADE -le 0 ] ;then |
    echo "别闹,我知道你不可能考$GRADE" |

    fi |


    ### while 条件测试操作
    do 命令
    done

    #!/bin/bash
    PRICE=$(expr $RANDOM % 1000)
    TIMES=0
    echo "the price is 0-999, what's price?"
    while true
    do
    read -p "please enter the price that your guess:" INT
    let TIMES++
    if [ $INT -eq $PRICE ] ; then
    echo "yes! the price is $PRICE";
    echo "the time is $TIMES"
    exit 0
    elif [ $INT -gt $PRICE ]; then
    echo "too high."
    else
    echo "too low."
    fi
    done

    ### case


    #!/bin/bash
    read -p "enter a sit ,and press ENTER:" KEY
    case "$KEY" in
    [a-z] | [A_Z])
    echo "this is a alphabet."
    ;;
    [0-9])
    echo "this is number."
    ;;
    *)
    echo "this is others."

    esac

    ### centos 7 yum更新:
    sudo yum install epel-release -y
    sudo yum update -y

    centos7 安装jdk
    yum search java | grep jdk
    yum install -y java-1.8.0-openjdk*
    ### 设置jdk 环境变量
    echo "JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::")" | sudo tee -a /etc/profile
    source /etc/profile
    ### 设置环境变量2:
    vim /etc/profile
    export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.141-2.6.10.1.el7_3.x86_64
    export PATH=$JAVA_HOME/bin:$PATH
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar


    ### 设置时区:
    timedatectl set-timezone Asia/Shanghai

    ### 查找文件所属为root,并改所属
    find /home/appdeploy/ -type f -uid 0 -exec chown appdeploy {} \;
    find /home/appdeploy/ -type f -uid 0 -exec chown appdeploy:mwopr {} \;

    ### 磁盘清理脚本 uat-ext-node 2 3 4
    [appdeploy@1a01vlb8593zzzz ~]$ cat 1125.sh
    #!/bin/bash
    remain=`df |grep /dev/vda1 |awk '{print $4}'`
    echo $(date +%F\ %T) >> /home/clean.log

    if [[ $remain -lt 10485760 ]] ;then
    echo -e "Available space is unhealthy : $remain b\n/app/applogs/lomp-ext-miandan/error-* and info-* will be deleted\n " >> /home/clean.log
    rm -f /app/applogs/lomp-ext-miandan/error-*
    rm -f /app/applogs/lomp-ext-miandan/info-*
    else
    echo -e "space is enough\n" >> /home/clean.log
    fi


    ### 发送数据库查询结果到邮件监控告警脚本 (在uat-tps1)
    #cat /home/appdeploy/lai/test.work.php

    #!/usr/bin/php
    <?php
    $connection=mysql_connect("10.200.192.238","root","*************"); //连接并选择数据库服务器
    mysql_select_db("testlai",$connection);
    $query="select * from testlai.realm_default_roles;";
    $result=mysql_query($query,$connection);
    while($row=mysql_fetch_object($result))
    {
    echo $row->REALM_ID." | "
    ; //通过对象运算符->获得改行数据在其属性上的值。
    echo $row->ROLE_ID." | ";
    echo $row->create_time."
    ";
    }
    ?>

    # cat sendmail.sh

    #!/bin/bash
    MESSAGE=`/usr/bin/php /home/appdeploy/lai/test.work.php`
    /usr/bin/php /home/appdeploy/lai/test.work.php >> /home/appdeploy/lai/ready.txt
    #MESSAGE=`cat /home/appdeploy/lai/ready.txt`
    MESSAGE=`sed 's/$/\<br\/\>\<br\/\>/' /home/appdeploy/lai/ready.txt` ##每行末尾追加br\br\
    #sendemail -f "118@qq.com" -t "173@163.com" -s smtp.qq.com -u 'Test_mn_monitor' -o message-content-type=html -o message-charset=utf8 -xu"118@qq.com" -xp tjvnmvztprqejgib -m "$MESSAGE"
    #if [ "$N1" -gt 10 ] || [ "$N2" -gt 3 ] || [ "$N3" -gt 3 ] || [ "$N4" -gt 3 ]; then

    sendemail -f "173@163.com" -t "lai1210@163.com" -s smtp.163.com -u 'mn_monitor' -o message-content-type=html -o message-charset=utf8 -xu "173@163.com" -xp RWWRAEEMUHRPDGZV -m "$MESSAGE"
    #fi


    ### w 当前在线用户情况

    ### pidof java #列出java进程的pid
    kill -9 $(pidof java)

    ### killall #批量杀进程
    killall -u harry #杀死harry用户的所有进程
    killall -y 5h #杀死运行时间小于5小时的所有进程;-y younger
    killall -o 3h #杀死运行时间大于3小时的所有进程;-o older
    killall -I HELLO #忽略大小写杀死hello
    killall -i hello* #交互式杀批量进程

    ### pkill #ps和kill命令结合
    pkill java 根据进程名全部杀死java进程,类似于kill java


    ### pstree -p 树形显示进程信息;


    ### uptime 查询系统负载情况,启动时长;


    ### !638 再次执行history中序号后的命令;

    ### sosreport 收集本机诊断和配置信息;

    ### cat anaconda-ks.cfg | tr [a-z] [A-Z] 替换为大写
    ### tar -p 保留原始权限和属性

    ### echo "linuxprobe" | passwd --stdin root 管道符,一条命令重置密码;


    ### vim 末行模式,:set nu 开启行数  >set nonu

    ### Linux用户登录的时候执行sh脚本的顺序:
    /etc/profile.d/file
    /etc/profile
    /etc/bashrc
    /mingjie/.bashrc
    /mingjie/.bash_profile



    ### vim
    home 或 0 :到行首
    end 或$ :到行尾
    u 撤销
    ctrl r 取消撤销


    ### nfs文件共享服务端配置:
    877 2020-10-22 16:28:41 systemctl enable rpcbind
    878 2020-10-22 16:28:49 systemctl enable nfs-server
    879 2020-10-22 16:28:59 systemctl enable nfs-lock
    880 2020-10-22 16:29:14 systemctl enable nfs-idmap
    881 2020-10-22 16:29:39 systemctl start nfs-idmap
    882 2020-10-22 16:29:49 systemctl start nfs-lock
    883 2020-10-22 16:30:07 systemctl status nfs-lock
    884 2020-10-22 16:30:19 systemctl start nfs-server
    885 2020-10-22 16:30:27 systemctl status nfs-server
    886 2020-10-22 16:30:44 systemctl status nfs
    892 2020-10-22 16:37:57 mkdir /tmp/share
    893 2020-10-22 16:38:09 chmod -R 777 /tmp/share/
    897 2020-10-22 16:39:07 vim /etc/exports
    898 2020-10-22 16:40:19 exportfs -a
    990 2020-10-23 10:57:23 exportfs -r
    /tmp/share 10.206.230.*(rw,sync,no_root_squash)
    /tmp/share 10.206.230.213(rw,no_root_squash,async)
    /tmp/share 10.206.229.82(rw,no_root_squash,async)
    ~
    ### nfs文件共享客户端配置:
    938 2020-10-22 16:44:25 yum -y install nfs-utils  #mount报错
    1050 2020-10-23 11:04:32 mount -t nfs 10.206.230.214:/tmp/share /app/kts/fileserver/



    ### mount 绑定两个文件夹
    mount --bind /home/dir1/ /home/dir4/ 以第一个为主,绑定两个文件夹,内容一致


    ### ps -eo pid,lstart,etime,cmd |grep java
    显示:pid,启动时间,持续时间,启动命令;

    ### 新挂载nfs
    sudo mount -t nfs -o vers=4.0 10.200.192.137:/ /mnt/files/
    新版本nfs自动识别版本信息,所以直接 mount 10.200.192.137:/ /mnt/log/

    ### cp不覆盖:
    shell>awk 'BEGIN { cmd="cp -ri a1/* a2/"; print "n" |cmd; }'
    注:a1为原文件夹,a2为目标文件夹
    ### tar 排除
    tar -zcvf apachekafka_2.tar.gz --exclude=/app/test apache-kafka/ (不包含/app/test)

    tar -zcvf apachekafka_2.tar.gz --exclude=/app/test --exclude=tomcat/logs apache-kafka/

    ### apache maven:是一套软件工程管理和整合工具,基于工程对象模型pom概念,通过中央信息管理模块,maven能够管理项目的构建,报告和文档;

    ### 只复制home目录结构
    find local_dir -type d | sed 's/local_dir/mkdir -p target_dir/' | sh
    ###只复制home目录结构到/testlai目录下:
    find /home/ -type d -exec mkdir -p /testlai/\{\} \;


    ### 已安装软件查询
    rpm -qa |grep **
    dpkg -l
    yum list installed

    ### rpm重建rpm库 损坏
    rm -f __db.00*
    rpm -rebuilddb
    yum makecache


    ### 登录失败太多,单用户改账号锁定时间 -- 20200812
    10.206.228.84 登录错误次数过多,account locked due to 10 faild logins
    权限问题,只能重启进单用户,改文件,/etc/pam.d/password-auth和/etc/pam.d/system-auth ,锁定时间60s。
    重启后,正常登录root。再将文件的锁定时间改为600s。


    ### nice 命令 加 tar打包
    nice 命令用于设定进程的优先级,取值范围[-20,19],-20为最高,19为最低。
    ### 使用nice命令:
    [root@mysql-test data1]$ du -sh 5555
    34G 5555
    [root@mysql-test data1]$ nice -n 19 tar -czf 5555.tar.gz 5555
    1
    2

    ps aux | grep screen
    801 39717 0.0 0.0 118368 1128 pts/2 S+ Aug11 0:00 screen -S lai


    ### 20210106 selinux整理
    selinux 安全子系统(强制访问控制)
    selinux域和selinux 安全上下文,被称为是linux系统的双保险。
    selinux 服务三种配置模式:
    enforcing: 强制启用安全策略模式,将拦截服务不合法请求;
    permissive:遇到服务越权访问,只警告;
    disabled:对越权行为不警告也不拦截;

    ###查看所有的selinux设置:
    getsebool -a
    getsebool -a |grep http

    ###设置selinux:
    setsebool -P httpd_enable_homedirs=on
    -P 设置永久生效且立即生效;

    ###查看selinux 允许的服务端口列表:
    semanage port -l
    semanage port -l |grep http
    添加selinux允许的端口服务:
    semanage port -a -t http_port_t -p tcp 6111
    semanage port -a -t http_port_t -p tcp 6222


    ### 进程和线程:进程是程序执行时的一个实例;进程的目的就是担当分配系统资源cpu时间,内存等的基本单位;
    线程是进程的一个执行流,是cpu调度和分派的基本单位,是比进程更小的能独立运行的基本单位;一个进程由几个线程组成;
    线程与同属一个进程的其他线程共享所有进程所拥有的所有资源;
    进程:资源分配的最小单位;
    线程:程序执行的最小单位;
    一个进程的开销,大约是一个线程的30倍左右;

    ### icmp :网络控制报文协议,


    ###/bin/sh 和 /bin/bash
    /bin/sh 指向 /bin/bash,区别在于 sh相当于开启了POSIX模式的bash。POSIX模式是一个通用系统标准。

    ###释放系统的缓存:
    # echo 3 > /proc/sys/vm/drop_caches

    ###crontab 定时任务命令用绝对路径 如/usr/bin/find
    cron日志在 /var/log/cron 文件

    ###ftp (https://blog.csdn.net/qq_42427971/article/details/113868206)
    yum install -y vsftpd

    ###跟踪系统调用情况
    strace -p 14282
    Process 14282 attached
    futex(0x7f21615b99d0, FUTEX_WAIT, 14287, NULL


    ###删除log目录下30天前的log文件
    find /opt/soft/log/ -mtime +30 -name "*.log" -exec rm -rf {} \;


    #################################################################################################################################################################
    #################################################################################################################################################################
    《WINDOWS》

    chrome 浏览器插件安装
    1 在能访问谷歌商店的电脑用chrome下载需要的插件,管理拓展程序--找到插件的 ID ID:bgnkhhnnamicmpeenaelnjfhikgbkllg
    2 用everything 根据ID找到目录,打包目录。传到需要安装的电脑,解压。
    3 需要安装插件电脑chrome,拓展程序--开发者模式--加载已解压的拓展程序。选择文件夹。

    ### find
    netstat -ano |findstr /v 不匹配,类似 grep -v
    netstat -ano |find /C "UDP" 统计UDP的行数

    ### windows 合并txt文件
    type *.txt >>D:\merge.txt

    #################################################################################################################################################################
    #################################################################################################################################################################
    《WEB》《NGINX》


    ### 按天分割日志access.log

    server {
    listen 80;
    server_name localhost;
    if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})") {
    set $year $1;
    set $month $2;
    set $day $3;
    }

    #charset koi8-r;

    access_log logs/host.access-$year-$month-$day.log;

    ### Nginx 安装配置
    whereis nginx
    yum -y install gcc
    yum install -y pcre pcre-devel
    yum install -y zlib zlib-devel
    yum install -y openssl openssl-devel
    wget http://nginx.org/download/nginx-1.18.0.tar.gz
    ls
    tar -zxvf nginx-1.18.0.tar.gz -C /usr/local/
    cd /usr/local/nginx-1.18.0/
    ./configure --prefix=/usr/local/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/tem/nginx/client --http-proxy-temp-path=/var/tem/nginx/proxy --http-fastcgi-temp-path=/var/tem/nginx/fcgi --with-http_stub_status_module
    make && make install


    nginx path prefix: "/usr"
    nginx binary file: "/usr/sbin/nginx"
    nginx modules path: "/usr/modules"
    nginx configuration prefix: "/etc/nginx"
    nginx configuration file: "/etc/nginx/nginx.conf"
    nginx pid file: "/var/run/nginx/nginx.pid"
    nginx error log file: "/var/log/nginx/error.log"
    nginx http access log file: "/var/log/nginx/access.log"
    nginx http client request body temporary files: "/var/tem/nginx/client"
    nginx http proxy temporary files: "/var/tem/nginx/proxy"
    nginx http fastcgi temporary files: "/var/tem/nginx/fcgi"
    nginx http uwsgi temporary files: "uwsgi_temp"
    nginx http scgi temporary files: "scgi_temp"

    /usr/sbin
    ./nginx -s reload


    ### nginx rewrite 重定向
    api.trackmeeasy.com/wuhm/..;/actuator/conditions
    api.trackmeeasy.com/s02z/..;/actuator
    api.trackmeeasy.com/lrje/..;/actuator/threaddump
    api.trackmeeasy.com/kmwv/..;/actuator/env
    api.trackmeeasy.com/z2dr/..;/actuator/beans
    api.trackmeeasy.com/1w82/..;/actuator/mappings
    api.trackmeeasy.com/pyoe/..;/actuator/loggers

    #测试地址:https://c.runoob.com/front-end/854/
    # 通过rewrite 函数判断uri来重定向请求地址
    if ($request_uri api.trackmeeasy.com/[a-zA-Z0-9]{1,4}/[a-zA-Z0-9&%_;./-~-]*/actuator/[a-zA-Z0-9&%_;./-~-]* ){ # 正则匹配uri路径
    rewrite http://**/login/* redirect #设置重写地址
    }

    ### 基于端口号配置虚拟主机:
    vim /etc/httpd/conf/httpd.conf

    41 #Listen 12.34.56.78:80
    42 Listen 80
    43 Listen 6111
    44 Listen 6222
    ...
    ...
    ………………省略部分输出信息………………
    113 <VirtualHost 192.168.10.10:6111>
    114 DocumentRoot "/home/wwwroot/6111"
    115 ServerName www.linuxprobe.com
    116 <Directory "/home/wwwroot/6111">
    117 AllowOverride None
    118 Require all granted
    119 </Directory>
    120 </VirtualHost>
    121 <VirtualHost 192.168.10.10:6222>
    122 DocumentRoot "/home/wwwroot/6222"
    123 ServerName bbs.linuxprobe.com
    124 <Directory "/home/wwwroot/6222">
    125 AllowOverride None
    126 Require all granted
    127 </Directory>
    128 </VirtualHost>
    ………………省略部分输出信息………………

    #添加selinux允许的端口服务:

    #SELinux 安全上下文
    [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot
    [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6111
    [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6111/*
    [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6222
    [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6222/*
    [root@linuxprobe ~]# restorecon -Rv /home/wwwroot/
    restorecon -Rv /home/wwwroot/
    [root@linuxprobe ~]# systemctl restart httpd

    #### html 换行符:
    1<br/>2

    ### apache 添加密码认证访问web:
    htpasswd
    htpasswd -c /etc/httpd/passwd test01
    -c : 密码存放路径。test01 为用户名

    再:
    vim /etc/httpd/conf.d/userdir.conf
    32 AllowOverride all
    #刚刚生成出来的密码验证文件保存路径
    33 authuserfile "/etc/httpd/passwd"
    #当用户尝试访问个人用户网站时的提示信息
    34 authname "My privately website"
    35 authtype basic
    #用户进行账户密码登录时需要验证的用户名称
    36 require user test01
    37 </Directory>
    [root@linuxprobe ~]# systemctl restart httpd


    ### 一、Nginx安装,加上配置模块,路径等
    安装的时候需要注意加上 --with-http_ssl_module,因为http_ssl_module不属于Nginx的基本模块。
    Nginx安装方法:
    # ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
    # make && make install


    nginx 配置反向代理:

    server {
    ...
    ...
    ...
    location / {
    root html;
    index index.html index.htm;
    }

    location /lai {
    root html;
    #proxy_pass http://10.200.192.249:8080/examples/async/async0;
    proxy_pass http://webapi.******.com:8080/webapi/api/receiveNotify.action;
    index index.html index.htm;
    }

    ###单个链接的重定向:

    location /examples/async/async0 {
    root html;
    proxy_pass http://10.200.192.249:8080/examples/jsp/;
    }

    #################################################################################################################################################################
    #################################################################################################################################################################
    《日常》

    ### 挂载子路径 腾讯云
    目标路径为 /usr/share/nginx/html/env.js 子路径为文件名: env.js

    ### 腾讯云日志 单行 完全正则 日志采集
    \d+\-\d+\-\d+\s\d+\:\d+\:\d+\.\d+.*
    \d+\-\d+\-\d+\s\d+\:\d+\:\d+.*

    ### notepad++ 每一行的单号,替换加前后引号
    查找 \r\n
    替换为 ',\r\n'


    ### 腾讯云集群中service添加
    正常情况下创建pod同时配置sercice信息,
    如果手动创建,新建时注意下方 workload必选!


    ### 腾讯云集群中ingress添加https
    添加 https配置时,需提前新建secret。

    secret建立时,需要查看证书ID
    变量名为qcloud_cert_id ,变量值为证书id,参照生产配置yaml文件中,填入ZkEyZFhiQXI=
    最终yaml文件显示: qcloud_cert_id: ZkEyZFhiQXI=

    #################################################################################################################################################################
    #################################################################################################################################################################
    《KUBERNETES》
    k8s
    命名空间:管理资源使用,管理网络;

    Ingress:允许访问集群内规则的集合(七层);通过配置,可以实现不同url访问集群内不同的service;

    service:管理集群中四层网络的服务访问:tcp/udp;同时定义四种访问方式:公网;vpc内网;主机端口访问;仅集群;

    configmap:将配置和运行的景象进行解耦;更方便移植;

    secret:可用于存储密码,令牌,秘钥的敏感信息,降低直接对外暴露风险;key-value类型键值对;

    存储/PersistenVolume:存储业务数据重要信息,类型有:腾讯云硬盘、文件存储、对象存储;

    集群节点封锁:封锁节点后,将不支持新的pod调度到该节点;需要手动取消封锁的节点;

    驱逐:驱逐节点后,节点内pod自动驱逐到其他节点上,驱逐节点设置为封锁状态;
    (本地存储的pod被驱逐后数据将丢失,请谨慎操作)

    GlobalRoute网络模式:是TKE给予底层私有网络VPC的全局路由能力,实现了容器网络和vpc互访的路由策略,
    VPC-CNI模式:是TKE基于CNI和VPC弹性网卡实现的容器网络能力,适用于对延时有较高要求的场景。

    命名空间:是标识用户私人镜像的地址前缀;


    ### kubectl 重启
    kubectl delete pod {podname} -n {namespace}
    ### 每天定时重启运行最久的一个pod:
    /usr/bin/kubectl delete pod `kubectl get pod --sort-by=.metadata.creationTimestamp |grep oms-api |head -n 1 |awk -F' ' '{print $1}'` -n default
    ###设置在每个集群的node1 crontab中。

    ### 状态值 描述
    Pending API Server已经创建该Pod,但在Pod内还有一个或多个容器的镜像没有创建,包括正在下载镜像的过程。
    Runnung Pod内所有容器均已创建,且至少有一个容器处于运行状态、正在启动状态或正在重启状态。
    Succeeded Pod内所有容器均成功执行后退出,且不会再重启。
    Failed Pod内所有容器均已退出,但至少有一个容器退出为失败状态。
    Unknown 由于某种原因无法获取该Pod的状态,可能由于网络通信不畅导致。
    Evicted 由于节点资源不足被驱逐的pod。


    ### kubectl 复制文件复制到本地
    kubectl cp -n default kts-b2c-75789d89d4-7tcfh:/home/a.txt ./a
    or:
    kubectl cp kts-b2c-75789d89d4-7tcfh:/home/a.txt ./a

    ### 本地文件复制到pod
    kubectl cp FILENAME PODNAME:/tmp/FILENAME
    查看:kubectl exec PODNAME ls /tmp/

    ### 宿主机执行pod里面命令:
    kubectl exec keycloak0216-769cf8f4db-bw488 -it -- ls -l /tmp
    kubectl exec -it PODID -- ls -l /tmp/


    k8s 的pod日志 导出下载:
    kubectl logs kts-b2c-b5887d846-k2w8t -n default > b2c-2.log

    kubernetes pod 日志路径:先找到pod在哪台服务器,进服务器找
    ll /var/log/containers/ 查看在本服务器的pod 的日志,软链接到下面的地址
    ll /var/log/pods/default_oms-android-backend-688dbcb8c8-hvjkh_c0044ee2-f24c-4084-86b3-f7019260719c/oms-android-backend/0.log

    ### 删除pod状态为 Evicted 或强制删除 Terminating状态pod
    kubectl get pods | grep Evicted | awk '{print $1}' | xargs kubectl delete pod
    kubectl delete pods <pod> --grace-period=0 --force 强制删除pod


    ### 编辑coredns的configmap
    kubectl edit cm -n kube-system coredns
    .:53 {
    errors
    health
    ready
    kubernetes cluster.local. in-addr.arpa ip6.arpa {
    pods insecure
    fallthrough in-addr.arpa ip6.arpa
    }
    hosts {
    192.168.1.122 sample1.xx.com
    192.168.1.123 sample2.xx.com
    10.116.45.56 esg-isp-api-gw.int.sfdc.com.cn
    fallthrough
    }
    prometheus :9153
    forward . /etc/resolv.conf
    cache 30
    loop
    reload
    loadbalance


    ### 基础操作:
    ## get (若不显式指出命名空间,默认为default)

    #列出所有命名空间的pod,并显示分布在哪台节点
    kubectl get po --all-namespaces -o wide

    #列出所有命名空间的pod
    kubectl get po --all-namespaces

    #列出kube-system 空间的pod
    kubectl get po --namespace=kube-system

    #列出所有命名空间
    kubectl get namespace

    #列出所有pod 的yaml 文件
    kubectl get pod -o yaml
    kubectl get pod oms-frontend-6588b4d8f-5jpqv -o yaml
    kubectl get pod oms-frontend-6588b4d8f-5jpqv -o json
    kubectl get pod oms-frontend-6588b4d8f-5jpqv -o wide

    ### 查看挂载的configmap文件
    首先列出configmap : kubectl get cm

    kubectl describe cm uat-tms-config-application 默认命名空间default
    kubectl describe cm -n kube-system coredns 指定命名空间

    ### 编辑挂载的configmap
    kubectl edit cm uat-tms-config-application
    kubectl edit cm -n kube-system coredns

    ### 删除configmap
    kubectl delete cm uat-tms-config-application

    ### 创建configmap
    kubectl create cm config1 --from-file /us_zipcode_map/config.yaml

    ### 从文件创建configmap,并后续更新了文件,需要同步更新configmap:
    kubectl create --save-config cm config1 --from-file ./config1.yaml -o yaml --dry-run | kubectl apply -f -

    #################################################################################################################################################################
    #################################################################################################################################################################
    《MYSQL》

    ### mysql参数之innodb_buffer_pool_size大小设置 内存太高是因为:

    用于缓存索引和数据的内存大小,在硬件条件满足时,越多越好。因为内存的读写要远快于硬盘的读写。当数据提交或满足检查点条件后才一次性将数据刷到磁盘中。
    内存还有操作系统和其他进程使用,所以根据经验,推荐设置innodb_buffer_pool_size为服务器总可用内存的75%。

    Innodb_buffer_pool_pages_data
    Innodb buffer pool缓存池中包含数据的页的数目,包括脏页。单位是page。
    eg、show global status like 'Innodb_buffer_pool_pages_data';

    Innodb_buffer_pool_pages_total
    innodb buffer pool的页总数目。单位是page。
    eg:show global status like 'Innodb_buffer_pool_pages_total';

    show global status like 'Innodb_page_size';
    查看@@innodb_buffer_pool_size大小,单位字节
    SELECT @@innodb_buffer_pool_size/1024/1024/1024; #字节转为G

    在线调整InnoDB缓冲池大小,如果不设置,默认为128M
    set global innodb_buffer_pool_size = 4227858432; ##单位字节

    计算Innodb_buffer_pool_pages_data/Innodb_buffer_pool_pages_total*100%
    当结果 > 95% 则增加 innodb_buffer_pool_size, 建议使用物理内存的 75%
    当结果 < 95% 则减少 innodb_buffer_pool_size,
    建议设置大小为: Innodb_buffer_pool_pages_data * Innodb_page_size * 1.05 / (1024*1024*1024)

    #################ruserverDB:

    show variables like '%innodb_buffer_pool_size%';#457179136000
    SELECT @@innodb_buffer_pool_size/1024/1024/1024; #字节转为G#425G
    show global status like 'Innodb_buffer_pool_pages_data';#27202538
    show global status like 'Innodb_buffer_pool_pages_total';#27904000
    show global status like 'Innodb_page_size';#16384

    ### 删表 用法总结
    希望删除表结构时,用 drop;

    希望保留表结构,但要删除所有记录时, 用 truncate;

    希望保留表结构,但要删除部分记录时, 用 delete。

    ### 隔离级别
    select @@global.tx_isolation;

    ps:大家还记得,自增主键和uuid作为主键的区别么?由于主键使用了聚簇索引,如果主键是自增id,,那么对应的数据一定也是相邻地存放在磁盘上的,写入性能比较高。如果是uuid的形式,频繁的插入会使innodb频繁地移动磁盘块,写入性能就比较低了。

    错误二:所有文章都不提隔离级别!
    注意我上面说的,之所以能够锁表,是通过行锁+间隙锁来实现的。那么,RU和RC都不存在间隙锁,这种说法在RU和RC中还能成立么?
    因此,该说法只在RR和Serializable中是成立的。如果隔离级别为RU和RC,无论条件列上是否有索引,都不会锁表,只锁行!

    record lock+gap lock
    record lock 行记录锁;
    gap lock 间隙锁, 在拿到某一行的锁,为了前后的id保持一致,会锁住该行的前一行和后一行

    ### mysql 报错 too many connections
    mysql> set GLOBAL max_connections=1000;

    ### mysql 5.6 改默认字符集
    [mysqld]
    character-set-server=utf8

    ### 按天排序
    SELECT
    express_type,
    count(express_type),
    sum(real_total_weight),
    STR_TO_DATE(create_time,'%Y-%m-%d')
    FROM
    bsp_order
    WHERE
    order_source = 10
    AND real_total_weight > 0
    AND create_time >= '2019-01-01'
    AND create_time <= '2021-10-11 23:59:59'
    GROUP BY
    express_type,STR_TO_DATE(create_time,'%Y-%m-%d');



    ### binlog格式:

    RBR 基于行的复制
    SBR 基于语句的复制

    ### onlineDDL
    alter table agent_direction_postcode add column test_txt varchar(20) null default 'KG' comment '测试字段' ,algorithm=inplace, lock=none;


    ### gh-ost 不锁表更新表结构
    脚本在tps05
    cd /usr/local
    ./gh-ost \
    --host=10.200.192.3 \
    --port=3306 \
    --user='sf80005173' \
    --password='Ljx...111' \
    --allow-on-master \
    --database='ruserver' \
    --table='bsp_order_lai' \
    --alter="MODIFY column tracking_no varchar(22) not NULL " \
    --assume-rbr \
    --aliyun-rds \
    --initially-drop-ghost-table \
    --initially-drop-old-table \
    --serve-socket-file=/tmp/test.bsp_order1.sock \
    --execute
    ====================================================以上ok.

    #### mysql 查看binlog
    [root@1a01vlb6826zzzz sql]# mysqlbinlog -vv --start-datetime="2021-05-24 12:00:00" --stop-datetime="2021-05-24 12:03:00" binlog.file -r test4.sql


    ### mysql忽略主键冲突,避免重复插入数据的三种方式
    一:
    INSERT IGNORE INTO #插入时检索主键列表,如存在相同主键记录,不更改原纪录,只插入新的记录。
    二:
    REPLACE INTO #插入时如发现主键已存在,则替换原记录,即先删除原记录,后insert新记录。
    三:
    on duplicate key update #插入时如果发现主键已存在,则执行UPDATE更新操作

    ### select * from order_send where data_type=16 and tracking_no in (select tracking_no from bsp_order where agent_mailno in ());
    --根据代理单号查,重推数据 (对接人马青青)


    mysql
    原分页SQL:

    # 第一页
    SELECT * FROM `year_score` where `year` = 2017 ORDER BY id limit 0, 20;

    # 第N页
    SELECT * FROM `year_score` where `year` = 2017 ORDER BY id limit (N - 1) * 20, 20;
    通过上下文关系,改写为:

    # XXXX 代表已知的数据
    SELECT * FROM `year_score` where `year` = 2017 and id > XXXX ORDER BY id limit 20;
    LIMIT会在满足条件下停止查询,因此该方案的扫描总量会急剧减少,效率提升Max!

    如果非要深度随机跳页
    如果你没有杠过产品经理,又该怎么办呢,没关系,还有一丝丝的机会。

    MySQL深度分页的处理技巧,代码如下:

    # 反例(耗时129.570s)
    select * from task_result LIMIT 20000000, 10;

    # 正例(耗时5.114s)
    SELECT a.* FROM task_result a, (select id from task_result LIMIT 20000000, 10) b where a.id = b.id;

    # 说明
    # task_result表为生产环境的一个表,总数据量为3400万,id为主键,偏移量达到2000万
    该方案的核心逻辑即基于聚簇索引,在不通过回表的情况下,快速拿到指定偏移量数据的主键ID,然后利用聚簇索引进行回表查询,此时总量仅为10条,效率很高。

    因此我们在处理MySQL,ES,MongoDB时,也可以采用一样的办法:

    限制获取的字段,只通过筛选条件,深度分页获取主键ID
    通过主键ID定向查询需要的数据

    ### 查看mysql 连接ip信息:
    SELECT substring_index(host, ':',1) AS host_name,state,count(*) FROM information_schema.processlist GROUP BY state,host_name;


    ### mysql 增加索引
    alter table `order_match` add index idx_order_match (tracking_no);

    ##CREATE INDEX idx_subCarrierNo USING BTREE ON tms_bsp_order (sub_carrier_no);
    create index idx_id_1 on order_match(id);
    ######idx_order_match为索引名;tracking_no 为列名;
    索引添加规则:

    动作描述 使用聚集索引 使用非聚集索引
    列经常被分组排序
    返回某范围内的数据 不应
    一个或极少不同值 不应 不应
    小数目的不同值 不应
    大数目的不同值 不应
    频繁更新的列 不应
    外键列
    主键列 
    频繁修改索引列 不应



    ### 增删改查
    insert into test(name,age,weight) values('laizhengxiu',28,23);
    delete from test where id =10;
    update mydb.test set name='shenmewanyier' where id=11;
    select id,name,weight from test ;

    ### 表加字段:
    alter table <tablename> add <新字段名><数据类型>[约束条件];

    ### 新建用户 新建查询用户
    use mysql;
    CREATE USER 'tms_select'@'%' IDENTIFIED BY 'hmzj@tms_select';
    GRANT select ON tms.* TO 'tms_select'@'%';
    flush privileges;

    ###只给单个表权限:

    GRANT select ON tms.table1  TO 'tms_table1'@'%';

    ###改密码

    set password for 用户名@localhost = password('新密码');

    update
    UPDATE table_name SET field1=new-value1, field2=new-value2
    [WHERE Clause]
    mysql> UPDATE runoob_tbl SET runoob_title='学习 C++' WHERE runoob_id=3;

    ### 查询数据库所有表的大小:
    SELECT
    TABLE_NAME,
    DATA_LENGTH + INDEX_LENGTH,
    TABLE_ROWS,
    concat(round((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024,2),'MB') AS DATA
    FROM
    information_schema.TABLES
    WHERE
    TABLE_SCHEMA = 'ruserver' -- 数据库名
    ORDER BY
    DATA + 0 DESC;

    查慢sql 和锁表
    show processlist; 显示那些线程正在运行;
    select * from information_schema.PROCESSLIST where info is not null;
    show open tables where In_use > 0;
    show status like 'Table%';
    show variables like '%quer%';

    SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;


    ### SQL调优
    1 选择合适的存储引擎;
    1. 经常用来读的表使用myisam存储引擎;
    2. 其余的表都用innodb存储引擎;

    2 SQL语句调优(尽量避免全表扫描)
    1. 在select,where order by 常涉及到的字段上建立索引
    2. where子句中不使用 !=,否则将放弃使用索引进行全表扫描;
    3. 尽量避免用null值判断,否则会全表扫描
    示例:
    select id from t1 where number is null;
    优化:
    在number 字段设置默认值 0

    4. 尽量避免or 来连接条件,导致全表扫描
    示例:优化前:
    select id from t1 where id=10 or id =20;
    优化后:
    select id from t1 where id=10
    union all
    select id from t1 where id=20;

    5. 模糊查询尽量避免使用前置%,导致全表扫描
    select id from t1 where name like "anol%";

    6. 尽量避免in 和not in,导致全表扫描;
    select id from t1 where id in(1,2,3);
    select id from t1 where id between 1 and 3;

    7. 尽量避免使用select * ,要用具体的字段列表替代* ,不要返回用不到的任何字段;
    8,使用存储过程,因为存储过程通常以编译过的形式存储,所以DBMS 处理命令少提高了性能。


    ### 查看存储过程 所有内容在: information_schema 数据库中的 Routines 表
    select specific_name,routine_name,routine_schema,routine_definition from information_schema.Routines where routine_schema ='ruserver' and routine_type ='procedure'

    --show create procedure proc_name;

    --show create function `setval`;
    CREATE DEFINER=`root`@`localhost` FUNCTION `setval`(seq_name VARCHAR(50), value INTEGER) RETURNS int(11)
    BEGIN
    UPDATE sequence
    SET current_value = value
    WHERE name = seq_name;
    RETURN currval(seq_name);
    END

    ### 左闭合区间

    [first,last),就是包含first,但是不包含last的区间范围


    ### 数据库更改
    update user set password=password("****")where user='root';
    flush privileges;
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY '****' WITH GRANT OPTION;
    flush privileges;
    数据库工具 https://www.heidisql.com/

    ### 删除索引
    ALTER TABLE sf_route_20201106 DROP INDEX proxy_waybill_no;
    DROP INDEX proxy_waybill_no ON sf_route_20201106;

    ### MySQL 5.7 & 8.0
    物理文件更改;frm,TRG,TRN,par 去掉
    新特性:通用表达式;窗口函数;不可见索引;正则表达式;
    完全支持unicode;
    认证方式:caching_sha2_password 取代之前mysql_native_password

    结论:8.0在处理读负载,且在读写混合的情形下性能超过5.7,;

    ###20210218
    mysql死锁:
    1 用户1 访问表1(锁住表1),然后又访问表2;用户2访问表2(锁住表2),又试图访问表1,
    这时用户1由于用于2锁住了表2,需要等待用户2释放表2的锁才能继续,同样用户2也需要等用户1释放表1锁才能继续,死锁产生;
    解决方法
    :由于程序bug,需要修改逻辑;
    :对于多表操作,尽量按照一个顺序进行;

    2 用户1 查询一条记录,然后修改这条记录;这时用户2修改该条记录;
    用户1 的事务里锁的性质由查询的共享锁,企图升级到独占锁;
    而用户2事务里的独占锁必须等待用户1的共享锁释放,
    1由于2的独占锁无法上升到独占锁所以也就无法释放共享锁,死锁产生;
    解决方法
    1 使用乐观锁进行控制;操作时,对数据加version。进行对比,如果较新则更新,老则丢弃;
    2 使用悲观锁进行控制;整个操作:读取,修改,提交,甚至中间的休息时间,都对数据加锁;慎重!
    3 sqlServer可支持更新锁;
    介于共享锁和独占锁之间。更新锁与共享锁兼容,但是当有多个事务想要更新时,只能有一个获得更新锁,其他需要等待,但是仍然可以查询,避免了死锁。

    3 索引不当导致全表扫描;

    4 事务封锁范围大且相互等待;

    ### event
    时间触发器,类似linux的cron计划任务,用于定时或循环执行某动作,或调用存储过程,
    triggers 事件触发器,
    ### 查看是否开启event
    show variables like 'event_schedule%'

    SET GLOBAL event_scheduler = 1; #on/1:打开 off/0:关闭
    ###注意如果有主从库,把主库的event开关打开
    ### 查询所有库中的event
    select * from mysql.event;


    ### 直观的查看所有库的所有event (建议使用)
    select * from information_schema.events;

    ###查询当前表的event
    show events;

    ###查看event创建语句
    show create event test.event_lai_1;

    ### event开始或停止
    alter event test.event_lai_1 disable; #enable

    ### 创建event
    CREATE EVENT [IF NOT EXISTS] event_name
    ON SCHEDULE schedule
    [ON COMPLETION [NOT] PRESERVE]
    [ENABLE | DISABLE | DISABLE ON SLAVE] --
    [COMMENT 'comment']
    DO event_body;

    #ON SCHEDULE
    1、AT 时间戳,用来完成单次的计划任务
    at CURRENT_TIMESTAMP + 30 minute -- 在现在的30分钟后执行一次
    at '2021-12-04 00:11:01' -- 在'2021-12-04 00:11:01' 执行一次;
    2、EVERY 时间(单位)的数量时间单位[STARTS 时间戳] [ENDS时间戳],用来完成重复的计划任务
    on schedule every 2 second
    on schedule every 3 day starts '2021-11-01 00:00:00' ends '2021-12-01 00:00:00' -- 开始和结束时间

    #on completion preserver -- 执行完了不会删除该event
    #ON COMPLETION NOT PRESERVE -- 执行完了就删除event




    ###例:
    create event del_xxljob_log
    on schedule every 2 minute
    ON COMPLETION PRESERVE
    enable
    COMMENT '清理xxljob的调度日志'
    do delete from xxl_job_qrtz_trigger_log where id < 70300057 limit 100000;


    ###set autocommit = 0 ;取消自动提交,需要手动commit 或 rollback

    ###手动开启一个事务:
    begin;
    update test01 set title = '02020202020202' where id = 11;
    commit;
    #rollback;

    ###查询正在执行的事务
    SELECT * FROM information_schema.INNODB_TRX

    根据这个事务的线程ID(trx_mysql_thread_id),杀进程
    trx_mysql_thread_id
    29776820
    kill 29776820

    查看正在锁的事务
    SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

    查看等待锁的事务
    SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

    ###查看进程:
    select * from information_schema.`PROCESSLIST` where HOST like '10.200.238.26%'
    或者 show processlist

    ###重命名
    rename TABLE table1 TO table_new;

    ###聚合函数:
    avg() 返回指定列中的平均值
    count() 返回指定列中的非null值的个数
    min() 返回指定列中的最小值
    max() 返回指定列中的最大值
    sum() 返回指定列的所有值之和
    ###区别在于,count(*) 不会忽略null的值的行
    count(*)包括了所有的列的行数,在统计结果的时候,不会忽略值为NULL
    count(列名)只包括列名那一列的行数,在统计结果的时候,会忽略列值为NULL的行

    14、HAVING:用来过滤由GROUP BY 语句返回的记录表,通常与GROUP BY语句联合使用
    HAVING语句的存在弥补了WHERE关键字不能与聚合函数联合使用的不足。如果被SELECT的只有函数栏,那就不需要GROUP BY子句。

    ### INT 时间戳 (现在距离1970-01-01 00:00:00 的秒数)
    select UNIX_TIMESTAMP('20210608')
    1623081600

    select FROM_UNIXTIME(1623960509)
    2021-06-18 04:08:29


    ######20210303
    执行前请确保agent_direction和agent_direction_post两张表已经做备份
    备份命令:
    create table agent_direction_20210129 like agent_direction;
    insert into agent_direction_20210129 select * from agent_direction;
    create table agent_direction_postcode_20210129 like agent_direction_postcode;
    insert into agent_direction_postcode_20210129 select * from agent_direction_postcode;
    是否已完成备份(Y/N):

    ###mysql中运行系统命令:
    mysql> system ls -l /var/lib/mysql/sbtest/sbtest1.*

    ###表空间整理
    alter table sbtest1 force;

    ###下面我们通过Analyze Table语句来修复索引:
    ANALYZE TABLE TABLE;
    SHOW INDEX FROM TABLE;

    使用ANALYZE TABLE分析表的过程中,数据库系统会对表加一个只读锁。在分析期间,只能读取表中的记录,不能更新和插入记录。


    ###Check Table(检查表)
    CHECK TABLE 表名1 [,表名2…] [option] ;
    其中,option参数有5个参数,分别是QUICK、FAST、CHANGED、MEDIUM和EXTENDED。这5个参数的执行效率依次降低。CHECK TABLE语句在执行过程中也会给表加上只读锁。

    ###option有一下几个选项:
    UPGRADE:用来测试在更早版本的MySQL中建立的表是否与当前版本兼容。
    QUICK:速度最快的选项,在检查各列的数据时,不会检查链接(link)的正确与否,如果没有遇到什么问题,可以使用这个选项。
    FAST:只检查表是否正常关闭,如果在系统掉电之后没有遇到严重问题,可以使用这个选项。
    CHANGED:只检查上次检查时间之后更新的数据。
    MEDIUM:默认的选项,会检查索引文件和数据文件之间的链接正确性。
    EXTENDED:最慢的选项,会进行全面的检查。

    ###option 选择只对MyISAM类型表有效,对InnoDB类型表无效。

    ###Optimize Table(优化表)(optimize table只对MyISAM,BDB,InnoDB类型表起作用。)

    OPTIMIZE TABLE也可以使用local来取消写入binlog。

    ##当是InnoDB引擎时,会报“Table does not support optimize, doing recreate + analyze instead”,
    一般情况下,由myisam转成innodb,用alter table table.name engine='innodb'进行转换,优化也可以用这个。
    所以,当引擎是InnoDB时,可以用alter table tablename engine='innodb' 来替代 optimize做优化;

    ###查看效果
    show table status like 'tablename'
    字段 data_free 就是空数据占用存储空间;


    #################################################################################################################################################################
    #################################################################################################################################################################
    《DOCKER》


    启动mysql容器,在var/lib/docker/containers/下查看容器
    mkdir /opt/mysql-lai && cd /opt/mysql-lai
    echo $PWD
    docker run --name mysqlserver -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d -i -p 3302:3306 mysql:5.7
    指定镜像mysql:5.7,启动容器,并将容器内的/etc/mysql/conf.d,/logs,/var/lib/mysql 挂载到服务器的$PWD目录下,端口用本地3302映射容器3306,密码123456


    docker 服务器:10.200.192.166 用于上传镜像到香港的镜像仓库 root 2Yopw.....
    镜像文件复制到本地。可以先pull,然后 #docker save -o gis.out.jar (镜像id)
    但是导出的文件解压后无法正常查看文件;
    可以在集群的pod中查看具体哪个文件内容。


    docker 镜像:
    docker镜像内部是一个精简的操作系统,同时还包含应用运行必须的文件和依赖包;


    ### docker 安装
    sudo yum install -y yum-utils device-mapper-persistent-data lvm2
    sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    sudo yum makecache
    yum install -y docker-ce
    systemctl start docker
    systemctl enable docker
    以上为安装docker

    开机启动
    systemctl enable docker.service
    查看其它开机启动项目:
    systemctl list-unit-files
    docker 容器设置自动重启:
    启动是加:--restart=always
    docker run -p 30080:80 -d --restart=always nginx

    如果是已启动的: docker update --restart=always isaler_v0.0.11

    docker 服务器:10.200.192.166 用于上传镜像到香港的镜像仓库 root 2Yopw.....
    镜像文件复制到本地。可以先pull,然后 #docker save -o gis.out.jar (镜像id)
    但是导出的文件解压后无法正常查看文件;
    可以在集群的pod中查看具体哪个文件内容。


    docker 镜像:
    docker镜像内部是一个精简的操作系统,同时还包含应用运行必须的文件和依赖包;
    #启动nginx,并将docker端口映射到本地30080端口,且自动重启;
    docker run -p 30080:80 -d --restart=always nginx

    #镜像打标签:
    docker tag nginx:latest my-nginx

    #删除image前,需要停止所有的基于该镜像创建的容器,即使容器已经停止;
    docker ps -a
    docker kill /stop (containID)
    docker rm (containID)
    docker image rm (imageID)

    docker 镜像仓库加速(国内镜像)
    #先创建 daemon.json 文件:
    touch /etc/docker/daemon.json
    ls /etc/docker/daemon.json

    tee /etc/docker/daemon.json <<-'EOF'
    {
    "registry-mirrors": [
    "https://1nj0zren.mirror.aliyuncs.com",
    "https://docker.mirrors.ustc.edu.cn",
    "http://f1361db2.m.daocloud.io",
    "https://registry.docker-cn.com"
    ]
    }
    EOF

    systemctl daemon-reload
    cat /etc/docker/daemon.json
    systemctl restart docker
    docker info

    time docker pull node:latest

    ### 上海tps05 搭docker,拉新sub镜像用
    yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine
    yum install -y yum-utils device-mapper-persistent-data lvm2
    yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    yum install docker-ce -y
    systemctl status docker
    systemctl start docker
    docker login --username=76675042 ccr.ccs.tencentyun.com
    docker pull ccr.ccs.tencentyun.com/ibu-gpsp-core/ibu-gpsp-core-sub:11.9.177
    docker images

    #################################################################################################################################################################
    #################################################################################################################################################################
    《KAFKA》

    ### kafka
    分布式流媒体平台,用于构建数据管道和流应用程序

    通用于构建可在系统或应用程序之间可靠获取数据的实时流数据管道
    构建转换或响应数据流的实时流应用程序

    消息队列就是传输和存储消息的通道;
    1 解耦
    2 拓展
    3 灵活
    4 可恢复
    5 缓冲
    6 顺序保证
    7 异步通信

    kafka记录流的核心抽象是topic--主题,一个主题一般对应多个用户,

    ### kafka整理
    查看kafka topic列表,使用--list参数
    bin/kafka-topics.sh --zookeeper 127.0.0.1:2181 --list
    __consumer_offsets
    lx_test_topic
    test
    创建topic
    bin/kafka-topics.sh --create --zookeeper 192.168.0.2:2181/kafka100 --topic topic-test1 --replication-factor 2 --partitions 4

    ### zookeeper 分布式系统协调
    它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户

    ### zookeeper
    zookeeper提供了什么:
    文件系统:zookeeper维护一个类似文件系统的数据结构;
    通知机制:客户端注册监听目录节点,当发生数据改变时,通知客户端;
    zookeeper能为我们做什么:
    命名服务:在文件系统中创建一个path,唯一,通过path能相互探索发现
    配置管理:配置存放,发生改变进行获取新配置文件到新系统;
    集群管理:节点机器增删及master选取;
    分布式锁:基于zookeeper一致性文件系统,实现锁服务。
    锁服务分为保存独占,和时序控制两类,
    保存独占:将zookeeper的znode看做一把锁,通过createznode方式实现,创建成功的用户拥有了这把锁。删除时释放锁;
    时序控制:基于/distribute_lock锁,所有人创建顺序,编号目录节点,编号最小的获得锁,用完删除;
    队列管理:分 同步队列,FIFO队列(入队与出队),同步队列:当一个队列的成员聚齐时,这个队列才可用;否则一直等待所有的成员到齐;
    FIFO队列:和分布式锁服务中的控制时序场景基本原理一致:入队有编号,出队按编号;
    分布式与数据复制:zookeeper作为一个集群提供一致的数据服务,必然在所有机器间做数据复制,数据复制好处:1:容错,一个节点出错,不至于让整个系统停止工作;别的节点可以接管它的工作;2:提高系统的拓展能力:把负载分布到多个节点上,或者增加节点来提高系统的负载能力;3:性能提升:让客户端本地访问就近节点提高用户访问速度;

    zookeeper:设计:三类:领导者,跟随者,观察者;
    设计目的: 一致性
    可靠性
    实时性
    等待无关
    原子性



    ### 消息队列:
    功能:
    应用耦合:多应用通过消息队列对同一个消息,避免调用接口失败导致整个过程失败;
    异步处理:多应用消息队列中同一消息进行处理,应用间并发处理消息;减少处理时间;
    限流削峰:广泛应用于秒杀或抢购中;避免流量过大导致应用挂掉情况;
    消息驱动的系统:系统分为消息队列,消息生产者,消息消费者,生产者负责生产消息,消费者对消息进行处理;
    两种模式:点对点模式和发布订阅模式;
    常用消息队列:
    RabbitMQ
    ActiveMQ
    RocketMQ
    Kafka


    ### kafka 安装使用:
    前提步骤:先安装jdk,略。
    wget https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/2.4.0/kafka_2.12-2.4.0.tgz
    tar -zvxf kafka_2.12-2.4.0.tgz -C /opt/
    ln -s /opt/kafka_2.12-2.4.0 /opt/kafka
    sudo ./zookeeper-server-start.sh ../config/zookeeper.properties #启动zookeeper
    sudo ./kafka-server-start.sh ../config/server.properties #启动kafka server

    ###创建kafka topic
    bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic testTopic
    220 20210407-195739: bin/kafka-topics.sh --zookeeper localhost:5181 --create --topic sispIbseWaybillInfoTopic --partitions 2 --replication-factor 1
    222 20210407-195739: bin/kafka-topics.sh --zookeeper localhost:5181 --create --topic sispPushIbseWaybillIncomeInfoTopic --partitions 2 --replication-factor 1
    bin/kafka-topics.sh --list --zookeeper localhost:2181 #查看多少个topic
    bin/kafka-console-producer.sh --broker-list localhost:9092 --topic testTopic #生产者生产消息
    bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic testTopic --from-beginning #消费者接收消息

    #################################################################################################################################################################
    #################################################################################################################################################################
    《REDIS》

    ### redis整理
    redis key 类型:
    none 无该key
    string 字符串
    list 列表
    set 集合
    zset 有序集合
    hash 哈希

    set weather "sunny"
    ok
    type weather
    string
    getrange key start end
    getrange key5 0 -1 #0 -1 表示所有
    "abc123"
    getrange key5 0 2
    "abc"

    LPUSH book_list "programming in scala"
    1
    TYPE book_list
    list

    SADD pat "dog"
    1
    type pat
    set

    ###查找redis的key内容:
    lrange SYN_AGENT_ORDER_FAILURE 0 1000
    key SYN_AGENT_ORDER_FAILURE 的前1001个结果;

    redis: 开源的使用ansic语言编写的,支持网络,可基于内存
    亦可持久化的日志型,key-value 数据库,并提供多种语言
    的api。

    ###获取配置
    config get loglevel

    config get *

    ###设置配置
    config set config_name config_value

    config set loglevel "notice"

    config get loglevel

    ###备份:
    save
    后台备份:
    bgsave

    恢复:
    将dump.rdb文件移动到redis安装目录并启动服务:
    获取redis配置目录:
    config get dir

    ###查看是否设置了密码验证:
    config get requirepass
    "requirepass"
    ""
    参数空的,说明无需密码;

    修改该参数:
    config set requirepass "yourpassword"
    ok
    config get requirepass
    requirepass
    yourpassword

    性能测试:
    redis-benchmark [option] [option value]
    redis-benchmark -n 10000
    实例:
    redis-benchmark -h 127.0.0.1 -p 6379 -t set,lpush -n 100000 -q

    ###最大连接数:
    config get maxclients
    连接数设置为十万
    redis-server --maxclients 100000


    《教育的本质,是人点亮人》

    客户端,连接redis:
    redis-cli -h 127.0.0.1 -p 6379 -a "mypassword"

    redis 命令行连接:
    D:\liyuanyi\Redis-x64-3.0.504\Redis-x64-3.0.504>
    ./redis-cli -h 10.205.8.4 -p 6379 -a crs-jiafkqzi:SrclwZdsB2 hgetall all_config:us_zipcode_map

    ###################################################### redis选择另外的db
    [ crs-jiafkqzi | DB0 ] # select 3
    OK
    [ crs-jiafkqzi | DB3 ] #



    ####搜索引擎
    site:zhihu.com 死锁
    搜索zhihu.com内关于主宰的内容
    shell 脚本 Terminated -mysql
    搜索结果中排查mysql




    #################################################################################################################################################################
    #################################################################################################################################################################
    《MONGODB》

    ### 将查询结果扩大到1000 (Type "it" for more)
    cmgo-a7koahnl_0:PRIMARY> DBQuery.shellBatchSize = 1000
    1000
    cmgo-a7koahnl_0:PRIMARY>


    分布式文件存储的数据库。介于非关系数据库和关系数据库之间。是非关系数据库中最像关系数据库的。

    付费版区别: 部署的全面支持,磁盘加密和审计;

    mongodb提出文档,集合的概念,使用bson(类json)的数据模型结构,面向对象,高读写,高IO。

    索引 BTREE

    多个副本集,多台机器,冗余,故障自动转移。


    ####
    超大数据库如何实现深度跳页? 从第一页到最后一页
    mysql分页原理: SELECT * FROM test ORDER BY id DESC LIMIT 10000, 20;
    当limit前一个数特别大,需要扫描前面所有数,就为了后面的20个数据,浪费太多资源;

    mongodb分页原理:db.t_data.find().limit(5).skip(5);

    对策:
    1 对排序字段,筛选条件务必设置好索引;
    2 利用小范围页码的已知数据,或者滚动加载的已知数据,减少偏移量;
    3 可以获取多余的数据,进行一定的截取,性能影响并不大
    1 尽可能的增加默认的筛选条件
    2 修改跳页的展现方式,改为滚动显示,或小范围跳页(只允许从1调到10)

    #################################################################################################################################################################
    #################################################################################################################################################################
    《C++》

    ### 编译文件(将源码编译为对象文件并执行链接)
    g++ 1216.cpp #生成可执行文件 a.out
    g++ 1216.cpp -o 1216.out #指定输出文件名 1216.out //或者gcc -o helloworld helloworld.cpp 顺序可反
    g++ -c 1216.cpp #编译源代码但是不要执行链接,输出为同名的对象文件1216.o,或者用-o myfile.o 指定对象文件的名字;
    g++ 1216.o -o 1216.2.out #将对象文件链接成 可执行程序;

    gcc -E 1216.1.cpp -o 1216.1-3.ii #只进行预处理,会将头文件加进来 #include <iostream>
    g++ -E 1216.1.cpp -o 1216.1-4.ii #只进行预处理

    g++ -S 1216.1.cpp -o 1216.1.s #生成汇编语言代码 1216.1.s
    g++ 1216.1.cpp -o 1216.5.out -g #编译时 ,调试模式;


    ###
    TCP/IP协议
    应用层:telnet、ftp、smtp等;
    传输层:tcp、udp。 功能:数据传输,数据共享;
    网络层:icmp、IP、igmp;功能:网络传输,路由选择;连接建立,IP寻址;
    网络接口层:arp(根据ip获取mac)、rarp; 功能:链路管理,错误检测;


     
  • 相关阅读:
    基础1-安装zookeeper
    Logstash-input-file 配置
    Logstash-input-rabbitmq 配置
    EF 部分更新 忽略NULL
    CoreApi 3.1
    logstash基于RabbitMQ的输入配置
    史上最详细的linux三剑客讲解-grep-awk-sed
    CDN概述
    HttpDNS和传统DNS的区别
    Linux性能分析工具之----mpstat
  • 原文地址:https://www.cnblogs.com/laijx/p/16171071.html
Copyright © 2020-2023  润新知