kk Blog —— 通用基础


date [-d @int|str] [+%s|"+%F %T"]
netstat -ltunp
sar -n DEV 1

TICK: I 时序数据库InfluxDB

wget https://repos.influxdata.com/rhel/8/x86_64/stable/influxdb-1.8.10.x86_64.rpm

基本概念 何谓时间序列数据库?

什么是时间序列数据库,最简单的定义就是数据格式里包含Timestamp字段的数据,比如某一时间环境的温度,CPU的使用率等。但是,有什么数据不包含Timestamp呢?几乎所有的数据其实都可以打上一个Timestamp字段。时间序列数据的更重要的一个属性是如何去查询它,包括数据的过滤,计算等等。

1、特色功能

时序性(Time Series):与时间相关的函数的灵活使用(诸如最大、最小、求和等);

度量(Metrics):对实时大量数据进行计算;

事件(Event):支持任意的事件数据,换句话说,任意事件的数据我们都可以做操作。

2、主要特点

schemaless(无结构),可以是任意数量的列;

min, max, sum, count, mean, median 一系列函数,方便统计;

Native HTTP API, 内置http支持,使用http读写;

Powerful Query Language 类似sql;

Built-in Explorer 自带管理工具。

1
2
3
4
5
6
7
8
9
10
11
# 路径:/usr/bin
influxd            # influxdb服务器
influx             # influxdb命令行客户端
influx_inspect     # 查看工具
influx_stress      # 压力测试工具
influx_tsm         # 数据库转换工具(将数据库从b1或bz1格式转换为tsm1格式)

# 路径:/var/lib/influxdb/
data               # 存放最终存储的数据,文件以.tsm结尾
meta               # 存放数据库元数据
wal                # 存放预写日志文件

服务端

1
service influxdb start

客户端

1
influx

名词解释

在具体的讲解influxdb的相关操作之前先说说influxdb的一些专有名词,这些名词代表什么。

database:数据库;

measurement:数据库中的表;

points:表里面的一行数据。

influxDB中独有的一些概念

Point由时间戳(time)、数据(field)和标签(tags)组成。

time:每条数据记录的时间,也是数据库自动生成的主索引;

fields:各种记录的值;

tags:各种有索引的属性。

还有一个重要的名词:series

所有在数据库中的数据,都需要通过图表来表示,series表示这个表里面的所有的数据可以在图标上画成几条线(注:线条的个数由tags排列组合计算出来)

命令

用户管理

1
2
3
4
5
6
7
8
9
#显示用户  
show users

#创建用户
create user "username" with password 'password'
#创建管理员权限用户create user "username" with password 'password' with all privileges

#删除用户
drop user "username"

数据库访问权限

1
2
3
4
5
6
7
创建权限 GRANT READ    ON mydb    TO leo   

撤消权限 REVOKE ALL    ON mydb    FROM leo 管理权限

创建集群管理权限 GRANT ALL PRIVILEGES TO leo

撤消集群管理权限 REVOKE ALL PRIVILEGES FROM leo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#创建数据库
create database "db_name"

#显示所有的数据库
show databases

#删除数据库
drop database "db_name"

#使用数据库
use db_name

#显示该数据库中所有的表
show measurements

#创建表,直接在插入数据的时候指定表名
insert test,host=127.0.0.1,monitor_name=test count=1

#删除表
drop measurement "measurement_name"


du -sh /var/lib/influxdb/data/

向数据库中插入数据。

通过命令行

1
2
use testDb
insert test,host=127.0.0.1,monitor_name=test count=1

通过http接口

1
curl -i -XPOST 'http://127.0.0.1:8086/write?db=testDb' --data-binary 'test,host=127.0.0.1,monitor_name=test count=1'

读者看到这里可能会观察到插入的数据的格式貌似比较奇怪,这是因为influxDB存储数据采用的是Line Protocol格式。那么何谓Line Protoco格式?

Line Protocol格式:写入数据库的Point的固定格式。 在上面的两种插入数据的方法中都有这样的一部分:

1
test,host=127.0.0.1,monitor_name=test count=1

其中:

1
2
3
test:表名;
host=127.0.0.1,monitor_name=test:tag;
count=1:field

想对此格式有详细的了解参见官方文档

查询数据库中的数据。

通过命令行

1
select * from test order by time desc

通过http接口

1
curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "db=testDb" --data-urlencode "q=select * from test order by time desc"

influxDB是支持类sql语句的

InfluxDB 数据保留策略操作

