Проблема виникає, якщо дані потрібно переносити:
- регулярно
- в СУБД іншого типу (mysql -> postgresql)
- з не СУБД в СУБД (csv -> sql)
- якось модифікувати дані при переносі
Для вирішення цих задач людство придумало ETL процес. ETL tools наразі існує багато. В тому числі відкриті безкоштовні рішення, такі як http://kettle.pentaho.com/, але усі вони надзвичайно складні :-)
Простеньке ж (але дієве) рішення - http://scriptella.javaforge.com
Спробую описати вирішення простенької задачі засобами scriptella.
Я здійснюю моніторинг роботи певних підсистем php додатків. В цьому мені допомагає чудовий софт - http://pinba.org. Він надає можливість переглядати стан певних визначених мною лічильників, які показують, що відбувається з тією чи іншою підсистемою додатка.
Що саме я моніторю? Час конекту до sql сервера (їх більше одного), кількість/середній час різноманітних sql операцій (select/insert/update), час що витрачається на роботу з сервером memcache, curl звернення до зовнішніх ресурсів по REST протоколу тощо.
Але pinba показує статистику за певний (не великий) час. Мені б хотілося бачити як ці показники міняються за довші періоди часу. Наприклад:
- З часом якийсь sql сервер став повільнішим. Чому?
- Після певного релізу різко зросла кількість запитів до бази даних. Чому?
- Селекти почали виконуватися повільніше.
Для цього кожні 5 хвилин я хочу переганяти дані з певних табличок mysql (pinba зроблена, як сторедж енджайн mysql) в таблички в postgresql (такий в мене пунктик - використовувати постгре)
Для початку скачаємо і розпакуємо файли з http://scriptella.javaforge.com. Далі нам потрібно скачати JDBC драйвери для обох баз даних і покласти в папку lib розпакованого дистрибутива скріптелли. Пишимо ETL скріпт - правила переносу даних.
<!DOCTYPE etl SYSTEM "http://scriptella.javaforge.com/dtd/etl.dtd">
<etl>
<description>Scriptella ETL File Template.</description>
<!--properties>
<include href="etl.properties"/>
</properties -->
<connection id="con1" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1/pinba" user="root" password="" classpath="" />
<connection id="con2" driver="org.postgresql.Driver" url="jdbc:postgresql://10.1.1.1/dwh" user="root" password="" classpath="" />
<query connection-id="con1">
SELECT * FROM tag_info_operation_server;
<script connection-id="con2">
INSERT INTO DWH_tag_info_operation_server(operation_value, server_value, req_count, req_per_sec, hit_count, hit_per_sec, timer_value) VALUES (?1, ?2, ?3, ?4, ?5, ?6,?7);
</script>
</query>
</etl>
Після цього запускаємо scriptella.sh pinba.xml
В потгресі мають з'являться ваші дані. Якщо все працює - вішаємо це все в крон.
Інші приклади - http://snippets.dzone.com/tag/scriptella
Після цього запускаємо scriptella.sh pinba.xml
В потгресі мають з'являться ваші дані. Якщо все працює - вішаємо це все в крон.
Інші приклади - http://snippets.dzone.com/tag/scriptella
2 comments:
Шикарно. Не підозрював що є такі штуки як Scriptella. Pinba в TODO, з ходу не завелось, не асіліл, буду колупати згодом.
Щоб пінба нормально зібралася під неї треба зібрати mysql - ключі конфігуре мають бути ідентичні
Post a Comment