Jesse's home


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

Kibana图表制作

发表于 2020-08-25 | 分类于 elk |

Kibana图表制作

kibana的可视化可以制作各种统计分析图表,然后合并展示到dashbord中.下面介绍一些常用的nginx的访问图表.

在kibana7.7版本中可以配置kibana web界面的中文语言.

编辑kibana配置文件,/etc/kibana/kibana.yml,加入以下配置:

i18n.locale: "zh-CN"

一.统计过去XXX时间的访问量

在可视化界面,添加仪表盘图表.指定nginx的openapi access访问日志索引.

无需进行任何配置,选择右上角的时间范围,会显示计数,也就是日志量的计数

image-20200723154706247

阅读全文 »

kibana查询语法

发表于 2020-08-25 | 分类于 elk |

kibana查询语法

介绍

在kibana6.3版本开始,kibana引入了Kibana Query Language(KQL)查询语法.并且从7.0版本开始已经是Kibana的默认查询语言.KQL包含脚本化字段查询和简易化的查询.

image-20200724104504825

kibana支持以下两种查询语法:

  • Kibana query language (KQL)

  • Lucene query syntax (Lucene)


阅读全文 »

kibana索引及索引冷热分离管理

发表于 2020-08-25 | 分类于 elk |

kibana索引及索引冷热分离管理

介绍

本篇文档简单介绍一下kibana的索引管理.主要包括:

  • 索引模板
  • 索引模式
  • 索引生命周期
  • 索引冷热分离管理
  • 索引模板配置

索引模板

ES自带一个默认的logstash-*的索引模板,es内部维护了template,template定义好了mapping,只要index的名称被template匹配到,那么该index的mapping就按照template中定义的mapping自动创建。而且template中定义了index的shard分片数量、replica副本数量等等属性。

所以我们每次新建一个索引的时候,不需要手动创建mapping映射,也不需要手动设置副本和分片数量.

在Kibana的图形化界面中可以看到ES默认的索引模板

阅读全文 »

生产环境部署ELK7+ES冷热数据分离

发表于 2020-08-25 | 分类于 elk |

生产环境部署ELK7+ES冷热数据分离

需求整理

当前公司还没有日志收集系统,.线上故障排错需要开发和运维人员通过跳板机登陆到业务服务器去查看日志,如果集群下服务器节点较多,可能需要登陆到每一台服务器才能找到准确的故障信息.这种方式会带来许多问题:

  • 效率低下
  • 需要给研发人员分配生产服务器账号,有安全隐患
  • 查看日志的方式极为麻烦,复杂
  • 每台业务服务器需要大容量磁盘保存日志文件

Elasticsearch冷热数据分离

公司目前共有4个APP产品,每天的nginx日志+业务日志+php日志总共预计在1.5T左右.一周的日志数据量在10T左右.Elasticsearch规划了20T的SSD磁盘用来一周的日志数据(7天日志+1个副本).这些数据保存在Elasticsearch的热节点.

考虑到1周以后的日志数据查询频率非常低,所以可以将这部分的日志迁移和归档到Elasticsearch的冷节点.并且冷节点日志无需索引.所以预留了10T的SAS磁盘保留1周的冷数据.

总共是20TSSD磁盘的热节点和10TSAS机械磁盘的冷节点

阅读全文 »

记一次生产ELK性能优化

发表于 2020-08-25 | 分类于 elk |

记一次生产ELK性能优化

ES上线后遇到一些问题:

一.内存压力过高

目前ES节点的有两种规格内存.

80GB内存(节点同时运行了Logstash,分配了16G给logstash).

54GB内存(只运行ES,并且只作为data节点)

ES的JVM内存从32G下降到28G.建议JVM内存是总物理内存的一半左右,

节点内存使用情况如下:

