1. 程式人生 > >應對sharding-jdbc結合mybatis實現分庫分表功能 分表的聯合查詢採用將mysql的資料同步到elasticsearch進行篩選

應對sharding-jdbc結合mybatis實現分庫分表功能 分表的聯合查詢採用將mysql的資料同步到elasticsearch進行篩選

應對sharding-jdbc結合mybatis實現分庫分表功能  分表的聯合查詢採用將mysql的資料同步到elasticsearch進行篩選

安裝操作指南:(1)(2)

其中windows目錄展示如下:

版本控制:1. 需要jdk:1.8(1.8.0_60)

                  2.ElasticSearch(5.6.3)

                  3.建議logstash版本與ElasticSearch版本號對應一致(5.6.3)

                  4.ruby-2.4.4-2-x64

說明:

ElasticSearch配置head外掛:

1.head在es2.X及以前是作為es的一個外掛存在的,可以直接通過plugin命令安裝,5.x及以後需要作為一個單獨的服務執行,基於nodejs環境及grunt啟動服務

2.logstash + Logstash-input-jdbc來同步資料,logstash-input-jdbc外掛是logstash 的一個個外掛,使用ruby語言開發。所以要先安裝ruby,也是為了好使用ruby中的gem安裝外掛,下載地址: https://rubyinstaller.org/downloads/

核心:同步方式

1、資料同步方式

      全量同步與增量同步

     全量同步是指全部將資料同步到es,通常是剛建立es,第一次同步時使用。增量同步是指將後續的更新、插入記錄同步到es。

2. logstash-input-jdbc使用

官方文件地址 

logstash目錄下配置檔案的結構:

全量同步配置檔案:jdbc.conf   + jdbc.sql + mysql-connector-java-5.1.9

增量同步配置檔案:jdbc_add.conf   + jdbc_add.sql + mysql-connector-java-5.1.9 + station_parameter.txt

jdbc..conf:

input {
    stdin {
    }
    jdbc {
      # mysql 資料庫連結,test為資料庫名
      jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/test"
      # 使用者名稱和密碼
      jdbc_user => "root"
      jdbc_password => "root"
      # 驅動
      jdbc_driver_library => "G:\Developer\Elasticsearch5.5.1\ES5\logstash-5.5.1\bin\mysql\mysql-connector-java-5.1.9.jar"
      # 驅動類名
      jdbc_driver_class => "com.mysql.jdbc.Driver"
      jdbc_paging_enabled => "true"
      jdbc_page_size => "50000"
	  # 執行的sql 檔案路徑+名稱
      statement_filepath => "G:\Developer\Elasticsearch5.5.1\ES5\logstash-5.5.1\bin\mysql\jdbc.sql"
      # 設定監聽間隔  各欄位含義(由左至右)分、時、天、月、年,全部為*預設含義為每分鐘都更新
	  schedule => "* * * * *"
      # 索引型別
	  type => "jdbc"
    }
}


filter {
    json {
        source => "message"
        remove_field => ["message"]
    }
}


output {
    elasticsearch {
	    # ES的IP地址及埠
        hosts => ["localhost:9200"]
	    # 索引名稱
        index => "article"
	    # 自增ID 需要關聯的資料庫中有有一個id欄位,對應索引的id號
        document_id => "%{id}"
    }
    stdout {
	   # JSON格式輸出
        codec => json_lines
    }
}

 jdbc.sql:

select * from t_student_01

增量同步jdbc_add.sql:

input {
    stdin {
    }
    jdbc {
      # mysql 資料庫連結,test為資料庫名
      jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/test"
      # 使用者名稱和密碼
      jdbc_user => "root"
      jdbc_password => "root"
      # 驅動
      jdbc_driver_library => "G:\Developer\Elasticsearch5.5.1\ES5\logstash-5.5.1\bin\mysql\mysql-connector-java-5.1.9.jar"
      # 驅動類名
      jdbc_driver_class => "com.mysql.jdbc.Driver"

      #處理中文亂碼問題
      codec => plain { charset => "UTF-8"}
      #使用其它欄位追蹤,而不是用時間
      use_column_value => true
      #追蹤的欄位
      tracking_column => id
      record_last_run => true
     #上一個sql_last_value值的存放檔案路徑, 必須要在檔案中指定欄位的初始值
     last_run_metadata_path => "G:\Developer\Elasticsearch5.5.1\ES5\logstash-5.5.1\bin\mysql\station_parameter.txt"
     #開啟分頁查詢
     jdbc_paging_enabled => true
     jdbc_page_size => 300
	  
      # 執行的sql 檔案路徑+名稱
      statement_filepath => "G:\Developer\Elasticsearch5.5.1\ES5\logstash-5.5.1\bin\mysql\jdbc.sql"
      # 設定監聽間隔  各欄位含義(由左至右)分、時、天、月、年,全部為*預設含義為每分鐘都更新
	  schedule => "* * * * *"
      # 索引型別
	  type => "jdbc"

    }
}

filter {
    json {
        source => "message"
        remove_field => ["message"]
    }
}

