# Redis - Architecture

Redis est déployable en self-service via notre outil de gestion de plateforme cloud : ITCare.

## Topologies <a href="#redisarchitecture-topologies" id="redisarchitecture-topologies"></a>

Deux topologies sont disponibles :

* Instance autonome
* Cluster Sentinel

Dans les deux cas, vous pouvez choisir de faire persister ou non les données sur le disque lors de la demande de création, voir [#persistance](#persistance "mention").

### Instance autonome <a href="#redisarchitecture-uneseuleinstance" id="redisarchitecture-uneseuleinstance"></a>

L'instance autonome, une fois déployée, est accessible sur le port d'écoute 6379.

### **Cluster Sentinel** <a href="#redisarchitecture-clustersentinel" id="redisarchitecture-clustersentinel"></a>

Le cluster Redis Sentinel est déployé sur 3 instances répartis sur toutes les Zones de disponibilité d'une Area.

Le cluster, une fois déployé, est accessible sur le port d'écoute 6379.

#### Particularités en mode cluster

* Chaque instance exécute les processus Redis **et** Sentinel
* Port d'écoute Sentinel : 26379
* Sur les 3 instances, l'une d'elle est primaire et les deux autres sont des répliques
* Les répliques sont ouvertes en lecture seule

## Persistance

La persistance fait référence à l'écriture de données sur un support durable, tel qu'un disque SSD (solid-state disk). Redis propose une série d'options de persistance.

* **RDB** (Redis Database) : La persistance RDB réalise des instantanés ponctuels de votre ensemble de données à des intervalles spécifiés.
* **AOF** (Append Only File) : La persistance AOF enregistre chaque opération d'écriture reçue par le serveur. Ces opérations peuvent ensuite être rejouées au démarrage du serveur, reconstituant ainsi l'ensemble de données d'origine. Les commandes sont enregistrées dans le même format que le protocole Redis lui-même.
* **Pas de persistance** : Vous pouvez désactiver complètement la persistance. Cette option est parfois utilisée pour la mise en cache.
* **RDB + AOF** : Vous pouvez également combiner AOF et RDB dans la même instance.

{% embed url="<https://redis.io/docs/management/persistence/>" %}

<table><thead><tr><th width="285">Scénario</th><th>Paramètrage</th></tr></thead><tbody><tr><td>Si Persistance <strong>RDB</strong> activée</td><td><ul><li>save 3600 1</li><li>save 300 100</li><li>save 60 10000</li></ul></td></tr><tr><td>Si Persistance <strong>AOF</strong> activée</td><td><ul><li>append fsync every sec</li></ul></td></tr></tbody></table>

## Résilience <a href="#redisarchitecture-resilience" id="redisarchitecture-resilience"></a>

Si l'instance primaire tombe en panne, une réplique sera automatiquement promue en tant que nouveau primaire. La réplique sera reconfigurée automatiquement pour suivre le nouveau primaire.

Sentinel fournit les informations concernant l'instance primaire et les instances répliques.

## Fonctionnalités <a href="#redisarchitecture-caracteristiques" id="redisarchitecture-caracteristiques"></a>

Cette section énumère les fonctionnalités disponibles pour le client, ainsi que la manière de les demander ou de les exécuter :

<table data-header-hidden><thead><tr><th width="176"></th><th></th></tr></thead><tbody><tr><td><strong>Libre service</strong></td><td>Le client peut effectuer une action de manière autonome.</td></tr><tr><td><strong>Sur demande</strong></td><td>Le client peut demander à l'équipe de support de cegedim.cloud de prendre les mesures nécessaires.</td></tr></tbody></table>

<table data-full-width="true"><thead><tr><th width="323">Fonctionnalités</th><th width="137" data-type="checkbox">Libre service</th><th width="145.5" data-type="checkbox">Sur demande</th><th>Commentaires</th></tr></thead><tbody><tr><td>Accès SSH</td><td>false</td><td>false</td><td>L'accès SSH est désactivé et réservé aux administrateurs de cegedim.cloud.</td></tr><tr><td>Modifier le fichier de configuration</td><td>false</td><td>true</td><td>Sur demande via un billet.</td></tr><tr><td>Accès à Redis/Sentinel</td><td>true</td><td>true</td><td>Le client peut se connecter avec un compte à Redis et Sentinel (mot de passe défini par le client dans l'assistant de provisionnement).</td></tr></tbody></table>

