Tracking the update or changes in mysql table I need to stream the changes to elasticsearch to keep in sync with my database(mysql). 
What will be best way to do this ? I have thought for below approaches 


Using trigger( but my table will have billions of data and the
application will have frequent update so trigger may be costly) .

2  Using delta/history table (this will add the extra effort in
development and this will cause the lot many joins ) .    


Is there any out of box solution or any other way which will have the better performance and less complexity.
This topic is very interesting for me now, so because it Up, some last information:

Replication is good, but what if You need replicate data to different technology Target System (for example Redshift)

I found and test few implementations for change data capture:

1) MariaDB MaxScale CDC - my personal test was unsuccessful (and builded from source and binary distribution return link for missed plugin). Ask a questions, wait for answer.

2) StreamSets - simulate slave, ship changes to Kafka MQ. Tested on real loading, work perfect

3) Yelp 

4) Maxwell Daemon - under test now, example with NiFi - NiFI examples

5) Python Library - also simulate a slave for remote server

6) Lapidus - NodeJS implementations

Few other links also founded, some under active maintenance, some look like forgotten.

From the tests, StreamSets look very good, Maxwell also very interesting
MaxScale - sure it work, but may be available only under subscription support.

From "other" side - Talend as primary data integration tools, Redshift, memSQL.