Synchronize MySQL & Elasticsearch - vozForums
vozForums
Go Back   vozForums > Học tập và công việc > Ngành CNTT > Phát triển Phần mềm
Reply
 
Thread Tools
  #1  
Old 19-09-2015, 11:39
RPG29's Avatar
RPG29 RPG29 is offline
Đã tốn tiền
 
Join Date: 07-2010
Posts: 1,693
Synchronize MySQL & Elasticsearch

1. Trước đây bên em vẫn dùng river & cron để định kỳ cập nhật data từ bên MySQL sang Elasticsearch (ES). Sau river nó bị deprecated thì chuyển qua Logstash... Cho đến khi gặp phải một usecase đòi hỏi phải sync data giữa MySQL và ES real-time (or nearly real-time) khi có sự kiện CRUD
Do quá gấp nên bên em chữa cháy bằng cách thêm trực tiếp code ES CRUD vào luôn, kiểu như:

Code:
func insert() {
    mysql->insert();
    es->insert();
}

func delete() {
    mysql->delete();
    es->delete();
}
Vẫn chạy được nhưng làm thế này em thấy củ chuối quá
Có search linh tinh thì thấy bên này http://bigeng.io/post/117785466938/h...-elasticsearch họ dùng observer pattern để làm (DP thì em dốt lắm) ko biết là implement ntn?

2. Ngoài ra có một usecase như trên nhưng hơi khác là đòi hỏi transaction sync, trong bất kỳ trường hợp nào MySQL or ES chết thì vẫn đảm bảo đồng bộ data giữa 2 bên, ko biết là phải làm ntn? Áp dụng pattern gì? Em xin cám ơn.
Reply With Quote
  #2  
Old 19-09-2015, 23:21
GaCN.Nang GaCN.Nang is offline
Đã tốn tiền
 
Join Date: 07-2012
Posts: 141
Re: Synchronize MySQL & Elasticsearch

hóng, mặc dù em không dính đến mấy cái này.

p/s: mà giờ đi đâu cũng thấy observer pattarn. cái này lợi hại vãi. em cũng phải tìm hiểu nó thôi
Reply With Quote
  #3  
Old 20-09-2015, 00:19
_sharp_'s Avatar
_sharp_ _sharp_ is offline
Đã tốn tiền
 
Join Date: 11-2009
Location: Onepiece
Posts: 1,520
Re: Synchronize MySQL & Elasticsearch

Quote:
Originally Posted by RPG29 View Post
1.
Do quá gấp nên bên em chữa cháy bằng cách thêm trực tiếp code ES CRUD vào luôn, kiểu như:

Code:
func insert() {
    mysql->insert();
    es->insert();
}

func delete() {
    mysql->delete();
    es->delete();
}
họ dùng observer pattern để làm (DP thì em dốt lắm) ko biết là implement ntn?
Bác code Golang ah?
Observer pattern: 2 link này khá dễ hiểu.
C#: http://www.dofactory.com/net/observer-design-pattern
Javae: http://www.tutorialspoint.com/design...er_pattern.htm

Thằng CQRS (Command and Query Responsibility Segregation) được sử dụng cũng khá nhiều!

Quote:
Originally Posted by RPG29 View Post
Trước đây bên em vẫn dùng river & cron để định kỳ cập nhật data từ bên MySQL sang Elasticsearch (ES).

2. Ngoài ra có một usecase như trên nhưng hơi khác là đòi hỏi transaction sync, trong bất kỳ trường hợp nào MySQL or ES chết thì vẫn đảm bảo đồng bộ data giữa 2 bên, ko biết là phải làm ntn? Áp dụng pattern gì? Em xin cám ơn.
MySQL -> ES chứ có phải MySQL <-> ES đâu bác; vậy nếu MySQL die thì đương nhiên ES vẫn là data cũ.

Nếu ý bác là MySQL <-> ES và 1 trong 2 con die vẫn đồng bộ data giữa 2 bên thì:
1. Thêm cờ IsSync trong cả MySQL và ES.
2. Dựng 1 con DB X trong trường hợp:
- MySQL chết thì data -> ES -> DB X. MySQL sống lại; DB X -> MySQL, drop DB X.
- ES chết thì data -> MySQL-> DB X. ES sống lại; DB X -> ES, drop DB X.

Tùy bác chọn cách 1 hoặc cách 2.
Bác có 1 con MySQL và 1 con ES thôi ah!

