高可用性(避免单点故障)
负载均衡(充分利用服务器性能)
弹性伸缩(易于扩容和缩容) 监控预警(有问题早发现)

确立自己原则的“五步原则” 1、目标:我要什么?
2、计划:我该怎么做?
3、行动:我碰到了什么问题?
4、反思:什么原因?
5、改进:形成原则

一、Linux

1.1 Hello World

  1. echo 'hello world'
  2. echo 'hello shell'

1.2 常用命令组合

  1. find . -name '*.log' -mtime +7 -type f
  2. find . -maxdepth 1 -name '*.old' -type d
  3. find . -maxdepth 3 -name '*.old' -type d |xargs echo
  4. Now_Time=`(date +%Y%m%d%H%M%S)`
  5. NowStamp=`(date +%s)`
  6. sed -i.bak '/swap/s/^\(.*\)$/#\1/g' /etc/fstab
  7. ## (1.0.21.62.)(20200916114736) 分组替换
  8. sed -i "s/\(\([0-9]\{1,\}\.\)\{3,\}\)\([0-9]\{1,\}\)/\1${Now_Time}/g" /opt/www/index*.html
  9. sed ':a;N;$!ba;s/nz_shouq_accountdb/nz_shouq_main/2' ## 末尾2表示只替换第二个
  10. ps -ef|grep redis|grep -v grep |awk -F: '{print $NF}'
  11. ## 打印第10列等于403的行
  12. awk '$10==403 {print $0}' /opt/log/nginx/www.xxx.com.log
  13. awk '{a[$1]++}END{for(v in a)print v,a[v]}' access.log
  14. # https://www.cnblogs.com/linuxprobe/p/11387906.html
  15. ## grep -r 递归; -I 排除二进制文件; -n 行号; -H 文件名; --exclude 排除匹配文件; --exclude-dir 排除匹配目录
  16. grep -rInH --exclude=*.log --exclude-dir=py3* '\/opt\/' *
  17. grep 'skill Id : 999' error.log* -C10 | more
  18. egrep -v '(^$|^#)' /etc/ansible/ansible.cfg
  19. tcpdump -i eth0 -s 0 -l -w - -w aa.pcap
  20. netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
  21. netstat -anpo|more
  22. netstat -anpo|grep ESTABLISHED|awk '{$3!=0}{print $0}'
  23. netstat -anpo|grep ESTABLISHED|awk '$3!=0{print $0}'
  24. cat /proc/`pidof mysqld`/limits
  25. sudo du -s * | sort -nr | head # 显示前10个占用空间最大的文件或目录
  26. sudo du --max-depth=1 # linux查找占空间最大的文件与目录
  27. sudo find ./ -size -2048c -type f # 查找小于2K的文件,- 表示小于
  28. ##
  29. pidstat -u -p pidnum 3 ## 某pid 3秒内CPU使用情况
  30. -u -r 内存 -d 磁盘
  31. iostat -d 2 3
  32. ## ip 按照数字排序
  33. sort -t'.' -k1,1n -k2,2n -k3,3n -k4,4n ip.txt

1.3 系统安全和优化

  1. #!/bin/bash
  2. #
  3. ## 1 close selinux
  4. setenforce 0
  5. sed -i /SELINUX/s/enforcing/disabled/g /etc/selinux/config
  6. ## 2 close iptables firewalld
  7. systemctl stop iptables.service
  8. systemctl stop firewalld.service
  9. ## 3 中文支持
  10. cat /etc/sysconfig/i18n
  11. echo 'LANG="zh_CN.UTF-8"' > /etc/sysconfig/i18n
  12. echo 'LC_ALL="zh_CN.UTF-8"' >> /etc/sysconfig/i18n
  13. source /etc/sysconfig/i18n
  14. #######
  15. cat /etc/locale.conf
  16. echo 'LANG="zh_CN.UTF-8"' > /etc/locale.conf
  17. source /etc/locale.conf
  18. #### 设置timezone的时区
  19. ##sudo timedatectl set-timezone 'Asia/Shanghai'
  20. ## 或者
  21. echo "Asia/Shanghai" > /etc/timezone
  22. ## 4 设置时间
  23. rm -rf /etc/localtime
  24. ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  25. ## 5 sync time
  26. ntpdate times.aliyun.com
  27. echo '# time sync to aliyun 2017-08-21' >> /var/spool/cron/root
  28. echo '*/5 * * * * /usr/sbin/ntpdate times.aliyun.com >/dev/null 2>&1' >>/var/spool/cron/root
  29. ## 6 base.repo epel.repo docker.repo
  30. yum install -y sysstat tree net-tools wget curl vim lrzsz zip unzip python-pip python-devel python36 python36-devel python36-pip bash-completion
  31. mkdir /etc/yum.repos.d/default
  32. mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/default/
  33. curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
  34. wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
  35. yum install -y yum-utils device-mapper-persistent-data lvm2
  36. yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  37. ## 7 添加 www mysql (no home)
  38. useradd myadmin && echo 'yourpasswd123#@!' |passwd myadmin --stdin
  39. useradd www -M -s /sbin/nologin
  40. useradd mysql -M -s /sbin/nologin
  41. ## 8 sshd 配置优化
  42. \cp /etc/ssh/sshd_config{,.bak}
  43. sed -i 's@#UseDNS yes@UseDNS no@g;s@^GSSAPIAuthentication yes@GSSAPIAuthentication no@g' /etc/ssh/sshd_config
  44. ### 禁用root远程,添加myadmin sudoers
  45. #sed -i 's@#PermitRootLogin yes@PermitRootLogin no@g' /etc/ssh/sshd_config
  46. #sed -i 's@#Port 22@Port 52222@g' /etc/ssh/sshd_config
  47. /etc/init.d/sshd reload
  48. ## 9 系统参数优化
  49.   #1. 计算 fdmax = 物理内存大小(m为单位) / 4 * 256 假设内存为8G,fdmax=524288
  50.   #2. 执行命令: echo fs.file-max=524288 >> /etc/sysctl.conf
  51.   #3. 执行命令: sysctl -p
  52.   #4. 执行命令: echo * soft nofile 524286 >> /etc/security/limits.conf
  53.   #5. 执行命令: echo * hard nofile 524287 >> /etc/security/limits.conf
  54. echo fs.file-max=524288 >> /etc/sysctl.conf
  55. sysctl -p
  56. echo '* soft nofile 524286' >> /etc/security/limits.conf
  57. echo '* hard nofile 524287' >> /etc/security/limits.conf
  58. # /etc/supervisord.conf
  59. # minfds=1048576
  60. cat >> /etc/sysctl.conf << EOF
  61. # https://www.cnblogs.com/kgdxpr/p/3342102.html
  62. # source configuration
  63. # /sbin/sysctl -p
  64. #######禁用ipv6#######
  65. # 禁用整个系统所有接口的IPv6
  66. net.ipv6.conf.all.disable_ipv6 = 1
  67. # 禁用某一个指定接口的IPv6(例如:eth0, lo)
  68. net.ipv6.conf.lo.disable_ipv6 = 1
  69. net.ipv6.conf.eth0.disable_ipv6 = 1
  70. #######################
  71. net.ipv4.tcp_syncookies = 1
  72. net.ipv4.tcp_tw_reuse = 1
  73. net.ipv4.tcp_tw_recycle = 1
  74. net.ipv4.ip_local_port_range = 1024 65000
  75. net.ipv4.tcp_max_syn_backlog = 8192
  76. net.ipv4.tcp_max_tw_buckets = 5000
  77. net.ipv4.tcp_max_syn_backlog = 65536
  78. net.core.netdev_max_backlog = 32768
  79. net.core.somaxconn = 32768
  80. net.core.wmem_default = 8388608
  81. net.core.rmem_default = 8388608
  82. net.core.rmem_max = 16777216
  83. net.core.wmem_max = 16777216
  84. net.ipv4.tcp_timestamps = 0
  85. net.ipv4.tcp_synack_retries = 2
  86. net.ipv4.tcp_syn_retries = 2
  87. net.ipv4.tcp_mem = 94500000 915000000 927000000
  88. net.ipv4.tcp_max_orphans = 3276800
  89. kernel.sysrq = 0
  90. kernel.core_uses_pid = 1
  91. kernel.msgmnb = 65536
  92. kernel.msgmax = 65536
  93. kernel.shmmax = 68719476736
  94. kernel.shmall = 4294967296
  95. vm.swappiness=10
  96. EOF
  97. sysctl -p
  98. ## 10 安全问题 把暴力登录的ip 追加到/etc/hosts.deny
  99. cat >/bin/ssh_scan.sh <<EOF
  100. #! /bin/bash
  101. cat /var/log/secure|awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{print $2"="$1;}' > /tmp/black.txt
  102. DEFINE="10"
  103. for i in `cat /tmp/black.txt`
  104. do
  105. IP=`echo $i |awk -F= '{print $1}'`
  106. NUM=`echo $i|awk -F= '{print $2}'`
  107. if [ $NUM -gt $DEFINE ];then
  108. grep $IP /etc/hosts.deny > /dev/null
  109. if [ $? -gt 0 ];then
  110. echo "sshd:$IP" >> /etc/hosts.deny
  111. fi
  112. fi
  113. done
  114. EOF
  115. ## 加入定时任务
  116. echo '####SSH_Failed_Access_Scan####' >>/etc/crontab
  117. echo '*/1 * * * * root sh /bin/ssh_scan.sh' >> /etc/crontab
  118. ## 11 重要文件加锁,禁止修改如 /etc/passwd /etc/shadow /etc/sudoers /root/.ssh/authorized_keys
  119. chattr +i /etc/passwd /etc/group /etc/shadow /etc/sudoers /root/.ssh/authorized_keys
  120. # lsattr
  121. # chattr -i file
  122. # chattr -R +i dir
  123. ## 12 预留端口需要吗?
  124. echo "39003-39004" > /proc/sys/net/ipv4/ip_local_reserved_ports

1.3.1 防火墙iptables

  1. cat >/bin/iptables.sh <<EOF
  2. #!/bin/bash
  3. iptables -F
  4. iptables -t nat -F
  5. #### Below are the basal iptables config, normally need not be modified #######
  6. iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
  7. iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
  8. iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
  9. iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
  10. iptables -A INPUT -p udp --source-port 53 -j ACCEPT
  11. iptables -A INPUT -p tcp --dport 62222 -j ACCEPT
  12. iptables -A INPUT -p tcp --dport 22 -j ACCEPT
  13. ##### Below are the Appalication related iptables config #######
  14. iptables -A INPUT -s 10.0.5.0/24 -j ACCEPT
  15. iptables -A INPUT -p tcp --dport 80 -j ACCEPT
  16. iptables -A INPUT -p tcp --dport 443 -j ACCEPT
  17. iptables -A INPUT -j DROP
  18. iptables -A FORWARD -j DROP
  19. EOF
  20. systemctl enable iptables.service
  21. systemctl restart iptables.service
  22. sh /bin/iptables.sh
  23. echo 'sh /bin/iptables.sh' >> /etc/rc.local
  24. ####
  25. ## iptables防火墙
  26. iptables最常用的规则示例
  27. https://www.cnblogs.com/EasonJim/p/8339162.html
  28. ### 1、删除已有规则
  29. iptables -F
  30. iptables flush
  31. ### 2、设置链的默认策略
  32. iptables -P INPUT DROP
  33. iptables -P FORWARD DROP
  34. ##### iptables -P OUTPUT DROP ## 一般不对出站的数据包做限制
  35. ### 3、丢弃来自IP地址x.x.x.x的包
  36. iptables -A INPUT -s x.x.x.x -j DROP
  37. #### 3.1、阻止来自IP地址x.x.x.x eth0 tcp的包
  38. iptables -A INPUT -i eth0 -s x.x.x.x -j DROP
  39. iptables -A INPUT -i eth0 -p tcp -s x.x.x.x -j DROP
  40. ### 4、允许所有来自外部的SSH连接请求,即只允许进入eth0接口,并且目标端口为22的数据包
  41. iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
  42. iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
  43. ### 5、仅允许来自于192.168.100.0/24域的用户的ssh连接请求
  44. iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
  45. iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
  46. ### 6、允许所有来自web - http的连接请求
  47. iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
  48. iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
  49. iptables -A INPUT -i eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
  50. iptables -A OUTPUT -o eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
  51. ### 7、使用multiport 将多个规则结合在一起(允许所有ssh,http,https的流量访问)
  52. iptables -A INPUT -i eth0 -p tcp -m multiport --dports 22,80,443 -m state --state NEW,ESTABLISHED -j ACCEPT
  53. iptables -A OUTPUT -o eth0 -p tcp -m multiport --sports 22,80,443 -m state --state ESTABLISHED -j ACCEPT
  54. ### 8、负载平衡传入的网络流量
  55. iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.101:443
  56. iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 1 -j DNAT --to-destination 192.168.1.102:443
  57. iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 2 -j DNAT --to-destination 192.168.1.103:443
  58. ### 9、允许外部主机ping内部主机
  59. iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
  60. iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
  61. ### 10、允许来自网络192.168.101.0/24的rsync连接请求
  62. iptables -A INPUT -i eth0 -p tcp -s 192.168.101.0/24 --dport 873 -m state --state NEW,ESTABLISHED -j ACCEPT
  63. iptables -A OUTPUT -o eth0 -p tcp --sport 873 -m state --state ESTABLISHED -j ACCEPT
  64. ### 11、MySQL数据库与web服务跑在同一台服务器上。有时候我们仅希望DBA和开发人员从内部网络(192.168.100.0/24)直接登录数据库,可尝试以下命令:
  65. iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
  66. iptables -A OUTPUT -o eth0 -p tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT
  67. ### 12、将来自422端口的流量全部转到22端口。 这意味着我们既能通过422端口又能通过22端口进行ssh连接。启用DNAT转发。
  68. ##### 系统开启转发功能
  69. echo 1 > /proc/sys/net/ipv4/ip_forward
  70. iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to 192.168.102.37:22
  71. #####除此之外,还需要允许连接到422端口的请求
  72. iptables -A INPUT -i eth0 -p tcp --dport 422 -m state --state NEW,ESTABLISHED -j ACCEPT
  73. iptables -A OUTPUT -o eth0 -p tcp --sport 422 -m state --state ESTABLISHED -j ACCEPT
  74. iptables 四表五链
  75. https://www.cnblogs.com/zhujingzhi/p/9706664.html

1.3.2 防火墙firewired

  1. firewall-cmd --list-all
  2. firewall-cmd --add-ports=9000/tcp --permernent
  3. firewall-cmd --reload

1.3.3 cc 和ddos

  1. #!/bin/bash
  2. #
  3. # date: 2018-04-12
  4. # author: channel
  5. #
  6. if [[ -z $1 ]]; then
  7. num=50
  8. else
  9. num=$1
  10. fi
  11. # cd where is the shell
  12. cd $(cd $(dirname $BASH_SOURCE) && pwd)
  13. function check(){
  14. iplist=`netstat -an |grep ^tcp.*.80|egrep -v 'LISTEN|127.0.0.1'|awk -F "[ ]+|[:]" '{print $4}'`
  15. if [[ ! -z $iplist ]];
  16. then
  17. > ./iplist/black_ip.txt
  18. for black_ip in $iplist
  19. do
  20. # exclude_ip=`echo $black_ip |awk -F "." '{print "$1"."$2"."$3"}'`
  21. # grep -q $excude_ip ./white_ip.txt
  22. grep -q $black_ip ./white_ip.txt
  23. if [[ $? -eq 0 ]]; then
  24. echo "$black_ip (white_ip)" >>./black_ip.txt
  25. else
  26. echo $black_ip >> ./black_ip.txt
  27. iptables -nL |grep $black_ip || (iptables -I INPUT -s £$black_ip -j DROP & echo "$black_ip exist" )
  28. fi
  29. done
  30. if [[ `cat ./sendmail` == 1 ]];then sendmsg;fi
  31. fi
  32. }
  33. function sendmsg(){
  34. netstat -nutlp |grep "sendmail" >/dev/null 2>&1 || /etc/init.d/sendmail start >/dev/null ;
  35. echo -e "From: 1006793841@qq.com\nTo:22222222222@qq.com\nSubject:Someone Attacking you system"
  36. cat ./black_ip.txt >>./message
  37. /usr/sbin/sendmail -f sendaddr@qq.com -t recieve_add@qq.com -i <./message
  38. >./sendmail
  39. }
  40. while true
  41. do
  42. check
  43. sleep 10
  44. done
  1. #!/bin/bash
  2. #
  3. # date: 2018-4-11
  4. # author: channel
  5. #
  6. FilePath="access.log"
  7. awk '{print $1}' $FilePath |sort -rn |uniq -c >ip_count.log
  8. cat ip_count.log |while read text
  9. do
  10. echo $text
  11. count= echo $text |awk '{print $1}'
  12. ip= echo $test |awk '{print $2}'
  13. if [ $count -gt 20 ]
  14. then
  15. if iptables -L |grep $ip
  16. then
  17. echo "ip address exists iptables, no add again"
  18. else
  19. echo "add $ip address in iptables"
  20. iptables -A INPUT -s $ip -j DROP && echo $ip >> ip_drop.log
  21. /etc/init.d/iptables save &> /dev/null
  22. /etc/init.d/iptables restart &>/dev/null
  23. fi
  24. else
  25. echo "no ip will be add iptables"
  26. fi
  27. done
  28. # remember to create a crontab task for this shell

二、Nginx