1
2
3
4
5
6
7
8
9
"mem": { - 
"total": "78.5gb",
"total_in_bytes": 84296601600,
"free": "4.3gb",
"free_in_bytes": 4688633856,
"used": "74.1gb",
"used_in_bytes": 79607967744,
"free_percent": 6,
"used_percent": 94

建议: ES节点内存建议配置高一点,虽然ES的JVM内存最大不超过32G.但是在其他方面仍然很吃内存

阅读全文 »

使用ElastAlert+ELK实现日志监控钉钉告警

发表于 2020-08-25 | 分类于 elk |

使用ElastAlert+ELK实现日志监控钉钉告警

介绍

目前公司使用ELK做日志收集和展示分析.所以想对一些关键日志进行监控告警.比如Nginx的5xx日志,比如php-fpm的Fatal严重错误日志等.通过监控ES的日志数据,然后使用Python调用钉钉接口来实现日志的告警


ElastAlert介绍

ElastAlert是一个开源的工具,用于从Elastisearch中检索数据,并根据匹配模式发出告警.github项目地址如下:https://github.com/Yelp/elastalert

官方文档如下:https://elastalert.readthedocs.io/en/latest/elastalert.html

它支持多种监控模式和告警方式,具体可以查阅Github项目介绍.但是自带的ElastAlert并不支持钉钉告警,在github上有第三方的钉钉python项目.地址如下:https://github.com/xuyaoqiang/elastalert-dingtalk-plugin

第三方的钉钉告警插件并没有艾特相关人员的功能,所以我再此基础上进行了二次开发,增加了这个功能


阅读全文 »

docker学习笔记---Docker卷挂载

发表于 2020-07-04 | 分类于 docker |

docker学习笔记—卷挂载

回顾

回顾一下docker网络的相关知识:

  • docker默认所有容器连接到docker0这个bridge虚拟交换机,连接到同一个虚拟交换机的所有容器网络可以互访
  • docker可以指定一个bridge虚拟交换机,只需要在docker run命令中,使用--network参数
  • 连接到指定bridge虚拟机交换机的所有容器之间不仅仅可以互访,而且还可以直接访问对方容器的主机名
  • 在docker run命令中使用-p参数可以将容器内部端口映射给外部宿主机,使外部客户端可以访问容器内提供的服务
  • 可以使用多个-p选项暴露出多个端口,-p暴露端口的格式如下:
    • -p Container_Port (将宿主机上随机的一个端口,映射到后端指定的端口.例如: -p 80)
    • -p Host_Port:Container_Port(这是使用最多的方式,将宿主机上指定的一个端口,映射给容器内某个端口.例如: -p 80:80)
    • -p range_Port:range_Port(映射一组连续的端口.例如: -p 1100-1110:1100-1110)
  • 无法给运行中的容器,增加端口映射.所以想给当前运行中的容器增加映射端口,只能删除容器,重新run一个
  • 端口映射的本质是添加nat转发记录
  • 不是所有的容器都需要映射端口.
阅读全文 »

Letsencrypt证书OCSP域名国内无法访问问题

发表于 2020-07-01 | 分类于 Linux-Basic , SSL |

Letsencrypt证书OCSP域名国内无法访问问题

背景

近期公司线上APP,小程序的h5页面在IOS移动设备上加载速度非常慢.安卓设备不受影响.调试显示 TCP SSL 相关时间在3s以上.


原因

经排查发现是国内Let’s Encrypt免费SSL证书机构的OSCP域名 http://ocsp.int-x3.letsencrypt.org的CNAME解析在国内被DNS污染..安卓和chrome浏览器默认不在客户端检测OCSP,所以没有影响.但是移动IOS设备和Safari浏览器则会出现这种故障.

参考V2EX的论坛:https://www.v2ex.com/t/658605

使用国内的公众DNS服务器解析该域名结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
 huangyong@huangyong-Macbook-Pro  ~  dig @114.114.114.114 ocsp.int-x3.letsencrypt.org

....略....

;; ANSWER SECTION:
ocsp.int-x3.letsencrypt.org. 31 IN CNAME ocsp.int-x3.letsencrypt.org.edgesuite.net.
ocsp.int-x3.letsencrypt.org.edgesuite.net. 31 IN CNAME a771.dscq.akamai.net.
a771.dscq.akamai.net. 31 IN A 31.13.69.86

;; Query time: 15 msec
;; SERVER: 114.114.114.114#53(114.114.114.114)
;; WHEN: Wed Jul 01 16:40:14 CST 2020
;; MSG SIZE rcvd: 158

这个a771.dscq.akamai.net 的CNAME域名解析的IP地址并不是akamai的IP地址.也无法访问这个iP

1
2
3
4
 huangyong@huangyong-Macbook-Pro  ~  ping 31.13.69.86
PING 31.13.69.86 (31.13.69.86): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
阅读全文 »

acme.sh自动申请SSL证书脚本

发表于 2020-06-30 | 分类于 Linux-Basic , shell&shell脚本 |

acme.sh自动申请SSL证书脚本

acme.sh是GitHub上的一个项目.有关这个工具的介绍可以参考github,或者查看Linux-证书目录下的相关笔记

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
#!/bin/bash
#description: 使用acme.sh工具通过自动DNS验证方式申请SSL证书.
#date: 20190620

#判断是否有指定域名,以及域名
if [ $# != 2 ];then
echo "usage: $0 domain_name ssl_install_dir"
exit 1
fi
#接收要申请SSL证书的域名参数
ssl_domain=$1
#接收证书安装目标路径的参数
ssl_install_dir=$2

#判断申请的是否是通配符证书
if `echo $ssl_domain | grep "^\*" > /dev/null 2>&1`;then

#如果是通配符证书,那么替换到域名前面的"*."
ssl_name=$(echo $ssl_domain | sed 's@\*\.@@')

else

ssl_name=$ssl_domain

fi

#检查证书安装目录,判断该域名是否已经申请过证书.如果已经申请过,则直接退出

#新建ssl_dir证书路径变量
ssl_dir=${ssl_install_dir}/${ssl_name}

if [ -d $ssl_dir ];then

echo "$ssl_domain certificate has already installed" && exit 0

fi

#导入环境变量
export DP_Id=DNS服务器的AccessKeyID
export DP_Key=DNS服务器的Secret

#申请证书
cd /home/work/.acme.sh/

# 判断申请的是通配符证书,还是单域名证书
if [ $ssl_domain == $ssl_name ];then

./acme.sh --issue --dns dns_dp -d $ssl_name

else
./acme.sh --issue --dns dns_dp -d $ssl_name -d $ssl_domain

fi

#判断证书申请是否成功
if [ $? != 0 ];then
echo "$ssl_domain certificate applied failed" && exit 1
else
echo "$ssl_domain certificate applied successfully"
fi


#新建证书目标路径
mkdir -p $ssl_dir

#安装证书
./acme.sh --installcert -d $ssl_name \
--key-file ${ssl_dir}/${ssl_name}.key \
--fullchain-file ${ssl_dir}/fullchain.cer \
--reloadcmd "supervisorctl -c /etc/supervisord/supervisord.conf restart nginx"

mysql数据库使用xtrabackup全量,增量备份

发表于 2020-06-30 | 分类于 Linux-Basic , shell&shell脚本 |

mysql数据库使用xtrabackup全量,增量备份

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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
#!/bin/bash
##############################################################
# File Name: backup.sh
# Version: V1.0
# Author: huangyong
# Created Time : 2018-3-1 18:42:00
# Description: 数据库全量,增量备份脚本

#备份策略:每周一进行全备,其他日期备份当周的增量备份.每次全备前删除2周前的备份
#可扩展功能:打包备份文件.备份文件传输到远程服务器

#date:2018-04-15
#update:由于数据库/data磁盘已快满.所以备份只保留一周.

#date:2018-04-23
#update:增加如果备份失败则发邮件通知功能
# 增加自动删除备份日志功能

#data:2018-04-24
#update:1.增加xtrabackup自带的的备份压缩功能,且压缩线程数4.
# 2.全备完成后,打包整个全备的备份文件(暂时先不打包)
# 3.全备完成后,同步备份文件到BETA服务器
# 4.保留2份备份文件,也就是保留2周
# 5.将脚本的执行用户从root改到work.

#date:2018-05-03
#update:修改N_变量的抓取inc增量备份目录的命令.之前用的是sort命令,经常会抓取到错误的inc增量备份目录
# 脚本执行用户改成root,因为work用户没有权限访问mysql的数据文件目录
##############################################################

#获取脚本所存放目录
cd `dirname $0`
bash_path=`pwd`
#脚本名
me=$(basename $0)

#设置要备份的innodb数据库,用空格格开,空为备份所有库
databases=''

#定义变量
DATE=$(date +%W) #全年的第几周,一个星期为一个备份周期.备份根目录,其子目录:base为全量,inc1、inc2...为增量
TWO_WEEKS_AGO=$(echo ${DATE}-2|bc) #前两周前的备份
FULL_DATE=$(date +%F) #存储日志日期
DAY_DATE=$(date +%w) #判断一周的第几天
#MYSQL="mysql" # mysql命令绝对路径或在PATH中
MYSQL_DATA_DIR="/data/mysql/data" # 数据库目录
BACKUP_USER="tongji" # 备份用户
PASSWD=$(cat /data/xtrabackup/password) # 备份密码保存文件
BACK_FILE_DIR="/data/backups/${DATE}" # 备份频率目录,此目录变化频率为备份一周期
LOG_P_DIR="/data/backup_logs" #备份日志根目录
LOG_DIR="/data/backup_logs/${FULL_DATE}" # 备份过程日志目录
#LOG_ERR="${LOG_DIR}/mysql_backup_fail.log" #备份错误日志文件
LOG_FILE="${LOG_DIR}/mysql_backup.log" #备份过程日志文件
email_user="huangyong@doweidu.com"
ssh_server="10.25.2.85" # 远程备份服务器IP
ssh_server_dir="/data/tongjidb-mysqlbackup" # 远程备份服务器目录
ssh_port="5822" # ssh端口
ssh_parameters="-o StrictHostKeyChecking=no -o ConnectTimeout=60"
ssh_user="work"
ssh_command="ssh ${ssh_parameters} -p ${ssh_port}"
#scp_command="scp ${ssh_parameters} -P ${ssh_port}"

#定义保存日志函数
function save_log () {

echo -e "#################[`date +%F\ %T`] $* ####################" >> $LOG_FILE

}

#定义发送邮件函数
function send_mail () {
echo $1 | mail -s $1 $email_user

}

#创建目录
[ ! -d "${BACK_FILE_DIR}" ] && mkdir -p ${BACK_FILE_DIR}
[ ! -d "${LOG_DIR}" ] && mkdir -p ${LOG_DIR}

function full_backup () {
# 全量备份函数
[ ! -z "$databases" ] && option="--databases=${databases}" || option=""

##############################MYSQL全库备份#########################
/usr/bin/xtrabackup --user=$BACKUP_USER --password=$PASSWD --compress --compress-threads=4 --backup --target-dir=${BACK_FILE_DIR}/base --datadir=${MYSQL_DATA_DIR} $option > $LOG_FILE 2>&1

if [ $? -eq 0 ];then
save_log "mysql full_backup succeed"
chown -R mysql:mysql ${BACK_FILE_DIR}/base

else
save_log "mysql full_backup failed"
#send_mail "mysql full_backup failed"
exit 1

fi
###################################################################


}

function incremental_backup () {
[ ! -z "$databases" ] && option="--databases=${databases}" || option=""

cd $BACK_FILE_DIR
# 判断是否存在第一次增量备份目录inc1
# 存在则获取最后一次增量备份目录incN,然后基于最后一次增量备份,做增量备份
# 不存在则基于全量备份目录base做增量备份
if [ -d "inc1" ];then
N_=$(ls -l | awk -F 'inc' '/^d+.+inc[0-9]+$/{a[NR]=$NF;len=asort(a,sa)}END{print sa[len]}')
N=$(echo $N_+1|bc)
#增量备份
/usr/bin/xtrabackup --user=$BACKUP_USER --password=$PASSWD --backup --compress --target-dir=$BACK_FILE_DIR/inc$N \
--incremental-basedir=$BACK_FILE_DIR/inc$N_ --datadir=$MYSQL_DATA_DIR $option > $LOG_FILE 2>&1
else
N="1"
#增量备份
[ ! -d $BACK_FILE_DIR/base ] && save_log "incremental backup failed,no full_backup" && exit 1
/usr/bin/xtrabackup --user=$BACKUP_USER --password=$PASSWD --backup --compress --target-dir=$BACK_FILE_DIR/inc$N \
--incremental-basedir=$BACK_FILE_DIR/base --datadir=$MYSQL_DATA_DIR $option > $LOG_FILE 2>&1
fi


if [ $? -eq 0 ];then
save_log "mysql inc${N}-backup successed"
chown -R mysql:mysql ${BACK_FILE_DIR}/inc$N

else
save_log "mysql inc${N}-backup failed"
#send_mail "mysql inc${N}-backup failed"
exit 1

fi

return 0
}

function rsync_backup_files () {
#传输到远程服务器备份, 需要配置免密ssh认证

#使用rsync将本地的/data/backups目录同步到BETA服务器.同时删除BETA服务器上2周前的备份目录
rsync -az --delete /data/backups -e "${ssh_command}" $ssh_user@${ssh_server}:$ssh_server_dir
[ $? -eq 0 ] && save_log "full-backuped rsync successed" || \
{ save_log "backup rsync failed" ; send_mail "mysql backup rsync failed" ; }
}


#每周1进行全备.其他日期对本周一的全备做增量备份
if [ $DAY_DATE -eq 1 ];then


#删除2周前的备份文件
if [ 1 -le $TWO_WEEKS_AGO -a $TWO_WEEKS_AGO -lt 10 ];then #如果本周和2周前的数相减小于10,并且大于等于1,则相差的结果前加个0.比如07
FILE_NAME=$(dirname $BACK_FILE_DIR)/0$TWO_WEEKS_AGO
[ -d $FILE_NAME ] && rm -rf $FILE_NAME

elif [ $TWO_WEEKS_AGO -ge 10 ];then #如果两数相减等于两位数,直接删除文件
FILE_NAME=$(dirname $BACK_FILE_DIR)/$TWO_WEEKS_AGO
[ -d $FILE_NAME ] && rm -rf $FILE_NAME

fi

full_backup #调用全备

else
incremental_backup #调用增备

fi

#删除7天前日志文件
find $LOG_P_DIR -type d -mtime +7 -exec rm -rf {} \;

rsync_backup_files
1…345…21
Jesse

Jesse

求知若饥,虚心若愚.

209 日志
44 分类
41 标签
RSS
© Tue Jun 12 2018 08:00:00 GMT+0800 (GMT+08:00) — 2021 Jesse