Я использую Logstash для извлечения данных из Mysql в Elastic. Конфигурация - это что-то вроде
input {
jdbc {
jdbc_driver_library => "/usr/share/mysql-connector-java-5.1.46-bin.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://mysql:3306/books"
jdbc_user => "root"
jdbc_password=>"1"
schedule => "* * * * *"
statement => "SELECT * FROM book"
}
}
Так что тянущий запрос - это просто,
statement => "SELECT * FROM book"
что показано в большинстве документов. Вопрос в том, сможет ли logstash понять, что изменилось и что нужно индексировать/переиндексировать, или просто сканировать полную таблицу и переиндексацию всего? В моем случае данные в таблице будут в значительной степени статическими, однако они должны быть немедленно (по крайней мере, как можно скорее) доступны после создания записи. Таким образом, интервал вытягивания низкий. Должен ли я создать более сложный запрос для вытягивания или я должен предположить, что Logstash сделает трюк?
Используя вашу конфигурацию, logstash выберет все записи, выбранные в запросе SELECT * FROM book.
Если вы хотите прочитать только новую запись, вы должны установить в настройке инкрементный столбец, который будет использоваться как место в конфигурации:
jdbc {
statement => "SELECT id, mycolumn1, mycolumn2 FROM my_table WHERE id > :sql_last_value"
use_column_value => true
tracking_column => "id"
# ... other configuration bits
}
Параметр tracking_column будет включать функцию сохранения последнего значения столбца, указанного в track_column. Последнее значение: sql_last_value может использоваться в запросе как пользовательское условие в месте. Состояние logstash будет сохранено в файловой системе, и только несколько метаданных, связанных с последним значением, будут запомнены.
Обратите внимание, что таким образом вы можете извлекать только новые вставленные записи, но в зависимости от вашей модели данных он не может получить удаление или обновление уже импортированных данных.