output {
    elasticsearch {
	    # ES的IP地址及埠
        hosts => ["localhost:9200"]
		# 索引名稱
        index => "article"
		# 自增ID
        document_id => "%{id}"
    }
    stdout {
	    # JSON格式輸出
        codec => json_lines
    }
}
引數介紹:

//是否記錄上次執行結果, 如果為真,將會把上次執行到的 tracking_column 欄位的值記錄下來,儲存到 last_run_metadata_path 指定的檔案中
record_last_run => true

//是否需要記錄某個column 的值,如果 record_last_run 為真,可以自定義我們需要 track 的 column 名稱,此時該引數就要為 true. 否則預設 track 的是 timestamp 的值.
use_column_value => true

//如果 use_column_value 為真,需配置此引數. track 的資料庫 column 名,該 column 必須是遞增的.比如:ID.
tracking_column => MY_ID

//指定檔案,來記錄上次執行到的 tracking_column 欄位的值
//比如上次資料庫有 10000 條記錄,查詢完後該檔案中就會有數字 10000 這樣的記錄,下次執行 SQL 查詢可以從 10001 條處開始.
//我們只需要在 SQL 語句中 WHERE MY_ID > :sql_last_value 即可. 其中 :sql_last_value 取得就是該檔案中的值(10000).(!!!注意這裡唯一不變就是 sql_last_value 是資料庫表的主鍵的當前最大值)
last_run_metadata_path => "G:\Developer\Elasticsearch5.5.1\ES5\logstash-5.5.1\bin\mysql\station_parameter.txt"


//是否清除 last_run_metadata_path 的記錄,如果為真那麼每次都相當於從頭開始查詢所有的資料庫記錄
clean_run => false

//是否將 column 名稱轉小寫
lowercase_column_names => false

//存放需要執行的 SQL 語句的檔案位置
statement_filepath => "G:\Developer\Elasticsearch5.5.1\ES5\logstash-5.5.1\bin\mysql\jdbc.sql"

增量同步:jdbc_add.sql:

select * from t_student_01 where id > :sql_last_value

