Duomenų rašymas į nutolusį influxdb naudojant Redis

Pradinė schema.
Raspberry pi surenka termometrų duomenis ir PHP bei CURL’o pagalba (rašiau čia) keliauja į dvi influxdb bazes. Viena yra lokaliai pačioje avietėje, kita yra nutolusiam VPS serveryje.

Problema pažymėta raudona rodykle. Kartais dingsta namuose interneto ryšys (vis dar 5GHz antena, 100mbs planas, laukiu kada suvirins šviesolaidį). To pasekoje išsiskiria duomenys tarp abiejų influxdb.

Senesnės influxdb versijos turėjo clustering funkcionalumą, bet šitas malonumas dabar mokamas.

Taip pat yra tokie sprendimai kaip influx-relay, bet This retry logic is NOT sufficient for for long periods of downtime as all data is buffered in RAM.

Problemos sprendimo schema:

Duomenys rašomi lygiagrečiai į lokalų influxdb ir redis.

Į redis’ą patogiai rašyti galima su phpredis. Archlinux’e pkgbuild’as yra AUR’e, nutolusiam VPS’e yra Centos 7 tad ten teko susikompiliuoti iš source. Abiem atvejais reikia paredaguoti php.ini ir pridėti extension=redis.so.

Tad palyginimui kodas tarp CURL’inimo į influxdb ir redis:

//Post to influxDB
$ch = curl_init("http://127.0.0.1:8086/write?db=termometrai");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,"temperaturos ".$daviklioHWID."=".$tempvalue);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
curl_close($ch);
//Post to redis
date_default_timezone_set("UTC"); 
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->rPush('VPS1',"temperaturos ".$daviklioHWID."=".$tempvalue." ".strval(time()));
$redis->close;

Į redis rašau POST duomenis, tam kad kitam gale aklai galėčiau juos vėl pakišti CURL’ui. Vienas skirtumas, kad pridedu šio momento timestamp’ą. Jis reikalingas tam, kad duomenys iš redis’o iki nutolusio serverio, ryšio dingimo metu, gali keliauti ir kelias valandas. Atsiradus ryšiui ir surašius duomenis be timestamp’o į influxdb duomenys sukristu ne su laiku kada jie buvo įrašyti į redis, o su laiku kada buvo įrašyti į influxdb. Tad šiuo atveju duomenis atkeliauja jau atsinešdami ir laiką kada buvo nuskaityti.

Nutolusiam VPS serveryje duomenis iš redis’o skaito PHP skirptas. Redis duomenis skaitau su:

$redis->lPop('VPS1');

Ši funkcija paima vieną įrašą iš nurodytos “eilės” (kuri šiuo atveju yra VPS1) ir iškarto ta įrašą ištrina. Sekančiu kartu paimama kita reikšmė ir pašalinama. Tokiu būdų gaunamas duomenų FIFO.

Rezultate turime labai greitai ir labai mažai resursu naudojančia redis. Avietė pildo duomenis naudodama RPUSH, nutolęs serveris duomenis tuo pačiu metu skaito ir trina su LPOP.

Dingus ryšiui, (nutolęs serveris nemato Rasbery Pi) consumer’is kas 10 sekundžių kartoja prisijungimo procedūrą tol kol prisijungia. Po viena ima visus duomenis tol kol ištuštėja eilė. Kai eilė ištuštėja “užmiega” dešimčiai sekundžių po kurių vėl pasitikrina ar yra duomenų. Jei nėra, toliau “miega” 10 sekundžių, jei yra “sukramto” tai kas yra.

Consumer’io (php skripto) veikimą užtikrina Supervisord. Tai labai nedidelis servisas kuris gali užtikrinti bet kokio skriptuko ar programos nenutrūkstama veikimą. Jei skriptas dėl kažkokios priežasties nulūžtu arba jį tiesiog nu kill’inus, supervisord pasirūpina jo paleidimu.

Rezultatas

Per dvi valandas dirbtinio ryšio nebuvimo, duomenys sukrito per ~15 sekundžių.

2 thoughts on “Duomenų rašymas į nutolusį influxdb naudojant Redis”

  1. Puikus straipsnis!

    Turiu klausimą: kaip sujungti centos pasiekia rpi: public internete iškištas portas, ar naudoji kokį nors VPN sprendimą? Jei taip — kokį?

    Ačiū!

  2. Avietė yra už Mikrotiko (routerio).
    Internetas > Mikrotik > avietė
    Mikrotike aprašyta NAT taisyklė (port forward). Skirtumas nuo paprasto naminio routerio Mikrotike galima aprašyti NAT’ą kuris galiotu tik klientui su tam tikru IP.
    Taigi rezultate centos’as kreipiasi į mano namų IP tam tikru portu, kuris nukreipiamas į aviete. Jei tuo portu kreipiasi kažkuris kitas IP, atsiremia į “sieną”.

Leave a Comment

  Wordpress Theme Protected By Wp Spam Blocker

By continuing to use the site, you agree to the use of cookies. more information

The cookie settings on this website are set to "allow cookies" to give you the best browsing experience possible. If you continue to use this website without changing your cookie settings or you click "Accept" below then you are consenting to this.

Close