詳解Mysql如何實(shí)現(xiàn)數(shù)據(jù)同步到Elasticsearch
一、同步原理
基于Mysql的binlog日志訂閱:binlog日志是Mysql用來(lái)記錄數(shù)據(jù)實(shí)時(shí)的變化
Mysql數(shù)據(jù)同步到ES中分為兩種,分別是全量同步和增量同步
全量同步表示第一次建立好ES索引之后,將Mysql中所有數(shù)據(jù)一次性導(dǎo)入到ES中
增量同步表示Mysql中產(chǎn)生新的數(shù)據(jù),這些新的數(shù)據(jù)包括三種情況,就是新插入Mysql中的數(shù)據(jù),更新老的數(shù)據(jù),刪除的數(shù)據(jù),這些數(shù)據(jù)的變動(dòng)與新增都要同步到ES中
二、logstash-input-jdbc
logstash官方插件,集成在logstash中,下載logstash即可,通過(guò)配置文件實(shí)現(xiàn)mysql與elasticsearch數(shù)據(jù)同步
優(yōu)點(diǎn)
- 能實(shí)現(xiàn)mysql數(shù)據(jù)全量和增量的數(shù)據(jù)同步,且能實(shí)現(xiàn)定時(shí)同步
- 版本更新迭代快,相對(duì)穩(wěn)定
- 作為ES固有插件logstash一部分,易用
缺點(diǎn)
- 不能實(shí)現(xiàn)同步刪除操作,MySQL數(shù)據(jù)刪除后Elasticsearch中數(shù)據(jù)仍存在
- 同步最短時(shí)間差為一分鐘,一分鐘數(shù)據(jù)同步一次,無(wú)法做到實(shí)時(shí)同步
三、go-mysql-elasticsearch
go-mysql-elasticsearch 是國(guó)內(nèi)作者開(kāi)發(fā)的一款插件
優(yōu)點(diǎn)
- 能實(shí)現(xiàn)mysql數(shù)據(jù)全量和增量的數(shù)據(jù)同步
缺點(diǎn)
- 無(wú)法實(shí)現(xiàn)數(shù)據(jù)全量同步Elasticsearch
- 仍處理開(kāi)發(fā)、相對(duì)不穩(wěn)定階段
四、elasticsearch-jdbc
elasticsearch-jdbc 目前最新的版本是2.3.4,支持的ElasticSearch的版本為2.3.4, 未實(shí)踐
優(yōu)點(diǎn)
- 能實(shí)現(xiàn)mysql數(shù)據(jù)全量和增量的數(shù)據(jù)同步
缺點(diǎn)
- 目前最新的版本是2.3.4,支持的ElasticSearch的版本為2.3.4
- 不能實(shí)現(xiàn)同步刪除操作,MySQL數(shù)據(jù)刪除后Elasticsearch中數(shù)據(jù)仍存在
五、logstash-input-jdbc實(shí)現(xiàn)同步
第一步安裝:
logstash5.x之后,集成了logstash-input-jdbc插件。安裝logstash后通過(guò)命令安裝logstash-input-jdbc插件
cd /logstash-6.4.2/bin ./logstash-plugin install logstash-input-jdbc
第二步配置:
在logstash-6.4.2/config文件夾下新建jdbc.conf,配置如下
在logstash-6.4.2/config 目錄下新建jdbc.sql文件
select * from t_employee
第三步運(yùn)行
cd logstash-6.4.2 # 檢查配置文件語(yǔ)法是否正確 bin/logstash -f config/jdbc.conf --config.test_and_exit # 啟動(dòng) bin/logstash -f config/jdbc.conf --config.reload.automatic
--config.reload.automatic:會(huì)自動(dòng)重新加載配置文件內(nèi)容
在kibana中創(chuàng)建索引后查看同步數(shù)據(jù)
PUT octopus GET octopus/_search
六、go-mysql-elasticsearch實(shí)現(xiàn)同步
第一步:mysql binlog日志
go-mysql-elasticsearch通過(guò)mysql中binlog日志實(shí)現(xiàn)數(shù)據(jù)增加,刪除,修改同步elasticsearch
mysql的binlog日志主要用于數(shù)據(jù)庫(kù)的主從復(fù)制與數(shù)據(jù)恢復(fù)。binlog中記錄了數(shù)據(jù)的增刪改查操作,主從復(fù)制過(guò)程中,主庫(kù)向從庫(kù)同步binlog日志,從庫(kù)對(duì)binlog日志中的事件進(jìn)行重放,從而實(shí)現(xiàn)主從同步。
mysql binlog日志有三種模式,分別為:
ROW: 記錄每一行數(shù)據(jù)被修改的情況,但是日志量太大 STATEMENT: 記錄每一條修改數(shù)據(jù)的SQL語(yǔ)句,減少了日志量,但是SQL語(yǔ)句使用函數(shù)或觸發(fā)器時(shí)容易出現(xiàn)主從不一致 MIXED: 結(jié)合了ROW和STATEMENT的優(yōu)點(diǎn),根據(jù)具體執(zhí)行數(shù)據(jù)操作的SQL語(yǔ)句選擇使用ROW或者STATEMENT記錄日志
要通過(guò)mysql binlog將數(shù)據(jù)同步到ES集群,只能使用ROW模式,因?yàn)橹挥蠷OW模式才能知道m(xù)ysql中的數(shù)據(jù)的修改內(nèi)容。
以UPDATE操作為例,ROW模式的binlog日志內(nèi)容示例如下:
SET TIMESTAMP=1527917394/*!*/; BEGIN /*!*/; # at 3751 #180602 13:29:54 server id 1 end_log_pos 3819 CRC32 0x8dabdf01 Table_map: `webservice`.`building` mapped to number 74 # at 3819 #180602 13:29:54 server id 1 end_log_pos 3949 CRC32 0x59a8ed85 Update_rows: table id 74 flags: STMT_END_F BINLOG ' UisSWxMBAAAARAAAAOsOAAAAAEoAAAAAAAEACndlYnNlcnZpY2UACGJ1aWxkaW5nAAYIDwEPEREG wACAAQAAAAHfq40= UisSWx8BAAAAggAAAG0PAAAAAEoAAAAAAAEAAgAG///A1gcAAAAAAAALYnVpbGRpbmctMTAADwB3 UkRNbjNLYlV5d1k3ajVbD64WWw+uFsDWBwAAAAAAAAtidWlsZGluZy0xMAEPAHdSRE1uM0tiVXl3 WTdqNVsPrhZbD64Whe2oWQ== '/*!*/; ### UPDATE `webservice`.`building` ### WHERE ### @1=2006 /* LONGINT meta=0 nullable=0 is_null=0 */ ### @2='building-10' /* VARSTRING(192) meta=192 nullable=0 is_null=0 */ ### @3=0 /* TINYINT meta=0 nullable=0 is_null=0 */ ### @4='wRDMn3KbUywY7j5' /* VARSTRING(384) meta=384 nullable=0 is_null=0 */ ### @5=1527754262 /* TIMESTAMP(0) meta=0 nullable=0 is_null=0 */ ### @6=1527754262 /* TIMESTAMP(0) meta=0 nullable=0 is_null=0 */ ### SET ### @1=2006 /* LONGINT meta=0 nullable=0 is_null=0 */ ### @2='building-10' /* VARSTRING(192) meta=192 nullable=0 is_null=0 */ ### @3=1 /* TINYINT meta=0 nullable=0 is_null=0 */ ### @4='wRDMn3KbUywY7j5' /* VARSTRING(384) meta=384 nullable=0 is_null=0 */ ### @5=1527754262 /* TIMESTAMP(0) meta=0 nullable=0 is_null=0 */ ### @6=1527754262 /* TIMESTAMP(0) meta=0 nullable=0 is_null=0 */ # at 3949 #180602 13:29:54 server id 1 end_log_pos 3980 CRC32 0x58226b8f Xid = 182 COMMIT/*!*/;
STATEMENT模式下binlog日志內(nèi)容示例為:
SET TIMESTAMP=1527919329/*!*/; update building set Status=1 where Id=2000 /*!*/; # at 688 #180602 14:02:09 server id 1 end_log_pos 719 CRC32 0x4c550a7d Xid = 200 COMMIT/*!*/;
從ROW模式和STATEMENT模式下UPDATE操作的日志內(nèi)容可以看出,ROW模式完整地記錄了要修改的某行數(shù)據(jù)更新前的所有字段的值以及更改后所有字段的值,而STATEMENT模式只單單記錄了UPDATE操作的SQL語(yǔ)句。我們要將mysql的數(shù)據(jù)實(shí)時(shí)同步到ES, 只能選擇ROW模式的binlog, 獲取并解析binlog日志的數(shù)據(jù)內(nèi)容,執(zhí)行ES document api,將數(shù)據(jù)同步到ES集群中。
查看,修改binlog模式
# 查看binlog模式 mysql> show variables like "%binlog_format%"; # 修改binlog模式 mysql> set global binlog_format='ROW'; # 查看binlog是否開(kāi)啟 mysql> show variables like 'log_bin'; # 開(kāi)啟bīnlog 修改my.cnf文件log-bin = mysql-bin
第二步安裝
# 安裝go sudo apt-get install go # 安裝godep go get github.com/tools/godep # 獲取go-mysql-elasticsearch插件 go get github.com/siddontang/go-mysql-elasticsearch # 安裝go-mysql-elasticsearch插件 cd go/src/github.com/siddontang/go-mysql-elasticsearch make
第三步配置
go/src/github.com/siddontang/go-mysql-elasticsearch/etc/river.toml
# MySQL address, user and password # user must have replication privilege in MySQL. my_addr = "127.0.0.1:3306" # 需要同步的mysql基本設(shè)置 my_user = "root" my_pass = "root" # Elasticsearch address es_addr = "127.0.0.1:9200" # 本地elasticsearch配置 # Path to store data, like master.info, and dump MySQL data data_dir = "./var" # 數(shù)據(jù)存儲(chǔ)的url # 以下配置保存默認(rèn)不變 # Inner Http status address stat_addr = "127.0.0.1:12800" # pseudo server id like a slave server_id = 1001 # mysql or mariadb flavor = "mysql" # mysqldump execution path mysqldump = "mysqldump" # MySQL data source [[source]] schema = "test" //elasticsearch 與 mysql 同步時(shí)對(duì)應(yīng)的數(shù)據(jù)庫(kù)名稱(chēng) # Only below tables will be synced into Elasticsearch. # 要同步test這個(gè)database里面的幾張表。對(duì)于一些項(xiàng)目如果使用了分表機(jī)制,我們可以用通配符來(lái)匹配,譬如t_[0-9]{4},就可# 以匹配 table t_0000 到 t_9999。 tables = ["t", "t_[0-9]{4}", "tfield", "tfilter"] # Below is for special rule mapping # 對(duì)一個(gè) table,我們需要指定將它的數(shù)據(jù)同步到 ES 的哪一個(gè) index 的 type 里面。如果不指定,我們默認(rèn)會(huì)用起 schema # name 作為 ES 的 index 和 type [[rule]] schema = "test" //數(shù)據(jù)庫(kù)名稱(chēng) table = "t" //表名稱(chēng) index = "test" //對(duì)應(yīng)的索引名稱(chēng) type = "t" //對(duì)應(yīng)的類(lèi)型名稱(chēng) # 將所有滿足格式 t_[0-9]{4} 的 table 同步到 ES 的 index 為 test,type 為 t 的下面。當(dāng)然,這些表需要保證 # schema 是一致的 [[rule]] schema = "test" table = "t_[0-9]{4}" index = "test" type = "t" # 對(duì)于 table tfilter,我們只會(huì)同步 id 和 name 這兩列,其他的都不會(huì)同步 filter = ["id", "name"] # table tfield 的 column id ,我們映射成了 es_id,而 tags 則映射成了 es_tags # list 這個(gè)字段,他顯示的告知需要將對(duì)應(yīng)的 column 數(shù)據(jù)轉(zhuǎn)成 ES 的 array type。這個(gè)現(xiàn)在通常用于 MySQL 的 varchar # 等類(lèi)型,我們可能會(huì)存放類(lèi)似 “a,b,c” 這樣的數(shù)據(jù),然后希望同步給 ES 的時(shí)候變成 [a, b, c] 這樣的列表形式。 [rule.field] # Map column `id` to ES field `es_id` id="es_id" # Map column `tags` to ES field `es_tags` with array type tags="es_tags,list" # Map column `keywords` to ES with array type keywords=",list"
第四步運(yùn)行?
cd go/src/github.com/siddontang/go-mysql-elasticsearch bin/go-mysql-elasticsearch -config=./etc/river.toml
七、elasticsearch-jdbc實(shí)現(xiàn)同步
解壓:unzip elasticsearch-jdbc-2.3.2.0-dist.zip
設(shè)置環(huán)境變量
[root@autofelix /]# vi /etc/profile export JDBC_IMPORTER_HOME=/elasticsearch-jdbc-2.3.2.0
使環(huán)境變量生效
[root@autofelix /]# source /etc/profile
第一步:在根目錄下建立根目錄下新建文件夾odbc_es 如下
[root@autofelix /]# ll /odbc_es/ drwxr-xr-x 2 root root 4096 Jun 16 03:11 logs -rwxrwxrwx 1 root root 542 Jun 16 04:03 mysql_import_es.sh
第二步:新建腳本mysql_import_es.sh,內(nèi)容如下
[root@autofelix odbc_es]# cat mysql_import_es.sh '#!/bin/sh bin=$JDBC_IMPORTER_HOME/bin lib=$JDBC_IMPORTER_HOME/lib echo '{ "type" : "jdbc", "jdbc": { "elasticsearch.autodiscover":true, "elasticsearch.cluster":"my-application", #簇名,詳見(jiàn):/usr/local/elasticsearch/config/elasticsearch.yml "url":"jdbc:mysql://10.8.5.101:3306/test", #mysql數(shù)據(jù)庫(kù)地址 "user":"root", #mysql用戶名 "password":"123456", #mysql密碼 "sql":"select * from cc", "elasticsearch" : { "host" : "10.8.5.101", "port" : 9300 }, "index" : "myindex", #新的index "type" : "mytype" #新的type } }'| java \ -cp "${lib}/*" \ -Dlog4j.configurationFile=${bin}/log4j2.xml \ org.xbib.tools.Runner \ org.xbib.tools.JDBCImporter
第三步:為 mysql_import_es.sh 添加可執(zhí)行權(quán)限。
[root@autofelix odbc_es]# chmod a+x mysql_import_es.sh
第四步:執(zhí)行腳本mysql_import_es.sh
[root@autofelix odbc_es]# ./mysql_import_es.sh
到此這篇關(guān)于詳解Mysql如何實(shí)現(xiàn)數(shù)據(jù)同步到Elasticsearch的文章就介紹到這了,更多相關(guān)Mysq數(shù)據(jù)同步到Elasticsearch內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MySQL數(shù)據(jù)同步Elasticsearch的4種方案
- logstash將mysql數(shù)據(jù)同步到elasticsearch方法詳解
- 使用logstash同步mysql數(shù)據(jù)到elasticsearch實(shí)現(xiàn)
- 使用canal監(jiān)控mysql數(shù)據(jù)庫(kù)實(shí)現(xiàn)elasticsearch索引實(shí)時(shí)更新問(wèn)題
- Mysql到Elasticsearch高效實(shí)時(shí)同步Debezium實(shí)現(xiàn)
- 用python簡(jiǎn)單實(shí)現(xiàn)mysql數(shù)據(jù)同步到ElasticSearch的教程
- MySQL 與 Elasticsearch 數(shù)據(jù)不對(duì)稱(chēng)問(wèn)題解決辦法
- 如何在Elasticsearch中啟用和使用SQL功能
相關(guān)文章
MySQL循環(huán)插入千萬(wàn)級(jí)數(shù)據(jù)
這篇文章主要介紹了MySQL如何實(shí)現(xiàn)循環(huán)插入千萬(wàn)級(jí)數(shù)據(jù),幫助大家更好的理解和使用MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下2020-09-09MySQL 自動(dòng)備份與數(shù)據(jù)庫(kù)被破壞后的恢復(fù)方法
當(dāng)數(shù)據(jù)庫(kù)服務(wù)器建立好以后,我們首先要做的不是考慮要在這個(gè)支持?jǐn)?shù)據(jù)庫(kù)的服務(wù)器運(yùn)行哪些受MySQL提攜的程序,而是當(dāng)數(shù)據(jù)庫(kù)遭到破壞后,怎樣安然恢復(fù)到最后一次正常的狀態(tài),使得數(shù)據(jù)的損失達(dá)到最小。2010-03-03mysql解決時(shí)區(qū)相關(guān)問(wèn)題
這篇文章主要介紹了mysql如何解決時(shí)區(qū)相關(guān)問(wèn)題,本篇文章將從數(shù)據(jù)庫(kù)參數(shù)入手,逐步介紹時(shí)區(qū)相關(guān)內(nèi)容。感興趣的朋友可以了解下2020-08-08mysql mysqldump只導(dǎo)出表結(jié)構(gòu)或只導(dǎo)出數(shù)據(jù)的實(shí)現(xiàn)方法
mysql mysqldump只導(dǎo)出表結(jié)構(gòu)或只導(dǎo)出數(shù)據(jù)的實(shí)現(xiàn)方法,需要的朋友可以參考下。2011-11-11結(jié)合PHP腳本添加和查詢(xún)MySQL數(shù)據(jù)的基本教程
這篇文章主要介紹了結(jié)合PHP腳本添加和查詢(xún)MySQL數(shù)據(jù)的基本教程,即在PHP程序中使用基本的SELECT FROM和INSERT INTO語(yǔ)句,需要的朋友可以參考下2015-12-12MYSQL必知必會(huì)讀書(shū)筆記第八章之使用通配符進(jìn)行過(guò)濾
這篇文章主要介紹了MYSQL必知必會(huì)讀書(shū)筆記第八章之使用通配符進(jìn)行過(guò)濾的相關(guān)資料,需要的朋友可以參考下2016-05-05MySQL 5.6下table_open_cache參數(shù)優(yōu)化合理配置詳解
這篇文章主要介紹了MySQL 5.6下table_open_cache參數(shù)合理配置詳解,需要的朋友可以參考下2018-03-03mysql 添加索引 mysql 如何創(chuàng)建索引
本文將介紹mysql 如何創(chuàng)建索引,需要的朋友可以參考下2012-11-11