2.22 配置

  1. ####### 负载均衡配置:
  2. upstream myapp {
  3. server 192.168.0.111:8080; # 应用服务器1
  4. server 192.168.0.112:8080; # 应用服务器2
  5. }
  6. server {
  7. listen 80;
  8. location / {
  9. proxy_pass http://myweb;
  10. }
  11. }
  12. ###### 反向代理
  13. server {
  14. listen 80;
  15. location / {
  16. proxy_pass http://192.168.0.112:8080; # 应用服务器HTTP地址
  17. }
  18. }
  19. ###### 虚拟主机
  20. server {
  21. listen 80 default_server;
  22. server_name _;
  23. return 444; # 过滤其他域名的请求,返回444状态码
  24. }
  25. server {
  26. listen 80;
  27. server_name www.aaa.com; # www.aaa.com域名
  28. location / {
  29. proxy_pass http://localhost:8080; # 对应端口号8080
  30. }
  31. }
  32. server {
  33. listen 80;
  34. server_name www.bbb.com; # www.bbb.com域名
  35. location / {
  36. proxy_pass http://localhost:8081; # 对应端口号8081
  37. }
  38. }
  39. ##### 另外,server_name配置还可以过滤有人恶意将某些域名指向你的主机服务器。
  40. #### FastCGI
  41. #### Nginx本身不支持PHP等语言,但是它可以通过FastCGI来将请求扔给某些语言或框架处理(例如PHP、Python、Perl)。
  42. server {
  43. listen 80;
  44. location ~ \.php$ {
  45. include fastcgi_params;
  46. fastcgi_param SCRIPT_FILENAME /PHP文件路径$fastcgi_script_name; # PHP文件路径
  47. fastcgi_pass 127.0.0.1:9000; # PHP-FPM地址和端口号
  48. # 另一种方式:fastcgi_pass unix:/var/run/php5-fpm.sock;
  49. }
  50. }
  51. ## rewirte
  52. server {
  53. listen 80;
  54. server_name monitor.xxxx.com;
  55. rewrite ^(.*)$ https://${server_name}$1 permanent;
  56. }
  57. server {
  58. server_name monitor.xxxx.com ;
  59. listen 443 ssl;
  60. ssl_certificate /usr/local/nginx/conf/888__xxxx.com.pem;
  61. ssl_certificate_key /usr/local/nginx/conf/888__xxxx.com.key;
  62. index index.html index.htm;
  63. root /opt/www/xxxx_web/dist;
  64. location ~ .*\.(jpg|png|jpeg)$ {
  65. expires 30d;
  66. }
  67. location / {
  68. try_files $uri $uri/ /index.html;
  69. expires 7d;
  70. }
  71. access_log /opt/log/nginx/monitor.xxxx.com.log;
  72. }
  73. ## 防盗链 在nginx的conf中配置
  74. location ~.*\.(gif|jpg|png|flv|swf|rar|zip)$
  75. {
  76. valid_referers none blocked zi.com *.zi.com;
  77. if($invalid_referer)
  78. {
  79. #return 403;
  80. rewrite ^/ http://www.zi.com/403.jpg;
  81. }
  82. }

2.3 vhost

2.4 动态负载均衡

2.5 http 登录验证

  1. # https://www.cnblogs.com/clsn/p/9950892.html
  2. [root@clsn nginx]# yum install httpd-tools -y
  3. [root@clsn nginx]# htpasswd -c /usr/local/awstats/wwwroot/nmtui.passwd nmtui
  4. New password:
  5. Re-type new password:
  6. Adding password for user nmtui
  7. [root@clsn nginx]# chown www.www /usr/local/awstats/wwwroot/nmtui.passwd
  8. [root@clsn nginx]# chmod 600 /usr/local/awstats/wwwroot/nmtui.passwd
  9. [root@clsn nginx]# vim awstats.nmtui.com.conf
  10. server
  11. {
  12. listen 80;
  13. server_name awstats.nmtui.com;
  14. index awstats.nmtui.com.html;
  15. root /www/wwwroot/awstats/;
  16. auth_basic "clsn training";
  17. auth_basic_user_file /usr/local/awstats/wwwroot/nmtui.passwd;
  18. access_log /www/wwwlogs/301-clsn.io.log;
  19. error_log /www/wwwlogs/301-clsn.io-error.log;
  20. }
  21. [root@clsn nginx]# /etc/init.d/nginx reload

2.9 nginx 调优

  1. Nginx调优
  2. https://www.cnblogs.com/zhichaoma/p/7989655.html
  3. 1.隐藏 Nginx 版本号
  4. 2.隐藏 Nginx 版本号和软件名
  5. 3.更改 Nginx 服务的默认用户
  6. 4.优化 Nginx worker 进程数
  7. 5.绑定 Nginx 进程到不同的 CPU
  8. 6.优化 Nginx 处理事件模型
  9. 7.优化 Nginx 单个进程允许的最大连接数
  10. 8.优化 Nginx worker 进程最大打开文件数
  11. 9.优化服务器域名的散列表大小
  12. 10.开启高效文件传输模式
  13. 11.优化 Nginx 连接超时时间
  14. 12.限制上传文件的大小
  15. 13.FastCGI 相关参数调优
  16. 14.配置 Nginx gzip 压缩
  17. 15.配置 Nginx expires 缓存
  18. 16.优化 Nginx日志(日志切割)
  19. 17.优化 Nginx 站点目录
  20. 18.配置 Nginx 防盗链
  21. 19.配置 Nginx 错误页面优雅显示
  22. 20.优化 Nginx 文件权限
  23. 21.Nginx 防爬虫优化
  24. 22.控制 Nginx 并发连接数
  25. 23.集群代理优化
  26. Nginx 性能调优
  27. https://www.jianshu.com/p/024b33d1a1a1

三、MySQL

3.1 基础操作命令

3.1.1 添加索引

  1. ## 1.添加PRIMARY KEY(主键索引)
  2. mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )
  3. ## 2.添加UNIQUE(唯一索引)
  4. mysql>ALTER TABLE `table_name` ADD UNIQUE ( `column` )
  5. ## 3.添加INDEX(普通索引)
  6. mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
  7. ## 4.添加FULLTEXT(全文索引)
  8. mysql>ALTER TABLE `table_name` ADD FULLTEXT ( `column` )
  9. ## 5.添加多列索引
  10. mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )

3.1.2 复制表到新表

  1. 方法一:
  2. 拷贝表1的全部数据到表2
  3. INSERT INTO table2 SELECT * FROM table1
  4. 拷贝第n
  5. INSERT INTO table2 SELECT * FROM table1 WHERE id=5
  6. 拷贝指定字段
  7. INSERT INTO table2 ( name , price ) SELECT name , price FROM table1 WHERE id=5
  8. 方法二:
  9. 创建表3 同时拷贝表1的数据和结构到表3
  10. CREATE TABLE table3 SELECT * FROM table
  11. 方法三:
  12. 创建表4,只拷贝表1的结构到表4,不拷贝数据
  13. CREATE TABLE table4 LIKE table
  14. 版权声明:本文为CSDN博主「一筐大白菜啊」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
  15. 原文链接:https://blog.csdn.net/sphinx1122/article/details/84402854

3.1.3 部分配置文件参考

  1. [client]
  2. default-character-set=utf8
  3. [mysql]
  4. default-character-set=utf8
  5. [mysqld]
  6. init_connect='SET collation_connection = utf8_unicode_ci'
  7. init_connect='SET NAMES utf8'
  8. character-set-server=utf8
  9. collation-server=utf8_unicode_ci
  10. skip-character-set-client-handshake
  11. #skip-grant-tables
  12. ### MySQL5.6
  13. #UPDATE mysql.user SET Password = password('123456') WHERE User = 'root' ;
  14. ### MySQL5.7
  15. #update mysql.user set authentication_string=password('123qwe') where user='root' and Host = 'localhost';
  16. ————————————————
  17. 版权声明:本文为CSDN博主「o尐猫o」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
  18. 原文链接:https://blog.csdn.net/dy_miao/article/details/91461581

3.2 备份和还原

3.2.1 mysqldump 备份

  1. https://www.cnblogs.com/chenmh/p/5300370.html
  2. ## 1.该命令会导出包括系统数据库在内的所有数据库
  3. mysqldump -uroot -proot --all-databases >/tmp/all.sql
  4. ## 2.导出db1、db2两个数据库的所有数据
  5. mysqldump -uroot -proot --databases db1 db2 >/tmp/user.sql
  6. ## 3.导出db1中的a1、a2表
  7. mysqldump -uroot -proot --databases db1 --tables a1 a2 >/tmp/db1.sql
  8. ## 4.条件导出,导出db1表a1中id=1的数据
  9. mysqldump -uroot -proot --databases db1 --tables a1 --where='id=1' >/tmp/a1.sql
  10. ## 5.字段是字符串,并且导出的sql中不包含drop table,create table
  11. mysqldump -uroot -proot --no-create-info --databases db1 --tables a1 --where="id='a'" >/tmp/a1.sql
  12. ## 6.只导出表结构不导出数据,--no-data
  13. mysqldump -uroot -proot --no-data --databases db1 >/tmp/db1.sql
  14. ###
  15. PATH="/application/mysql/bin:$PATH"
  16. DBPATH=/server/backup
  17. MY_USER=root
  18. MY_PASS=old123
  19. SOCKET=/data/3306/mysql.sock
  20. MY_CMD="mysql -u$MY_USER -p$MY_PASS -S $SOCKET"
  21. MY_DUMP="mysqldump -u$MY_USER -p$MY_PASS -S$SOCKET"
  22. [ ! -d "$DBPATH" ] && mkdir -p $DBPATH
  23. for dbname in `$MYCMD -e "show databases;" |sed '1,2d' |egrep -v "mysql|schema"`
  24. do
  25. $MYDUMP $dbname |gzip > $DBPATH/${dbname}_$(date +%F).sql.gz
  26. done

3.2.2 mysql 还原

3.2.3 mysqlbinlog 解析binlog

  1. #https://www.cnblogs.com/michael9/p/11923483.html
  2. mysqlbinlog -v -v --base64-output=DECODE-ROWS --set-charset=UTF-8 --start-position=309610 --stop-position=328251 mysql-bin.000002 > recover.sql
  3. mysqlbinlog -v -v --base64-output=DECODE-ROWS --set-charset=UTF-8 mysql-bin.000001

3.2.4 binlog2sql 回滚SQL

  1. https://github.com/danfengcao/binlog2sql
  2. [mysqld]
  3. server_id = 1
  4. log_bin = /var/log/mysql/mysql-bin.log
  5. max_binlog_size = 1G
  6. binlog_format = row
  7. binlog_row_image = full
  8. ######
  9. ## 解析标准SQL
  10. python binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p'admin' -dtest -t test3 test4 --start-file='mysql-bin.000002'
  11. ## 解析回滚SQL -B, --flashback
  12. python binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p'admin' -dtest -ttest3 --start-file='mysql-bin.000002' --start-position=763 --stop-position=1147 -B

3.2.5 xtrabackup

  1. # this is a example about xtrabackup
  2. #
  3. # coding:utf8
  4. # 步骤
  5. # 全量备份 -> 增量1 -> 增量2 ->
  6. # 全量备份00,假设全量文件是/backup_file/00
  7. innobackupex --user=root --password='123123' /backup_file/
  8. # 增量1, 文件是/backup_file/11
  9. innobackupex --incremental /backup_file --incremental-basedir=/backup_file/00
  10. # 增量2, 文件是/backup_file/22
  11. innobackupex --incremental /backup_file --incremental-basedir=/backup_file/11
  12. ##################
  13. # 整合#
  14. # 准备全量00
  15. innobackupex --apply-log --redo-only /backup_file/00
  16. # 准备11
  17. innobackupex --apply-log --redo-only /backup_file/00/ --incremental-dir=/backup_file/11
  18. # 准备22
  19. innobackupex --apply-log --redo-only /backup_file/00/ --incremental-dir=/backup_file/22
  20. #################
  21. #
  22. # 恢复数据
  23. innobackupex --copy-back /backup_file/00
  24. # 修改属主、属组
  25. chown -R mysql.mysql /usr/local/mysql/data
  26. # 启动mysql
  27. /etc/init.d/mysqld start
  28. #### 5,恢复binlog中的部分文件
  29. mysqlbinlog mysql-bin.000002 >/tmp/abc.sql
  30. #
  31. # 暂时关闭binlog记录
  32. mysql> set sql_log_bin=0;
  33. mysql> source /tmp/abc.sql;
  34. #
  35. # 恢复完成,打开binlog记录
  36. mysql> set sql_log_bin=1

3.3 主从复制

3.3.0 主从复制方式

  1. ##

3.3.1 传统binlog

  1. ##

3.3.2 基于GTID(建议使用mysql-5.6.5以上版本)

  1. MySQL GTID 主从复制的原理及配置 https://blog.51cto.com/yangshufan/2136862
  2. 四、GTID的工作原理
  3. 1、当一个事务在主库端执行并提交时,产生GTID,一同记录到binlog日志中。
  4. 2binlog传输到slave,并存储到slaverelaylog后,读取这个GTID的这个值设置gtid_next变量,即告诉Slave,下一个要执行的GTID值。
  5. 3sql线程从relay log中获取GTID,然后对比slave端的binlog是否有该GTID
  6. 4、如果有记录,说明该GTID的事务已经执行,slave会忽略。
  7. 5、如果没有记录,slave就会执行该GTID事务,并记录该GTID到自身的binlog 在读取执行事务前会先检查其他session持有该GTID,确保不被重复执行。
  8. 6、在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。

3.9 MySQL参数调优

  1. https://www.cnblogs.com/zhichaoma/p/7992525.html
  2. 连接相关参数
  3. 文件相关参数
  4. 缓存相关参数
  5. MyISAM参数
  6. InnoDB参数

四、Django

4.0 py虚拟环境(virtualenv的使用)

  1. ## centos7安装
  2. yum install y make gcc-c++ python36-devel python36-pip libxml2-devel libxslt-devel
  3. pip3 install virtualenv virtualenvwrapper
  4. export WORKON_HOME=$HOME/.virtualenvs
  5. export PROJECT_HOME=$HOME/workspace
  6. source /usr/local/bin/virtualenvwrapper.sh
  7. #使用方法:
  8. mkvirtualenv zqxt #创建运行环境zqxt
  9. workon zqxt #工作在 zqxt 环境
  10. mkproject -p /usr/bin/python3 py3-pyspider #创建mic项目和运行环境mic
  11. ## 拓展:
  12. rmvirtualenv ENV #删除运行环境ENV
  13. mkproject mic #创建mic项目和运行环境mic
  14. mkproject -p /usr/bin/python3 py3-pyspider #创建mic项目和运行环境mic
  15. mktmpenv #创建临时运行环境
  16. lsvirtualenv #列出可用的运行环境
  17. lssitepackages #列出当前环境安装了的包
  18. ## 创建的环境是独立的,互不干扰,无需sudo权限即可使用 pip 来进行包的管理。
  19. pip install --ignore-installed pycurl

4.1 Django路由

4.1.1 Django哈哈

  1. python manage.py startapp test
  2. python manage.py makemigrations
  3. python manage.py migrate
  4. python manage createsuperuser
  5. 2.0urls文件内的path好像不支持正则了
  6. 需要用正则匹配的 需要
  7. from django.urls import re_path
  8. urlpatterns = [
  9. re_path('index-(?P<nid>\d)-(?P<uid>\d)', views.index)
  10. }
  11. ————————————————
  12. 版权声明:本文为CSDN博主「Reisen稻叶」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
  13. 原文链接:https://blog.csdn.net/u011410397/java/article/details/81780495
  14. be determined to have a great day, and you will

五、saltstack