增量同步:station_parameter.txt(!注意  #上一個sql_last_value值的存放檔案路徑, 起初必須要在檔案中指定欄位的初始值,其中“---”這符號是自己生成的)

最終效果: 

這個檔案裡記錄上次執行到的 tracking_column 欄位的值,比如上次資料庫有 10000 條記錄,查詢完後該檔案中就會有數字 10000 這樣的記錄,下次執行 SQL 查詢可以從 10001 條處開始,我們只需要在 SQL 語句中 WHERE MY_ID > :sql_last_value 即可. 其中 :sql_last_value 取得就是該檔案中的值。

遇到的問題:

(1)在安裝好ElasticSearch的head外掛後總是用grunt server命令啟動時總是報錯:

解決方案: 命令:

npm install grunt --save-dev

(2)增量同步中上述jdbc_add.sql檔案中的 記錄tracking_column 欄位的值,  必須是 

where id > :sql_last_value

(3)上述所有配置檔案需要編碼是ANSI編碼方式(一般預設是UTF-8編碼),否則出錯

相關推薦

應對sharding-jdbc結合mybatis實現分庫表功 聯合查詢採用mysql資料同步elasticsearch進行篩選

應對sharding-jdbc結合mybatis實現分庫分表功能  分表的聯合查詢採用將mysql的資料同步到elasticsearch進行篩選 安裝操作指南:(1)、(2) 其中windows目錄展示如下: 版本控制:1. 需要jdk:1.8(1.8.0_60)

sharding-jdbc結合mybatis實現分庫功能

源自:https://www.cnblogs.com/zwt1990/p/6762135.html最近忙於專案已經好久幾天沒寫部落格了,前2篇文章我給大家介紹了搭建基礎springMvc+mybatis的maven工程,這個簡單框架已經可以對付一般的小型專案。但是我們實際專案

Spring Boot入門教程(四十四): Sharding-JDBC+JPA|MyBatis+Druid分庫實現

一:資料庫分片方案 客戶端代理: 分片邏輯在應用端,封裝在jar包中,通過修改或者封裝JDBC層來實現。 噹噹網的 Sharding-JDBC 、阿里的TDDL是兩種比較常用的實現。 中介軟體代理: 在應用和資料中間加了一個代理層。分片邏輯統一維護在中介軟體

centos7 下安裝canal,並實現mysql資料同步到redis

簡介:canal為阿里巴巴產品,它主要模擬了mysql的Slave向Master傳送請求,當mysql有增刪改查時則會出發請求將資料傳送到canal服務中,canal將資料存放到記憶體,直到客戶端程式(canal服務端和客戶端程式都是由java編寫,且客戶端邏輯由我們藉助c

SpringBoot 2.3 整合最新版 ShardingJdbc + Druid + MyBatis 實現分庫

  今天專案不忙,想搞一下shardingJDBC分庫分表看看,主要想實現以下幾點: 捨棄xml配置,使用.yml或者.properties檔案+java的方式配置spring。 使用 Druid 作為資料庫連線池,同時開啟監控介面,並支援監控多資料來源。 不依賴 com.dangdang 的 shardi

Oracle結合Mybatis實現TOP 10

語句 sta str rownum info logs where param mys 之前一直使用mysql和informix數據庫,查表中前10條數據十分簡單: 最原始版本: select top * from student 當然,我們還可以寫的復雜一點,比如

MyBatis實現使用者的動態搜尋頁等功能(7)

實現使用者的動態修改功能 思路分析 點選修改,獲取要修改的使用者id 我們需要新建一個 update.jsp先顯示要修改的使用者資訊,讓後讓使用者選擇性修改 兩個頁面跳轉我們需要servlet處理,所以要新建一個UpdateUserShow.java 實現u

oracle結合mybatis 實現自增主鍵的insert和批量insert功能(未完)

一.引子 在最近的一次開發工作中,有自增主鍵這樣的需求,而資料庫使用的是oracle資料庫; 由於oracle 資料庫沒有像mysql和sqlserver 那樣提供自增主鍵的功能,所以在這裡需要換一種思維去實現自增主鍵的功能!進而我們需要引入[序列]的概念!

ElasticSearch5+logstash的logstash-input-jdbc實現mysql資料同步

在實現的路上遇到了各種坑,再次驗證官方文件只能產考不能全信! ElasticSearch安裝就不說了上一篇有說! 安裝logstash 官方:https://www.elastic.co/guide/en/logstash/current/installing-logstash.html 1

MyBatis-Plus多聯合查詢並且頁(3

這3張表的關係是   模型表Model  ===> 訓練表Training ===》應用表Application(大概的邏輯是:選擇應用,然後訓練,然後成為模型)如有不理解的可加我微信:17625089935 白天問我一般晚上回 首先我們先建立實體Model(我使用的d

ElasticSearch5+logstash-input-jdbc實現mysql資料同步及躺坑彙總

轉載來源 http://www.cnblogs.com/phpshen/p/6098333.html ElasticSearch安裝就不說了上一篇有說! 安裝logstash 官方:https://www.elastic.co/guide/en/logstash/cur

利用SSM(springmvc+spring+mybatis)實現聯合查詢

一、資料庫                           Author表 (authorid主鍵)                                                                    NewsInfo表(newsno主

mybatis學習 十四 resultMap標簽 一對一(聯合查詢)

rop prope mybatis div pro sele sel 關聯 bsp 1.使用 resultMap 實現關聯單個對象(聯合查詢方式) <resultMap type="Student" id="stuMap1"> <id colum

Memcached實現MySQL資料同步

一、介紹 1、Memcached介紹 Memcached 是一個高效能的分散式記憶體物件快取系統,用於動態Web應用以減輕資料庫負載。它通過在記憶體中快取資料和物件來減少讀取資料庫的次數,從而提高動態、資料庫驅動網站的速度。Memcached基於一個儲存鍵/值對的hashm

MyBatis學習總結(九)---基於XML多聯合查詢(一對一、一對多、多對多)

1、一對一的關聯  使用association,association元素用於處理“has-one”(一對一)這種型別關係。  作用:針對pojo物件屬性的對映,它的兩個主要引數此時對應的值: javaType對應pojo類名,  property對應pojo的

MyBatis學習總結(三)——多關聯查詢與動態SQL

一、多表關聯查詢 表與表之間有三種常見的關聯關係,分別是一對一,一對多與多對多關係,MyBatis直接提供一對一與一對多的關聯關係,可以通過間接的方式實現多對多關聯。 1.1、一對一關係 1.1.1、執行環境 假定一個員工(emp)擁有一個登入使用者(user),員工與使用者表之間是一對一關係:

實現MySQL資料同步ElasticSearch

一、場景 筆者最近在寫全文搜尋引擎服務,用到的是ElasticSearch框架,該篇部落格就如何實現MySQL資料同步到ES中進行闡述 二、解決方案 執行系統:mac系統下 採用到的技術:ES2.4、logstash-2.4.1 用到的相關外掛:ES-head、logst

MyBatis聯合查詢

最近在做在eclipse + maven搭建SSM框架下做一個簡單的後臺管理系統,因為是第一次搭建SSM專案,在mybatis進行多表連線查詢的時候遇到問題,不知道如何進行處理?在網上搜了一下解決方法是,以實現,記錄下自己的實現方案。 表之間的關係如下圖所示:

mybatis聯合查詢

以前東拼西湊來的,不知道都是哪些連結! User 、Role 的對應關係是,一個使用者有多個角色,因此,在 User 的實體中加入一個 Role 的屬性private List<Role> roles;對應一對多的關係。   <select id="q

很好的一篇關於MyBatis聯合查詢及優化的文章

序 這篇文章我打算來簡單的談談 mybatis 的多表聯合查詢。起初是覺得挺簡單的,沒必要拿出來寫,畢竟 mybatis 這東西現在是個開發的都會用,而且網上的文章也是一搜羅一大堆,根本就用不著我來重複。但是吧,就我前幾天在做一個多表聯合查詢的時候,竟然出了很多