Last edited by _sharp_; 20-09-2015 at 00:30.
Reply With Quote
  #4  
Old 20-09-2015, 10:14
RPG29's Avatar
RPG29 RPG29 is offline
Đã tốn tiền
 
Join Date: 07-2010
Posts: 1,693
Re: Synchronize MySQL & Elasticsearch

Quote:
Originally Posted by _sharp_ View Post
Bác code Golang ah?
Observer pattern: 2 link này khá dễ hiểu.
C#: http://www.dofactory.com/net/observer-design-pattern
Javae: http://www.tutorialspoint.com/design...er_pattern.htm

Thằng CQRS (Command and Query Responsibility Segregation) được sử dụng cũng khá nhiều!
PHP thôi bác, cái kia em viết pseudo code. Cám ơn bác để em tham khảo thêm

Quote:
Originally Posted by _sharp_ View Post

MySQL -> ES chứ có phải MySQL <-> ES đâu bác; vậy nếu MySQL die thì đương nhiên ES vẫn là data cũ.

Nếu ý bác là MySQL <-> ES và 1 trong 2 con die vẫn đồng bộ data giữa 2 bên thì:
1. Thêm cờ IsSync trong cả MySQL và ES.
2. Dựng 1 con DB X trong trường hợp:
- MySQL chết thì data -> ES -> DB X. MySQL sống lại; DB X -> MySQL, drop DB X.
- ES chết thì data -> MySQL-> DB X. ES sống lại; DB X -> ES, drop DB X.

Tùy bác chọn cách 1 hoặc cách 2.
Bác có 1 con MySQL và 1 con ES thôi ah!
Vẫn biết replicate cho cả MySQL & ES thì tốt nhưng mà hiện giờ bên này tài nguyên giới hạn quá, chỉ có 1 server MySQL & 1 server ES nên hơi thốn

MySQL chết thì ko nói vì ko có data để đẩy sang ES nhưng mà cái vụ transaction sync từ MySQL --> ES là phải có. CRUD bên MySQL thì bên ES phải cập nhật theo, trong trường hợp nào đó con ES nó chết thì sẽ mất đồng bộ vì cái hệ thống này nó phụ thuộc rất nhiều vào ES vì logic của nó hầu như là search
Reply With Quote
Đang tải...
  #5  
Old 21-09-2015, 00:30
_sharp_'s Avatar
_sharp_ _sharp_ is offline
Đã tốn tiền
 
Join Date: 11-2009
Location: Onepiece
Posts: 1,520
Re: Synchronize MySQL & Elasticsearch

Quote:
Originally Posted by RPG29 View Post
PHP thôi bác, cái kia em viết pseudo code. Cám ơn bác để em tham khảo thêm
Thử thằng này đi bác: https://github.com/jprante/elasticsearch-jdbc
Reply With Quote
  #6  
Old 21-09-2015, 10:09
bi ban lien tuc bi ban lien tuc is offline
K.I.A
 
Join Date: 06-2013
Posts: 352
Re: Synchronize MySQL & Elasticsearch

Quote:
Originally Posted by _sharp_ View Post
Nếu ý bác là MySQL <-> ES và 1 trong 2 con die vẫn đồng bộ data giữa 2 bên thì:
1. Thêm cờ IsSync trong cả MySQL và ES.
2. Dựng 1 con DB X trong trường hợp:
- MySQL chết thì data -> ES -> DB X. MySQL sống lại; DB X -> MySQL, drop DB X.
- ES chết thì data -> MySQL-> DB X. ES sống lại; DB X -> ES, drop DB X.

Tùy bác chọn cách 1 hoặc cách 2.
Bác có 1 con MySQL và 1 con ES thôi ah!
phải em thì em ghi id, table name của cái record cần update ra file name, lúc nào thêm vào mysql thì tạo file (file rỗng, tên file là id). có 1 process khác để sync với es. lúc sync xong với es thì xóa file đi. ko cần phải db x

nếu đòi hỏi performance cao quá thì mình sẽ dùng cách khác, dùng 1 cái message queue như rabbitmq. lúc nào insert thì tạo 1 cái message bắn vào queue này, 2 thằng crud vào mysql & es sẽ nghe & update theo thôi, nhưng khả năng bạn ko có thêm được computer mà cài rabbitmq & đảm bảo nó ko chết như file

