6.9.1. Preparing Hosts for Elasticsearch Replication

During the replication process, data is exchanged from the MySQL database/table/row structure into corresponding Elasticsearch structures, as follows

MySQL Elasticsearch
Database Index
Table Type
Row Document

In general, it is easier to understand that a row within the MySQL table is converted into a single document on the Elasticsearch side, and automatically added to index "schema name" with a type of "table name".

For example, the following row within MySQL:

mysql> select * from messages where id = 99999 \G
*************************** 1. row ***************************
 id: 99999
 msg: Hello Elasticsearch
 1 row in set (0.00 sec)

Is replicated into the Elasticsearch document:

{
  "_index" : "test",
  "_type" : "messages",
  "_id" : "99999",
  "_version" : 1,
  "found" : true,
  "_source" : {
    "msg" : "Hello Elasticsearch",
    "committime" : "2017-06-23 19:02:22.0",
    "id" : "99999",
    "source_table" : "messages",
    "source_schema" : "test"
  }
}

When preparing the hosts you must be aware of this translation of the different structures, as it will have an effect on the way the information is replicated from MySQL to Elasticsearch.

MySQL Host

The data replicated from MySQL can be any data, although there are some known limitations and assumptions made on the way the information is transferred.

The following are required for replication to Elasticsearch:

  • MySQL must be using Row-based replication for information to be replicated to Elasticsearch. For the best results, you should change the global binary log format, ideally in the configuration file (my.cnf):

    binlog-format = row

    Alternatively, the global binlog format can be changed by executing the following statement:

    mysql> SET GLOBAL binlog_format = ROW;

    For MySQL 5.6.2 and later, you must enable full row log images:

    binlog-row-image = full

    Alternatively, the global binlog row image setting can be changed by executing the following statement:

    mysql> SET GLOBAL binlog_row_image = full;

    This information will be forgotten when the MySQL server is restarted; placing the configuration settings into the my.cnf file will ensure they will survive a restart of the MySQL server or OS.

  • Table format should be updated to UTF8 by updating the MySQL configuration (my.cnf):

    character-set-server=utf8
    collation-server=utf8_general_ci

    Tables must also be configured as UTF8 tables, and existing tables should be updated to UTF8 support before they are replicated to prevent character set corruption issues.

  • To prevent timezone configuration storing zone adjusted values and exporting this information to the binary log and Elasticsearch, fix the timezone configuration to use UTC within the configuration file (my.cnf):

    default-time-zone='+00:00'

For the best results when replicating, be aware of the following issues and limitations:

  • Use primary keys on all tables. The use of primary keys will improve the lookup of information within Elasticsearch when rows are updated. Without a primary key on a table a full table scan is performed, which can affect performance.

  • MySQL TEXT columns are correctly replicated, but cannot be used as keys.

  • MySQL BLOB columns are converted to text using the configured character type. Depending on the data that is being stored within the BLOB, the data may need to be custom converted. A filter can be written to convert and reformat the content as required.

Elasticsearch Host

  • Enable networking; by default Elasticsearch is configured to listen only on the localhost (127.0.0.1) IP address. The configuration should be changed to the IP address of your host.

    For example, edit the config/elasticsearch.yml file and add the following two lines:

    network.host: _site_
    discovery.type: single-node 
  • You may then start Elasticsearch as a daemon:

    bin/elasticsearch -d -p elasticsearch.pid
  • Check that Elasticsearch is up and running:

    curl http://$HOSTNAME:9200/
    
    {
      "name" : "i7DyHKt",
      "cluster_name" : "elasticsearch",
      "cluster_uuid" : "NKL8ZX0RSjyC1HQNAPxJ9w",
      "version" : {
        "number" : "5.4.1",
        "build_hash" : "2cfe0df",
        "build_date" : "2017-05-29T16:05:51.443Z",
        "build_snapshot" : false,
        "lucene_version" : "6.5.1"
      },
      "tagline" : "You Know, for Search"
    }