mysqld_exporter 安装 下载慢,请查看软件下载列表 https://prometheus.io/download/ cd /usr/local/src/ wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.12.1/mysqld_exporter-0.12.1.darwin-amd64.tar.gz tar -zxvf mysqld_exporter-0.12.1.darwin-amd64.tar.gz -C /usr/local/ mv /usr/local/mysqld_exporter-0.12.1.darwin-amd64 /usr/local/mysqld_exporter 创建 .my.cnf 文件 host 主机地址 user mysql名称 password mysql密码 cat > /usr/local/mysqld_exporter/.my.cnf << EOF [client] host=127.0.0.1 user=root password=root EOF 创建 systemd 服务 cat > /lib/systemd/system/mysqld_exporter.service << EOF [Unit] Description=mysqld_exporter Documentation=https://prometheus.io/ After=network.target [Service] Type=simple User=root ExecStart=/usr/local/mysqld_exporter/mysqld_exporter --config.my-cnf=/usr/local/mysqld_exporter/.my.cnf KillMode=process Restart=on-failure RestartSec=10s [Install] WantedBy=multi-user.target EOF 启动 systemctl daemon-reload systemctl start mysqld_exporter systemctl status mysqld_exporter 验证 metrics 显示有数据则表示已经采集到数据啦。

Debug 调试

