經過tcpdump採集主機間的流量狀況

因爲公司計劃要從idc遷移上雲,前期準備工做之一就是要先梳理清楚當前主機間的調用關係鏈。 mysql


關於這塊,ODF大會上,古雷大師已經給咱們指明瞭道路(感興趣的能夠找下 it大咖說的視頻:運維數據可視化探索) , 他的比較精美可是也更復雜些。web


做爲一個苦逼dba,不會那些高大上的招式,怎麼辦?? sql

固然不能放棄,借鑑了下他的思路,我整出了個比較lowbi的方法。數據庫


個人思路:vim

一、在每臺機器上tcpdump採集500個包,格式化後寫入到統一的數據庫中
centos

二、在數據庫裏 select distinct 查詢語法, 便可找到某個主機的數據流的關係bash


## 在一個專用的mysql服務器 10.0.1.10 上建立帳號及庫:服務器

create database tcpdump;

use tcpdump;
CREATE TABLE `graph` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'pk',
  `src` varchar(100) NOT NULL DEFAULT '1.1.1.1' COMMENT '源地址',
  `dest` varchar(100) NOT NULL DEFAULT '2.2.2.2' COMMENT '目的地址',
  `cap_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5101 DEFAULT CHARSET=utf8 COMMENT='存放抓包採集的數據流向關係';

grant select,update,delete,insert on tcpdump.* to 'tcpdump'@'%' identified by 'tcpdump';


實際運行的腳本 運維

vim /root/cap/push.sh tcp

# 沒錯,下面你即將看到最 low bi的用法,直接獲取數據調mysql客戶端插入

# 查詢語句:
# SELECT DISTINCT SUBSTRING_INDEX(src, '.', 1) AS src,SUBSTRING_INDEX(dest, '.', 1) AS dest FROM tcpdump.graph WHERE src LIKE 'sh1-%' AND dest LIKE 'sh1-%' AND src LIKE 'sh1-XXXXXX%';

source /etc/profile

port=$(ip a | egrep "10.0.*.*/16" | awk '{print $NF}')

FILE1=dump.log
FILE2=data.log
MYSQL_HOST='10.0.1.10'

tcpdump -i ${port} tcp -p -c 1000 -q > ${FILE1}

# 注意,我這環境的主機名都是 sh1-dbxxxx.demo.com ,所以使用下面的命令能提取出關鍵的主機信息
cat ${FILE1} | cut -d " " -f 3,5 > ${FILE2}

if `uname -r  | egrep  'el7'` ; then
  mysql_version=/root/cap/mysql_el7
else
  mysql_version=/root/cap/mysql_el6
fi

while read line; do
  echo $line | awk '{print "insert into tcpdump.graph (src,dest) values(\""$1"\",\""$2"\");"}' | ${mysql_version} -h ${MYSQL_HOST} -utcpdump -ptcpdump
done < ${FILE2}


在 /root/cap/ 目錄下,我還放了2個版本的mysql客戶端(文件名 mysql_el6 和 mysql_el7),用來在不一樣版本的centos上執行寫入操做。



部署到遠程主機: 

ansible xxxx -m copy -a "src=/root/cap/ dest=/root/cap/ owner=root group=root mode=0755"

咱們也能夠再ansible推一個定時任務到所有主機去,固然我的建議是遷移到那個服務,咱們就單獨去對應服務的主機上多跑一段時間腳本採集數據而後作分析,而不是一會兒搞個全網採集,那樣數據量可能太大。



查詢方法: 

select 
   distinct SUBSTRING_INDEX(src,'.',1) as src,
   SUBSTRING_INDEX(dest,'.',1) as dest 
from tcpdump.graph 
   where src like 'sh1-rabbitmq01%' ;
   
結果相似這樣:
+----------------+----------------+
| src        | dest        |
+----------------+----------------+
| sh1-rabbitmq01 | sh1-web20    |
| sh1-rabbitmq01 | sh1-web25    |
| sh1-rabbitmq01 | sh1-web19    |
| sh1-rabbitmq01 | sh1-datax01   |
| sh1-rabbitmq01 | sh1-web10    |
| sh1-rabbitmq01 | sh1-k8s11    |
| sh1-rabbitmq01 | sh1-web10    |
| sh1-rabbitmq01 | sh1-web10    |
| sh1-rabbitmq01 | sh1-storm04   |
| sh1-rabbitmq01 | sh1-web10    |
+----------------+----------------+



有了數據後,咱們還能夠在 grafana 裏面畫圖,配置大體是這樣的:

一、添加mysql數據源

image.png



二、畫圖,使用table類型的圖形展現界面,最終效果相似以下:

image.png


更進一步,咱們還能夠繪製動態的板子。這須要添加一個variables,以下:


image.png


這樣,咱們就能夠下拉菜單找到對應的主機了,不須要一股腦的翻的手軟眼花了。

image.png

相關文章
相關標籤/搜索