Redis Teil 5 - Wie wird Redis in Magento integriert?

31.10.2019
extendedLogo

Im fünften Teil unserer Blogserie erklären wir schrittweise die Integration von Redis in Magento. Welche Vorbereitungen sind zu treffen, welche Codeblöcke müssen eingefügt werden und wie wird Redis bei maxcluster aktiviert.

Redis-Blogserie

In Teil 1 unserer Blogserie über die In-Memory-Datenbank Redis haben wir darüber berichtet, wie die Performance von Onlineshops durch diesen Dienst verbessert wird. Zusätzlich zu unseren langjährigen positiven Erfahrungen mit dem Einsatz von Redis, wollten wir unseren Kunden Fakten über die zu erwartenden Performance-Verbesserungen liefern und haben ein aufwendiges Benchmark erstellt. Teil 2 unserer Blogserie befasst sich mit dem Benchmark zum Anwendungscache, Teil 3 mit dem Sessions Benchmark. Teil 4 dieser Redis-Blogserie hat die Integration von Redis in Shopware zum Inhalt. In diesem letzten und finalen Redis-Beitrag behandeln wir die Integration von Redis in Magento Onlineshops.

Redis und Magento

Bei Shops, die bereits Magento 2 einsetzen, wird Redis nativ unterstützt. Das bedeutet, dass keine weiteren Plugins zur Integration notwendig sind. Die Sessions und der Magento Cache können in der Redis-Datenbank abgelegt und damit die Performance des Onlineshops verbessert werden. Auch der Magento PageCache lässt sich in Redis ablegen, hier empfehlen wir allerdings stattdessen den Einsatz von Varnish.

Bei Magento 1-Shops hingegen ist ein zusätzliches Plugin erforderlich, damit Redis seine Vorteile ausspielen kann. Wir empfehlen dabei für den Cache das Plugin Cm_Cache_Backend sowie für Sessions das Plugin Cm_RedisSession.

Vorbereitungen für die Integration

Als ersten Schritt empfehlen wir die Größe der Redis Instanzen festzulegen. Richten Sie sich bei der Abschätzung der Größe an der Ordnergröße von var/sessions und var/cache. Bitte beachten Sie bei Ihrer Abschätzung, dass insbesondere der Cache niemals voll werden sollte. Wir empfehlen daher, die Redis-Instanz so einzustellen, dass diese maximal zu 40 % belegt ist. Als weiteren Schritt empfiehlt es sich, ein Monitoring für die Belegung einzurichten, sodass Sie Engpässe kurzfristig erkennen und darauf reagieren können. Falls Sie einen neu entwickelten Shop betreiben, ist eine Größe von 1 GB für die Redis-Instanzen ein guter Ausgangswert. Übrigens, maxcluster überwacht ebenfalls die Belegung des Caches, greift im Notfall ein und informiert Sie.

Redis Server im maxcluster Interface anlegen

Redis Server im maxcluster Interface anlegen

Bei maxcluster lassen sich alle Redis Instanzen bequem über unser Interface erstellen. Bitte beachten Sie, dass Sie jeweils für Sessions und den Cache eine Instanz anlegen müssen, um die Vorteile von Redis für Ihren Shop vollständig nutzen zu können. In unserem Interface lassen sich für die Cache- und Session-Instanzen Vorlagen auswählen, bei welchen nur noch die Größe nach dem individuellen Bedarf gestellt werden muss.

Sollten Sie die Redis-Instanz in einem anderem Hosting-Setup betreiben, empfehlen wir (wie in Teil 1 unserer Blogserie beschrieben) in beiden Fällen die "Max Memory Policy" (Verdrängungsstrategie) auf volatile-lru zu stellen. Die Persistenz sollte bei der Cache-Instanz deaktiviert und bei der Session-Instanz aktiviert werden.

Redis im maxcluster Interface einstellen

Redis im maxcluster Interface einstellen

Redis und Magento 2

Da Magento 2 Redis bereits nativ unterstützt, ist für die Aktivierung lediglich ein Befehl über SSH im Stammverzeichnis der Magento-Instanz auszuführen:

Sessions werden in Redis mit folgendem Codeblock ablegt:

bin/magento setup:config:set -q --session-save=redis   --session-save-redis-port=0  --session-save-redis-db=2    --session-save-redis-host=/var/run/redis/6379.sock