Linux 网络调试 tcpdump 监听网卡 eth0 及 端口 80 tcpdump -i eth0 -nnA 'port 80'
.1. 简介 Grafana是一个开源的度量分析和可视化工具,可以通过将采集的数据分 析,查询,然后进行可视化的展示,并能实现报警 官网:https://grafana.com/ .2. 源码安装 官方最新版本下载:https://grafana.com/grafana/download # 下载 cd /usr/local/src wget https://dl.grafana.com/oss/release/grafana-7.1.5.linux-amd64.tar.gz wget https://dl.grafana.com/oss/release/grafana-9.0.0.linux-amd64.tar.gz # 解压 tar -zxvf /grafana-7.1.5.linux-amd64.tar.gz -C /usr/local # 重命名文件夹 grafana mv /usr/local/grafana-7.1.5.linux-amd64 /usr/local/grafana .3. RPM 方式安装 wget https://dl.grafana.com/enterprise/release/grafana-enterprise-9.0.0-1.x86_64.rpm sudo yum install grafana-enterprise-9.0.0-1.x86_64.rpm sudo systemctl daemon-reload sudo systemctl start grafana-server sudo systemctl status grafana-server sudo systemctl enable grafana-server 创建 systemd 服务 -homepath grafana的工作目录。 cat > /lib/systemd/system/grafana.service << EOF [Unit] Description=Grafana Documentation=https://grafana.com/ After=network.target [Service] Type=notify ExecStart=/usr/local/grafana/bin/grafana-server -homepath /usr/local/grafana/ Restart=on-failure RestartSec=42s [Install] WantedBy=multi-user.
基于 CentOS 7 amd64 系统 Prometheus 多维数据模型(有metric名称和键值对确定的时间序列) 灵活的查询语言 不依赖分布式存储 通过pull方式采集时间序列,通过http协议传输 支持通过中介网关的push时间序列的方式 监控数据通过服务或者静态配置来发现 支持图表和dashboard等多种方式 组件: Prometheus 主程序,主要是负责存储、抓取、聚合、查询方面。 Alertmanager 程序,主要是负责实现报警功能。 Pushgateway 程序,主要是实现接收由Client push过来的指标数据,在指定的时间间隔,由主程序来抓取。 node_exporter 监控远程 linux 服务器CPU、内存、磁盘、I/O等信息 生态架构图 普罗米修斯的体系结构及其一些生态系统组件 https://prometheus.io/docs/introduction/overview/ 工作流程 Prometheus 服务器定期从配置好的 jobs 或者 exporters 中获取度量数据;或者接收来自推送网关发送过来的 度量数据。 Prometheus 服务器在本地存储收集到的度量数据,并对这些数据进行聚合; 运行已定义好的 alert.rules,记录新的时间序列或者向告警管理器推送警报。 告警管理器根据配置文件,对接收到的警报进行处理,并通过email等途径发出告警。 Grafana等图形工具获取到监控数据,并以图形化的方式进行展示。 Client Library 提供度量的四种类型 Counter 类型: 计数器。 是一个累计的指标,代表一个单调递增的计数器,它的值只会增加或在重启时重置为零。 一般用于记录访问数,错误数,任务数等 Gauge 类型:计量器。 是代表一个数值类型的指标,它的值可以增或减 如CPU的负载,协程数,并发请求量,内存使用量等 Histogram 柱状图 是一种累积直方图,在一段时间范围内对数据进行采样,并将其计入可配置的存储桶(bucket)中。 histogram并不会保存数据采样点值,每个bucket只有记录样本数的counter,即histogram存储是区间的样本数据统计值。 如请求持续时间或响应大小等。 Summary 摘要 是对百分数进行统计的。 即在一段时间内(默认10分钟)的每个采样点进行统计,并形成分位图 (如:正态分布一样,统计低于60分不及格的同学比例,统计低于80分的同学比例,统计低于95分的同学比例) 参考 文档下载 官方文档 非官方中文文档 CentOS7.5 Prometheus2.
Docker映射端口时仅有IPv6无法到IPv4解决方法 启动 docker 某服务,只显示 ipv6 的端口信息。ipv4 无端口信息,导致外部无法通过 ipv4 访问服务,报 Connection refused 错误 解决方法 在服务器上禁用 ipv6 vim /etc/default/grub 在第6行中增加 ipv6.disable=1 GRUB_CMDLINE_LINUX="ipv6.disable=1 crashkernel=auto spectre_v2=retpoline rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet" 重新配置grub并重启服务器 grub2-mkconfig -o /boot/grub2/grub.cfg reboot WARNING: bridge-nf-call-iptables is disabled WARNING: bridge-nf-call-iptables is disabled WARNING: bridge-nf-call-ip6tables is disabled 解决方法 vim /etc/sysctl.conf # 添加以下二行内容 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 # 然后使其生效 sysctl -p /etc/sysctl.conf # 验证 docker info docker 磁盘不足 第一步: 查看服务的磁盘情况 df -h 第二步:查看 docker 使用的磁盘路径
用最少的语言记住更多的东西 本文提纲 设计模式的目的 高内聚,低耦合 可重用性 可扩展性 可阅读性 可靠性 1. 单一职责原则(SRP) 单一职责原则提出了一个编写程序的标准,用”职责“或”变化原因“来衡量接口或类设计得是否优良。 Single Responsibility Principle 一个类(方法)只描述一件事, 应该有且仅有一个原因引起的变更。 There should never be more than one reason for a class to change(一个类的变化不应该有一个以上的原因引起) 单一职责原则好处 类的复杂性降低,实现什么职责都有清晰明确的定义 可读性提高,复杂性降低,那当然可读性提高了。 可维护性提高,可读性提高,那当然更容易维护了。 变更引起的风险降低。变更是必不可少的,如果接口单一职责做得好,一个接口修改只对相应的实现类有影响,对其它接口无影响,这对系统的扩展性,维护性都有非常大的帮助。 2. 开闭原则(OCP) Open Closed Principle 3W原则: What 是什么,Why为什么,How怎么做。 对修改关闭,对扩展开放 3. 接口隔离原则(ISP) Interface Segregation Principle 定义单一接口,不要建立臃肿庞大的接口。 客户端不应该依赖它不需要的接口 类间的依赖关系应该建立在最小接口上 接口隔离原则拆分接口时,首先必须满足单一职责原则 接口要高内聚 少使用public方法,接口对外承诺越少,对系统开发越有利,变更的风险也就越少,同时也有利于降低成本。 定制服务 就是单独为一个个体提供优良的服务。 只提供访问者需要的方法。 接口设计 是有限度的 接口的设计粒度越小,系统越灵活 一个接口只服务于一个子模块或业务逻辑。 接口隔离原则与单一职责原则的区别 接口隔离原则要求接口中的方法尽量少,专门的接口。 单一职责原则注重的是职责,是业务逻辑上的划分。 4. 里氏替换原则(LSP) Liskov Substitution Principle
什么是设计模式 设计模式 (Design pattern) 代表了最佳实践 通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。 使用设计模式是为了重用代码,让代码更容易被他人理解,保证代码可靠性。 设计模式是软件工程的基石,如同大厦的一块块砖石一样。 项目中合理使用设计模式可以完美解决很多问题,每种设计模式都描述了我们周围不断重复发生的问题,以及该问题核心解决方案。 什么是GOF 在 1994 年,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人合著出版了一本名为 Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向对象软件元素) 的书 四位作者合称 GOF(四人帮,全拼 Gang of Four) 他们所提出的设计模式主要是基于以下的面向对象设计原则。 对接口编程而不是对实现编程 优先使用对象组合而不是继承 设计模式的类型 根据设计模式的参考书 Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向对象软件元素) 中所提到的,总共有 23 种设计模式。这些模式可以分为三大类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)、行为型模式(Behavioral Patterns)

