Projekt: baby-taschenrechner.de

Das gerade fertiggestellt Projekt baby-taschenrechner.de beschäftigt sich mit den Fragestellungen rund um die Entwicklung des eigenen Kindes:

  • Wie groß wird mein Kind werden in x-Jahren
  • Wie schwer wird mein Kind in x-Jahren
  • Ist mein Kind zu schwer/zu dünn
  • Welche Kleidergröße wird es wann tragen?

Die Webseite soll Eltern dabei helfen herauszufinden, wann sie welche Kleidergröße kaufen müssen, um im nahenden Winter/Sommer das passende zu Hause zu haben.

Eltern können so einschätzne, ob das Kind zu dünn oder zu dick ist  für ihr Alter/Größe/Gewicht-Verhältnis.

Für die Realiserung wurden folgende Technologien verwendet:

Symfony 3, Docker, MySQL, PHP, GIT, Google Material Design, Amazon AWS

Redis Performance Probleme messen und analysieren

Um Latenz Probleme bei Redis zu analysieren, kann man das eingebaute Latency Tool von redis-cli benutzen, mit dem um 100 Requests pro Sekunde auf den Redis gepingt werden und man die Antwortszeit analysieren kann.

Konsolen Bsp:

Im Intervall von i=10 Sekunden auf localhost getestet

redis-cli --latency-history -i 10 -h 127.0.0.1 -p 6379

Output:

min: 0, max: 10, avg: 0.89 (906 samples) -- 10.01 seconds range
min: 0, max: 32, avg: 1.44 (862 samples) -- 10.00 seconds range
min: 0, max: 6, avg: 0.50 (939 samples) -- 10.00 seconds range
min: 0, max: 7, avg: 0.47 (941 samples) -- 10.01 seconds range
min: 0, max: 12, avg: 0.47 (942 samples) -- 10.00 seconds range
min: 0, max: 137, avg: 2.70 (779 samples) -- 10.01 seconds range
min: 0, max: 119, avg: 5.92 (626 samples) -- 10.06 seconds range
min: 0, max: 2389, avg: 7.31 (572 samples) -- 10.00 seconds range
min: 0, max: 14, avg: 0.64 (926 samples) -- 10.00 seconds range
min: 0, max: 9, avg: 0.50 (938 samples) -- 10.01 seconds range
min: 0, max: 16, avg: 0.47 (941 samples) -- 10.01 seconds range
min: 0, max: 21, avg: 0.56 (933 samples) -- 10.01 seconds range
min: 0, max: 23, avg: 0.56 (933 samples) -- 10.01 seconds range
min: 0, max: 150, avg: 1.95 (827 samples) -- 10.01 seconds range
min: 0, max: 131, avg: 4.22 (696 samples) -- 10.01 seconds range
min: 0, max: 131, avg: 7.06 (581 samples) -- 10.01 seconds range
min: 0, max: 4136, avg: 10.33 (488 samples) -- 10.01 seconds range
min: 0, max: 17, avg: 1.15 (886 samples) -- 10.02 seconds range
min: 0, max: 18, avg: 0.88 (906 samples) -- 10.01 seconds range
min: 0, max: 11, avg: 0.61 (928 samples) -- 10.00 seconds range
min: 0, max: 12, avg: 0.55 (936 samples) -- 10.01 seconds range
min: 0, max: 9, avg: 0.51 (937 samples) -- 10.01 seconds range

Hier kann man gut sehen, dass die Probleme mit einem Abstand von 60 Sekunden  auftreten. Dies lag in dem Fall daran, dass Redis alle 60s sich selber auf die Festplatte persistiert hat. Die entsprechende Option in den redis.conf lautete:

save 60 1000

und mit der Option

save ""

kann das persistieren auf der Festplatte ausgeschaltet werden.

 

Aber auch die Option

appendonly yes

musste auf “no” gesetzt werden, weil es dadurch auch auf zu viele Schreibzugriffe kam.

Redis Replikation Tipps

Beim Betrieb von Redis im Master/Slave Modus muss darauf geachtet werden, dass:

1. Master und Slave sind nicht immer auf demselben Stand

Redis uses asynchronous replication. Starting with Redis 2.8, however, slaves will periodically acknowledge the amount of data processed from the replication stream.

D.h. bestimmte Daten müssen vom Master abgefragt werden, wie z.B. Session Daten

2. Safety of replication when master has persistence turned off

In setups where Redis replication is used, it is strongly advised to have persistence turned on in the master, or when this is not possible, for example because of latency concerns, instances should be configured to avoid restarting automatically.

To better understand why masters with persistence turned off configured to auto restart are dangerous, check the following failure mode where data is wiped from the master and all its slaves:

We have a setup with node A acting as master, with persistence turned down, and nodes B and C replicating from node A.
A crashes, however it has some auto-restart system, that restarts the process. However since persistence is turned off, the node restarts with an empty data set.
Nodes B and C will replicate from A, which is empty, so they’ll effectively destroy their copy of the data.

When Redis Sentinel is used for high availability, also turning off persistence on the master, together with auto restart of the process, is dangerous. For example the master can restart fast enough for Sentinel to don’t detect a failure, so that the failure mode described above happens.

Every time data safety is important, and replication is used with master configured without persistence, auto restart of instances should be disabled.

d.h. die auto restart Funktion sollte für den Master deaktiviert werden, falls keine sofortige Persistierung auf der Festplatte aktiviert ist.

3. Master Ausfall

Wenn der Master ausfällt, sollte der Slave nach eine Karenzzeit sich zum Master erklären (z.B. nach 10 Minuten).

Redis Scripte mit Lua programmieren

Zum Einfügen eines Datensatzes in eine Datenbank in Redis mittels Script kann man folgendes Script in einer Datei speichern und ausführen:

Script File “redis_insert.lua”:

 redis.call("select", 1)
 redis.call('set', 'myKey', 'myValue')

Auf der Console kann dann mittels des folgenden Befehls das Script ausgeführt werden und die Daten in den Redis Server geschrieben werden:

redis-cli --eval redis_insert.lua