dùng file để observe là đơn giản & hiệu quả để làm, tuy nhiên giải pháp sẽ ko ghi điểm trong mắt quản lý. dùng message queue thì phải chắc là con rabbitmq ko chết (ở cty mình thì rabbitmq là tin cậy nhất, chưa bao giờ chết & cũng ko có lỗi lầm gì, orable db còn thi thoảng mất kết nối & chậm).

giải pháp với rabbitmq:

tạo 1 exchange tên 'live' để bắn message crud vào. tạo 2 queue 'live mysql', ' 'live es' listen vào exchange 'live'. tạo 2 cái process làm việc với mysql, es, cứ listen vào 2 queue này, nếu ko insert được vào mysql/es thì bắn ra 1 cái exchange khác 'die mysql' 'die es' rồi kill process đi, notifi developer. lúc khởi động lại process thì process đọc từ 'die mysql' ra để insert lại

observe pattern cũng require cả 2 db đều live. giải quyết thế nào được việc sync

Last edited by bi ban lien tuc; 21-09-2015 at 10:34.
Reply With Quote
  #7  
Old 21-09-2015, 11:16
_sharp_'s Avatar
_sharp_ _sharp_ is offline
Đã tốn tiền
 
Join Date: 11-2009
Location: Onepiece
Posts: 1,520
Re: Synchronize MySQL & Elasticsearch

Quote:
Originally Posted by bi ban lien tuc View Post
observe pattern cũng require cả 2 db đều live. giải quyết thế nào được việc sync
1. Observe pattern là cho case 1 mà.
2. Còn case 2 theo ý bác "tạo 2 cái process làm việc với mysql, es, cứ listen vào 2 queue này" vậy là service call liên tục ah :-?
Việc check MySQL sống hay chết thì handle trong code cũng dc, chết thì tống vào DB X.

"nếu ko insert được vào mysql/es thì bắn ra 1 cái exchange khác 'die mysql' 'die es' rồi kill process đi, notifi developer. lúc khởi động lại process thì process đọc từ 'die mysql' ra để insert lại ", cái notifi developer vậy là làm việc 24/7, và nhiều lúc DB chết cũng cần thời gian khá lâu để làm nó sống lại, đâu phải cứ start-stop đâu ^^.
Reply With Quote
  #8  
Old 21-09-2015, 15:54
bi ban lien tuc bi ban lien tuc is offline
K.I.A
 
Join Date: 06-2013
Posts: 352
Re: Synchronize MySQL & Elasticsearch

[quote=_sharp_;80408736]1. Observe pattern là cho case 1 mà.
2. Còn case 2 theo ý bác "tạo 2 cái process làm việc với mysql, es, cứ listen vào 2 queue này" vậy là service call liên tục ah :-?
Việc check MySQL sống hay chết thì handle trong code cũng dc, chết thì tống vào DB X.
[quote/] chia để trị thôi. DB X thì vẫn phải sync với mysql, elastic search -> thêm việc. dùng queue thì lúc xử lý xong message thì message mất đi, đỡ phải quản lý. service call thì là lúc nào có message về thì mới chạy, service chạy ngầm thôi mà.
Quote:
"nếu ko insert được vào mysql/es thì bắn ra 1 cái exchange khác 'die mysql' 'die es' rồi kill process đi, notifi developer. lúc khởi động lại process thì process đọc từ 'die mysql' ra để insert lại ", cái notifi developer vậy là làm việc 24/7, và nhiều lúc DB chết cũng cần thời gian khá lâu để làm nó sống lại, đâu phải cứ start-stop đâu ^^.
noti (email, sms) để dev biết database chết mà xử lý. mình nghĩ bạn thớt chưa có tool để monitor database service.
Reply With Quote
  #9  
Old 23-09-2015, 15:00
RPG29's Avatar
RPG29 RPG29 is offline
Đã tốn tiền
 
Join Date: 07-2010
Posts: 1,693
Re: Synchronize MySQL & Elasticsearch

Cám ơn các bác
Chắc em đang dùng Gearman or RabbitMQ để index ES, có gì thì cứ notify cho system nó quản lý
Reply With Quote
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump

All times are GMT +7. The time now is 09:31.
Chịu trách nhiệm nội dung: Bạch Thành Trung © 2019 Công ty TNHH Thật Vi Diệu
ĐC tầng 4, số 6-8 Đường D2, Bình Thạnh, Hồ Chí Minh, Việt Nam - SĐT 0981323799 - MST 0313906593
Giấy phép thiết lập MXH số 334/GP-BTTTT, Ký ngày: 19/08/2019