5.1 使用入门

  1. cat /etc/salt/master | grep -v '#' | grep -v -e '^$'
  2. /etc/init.d/salt-master restart
  3. salt -L 'HD-HZ-H5PLAT-WEB05' state.sls sysinit
  4. salt -v 'HD-HZ-H5PLAT-WEB05' state.highstate -l debug -t 300
  5. salt-run jobs.lookup_jid 20190426130418644064
  6. https://docs.saltstack.com/en/latest/ref/runners/all/salt.runners.jobs.html
  7. http://dearweb.xin/2017/10/24/salt-file-backup/
  8. #################################
  9. salt -d ##查看帮助文档
  10. salt -d|grep service ##查看service相关模块命令
  11. salt '*' sys.doc ##查看帮助文档
  12. salt-key -L #查询所有接收到的证书
  13. salt-key -a <证书名> #接收单个证书
  14. salt-key -A #接受所有证书
  15. salt-key -d <证书名> #删除单个证书
  16. salt-key -D #删除所有证书
  17. ## service
  18. salt '*' service.get_all ##获取主机所有服务
  19. salt '*' service.reload sshd ##重载sshd服务
  20. salt 'node1.com' service.status mysql ##查看mysql服务状态
  21. salt 'node1.com' service.start mysql ##启动mysql服务
  22. salt 'node1.com' cmd.run 'service mysql status' ##与上面一样查看服务
  23. salt '*' sys.list_modules ##模块列表
  24. salt-cp '*' /etc/hosts /etc/hosts ##把master上的hosts文件分发到所有主机
  25. salt '*' cp.get_file salt://ceshi/b /tmp/test ##把salt-master端相应的文件,分发文件到minion端
  26. salt '*' cp.get_dir salt://zabbix /tmp ##把salt-master端相应的目录,分发文件到minion端
  27. salt '*' file.copy /tmp/zabbix.sls /tmp/sls ##把salt-master端对应文件拷贝到minion端相应目录下
  28. ## pkg
  29. salt '*' pkg.list_pkgs ##显示软件包版本列表
  30. salt '*' pkg.version python ##显示软件包版本信息
  31. salt '*' pkg.install httpd ##安装软件包
  32. 'cmd.script:'
  33. salt '*' cmd.script salt://scripts/runme.sh
  34. salt '*' cmd.script salt://scripts/runme.sh 'arg1 arg2 "arg 3"'
  35. salt '*' cmd.script salt://scripts/windows_task.ps1 args=' -Input c:\tmp\infile.txt' shell='powershell'
  36. salt '*' cmd.script salt://scripts/runme.sh stdin='one\ntwo\nthree\nfour\nfive\n'
  37. 'cmd.shell:'
  38. This passes the cmd argument directly to the shell
  39. salt '*' cmd.shell "ls -l | awk '/foo/{print \$2}'"
  40. salt '*' cmd.shell template=jinja "ls -l /tmp/`grains`.`id` | awk '/foo/{print \$2}'"
  41. salt '*' cmd.shell "Get-ChildItem C:\ " shell='powershell'
  42. salt '*' cmd.shell "grep f" stdin='one\ntwo\nthree\nfour\nfive\n'
  43. salt '*' cmd.shell cmd='sed -e s/=/:/g'
  44. 'cmd.shells:'
  45. salt '*' cmd.shells
  46. 'cmd.tty:'
  47. salt '*' cmd.tty tty0 'This is a test'
  48. salt '*' cmd.tty pts3 'This is a test'
  49. 'cmd.which:'
  50. salt '*' cmd.which cat
  51. ## grains
  52. salt '*' grains.ls ##查看grains分类
  53. salt '*' grains.items ##查看grains所有信息
  54. salt '*' grains.item osrelease ##查看grains某个信息
  55. ## manage
  56. salt-run manage.up ##查看存活的minion
  57. salt-run manage.down ##查看死掉的minion
  58. salt-run manage.down removekeys=True ##查看down掉的minion,并将其删除
  59. salt-run manage.status ##查看minion的相关状态
  60. salt-run manage.versions ##查看slat的所有master和minion的版本信息
  61. ## jobs
  62. salt-run jobs.active
  63. salt \* saltutil.running ##查看运行的jobs ID
  64. salt \* saltutil.kill_job 20151209034239907625 ##kill掉进程ID
  65. ### saltutil模块中的job管理方法
  66. saltutil.running #查看minion当前正在运行的jobs
  67. saltutil.find_job<jid> #查看指定jid的job(minion正在运行的jobs)
  68. saltutil.signal_job<jid> <single> #给指定的jid进程发送信号
  69. saltutil.term_job <jid> #终止指定的jid进程(信号为15)
  70. saltutil.kill_job <jid> #终止指定的jid进程(信号为9)
  71. ### salt runner中的job管理方法
  72. salt-run jobs.active #查看所有minion当前正在运行的jobs(在所有minions上运?saltutil.running)
  73. salt-run jobs.lookup_jid<jid> #从master jobs cache中查询指定jid的运行结果
  74. salt-run jobs.list_jobs #列出当前master jobs cache中的所有job
  75. salt-run jobs.active
  76. salt-run jobs.list_jobs
  77. salt-run jobs.list_job 20190823152131069508
  78. salt-run jobs.lookup_jid 20190823152136187925
  79. https://docs.saltstack.com/en/latest/ref/states/backup_mode.html#file-state-backups

5.2 salt-api 安装部署

  1. ## 生成证书
  2. salt-call --local tls.create_self_signed_cert
  3. curl -k https://172.10.15.2:55880/login -H "Accept: application/x-yaml" -d username='saltapi222' -d password='saltapi222@##$$##' -d eauth='pam'
  4. ## 链接:https://www.jianshu.com/p/012ccdff93cc
  5. useradd -M -s /sbin/nologin saltapi222
  6. passwd saltapi222
  7. saltapi222@##$$##
  8. ###############
  9. openssl 生成加密文件
  10. ### 222
  11. # 1 install
  12. yum install -y salt-api
  13. # 2 adduser
  14. useradd -M -s /sbin/nologin salt echo "salt@@123" |passwd --stdiin salt
  15. # 3 配置证书文件
  16. mkdir /etc/ssl/private
  17. ## 生成key
  18. openssl genrsa -out /etc/ssl/private/key.pem 4096
  19. ## 生成证书
  20. openssl req -new -x509 -key /etc/ssl/private/key.pem -out /etc/ssl/private/cert.pem -days 1826
  21. ## 为salt-api单独配置文件
  22. cat >> /etc/salt/master.d/salt-api.conf<<EOF
  23. external_auth:
  24. pam:
  25. salt:
  26. - .*
  27. - '@whell'
  28. - '@runner'
  29. - '@jobs'
  30. rest_cherrypy:
  31. port: 58080
  32. host: 0.0.0.0
  33. ssl_crt: /etc/ssl/private/cert.pem
  34. ssl_key: /etc/ssl/private/key.pem
  35. # disable_ssl: True
  36. EOF
  37. # 重启master 和salt-api
  38. service salt-master restart
  39. service salt-api restart
  40. 4 API 测试验证
  41. 获取token
  42. curl -k https://127.0.0.1:8080/login -H "Accept: application/json" -d username='salt' -d password='salt@@123' -d eauth='pam' |jq .
  43. curl -k https://localhost:8080/ -H "Accept: application/json" -H "X-Auth-Token: ff3k3k23k2332" -d client='local' -d tgt='192.168.204.160' -d fun="cmd.run" -d arg="uname -a" |jq .
  44. jq JSON格式化输出
  45. yum install -y jq
  46. cat json_test.txt |jq .

5.2.1 salt-api 使用

  1. ## https://www.jianshu.com/p/012ccdff93cc
  2. https://www.cnblogs.com/tutuye/p/11590599.html
  3. ## salt-api api接口
  4. https://honglimin.cn/saltstack/08_saltapi_doc.html

5.3 salt-ssh 批量部署minion

  1. yum install salt-ssh

5.8 ansible

  1. # ansible 常用模块
  2. 根据模块功能分类为:云模块、命令模块、数据库模块、文件模块、资产模块、消息模块、监控模块、网络模块、通知模块、包管理模块、源码控制模块、系统模块、单元模块、web设施模块、Windows模块。
  3. ## 安装ansible
  4. yum install ansible -y
  5. rpm -ql ansible
  6. /etc/ansible
  7. /etc/ansible/ansible.cfg
  8. /etc/ansible/hosts
  9. /etc/ansible/roles
  10. ...
  11. ansible -h
  12. ansible --version
  13. cat >/etc/ansible/hosts << EOF
  14. [test]
  15. 192.168.0.211
  16. # children
  17. [mfs:children]
  18. mfs_master
  19. mfs_client
  20. mfs_node
  21. [mfs_master]
  22. 192.168.204.11
  23. [mfs_client]
  24. 192.168.204.21
  25. [mfs_node]
  26. 192.168.204.31
  27. EOF
  28. 这里仅仅介绍一些最常用的模块;
  29. ### 收集客户机的信息
  30. ansible all -m setup
  31. ### ping 模块
  32. ansible all -m ping
  33. ### 执行命令
  34. ansible -i /etc/ansible/hosts test -u root -m command -a 'ls -l /root/' -k
  35. # 简化如下
  36. ansible test -a 'ls -l /root/' -k
  37. ### file 模块
  38. ansible test -m file -a "src=/etc/fstab dest=/tmp/fstab state=link"
  39. ansible test -m file -a "path=/tmp/fstab state=absent"
  40. ansible test -m file -a "path=/tmp/test state=touch"
  41. ansible test -m file -a "path=/tmp/d2 state=directory owner=root group=root mode=700"
  42. ansible test -m command -a "ls /tmp -lh"

六、gitlab

6.1 git命令入门

  1. #!/bin/bash
  2. cd "$WORKSPACE"
  3. git checkout $GitBranch
  4. git diff $from_commitid $to_commitid --name-only>compile_list.txt
  5. ## 获取commit id
  6. git log --pretty="%s" -2
  7. git log --pretty="%H" -2
  8. git log --pretty="%h" -2
  9. ## 某文件的修改记录
  10. git log filename # 查看某个文件的commit记录
  11. git log -p filename # 查看文件每次提交的diff
  12. git log --pretty=oneline filename # 列出文件的所有改动历史
  13. git show 提交生成的一次哈希值 filename # 只查看某次提交的文件变化
  14. ## 取消add后的修改
  15. git reset HEAD + 文件名
  16. ## 取消commit后的修改
  17. git checkout commitId 文件名

6.2 gitlab的安装使用

  1. ##

6.8 Jenkins CI/CD

  1. ## docker 安装 Jenkins
  2. docker search jenkins
  3. docker pull jenkins/jenkins:lts
  4. mkdir /opt/apps/jenkins -p
  5. chmod 777 /opt/apps/jenkins
  6. ll /opt/apps/
  7. docker run -it --name wk-jenkinsci -v /opt/apps/jenkins:/var/jenkins_home -p 8080:8080 -p 50000:50000 -p 45000:45000 jenkins/jenkins:lts
  8. ## 查看启动状态
  9. dockeer ps
  10. ## 查看启动端口
  11. netstat -ntlp |grep 8080
  12. cd /opt/apps/jenkins/
  13. vim copy_reference_file.log
  14. ## 升级站点项的的地址配置文件
  15. cat hudson.model.UpdateCenter.xml
  16. ## 备份配置文件
  17. cp hudson.model.UpdateCenter.xml hudson.model.UpdateCenter.xml.default
  18. ## 【系统管理】【管理插件】【高级】升级站点项的地址修改成,
  19. ## 手动修改配置文件或后台修改http://ip:8080/pluginManager/advanced
  20. grep center.json *
  21. hudson.model.UpdateCenter.xml: <url>https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json</url>
  22. ## ldap配置系列二:jenkins集成ldap
  23. https://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_liunx_52_ldap_for_jenkins.html
  24. ## jenkins集成OpenLDAP认证
  25. https://www.cnblogs.com/37Y37/p/9430272.html
  26. ## Jenkins学习七:Jenkins的授权和访问控制
  27. https://www.cnblogs.com/yangxia-test/p/4368778.html
  28. ## Jenkins学习四:Jenkins 邮件配置
  29. https://www.cnblogs.com/yangxia-test/p/4366172.html
  30. ## Jenkins 持续集成综合实战
  31. https://kefeng.wang/2017/01/06/jenkins/

七、docker

7.1 配置阿里repo安装docker

  1. ## 18.06.1-ce
  2. wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
  3. # yum install -y yum-utils device-mapper-persistent-data lvm2
  4. # yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  5. yum makecache
  6. yum list docker-ce --showduplicates | sort -r
  7. yum -y install docker-ce
  8. systemctl enable docker && systemctl start docker
  9. docker version
  10. ## 镜像的导入和导出
  11. docker save rancher/rke-tools:v0.1.59 rancher/coreos-etcd:v3.4.3-rancher1 > etcd.tar
  12. docker load < etcd.tar
  13. ## pip3 install docker-compose
  14. yum install python36-devel python36-pip
  15. pip3 install docker-compose
  16. ### docker-compose命令补全
  17. curl -L https://raw.githubusercontent.com/docker/compose/1.27.4/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

docker base

  1. #1.停止所有的container,这样才能够删除其中的images:
  2. docker stop $(docker ps -a -q)
  3. #如果想要删除所有container的话再加一个指令:
  4. docker rm $(docker ps -a -q)
  5. #2.查看当前有些什么images
  6. docker images
  7. #3.删除images,通过image的id来指定删除谁
  8. docker rmi <image id>

dockers volumes

  1. 增加这个
  2. volumes:
  3. - /etc/localtime:/etc/localtime
  4. - /etc/timezone:/etc/timezone
  5. https://segmentfault.com/a/1190000005612603
  6. docker run -e TZ="Asia/Shanghai" -v /etc/localtime:/etc/localtime:ro --name=tomcat tomcat:8.0.35-jre8
  7. <p>通过这样的启动方式,就是OK了。<br>当然聪明人肯定不会自己每次都在启动的时候加这些配置,当然在基础镜像里面搞好咯。</p>

docker cp

  1. ### 将主机/www/runoob目录拷贝到容器96f7f14e99ab的/www目录下。
  2. docker cp /www/runoob 96f7f14e99ab:/www/
  3. ### 将主机/www/runoob目录拷贝到容器96f7f14e99ab中,目录重命名为www。
  4. docker cp /www/runoob 96f7f14e99ab:/www
  5. ### 将容器96f7f14e99ab的/www目录拷贝到主机的/tmp目录中。
  6. docker cp 96f7f14e99ab:/www /tmp/

7.2 docker-compose

docker flask

  1. https://www.cnblogs.com/soymilk2019/p/11590117.html

docker nginx

  1. docker run --name testnginx -p 888:80 -v /mnt/nz-docker/init/nginx/nz-docker.conf:/etc/nginx/conf.d/default.conf -v /mnt/nz-docker/client/:/usr/share/nginx/html/ nginx:1.12.2
  2. docker run --name testnginx -p 888:80 -v init/nginx/nz-docker.conf:/etc/nginx/conf.d/default.conf -v client/:/usr/share/nginx/html/ nginx:1.12.2

7.5 elk - docker

elk

  1. #确立自己原则的“五步原则”
  2. #
  3. #1、目标:我要什么?
  4. #2、计划:我该怎么做?
  5. #3、行动:我碰到了什么问题?
  6. #4、反思:什么原因?
  7. #5、改进:形成原则
  8. ├── docker-compose.yml
  9. ├── docker-stack.yml
  10. ├── elasticsearch
  11. ├── config
  12. └── elasticsearch.yml
  13. └── Dockerfile
  14. ├── extensions
  15. ├── apm-server
  16. ├── app-search
  17. ├── curator
  18. ├── logspout
  19. ├── kibana
  20. ├── config
  21. └── kibana.yml
  22. └── Dockerfile
  23. ├── LICENSE
  24. ├── logstash
  25. ├── config
  26. └── logstash.yml
  27. ├── Dockerfile
  28. └── pipeline
  29. └── logstash.conf
  30. └── README.md
  31. ---
  32. version: '2.2'
  33. services:
  34. elasticsearch:
  35. image: docker.elastic.co/elasticsearch/elasticsearch:7.2.0
  36. container_name: elasticsearch7.2.0
  37. environment:
  38. - discovery.type=single-node
  39. - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
  40. - TZ=Asia/Shanghai
  41. volumes:
  42. - esdata:/usr/share/elasticsearch
  43. hostname: elasticsearch
  44. restart: always
  45. ports:
  46. - 9200:9200
  47. - 9300:9300
  48. kibana:
  49. image: docker.elastic.co/kibana/kibana:7.2.0
  50. container_name: kibana7.2.0
  51. environment:
  52. - elasticsearch.hosts=http://elasticsearch:9200
  53. - TZ=Asia/Shanghai
  54. hostname: kibana
  55. depends_on:
  56. - elasticsearch
  57. restart: always
  58. ports:
  59. - "5601:5601"
  60. logstash:
  61. image: docker.elastic.co/logstash/logstash:7.2.0
  62. container_name: logstash7.2.0
  63. environment:
  64. - TZ=Asia/Shanghai
  65. hostname: logstash
  66. restart: always
  67. depends_on:
  68. - elasticsearch
  69. ports:
  70. - 9600:9600
  71. - 5044:5044
  72. volumes:
  73. esdata:
  74. driver: local
  75. #链接:https://www.jianshu.com/p/24f6548de113

logstash5 配置文件

  1. input {
  2. file {
  3. path => "/var/log/httpd/access_log"
  4. type => "http"
  5. start_position => "beginning"
  6. }
  7. file {
  8. path => "/usr/local/nginx/logs/elk.access.log"
  9. type => "nginx"
  10. start_position => "beginning"
  11. }
  12. file {
  13. path => "/var/log/secure"
  14. type => "secure"
  15. start_position => "beginning"
  16. }
  17. file {
  18. path => "/var/log/messages"
  19. type => "system"
  20. start_position => "beginning"
  21. }
  22. }
  23. output {
  24. if [type] == "http" {
  25. redis {
  26. host => "192.168.1.202"
  27. password => 'test'
  28. port => "6379"
  29. db => "6"
  30. data_type => "list"
  31. key => 'nagios_http'
  32. }
  33. }
  34. if [type] == "nginx" {
  35. redis {
  36. host => "192.168.1.202"
  37. password => 'test'
  38. port => "6379"
  39. db => "6"
  40. data_type => "list"
  41. key => 'nagios_nginx'
  42. }
  43. }
  44. if [type] == "secure" {
  45. redis {
  46. host => "192.168.1.202"
  47. password => 'test'
  48. port => "6379"
  49. db => "6"
  50. data_type => "list"
  51. key => 'nagios_secure'
  52. }
  53. }
  54. if [type] == "system" {
  55. redis {
  56. host => "192.168.1.202"
  57. password => 'test'
  58. port => "6379"
  59. db => "6"
  60. data_type => "list"
  61. key => 'nagios_system'
  62. }
  63. }
  64. }
  65. # # /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/full.conf

logstash7 部分配置参考

  1. { generator
  2. { message => stdin codec => json }
  3. }
  4. filter {
  5. mutate {
  6. rename => { "[foo][bar]" => "hello" }
  7. }
  8. }
  9. input{
  10. stdin{codec => json_lines}
  11. }
  12. filter{
  13. mutate{
  14. rename => {
  15. "[f1][f2]" => "f3"
  16. }
  17. }
  18. }
  19. output{
  20. stdout{
  21. codec => rubydebug{}
  22. }
  23. }