Den Cache können Sie folgendermaßen in Redis ablegen:

bin/magento setup:config:set -q --cache-backend=redis --cache-backend-redis-port=0 --cache-backend-redis-db=1 --cache-backend-redis-server=/var/run/redis/6380.sock

Falls Sie einen externen Redis Server verwenden, können Sie diesen ebenfalls angeben:

bin/magento setup:config:set -q --session-save=redis   --session-save-redis-port=6379  --session-save-redis-db=2    --session-save-redis-host=1.2.3.4
bin/magento setup:config:set -q --cache-backend=redis --cache-backend-redis-port=6380 --cache-backend-redis-db=1 --cache-backend-redis-server=1.2.3.4

Diese Kommandos führen letztendlich dazu, dass eine Änderung in der Datei app/etc/env.php durchgeführt wird. Es ist auch möglich, die Konfiguration direkt dort einzutragen:

Für den Cache:

'cache' => [
    'frontend' => [
        'default' => [
            'backend' => 'Cm_Cache_Backend_Redis',
            'backend_options' => [
                'server' => '/var/run/redis/6380.sock',
                'database' => '1',
                'port' => '0'
            ]
        ]
    ]
]

Für die Sessions:

'session' =>
array (
  'save' => 'redis',
  'redis' =>
  array (
    'host' => '/var/run/redis/6379.sock',
    'port' => '0',
    'password' => '',
    'timeout' => '2.5',
    'persistent_identifier' => '',
    'database' => '2',
    'compression_threshold' => '2048',
    'compression_library' => 'gzip',
    'log_level' => '1',
    'max_concurrency' => '6',
    'break_after_frontend' => '5',
    'break_after_adminhtml' => '30',
    'first_lifetime' => '600',
    'bot_first_lifetime' => '60',
    'bot_lifetime' => '7200',
    'disable_locking' => '0',
    'min_lifetime' => '600',
    'max_lifetime' => '2592000'
  )
),

Redis und Magento 1

Wie eingangs bereits erwähnt, bietet Magento 1 keine native Redis Unterstützung. Um die Performance-Vorteile nutzen zu können, müssen daher vorab zwei Plugins installiert werden. Um sich die Installation zu vereinfachen, können Sie den Pluginmanager Modman verwenden, der auf den bei maxcluster gehosteten Clustern immer in der neuesten Version vorinstalliert ist. Befindet sich Ihr Shop in einer anderen Umgebung, muss Modman gegebenenfalls noch installiert werden.

Um Modman für die jeweilige Magento-Instanz verwenden zu können, müssen Sie einmalig folgenden Befehl im Magento-Stammverzeichnis ausführen:

modman init

Anschließend können die beiden Module - oder auch nur eins - installiert werden.

Dies geschieht mit dem Befehl für das Cache-Modul:

modman clone --copy git://github.com/colinmollenhour/Cm_Cache_Backend_Redis.git

und mit folgendem Befehl für das Session-Modul:

modman clone --copy https://github.com/colinmollenhour/Cm_RedisSession

Da bei Magento ab Version 1.9.3.3 bzw. mit dem Magento Patch SUPEE-9767 die Möglichkeit, Systemlinks zu verwenden, aus Sicherheitsgründen reduziert wurde, verwenden wir hier in den Installationsbefehlen den Parameter "--copy".

Obwohl das Modul Cm_RedisSession von Magento mittlerweile mitgeliefert wird, empfehlen wir dennoch, es über Modman zu installieren, um die neueste Version zu erhalten. Bitte achten Sie in jedem Fall darauf, dass auch beide Module aktiviert wurden.

Abschließend muss die Konfiguration noch in der Datei "app/etc/local.xml" eingetragen werden.

Für das Cache Modul wird dazu folgender Codeblock innerhalb des vorhandenen " Blockes" eingefügt:

<cache>
  <backend>Cm_Cache_Backend_Redis</backend>
  <backend_options>
    <server>/var/run/redis/6380.sock</server> <!-- or absolute path to unix socket -->
    <port>0</port>\n
    <persistent></persistent> <!-- Specify unique string to enable persistent connections. E.g.: sess-db0; bugs with phpredis and php-fpm are known: https://github.com/nicolasff/phpredis/issues/70 -->
    <database>0</database> <!-- Redis database number; protection against accidental data loss is improved by not sharing databases -->
    <password></password> <!-- Specify if your Redis server requires authentication -->
    <force_standalone>0</force_standalone>  <!-- 0 for phpredis, 1 for standalone PHP -->
    <connect_retries>1</connect_retries>    <!-- Reduces errors due to random connection failures; a value of 1 will not retry after the first failure -->
    <read_timeout>10</read_timeout>         <!-- Set read timeout duration; phpredis does not currently support setting read timeouts -->
    <automatic_cleaning_factor>0</automatic_cleaning_factor> <!-- Disabled by default -->
    <compress_data>1</compress_data>  <!-- 0-9 for compression level, recommended: 0 or 1 -->
    <compress_tags>1</compress_tags>  <!-- 0-9 for compression level, recommended: 0 or 1 -->
    <compress_threshold>20480</compress_threshold>  <!-- Strings below this size will not be compressed -->
    <compression_lib>gzip</compression_lib> <!-- Supports gzip, lzf, lz4 (as l4z) and snappy -->
    <use_lua>0</use_lua> <!-- Set to 1 if Lua scripts should be used for some operations -->
  </backend_options>\n
</cache>

Für Sessions wird die vorhandene Zeile

entfernt und durch einen neuen Block ersetzt:

<session_save>db</session_save>
        <redis_session>                       <!-- All options seen here are the defaults -->
            <host>/var/run/redis/6379.sock</host>            <!-- Specify an absolute path if using a unix socket -->
            <port>0</port>
            <password></password>             <!-- Specify if your Redis server requires authentication -->
            <timeout>2.5</timeout>            <!-- This is the Redis connection timeout, not the locking timeout -->
            <persistent></persistent>         <!-- Specify unique string to enable persistent connections. E.g.: sess-db0; bugs with phpredis and php-fpm are known: https://github.com/nicolasff/phpredis/issues/70 -->
            <db>1</db>                        <!-- Redis database number; protection from accidental loss is improved by using a unique DB number for sessions -->
            <compression_threshold>2048</compression_threshold>  <!-- Set to 0 to disable compression (recommended when suhosin.session.encrypt=on); known bug with strings over 64k: https://github.com/colinmollenhour/Cm_Cache_Backend_Redis/issues/18 -->
            <compression_lib>gzip</compression_lib>              <!-- gzip, lzf, lz4 or snappy -->
            <log_level>1</log_level>               <!-- 0 (emergency: system is unusable), 4 (warning; additional information, recommended), 5 (notice: normal but significant condition), 6 (info: informational messages), 7 (debug: the most information for development/testing) -->
            <max_concurrency>6</max_concurrency>                 <!-- maximum number of processes that can wait for a lock on one session; for large production clusters, set this to at least 10% of the number of PHP processes -->
            <break_after_frontend>5</break_after_frontend>       <!-- seconds to wait for a session lock in the frontend; not as critical as admin -->
            <fail_after>10</fail_after>                          <!-- seconds after which we bail from attempting to obtain lock (in addition to break after time) -->
            <break_after_adminhtml>30</break_after_adminhtml>
            <first_lifetime>600</first_lifetime>                 <!-- Lifetime of session for non-bots on the first write. 0 to disable -->
            <bot_first_lifetime>60</bot_first_lifetime>          <!-- Lifetime of session for bots on the first write. 0 to disable -->
            <bot_lifetime>7200</bot_lifetime>                    <!-- Lifetime of session for bots on subsequent writes. 0 to disable -->
            <disable_locking>0</disable_locking>                 <!-- Disable session locking entirely. -->
            <min_lifetime>600</min_lifetime>                      <!-- Set the minimum session lifetime -->
            <max_lifetime>2592000</max_lifetime>                 <!-- Set the maximum session lifetime -->
            </redis_session> 

Bitte vergessen Sie nicht, nach der Änderung der local.xml-Datei wie gewohnt den Magento Cache zu leeren.

Unterstützung

Sollten Sie Unterstützung bei der beschriebenen Integration von Redis wünschen, bieten wir unseren Kunden an, die Integration wie hier beschrieben für sie durchzuführen. Wenden Sie sich dann gerne an unser Support Team, via Telefon unter 05251/414130 oder via E-Mail an support@maxcluster.de.

Weitere Beiträge dieser Blogserie


Zuletzt aktualisiert am 09.06.2021 | JH