• 【Prometheus】mysqld_exporter采集+Grafana出图+AlertManager预警


    前提环境:已经安装和配置好prometheus server

    所有组件对应的版本:
    prometheus-2.44.0
    mysqld_exporter-0.14.0
    grafana-enterprise-9.1.2-1.x86_64.rpm
    alertmanager-0.25.0
    prometheus-webhook-dingtalk-2.1.0

    简介

    mysql_exporter是用来收集MysQL或者Mariadb数据库相关指标的,mysql_exporter需要连接到数据库并有相关权限。既可以用二进制安装部署,也可以通过容器形式部署,但为了数据收集的准确性,推荐二进制安装。

    一,下载安装包并解压

    安装包下载地址: https://github.com/prometheus/mysqld_exporter/releases

    同样物理机上下载,然后上传到服务器,本次安装使用的版本为:mysqld_exporter-0.14.0.linux-amd64

    根据服务器情况选择安装目录,上传安装包。

    [root@jd-mysql mysqld_exporter]# mkdir /mysqld_exporter
    [root@jd-mysql mysqld_exporter]# cd /mysqld_exporter/
    
    [root@jd-mysql mysqld_exporter]# ls
    mysqld_exporter-0.14.0.linux-amd64.tar.gz
    [root@jd-mysql mysqld_exporter]# tar -xvzf mysqld_exporter-0.14.0.linux-amd64.tar.gz
    [root@jd-mysql mysqld_exporter]# cp mysqld_exporter-0.14.0.linux-amd64/* .
    [root@jd-mysql mysqld_exporter]# rm -rf mysqld_exporter-0.14.0.linux-amd64
    [root@jd-mysql mysqld_exporter]# ls
    LICENSE  mysqld_exporter  mysqld_exporter-0.14.0.linux-amd64.tar.gz  NOTICE
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    二,创建配置文件

    • 创建配置文件.my.cnf ,填入如下内容后保存
    [root@jd-mysql mysqld_exporter]# cat .my.cnf 
    [client]
    user = exporter
    password = Jd123456
    host = 192.168.1.150
    port = 3306
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • mysql创建用户并授权
    [root@jd-mysql mysqld_exporter]# mysql -uroot -pJiangda123#
    
    root@(none) 11:06  mysql>create user 'exporter'@'%' identified by 'Jd123456';
    Query OK, 0 rows affected (1.02 sec)
    
    root@(none) 11:07  mysql>GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%'  WITH MAX_USER_CONNECTIONS 3;
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    
    root@(none) 11:07  mysql>flush privileges;
    Query OK, 0 rows affected (0.00 sec)
    
    root@(none) 11:07  mysql>exit
    Bye
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    三,进行系统service编写

    • 创建mysqld_exporter.service配置文件
    vim /usr/lib/systemd/system/mysqld_exporter.service
    
    • 1
    • mysqld_exporter.service 文件填入如下内容后保存:wq
    [Unit]
    Description=https://prometheus.io
    
    [Service]
    Restart=on-failure
    ExecStart=/mysqld_exporter/mysqld_exporter --config.my-cnf=/mysqld_exporter/.my.cnf --web.listen-address=:9104
    
    [Install]
    WantedBy=multi-user.target
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 刷新服务配置并启动服务
    systemctl daemon-reload
    systemctl start mysqld_exporter.service
    
    
    • 1
    • 2
    • 3
    • 查看服务运行状态
    systemctl status mysqld_exporter.service
    
    
    • 1
    • 2

    在这里插入图片描述

    • 设置开机自启动
    systemctl enable mysqld_exporter.service
    
    
    • 1
    • 2
    • 测试服务返回
    curl localhost:9104/metrics
    
    
    • 1
    • 2

    在这里插入图片描述

    四,对接prometheus

    • 打开prometheus.yml添加以下内容,并执行:wq,点击回车保存
       
     - job_name: "mysql"
       static_configs:
         - targets: ["192.168.1.150:9104"]
           labels:
             instance: mysqld-exporter
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    • 执行prometheus配置刷新
    systemctl restart prometheus
    curl -XPOST localhost:9090/-/reload
    
    • 1
    • 2
    • 打开prometheus,搜索mysql,可以看到出现了很多的参数指标
      在这里插入图片描述

    • 打开targets,可以看到节点状态已经UP
      在这里插入图片描述

    • 至此mysqld-exporter插件安装完毕

    五,用Grafana出图

    根据服务器情况选择安装目录,上传安装包。

    [root@nfs yum.repos.d]# mkdir /grafana
    [root@nfs yum.repos.d]# cd /grafana/
    [root@nfs grafana]# ls
    grafana-enterprise-9.1.2-1.x86_64.rpm
    [root@nfs grafana]# yum install grafana-enterprise-9.1.2-1.x86_64.rpm -y
    
    • 1
    • 2
    • 3
    • 4
    • 5

    安装好后,

    [root@nfs grafana]# service grafana-server start
    Starting grafana-server (via systemctl):                   [  确定  ]
    [root@nfs grafana]# systemctl enable grafana-server  
    Created symlink from /etc/systemd/system/multi-user.target.wants/grafana-server.service to /usr/lib/systemd/system/grafana-server.service.
    [root@nfs grafana]# netstat -anplut|grep grafana
    tcp        0      0 192.168.1.130:56948     34.120.177.193:443      ESTABLISHED 8775/grafana-server 
    tcp        0      0 192.168.1.130:48842     185.199.110.133:443     ESTABLISHED 8775/grafana-server 
    tcp6       0      0 :::3000                 :::*                    LISTEN      8775/grafana-server 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    访问http://192.168.1.130:3000/
    在这里插入图片描述
    默认的用户名和密码是
    用户名admin
    密码admin

    配置数据源
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    成功效果:
    在这里插入图片描述

    六,AlertManager预警(重难点)

    1、服务端口规划:

    服务端口
    Prometheus9090
    Node_exporter8090
    Mysqld_exporter9194
    Alertanager9093
    Webhook-dingtalk8060

    2.架构图
    在这里插入图片描述
    3、钉钉创建机器人保存Webhook地址:
    用电脑版钉钉,打开设置,点击机器人,再点击添加机器人,进来之后选择最后一个“自定义”,再添加,再输入相关信息,
    在这里插入图片描述
    总共需要保存两项,我们后续会用到:(注意每个机器人不是一样的,看自己的)

    webhook地址

    https://oapi.dingtalk.com/robot/send?access_token=4e70f2f1a85822394c15671281605fd22f4c0ee9fb80e122297d7b332704a03b
    
    • 1

    加签后的秘钥

    SECc9dc9daf3dcd865b522587455eb076693368bdcbb443478d9542d640f896d2e8
    
    • 1

    4.顺便校准一下所有机器的时间(不清楚到底是不是影响结果的因素,顺便校准吧)

    1. Alertmanager安装启动

    根据服务器情况选择安装目录,上传安装包。

    [root@nfs prometheus]# mkdir /prom_alert
    [root@nfs prometheus]# cd /prom_alert/
    [root@nfs prom_alert]# ls
    alertmanager-0.25.0.linux-amd64.tar.gz
    [root@nfs prom_alert]# tar xf alertmanager-0.25.0.linux-amd64.tar.gz 
    [root@nfs prom_alert]# ls
    alertmanager-0.25.0.linux-amd64  alertmanager-0.25.0.linux-amd64.tar.gz
    [root@nfs prom_alert]# mv alertmanager-0.25.0.linux-amd64 alertmanager
    [root@nfs prom_alert]# cd alertmanager
    [root@nfs alertmanager]# ls
    alertmanager  alertmanager.yml  amtool  LICENSE  NOTICE
    [root@nfs alertmanager]# cp alertmanager.yml alertmanager.yml.bak
    [root@nfs alertmanager]# vim alertmanager.yml
    [root@nfs alertmanager]# pwd
    /prom_alert/alertmanager
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    使用systemd管理,启动 && 开机自启

    [root@nfs system]# vim /usr/lib/systemd/system/alertmanager.service
    [Unit]
    Description=alertmanager
    Documentation=https://prometheus.io/
    After=network.target
    StartLimitIntervalSec=0
    
    [Service]
    Type=simple
    #User=prometheus
    ExecStart=/prom_alert/alertmanager/alertmanager --storage.path=/prom_alert/alertmanager/data --config.file=/prom_alert/alertmanager/alertmanager.yml --web.external-url=http://192.168.*.*
    Restart=always
    RestartSec=1
    
    [Install]
    WantedBy=multi-user.target
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    
    [root@nfs system]# systemctl daemon-reload
    [root@nfs system]# systemctl start alertmanager
    [root@nfs system]# systemctl enable alertmanager
    [root@nfs system]# systemctl status alertmanager
    
    • 1
    • 2
    • 3
    • 4
    • 5

    查看端口9093

    [root@nfs system]# netstat -anplut|grep alert
    tcp6       0      0 :::9093                 :::*                    LISTEN      13175/alertmanager  
    tcp6       0      0 :::9094                 :::*                    LISTEN      13175/alertmanager  
    udp6       0      0 :::9094                 :::*                                13175/alertmanager  
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    验证 浏览器访问alertmanager管理页面
    浏览器访问 http://IP:9093,显示下图表示无误~
    在这里插入图片描述

    2. Webhook-dingtalk安装启动

    根据服务器情况选择安装目录,上传安装包。

    [root@nfs prom_alert]# ls
    alertmanager                            prometheus-webhook-dingtalk-2.1.0.linux-amd64.tar.gz
    alertmanager-0.25.0.linux-amd64.tar.gz
    [root@nfs prom_alert]# tar xf prometheus-webhook-dingtalk-2.1.0.linux-amd64.tar.gz 
    [root@nfs prom_alert]# mv prometheus-webhook-dingtalk-2.1.0.linux-amd64 prometheus-webhook-dingtalk
    [root@nfs prom_alert]# cd prometheus-webhook-dingtalk
    [root@nfs webhook-dingtalk]# ls
    config.example.yml  contrib  LICENSE  prometheus-webhook-dingtalk
    [root@nfs webhook-dingtalk]# cp config.example.yml config.yml
    [root@nfs alertmanager]# pwd
    /prom_alert/alertmanager
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    使用systemd管理,启动 && 开机自启

    [root@nfs prometheus-webhook-dingtalk]# vim /usr/lib/systemd/system/dingtalk.service 
    [Unit]
    Description=dingtalk
    Documentation=https://github.com/timonwong/prometheus-webhook-dingtalk/
    After=network.target
    
    [Service]
    Restart=on-failure
    WorkingDirectory=/prom_alert/prometheus-webhook-dingtalk
    ExecStart=/prom_alert/prometheus-webhook-dingtalk/prometheus-webhook-dingtalk --config.file=/prom_alert/prometheus-webhook-dingtalk/config.yml
    
    [Install]
    WantedBy=multi-user.target
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    [root@nfs prometheus-webhook-dingtalk]# systemctl daemon-reload
    [root@nfs prometheus-webhook-dingtalk]# systemctl start dingtalk
    [root@nfs prometheus-webhook-dingtalk]# systemctl enable dingtalk
    [root@nfs prometheus-webhook-dingtalk]# systemctl status dingtalk
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    查看端口8060

    [root@nfs prometheus-webhook-dingtalk]# netstat -anplut|grep 8060
    tcp6       0      0 :::8060                 :::*                    LISTEN      14291/prometheus-we 
    
    
    • 1
    • 2
    • 3

    3. 配置及测试

    3.1 Webhook-dingtalk配置钉钉webhook地址

    1、 只改以下三处即可,如下图:
    加签秘钥、webhook地址是咱们在钉钉创建机器人时获取的!

    vim /prom_alert/prometheus-webhook-dingtalk/config.yml 
    
    • 1

    在这里插入图片描述
    2、添加钉钉报警模板(注意复制完整,别少这少那,多这多那!因为我就没注意犯了错,浪费了一些时间!)

    [root@nfs prometheus-webhook-dingtalk]# vim template.tmpl
    {{ define "__subject" }}
    [{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}]
    {{ end }}
     
     
    {{ define "__alert_list" }}{{ range . }}
    ---
    {{ if .Labels.owner }}@{{ .Labels.owner }}{{ end }}
     
    **告警主题**: {{ .Annotations.summary }}
    
    **告警类型**: {{ .Labels.alertname }}
     
    **告警级别**: {{ .Labels.severity }} 
     
    **告警主机**: {{ .Labels.instance }} 
     
    **告警信息**: {{ index .Annotations "description" }}
     
    **告警时间**: {{ dateInZone "2006.01.02 15:04:05" (.StartsAt) "Asia/Shanghai" }}
    {{ end }}{{ end }}
     
    {{ define "__resolved_list" }}{{ range . }}
    ---
    {{ if .Labels.owner }}@{{ .Labels.owner }}{{ end }}
    
    **告警主题**: {{ .Annotations.summary }}
    
    **告警类型**: {{ .Labels.alertname }} 
     
    **告警级别**: {{ .Labels.severity }}
     
    **告警主机**: {{ .Labels.instance }}
     
    **告警信息**: {{ index .Annotations "description" }}
     
    **告警时间**: {{ dateInZone "2006.01.02 15:04:05" (.StartsAt) "Asia/Shanghai" }}
     
    **恢复时间**: {{ dateInZone "2006.01.02 15:04:05" (.EndsAt) "Asia/Shanghai" }}
    {{ end }}{{ end }}
     
     
    {{ define "default.title" }}
    {{ template "__subject" . }}
    {{ end }}
     
    {{ define "default.content" }}
    {{ if gt (len .Alerts.Firing) 0 }}
    **====侦测到{{ .Alerts.Firing | len  }}个故障====**
    {{ template "__alert_list" .Alerts.Firing }}
    ---
    {{ end }}
     
    {{ if gt (len .Alerts.Resolved) 0 }}
    **====恢复{{ .Alerts.Resolved | len  }}个故障====**
    {{ template "__resolved_list" .Alerts.Resolved }}
    {{ end }}
    {{ end }}
     
     
    {{ define "ding.link.title" }}{{ template "default.title" . }}{{ end }}
    {{ define "ding.link.content" }}{{ template "default.content" . }}{{ end }}
    {{ template "default.title" . }}
    {{ template "default.content" . }}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65

    3、刷新服务

    systemctl restart dingtalk
    systemctl status dingtalk
    
    • 1
    • 2

    3.2 Alertmanager配置钉钉告警

    1、修改配置

    [root@nfs prometheus-webhook-dingtalk]# vim /prom_alert/alertmanager/alertmanager.yml
    
    route:
      group_by: ['dingding']
      group_wait: 30s
      group_interval: 5m
      repeat_interval: 1h
      receiver: 'dingding.webhook1'
      routes:
      - receiver: 'dingding.webhook1'
        match_re:
          alertname: ".*"
    receivers:
      - name: 'dingding.webhook1'
        webhook_configs:
        - url: 'http://localhost:8060/dingtalk/webhook1/send'
          send_resolved: true
    inhibit_rules:
      - source_match:
          severity: 'critical'
        target_match:
          severity: 'warning'
        equal: ['alertname', 'dev', 'instance']
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    在这里插入图片描述2、重启

    systemctl restart alertmanager
    systemctl status alertmanager
    
    • 1
    • 2

    3.3 Prometheus集成Alertmanager及告警规则配置

    1、修改prometheus配置

    [root@nfs alertmanager]# vim /prom/prometheus/prometheus.yml
    
    • 1

    在这里插入图片描述
    2、添加node_exporter告警规则

    [root@nfs prom_alert]# mkdir rule
    [root@nfs prom_alert]# cd rule/
    [root@nfs rule]# vim node_exporter.yml 
    
    groups:
    - name: 服务器资源监控
      rules:
      - alert: 内存使用率过高
        expr: 100 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 > 80
        for: 3m 
        labels:
          severity: 严重告警
        annotations:
          summary: "{{ $labels.instance }} 内存使用率过高, 请尽快处理!"
          description: "{{ $labels.instance }}内存使用率超过80%,当前使用率{{ $value }}%."
              
      - alert: 服务器宕机
        expr: up == 0
        for: 1s
        labels:
          severity: 严重告警
        annotations:
          summary: "{{$labels.instance}} 服务器宕机, 请尽快处理!"
          description: "{{$labels.instance}} 服务器延时超过3分钟,当前状态{{ $value }}. "
     
      - alert: CPU高负荷
        expr: 100 - (avg by (instance,job)(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 90
        for: 5m
        labels:
          severity: 严重告警
        annotations:
          summary: "{{$labels.instance}} CPU使用率过高,请尽快处理!"
          description: "{{$labels.instance}} CPU使用大于90%,当前使用率{{ $value }}%. "
          
      - alert: 磁盘IO性能
        expr: avg(irate(node_disk_io_time_seconds_total[1m])) by(instance,job)* 100 > 90
        for: 5m
        labels:
          severity: 严重告警
        annotations:
          summary: "{{$labels.instance}} 流入磁盘IO使用率过高,请尽快处理!"
          description: "{{$labels.instance}} 流入磁盘IO大于90%,当前使用率{{ $value }}%."
     
     
      - alert: 网络流入
        expr: ((sum(rate (node_network_receive_bytes_total{device!~'tap.*|veth.*|br.*|docker.*|virbr*|lo*'}[5m])) by (instance,job)) / 100) > 102400
        for: 5m
        labels:
          severity: 严重告警
        annotations:
          summary: "{{$labels.instance}} 流入网络带宽过高,请尽快处理!"
          description: "{{$labels.instance}} 流入网络带宽持续5分钟高于100M. RX带宽使用量{{$value}}."
     
      - alert: 网络流出
        expr: ((sum(rate (node_network_transmit_bytes_total{device!~'tap.*|veth.*|br.*|docker.*|virbr*|lo*'}[5m])) by (instance,job)) / 100) > 102400
        for: 5m
        labels:
          severity: 严重告警
        annotations:
          summary: "{{$labels.instance}} 流出网络带宽过高,请尽快处理!"
          description: "{{$labels.instance}} 流出网络带宽持续5分钟高于100M. RX带宽使用量{$value}}."
      
      - alert: TCP连接数
        expr: node_netstat_Tcp_CurrEstab > 10000
        for: 2m
        labels:
          severity: 严重告警
        annotations:
          summary: " TCP_ESTABLISHED过高!"
          description: "{{$labels.instance}} TCP_ESTABLISHED大于100%,当前使用率{{ $value }}%."
     
      - alert: 磁盘容量
        expr: 100-(node_filesystem_free_bytes{fstype=~"ext4|xfs"}/node_filesystem_size_bytes {fstype=~"ext4|xfs"}*100) > 90
        for: 1m
        labels:
          severity: 严重告警
        annotations:
          summary: "{{$labels.mountpoint}} 磁盘分区使用率过高,请尽快处理!"
          description: "{{$labels.instance}} 磁盘分区使用大于90%,当前使用率{{ $value }}%."
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80

    3、检查Prometheus的配置文件并重启
    检查配置文件很有必要,减少一些不必要的麻烦:promtool check config prometheus.yml

    [root@nfs prom_alert]# cd /prom/prometheus
    [root@nfs prom_alert]# ./promtool check config  prometheus.yml
    Checking prometheus.yml
      SUCCESS: 1 rule files found
     SUCCESS: prometheus.yml is valid prometheus config file syntax
    
    Checking /prom_alert/rule/node_exporter.yml
      SUCCESS: 8 rules found
    
    [root@nfs prom_alert]# systemctl restart prometheus
    [root@nfs prom_alert]# systemctl status prometheus
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    4、访问Prometheus Web页面可以查看到添加的规则,如下图:
    在这里插入图片描述

    4. 测试告警

    1、故意将exporter机器关机,模拟服务器宕机
    过了一会儿
    2、Prometheus 管理页面可以看到告警信息如下图:
    在这里插入图片描述
    3、Prometheus会将告警信息发送给Alertmanager,所以说Alertmanager页面可以看到告警信息如下图:
    在这里插入图片描述
    4、此时会发送到钉钉机器人告警,如下图所示:
    在这里插入图片描述

    七,大功告成

    多回顾,捋清楚那些复制粘贴的内容都是为什么这么做的

  • 相关阅读:
    nginx 禁止通过IP地址访问,只能通过域名访问
    LLM应用实战:当图谱问答(KBQA)集成大模型(三)
    【modbus协议】Modbus-TCP消息帧格式
    技术分享 | App常见bug解析
    怎样图片转文字?两分钟让你实现快速转文字
    【Java进阶篇】第一章 面向对象(下篇)
    scipy库统计模块stats
    【数据结构】平衡二叉搜索树(AVL树)——AVL树的概念和介绍、AVL树的简单实现、AVL树的增删查改
    端到端拥塞控制的本质
    第十四届蓝桥杯(Web应用开发)模拟赛1期-大学组
  • 原文地址:https://blog.csdn.net/Stephen_Daa/article/details/131140039