kafka测试

  1. https://www.cnblogs.com/xiao987334176/p/10075659.html
  2. /usr/local/kafka/bin/kafka-topics.sh --create --zookeeper 172.16.1.245:2181,172.16.1.243:2181,172.16.1.244:2181/kafka --replication-factor 3 --partitions 1 --topic test-topic
  3. /usr/local/kafka/bin/kafka-topics.sh --describe --zookeeper 172.16.1.245:2181,172.16.1.243:2181,172.16.1.244:2181/kafka --topic test-topic
  4. 作者:杨赟快跑
  5. 链接:https://www.jianshu.com/p/bdd9608df6b3
  6. /usr/local/kafka/bin/zookeeper-server-start.sh /usr/local/kafka/config/zookeeper.properties
  7. /usr/local/kafka/bin/kafka-server-start.sh /usr/local/kafka/config/server.properties &
  8. kill -9 `jps |grep afka |awk '{print $1}'`
  9. grep -v '^$' server.properties |grep -v '^#'
  10. ll /usr/local/kafka/zookeeper/

7.5.4 filebeat7.yml

  1. filebeat.inputs:
  2. - type: log
  3. enabled: true
  4. # Paths that should be crawled and fetched. Glob based paths.
  5. paths:
  6. - /opt/log/games/*/*.log
  7. ### Multiline options
  8. multiline.pattern: '^[0-9]{4}'
  9. multiline.negate: true
  10. multiline.match: after
  11. #exclude_files: ["[0-9]{4}-[0-9]{2}-[0-9]{2}.[0-9]{3}.log$"]
  12. tags: ["games"]
  13. #================================ Logging =====================================
  14. # Sets log level. The default log level is info.
  15. # Available log levels are: error, warning, info, debug
  16. logging.level: info
  17. logging.to_files: true
  18. logging.files:
  19. path: /opt/log/filebeat7
  20. name: filebeat.log
  21. ######output for kafka#######
  22. output.kafka:
  23. hosts: ["kafka-s1.demain.com:9093","kafka-s2.demain.com:9093","kafka-s3.demain.com:9093"]
  24. topic: 'GAMES-NZ'
  25. partition.round_robin:
  26. reachable_only: false
  27. enabled: true
  28. required_acks: 1
  29. max_message_bytes: 100000000
  30. version: "0.10"
  31. keep_alive: 60s
  32. compression: gzip
  33. flush_interval: 10s
  34. #######ssl########
  35. ssl.certificate_authorities: "/usr/local/filebeat/keytool/myca.pem"
  36. ssl.certificate: "/usr/local/filebeat/keytool/client1.pem"
  37. ssl.key: "/usr/local/filebeat/keytool/client1-key.pem"

7.5.5 kibana dev tools

  1. # Dev Tools
  2. ## 入门简介
  3. https://www.cnblogs.com/ginb/p/6637236.html
  4. ## 官方api
  5. https://www.elastic.co/guide/en/elasticsearch/reference/7.3/cat-health.html
  6. ## 集群信息
  7. GET /_cluster/stats?pretty
  8. ## 分片大小
  9. GET /_cat/shards?v
  10. # GET _cat/shards?h=index,shard,prirep,state,unassigned.reason
  11. index shard prirep state docs store ip node
  12. games-nz_ydwx-2020.11.04 0 r STARTED 12059 3.5mb 172.16.1.68 es_node-1
  13. games-nz_ydwx-2020.11.04 0 p STARTED 12059 3.4mb 172.16.1.64 es_node-3
  14. ## 列出所有索引
  15. GET /_cat/indices?v
  16. # GET /_cat/indices?v&s=pri.store.size
  17. # GET /_cat/indices?v&s=pri.store.size:desc
  18. health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
  19. green open games-nz_hf-2020.11.03 xWdlWq58RPSjpd7LcA2Ipw 1 1 26337502 0 18.8gb 9.4gb
  20. green open games-nz_hf-2020.11.09 Ozy8LS54TKuyEK8mmLMOqA 1 1 1808980 0 1.5gb 769.3mb
  21. green open audit-2020.10.25 AggdiOSwQXW0R0EWlNAUig 1 1 186 0 276.8kb 138.4kb
  22. ## 是否健康
  23. GET /_cat/health?v
  24. ## 返回 bank 索引中的所有文档
  25. GET /bank/_search?q=*&sort=account_number:asc&pretty
  26. ## ElasticSearch优化整理
  27. https://www.jianshu.com/p/45a15ca1114f

7.5.8 py es api

  1. #pip3 install elasticsearch
  2. #https://www.cnblogs.com/xiao987334176/p/10130712.html
  3. from elasticsearch import Elasticsearch
  4. es = Elasticsearch(['10.10.13.12'], http_auth=('xiao', '123456'), timeout=3600)
  5. es.search(index='logstash-2015.08.20', q='http_status_code:5* AND server_name:"web1"', from_='124119')

7.6 prometheus - docker

  1. ##

7.6.8 py prom api

  1. ##

py alert api

  1. ##
  2. GET /-/healthy
  3. GET /-/ready
  4. POST /-/reload
  5. curl -u monitor:fosafer.com 127.0.0.1:9093/-/healthy
  6. curl -XPOST 127.0.0.1:9093/-/reload
  7. curl -XPOST -u monitor:fosafer.com 127.0.0.1:9093/-/reload

八、Prometheus

8.1 prometheus安装

  1. tar xf
  2. mkdir /opt/prometheus/

8.2 promql语法

  1. ### 11xxx 的在线redis
  2. redis_up{redis_host=~".*:11[0-9]{3}"}
  3. ### prometheus监控 promsql的常用的几个的写法
  4. ## 监控CPU的使用率
  5. 100 - (avg by (instance) (irate(node_cpu{instance="10.3.51.200:9100", mode="idle"}[1m])) * 100)
  6. ## CPU各个mode的占用率
  7. avg by (instance, mode) (irate(node_cpu{instance="10.3.51.200:9100"}[1m])) * 100
  8. usercpu花了多少比率运行用户态空间,也就是用户进程占比。用户空间程序是不属于内核的任何进程。
  9. systemCPU花了多少比率运行内核空间。所有进程和系统资源都有liunx内核处理。
  10. iowait:读写磁盘的操作比CPU的运行时间慢,CPU负载处理数据,而数据一般在磁盘上需要读到内存中才能处理。当CPU发起读写操作后,需要等着磁盘驱动器将数据读入内存,从而导致CPU等待一段时间无事可做。CPU处于这种状态的等待时间就是iowait时间。
  11. idleCPU处于空闲状态的时间比例 irqsoftirq:处理器为中断服务的时间。
  12. irq用于硬件中断,
  13. softirq用于软件中断。
  14. Nice:用户空间进程的CPU的调度优先级,可以通过调整期优先级来调整用户空间的优先级。
  15. ## 机器一分钟的平均负载
  16. node_load1{instance="10.3.51.200:9100"}
  17. ## 内存使用率
  18. 100 - ((node_memory_MemFree{instance="10.3.51.200:9100"}+node_memory_Cached{instance="10.3.51.200:9100"}+node_memory_Buffers{instance="10.3.51.200:9100"})/node_memory_MemTotal) * 100
  19. ### 带宽监控
  20. ## 上行带宽
  21. sum by (instance) (irate(node_network_receive_bytes{instance="10.3.51.200:9100",device!~"bond.*?|lo"}[1m])/128)
  22. ## 下行带宽
  23. sum by (instance) (irate(node_network_transmit_bytes{instance="10.3.51.200:9100",device!~"bond.*?|lo"}[1m])/128)
  24. ## 入包量
  25. sum by (instance) (rate(node_network_receive_bytes{instance="10.3.51.200:9100",device!="lo"}[1m]))
  26. ## 出包量
  27. sum by (instance) (rate(node_network_transmit_bytes{instance="10.3.51.200:9100",device!="lo"}[1m]))
  28. ## 磁盘使用率
  29. 100 - node_filesystem_free{instance="10.3.51.200:9100",fstype!~"rootfs|selinuxfs|autofs|rpc_pipefs|tmpfs|udev|none|devpts|sysfs|debugfs|fuse.*"} / node_filesystem_size{instance="10.3.51.200:9100",fstype!~"rootfs|selinuxfs|autofs|rpc_pipefs|tmpfs|udev|none|devpts|sysfs|debugfs|fuse.*"} * 100
  30. ## 平均请求数
  31. rate(http_requests_total{instance="10.3.51.200:9100"}[1m])
  32. 原文:https://blog.csdn.net/sunyuhua_keyboard/article/details/81302165
  33. 版权声明:本文为博主原创文章,转载请附上博文链接!
  34. ### 函数列表一些函数有默认的参数,例如:
  35. year(v=vector(time()) instant-vector)
  36. v是参数值,instant-vector是参数类型。
  37. vector(time())是默认值。
  38. abs()
  39. abs(v instant-vector)返回输入向量的所有样本的绝对值。
  40. absent()
  41. absent(v instant-vector),如果赋值给它的向量具有样本数据,则返回空向量;如果传递的瞬时向量参数没有样本数据,则返回不带度量指标名称且带有标签的样本值为1的结果当监控度量指标时,如果获取到的样本数据是空的, 使用absent方法对告警是非常有用的
  42. absent(nonexistent{job="myjob"}) # => key: value = {job="myjob"}:
  43. absent(nonexistent{job="myjob", instance=~".*"}) # => {job="myjob"} 1 so smart !
  44. absent(sum(nonexistent{job="myjob"})) # => key:value {}: 0
  45. ceil()
  46. ceil(v instant-vector) 是一个向上舍入为最接近的整数。
  47. changes()
  48. changes(v range-vector) 输入一个范围向量, 返回这个范围向量内每个样本数据值变化的次数。
  49. clamp_max()
  50. clamp_max(v instant-vector, max scalar)函数,输入一个瞬时向量和最大值,样本数据值若大于max,则改为max,否则不变
  51. clamp_min()
  52. clamp_min(v instant-vector)函数,输入一个瞬时向量和最大值,样本数据值小于min,则改为min。否则不变
  53. count_saclar()
  54. count_scalar(v instant-vector) 函数, 输入一个瞬时向量,返回key:value="scalar": 样本个数。而count()函数,输入一个瞬时向量,返回key:value=向量:样本个数,其中结果中的向量允许通过by条件分组。
  55. day_of_month()
  56. day_of_month(v=vector(time()) instant-vector)函数,返回被给定UTC时间所在月的第几天。返回值范围:1~31
  57. day_of_week()
  58. day_of_week(v=vector(time()) instant-vector)函数,返回被给定UTC时间所在周的第几天。返回值范围:0~6. 0表示星期天。
  59. days_in_month()
  60. days_in_month(v=vector(time()) instant-vector)函数,返回当月一共有多少天。返回值范围:28~31.
  61. delta()
  62. delta(v range-vector)函数,计算一个范围向量v的第一个元素和最后一个元素之间的差值。返回值:key:value=度量指标:差值下面这个表达式例子,返回过去两小时的CPU温度差:delta(cpu_temp_celsius{host="zeus"}[2h])delta函数返回值类型只能是gauges
  63. deriv()
  64. deriv(v range-vector)函数,计算一个范围向量v中各个时间序列二阶导数,使用简单线性回归deriv二阶导数返回值类型只能是gauges
  65. drop_common_labels()
  66. drop_common_labels(instant-vector)函数,输入一个瞬时向量,返回值是key:value=度量指标:样本值,其中度量指标是去掉了具有相同标签。
  67. 例如:
  68. http_requests_total{code="200", host="127.0.0.1:9090", method="get"} : 4,
  69. http_requests_total{code="200", host="127.0.0.1:9090", method="post"} : 5,
  70. 返回值: http_requests_total{method="get"} : 4, http_requests_total{code="200", method="post"} : 5
  71. exp()
  72. exp(v instant-vector)函数,输入一个瞬时向量, 返回各个样本值的e指数值,即为e^N次方。特殊情况如下所示:Exp(+inf) = +Inf Exp(NaN) = NaNfloor()floor(v instant-vector)函数,与ceil()函数相反。 4.3 4
  73. histogram_quantile()
  74. histogram_quatile float, b instant-vector) 函数计算b向量的φ-直方图 (0 φ 1) 。参考中文文献[https://www.howtoing.com/how-to-query-prometheus-on-ubuntu-14-04-part-2/]
  75. holt_winters()
  76. holt_winters(v range-vector, sf scalar, tf scalar)函数基于范围向量v,生成事件序列数据平滑值。平滑因子sf越低, 对老数据越重要。趋势因子tf越高,越多的数据趋势应该被重视。0< sf, tf <=1 holt_winters仅用于gaugeshour()hour(v=vector(time()) instant-vector)函数返回被给定UTC时间的当前第几个小时,时间范围:0~23
  77. idelta()
  78. idelta(v range-vector)函数,输入一个范围向量,返回key: value = 度量指标: 每最后两个样本值差值。
  79. increase()
  80. increase(v range-vector)函数, 输入一个范围向量,返回:key:value = 度量指标:last值-first值,自动调整单调性,
  81. 如:服务实例重启,则计数器重置。与delta()不同之处在于delta是求差值,而increase返回最后一个减第一个值,可为正为负。下面的表达式例子,返回过去5分钟,连续两个时间序列数据样本值的http请求增加值。
  82. increase(http_requests_total{job="api-server"}[5m])increase的返回值类型只能是counters,主要作用是增加图表和数据的可读性,使用rate记录规则的使用率,以便持续跟踪数据样本值的变化。
  83. irateirate(v range-vector)函数, 输入:范围向量,输出:key: value = 度量指标: (last值-last前一个值)/时间戳差值。它是基于最后两个数据点,自动调整单调性, 如:服务实例重启,则计数器重置。下面表达式针对范围向量中的每个时间序列数据,返回两个最新数据点过去5分钟的HTTP请求速率。
  84. irate(http_requests_total{job="api-server"}[5m])irate只能用于绘制快速移动的计数器。因为速率的简单更改可以重置FOR子句,利用警报和缓慢移动的计数器,完全由罕见的尖峰组成的图形很难阅读。
  85. label_replace()对于v中的每个时间序列,
  86. label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string) 将正则表达式与标签值src_label匹配。如果匹配,则返回时间序列,标签值dst_label被替换的扩展替换。$1替换为第一个匹配子组,$2替换为第二个等。如果正则表达式不匹配,则时间序列不会更改。另一种更容易的理解是:label_replace函数,输入:瞬时向量,输出:key: value = 度量指标: 值(要替换的内容:首先,针对src_label标签,对该标签值进行regex正则表达式匹配。如果不能匹配的度量指标,则不发生任何改变;否则,如果匹配,则把dst_label标签的标签纸替换为replacement 下面这个例子返回一个向量值a带有foo标签:
  87. label_replace(up{job="api-server", serice="a:c"}, "foo", "$1", "service", "(.):.")
  88. ln()
  89. ln(v instance-vector)计算瞬时向量v中所有样本数据的自然对数。特殊例子:ln(+Inf) = +Inf ln(0) = -Inf ln(x<0) = NaN ln(NaN) = NaN
  90. log2()
  91. log2(v instant-vector)函数计算瞬时向量v中所有样本数据的二进制对数。
  92. log10()
  93. log10(v instant-vector)函数计算瞬时向量v中所有样本数据的10进制对数。相当于ln()minute()minute(v=vector(time()) instant-vector)函数返回给定UTC时间当前小时的第多少分钟。结果范围:0~59
  94. month()
  95. month(v=vector(time()) instant-vector)函数返回给定UTC时间当前属于第几个月,结果范围:0~12
  96. predict_linear()
  97. predict_linear(v range-vector, t scalar)预测函数,输入:范围向量和从现在起t秒后,输出:不带有度量指标,只有标签列表的结果值。例如:predict_linear(http_requests_total{code="200",instance="120.77.65.193:9090",job="prometheus",method="get"}[5m], 5)
  98. 结果:
  99. {code="200",handler="query_range",instance="120.77.65.193:9090",job="prometheus",method="get"} 1
  100. {code="200",handler="prometheus",instance="120.77.65.193:9090",job="prometheus",method="get"} 4283.449995397104
  101. {code="200",handler="static",instance="120.77.65.193:9090",job="prometheus",method="get"} 22.99999999999999
  102. {code="200",handler="query",instance="120.77.65.193:9090",job="prometheus",method="get"} 130.90381188596754
  103. {code="200",handler="graph",instance="120.77.65.193:9090",job="prometheus",method="get"} 2
  104. {code="200",handler="label_values",instance="120.77.65.193:9090",job="prometheus",method="get"} 2
  105. rate()
  106. rate(v range-vector)函数, 输入:范围向量,输出:key: value = 不带有度量指标,且只有标签列表:(last值-first值)/时间差srate(http_requests_total[5m])结果:{code="200",handler="label_values",instance="120.77.65.193:9090",job="prometheus",method="get"} 0{code="200",handler="query_range",instance="120.77.65.193:9090",job="prometheus",method="get"} 0{code="200",handler="prometheus",instance="120.77.65.193:9090",job="prometheus",method="get"} 0.2{code="200",handler="query",instance="120.77.65.193:9090",job="prometheus",method="get"} 0.003389830508474576{code="422",handler="query",instance="120.77.65.193:9090",job="prometheus",method="get"} 0{code="200",handler="static",instance="120.77.65.193:9090",job="prometheus",method="get"} 0{code="200",handler="graph",instance="120.77.65.193:9090",job="prometheus",method="get"} 0{code="400",handler="query",instance="120.77.65.193:9090",job="prometheus",method="get"} 0rate()函数返回值类型只能用counters 当用图表显示增长缓慢的样本数据时,这个函数是非常合适的。注意:当rate函数和聚合方式联合使用时,一般先使用rate函数,再使用聚合操作, 否则,当服务实例重启后,rate无法检测到counter重置。
  107. resets()
  108. resets()函数, 输入:一个范围向量,输出:key-value=没有度量指标,且有标签列表[在这个范围向量中每个度量指标被重置的次数]。在两个连续样本数据值下降,也可以理解为counter被重置。 示例:resets(http_requests_total[5m])结果:{code="200",handler="label_values",instance="120.77.65.193:9090",job="prometheus",method="get"} 0{code="200",handler="query_range",instance="120.77.65.193:9090",job="prometheus",method="get"} 0{code="200",handler="prometheus",instance="120.77.65.193:9090",job="prometheus",method="get"} 0{code="200",handler="query",instance="120.77.65.193:9090",job="prometheus",method="get"} 0{code="422",handler="query",instance="120.77.65.193:9090",job="prometheus",method="get"} 0{code="200",handler="static",instance="120.77.65.193:9090",job="prometheus",method="get"} 0{code="200",handler="graph",instance="120.77.65.193:9090",job="prometheus",method="get"} 0{code="400",handler="query",instance="120.77.65.193:9090",job="prometheus",method="get"} 0resets只能和counters一起使用。
  109. round()
  110. round(v instant-vector, to_nearest 1= scalar)函数,与ceilfloor函数类似,输入:瞬时向量,输出:指定整数级的四舍五入值, 如果不指定,则是1以内的四舍五入。
  111. scalar()
  112. scalar(v instant-vector)函数, 输入:瞬时向量,输出:key: value = scalar”, 样本值[如果度量指标样本数量大于1或者等于0, 则样本值为NaN, 否则,样本值本身]
  113. sort()
  114. sort(v instant-vector)函数,输入:瞬时向量,输出:key: value = 度量指标:样本值[升序排列]
  115. sort_desc()
  116. sort_desc(v instant-vector)函数,输入:瞬时向量,输出:key: value = 度量指标:样本值[降序排列]
  117. sqrt()
  118. sqrt(v instant-vector)函数,输入:瞬时向量,输出:key: value = 度量指标: 样本值的平方根
  119. time()
  120. time()函数,返回从1970-01-01到现在的秒数,注意:它不是直接返回当前时间,而是时间戳
  121. vector()
  122. vector(s scalar)函数,返回:key: value= {}, 传入参数值
  123. year()
  124. year(v=vector(time()) instant-vector), 返回年份。_over_time()下面的函数列表允许传入一个范围向量,返回一个带有聚合的瞬时向量:
  125. avg_over_time(range-vector): 范围向量内每个度量指标的平均值。
  126. min_over_time(range-vector): 范围向量内每个度量指标的最小值。
  127. max_over_time(range-vector): 范围向量内每个度量指标的最大值。
  128. sum_over_time(range-vector): 范围向量内每个度量指标的求和值。
  129. count_over_time(range-vector): 范围向量内每个度量指标的样本数据个数。
  130. quantile_over_time(scalar, range-vector): 范围向量内每个度量指标的样本数据值分位数,φ-quantile (0 φ 1)
  131. stddev_over_time(range-vector): 范围向量内每个度量指标的总体标准偏差。
  132. stdvar_over_time(range-vector): 范围向量内每个度量指标的总体标准方差。
  133. 转自:https://github.com/1046102779/prometheus/blob/master/prometheus/querying/functions.md
  134. https://github.com/prometheus/prometheus/blob/master/docs/querying/functions.md
  135. irate(node_cpu[2m])
  136. irate(node_load1{instance="172.16.1.43:9301"}[8h])
  137. max(prometheus_http_request_duration_seconds_count{instance="129.211.99.141:9090"})
  138. max_over_time(prometheus_http_request_duration_seconds_count{instance="129.211.99.141:9090"}[2m])

8.5 Grafana

  1. 常用模板编号:
  2. node-exporter: cn/8919,en/11074
  3. k8s: 13105
  4. docker: 12831
  5. alertmanager: 9578
  6. blackbox_exportre: 9965

九、kubernetes

Kubernetes(k8s)中文文档 名称解释:Deployment_Kubernetes中文社区

  1. ####################
  2. https://zhuanlan.zhihu.com/p/53260098
  3. 怎么样?是不是很神奇?
  4. 所以,Docker的第二句口号就是:"Build once,Run anywhere(搭建一次,到处能用)"
  5. Docker技术的三大核心概念,分别是:
  6. 镜像(Image
  7. 容器(Container
  8. 仓库(Repository
  9. 一个K8S系统,通常称为一个K8S集群(Cluster),主要包括两个部分:
  10. 一个Master节点(主节点)
  11. 一群Node节点(计算节点)
  12. Master节点包括: API ServerSchedulerController manageretcd
  13. API Server是整个系统的对外接口,供客户端和其它组件调用,相当于"营业厅"
  14. Scheduler负责对集群内部的资源进行调度,相当于"调度室"
  15. Controller manager负责管理控制器,相当于"大总管"
  16. Node节点包括Dockerkubeletkube-proxyFluentdkube-dns(可选),还有就是Pod
  17. PodKubernetes最基本的操作单元。一个Pod代表着集群中运行的一个进程,它内部封装了一个或多个紧密相关的容器。除了Pod之外,K8S还有一个Service的概念,一个Service可以看作一组提供相同服务的Pod的对外访问接口。这段不太好理解,跳过吧。
  18. Docker,不用说了,创建容器的。
  19. Kubelet,主要负责监视指派到它所在Node上的Pod,包括创建、修改、监控、删除等。
  20. Kube-proxy,主要负责为Pod对象提供代理。
  21. Fluentd,主要负责日志收集、存储与查询。

9.1 kubeadm 安装k8s

9.1.1 机器初始化(准备环境)

  1. ### 关闭防火墙:
  2. systemctl stop firewalld
  3. systemctl disable firewalld
  4. ### 关闭selinux:
  5. sed -i 's/enforcing/disabled/' /etc/selinux/config
  6. setenforce 0
  7. ### 关闭swap:
  8. swapoff -a #临时
  9. sed -i '/swap/ s/^\(.*\)$/#\1/g' /etc/fstab
  10. ### vim /etc/fstab 永久
  11. ### 添加主机名与IP对应关系(记得设置主机名):
  12. ## hostnamectl --static set-hostname k8s-node02
  13. cat >> /etc/hosts <<EOF
  14. 192.168.204.140 k8s-master
  15. 192.168.204.141 k8s-node1
  16. 192.168.204.142 k8s-node2
  17. EOF
  18. ### 将桥接的IPv4流量传递到iptables的链:
  19. cat > /etc/sysctl.d/k8s.conf << EOF
  20. net.bridge.bridge-nf-call-ip6tables = 1
  21. net.bridge.bridge-nf-call-iptables = 1
  22. EOF
  23. sysctl --system
  24. yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget
  25. ### repo配置
  26. mkdir /etc/yum.repo.d/bak
  27. mv /etc/yum.repo.d/*.repo /etc/yum.repo.d/bak
  28. wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
  29. wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
  30. wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  31. ### 安装指定版本的docker
  32. yum makecache
  33. yum -y install docker-ce-18.06.1.ce-3.el7
  34. systemctl enable docker && systemctl start docker
  35. docker --version
  36. ### 配置k8s repo
  37. cat > /etc/yum.repos.d/kubernetes.repo << EOF
  38. [kubernetes]
  39. name=Kubernetes
  40. baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
  41. enabled=1
  42. gpgcheck=0
  43. repo_gpgcheck=0
  44. gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
  45. EOF
  46. ### 4.3 安装kubeadm,kubelet和kubectl
  47. ### 由于版本更新频繁,这里指定版本号部署:
  48. yum install -y kubelet-1.15.2 kubeadm-1.15.2 kubectl-1.15.2
  49. systemctl enable kubelet && systemctl start kubelet

9.1.2 master部署

  1. ### 在192.168.204.140 (Master)执行。
  2. kubeadm init \
  3. --apiserver-advertise-address=192.168.204.140 \
  4. --image-repository registry.aliyuncs.com/google_containers \
  5. --kubernetes-version v1.15.0 \
  6. --service-cidr=10.1.0.0/16 \
  7. --pod-network-cidr=10.244.0.0/16
  8. ### 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址。
  9. ### 使用kubectl工具:
  10. ## bash
  11. mkdir -p $HOME/.kube
  12. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  13. sudo chown $(id -u):$(id -g) $HOME/.kube/config
  14. kubectl get nodes
  15. kubectl get pods -A
  16. ## 6. 安装Pod网络插件(CNI)
  17. ## kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c1141408878db11b/Documentation/kube-flannel.yml
  18. kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
  19. ## https://www.cnblogs.com/hongdada/p/11395200.html
  20. docker pull quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64
  21. docker tag quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64 quay.io/coreos/flannel:v0.11.0-amd64
  22. docker rmi quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64
  23. 海外服务器执行:
  24. docker save gcr.io/google_containers/kubernetes-dashboard-amd64:v1.5.1 > dashboard.tar
  25. docker save registry.access.redhat.com/rhel7/pod-infrastructure:latest > podinfrastructure.tar
  26. scp *.tar root@你国内的外网IP:/home/tar
  27. 各个node上执行:
  28. docker load < dashboard.tar
  29. docker load < podinfrastructure.tar
  30. [root@k8s-master01 ~]# kubectl get pods -A -o wide
  31. NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  32. kube-system coredns-bccdc95cf-rbpfs 0/1 Pending 0 28m <none> <none> <none> <none>
  33. kube-system coredns-bccdc95cf-tsdf6 0/1 Pending 0 28m <none> <none> <none> <none>
  34. kube-system etcd-k8s-master01 1/1 Running 0 28m 192.168.204.140 k8s-master01 <none> <none>
  35. kube-system kube-apiserver-k8s-master01 1/1 Running 0 28m 192.168.204.140 k8s-master01 <none> <none>
  36. kube-system kube-controller-manager-k8s-master01 1/1 Running 1 28m 192.168.204.140 k8s-master01 <none> <none>
  37. kube-system kube-flannel-ds-amd64-4jqnj 0/1 Init:ImagePullBackOff 0 19m 192.168.204.140 k8s-master01 <none> <none>
  38. kube-system kube-proxy-rpl4s 1/1 Running 0 28m 192.168.204.140 k8s-master01 <none> <none>
  39. kube-system kube-scheduler-k8s-master01 1/1 Running 1 28m 192.168.204.140 k8s-master01 <none> <none>
  40. ### 确保能够访问到quay.io这个registery。
  41. ### 如果下载失败,可以改成这个镜像地址:lizhenliang/flannel:v0.11.0-amd64
  42. kubectl delete pods kube-flannel-ds-amd64-4jqnj -n kube-system

9.1.3 node部署

  1. ## 在192.168.204.141/142 (Node)执行。
  2. ## 向集群添加新节点,执行在kubeadm init输出的kubeadm join命令:
  3. kubeadm join 192.168.204.140:6443 --token vr3h2n.8tq4754f0qugtesu \
  4. --discovery-token-ca-cert-hash sha256:a300b8ebdb144938a3aabbba76bc98968c9546ebb9083445b764ea037b172503
  5. ## master 执行 get pods -A 发现flannel自动注册
  6. kube-system kube-flannel-ds-amd64-m8vvw 1/1 Running 1 35s

9.1.4 测试集群

  1. ### 在Kubernetes集群中创建一个pod,验证是否正常运行:
  2. kubectl create deployment nginx --image=nginx
  3. kubectl expose deployment nginx --port=80 --type=NodePort
  4. kubectl get pod,svc
  5. ### 访问地址:http://NodeIP:Port
  6. http://192.168.204.135:30586/

9.1.5 部署dashboard

  1. docker pull sacred02/kubernetes-dashboard-amd64:v1.10.1
  2. docker tag sacred02/kubernetes-dashboard-amd64:v1.10.1 k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1
  3. docker rmi sacred02/kubernetes-dashboard-amd64:v1.10.1
  4. kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
  5. ### 默认镜像国内无法访问,修改镜像地址为: lizhenliang/kubernetes-dashboard-amd64:v1.10.1
  6. ### 默认Dashboard只能集群内部访问,修改 Service 为 NodePort 类型,暴露到外部:
  7. kind: Service
  8. apiVersion: v1
  9. metadata:
  10. labels:
  11. k8s-app: kubernetes-dashboard
  12. name: kubernetes-dashboard
  13. namespace: kube-system
  14. spec:
  15. type: NodePort
  16. ports:
  17. - port: 443
  18. targetPort: 8443
  19. nodePort: 30001
  20. selector:
  21. k8s-app: kubernetes-dashboard
  22. kubectl apply -f kubernetes-dashboard.yaml
  23. 访问地址:http://NodeIP:30001
  24. ### 创建service account并绑定默认cluster-admin管理员集群角色:
  25. kubectl create serviceaccount dashboard-admin -n kube-system
  26. kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
  27. kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
  28. 使用输出的token登录Dashboard
  29. ### 更新https证书有效期,解决只能由火狐浏览器访问,其他浏览器无法访问问题
  30. ### https://www.cnblogs.com/xiajq/p/11322568.html
  31. mkdir key && cd key
  32. openssl genrsa -out dashboard.key 2048
  33. openssl req -new -out dashboard.csr -key dashboard.key -subj '/CN=172.19.0.48'
  34. openssl x509 -req -in dashboard.csr -signkey dashboard.key -out dashboard.crt
  35. kubectl delete secret kubernetes-dashboard-certs -n kube-system
  36. kubectl create secret generic kubernetes-dashboard-certs --from-file=dashboard.key --from-file=dashboard.crt -n kube-system #新的证书
  37. kubectl delete pod kubernetes-dashboard-746dfd476-b2r5f -n kube-system #重启服务

9.2 rancher安装k8s

  1. yum -y install docker-ce-18.06.1.ce-3.el7
  2. ## 18.06.1-ce
  3. wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
  4. yum makecache
  5. yum list docker-ce --showduplicates | sort -r
  6. yum install docker-ce-18.09.1.ce-3.el7
  7. systemctl enable docker && systemctl start docker
  8. docker version
  9. rm -rf /opt/apps/rancher
  10. docker run -d --restart=unless-stopped -v /opt/apps/rancher:/var/lib/rancher/ -p 80:80 -p 443:443 rancher/rancher
  11. sudo docker run -d --privileged --restart=unless-stopped --net=host -v /etc/kubernetes:/etc/kubernetes -v /var/run:/var/run rancher/rancher-agent:v2.4.5 --server https://192.168.204.222 --token 8jnbplvpmfh2whfl8vdjrlqzpnjj8nmvvxstrq9bkh7zc9d2g54xgm --ca-checksum 4cf464173b12436e203b80dc537a1db4543e87c6cf17c4a2e34bfde51b843c37 --node-name master222 --internal-address 192.168.204.222 --etcd --controlplane --worker
  12. sudo docker run -d --privileged --restart=unless-stopped --net=host -v /etc/kubernetes:/etc/kubernetes -v /var/run:/var/run rancher/rancher-agent:v2.4.5 --server https://192.168.204.222 --token xc8v54vtsfc4gv8x6lvzjsdh8l9h8jd6jgkvtngv9rc724fm96wqk2 --ca-checksum ca0c7092f76162c056f79a7bdffe439cdfd7f74b298e2831b3d9792f0fda798f --node-name master222 --internal-address 192.168.204.222 --etcd --controlplane --worker
  13. ## 镜像的导入和导出
  14. docker save rancher/rke-tools:v0.1.59 > tools.tar
  15. docker save rancher/coreos-etcd:v3.4.3-rancher1 > etcd.tar
  16. docker load < etcd.tar
  17. docker load < tools.tar

9.9 排除 001 cluster-dns问题

  1. 修改/usr/lib/systemd/system/kubelet.service 参数:cluster-dns cluster-domain
  2. kubectl describe pod kubernetes-dashboard-746dfd476-mdv5n -n kube-system
  3. ## 报错:kubelet does not have ClusterDNS IP configured and cannot create PodJ解决方案
  4. [root@VM_0_48_centos dashboard]# cat /usr/lib/systemd/system/kubelet.service
  5. [Unit]
  6. Description=Kubernetes Kubelet
  7. After=docker.service
  8. Requires=docker.service
  9. [Service]
  10. EnvironmentFile=/opt/kubernetes/cfg/kubelet
  11. ExecStart=/opt/kubernetes/bin/kubelet $KUBELET_OPTS
  12. Restart=on-failure
  13. KillMode=process
  14. [Install]
  15. WantedBy=multi-user.target
  16. [root@VM_0_48_centos dashboard]# cat /opt/kubernetes/cfg/kubelet
  17. KUBELET_OPTS="--logtostderr=true \
  18. --v=4 \
  19. --hostname-override=172.19.0.48 \
  20. --cluster-dns=10.0.0.2 \ ### 配置dns
  21. --cluster-domain=cluster.local \ ###配置域名
  22. --kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig \
  23. --bootstrap-kubeconfig=/opt/kubernetes/cfg/bootstrap.kubeconfig \
  24. --cert-dir=/opt/kubernetes/ssl \
  25. --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0"
  26. 修改完以后,重启服务发现正常
  27. ## k8s dashboard 安装和证书更新
  28. https://www.cnblogs.com/xiajq/p/11322568.html
  29. ## Kubernetes的Deployment与ReplicaSet了解与基础操作
  30. https://cloud.tencent.com/developer/article/1347201
  31. Deployment是新一代用于Pod管理的对象,与Replication Controller相比,它提供了更加完善的功能,使用起来更加简单方便。
  32. ## 比较 Deployment 与 ReplicaSet
  33.   ReplicaSet 也是用来管理多个 Pod 的副本,那么 Deployment ReplicaSet 的区别在哪里呢?
  34.   当我们创建了 Deployment 之后,实际上也创建了 ReplicaSet,所以说 Deployment 管理着 ReplicaSet(实际上 Deployment ReplicaSet 有着更多功能)
  35. #Deployment 管理着 ReplicaSet,因此当 Deployment 伸缩时,由它管理的 ReplicaSet 也会发生伸缩:
  36. 但反过来,如果我们直接伸缩 ReplicaSet,那么 Deployment 也会相应发生伸缩吗?答案是不会的。
  37. kubectl apply -f nginx-deployment.yaml
  38. kubectl rollout status deployments nginx-deployment
  39. kubectl edit deploy nginx-service
  40. kubectl rollout history deployment nginx-service
  41. kubectl rollout history deployment nginx-service --revision=2
  42. kubectl rollout history deployment nginx-service --revision=1
  43. ## 假设我们想回滚到上一个版本,上一个版本的版本号是 1,那么可以执行:
  44. kubectl rollout undo deployments nginx-service --to-revision=1
  45. ## k8s证书
  46. https://www.cnblogs.com/centos-python/articles/11043570.html
  47. ## k8s 使用篇 - deployment
  48. ## https://my.oschina.net/u/914655/blog/1635492
  49. ## https://blog.csdn.net/weixin_34268753/article/details/89586977
  50. Deployment管理PodsReplicaSets,提供声明式更新。和老的ReplicationController(命令式管理)对应,发展趋势是取代老的,所以后面也不会起文章单独讨论ReplicationController了。

项目实战

000 LVS+Keepalive双机热备

  1. ## keepalived工作原理 https://www.cnblogs.com/xiangsikai/p/8436431.html
  2.   keepalived是集群管理中保证集群高可用的一个服务软件,其功能类似于heartbeat,用来防止单点故障。
  3.   keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。
  4.   虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backupmaster上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backupmaster。这样的话就可以保证路由器的高可用了。
  5.   keepalived主要有三个模块,分别是corecheckvrrpcore模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。
  6. ## 安装keepalived
  7. yum -y install keepalived* ipvsadm
  8. ## 加载内核模块
  9. modprobe ip_vs
  10. ## 备份配置文件
  11. mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf_bak
  12. cat /etc/keepalived/keepalived.conf
  13. global_defs {
  14. router_id LVS_TEST #服务器名字
  15. }
  16. vrrp_instance VI_1 {
  17. state MASTER #配置主备,备用机此配置项为BACKUP
  18. interface enp0s3 #指定接口
  19. virtual_router_id 51 #指定路由ID,主备必须一样
  20. priority 101 #设置优先级,主略高于备份
  21. advert_int 1 #设置检查时间
  22. authentication {
  23. auth_type PASS #设置验证加密方式
  24. auth_type 1234 #设置验证密码
  25. }
  26. virtual_ipaddress {
  27. 192.168.31.200
  28. }
  29. }
  30. virtual_server 192.168.31.200 80 {
  31. delay_loop 3 #健康检查时间
  32. lb_algo rr #LVS调度算法
  33. lb_kind DR #LVS工作模式
  34. !persistence 60 #是否保持连接,!不保持
  35. protocol TCP #服务采用TCP协议
  36. real_server 192.168.31.113 80 {
  37. weight 1 #权重
  38. TCP_CHECK { #TCP检查
  39. connect_port 80 #检查端口80
  40. connect_timeout 3 #超时时间3秒
  41. nb_get_retry 3 #重试次数3次
  42. delay_before_retry 4 #重试间隔4秒
  43. }
  44. }
  45. real_server 192.168.31.150 80 {
  46. weight 1
  47. TCP_CHECK {
  48. connect_port 80
  49. connect_timeout 3
  50. nb_get_retry 3
  51. delay_before_retry 4
  52. }
  53. }
  54. }
  55. ## 启动keepalived
  56. systemctl restart keepalived && systemctl enable keepalived

001 haproxy+keepalived 基于四层

  1. ## https://www.cnblogs.com/MacoLee/p/5853356.html
  2. HAProxybalance8种负载均衡算法:
  3. 1.roundrobin : 基于权重轮循。
  4. 2.static-rr : 基于权重轮循。静态算法,运行时改变无法生效
  5. 3.source : 基于请求源IP的算法。对请求的源IP进行hash运算,然后将结果与后端服务器的权重总数想除后转发至某台匹配服务器。使同一IP客户端请求始终被转发到某特定的后端服务器。
  6. 4.leastconn : 最小连接。(适合数据库负载均衡,不适合会话短的环境)
  7. 5.uri : 对部分或整体URI进行hash运算,再与服务器的总权重想除,最后转发到匹配后端。
  8. 6.uri_param : 根据URL路径中参数进行转发,保证在后端服务器数量不变的情况下,同一用户请求分发到同一机器。
  9. 7.hdr(<name>) : 根据http头转发,如果不存在http头。则使用简单轮循。

002 nginx+keepalived 基于七层

  1. ##

003 vue+git+docker+jenkins cicd

https://www.cnblogs.com/xiao987334176/p/12345304.html

004 Jenkins+Gitlab+Harbor+Rancher+k8s

https://www.cnblogs.com/xiao987334176/p/13074198.html

005 Docker通过EFK(Elasticsearch + Fluentd + Kibana)

https://www.cnblogs.com/xiao987334176/p/12376980.html

006 基于docker 搭建Prometheus+Grafana

  1. https://www.cnblogs.com/xiao987334176/p/9930517.html
  2. ## 几点思考
  3. 1node 主机的自动发现,端口自动发现
  4. 2redis 自动发现
  5. 3mysql 自动发现
  6. 4alertmanager

附: tips

001 时间格式化

  1. import datetime
  2. #获得当前时间
  3. now = datetime.datetime.now() ->这是时间数组格式
  4. #转换为指定的格式:
  5. otherStyleTime = now.strftime("%Y%m%d_%H%M%S")
  6. import time
  7. now_time = time.strftime('%Y-%m-%d %H:%M:%S')
  8. ## bash
  9. Now_Time=`(date +%Y%m%d%H%M%S)`
  10. NowStamp=`(date +%s)`
  11. echo "当前时间和当前时间戳" $Now_Time $NowStamp

002 check_url.sh

  1. #!/bin/bash
  2. ####################################################
  3. # Author: channel
  4. # Github: https://github.com/yes5144
  5. # Time: 2018-03-10 16:05:56# Version: V1.0
  6. # Description: This is just a test scripts
  7. ####################################################
  8. . /etc/init.d/functions
  9. check_count=0
  10. url_list=(http://www.baidu.com http://192.168.204.123 http://www.google.cn)
  11. function wait(){
  12. echo -n 'after 3 seconds, check url.'
  13. for ((i=0;i<3;i++))
  14. do
  15. echo -n "."; sleep 1
  16. done
  17. echo ''
  18. }
  19. function check_url(){
  20. wait
  21. for ((i=0; i<`echo ${#url_list[*]}`; i++))
  22. do
  23. wget -o /dev/null -T 3 --tries=1 --spider ${url_list[$i]} >/dev/null 2>&1
  24. if [ $? -eq 0 ]
  25. then
  26. action "${url_list[$i]}" /bin/true
  27. else
  28. action "${url_list[$i]}" /bin/false
  29. fi
  30. done
  31. echo ''
  32. ((check_count++))
  33. }
  34. main(){
  35. while true
  36. do
  37. check_url
  38. echo -e "\033[32m------- check count: ${check_count}-------\033[0m"
  39. sleep 10
  40. done
  41. }
  42. main

003 正则表达式(样例)

  1. ## sed正则表达式
  2. sed -e 's/:\+\s\+/:/' -e 's/ /_/g' -e '/^$/d' -e 's/[(%)]//g' -e '/^1/d' -e 's/[(*)]//g' /tmp/${RAND}.sql_out.temp > /tmp/${RAND}.sql_out.temp.1
  3. ## 后面还有一行:
  4. sed -ni 'H;${x;s/\n/ /g;p}' /tmp/${RAND}.sql_out.temp.1
  5. -e 's/:\+\s\+/:/' -e 's/ /_/g' 把每一行 第一次出现的 "连续 n 个 : 及 后面的m个空格" 替换成 : , 再把这一行中剩余的类似匹配内容替换成 _ , 其中 n >= 1, m>=1
  6. 比如如果某行的内容是sss:: ppp: MMM则替换后变成sss:ppp_MMM
  7. ## 然后
  8. -e '/^$/d'删除空行
  9. ## 然后
  10. -e 's/[(%)]//g' 把每行出现的 ( 或者 % 或者 ) 字符全部删除,
  11. 比如abc()% 被替换成 abc
  12. ## 然后
  13. -e '/^1/d' 以字符 1 开头的行删除
  14. ## 最后
  15. -e 's/[(*)]//'把每行第一次出现的 ( 或者 * 或者 ) 字符删除.
  16. 注意,上面的每一个 -e 命令处理的对象都是前一条 -e 命令处理完后的结果.
  17. 所以假定有一个文件内容为
  18. abc #unchanged line
  19. sss:: ppp: (M%MM)zzz :::: end # change to sss:ppp_MMMzzz_end
  20. 1me #this line will be deleted
  21. 2123(* #change to 2123
  22. end of file #unchanged
  23. ## 经过上面的命令后,变成
  24. abc #unchanged line
  25. sss:ppp_M%MMzzz _end # change to sss:ppp_MMMzzz _end
  26. 2123 #change to 2123
  27. end of file #unchanged
  28. Now_Time=`(date +%Y%m%d%H%M%S)`
  29. NowStamp=`(date +%s)`
  30. echo "当前时间和当前时间戳" $Now_Time $NowStamp
  31. #grep
  32. grep -E '([0-9]{1,}\.){3,}([0-9]{1,})' version*.txt --color
  33. #sed
  34. sed -i "s/\(\([0-9]\{1,\}\.\)\{3,\}\)\([0-9]\{1,\}\)/\1${Now_Time}/g" version*.txt

004 sh_echo_colorful.sh

  1. echo_r () {
  2. [ $# -ne 1 ] && return 0
  3. echo -e "\033[31m$1\033[0m"
  4. }
  5. echo_g () {
  6. [ $# -ne 1 ] && return 0
  7. echo -e "\033[32m$1\033[0m"
  8. }
  9. echo_y () {
  10. [ $# -ne 1 ] && return 0
  11. echo -e "\033[33m$1\033[0m"
  12. }
  13. echo_b () {
  14. [ $# -ne 1 ] && return 0
  15. echo -e "\033[34m$1\033[0m"
  16. }
  17. export PS1="\[$(tput bold)$(tput setab 0)$(tput setaf 1)\][\u@\h \W]# \[$(tput sgr0)\]"
  18. PS1='\[\e[37;1m\][\[\e[31;1m\]\u\[\e[34;1m\]@\[\e[32;1m\]\h \[\e[31;1m\]\w \[\e[33;1m\]\t\[\e[37;1m\]]\[\e[32;1m\]\$ \[\e[m\]'

004 shell log

  1. #/bin/bash
  2. sys_log="./test_log.log"
  3. # func of log
  4. #定义了三个级别的日志
  5. function log_info()
  6. {
  7. local format_date=`date +%Y%m%d_%H%M%S`
  8. local para=$1
  9. echo "${format_date} [info] $1" >> $sys_log
  10. }
  11. function log_warn()
  12. {
  13. local format_date=`date +%Y%m%d_%H%M%S`
  14. local para=$1
  15. echo "${format_date} [warn] $1" >> $sys_log
  16. }
  17. function log_err()
  18. {
  19. local format_date=`date +%Y%m%d_%H%M%S`
  20. local para=$1
  21. echo "${format_date} [err] $1" >> $sys_log
  22. }
  23. #log_err "wo shi err"
  24. #log_info "wo shi info info"
  25. #log_warn "wo shi warn"

005 wireshark和Fiddler抓包

  1. Fiddler是在windows上运行的程序,专门用来捕获HTTPHTTPS的。
  2. wireshark能获取HTTP,也能获取HTTPS,但是不能解密HTTPS,所以wireshark看不懂HTTPS中的内容
  3. 总结,如果是处理HTTP,HTTPS 还是用Fiddler, 其他协议比如TCP,UDP 就用wireshark
  4. https://www.cnblogs.com/TankXiao/archive/2012/10/10/2711777.html
  5. https://www.cnblogs.com/TankXiao/archive/2012/02/06/2337728.html
  6. https://my.oschina.net/u/658658/blog/417739
  7. ## Wireshark抓包分析——TCP/IP协议https://zhuanlan.zhihu.com/p/53338327
  8. ## Fiddler抓取Android真机上的HTTPS包https://www.cnblogs.com/taojietx/p/7286703.html
  9. ## Fiddler抓包工具总结https://www.cnblogs.com/yyhh/p/5140852.htmlhttps://www.dell.com/community/%E7%BB%BC%E5%90%88%E8%AE%A8%E8%AE%BA%E5%8C%BA/%E7%BD%91%E7%BB%9C%E5%9F%BA%E6%9C%AC%E5%8A%9F%E7%B3%BB%E5%88%97-%E7%BB%86%E8%AF%B4%E7%BD%91%E7%BB%9C%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF-3%E6%9C%8826%E6%97%A5%E6%9B%B4%E6%96%B0/td-p/7045185
  10. ## wireshark包过滤
  11. ip.src==192.168.1.102 or ip.dst==192.168.1.102
  12. 1 过滤IP,如来源IP或者目标IP等于某个IP
  13. 如前面说的例子: ip.src==192.168.1.102 or ip.dst==192.168.1.102
  14. 比如TCP,只显示TCP协议。
  15. 2 过滤端口
  16. tcp.dstport == 80 // 只显tcp协议的目标端口80
  17. tcp.srcport == 80 // 只显tcp协议的来源端口80
  18. 也可以写成tcp.port eq 80 or udp.port eq 80 这样的模式
  19. 3 过滤协议
  20. 单独写上tcpudpxmlhttp就可以过滤出具体协议的报文。你也可以用tcp or xml这样格式来过滤。
  21. 我们还可以更加具体过滤协议的内容,如tcp.flags.syn == 0x02 表示显示包含TCP SYN标志的封包。
  22. 4 过滤mac地址
  23. eth.src eq A0:00:00:04:C5:84 // 过滤来源mac地址
  24. eth.dst==A0:00:00:04:C5:84 // 过滤目的mac地址
  25. 5 http模式过滤
  26. http.request.method == "GET"
  27. http.request.method == "POST"
  28. http.request.uri == "/img/logo-edu.gif"
  29. http contains "GET"
  30. http contains "HTTP/1."
  31. // GET包
  32. http.request.method == "GET" && http contains "Host: "
  33. http.request.method == "GET" && http contains "User-Agent: "
  34. // POST包
  35. http.request.method == "POST" && http contains "Host: "
  36. http.request.method == "POST" && http contains "User-Agent: "
  37. // 响应包
  38. http contains "HTTP/1.1 200 OK" && http contains "Content-Type: "
  39. http contains "HTTP/1.0 200 OK" && http contains "Content-Type: "
  40. 6 过滤内容
  41. contains:包含某字符串
  42. ip.src==192.168.1.107 and udp contains 02:12:21:00:22
  43. ip.src==192.168.1.107 and tcp contains "GET"
  44. 前面也有例子,http contains "HTTP/1.0 200 OK" && http contains "Content-Type: "
  45. https://blog.csdn.net/u014530704/article/details/78842000
  46. ## 抓包
  47. tcpdump -i ens33 host gc.hgame.com
  48. https://blog.csdn.net/weixin_40576010/article/details/99335491
  49. https://www.cnblogs.com/centos2017/p/7896658.html

005 抓包mimtproxy

  1. https://www.cnblogs.com/ITXiaoAng/p/11777060.html#%E4%B8%89%EF%BC%9A%E6%8A%93%E5%8C%85%E5%B7%A5%E5%85%B7mitmproxy%E5%85%8D%E8%B4%B9%E7%9A%84
  2. https://www.cnblogs.com/grandlulu/p/9525417.html
  3. https://blog.csdn.net/freeking101/article/details/83901842
  4. https://www.jianshu.com/p/0eb46f21fee9

005 tcpdump命令

  1. tcpdump -i eth0 -s 0 -l
  2. tcpdump -i eth0 -s 0 -l -w - |strings
  3. tcpdump -i ens33 host gc.hgame.com
  4. tcpdump -i eth0 -s 0 -l -w a.pcap src host 192.168.2.191 or dst host 192.168.2.191
  5. ####
  6. ## 1.3 常用场景
  7. ### 1、获取10.1.85.21和10.1.85.19之间的通信,使用命令注意转义符号。
  8. tcpdump host 10.1.85.21 and \( 10.1.85.19\) -i ens5f0 -nn -c 10
  9. ### 2、获取从10.1.85.21发来的包。
  10. tcpdump src host 10.1.85.21 -c 10 -i ens5f1
  11. ### 3、监听tcp(udp)端口。
  12. tcpdump tcp port 22 -c 10
  13. ### 4、获取主机10.1.85.21和除10.1.85.19之外所有主机的通信。
  14. tcpdump ip host 10.1.85.21 and ! 10.1.85.19 -c 10 -i any
  15. ### 5、获取从10.1.85.19且端口主机到10.1.85.21主机的通信。
  16. tcpdump src host 10.1.85.19 and src port 48565 and dst host 10.1.85.21 and dst port 5090 -i any -c 10 -nn
  17. #################3
  18. ### 6、抓取所有经过 en0,目的或源地址是 10.37.63.255 的网络数据:
  19. tcpdump -i en0 host 10.37.63.255
  20. ### 7、抓取主机10.37.63.255和主机10.37.63.61或10.37.63.95的通信:
  21. tcpdump host 10.37.63.255 and \(10.37.63.61 or 10.37.63.95 \)
  22. ### 8、抓取主机192.168.13.210除了和主机10.37.63.61之外所有主机通信的数据包:
  23. tcpdump -n host 10.37.63.255 and ! 10.37.63.61
  24. ### 9、抓取主机10.37.63.255除了和主机10.37.63.61之外所有主机通信的ip包
  25. tcpdump ip -n host 10.37.63.255 and ! 10.37.63.61
  26. ### 10、抓取主机10.37.63.3发送的所有数据:
  27. tcpdump -i en0 src host 10.37.63.3 (注意数据流向)
  28. ### 11、抓取主机10.37.63.3接收的所有数据:
  29. tcpdump -i en0 dst host 10.37.63.3 (注意数据流向)
  30. ### 12、抓取主机10.37.63.3所有在TCP 80端口的数据包:
  31. tcpdump -i en0 host 10.37.63.3 and tcp port 80
  32. ### 13、抓取HTTP主机10.37.63.3在80端口接收到的数据包:
  33. tcpdump -i en0 host 10.37.63.3 and dst port 80
  34. ### 14、抓取所有经过 en0,目的或源端口是 25 的网络数据
  35. tcpdump -i en0 port 25
  36. tcpdump -i en0 src port 25 # 源端口
  37. tcpdump -i en0 dst port 25网络过滤 # 目的端口
  38. ### 15、抓取所有经过 en0,网络是 192.168上的数据包
  39. tcpdump -i en0 net 192.168
  40. tcpdump -i en0 src net 192.168
  41. tcpdump -i en0 dst net 192.168
  42. tcpdump -i en0 net 192.168.1
  43. tcpdump -i en0 net 192.168.1.0/24
  44. ### 16、协议过滤
  45. tcpdump -i en0 arp
  46. tcpdump -i en0 ip
  47. tcpdump -i en0 tcp
  48. tcpdump -i en0 udp
  49. tcpdump -i en0 icmp
  50. ### 17、抓取所有经过 en0,目的地址是 192.168.1.254 或 192.168.1.200 端口是 80 的 TCP 数据
  51. tcpdump -i en0 '((tcp) and (port 80) and ((dst host 192.168.1.254) or (dst host 192.168.1.200)))'
  52. ### 18、抓取所有经过 en0,目标 MAC 地址是 00:01:02:03:04:05 的 ICMP 数据
  53. tcpdump -i eth1 '((icmp) and ((ether dst host 00:01:02:03:04:05)))'
  54. ### 19、抓取所有经过 en0,目的网络是 192.168,但目的主机不是 192.168.1.200 的 TCP 数据
  55. tcpdump -i en0 '((tcp) and ((dst net 192.168) and (not dst host 192.168.1.200)))'
  56. ### 20、只抓 SYN 包
  57. tcpdump -i en0 'tcp[tcpflags] = tcp-syn'
  58. ### 21、抓 SYN, ACK
  59. tcpdump -i en0 'tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack != 0'
  60. ### 22、抓 SMTP 数据,抓取数据区开始为"MAIL"的包,"MAIL"的十六进制为 0x4d41494c
  61. tcpdump -i en0 '((port 25) and (tcp[(tcp[12]>>2):4] = 0x4d41494c))'
  62. ### 23、抓 HTTP GET 数据,"GET "的十六进制是 0x47455420
  63. tcpdump -i en0 'tcp[(tcp[12]>>2):4] = 0x47455420'
  64. # 0x4745 为"GET"前两个字母"GE",0x4854 为"HTTP"前两个字母"HT"
  65. tcpdump -XvvennSs 0 -i en0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854
  66. ### 24、抓 SSH 返回,"SSH-"的十六进制是 0x5353482D
  67. tcpdump -i en0 'tcp[(tcp[12]>>2):4] = 0x5353482D'
  68. # 抓老版本的 SSH 返回信息,如"SSH-1.99.."
  69. tcpdump -i en0 '(tcp[(tcp[12]>>2):4] = 0x5353482D) and (tcp[((tcp[12]>>2)+4):2] = 0x312E)'
  70. ### 25、抓 DNS 请求数据
  71. tcpdump -i en0 udp dst port 53
  72. ### 26、用-c 参数指定抓多少个包
  73. time tcpdump -nn -i en0 'tcp[tcpflags] = tcp-syn' -c 10000 > /dev/null
  74. 上面的命令计算抓 10000 SYN 包花费多少时间,可以判断访问量大概是多少。
  75. ### 27、实时抓取端口号8000的GET包,然后写入GET.log
  76. tcpdump -i en0 '((port 8000) and (tcp[(tcp[12]>>2):4]=0x47455420))' -nnAl -w /tmp/GET.log
  77. 作者:道无虚
  78. 链接:https://www.jianshu.com/p/23427a80fc9d
  79. 作者:猿码架构
  80. 链接:https://www.jianshu.com/p/a62ed1bb5b20

006

007 压测

007 redis压测

  1. ## redis压测
  2. redis-cli --latency -h `host` -p `port`
  3. redis-cli --latency -h 10.10.10.210 -p 7379
  4. INFO commandstats

007 nginx压测

  1. bin/wrk -c30 -t1 -s conf/nginx_log.lua http://localhost:8095
  2. ab -n 1000 -c 100 http://www.load_balance.com/buy/ticket
  3. ## 配置负载均衡
  4. upstream load_rule {
  5. server 127.0.0.1:3001 weight=1;
  6. server 127.0.0.1:3002 weight=2;
  7. server 127.0.0.1:3003 weight=3;
  8. server 127.0.0.1:3004 weight=4;
  9. }
  10. ...
  11. server {
  12. listen 80;
  13. server_name load_balance.com www.load_balance.com;
  14. location / {
  15. proxy_pass http://load_rule;
  16. }
  17. }
  18. 统计日志中的结果,3001-3004 端口分别得到了 100200300400 的请求量。这和我在 Nginx 中配置的权重占比很好的吻合在了一起,并且负载后的流量非常的均匀、随机。

008 虚拟内存使用排行

  1. for i in `cd /proc;ls |grep "^[0-9]"|awk ' $0 >100'` ;do awk '/Swap:/{a=a+$2}END{print '"$i"',a/1024"M"}' /proc/$i/smaps ;done |sort -k2nr|head
  2. for file in /proc/*/status ; do awk '/VmSwap|Name|^Pid/{printf $2 " " $3}END{ print ""}' $file; done | sort -k 3 -n -r | head
  3. free -m
  4. sync
  5. echo 3 > /proc/sys/vm/drop_caches
  6. free -m
  7. swapoff -a
  8. free -m
  9. swapon -a
  10. free -m