1
2
3
4
5
6
7
8
语法:CREATE RETENTION POLICY <retention_policy_name> ON <database_name> DURATION <duration> REPLICATION <n> [SHARD DURATION <duration>] [DEFAULT]

    <retention_policy_name>:保留策略名称
    <database_name>:数据库名称
    <duration>:保留策略对应数据的过期时间
    REPLICATION:副本因子
    SHARD DURATION:分片组默认时长
    [DEFAULT]:是否为默认的保留策略

创建数据保留策略

1
CREATE RETENTION POLICY  "influx_retention" ON "mydb" DURATION 30d REPLICATION DEFAULT;

查看保留期

1
SHOW RETENTION POLICIES ON mydb

修改保留期

1
ALTER RETENTION POLICY "influx_retention" ON mydb DURATION 15d

删除保留期

1
DROP RETENTION POLICY "influx_retention" ON mydb 

特色函数

influxdb函数分为聚合函数,选择函数,转换函数,预测函数等。除了与普通数据库一样提供了基本操作函数外,还提供了一些特色函数以方便数据统计计算,下面会一一介绍其中一些常用的特色函数。

聚合函数:FILL(), INTEGRAL(),SPREAD(), STDDEV(),MEAN(), MEDIAN()等。

选择函数: SAMPLE(), PERCENTILE(), FIRST(), LAST(), TOP(), BOTTOM()等。

转换函数: DERIVATIVE(), DIFFERENCE()等。

预测函数:HOLT_WINTERS()。

GROUP BY,FILL()

如下语句中 GROUP BY time(12m),* 表示以每12分钟和tag(location)分组(如果是GROUP BY time(12m)则表示仅每12分钟分组,GROUP BY 参数只能是time和tag)。然后fill(200)表示如果这个时间段没有数据,以200填充,mean(field_key)求该范围内数据的平均值(注意:这是依据series来计算。其他还有SUM求和,MEDIAN求中位数)。LIMIT 7表示限制返回的point(记录数)最多为7条,而SLIMIT 1则是限制返回的series为1个。

INTEGRAL(field_key, unit)

计算数值字段值覆盖的曲面的面积值并得到面积之和。测试数据如下:

SPREAD(field_key)

计算数值字段的最大值和最小值的差值。

1
2
3
4
5
6
7
8
    > SELECT SPREAD("water_level") FROM "h2o_feet" WHERE time >= '2015-08-17T23:48:00Z' AND time <= '2015-08-18T00:30:00Z' GROUP BY time(12m),* fill(18) LIMIT 3 SLIMIT 1 SOFFSET 1
    name: h2o_feet
    tags: location=santa_monica
    time                              spread
    ----                              ------
    2015-08-17T23:48:00Z            18
    2015-08-18T00:00:00Z             0.052000000000000046
    2015-08-18T00:12:00Z             0.09799999999999986

STDDEV(field_key)

计算字段的标准差。influxdb用的是贝塞尔修正的标准差计算公式 ,如下:

mean=(v1+v2+…+vn)/n;

stddev = math.sqrt(((v1-mean)2 + (v2-mean)2 + …+(vn-mean)2)/(n-1))

PERCENTILE(field_key, N)

选取某个字段中大于N%的这个字段值。

如果一共有4条记录,N为10,则10%*4=0.4,四舍五入为0,则查询结果为空。N为20,则 20% * 4 = 0.8,四舍五入为1,选取的是4个数中最小的数。如果N为40,40% * 4 = 1.6,四舍五入为2,则选取的是4个数中第二小的数。由此可以看出N=100时,就跟MAX(field_key)是一样的,而当N=50时,与MEDIAN(field_key)在字段值为奇数个时是一样的。

SAMPLE(field_key, N)

随机返回field key的N个值。如果语句中有GROUP BY time(),则每组数据随机返回N个值。

CUMULATIVE_SUM(field_key)

计算字段值的递增和。

DERIVATIVE(field_key, unit) 和 NON_NEGATIVE_DERIVATIVE(field_key, unit)

计算字段值的变化比。unit默认为1s,即计算的是1秒内的变化比。

如下面的第一个数据计算方法是 (2.116-2.064)/(6*60) = 0.00014..,其他计算方式同理。虽然原始数据是6m收集一次,但是这里的变化比默认是按秒来计算的。如果要按6m计算,则设置unit为6m即可。

http://wjhsh.net/dehai-p-4883451.html

http://t.zoukankan.com/jackyroc-p-7677508.html

https://blog.csdn.net/qq_43386944/article/details/122719668

https://www.bbsmax.com/A/B0zqgWx85v/

TICK: T 数据采集工具Telegraf

wget https://repos.influxdata.com/rhel/8/x86_64/stable/telegraf-1.23.4-1.x86_64.rpm

