Mise en place d'un cluster Cassandra avec Frontaux Apache / Symfony2 et load balancer Nginx

Mise en place d'un cluster Cassandra avec 3 noeuds avec Frontaux Apache PHP Symfony2 et load balancer Nginx

Publié le 28/09/2015

Nous allons mettre en place une ferme avec un cluster Cassandra de 3 noeuds et des front-end Apache/PHP et un load balancer nGinx

On va ensuite effectuer un tir de charge sur notre plateforme afin de mesurer et d'évaluer ses performances sur le nombre de requête qu'elle sera capable de traiter.

Ce tutorial à pour but de mettre en place un POC permettant de dimensionner et effectuer des tests, donc ne pas utiliser en prod en l'état ;).

1 - Topologie de la ferme pour la maquette

- 1 Serveur physique CentOS / KVM :

  • - 4 VM front-end Apache PHP :
    • - 1 CPU
    • - 2 Go de RAM
    • - 8 Go DD

- 3 Serveurs physiques Cassandra :

      • - 2 CPU
      • - 8 Go de RAM
      • - 500 Go DD

IP et Hostname :

- Front-End :

      • - 192.168.0.96 : front-srv-01

- DB :

      • - 192.168.0.97 : db-node-01
      • - 192.168.0.98 : db-node-02
      • - 192.168.0.99 : db-node-03

Réseau :

      • - passerelle : 192.168.0.254
      • - dns : 192.168.0.1

On aura besoin d'un résolveur dns local pour identifier les machines, voir le tutorial sur bind.

2 - Installation et paramétrage du load balancer

On va utiliser Nginx comme load-balancer.

2.1 - Installation d'Nginx

apt-get install nginx

2.2 - Configuration

nano /etc/nginx/sites-available/default

On remplace le contenu du vhost par :


upstream lb-srv  {
  server front-srv-01;
  server front-srv-02;
  server front-srv-03;
  server front-srv-04;
}

server {
  location / {
    proxy_pass  http://lb-srv;
  }
}

Redémarrage d'Nginx :

service nginx restart

3 - Installation et paramétrage des VMs front-end

On appliquera cette configuration pour chaque VM.

3.1 - Configuration système

Configuration des hosts, modifier dans /etc/hosts :

127.0.0.1 front-srv-n

Configuration du hostname, modifier dans /etc/hostname :

front-srv-n

Paramétrage du réseau, modifier dans /etc/network/interfaces :


auto lo

iface lo inet loopback

allow-hotplug eth0
auto eth0
iface eth0 inet static
address IP
netmask 255.255.255.0
gateway 192.168.0.254

modifier le résolveur dns :

nano /etc/resolv.conf


nameserver 192.168.0.1
domain fresh.local

3.2 - Installation d'Apache/PHP et la Cassandra PHP Extension

Appliquer la partie 3 à 9 du tutoriel sur l'environnement de développement Symfony 2 / Cassandra.

Dans les vhost Apache, indiquer l'adresse du load balancer lb-srv.fresh.local

4 - Configuration et installation du cluster Cassandra

4.1 - Création et configuration système des VM

A partir de l'installation d'une VM Linux Debian 8, on va cloner deux autre VM qui vont nous servir de base de configuration.

La configuration réseau et nom d'hôtes s'effectuera de la façon suivante :

      • - 192.168.0.97 : db-node-01
      • - 192.168.0.98 : db-node-02
      • - 192.168.0.99 : db-node-03

4.2 - Installation de Cassandra

Appliquer la partie 2 du tutoriel sur l'environnement de développement Symfony 2 / Cassandra.

On va désactiver la swap pour chaque noeud :

swapoff --all

4.3 - Configuration des noeuds

Pour chaque VM Cassandra on va éditer le fichier /etc/cassandra/cassandra.yaml et configurer les valeurs suivantes :

Serveur seed db-node-01 :


db-node-01
cluster_name: 'Test Cluster'
initial_token: 0
seed_provider:
    - seeds:  "192.168.0.97"
listen_address: 192.168.0.97
rpc_address: 0.0.0.0
broadcast_rpc_address: 1.2.3.4
endpoint_snitch: GossipingPropertyFileSnitch

Serveur seed db-node-02 :


db-node-02
cluster_name: 'Test Cluster'
initial_token: 3074457345618258602
seed_provider:
    - seeds:  "192.168.0.97"
listen_address: 192.168.0.98
rpc_address: 0.0.0.0
broadcast_rpc_address: 1.2.3.4
endpoint_snitch: GossipingPropertyFileSnitch

Serveur seed db-node-03 :


cluster_name: 'Test Cluster'
initial_token: 6148914691236517205
seed_provider:
    - seeds:  "192.168.0.97"
listen_address: 192.168.0.99
rpc_address: 0.0.0.0
broadcast_rpc_address: 1.2.3.4
endpoint_snitch: GossipingPropertyFileSnitch

5 - Démarrage du cluster

Démarrer d'abord le db-node-01 qui est le seed provider, puis démarrer les autres.

service cassandra start

6 - Création d'un Keyspace

On va créer un Keyspace :


CREATE KEYSPACE demo WITH replication = {'class': 'NetworkTopologyStrategy', 'DC1': 1};
USE demo;
CREATE TABLE test (id int, title text, PRIMARY KEY (id));

7 - Execution d'un insert

On va pouvoir déclencher un tir de charge vers lb-srv.fresh.local depuis une machine externe à l'infra :

ab -n 10000 -c 250 http://lb-srv.fresh.local/

Vérifier le bon déroulement des opérations sur les machines avec htop et tail sur les fichier de log Cassandra et Apache.

Par la suite, on va pouvoir vérifier la présence de données sur chaque instance Cassandra en effectuant une requête select depuis la console.


use DEMO;
SELECT * FROM test;

Gestion du cluster

Supprimer un noeud du cluster :

nodetool -h db-pnode-01.fresh.local -u cassandra -pw qqq status nodetool -h db-pnode-01.fresh.local -u cassandra -pw qqq removenode "node-id"

Sources :

https://github.com/M6Web/CassandraBundle
https://github.com/datastax/php-driver
https://github.com/datastax/php-driver/blob/master/ext/README.md
http://datastax.github.io/cpp-driver/topics/building/
http://docs.datastax.com/en/cassandra/2.2/cassandra/install/installDeb.html
https://www.digitalocean.com/community/tutorials/how-to-configure-a-multi-node-cluster-with-cassandra-on-a-ubuntu-vps
http://docs.datastax.com/en/cql/3.0/cql/cql_reference/create_keyspace_r.html