009 Linux端口预留

  1. # 预留端口避免占用ip_local_reserved_ports
  2. bl_ports=`egrep -o '=[0-9]{4,5}$' /opt/www/*/*gs*/*server.conf |awk -F'=' '{print $NF}' |sort -n |uniq |xargs echo |sed 's/ /,/g'`
  3. sysctl -w net.ipv4.ip_local_reserved_ports=$bl_ports
  4. sysctl -w net.ipv4.ip_local_reserved_ports=11181,11281,12182
  5. echo "39003" > /proc/sys/net/ipv4/ip_local_reserved_ports
  6. echo "39003,39004" > /proc/sys/net/ipv4/ip_local_reserved_ports
  7. echo "39003-39004" > /proc/sys/net/ipv4/ip_local_reserved_ports

010 清空memcache

  1. ## 清空memcache
  2. ### https://blog.csdn.net/hadeys/article/details/6217472
  3. echo "flush_all" | nc localhost 11211

011 redis 数据持久化

  1. ## Redis 五大数据类型有:
  2. String 类型,Hash 类型,List 类型,Set 类型,ZsetSortedset)类型。其中常用的是前三个
  3. ## 数据安全 aof, rdb
  4. https://www.cnblogs.com/itdragon/p/7906481.html
  5. Redis 默认开启RDB持久化方式,在指定的时间间隔内,执行指定次数的写操作,则将内存中的数据写入到磁盘中。
  6. RDB 持久化适合大规模的数据恢复但它的数据一致性和完整性较差。
  7. Redis 需要手动开启AOF持久化方式,默认是每秒将写操作日志追加到AOF文件中。
  8. AOF 的数据完整性比RDB高,但记录内容多了,会影响数据恢复的效率。
  9. Redis 针对 AOF文件大的问题,提供重写的瘦身机制。
  10. 若只打算用Redis 做缓存,可以关闭持久化。
  11. 若打算使用Redis 的持久化。建议RDBAOF都开启。其实RDB更适合做数据的备份,留一后手。AOF出问题了,还有RDB
  12. ## 内存淘汰策略
  13. 实际上Redis定义了几种策略用来处理这种情况:
  14. noeviction(默认策略):对于写请求不再提供服务,直接返回错误(DEL请求和部分特殊请求除外)
  15. allkeys-lru:从所有key中使用LRU算法进行淘汰
  16. volatile-lru:从设置了过期时间的key中使用LRU算法进行淘汰
  17. allkeys-random:从所有key中随机淘汰数据
  18. volatile-random:从设置了过期时间的key中随机淘汰
  19. volatile-ttl:在设置了过期时间的key中,根据key的过期时间进行淘汰,越早过期的越优先被淘汰
  20. 作者:千山qianshan
  21. 链接:https://juejin.im/post/6844903927037558792
  22. 来源:掘金
  23. 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  24. ## 缓存雪崩, 缓存穿透, 缓存