基本概念

telegraf 属于 TICK 技术栈中的T

Telegraf 是一个用Go语言编写的代理程序,可收集系统和服务的统计数据,并写入到InfluxDB数据库。内存占用小,通过插件系统可轻松添加支持其他服务的扩展。

Telegraf metric是用于在处理期间对数据建模的内部表示,这些指标完全基于InfluxDB的数据模型,包含四个主要组件:

度量名称(Measurement)

标签(tags)

字段(Field)

时间戳

为什么要用Telegraf ?

可以采集多种组件的运行信息cpu memory,不需要手动写定时脚本采集,降低了数据的获取难度

配置简单

与InfluxDB完美结合

按照时间序列采集数据

轻量级,占用内存小

安装

rpm -ivh telegraf-1.23.4-1.x86_64.rpm

配置

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
interval = "60s"

[root@localhost ~]# diff /etc/telegraf/telegraf.conf /etc/telegraf/telegraf.conf.orig 
106c106
<   hostname = "192.168.100.197"
---
>   hostname = ""
130,136d129
<      urls = ["http://192.168.100.178:8086"] # required 
<      database = "telegraf" # required
<      timeout = "5s"
<      username = "telegraf"
<      password = "password"
< 
< 
5849,5850c5842
< [[inputs.net]]
<       interfaces = ["eth*", "enp0s[0-1]", "lo"]
---
> 
6081,6085d6072
< [[inputs.nstat]]
<     proc_net_netstat = "/proc/net/netstat"
<     proc_net_snmp = "/proc/net/snmp"
<     proc_net_snmp6 = "/proc/net/snmp6"
<     dump_zeros       = true

add

1
2
3
4
[[inputs.procstat]]
	exe = "mariadbd"
[[inputs.procstat]]
	exe = "httpd"

window telegraf

https://blog.csdn.net/chen_221/article/details/125664892

1.下载最新telegraf压缩包

https://github.com/influxdata/telegraf/releases

将解压出来文件复制到 C:\Program Files\telegraf 下

修改 telegraf.conf 文件

1
2
3
4
5
6
7
8
9
10
11
12
# 修改这两个配置, 新增会重复导致失败 .\telegraf.exe --debug
interval = "60s"
hostname = "192.168.100.196"


# 新增下面配置
[[outputs.influxdb]]
	urls = ["http://192.168.100.178:8086"]
	database = "telegraf"
	timeout = "5s"
	username = "telegraf"
	password = "password"

注册Windows服务

运行powershell,进入 C:\Program Files\telegraf 文件夹,执行 .\telegraf.exe -service install 后查看服务, 然后启动服务即可

.\telegraf.exe -service uninstall

Linux中使用Dnsmasq部署DNS服务

是所有域名解析到同一地址

1
address=/#/192.168.2.1
1
2
3
address=/com/192.168.2.1
address=/net/192.168.2.1
address=/cn/192.168.2.1

libvirtd 服务会占用 53端口,需要限停用:

虚拟网卡virbr0


https://ywnz.com/linuxyffq/2267.html

Dnsmasq提供了DNS缓存、DHCP服务与Tftp服务功能。本文将用它在Linux中部署DNS服务,作为域名解析服务器(DNS),Dnsmasq可以通过缓存DNS请求来提高对访问过的网址的连接速度。作为DHCP服务器,Dnsmasq可以为局域网电脑提供内网ip地址和路由。DNS和DHCP两个功能可以同时或分别单独实现。Dnsmasq轻量且易配置,适用于个人用户或少于50台主机的网络。此外它还自带了一个PXE服务器。

Dnsmasq工作原理

当接受到一个DNS请求时,Dnsmasq首先会查找/etc/hosts这个文件,然后查找/etc/resolv.conf中定义的外部DNS。所以说Dnsmasq是一个很不错的外部DNS中继。

配置Dnsmasq为DNS缓存服务器,同时在/etc/hosts文件中加入本地内网解析,这样一来每当内网机器查询时就会优先查询hosts文件,这就等于将/etc/hosts共享给全内网机器使用,从而解决内网机器互相识别的问题。相比逐台机器编辑hosts文件或者添加Bind DNS记录,仅编辑一个hosts文件,这简直太容易了。

安装Dnsmasq

1
2
$ apt-get install dnsmasq
$ yum install dnsmasq

配置Dnsmasq

Dnsmasq处理DNS设置与BIND等其他DNS服务有所不同。所有的配置都在一个文件中完成/etc/dnsmasq.conf。默认情况下dnsmasq.conf中只开启了最后include项,可以在/etc/dnsmasq.d中自己写任意名字的配置文件。

