亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MySQL > 正文

MySQL 與 Elasticsearch 數據不對稱問題解決辦法

2024-07-24 13:14:19
字體:
來源:轉載
供稿:網友

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 ROWBEGIN -- 此處的邏輯是解決文章狀態變為 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;ENDCREATE DEFINER=`dba`@`%` TRIGGER `article_BEFORE_DELETE` BEFORE DELETE ON `article` FOR EACH ROWBEGIN -- 此處邏輯是文章被刪除同事將改文章放入搜索引擎回收站。 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@Tablepublic 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<ElasticsearchTrash, Integer>{}

定時任務

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;@Componentpublic 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@EnableSchedulingpublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }} 

以上就是MySQL 與 Elasticsearch 數據不對稱問題解決辦法的講解,如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


注:相關教程知識閱讀請移步到MYSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久精品国产一区| 国产精品福利无圣光在线一区| 国产在线98福利播放视频| 亚洲人成在线免费观看| 在线视频一区二区| 国产97在线观看| 九九热精品在线| 狠狠色狠狠色综合日日五| 亚洲精品自拍偷拍| 中文字幕日韩欧美在线视频| 国产精品欧美日韩一区二区| 久热精品视频在线观看一区| 日韩av在线播放资源| 亚洲va男人天堂| 国产91精品久久久久久久| 国产精品一区久久久| 91丨九色丨国产在线| 亚洲欧美精品中文字幕在线| 国产亚洲欧洲高清一区| 亚洲第一av网| 欧美亚洲日本黄色| 亚洲欧美国产精品| 亚洲精品欧美一区二区三区| 成人欧美一区二区三区黑人| 91精品国产高清自在线看超| 91av在线影院| 精品一区二区亚洲| 欧美大片va欧美在线播放| 伊人亚洲福利一区二区三区| 欧美亚洲成人网| 国产精品视频yy9099| 亚洲视频电影图片偷拍一区| 国产a∨精品一区二区三区不卡| 欧美大胆a视频| 成人黄色免费网站在线观看| 亚洲精品小视频| 青青久久av北条麻妃黑人| 成人h视频在线| 5566日本婷婷色中文字幕97| 一区二区中文字幕| 久久九九亚洲综合| 92看片淫黄大片欧美看国产片| 欧美成人精品一区| 国产欧美精品一区二区| 自拍偷拍亚洲精品| 亚洲情综合五月天| 国产噜噜噜噜久久久久久久久| 亚洲第一国产精品| 欧美午夜视频一区二区| 欧美性在线观看| 欧美大胆a视频| 日韩欧美一区二区在线| 日韩在线观看免费高清| 久久久91精品国产| 欧美日本国产在线| 欧美日韩国产中文精品字幕自在自线| 欧美日韩在线观看视频| 亚洲精品aⅴ中文字幕乱码| 日韩美女视频免费看| 欧美专区福利在线| 亚洲第一男人天堂| 在线视频国产日韩| 欧美肥臀大乳一区二区免费视频| 亚洲香蕉伊综合在人在线视看| 久久影视三级福利片| 国产成人在线精品| 欧美疯狂性受xxxxx另类| 欧美激情一区二区三级高清视频| 国内精品久久久久影院 日本资源| 国产亚洲欧洲黄色| 欧美激情videos| 国产精品人人做人人爽| 亚洲精品98久久久久久中文字幕| 色妞在线综合亚洲欧美| 裸体女人亚洲精品一区| 国产精品美女av| 久久亚洲影音av资源网| 精品久久久久久久大神国产| 91精品久久久久久久久中文字幕| 精品二区三区线观看| 在线精品视频视频中文字幕| 国产精自产拍久久久久久| 国产午夜精品免费一区二区三区| 亚洲视频axxx| 久久久之久亚州精品露出| 欧美日韩一区二区三区在线免费观看| 不卡av电影院| 久久精品视频中文字幕| 久久精品成人动漫| 精品成人国产在线观看男人呻吟| 亚洲精品美女在线观看播放| 91久久久精品| 国内精品久久久久久影视8| 欧美性猛交99久久久久99按摩| 上原亚衣av一区二区三区| 精品国内产的精品视频在线观看| 欧美精品videosex性欧美| 亚洲欧美日本伦理| 精品一区二区电影| 国产精品亚洲综合天堂夜夜| 久久久久久尹人网香蕉| 久久成人免费视频| 色av吧综合网| 亚洲经典中文字幕| 亚洲精品一区中文字幕乱码| 深夜福利一区二区| 亚洲精品自拍第一页| 午夜精品久久久99热福利| 91sa在线看| 中文字幕在线看视频国产欧美| 久久人人爽国产| 亚洲精品影视在线观看| 欧美激情一区二区三级高清视频| 欧美电影在线观看高清| 国产不卡精品视男人的天堂| 亚洲欧美激情精品一区二区| 国产日韩精品在线播放| 国产日产欧美a一级在线| 亚洲国产第一页| 亚洲人成电影在线观看天堂色| 97在线视频观看| 亚洲一区二区久久久久久| 欧美亚洲第一页| 另类专区欧美制服同性| 91av视频在线| 亚洲综合在线中文字幕| 精品偷拍一区二区三区在线看| 国产综合久久久久久| 日韩欧美高清在线视频| 在线一区二区日韩| 色偷偷av亚洲男人的天堂| 国产日韩欧美影视| 中文字幕免费精品一区| 丝袜美腿亚洲一区二区| 日韩大陆欧美高清视频区| 美女扒开尿口让男人操亚洲视频网站| 日韩欧美亚洲范冰冰与中字| 亚洲视频一区二区| 亚洲视频专区在线| 国产精品高清在线观看| 国产精品一久久香蕉国产线看观看| 久久午夜a级毛片| 久久久久久久国产精品| 成人444kkkk在线观看| 亚洲成人av片在线观看| 久久69精品久久久久久国产越南| 成人网在线免费观看| 这里只有视频精品| 久久久免费av| 国产精品视频大全| 精品毛片三在线观看| 国产日韩欧美成人| 欧美丝袜一区二区| 日韩欧美在线免费| 97成人在线视频| 亚洲国产女人aaa毛片在线| 91av视频在线| 91精品国产综合久久香蕉的用户体验| 欧美巨猛xxxx猛交黑人97人| 亚洲第一级黄色片| 国产一区二区在线播放| 欧美成人精品不卡视频在线观看| 国产在线视频一区| 国产www精品|