012 python常用pip模块

  1. cat /root/.pip/pip.conf
  2. [global]
  3. index-url = http://mirrors.aliyun.com/pypi/simple/
  4. [install]
  5. trusted-host=mirrors.aliyun.com
  6. ## 运维
  7. os, commands, subprocess, logging, Jinja2, PyMySQL, redis,
  8. ## 爬虫
  9. requests, bs4, selenium, pyquery
  10. ## 框架
  11. django, flask, fastapi,

012 pip使用指定源

  1. pip install flask
  2. pip install -i http://pypi.douban.com/simple/ --trusted-host=pypi.douban.com/simple ipython
  3. ## linux 添加pip源
  4. cat ~/.pip/pip.conf
  5. [global]
  6. index-url = http://mirrors.aliyun.com/pypi/simple/
  7. [install]
  8. trusted-host=mirrors.aliyun.com

013 npm or yarn

  1. https://www.cnblogs.com/xifengxiaoma/tag/vue/
  2. https://www.cnblogs.com/xifengxiaoma/p/9533018.html
  3. npm install => yarn install
  4. npm install --save [package] => yarn add [package]
  5. npm install --save-dev [package] => yarn add [package] --dev
  6. npm install --global [package] => yarn global add [package]
  7. npm uninstall --save [package] => yarn remove [package]
  8. npm uninstall --save-dev [package] => yarn remove [package]
  9. yarn add sass-loader node-sass --dev
  10. <style lang="scss">
  11. </style>
  12. yarn add mockjs --dev