配置文件说明

Dnsmasq配置文件是/etc/dnsmasq.conf,下面对Dnsmasq中和DNS相关的配置项进行说明。

port=53

用指定的端口代替默认的DNS 53端口,如果设置为0,则完全禁止DNS功能,只使用dhcp服务

以下两个参数告诉Dnsmasq过滤一些查询:

domain-needed 从不转发格式错误的域名

bogus-priv 从不转发不在路由地址中的域名

resolv-file

配置Dnsmasq额外的向流的DNS服务器,如果不开启就使用linux主机默认的/etc/resolv.conf里的nameserver,通过下面的选项指定其他文件。

1
resolv-file=/etc/dnsmasq.d/upstream_dns.conf

strict-order

默认情况下Dnsmasq会发送查询到它的任何上游DNS服务器上,如果取消注释,则Dnsmasq则会严格按照/etc/resolv.conf中的DNS Server顺序进行查询。

上游服务器

以下两个参数控制是否通过/etc/resolv.conf确定上游服务器,是否检测/etc/resolv.conf的变化,则取消注释。

no-resolv 如果你不想Dnsmasq读取/etc/resolv.conf文件或者其他文件,获得它的servers

no-poll 如果你不允许Dnsmasq通过轮询/etc/resolv.conf或者其他文件来获取配置的改变,则取消注释。

增加一个name server,一般用于内网域名

1
server=/localnet/192.168.0.1

设置一个反向解析,所有192.168.3.0/24的地址都到10.1.2.3去解析

1
server=/3.168.192.in-addr.arpa/10.1.2.3

增加一个本地域名,会在/etc/hosts中进行查询

1
local=/localnet/

增加一个域名,强制解析到你指定的地址上

1
address=/double-click.net/127.0.0.1

同上,还支持ipv6

1
address=/www.thekelleys.org.uk/fe80::20d:60ff:fe36:f83

增加查询yahoo google和它们的子域名到vpn、search查找

1
ipset=/yahoo.com/google.com/vpn,search

你还可以控制Dnsmasq和Server之间的查询从哪个网卡出去

1
server=10.1.2.3@eth1

指定源地址携带10.1.2.3地址和192.168.1.1的55端口进行通讯

1
server=10.1.2.3@192.168.1.1#55

改变Dnsmasq默认的uid和gid

1
2
user=
group=

如果你想Dnsmasq监听某个端口为dhcp、dns提供服务

1
interface=

你还可以指定哪个端口你不想监听

1
except-interface=

设置想监听的地址,如果你本机要使用写上127.0.0.1。

1
listen-address=

如果你想在某个端口只提供dns服务,则可以进行配置禁止dhcp服务

1
no-dhcp-interface=

On systems which support it, dnsmasq binds the wildcard address, even when it is listening on only some interfaces. It then discards requests that it shouldn’t reply to. This has the advantage of working even when interfaces come and go and change address. If you want dnsmasq to really bind only the interfaces it is listening on, uncomment this option. About the only time you may need this is when running another nameserver on the same machine.

1
bind-interfaces

如果你不想使用/etc/hosts,则取消下面的注释

1
no-hosts

如果你项读取其他类似/etc/hosts文件,则进行配置

1
addn-hosts=/etc/banner_add_hosts

自动的给hosts中的name增加一个域名

1
expand-hosts

给dhcp服务赋予一个域名

1
domain=thekelleys.org.uk

给dhcp的一个子域赋予一个不同的域名

1
domain=wireless.thekelleys.org.uk,192.168.2.0/24

同上,不过子域是一个范围

1
domain=reserved.thekelleys.org.uk,192.68.3.100,192.168.3.200

dhcp分发ip的范围,以及每个ip的租约时间

1
dhcp-range=192.168.0.50,192.168.0.150,12h

同上,不过给出了掩码

1
dhcp-range=192.168.0.50,192.168.0.150,255.255.255.0,12h

自动加载conf-dir目录下的配置文件

1
conf-dir=/etc/dnsmasq.d

设置dns缓存大小,默认为150条

1
cache-size=150

配置实例

配置上游服务器地址

resolv-file配置Dnsmasq额外的上游的DNS服务器,如果不开启就使用Linux主机默认的/etc/resolv.conf里的nameserver。

1.通过下面的选项指定其他文件来管理上游的DNS服务器

1
2
$ vi /etc/dnsmasq.conf
resolv-file=/etc/resolv.dnsmasq.conf

2.在指定文件中增加转发DNS的地址

