來源:民工哥技術(shù)之路 作者:吃兔頭 本文以api.域名為測(cè)試對(duì)象進(jìn)行統(tǒng)計(jì),日志為crm.和risk.請(qǐng)求之和(此二者域名不具生產(chǎn)換環(huán)境統(tǒng)計(jì)意義),,生產(chǎn)環(huán)境請(qǐng)根據(jù)具體需要統(tǒng)計(jì)的域名進(jìn)行統(tǒng)計(jì)。 由于涉及生產(chǎn)線上服務(wù)器,,故本文部分服務(wù)器IP做了打碼處理,。 一、服務(wù)介紹 1.1,、ELK ELK是三個(gè)開源軟件的縮寫,,分別表示:Elasticsearch , Logstash, Kibana , 它們都是開源軟件。新增了一個(gè)FileBeat,,它是一個(gè)輕量級(jí)的日志收集處理工具(Agent),,F(xiàn)ilebeat占用資源少,,適合于在各個(gè)服務(wù)器上搜集日志后傳輸給Logstash,,官方也推薦此工具。 Elasticsearch是個(gè)開源分布式搜索引擎,,提供搜集,、分析、存儲(chǔ)數(shù)據(jù)三大功能,。它的特點(diǎn)有:分布式,,零配置,自動(dòng)發(fā)現(xiàn),,索引自動(dòng)分片,,索引副本機(jī)制,restful風(fēng)格接口,,多數(shù)據(jù)源,,自動(dòng)搜索負(fù)載等。 Logstash 主要是用來日志的搜集,、分析,、過濾日志的工具,支持大量的數(shù)據(jù)獲取方式。一般工作方式為c/s架構(gòu),,client端安裝在需要收集日志的主機(jī)上,,server端負(fù)責(zé)將收到的各節(jié)點(diǎn)日志進(jìn)行過濾、修改等操作在一并發(fā)往elasticsearch上去,。 Kibana 也是一個(gè)開源和免費(fèi)的工具,,Kibana可以為 Logstash 和ElasticSearch 提供的日志分析友好的 Web 界面,可以幫助匯總,、分析和搜索重要數(shù)據(jù)日志,。 1.2、Nginx Nginx('engine x') 是一個(gè)高性能的HTTP和反向代理服務(wù)器,,也是一個(gè)IMAP/POP3/SMTP代理服務(wù)器,。Nginx 是由 Igor Sysoev 為俄羅斯訪問量第二的 Rambler.ru 站點(diǎn)開發(fā)的,第一個(gè)公開版本0.1.0發(fā)布于2004年10月4日,。其將源代碼以類BSD許可證的形式發(fā)布,,因它的穩(wěn)定性、豐富的功能集,、示例配置文件和低系統(tǒng)資源的消耗而聞名,。Nginx是一款輕量級(jí)的Web服務(wù)器/反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器,并在一個(gè)BSD-like 協(xié)議下發(fā)行,。由俄羅斯的程序設(shè)計(jì)師Igor Sysoev所開發(fā),,供俄國大型的入口網(wǎng)站及搜索引擎Rambler(俄文:Рамблер)使用。其特點(diǎn)是占有內(nèi)存少,,并發(fā)能力強(qiáng),,事實(shí)上nginx的并發(fā)能力確實(shí)在同類型的網(wǎng)頁服務(wù)器中表現(xiàn)較好,中國大陸使用nginx網(wǎng)站用戶有:新浪,、網(wǎng)易,、騰訊等。 本文中前端使用了nginx的反向代理功能,,并使用了nginx的HTTP功能,。 1.3、Kafka Kafka是由Apache軟件基金會(huì)開發(fā)的一個(gè)開源流處理平臺(tái),,由Scala和Java編寫,。Kafka是一種高吞吐量的分布式發(fā)布訂閱消息系統(tǒng),它可以處理消費(fèi)者規(guī)模的網(wǎng)站中的所有動(dòng)作流數(shù)據(jù),。這種動(dòng)作(網(wǎng)頁瀏覽,,搜索和其他用戶的行動(dòng))是在現(xiàn)代網(wǎng)絡(luò)上的許多社會(huì)功能的一個(gè)關(guān)鍵因素。這些數(shù)據(jù)通常是由于吞吐量的要求而通過處理日志和日志聚合來解決,。對(duì)于像Hadoop一樣的日志數(shù)據(jù)和離線分析系統(tǒng),,但又要求實(shí)時(shí)處理的限制,,這是一個(gè)可行的解決方案。Kafka的目的是通過Hadoop的并行加載機(jī)制來統(tǒng)一線上和離線的消息處理,,也是為了通過集群來提供實(shí)時(shí)的消息,。 二、架構(gòu)要求 2.1,、架構(gòu)描述 使用filebeat收集nginx日志,,輸出到kafka;logstash從kafka中消費(fèi)日志,通過grok進(jìn)行數(shù)據(jù)格式化,,輸出到elasticsearch中,kibana從elasticsearch中獲取日志,,進(jìn)行過濾出圖. 2.2、系統(tǒng)版本 CentOS Linux release 7.2.1511 (Core)
3.10.0-514.26.2.el7.x86_64 2.3,、軟件版本 jdk1.8.0_144 nginx-1.12.2 filebeat-6.3.2 awurstmeister/kafka(docker image) logstash-6.5.4 elasticsearch-6.4.0 kibana-6.4.0 三,、linux系統(tǒng)環(huán)境配置與優(yōu)化 #查看服務(wù)器硬件信息
dmidecode|grep 'Product Name'
#查看CPU型號(hào)
grep name /proc/cpuinfo
#查看CPU個(gè)數(shù)
grep 'physical id' /proc/cpuinfo
#查看內(nèi)存大小
grep MemTotal /proc/meminfo 四、系統(tǒng)初始化 4.1,、關(guān)閉防火墻 systemctl stop filewalld 4.2,、關(guān)閉selinux setenforce 0
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config 4.3、添加普通賬戶 useradd elsearch echo '******'|passwd --stdin elsearch 4.4,、配置yum源 cat /etc/yum.repos.d/CentOS-Base.repo
[base]
name=CentOS-$releasever
enabled=1
failovermethod=priority
baseurl=http://mirrors.cloud./centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=http://mirrors.cloud./centos/RPM-GPG-KEY-CentOS-7
[updates]
name=CentOS-$releasever
enabled=1
failovermethod=priority
baseurl=http://mirrors.cloud./centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=http://mirrors.cloud./centos/RPM-GPG-KEY-CentOS-7
[extras]
name=CentOS-$releasever
enabled=1
failovermethod=priority
baseurl=http://mirrors.cloud./centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=http://mirrors.cloud./centos/RPM-GPG-KEY-CentOS-7 4.5,、清理開機(jī)自啟動(dòng)服務(wù) for i in `chkconfig --list|grep 3:on |awk '{print $1}'`;do chkconfig$i off;done for i in crond network rsyslog sshd;do chkconfig --level 3 $ion;done chkconfig --list|grep 3:on 4.6、服務(wù)器時(shí)間同步 echo '*/5 * * * * /usr/sbin/ntpdate time.windows.com > /dev/null2>&1' >>/var/spool/cron/root 4.7,、加大文件描述符 echo '* - nofile 65535' >> /etc/security/limits.conf tail -1 /etc/security/limits.conf #重新登陸后生效(無需重啟) ulimit -n(重新登陸后查看) 4.8,、內(nèi)核參數(shù)調(diào)優(yōu)(可不操作) \cp /etc/sysctl.conf /etc/sysctl.conf.bak
cat>>/etc/sysctl.conf<<EOF
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_max_orphans = 3276800
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
net.core.netdev_max_backlog = 32768
net.core.somaxconn = 32768
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout=1
net.ipv4.tcp_keepalive_time=1200
net.ipv4.tcp_max_syn_backlog = 65536
net.ipv4.ip_local_port_range = 1024 65535
EOF
/sbin/sysctl -p 五、部署開始 5.1,、更改nginx日志輸出格式 5.1.1,、定義日志格式 cat /etc/nginx/nginx.conf log_format main '$remote_addr - $remote_user [$time_local]'$request' ' '$status$body_bytes_sent '$http_referer' ' ''$http_user_agent' '$http_x_forwarded_for''; 5.1.2、加載日志格式到對(duì)應(yīng)域名配置中 cat /etc/nginx/conf.d/vhost/api..conf
server {
listen 80;
server_name newtest-msp-api.;
access_log /var/log/nginx/api..log main;
} 5.1.3,、reload生效 nginx -s reload 5.1.4,、清空原輸出文件,,并查看輸出的日志格式 :> /var/log/nginx/api..log
tailf /var/log/nginx/api.mingongger.com.cn.log
1xx.2xx.72.175 - - [18/Mar/2019:13:51:17 0800] 'GET/user/fund/113 HTTP/1.1' 200 673 '-' 'Mozilla/5.0 (WindowsNT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) sun/1.5.6 Chrome/69.0.3497.106Electron/4.0.3 Safari/537.36' '-' 5.2,、配置kafka 測(cè)試環(huán)境使用docker起的kafka,kafka部署掠過,以下任選一種 5.2.1,、方法一 創(chuàng)建kafka topic ./kafka-topics.sh --create --topic nginxlog --replication-factor 1--partitions 1 --zookeeper localhost:2181 5.2.2,、方法二 auto.create.topics.enable=true 開啟kafka自動(dòng)創(chuàng)建topic配置 5.2.3、filebeat部署完成后確認(rèn)kafka topic中有數(shù)據(jù) ./kafka-console-consumer.sh --bootstrap-server 192.168.0.53:9091--from-beginning --topic nginxlog 輸出如下 {'@timestamp':'2019-03-14T07:16:50.140Z','@metadata':{'beat':'filebeat','type':'doc','version':'6.3.2','topic':'nginxlog'},'fields':{'log_topics':'nginxlog'},'beat':{'version':'6.3.2','name':'test-kafka-web','hostname':'test-kafka-web'},'host':{'name':'test-kafka-web'},'source':'/var/log/nginx/newtest-msp-api.-80.log','offset':114942,'message':'116.226.72.175- - [14/Mar/2019:15:16:49 0800] newtest-msp-api. POST\'/upstream/page\' \'-\' 200 6314\'http://newtest-msp-crm./\' 200 192.168.0.49:60070.024 0.024 \'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36\'\'-\''}
Processed a total of 7516 messages 測(cè)試環(huán)境中kafka地址為 192.168.0.53:9091 5.3,、配置filebeat收集nginx日志 5.3.1,、安裝filebeat cd /opt/ && wget http://download./download/software/filebeat-6.3.2-x86_64.rpm
yum localinstall filebeat-6.3.2-x86_64.rpm -y 5.3.2、編輯配置文件 cat /etc/filebeat/filebeat.yml filebeat.prospectors: - input_type: log enabled: true paths: - /var/log/nginx/api..log#收集日志路徑 fields: log_topics: nginxlog #kafka中topic名稱 json.keys_under_root: true json.overwrite_keys: true output.kafka: enabled: true hosts:['192.168.0.53:9091'] #kafka地址 topic:'%{[fields][log_topics]}' #kafka中topic名稱 partition.round_robin: reachable_only: false compression: gzip max_message_bytes: 1000000 required_acks: 1 5.3.3,、啟動(dòng)filebeat& 開機(jī)啟動(dòng) systemctl start filebeat
systemctl enable filebeat 5.4,、配置logstash 5.4.1 編輯配置 cat /usr/local/logstash/config/nginx.conf input { kafka { type =>'nginxlog' topics =>['nginxlog'] bootstrap_servers=> ['192.168.0.53:9091'] group_id =>'nginxlog' auto_offset_reset=> latest codec =>'json' } } filter { if [type] == 'nginxlog'{ grok { match => {'message' => '%{COMBINEDAPACHELOG}' } remove_field =>'message' } date { match => ['timestamp' , 'dd/MMM/YYYY:HH:mm:ss Z' ] } geoip { source =>'clientip' target =>'geoip' database =>'/usr/local/logstash/config/GeoLite2-City.mmdb' add_field => ['[geoip][coordinates]', '%{[geoip][longitude]}' ] #添加字段coordinates,,值為經(jīng)度 add_field => ['[geoip][coordinates]', '%{[geoip][latitude]}' ] #添加字段coordinates,值為緯度 } mutate { convert => ['[geoip][coordinates]', 'float'] } useragent { source =>'agent' target =>'userAgent' } } } output { if [type] == 'nginxlog' { elasticsearch { hosts =>['http://192.168.0.48:9200'] index =>'logstash-nginxlog-%{ YYYY.MM.dd}' } stdout {codec =>rubydebug} } } 5.4.2,、使用配置文件啟動(dòng)logstash服務(wù),,觀察輸出 /usr/local/logstash/bin/logstash -f nginx.conf
{
'httpversion'=> '1.1',
'verb' =>'GET',
'auth'=> '-',
'@timestamp'=> 2019-03-18T06:41:27.000Z,
'type'=> 'nginxlog',
'json'=> {},
'source'=> '/var/log/nginx/newtest-msp-api.-80.log',
'fields' =>{
'log_topics'=> 'nginxlog'
},
'response'=> '200',
'offset'=> 957434,
'host'=> {
'name' =>'test-kafka-web'
},
'beat'=> {
'hostname'=> 'test-kafka-web',
'version'=> '6.3.2',
'name'=> 'test-kafka-web'
},
'bytes'=> '673',
'request'=> '/user/fund/113',
'timestamp'=> '18/Mar/2019:14:41:27 0800',
'referrer'=> '\'-\'',
'userAgent'=> {
'os'=> 'Windows',
'major' => '4',
'patch'=> '3',
'build'=> '',
'minor'=> '0',
'os_name'=> 'Windows',
'device'=> 'Other',
'name'=> 'Electron'
},
'geoip'=> {
'ip' => '1xx.2xx.72.175',
'country_name' => 'China',
'coordinates' => [
[0] 121.4012,
[1] 31.0449
],
'region_name' => 'Shanghai',
'location' => {
'lat'=> 31.0449,
'lon'=> 121.4012
},
'continent_code' => 'AS',
'timezone' => 'Asia/Shanghai',
'longitude' => 121.4012,
'city_name' => 'Shanghai',
'country_code2' => 'CN',
'region_code' => 'SH',
'latitude' => 31.0449,
'country_code3' => 'CN'
},
'@version'=> '1',
'clientip'=> '1xx.2xx.72.175',
'ident'=> '-',
'agent'=> '\'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36(KHTML, like Gecko) sun/1.5.6 Chrome/69.0.3497.106 Electron/4.0.3Safari/537.36\''
} 5.4.3、后臺(tái)啟動(dòng)logstash 確認(rèn)出現(xiàn)以上輸出后,,將logstash分離出當(dāng)前shell,并放在后臺(tái)運(yùn)行 nohup /usr/local/logstash/bin/logstash -f nginx.conf &>/dev/null & 5.5,、kibana配置 5.5.1、修改kibana配置 /usr/local/kibana-6.5.4-linux-x86_64/config/kibana.yml #增加高德地圖
tilemap.url:'http://webrd02.is./appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}' 5.5.2,、創(chuàng)建Index Pattern 5.5.3,、IP訪問TOP5 選擇柱形圖 添加X軸,以geoip.ip為order by字段 5.5.4 ,、PV 選擇metric 默認(rèn)統(tǒng)計(jì)總?cè)罩緱l數(shù),即為PV數(shù) 5.5.5,、全球訪問地圖 選擇map Field選擇geoip.location 選擇添加高德地圖 5.5.6、實(shí)時(shí)流量 選擇線條圖 5.5.7,、操作系統(tǒng) 選擇餅圖 5.5.8,、登陸次數(shù) 過濾login關(guān)鍵字,并做count統(tǒng)計(jì) 5.5.9、訪問地區(qū) 5.5.10,、Dashboard展示
|
|