{"id":867,"date":"2018-01-20T22:43:46","date_gmt":"2018-01-20T19:43:46","guid":{"rendered":"http:\/\/www.dinux.lt\/blog\/?p=867"},"modified":"2018-01-20T22:50:43","modified_gmt":"2018-01-20T19:50:43","slug":"duomenu-rasymas-i-nutolusi-influxdb-naudojant-redis","status":"publish","type":"post","link":"http:\/\/www.dinux.lt\/blog\/?p=867","title":{"rendered":"Duomen\u0173 ra\u0161ymas \u012f nutolus\u012f influxdb naudojant Redis"},"content":{"rendered":"<p>Pradin\u0117 schema.<br \/>\nRaspberry pi surenka termometr\u0173 duomenis ir PHP bei CURL&#8217;o pagalba (<a href=\"http:\/\/www.dinux.lt\/blog\/?p=749\" rel=\"noopener\" target=\"_blank\">ra\u0161iau \u010dia<\/a>) keliauja \u012f dvi influxdb bazes. Viena yra lokaliai pa\u010dioje aviet\u0117je, kita yra nutolusiam VPS serveryje.<\/p>\n<p><a href=\"http:\/\/www.dinux.lt\/blog\/wp-content\/uploads\/2018\/01\/duomenu_judejimas_pries.png\" rel=\"lightbox[867]\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/www.dinux.lt\/blog\/wp-content\/uploads\/2018\/01\/duomenu_judejimas_pries-269x300.png\" alt=\"\" width=\"269\" height=\"300\" class=\"alignnone size-medium wp-image-873\" srcset=\"http:\/\/www.dinux.lt\/blog\/wp-content\/uploads\/2018\/01\/duomenu_judejimas_pries-269x300.png 269w, http:\/\/www.dinux.lt\/blog\/wp-content\/uploads\/2018\/01\/duomenu_judejimas_pries-768x856.png 768w, http:\/\/www.dinux.lt\/blog\/wp-content\/uploads\/2018\/01\/duomenu_judejimas_pries.png 800w\" sizes=\"(max-width: 269px) 100vw, 269px\" \/><\/a><\/p>\n<p>Problema pa\u017eym\u0117ta raudona rodykle. Kartais dingsta namuose interneto ry\u0161ys (vis dar 5GHz antena, 100mbs planas, laukiu kada suvirins \u0161viesolaid\u012f). To pasekoje i\u0161siskiria duomenys tarp abiej\u0173 influxdb.<\/p>\n<p>Senesn\u0117s influxdb versijos tur\u0117jo clustering funkcionalum\u0105, bet \u0161itas malonumas dabar mokamas.<\/p>\n<p>Taip pat yra tokie sprendimai kaip <a href=\"https:\/\/github.com\/influxdata\/influxdb-relay\" rel=\"noopener\" target=\"_blank\">influx-relay<\/a>, bet <em>This retry logic is NOT sufficient for for long periods of downtime as all data is buffered in RAM.<\/em><\/p>\n<p>Problemos sprendimo schema:<br \/>\n<a href=\"http:\/\/www.dinux.lt\/blog\/wp-content\/uploads\/2018\/01\/duomenu_judejimas_po.png\" rel=\"lightbox[867]\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/www.dinux.lt\/blog\/wp-content\/uploads\/2018\/01\/duomenu_judejimas_po-280x300.png\" alt=\"\" width=\"280\" height=\"300\" class=\"alignnone size-medium wp-image-872\" srcset=\"http:\/\/www.dinux.lt\/blog\/wp-content\/uploads\/2018\/01\/duomenu_judejimas_po-280x300.png 280w, http:\/\/www.dinux.lt\/blog\/wp-content\/uploads\/2018\/01\/duomenu_judejimas_po-768x822.png 768w, http:\/\/www.dinux.lt\/blog\/wp-content\/uploads\/2018\/01\/duomenu_judejimas_po.png 800w\" sizes=\"(max-width: 280px) 100vw, 280px\" \/><\/a><\/p>\n<p>Duomenys ra\u0161omi lygiagre\u010diai \u012f lokal\u0173 influxdb ir <a href=\"https:\/\/redis.io\/\" rel=\"noopener\" target=\"_blank\">redis<\/a>.<\/p>\n<p>\u012e redis&#8217;\u0105 patogiai ra\u0161yti galima su <a href=\"https:\/\/github.com\/phpredis\/phpredis\" rel=\"noopener\" target=\"_blank\">phpredis<\/a>. Archlinux&#8217;e pkgbuild&#8217;as yra AUR&#8217;e, nutolusiam VPS&#8217;e yra Centos 7 tad ten teko susikompiliuoti i\u0161 source. Abiem atvejais reikia paredaguoti php.ini ir prid\u0117ti <em>extension=redis.so<\/em>.<\/p>\n<p>Tad palyginimui kodas tarp CURL&#8217;inimo \u012f influxdb ir redis:<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n\/\/Post to influxDB\r\n$ch = curl_init(&quot;http:\/\/127.0.0.1:8086\/write?db=termometrai&quot;);\r\ncurl_setopt($ch, CURLOPT_POST, 1);\r\ncurl_setopt($ch, CURLOPT_POSTFIELDS,&quot;temperaturos &quot;.$daviklioHWID.&quot;=&quot;.$tempvalue);\r\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\r\ncurl_exec($ch);\r\ncurl_close($ch);\r\n<\/pre>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n\/\/Post to redis\r\ndate_default_timezone_set(&quot;UTC&quot;); \r\n$redis = new Redis();\r\n$redis-&gt;connect('127.0.0.1', 6379);\r\n$redis-&gt;rPush('VPS1',&quot;temperaturos &quot;.$daviklioHWID.&quot;=&quot;.$tempvalue.&quot; &quot;.strval(time()));\r\n$redis-&gt;close;\r\n<\/pre>\n<p>\u012e redis ra\u0161au POST duomenis, tam kad kitam gale aklai gal\u0117\u010diau juos v\u0117l paki\u0161ti CURL&#8217;ui. Vienas skirtumas, kad pridedu \u0161io momento timestamp&#8217;\u0105. Jis reikalingas tam, kad duomenys i\u0161 redis&#8217;o iki nutolusio serverio, ry\u0161io dingimo metu, gali keliauti ir kelias valandas. Atsiradus ry\u0161iui ir sura\u0161ius duomenis be timestamp&#8217;o \u012f influxdb duomenys sukristu ne su laiku kada jie buvo \u012fra\u0161yti \u012f redis, o su laiku kada buvo \u012fra\u0161yti \u012f influxdb. Tad \u0161iuo atveju duomenis atkeliauja jau atsine\u0161dami ir laik\u0105 kada buvo nuskaityti.<\/p>\n<p>Nutolusiam VPS serveryje duomenis i\u0161 redis&#8217;o skaito PHP skirptas. Redis duomenis skaitau su:<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">$redis-&gt;lPop('VPS1');<\/pre>\n<p>\u0160i funkcija paima vien\u0105 \u012fra\u0161\u0105 i\u0161 nurodytos &#8220;eil\u0117s&#8221; (kuri \u0161iuo atveju yra VPS1) ir i\u0161karto ta \u012fra\u0161\u0105 i\u0161trina. Sekan\u010diu kartu paimama kita reik\u0161m\u0117 ir pa\u0161alinama. Tokiu b\u016bd\u0173 gaunamas duomen\u0173 FIFO.<\/p>\n<p>Rezultate turime labai greitai ir labai ma\u017eai resursu naudojan\u010dia redis. Aviet\u0117 pildo duomenis naudodama <a href=\"https:\/\/redis.io\/commands\/rpush\" rel=\"noopener\" target=\"_blank\">RPUSH<\/a>, nutol\u0119s serveris duomenis tuo pa\u010diu metu skaito ir trina su <a href=\"https:\/\/redis.io\/commands\/lpop\" rel=\"noopener\" target=\"_blank\">LPOP<\/a>.<\/p>\n<p>Dingus ry\u0161iui, (nutol\u0119s serveris nemato Rasbery Pi) consumer&#8217;is kas 10 sekund\u017ei\u0173 kartoja prisijungimo proced\u016br\u0105 tol kol prisijungia. Po viena ima visus duomenis tol kol i\u0161tu\u0161t\u0117ja eil\u0117. Kai eil\u0117 i\u0161tu\u0161t\u0117ja &#8220;u\u017emiega&#8221; de\u0161im\u010diai sekund\u017ei\u0173 po kuri\u0173 v\u0117l pasitikrina ar yra duomen\u0173. Jei n\u0117ra, toliau &#8220;miega&#8221; 10 sekund\u017ei\u0173, jei yra &#8220;sukramto&#8221; tai kas yra.<\/p>\n<p>Consumer&#8217;io (php skripto) veikim\u0105 u\u017etikrina <a href=\"http:\/\/supervisord.org\" rel=\"noopener\" target=\"_blank\">Supervisord<\/a>. Tai labai nedidelis servisas kuris gali u\u017etikrinti bet kokio skriptuko ar programos nenutr\u016bkstama veikim\u0105. Jei skriptas d\u0117l ka\u017ekokios prie\u017easties nul\u016b\u017etu arba j\u012f tiesiog nu kill&#8217;inus, supervisord pasir\u016bpina jo paleidimu.<\/p>\n<p><strong>Rezultatas<\/strong><\/p>\n<p>Per dvi valandas dirbtinio ry\u0161io nebuvimo, duomenys sukrito per ~15 sekund\u017ei\u0173.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pradin\u0117 schema. Raspberry pi surenka termometr\u0173 duomenis ir PHP bei CURL&#8217;o pagalba (ra\u0161iau \u010dia) keliauja \u012f dvi influxdb bazes. Viena yra lokaliai pa\u010dioje aviet\u0117je, kita yra nutolusiam VPS serveryje. Problema pa\u017eym\u0117ta raudona rodykle. Kartais dingsta namuose interneto ry\u0161ys (vis dar 5GHz antena, 100mbs planas, laukiu kada suvirins \u0161viesolaid\u012f). To pasekoje i\u0161siskiria duomenys tarp abiej\u0173 influxdb. &#8230; <a title=\"Duomen\u0173 ra\u0161ymas \u012f nutolus\u012f influxdb naudojant Redis\" class=\"read-more\" href=\"http:\/\/www.dinux.lt\/blog\/?p=867\" aria-label=\"More on Duomen\u0173 ra\u0161ymas \u012f nutolus\u012f influxdb naudojant Redis\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_mi_skip_tracking":false},"categories":[3,12],"tags":[],"_links":{"self":[{"href":"http:\/\/www.dinux.lt\/blog\/index.php?rest_route=\/wp\/v2\/posts\/867"}],"collection":[{"href":"http:\/\/www.dinux.lt\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.dinux.lt\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.dinux.lt\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.dinux.lt\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=867"}],"version-history":[{"count":18,"href":"http:\/\/www.dinux.lt\/blog\/index.php?rest_route=\/wp\/v2\/posts\/867\/revisions"}],"predecessor-version":[{"id":889,"href":"http:\/\/www.dinux.lt\/blog\/index.php?rest_route=\/wp\/v2\/posts\/867\/revisions\/889"}],"wp:attachment":[{"href":"http:\/\/www.dinux.lt\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=867"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.dinux.lt\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=867"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.dinux.lt\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=867"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}