MySQL 與 Elasticsearch 資料不對稱問題解決辦法
MySQL 與 Elasticsearch 資料不對稱問題解決辦法
jdbc-input-plugin 只能實現資料庫的追加,對於 elasticsearch 增量寫入,但經常jdbc源一端的資料庫可能會做資料庫刪除或者更新操作。這樣一來資料庫與搜尋引擎的資料庫就出現了不對稱的情況。
當然你如果有開發團隊可以寫程式在刪除或者更新的時候同步對搜尋引擎操作。如果你沒有這個能力,可以嘗試下面的方法。
這裡有一個資料表 article , mtime 欄位定義了 ON UPDATE CURRENT_TIMESTAMP 所以每次更新mtime的時間都會變化
?
mysql> desc article; + -------------+--------------+------+-----+--------------------------------+-------+ | Field | Type | Null | Key | Default | Extra | + -------------+--------------+------+-----+--------------------------------+-------+ | id | int (11) | NO | | 0 | | | title | mediumtext | NO | | NULL | | | description | mediumtext | YES | | NULL | | | author | varchar (100) | YES | | NULL | | | source | varchar (100) | YES | | NULL | | | content | longtext | YES | | NULL | | | status | enum( 'Y' , 'N' )| NO | | 'N' | | | ctime | timestamp | NO | | CURRENT_TIMESTAMP | | | mtime | timestamp | YES | | ON UPDATE CURRENT_TIMESTAMP | | + -------------+--------------+------+-----+--------------------------------+-------+ 7 rows in set (0.00 sec)
|
logstash 增加 mtime 的查詢規則
?
jdbc { jdbc_driver_library => "/usr/share/java/mysql-connector-java.jar" jdbc_driver_class => "com.mysql.jdbc.Driver" jdbc_connection_string => "jdbc:mysql://localhost:3306/cms" jdbc_user => "cms" jdbc_password => "password" schedule => "* * * * *" #定時cron的表示式,這裡是每分鐘執行一次 statement => "select * from article where mtime > :sql_last_value" use_column_value => true tracking_column => "mtime" tracking_column_type => "timestamp" record_last_run => true last_run_metadata_path => "/var/tmp/article-mtime.last" }
|
建立回收站表,這個事用於解決資料庫刪除,或者禁用 status = 'N' 這種情況的。
?
CREATE TABLE `elasticsearch_trash` ( `id` int (11) NOT NULL , `ctime` timestamp NULL DEFAULT CURRENT_TIMESTAMP , PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
|
為 article 表建立觸發器
?
CREATE DEFINER=`dba`@`%` TRIGGER `article_BEFORE_UPDATE` BEFORE UPDATE ON `article` FOR EACH ROW BEGIN -- 此處的邏輯是解決文章狀態變為 N 的時候,需要將搜尋引擎中對應的資料刪除。 IF NEW.status = 'N' THEN insert into elasticsearch_trash(id) values (OLD.id); END IF; -- 此處邏輯是修改狀態到 Y 的時候,方式elasticsearch_trash仍然存在該文章ID,導致誤刪除。所以需要刪除回收站中得回收記錄。 IF NEW.status = 'Y' THEN delete from elasticsearch_trash where id = OLD.id; END IF; END CREATE DEFINER=`dba`@`%` TRIGGER `article_BEFORE_DELETE` BEFORE DELETE ON `article` FOR EACH ROW BEGIN -- 此處邏輯是文章被刪除同事將改文章放入搜尋引擎回收站。 insert into elasticsearch_trash(id) values (OLD.id); END
|
接下來我們需要寫一個簡單地 Shell 每分鐘執行一次,從 elasticsearch_trash 資料表中取出資料,然後使用 curl 命令呼叫 elasticsearch restful 介面,刪除被收回的資料。
你還可以開發相關的程式,這裡提供一個 Spring boot 定時任務例子。
實體
?
package cn.netkiller.api.domain.elasticsearch; import java.util. Date ; import javax.persistence. Column ; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence. Table ; @Entity @ Table public class ElasticsearchTrash { @Id private int id; @ Column (columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP" ) private Date ctime; public int getId() { return id; } public void setId( int id) { this.id = id; } public Date getCtime() { return ctime; } public void setCtime( Date ctime) { this.ctime = ctime; } }
|
倉庫
?
package cn.netkiller.api.repository.elasticsearch; import org.springframework.data.repository.CrudRepository; import com.example.api.domain.elasticsearch.ElasticsearchTrash; public interface ElasticsearchTrashRepository extends CrudRepository
|
定時任務
?
package cn.netkiller.api.schedule; import org.elasticsearch. action . delete .DeleteResponse; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.rest.RestStatus; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import com.example.api.domain.elasticsearch.ElasticsearchTrash; import com.example.api.repository.elasticsearch.ElasticsearchTrashRepository; @Component public class ScheduledTasks { private static final Logger logger = LoggerFactory.getLogger(ScheduledTasks.class); @Autowired private TransportClient client; @Autowired private ElasticsearchTrashRepository alasticsearchTrashRepository; public ScheduledTasks() { } @Scheduled(fixedRate = 1000 * 60) // 60秒執行一次排程任務 public void cleanTrash() { for (ElasticsearchTrash elasticsearchTrash : alasticsearchTrashRepository.findAll()) { DeleteResponse response = client.prepareDelete( "information" , "article" , elasticsearchTrash.getId() + "" ).get(); RestStatus status = response.status(); logger.info( "delete {} {}" , elasticsearchTrash.getId(), status.toString()); if (status == RestStatus.OK || status == RestStatus.NOT_FOUND) { alasticsearchTrashRepository. delete (elasticsearchTrash); } } } }
|
Spring boot 啟動主程式。
?
package cn.netkiller.api; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication @EnableScheduling public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
|
以上就是MySQL 與 Elasticsearch 資料不對稱問題解決辦法的講解,如有疑問請留言或者到本站社群交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支援!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2370/viewspace-2810774/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- input 與 button 的問題 (空隙/不等高/對不齊)及 解決辦法
- 解決Mysql資料庫插入資料出現問號(?)的解決辦法MySql資料庫
- 常見php與mysql中文亂碼問題解決辦法PHPMySql
- 跨域問題解決辦法跨域
- elasticsearch,http://ip:9200訪問不到的解決辦法ElasticsearchHTTP
- 資料併發操作帶的的問題及解決辦法
- css的position-relative相容問題與解決辦法CSS
- svn相關問題解決辦法
- npm install realm --save失敗的問題與解決辦法NPM
- libigl庫的學習筆記--問題與解決辦法筆記
- 資料庫檔案複製問題和解決辦法資料庫
- PbootCMS資料庫配置,修改為Mysql資料庫,配置Mysql出錯解決辦法boot資料庫MySql
- MySQL組複製的幾個常見問題以及解決辦法MySql
- 雲伺服器解決“MySQL忘記密碼”問題的辦法伺服器MySql密碼
- 資料傾斜解決辦法
- 分享視訊直播常見問題與解決辦法彙總
- 在IDEA下使用JUnit出現的問題與解決辦法Idea
- 記錄一次重灌電腦黑屏問題解決辦法與解決思路
- Xshell連線Linux慢問題解決辦法Linux
- Macbook Pro Big Sur出問題解決辦法Mac
- 前端inline元素間隙問題解決辦法前端inline
- 安裝mysql資料庫及問題解決方法MySql資料庫
- MYSQL資料庫匯入資料時出現亂碼的解決辦法MySql資料庫
- 【TUNE_ORACLE】Oracle資料庫與HugePages(三)HugePages常見問題和解決辦法Oracle資料庫
- MYSQL++ 資料庫連線超時的解決辦法LTMySql資料庫
- nvm安裝後vscode不識別node、npm等問題的解決辦法VSCodeNPM
- 讀資料質量管理:資料可靠性與資料質量問題解決之道12應對與緩解
- discuz資料庫搬家,改密碼後無法訪問解決辦法資料庫密碼
- mysql事件關閉解決辦法MySql事件
- springboot接收Date型別資料異常與解決辦法Spring Boot型別
- matlab編譯exe問題具體解決辦法Matlab編譯
- 雲伺服器mysql 服務不見了的解決辦法伺服器MySql
- vue使用iview Timeline 時間軸不顯示渲染的效果問題解決辦法VueView
- 網上有什麼辦法可以解決網賭被黑不給出款的問題?
- [Oracle] “表中有資料,但select count(*)的結果為0”問題的解決辦法Oracle
- github訪問受限解決辦法Github
- elasticsearch啟動時提示此時不應有common的問題解決Elasticsearch
- Authentication failure 以及xxx is not in the sudoers file 問題的解決辦法AI