## Diagramme de haut niveau

<figure><picture><source srcset="https://1991151216-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fu3cmMjeBxFoEweG69ePZ%2Fuploads%2Fgit-blob-3b442b9a4cc09de8ca04d21decfd2f95c474277e%2Fdark_fr.png?alt=media" media="(prefers-color-scheme: dark)"><img src="https://1991151216-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fu3cmMjeBxFoEweG69ePZ%2Fuploads%2Fgit-blob-52dfd5d70a8964a0d245d638900db10e6fa47dd5%2Flight_fr.png?alt=media" alt="" width="563"></picture><figcaption><p>Diagramme de haut niveau</p></figcaption></figure>

## Configuration

### Configuration du produit <a href="#redisarchitecture-configurationduproduit" id="redisarchitecture-configurationduproduit"></a>

<table data-full-width="true"><thead><tr><th width="200">Paramètre</th><th width="294">Valeur personnalisée</th><th width="97.5" data-type="checkbox">Enforcé</th><th>Commentaires</th></tr></thead><tbody><tr><td>bind</td><td>@IP 127.0.0.1</td><td>false</td><td>Adresse d'écoute</td></tr><tr><td>timeout</td><td>300</td><td>false</td><td>Fermer la connexion après qu'un client soit inactif pendant N secondes (0 pour désactiver)</td></tr><tr><td>logfile</td><td>/var/log/redis/redis-server.log</td><td>true</td><td>Chemin du fichier journal</td></tr><tr><td>supervised</td><td>systemd</td><td>true</td><td>Interaction de supervision</td></tr></tbody></table>

Si la **persistance AOF** est active, les paramètres suivants seront appliqués :

<table data-full-width="false"><thead><tr><th width="198.5">Paramètre</th><th width="358">Valeur personnalisée</th><th data-type="checkbox">Enforcé</th></tr></thead><tbody><tr><td>appendonly</td><td>oui</td><td>false</td></tr><tr><td>dir</td><td>/var/lib/redis/persistance</td><td>true</td></tr><tr><td>appendfsync</td><td>everysec</td><td>false</td></tr></tbody></table>

si **RDB** est actif, les paramètres suivants seront appliqués :

<table data-full-width="false"><thead><tr><th width="202">Paramètre</th><th width="354.33333333333337">Valeur personnalisée</th><th data-type="checkbox">Enforcé</th></tr></thead><tbody><tr><td>save</td><td>3600 1</td><td>false</td></tr><tr><td>save</td><td>300 100</td><td>false</td></tr><tr><td>save</td><td>60 10000</td><td>false</td></tr><tr><td>rdb_compression</td><td>oui</td><td>false</td></tr><tr><td>rdbchecksum</td><td>oui</td><td>false</td></tr><tr><td>dir</td><td>/var/lib/redis/persistance</td><td>true</td></tr></tbody></table>

### Configuration Kernel <a href="#redisarchitecture-kernelconfiguration" id="redisarchitecture-kernelconfiguration"></a>

Les paramètres noyau suivants ont été modifiés afin d'optimiser les performances du système d'exploitation pour Redis :

* vm.overcommit\_memory = 1
* vm.swappiness = 1
* net.core.somaxconn = 65535

## Sécurité <a href="#redisarchitecture-securite" id="redisarchitecture-securite"></a>

### Authentification <a href="#redisarchitecture-authentification" id="redisarchitecture-authentification"></a>

Le mode d'authentification utilisé est le mode interne : Redis 6 ACL.

Les mots de passe sont hashés avec SHA-256 et n’apparaissent pas en clair dans le fichier ACL.

### Autorisations <a href="#redisarchitecture-autorisations" id="redisarchitecture-autorisations"></a>

Les ACL de Redis 6 sont utilisées pour gérer les autorisations.

Sur Sentinel, le compte client dédié a les droits sur :

