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