logstash mysql 準(zhǔn)實(shí)時(shí)同步到 elasticsearch

mysql 作為成熟穩(wěn)定的數(shù)據(jù)持久化解決方案,廣泛地應(yīng)用在各種領(lǐng)域,但是在數(shù)據(jù)分析方面稍有不足,而 elasticsearch 作為數(shù)據(jù)分析領(lǐng)域的佼佼者,剛好可以彌補(bǔ)這項(xiàng)不足侧啼,而我們要做的只需要將 mysql 中的數(shù)據(jù)同步到 elasticsearch 中即可,而 logstash 剛好就可以支持堪簿,所有你需要做的只是寫(xiě)一個(gè)配置文件而已

logstash 獲取

獲取 logstash

wget https://artifacts.elastic.co/downloads/logstash/logstash-6.2.3.zip
unzip logstash-6.2.3.zip && cd logstash-6.2.3

安裝 jdbc 和 elasticsearch 插件

bin/logstash-plugin install logstash-input-jdbc
bin/logstash-plugin install logstash-output-elasticsearch

獲取 jdbc mysql 驅(qū)動(dòng)

wget https://cdn.mysql.com//Downloads/Connector-J/mysql-connector-java-5.1.46.zip
unzip mysql-connector-java-5.1.46.zip

編寫(xiě)配置文件

logstash-input-jdbc

使用 logstash-input-jdbc 插件讀取 mysql 的數(shù)據(jù)痊乾,這個(gè)插件的工作原理比較簡(jiǎn)單,就是定時(shí)執(zhí)行一個(gè) sql戴甩,然后將 sql 執(zhí)行的結(jié)果寫(xiě)入到流中符喝,增量獲取的方式?jīng)]有通過(guò) binlog 方式同步,而是用一個(gè)遞增字段作為條件去查詢(xún)甜孤,每次都記錄當(dāng)前查詢(xún)的位置协饲,由于遞增的特性畏腕,只需要查詢(xún)比當(dāng)前大的記錄即可獲取這段時(shí)間內(nèi)的全部增量,一般的遞增字段有兩種茉稠,AUTO_INCREMENT 的主鍵 idON UPDATE CURRENT_TIMESTAMPupdate_time 字段描馅,id 字段只適用于那種只有插入沒(méi)有更新的表,update_time 更加通用一些而线,建議在 mysql 表設(shè)計(jì)的時(shí)候都增加一個(gè) update_time 字段

input {
  jdbc {
    jdbc_driver_library => "../mysql-connector-java-5.1.46/mysql-connector-java-5.1.46-bin.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://<mysql_host>:3306/rta"
    jdbc_user => "<username>"
    jdbc_password => "<password>"
    schedule => "* * * * *"
    statement => "SELECT * FROM table WHERE update_time >= :sql_last_value"
    use_column_value => true
    tracking_column_type => "timestamp"
    tracking_column => "update_time"
    last_run_metadata_path => "syncpoint_table"
  }
}
  • jdbc_driver_library: jdbc mysql 驅(qū)動(dòng)的路徑铭污,在上一步中已經(jīng)下載
  • jdbc_driver_class: 驅(qū)動(dòng)類(lèi)的名字,mysql 填 com.mysql.jdbc.Driver 就好了
  • jdbc_connection_string: mysql 地址
  • jdbc_user: mysql 用戶(hù)
  • jdbc_password: mysql 密碼
  • schedule: 執(zhí)行 sql 時(shí)機(jī)膀篮,類(lèi)似 crontab 的調(diào)度
  • statement: 要執(zhí)行的 sql嘹狞,以 ":" 開(kāi)頭是定義的變量,可以通過(guò) parameters 來(lái)設(shè)置變量誓竿,這里的 sql_last_value 是內(nèi)置的變量磅网,表示上一次 sql 執(zhí)行中 update_time 的值,這里 update_time 條件是 >= 因?yàn)闀r(shí)間有可能相等筷屡,沒(méi)有等號(hào)可能會(huì)漏掉一些增量
  • use_column_value: 使用遞增列的值
  • tracking_column_type: 遞增字段的類(lèi)型涧偷,numeric 表示數(shù)值類(lèi)型, timestamp 表示時(shí)間戳類(lèi)型
  • tracking_column: 遞增字段的名稱(chēng),這里使用 update_time 這一列毙死,這列的類(lèi)型是 timestamp
  • last_run_metadata_path: 同步點(diǎn)文件燎潮,這個(gè)文件記錄了上次的同步點(diǎn),重啟時(shí)會(huì)讀取這個(gè)文件扼倘,這個(gè)文件可以手動(dòng)修改

logstash-output-elasticsearch