1
2
3
$ vi /etc/resolv.dnsmasq.conf
nameserver 8.8.8.8
nameserver 8.8.4.4

本地启用Dnsmasq解析

1
2
$ vi /etc/resolv.conf
nameserver 127.0.0.1

添加解析记录

1.使用系统默认hosts

编辑hosts文件,简单列举一下格式

1
2
3
4
5
$ vi /etc/hosts

127.0.0.1  localhost
192.168.101.107   web01.mike.com web01
192.168.101.107   web02.mike.com web02

2.使用自定义hosts文件

修改配置,增加自定义hosts文件位置。

1
2
$ vi /etc/dnsmasq.conf
addn-hosts=/etc/dnsmasq.hosts

在/etc/dnsmasq.hosts文件中添加DNS记录

1
2
3
$ vi /etc/dnsmasq.hosts
192.168.101.107   web01.mike.comweb01
192.168.101.107   web02.mike.comweb02

3.使用自定义conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ vi /etc/dnsmasq.d/address.conf

# 指定dnsmasq默认查询的上游服务器,此处以Google Public DNS为例。
server=8.8.8.8
server=8.8.4.4

# 把所有.cn的域名全部通过114.114.114.114这台国内DNS服务器来解析
server=/cn/114.114.114.114

# 给*.apple.com和taobao.com使用专用的DNS
server=/taobao.com/223.5.5.5
server=/.apple.com/223.5.5.5

# 把ywnz.com的二级域名(比如前面加www)解析到特定的IP
address=/ywnz.com的二级域名(比如前面加www)/192.168.101.107

在这里ywnz.com相当于*.mike.com泛解析
address=/ywnz.com/192.168.101.107

注:也可以直接添加到/etc/dnsmasq.conf中,不过/etc/dnsmasq.d/*.conf的优先级大于/etc/dnsmasq.conf。

修改iptables配置

1.允许本机的53端口可对外访问

1
2
$ iptables -A INPUT -p udp -m udp --dport 53 -j ACCEPT
$ iptables -A INPUT -p tcp -m tcp --dport 53 -j ACCEPT

2.转发DNS请求

1
2
$ echo '1' > /proc/sys/net/ipv4/ip_forward
$ echo '1' > /proc/sys/net/ipv6/ip_forward   # IPv6 用户选用

添加流量转发规则,将外部到53的端口的请求映射到Dnsmasq服务器的53端口

1
2
$ iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 53
$ iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 53

如果要限制只允许内网的请求,方法如下

1
$ iptables -t nat -A PREROUTING -i eth1 -p upd --dport 53 -j REDIRECT --to-port 53

3.保存规则并重启

1
2
$ service iptables save
$ service iptables restart

测试Dnsmasq

1.启动Dnsmasq

1
$ service dnsmasq start

2.测试Dnsmasq

将其他机器的DNS换成dnsmasq所在的IP即可,就这么容易。

1
$ dig @192.168.101.104 ywnz.com

一些Dnsmasq技巧

Dnsmasq性能优化

我们都知道Bind不配合数据库的情况下,经常需要重新载入并读取配置文件,这是造成性能低下的原因。根据这点教训,我们可以考虑不读取/etc/hosts文件。而是另外指定一个在共享内存里的文件,比如/dev/shm/dnsrecord.txt ,这样就不费劲了,又由于内存的非持久性,重启就消失,可以定期同步硬盘上的某个内容到内存文件中。

具体实现步骤:

1.配置dnsmasq

1
2
3
4
$ vim /etc/dnsmasq.conf

no-hosts
addn-hosts=/dev/shm/dnsrecord.txt

2.解决同步问题

开机启动

1
$ echo "cat /etc/hosts > /dev/shm/dnsrecord.txt" >>/etc/rc.local

定时同步内容

1
2
3
$ crontab -e

*/10 * * * * cat /etc/hosts > /dev/shm/dnsrecord.txt

Dnsmasq选择最快的上游DNS服务器

经常会有这样的情景,Dnsmasq服务器配了一堆上游服务器,转发本地的dns请求,缺省是Dnsmasq事实上是只挑了一个上游dns服务器来查询并转发结果,这样如果选错服务器的话会导致DNS响应变慢。

1
2
3
4
5
6
$ vi /etc/dnsmasq.conf

all-servers

server=8.8.8.8
server=219.141.136.10

all-servers表示对以下设置的所有server发起查询,选择回应最快的一条作为查询结果返回。

上面我们设置了两个dns server,8.8.8.8(谷歌dns)和219.141.136.10(移动的dns),会同时查询这两个服务器,询问dns地址谁返回快就采用谁的结果。