{% code overflow="wrap" %}

```
~* &* +@all -@dangerous +ACL|GETUSER +INFO +sentinel|GET-MASTER-ADDR-BY-NAME +sentinel|IS-MASTER-DOWN-BY-ADDR +sentinel|MASTER +sentinel|MASTERS +sentinel|MYID +sentinel|REPLICAS +sentinel|SLAVES +sentinel|SENTINELS
```

{% endcode %}

Sur Redis, le compte client dédié a les droits sur :

{% code overflow="wrap" %}

```
~* &* +@all -@dangerous +ACL|GETUSER +INFO +CONFIG|GET +CONFIG|HELP
```

{% endcode %}

### Transport sécurisé <a href="#redisarchitecture-transportsecurise" id="redisarchitecture-transportsecurise"></a>

Le client peut choisir d'activer le non le transport TLS lors de la demande de création en libre-service via ITCare.

### Mots de passe <a href="#redisarchitecture-motsdepasse" id="redisarchitecture-motsdepasse"></a>

Cette section énumère la gestion des mots de passe :

<table data-full-width="true"><thead><tr><th width="230.2">Mot de passe</th><th width="231" data-type="checkbox">Stocké par cegedim.cloud</th><th data-type="checkbox">Stocké par le client</th><th width="139" data-type="checkbox">Enforcé</th><th>Algorithme de hash</th></tr></thead><tbody><tr><td>compte du client</td><td>false</td><td>true</td><td>false</td><td>SHA-256</td></tr><tr><td>TOUT autre compte</td><td>false</td><td>true</td><td>false</td><td>SHA-256</td></tr><tr><td>compte cgdm_admin</td><td>true</td><td>false</td><td>true</td><td>SHA-256</td></tr><tr><td>compte cgdm_monitor</td><td>true</td><td>false</td><td>true</td><td>SHA-256</td></tr></tbody></table>

## Surveillance <a href="#redisarchitecture-surveillance" id="redisarchitecture-surveillance"></a>

Les éléments suivants sont surveillés et sont accessibles dans ITCare.

<table data-full-width="false"><thead><tr><th width="390">Alertes</th><th>Description</th></tr></thead><tbody><tr><td>DBS_REDIS_CLI_CLIENTS</td><td>Vérifier le nombre de clients connectés</td></tr><tr><td>DBS_REDIS_CLI_AOF_STATUS</td><td>Vérifier l'état de l'aof</td></tr><tr><td>DBS_REDIS_CLI_COMMANDS</td><td>Nombre de commandes traitées</td></tr><tr><td>DBS_REDIS_CLI_CONNECTIONS</td><td>Nombre de connexions</td></tr><tr><td>DBS_REDIS_CLI_CPU</td><td>Utilisation du CPU</td></tr><tr><td>DBS_REDIS_CLI_MEMORY</td><td>Utilisation de la mémoire</td></tr><tr><td>DBS_REDIS_CLI_REPL_REPLICAS_COUNT</td><td>Vérifier le nombre de répliques</td></tr><tr><td>DBS_REDIS_CLI_RDB_STATUS</td><td>Statut de la RDB</td></tr><tr><td>DBS_REDIS_PING</td><td>Vérifie la disponibilité du nœud</td></tr><tr><td>DBS_REDIS_SENTINEL_MASTER_UP</td><td>Vérifie l'état du maître à partir de Sentinel</td></tr><tr><td>DBS_REDIS_SENTINEL_SLAVES_COUNT</td><td>Vérifier le nombre de répliques à partir de Sentinel</td></tr><tr><td>DBS_REDIS_SENTINEL_SENTINELS_COUNT</td><td>Vérifier Sentinelscount</td></tr><tr><td>DBS_REDIS_SENTINEL_QUORUM</td><td>Vérifier l'état du quorum</td></tr><tr><td>TLS_REDIS_CERT_EXPIRATION</td><td>Vérifier l'expiration du certificat Redis</td></tr><tr><td>TLS_SENTINEL_CERT_EXPIRATION</td><td>Vérifier l'expiration du certificat Sentinel</td></tr></tbody></table>