Go 并发

golang 天生语言层面支持并发, 非常棒的语言, 有时我们业务开发时, 遇到复杂场景, 需要用于并发, 将多个请求使用协程组完成并发, 当遇到嵌套循环,还存在上下文关系需要改造为并发请求, 将之前的时间复杂度为O(n^2)改为O(n)的时间复杂度, 那是否还能否并时间复杂度进一步降为O(1)呢? 就出现嵌套并发. 具体如何嵌套并发, 如何写. 今天就一步一步分析. 串行执行 时间复杂度为O(n^2) 不使用并发 结果执行时间为 9s // 串行执行 func SerializeRun() { start := time.Now() xx := []int{1, 2, 3} yy := []int{100, 200, 300} for _, x := range xx { for _, y := range yy { abc(x, y) } } fmt.Printf("串行执行总时间:%s\n", time.Since(start)) } func abc(x, y int) { time.Sleep(time.Second * 1) fmt.Printf("x:%d, y:%d\n", x, y) } 执行结果
写项目时,有时我们需要缓存, 缓存就会需要唯一的key. 常规是对字符串求md5指纹. 在golang里我们也可以使用, 目前可以计算一个字符串的crc32, md5, sha1的指纹. md5 : 一种被广泛使用的密码散列函数,可以产bai生出一个128位(du16字节)的散列值(hash value),用于确保信息传输完整一zhi致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。 sha1: SHA1是由NISTNSA设计为同DSA一起使用的,它对长度小于264的输入,产生长度为160bit的散列值,因此抗穷举(brute-force)性更好。SHA-1基于MD5,MD5又基于MD4。 crc32: 本身是“冗余校验码”的意思,CRC32则表示会产生一个32bit(8位十六进制数)的校验值。由于CRC32产生校验值时源数据块的每一个bit(位)都参与了计算,所以数据块中即使只有一位发生了变化,也会得到不同的CRC32值。 golang 实现 md5 // md5值 func Md5Str(s string) string { hash := md5.Sum([]byte(s)) return hex.EncodeToString(hash[:]) } sha1 // 散列值 func Sha1Str(s string) string { r := sha1.Sum([]byte(s)) return hex.EncodeToString(r[:]) } crc32 // String hashes a string to a unique hashcode. // https://github.com/hashicorp/terraform/blob/master/helper/hashcode/hashcode.go // crc32 returns a uint32, but for our use we need // and non negative integer.
采用 centos 安装, jmeter 5.3版本 安装 java jdk 环境 JDK1.8版本即可满足 yum install java-1.8.0-openjdk 下载 jmeter cd /home/ wget https://mirrors.bfsu.edu.cn/apache//jmeter/binaries/apache-jmeter-5.3.zip unzip apache-jmeter-5.3.zip cd apache-jmeter-5.3 pwd 配置环境变量 官方下载: https://jmeter.apache.org/download_jmeter.cgi export JMETER=/home/apache-jmeter-5.3 export CLASSPATH=$JMETER/lib/ext/ApacheJMeter_core.jar:$JMETER/lib/jorphan.jar:$JMETER/lib/logkit-2.0.jar:$CLASSPATH export PATH=$JMETER/bin/:$PATH 使用 首先在 window 版本上新建jmx文件, 然后保存为测试计划. 将 jmx 文件上传到 linux , 使用以下命令运行即可. 得到 jtl 结果文件, 下载下来, 导入到可视化界面上,即可查看到分析的结果. jmeter -n -t test.jmx -l test.jtl 图示: 保存 test.jmx 文件 图示: 导入分析结果