014 查看zip包里面的文件和大小

  1. #!/usr/bin/env python
  2. import zipfile
  3. z = zipfile.ZipFile("test.zip","r")
  4. for filename in z.namelist():
  5. print 'File:',filename,
  6. bytes = z.read(filename)
  7. print 'has',len(bytes),'bytes'

015 日志切割logrotate

  1. rpm -qf /etc/logrotate.conf
  2. logrotate-3.7.8-26.el6_7.x86_64
  3. /opt/log/nginx/*.log
  4. {
  5. daily
  6. missingok
  7. rotate 1
  8. compress
  9. notifempty
  10. copytruncate
  11. dateext
  12. dateformat %Y-%m-%d
  13. }

016 xxx

017 xxx

018 xxx

019 获取git commit id

  1. https://blog.csdn.net/liurizhou/article/details/89234032
  2. git log --pretty="%s" -2
  3. git log --pretty="%H" -2
  4. git log --pretty="%h" -2

020 访问url 分阶段展示耗时

  1. # https://github.com/reorx/httpstat
  2. # 以前遇到了一台服务器请求某个api很慢,怀疑是dns但是没有证据,这下让他无处遁形
  3. # wget https://raw.githubusercontent.com/reorx/httpstat/master/httpstat.py
  4. pip install httpstat
  5. python httpstat.py httpbin.org/get

021 MySQL binlog2sql 解析binlog

  1. https://github.com/danfengcao/binlog2sql
  2. ##
  3. https://github.com/danfengcao/binlog2sql/blob/master/example/mysql-flashback-priciple-and-practice.md
  4. ## records
  5. https://github.com/kennethreitz-archive/records

022 InnoDB 和MyISAM 不同点

  1. MyISAMInnoDB 的区别(9个不同点)
  2. 1. InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begincommit之间,组成一个事务;
  3. 2. InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败
  4. 5. Innodb不支持全文索引,而MyISAM支持全文索引,在涉及全文索引领域的查询效率上MyISAM速度更快高;PS5.7以后的InnoDB支持全文索引了
  5. 6. MyISAM表格可以被压缩后进行查询操作
  6. 7. InnoDB支持表、行(默认)级锁,而MyISAM支持表级锁
  7. 8InnoDB表必须有主键(用户没有指定的话会自己找或生产一个主键),而Myisam可以没有
  8. 9Innodb存储文件有frmibd,而MyisamfrmMYDMYI
  9. Innodbfrm是表定义文件,ibd是数据文件
  10. Myisamfrm是表定义文件,myd是数据文件,myi是索引文件

023 MySQL忘记密码

  1. vim /etc/my.cnf
  2. [mysqld]
  3. skip-grant-tables
  4. ### MySQL5.6
  5. UPDATE mysql.user SET Password = password('123456') WHERE User = 'root' ;
  6. ### MySQL5.7
  7. update mysql.user set authentication_string=password('123qwe') where user='root' and Host = 'localhost';

024 MySQL审计 yearning

  1. ## https://www.jianshu.com/p/c9c3aaaf6e0b

025 Waiting for table flush 阻塞查询的问题

  1. ## https://blog.csdn.net/donghaixiaolongwang/article/details/76099697
  2. 2、易引发这种情况的操作
  3. 慢查询+FLUSH TABLES tbl_name, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE, orOPTIMIZE TABLE 这些操作。
  4. 例如:比如在mysqldumpinnobackupex进行备份时就很有可能引发这种情况。
  5. 3、解决方案
  6. 找出慢查询kill掉,并进行SQL优化防止再次引发。
  7. 4、预防措施
  8. 在业务高峰期不要对数据库进行FLUSH TABLES tbl_name, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE, orOPTIMIZE TABLE 这些操作。
  9. 备份、DDL语句等操作尽量避开业务高峰。
  10. ###
  11. SELECT CONCAT('kill ',id,';') from PROCESSLIST WHERE state ='updating' and (info like "%xxxx_server_info%" and info like "update%") limit 50

026 mysql时间

  1. ## 1、当前日期
  2. select DATE_SUB(curdate(),INTERVAL 0 DAY) ;
  3. ## 2、明天日期
  4. select DATE_SUB(curdate(),INTERVAL -1 DAY) ;
  5. ## 3、昨天日期
  6. select DATE_SUB(curdate(),INTERVAL 1 DAY) ;
  7. ## 4、前一个小时时间
  8. select date_sub(now(), interval 1 hour);
  9. ## 5、后一个小时时间
  10. select date_sub(now(), interval -1 hour);
  11. ## 6、前30分钟时间
  12. select date_add(now(),interval -30 minute)
  13. ## 7、后30分钟时间
  14. select date_add(now(),interval 30 minute)
  15. ## 8、取得当天:
  16. SELECT curdate();

027

028

029

030

031

032

033

034

035

036

037

038

039

040

041

042

043

044

045

046

047

048

049

050 前端

  1. ## bootstrap
  2. https://www.runoob.com/bootstrap/bootstrap-affix-plugin.html
  3. https://www.w3cschool.cn/bootstrap/html-css-bootstrap-radiobutton.html
  4. ## jQuery 加载 json 数据
  5. https://www.cnblogs.com/aademeng/articles/9788385.html
  6. ## jQuery 添加元素
  7. https://www.runoob.com/jquery/jquery-dom-set.html
  8. ## ant-design
  9. https://www.yuque.com/ant-design/course/wybhm9
  10. ## gin
  11. https://book.eddycjy.com/golang/gin/log.html
  12. ## vue
  13. https://github.com/opendigg/awesome-github-vue

051 vue动态菜单

  1. ## https://www.cnblogs.com/woai3c/p/11052975.html
  2. <!-- 动态菜单 -->
  3. <div v-for="(item, index) in menuItems" :key="index">
  4. <Submenu v-if="item.children" :name="index">
  5. <template slot="title">
  6. <Icon :size="item.size" :type="item.type"/>
  7. <span v-show="isShowAsideTitle">{{item.text}}</span>
  8. </template>
  9. <div v-for="(subItem, i) in item.children" :key="index + i">
  10. <Submenu v-if="subItem.children" :name="index + '-' + i">
  11. <template slot="title">
  12. <Icon :size="subItem.size" :type="subItem.type"/>
  13. <span v-show="isShowAsideTitle">{{subItem.text}}</span>
  14. </template>
  15. <MenuItem class="menu-level-3" v-for="(threeItem, k) in subItem.children" :name="threeItem.name" :key="index + i + k">
  16. <Icon :size="threeItem.size" :type="threeItem.type"/>
  17. <span v-show="isShowAsideTitle">{{threeItem.text}}</span>
  18. </MenuItem>
  19. </Submenu>
  20. <MenuItem v-else v-show="isShowAsideTitle" :name="subItem.name">
  21. <Icon :size="subItem.size" :type="subItem.type"/>
  22. <span v-show="isShowAsideTitle">{{subItem.text}}</span>
  23. </MenuItem>
  24. </div>
  25. </Submenu>
  26. <MenuItem v-else :name="item.name">
  27. <Icon :size="item.size" :type="item.type" />
  28. <span v-show="isShowAsideTitle">{{item.text}}</span>
  29. </MenuItem>
  30. </div>

052

053

054

055

056

057

058

059

060 python 第三方包制作

  1. ## Python 第三方包制作教程
  2. https://www.cnblogs.com/streakingBird/p/4056765.html
  3. https://www.jianshu.com/p/19f1e564a29d
  4. https://www.cnblogs.com/panwenbin-logs/p/13219332.html
  5. https://www.jianshu.com/p/c6055e8873ee
  6. Django 中使用 ajax 请求的正确姿势
  7. ## git 0基础入门—git入门与实践(1)—详细图解git安装详情及超详细的入门介绍!(2020.06.30更新)
  8. https://blog.csdn.net/u013946061/article/details/107023191
  9. git config --globe user.email xxx@example.com
  10. --globe 代表全局设置,即设置一次就够了。
  11. git config --globe user.name "张三"
  12. git config --global -l
  13. git commit -a -m "描述" 从工作目录提交到暂存区后,直接提交
  14. ## golang prometheus
  15. ### Go开发属于自己的exporter
  16. https://blog.csdn.net/weixin_45413603/article/details/107024467
  17. ### 使用golang编写Prometheus Exporter
  18. https://blog.csdn.net/u014029783/article/details/80001251
  19. ### prometheus数据采集exporter全家桶
  20. https://blog.csdn.net/weixin_34212189/article/details/91673377
  21. 名称.(type)用于类型查询,
  22. 名称.(具体类型)用于类型转换
  23. ## Google Protobuf简明教程
  24. https://www.jianshu.com/p/b723053a86a6
  25. ## python 操作protobuf
  26. https://www.jianshu.com/p/091b99beb6bc

061 python ‘is’ 和 ‘==’ 区别

  1. https://www.cnblogs.com/CheeseZH/p/5260560.html
  2. 在讲is和==这两种运算符区别之前,首先要知道Python中对象包含的三个基本要素,分别是:id(身份标识)、type(数据类型)和value(值)。
  3. 1, is 是进行id的比较,== 是进行value的比较。
  4. 2, 只有数值型情况下is和==可通用,当字符串中包含非数字或字母字符时,值比较就不能用is只能用==了。
  5. 我们在检查 a is b 的时候,其实相当于检查 id(a) == id(b)。而检查 a == b 的时候,实际是调用了对象 a __eq()__ 方法,a == b 相当于 a.__eq__(b)。
  6. Python里和None比较时,为什么是 is None 而不是 == None 呢?
  7. 这是因为NonePython里是个单例对象,一个变量如果是None,它一定和None指向同一个内存地址。而 == None背后调用的是__eq__,而__eq__可以被重载,下面是一个 is not None == None的例子
  8. 连接字符串的时候可以用join也可以用+,但这两者有没有区别呢?
  9. join的性能明显好于+。这是为什么呢?
  10. join在连接字符串的时候,会先计算需要多大的内存存放结果,然后一次性申请所需内存并将字符串复制过去,这是为什么join的性能优于+的原因。所以在连接字符串数组的时候,我们应考虑优先使用join
  11. https://zhuanlan.zhihu.com/p/93775624

061 python 深浅拷贝

  1. 浅拷贝和深拷贝的区别是:浅拷贝只是将原对象在内存中引用地址拷贝
  2. 而深拷贝是将这个对象的所有内容拷贝过来了,包括值与内存地址

061 python闭包

  1. # http://c.biancheng.net/view/5335.html
  2. 不过使用闭包,可以让程序变得更简洁易读。
  3. # https://zhuanlan.zhihu.com/p/22229197
  4. 闭包:就是在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且 外函数的返回值是内函数的引用。
  5. 闭包概念:在一个内部函数中,对外部作用域的变量进行引用,(并且一般外部函数的返回值为内部函数),那么内部函数就被认为是闭包。
  6. flist =[]
  7. for i in xrange(3):
  8. def func(x):
  9. return x*i
  10. first.append(func)
  11. for f in flist:
  12. print(f(2))
  13. # 2
  14. flist=[]
  15. for i in xrange(3):
  16. def makefunc(i):
  17. def func(x):
  18. return x*i
  19. return func
  20. flist.append(makefunc(i))
  21. for f in flist:
  22. print(f(2))
  23. 装饰器(本质就是闭包):主要作用为已经存在的对象添加额外的功能,例如日志记录、数据校验等。

061 python 生成器和迭代器

  1. ## 列表推导式
  2. ## django 字典推导式
  3. kwargs ={key: request.POST.get(key) for key in ("motto","region","pic") if request.POST.get(key)}

061 python 魔法

  1. __init__我们很熟悉了,它在对象初始化的时候调用,我们一般将它理解为"构造函数".
  2. __new__

061 python 封装、继承和多态

  1. dd

062 python 模块

  1. ##

062 python多线/进程

在 Python 3.2 以后,concurrent.futures是内置的模块,我们可以直接使用。 如果你需要在 Python 2.7 中使用 concurrent.futures , 那么请用 pip 进行安装, pip install futures

  1. ## https://www.cnblogs.com/huchong/p/7459324.html
  2. from concurrent.futures import ProcessPoolExecutor
  3. import os,time,random
  4. def task(n):
  5. print('%s is running' %os.getpid())
  6. time.sleep(2)
  7. return n**2
  8. if __name__ == '__main__':
  9. p=ProcessPoolExecutor() #不填则默认为cpu的个数
  10. l=[]
  11. start=time.time()
  12. for i in range(10):
  13. obj=p.submit(task,i) #submit()方法返回的是一个future实例,要得到结果需要用obj.result()
  14. l.append(obj)
  15. p.shutdown() #类似用from multiprocessing import Pool实现进程池中的close及join一起的作用
  16. print('='*30) # print([obj for obj in l])
  17. print([obj.result() for obj in l])
  18. print(time.time()-start)
  19. #上面方法也可写成下面的方法
  20. # start = time.time()
  21. # with ProcessPoolExecutor() as p: #类似打开文件,可省去.shutdown()
  22. # future_tasks = [p.submit(task, i) for i in range(10)]
  23. # print('=' * 30)
  24. # print([obj.result() for obj in future_tasks])
  25. # print(time.time() - start)

062 re模块

  1. ## re
  2. import re
  3. b = "<p>我是测试文本<br/></p><p>我是测试文本\n \n<br/></p>"
  4. c = re.sub('<[^<]+?>', '', b).replace('\n', '').strip()
  5. print(c)
  6. d = re.findall(r'p>(.*?)</p', b, re.S)
  7. print(d)

063 API的调用

  1. ##

063 salt-api

063 es-api

063 zabbix-api

064 shutil压缩处理

  1. #shutil 对压缩包的处理是调用 ZipFile 和 TarFile 两个模块来进行的,详细:
  2. #zipfile 压缩解压
  3. # https://www.cnblogs.com/xiangsikai/p/7787101.html
  4. import zipfile
  5. # 压缩
  6. z = zipfile.ZipFile('laxi.zip', 'w')
  7. z.write('a.log')
  8. z.write('data.data')
  9. z.close()
  10. # 解压
  11. z = zipfile.ZipFile('laxi.zip', 'r')
  12. z.extractall()
  13. z.close()

065

066

067

068

069

070 golang

  1. ## aliyun tools
  2. https://help.aliyun.com/learn/tool.html
  3. ## Go类型专题总结
  4. https://blog.csdn.net/YongYu_IT/article/details/90711434
  5. ## Go的&*
  6. https://blog.csdn.net/fujian9544/article/details/100110011
  7. ## Golang 中的指针 - Pointer
  8. https://blog.csdn.net/weixin_30323961/article/details/96412686
  9. ## [日常] Go语言圣经-Slice切片习题
  10. https://www.cnblogs.com/taoshihan/p/8797499.html
  11. https://www.cnblogs.com/majianguo/p/8186429.html

071

072

073

074

075

076

077

078

079

080 jvm内存优化

  1. 堆(Heap)和非堆(Non-heap)内存
  2. 按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给 自己用的,所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法 的代码都在非堆内存中。
  3. 堆内存分配
  4. JVM初始分配的内存由-Xms指定,默认是物理内存的1/64JVM最大分配的内存由-Xmx 定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。
  5. 非堆内存分配
  6. JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4
  7. JVM内存限制(最大值)
  8. 首先JVM内存限制于实际的最大物理内存(废话!呵呵),假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然 可控内存空间有4GB,但是具体的操作系统会给一个限制,这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2GLinux系统 下为2G-3G),而64bit以上的处理器就不会有限制了。
  9. https://blog.csdn.net/cutesource/article/details/5907418
  10. ## tomcat优化
  11. https://www.cnblogs.com/jojoword/p/10835112.html

081 jar Illegal key size

  1. 报错描述:java.security.InvalidKeyException: Illegal key size
  2. 原因分析:JRE中自带的“local_policy.jar ”和“US_export_policy.jar”是支持128位密钥的加密算法,而当我们要使用256位密钥算法的时候,已经超出它的范围,无法支持
  3. 解决方案:1、## https://blog.csdn.net/dling8/article/details/84061948
  4. 2、升级jdk,比如 java version "1.8.0_74" 升级到 java version "1.8.0_261"
  5. 参考链接:https://stackoverflow.com/questions/6481627/java-security-illegal-key-size-or-default-parameters
  6. 摘要说明:Make sure you use the latest version of JDK/JRE.
  7. In my case, I had put JCE into JRE folder, but it didn't help. It happened because I was running my project from the IDE directly (using JDK).
  8. Then I updated my JDK and JRE to the latest version (1.8.0_211) and the problem had gone.

082

083

084

085

086

087

088

089

090 阿里云 k8s

  1. 阿里云 k8s
  2. ACK 容器服务Kubernetes
  3. ASK
  4. ACR 容器镜像服务(Alibaba Cloud Container Registry
  5. ECI 弹性容器实例ECI
  6. 高可用
  7. 自动扩容 缩容
  8. https://help.aliyun.com/learn/tool.html

091

092

093

094

095

096

097 鸡汤几句

  1. 写计划或者一些鼓励自己的话贴在显示器上时时看到,做一条划掉一条,特别有成就感!
  2. 所以作为老板,他最希望的事就是自己能帮助到团队里每个员工,能为员工协调资源,能把控风险,掌控大局,最终把事情做好,这样老板自己也能出成绩得到晋升。
  3. 如果你能从个人的能力出发,变成了个人的竞争力,再进一步变成了企业的竞争力,这是一件喜闻乐见的事,也是领导想看到的。
  4. 你主动展现出愿意承担更多、学习更多的东西的意愿,老板才会把更多的责任交到你的手里面。
  5. 所以主动思考,抓住表达红利,你的想法才会得到组织支持和资源支持,相应的你自己也能够实现升职加薪。
  6. 凡事有交代,件件有着落,事事有回音
  7. 怎么做一个踏实靠谱的人呢?你应该做到凡事有交代, 件件有着落, 事事有回音

097 鸡汤2

  1. “我当时没什么自信”,回忆起来那段经历,他这样说。
  2. 既然改变已经发生了,那就尽力做好。没有自信,可以建立自信,没有武功,可以从零学起。
  3. 他在“绝情谷底”总结了三条生存法则:
  4. 1,不要多想,直接去做,反正也没有时间想别的;
  5. 2,不敢演讲,那就多练 ,反正客户等着,不讲也不行;
  6. 3,不断提高,那就多学,反正总有建(tiao)议(ti)和反(tu)馈(cao)。
  7. 他为自己设立了一个目标,一周演讲两次,这样一年下来就讲了三四十次。时间长了,突然有一天,他发现自己在人前讲话不紧张了。
  8. 那时感觉自己是被逼的,不过现在挺感谢逼我的人,当时在不确定的情况下我只想一件事情,那就是把手头的事情做好。做着做着就发现,原来我真的可以做的很好。
  9. 自信就这么来了。这个人叫格茸扎西。
  10. 作者:ThoughtWorks中国
  11. 链接:https://www.zhihu.com/question/48406009/answer/155374291

098 几个链接

  1. ## MySQL 三万字精华总结 + 面试100 问
  2. https://www.jianshu.com/p/24e1179ef563
  3. ## 阿里巴巴为什么能抗住90秒100亿?
  4. https://www.jianshu.com/p/f4a907fe1485
  5. ## 终于有人把 Docker 讲清楚了,万字详解!
  6. https://www.jianshu.com/p/b650b5521d7d
  7. ## 当初我要是这么学习Nginx就好了!
  8. https://www.jianshu.com/p/e90050dc89b6
  9. ## 高并发与高可用知识总结
  10. https://www.cnblogs.com/xuwc/p/9138585.html

098 高并发

  1. 高并发架构相关概念
  2. https://www.cnblogs.com/-mrl/p/13234927.html
  3. 高并发解决方案
  4. https://www.cnblogs.com/cn-sbo/p/10853469.html
  5. java高并发解决方案
  6. https://www.cnblogs.com/alex96/p/12152388.html

099 Github上有趣的100个python项目

  1. ## Github上有趣的100个python项目
  2. https://www.jianshu.com/p/d74659727d26
  3. ## https://github.com/kennethreitz-archive/records
  4. ## https://github.com/hangsz/pandas-tutorial
  5. ## https://github.com/xianhu/LearnPython
  6. ## https://github.com/danfengcao/binlog2sql
  7. ## https://github.com/tldr-pages/tldr-python-client
  8. ## https://github.com/Delgan/loguru

100 运维技能0-1 设计落地方案

100.1 linux安全

100.2 linux 压测

100.3 nginx 动态负载均衡

100.4 k8s

100.5 salt-ssh 实现批量安装salt-minion

100.6 巡检模板

yd-mongo迁移到阿里云

  1. ## 几个概念
  2. # databases, collection, ducument, index
  3. # databases, table, record, index
  4. https://www.cnblogs.com/clsn/p/8244206.html
  5. https://www.cnblogs.com/shaosks/p/9318209.html
  6. ## 备份
  7. mongodump -h dbhost -d dbname -o dbdirectory
  8. mongodump -h 192.168.1.18:27017 -d smp_maint_2 -o /opt/backup_data/mongo/momgodump
  9. ## 恢复
  10. mongorestore -h dbhost -d dbname --dir dbdirectory # xxx.bson的目录名
  11. mongorestore -h 192.168.1.18:27017 -d smp_maint_2_restore --dir /opt/backup_data/mongo/momgodump/test
  12. ## 其他导入导出
  13. #https://www.cnblogs.com/clsn/p/8244206.html
  14. ### 默认导出了JSON格式的数据
  15. mongoexport -h 10.0.0.152:27017 -uroot -proot --authenticationDatabase admin -d app -c vast -o /home/mongod/backup/vasts.dat
  16. mongoexport -h 10.0.0.152:27017 -uroot -proot --authenticationDatabase admin -d app -c vast --type=csv -f id,name -o /home/mongod/backup/vast_csv.dat
  17. mongoimport -h 10.0.0.152:27017 -uroot -proot --authenticationDatabase admin -d app -c vast --drop /home/mongod/backup/vasts.dat
  18. mongoimport -h 10.0.0.152:27017 -uroot -proot --authenticationDatabase admin -d app -c vast --type=csv --headerline --file vast_csv.dat
  19. ## mongoexport/mongoimport与mongodump/mongorestore的对比
  20. mongoexport/mongoimport导入/导出的是JSON格式,而mongodump/mongorestore导入/导出的是BSON格式。
  21. JSON可读性强但体积较大,BSON则是二进制文件,体积小但对人类几乎没有可读性。
  22. 在一些mongodb版本之间,BSON格式可能会随版本不同而有所不同,所以不同版本之间用mongodump/mongorestore可能不会成功,具体要看版本之间的兼容性。当无法使用BSON进行跨版本的数据迁移的时候,使用JSON格式即mongoexport/mongoimport是一个可选项。跨版本的mongodump/mongorestore并不推荐,实在要做请先检查文档看两个版本是否兼容(大部分时候是的)。
  23. JSON虽然具有较好的跨版本通用性,但其只保留了数据部分,不保留索引,账户等其他基础信息。使用时应该注意。
  24. ## 授权
  25. ## 分片
  26. https://blog.csdn.net/tanga842428/article/details/52584770?locationNum=9&fps=1

yd-MySQL迁移到阿里云

yd-传统java应用上阿里k8s

yd-阿里云监控