output {
  elasticsearch {
    hosts => ["172.31.22.165", "172.31.17.241", "172.31.30.84", "172.31.18.178"]
    user => "<user>"
    password => "<password>"
    index => "table"
    document_id => "%{id}"
  }
}
  • hosts: es 集群地址
  • user: es 用戶(hù)名
  • password: es 密碼
  • index: 導(dǎo)入到 es 中的 index 名确封,這里我直接設(shè)置成了 mysql 表的名字
  • document_id: 導(dǎo)入到 es 中的文檔 id,這個(gè)需要設(shè)置成主鍵唉锌,否則同一條記錄更新后在 es 中會(huì)出現(xiàn)兩條記錄隅肥,%{id} 表示引用 mysql 表中 id 字段的值

運(yùn)行

把上面的代碼保存到一個(gè)配置文件里面 sync_table.cfg,執(zhí)行下面命令即可

cd logstash-6.2.3 && bin/logstash -f config/sync_table.cfg

如果成功了會(huì)在標(biāo)準(zhǔn)輸出輸出執(zhí)行的 sql 語(yǔ)句

[2018-04-14T18:12:00,278][INFO ][logstash.inputs.jdbc     ] (0.001011s) SELECT version()
[2018-04-14T18:12:00,284][INFO ][logstash.inputs.jdbc     ] (0.000723s) SELECT * FROM table WHERE update_time > '2018-04-14 17:55:00'

其他問(wèn)題

多表同步

一個(gè) logstash 實(shí)例可以借助 pipelines 機(jī)制同步多個(gè)表袄简,只需要寫(xiě)多個(gè)配置文件就可以了,假設(shè)我們有兩個(gè)表 table1 和 table2泛啸,對(duì)應(yīng)兩個(gè)配置文件 sync_table1.cfgsync_table2.cfg

config/pipelines.yml 中配置

- pipeline.id: table1
  path.config: "config/sync_table1.cfg"
- pipeline.id: table2
  path.config: "config/sync_table2.cfg"

直接 bin/logstash 啟動(dòng)即可

@timestamp 字段

默認(rèn)情況下 @timestamp 字段是 logstash-input-jdbc 添加的字段绿语,默認(rèn)是當(dāng)前時(shí)間,這個(gè)字段在數(shù)據(jù)分析的時(shí)候非常有用候址,但是有時(shí)候我們希望使用數(shù)據(jù)中的某些字段來(lái)指定這個(gè)字段吕粹,這個(gè)時(shí)候可以使用 filter.date, 這個(gè)插件是專(zhuān)門(mén)用來(lái)設(shè)置 @timestamp 這個(gè)字段的

比如我有我希望用字段 timeslice 來(lái)表示 @timestamptimeslice 是一個(gè)字符串岗仑,格式為 %Y%m%d%H%M

filter {
  date {
    match => [ "timeslice", "yyyyMMddHHmm" ]
    timezone => "Asia/Shanghai"
  }
}

把這一段配置加到 sync_table.cfg 中匹耕,現(xiàn)在 @timestamptimeslice 一致了

參考鏈接

轉(zhuǎn)載請(qǐng)注明出處
本文鏈接:http://www.hatlonely.com/2018/04/14/logstash-mysql-%E5%87%86%E5%AE%9E%E6%97%B6%E5%90%8C%E6%AD%A5%E5%88%B0-elasticsearch/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末冕房,一起剝皮案震驚了整個(gè)濱河市膛壹,隨后出現(xiàn)的幾起案子湃望,更是在濱河造成了極大的恐慌耕驰,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件既鞠,死亡現(xiàn)場(chǎng)離奇詭異煤傍,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)嘱蛋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)蚯姆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人洒敏,你說(shuō)我怎么就攤上這事龄恋。” “怎么了凶伙?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵郭毕,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我镊靴,道長(zhǎng)铣卡,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任偏竟,我火速辦了婚禮煮落,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘踊谋。我一直安慰自己蝉仇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布殖蚕。 她就那樣靜靜地躺著轿衔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪睦疫。 梳的紋絲不亂的頭發(fā)上害驹,一...
    開(kāi)封第一講書(shū)人閱讀 51,258評(píng)論 1 300
  • 那天,我揣著相機(jī)與錄音蛤育,去河邊找鬼宛官。 笑死,一個(gè)胖子當(dāng)著我的面吹牛瓦糕,可吹牛的內(nèi)容都是我干的底洗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼咕娄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼亥揖!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起圣勒,我...
    開(kāi)封第一講書(shū)人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤费变,失蹤者是張志新(化名)和其女友劉穎摧扇,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體胡控,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡扳剿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了昼激。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片庇绽。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖橙困,靈堂內(nèi)的尸體忽然破棺而出瞧掺,到底是詐尸還是另有隱情,我是刑警寧澤凡傅,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布辟狈,位于F島的核電站,受9級(jí)特大地震影響夏跷,放射性物質(zhì)發(fā)生泄漏哼转。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一槽华、第九天 我趴在偏房一處隱蔽的房頂上張望壹蔓。 院中可真熱鬧,春花似錦猫态、人聲如沸佣蓉。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)勇凭。三九已至,卻和暖如春义辕,著一層夾襖步出監(jiān)牢的瞬間虾标,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工灌砖, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留夺巩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓周崭,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親喳张。 傳聞我的和親對(duì)象是個(gè)殘疾皇子续镇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容