This repository has been archived on 2021-03-01. You can view files and clone it, but cannot push or open issues or pull requests.
internship-novaquark/report/R_technique.md
2014-07-24 18:45:22 +02:00

11 KiB

Aspects scientifiques et techniques

Analyse des plates-forme d'informatique dans les nuages

Objectifs

Les serveurs du jeu seront regroupés au sein d'une structure permettant facilement d'adapter leur nombre en fonction du besoin (fortement en corrélation avec le nombre de joueurs inscrits et connectés).

Depuis quelques années, un grand nombre de plate-forme se développent, fournissant un service clef en main ; mais des solutions libres sont également disponibles lorsque l'on désire s'occuper du service manuellement.

Ici, l'objectif était de trouver les avantages et les inconvénients de chaque fournisseur et de contre balancer cette analyse par rapport aux solutions à mettre en place soi-même.

Alternatives possibles

Développer une solution de mise à l'échelle automatique, parfaitement adapté à nos besoins n'était pas envisageable : cela aurait réclamé une équipe dédiée au développement de cette solution alternative. Comme ce n'est pas le cœur de métier du studio, cette solution a d'emblée été écartée.

Cadre imposé

Propositions retenues

Les fournisseurs de service d'hébergement dans les nuages retenus sont :

  • Amazon Web Services Elastic Cloud 2 ;
  • Digital Ocean ;
  • Gandi ;
  • Google Compute Engine ;
  • Ikoula ;
  • Linode ;
  • Lunacloud ;
  • Numergy ;
  • Rackspace ;
  • Windows Azure.

Les solutions libres retenues sont :

  • Ecalyptus ;
  • Libvirt.

Résultats obtenus

%FIXME

Analyse des outils de déploiement automatique

Objectifs

Les outils de déploiement automatique vont éviter toutes les problématiques de configuration des différents serveurs que peuvent être le manque d'harmonisation, les difficultés de réalisation des mises à jour, les besoins de tests de l'environnement avant la mise en production, le redéploiement rapide d'une version stable ou précédente.

Il est nécessaire de configurer de nombreuses machines dans différents cadres :

  • ajout d'un nouveau serveur au sein du cluster (fournir le contexte) ;
  • configuration d'une machine virtuelle à destination des développeurs ;
  • configuration des serveurs annexes (sites web, bases de données, monitoring, ...).

Alternatives possibles

Dans de nombreux environnements chaque machine est configurée à la main par un administrateur système, a chaque étape, une erreur humaine peut venir interférer dans la procédure de mise à jour.

Cette solution est évidemment à écarter si l'on veut garder le contrôle de son système d'information et pouvoir faire face à tout type de problème.

Cadre imposé

Propositions retenues

Les outils de déploiment automatique retenus sont :

  • Ansible ;
  • Capistrano ;
  • CFEngine ;
  • Chef ;
  • Fabric ;
  • Puppet.

Résultats obtenus

%FIXME

Analyse des solutions de virtualisation

Objectifs

La virtualisation peut nous être utile à plusieurs niveaux :

  • la mise en place d'un environnement de tests de plusieurs machines ;
  • l'utilisation d'un environnement standardisé pour les développeurs ;
  • le déploiement d'environnements standardisés et minimalistes.

Si dans une contexte de production les serveurs sont utilisés à une valeur proche de leur puissance maximale, pour un environnement de test, il est tout à fait envisageable de regrouper les différentes machines nécessaire au sein de plusieurs machines virtuelles d'une même machine physique, dédiée aux tests.

Pour les développeurs, l'installation de l'environnement de développement n'est pas toujours facile (surtout s'ils doivent alterner entre deux systèmes d'exploitation différent) et requiert une certaine standardisation (version précises de certaine bibliothèques, paquet particulier). La virtualisation permet de leur fournir un environnement clef en main qu'ils n'ont pas à maintenir.

Sont apparues ces dernières années des technologies prônant le déploiement en production de machines virtuelles ou conteneur. Cela permet d'avoir une série de machine hôte dédiée au déploiement et des machines virtuelles minimalistes et standardisées (pas d'écoute SSH par exemple).

Propositions retenues

Sous GNU/Linux, les solutions retenues sont :

  • Docker ;
  • Libvirt ;
  • Linux Kernel-based Virtual Machine (KVM) ;
  • Linux Containers (LXC) ;
  • Oracle VirtualBox.

Sur Windows, seul Oracle VirtualBox répondait aux contraintes, en particulier car le logiciel Boot2Docker s'intègre uniquement à cette solution.

Résultats obtenus

Globalement, les technologies de virtualisation de type hyperviseur n'ont plus guère d'avantages face aux conteneurs : ils permettent de garantir un niveau de sécurité et d'isolation quasi-identique, sans avoir la lourdeur de gestion d'autant de noyau que l'on veut lancer de machines.

Docker et LXC ont donc été retenus. La première version stable de Docker est sortie pendant mon stage, ce qui a été déterminant pour le choix de cette solution. LXC reste dans la course pour tout ce qui nécessite une configuration avancée que ne permettrait pas de faire Docker.

Conception d'un programme de relevé de métriques système

Objectifs

Afin de pouvoir déterminer le moment optimal pour démarrer un nouveau serveur, il faut relever un certain nombre de métrique et déterminer dans une première phase l'indicateur le plus adapté.

Cadre imposé

Avant mon arrivée dans l'entreprise, mon maître de stage a fait le choix de la base de données InfluxDB pour le stockage des métriques (aussi bien système que business).

Propositions retenues

La base de données retenue est toute récente ; c'est pourquoi il n'existait encore aucun programme pour faire simplement un relevé de métriques système (consommation CPU, mémoire vive disponible, bande passante, ...). Il a donc été choisi de le développer.

Le langage retenu fut le Go : le langage compilant les binaires statiquement, il n'y aurait donc rien de plus à installer sur les machines sur lesquels nous devrons faire les relevés.

Résultats obtenus

Le projet a été terminé et mis en ligne publiquement sur GitHub sous licence CC0.

Mise en place d'un processus de livraison du serveur à destination des développeurs du client

Objectifs

Notre jeu se basant sur un serveur, chaque personne utilisant le client (développeur ou graphiste) a donc besoin de se connecter à un serveur « stable » afin de pouvoir visualiser l'impact de ses modifications dans l'environnement de jeu.

Chaque développeur, pour ses tests peut avoir besoin d'une version particulière du serveur : une version avancée pour les développeurs travaillant sur l'intégration réseau, une version stable pour les graphistes, ... Et chacun peut avoir besoin de faire des tests dans un environnement particulier.

Ainsi, chacun devrait avoir accès à un serveur de jeu dédié et à un serveur de jeu global (lorsqu'il est question de faire des tests à plusieurs).

Cadre imposé

Le temps passé au développement est primordial comparé au temps passé à tenter de configurer l'environnement à partir de la documentation. Une solution clef en main où le moins de connaissances préalables sont nécessaire est un plus.

Propositions retenues

Pour la mise en place de ce processus, il a été retenu la mise à disposition :

  • de machines virtuelles pré-configurées : l'équipe serveur met à disposition du reste de l'équipe des fichiers .ova : un disque virtuel au format VMDK associé à une configuration de machine virtuelle au format OVF ;
  • de conteneurs associés à des scripts d'automatisation ;
  • d'un conteneur sur une machine dédiée : l'équipe serveur s'occupe de mettre en place les conteneurs en fonction des besoins de chacun, sans avoir à gérer les problèmes lié à la configuration personnelle des machines de chacun.

Difficultés

Chacune des solutions listée ci-dessus a été testée. La première solution a souffert d'un manque de consultation des besoins des développeurs : travailler dans une machine virtuelle en ligne de commande n'est en général pas à la portée des développeurs plus habitués à Visual Studio.

%FIXME parler de l'interface console

Dans un soucis d'harmonisation des technologies, Docker a été retenu dans un second temps pour répondre également aux problématiques de déploiement futurs.

Après une semaine de test sur les machines des développeurs, de nombreux problèmes m'ont été remontés. Ces problèmes étant liés d'une part à la difficulté de configuration automatique des machines sous Windows et d'autre part à la complexité grandissante des scripts automatisant pourtant seulement le téléchargement et l'exécution d'un conteneur dans un environnement connu, il a été décidé que ces machines virtuelles ne seraient plus distribuées aux développeurs : ils disposeront d'un accès sur une machine virtuelle maintenue par l'équipe en charge de l'administration système.

Résultats obtenus

Compte tenu de la diversité des systèmes employés et de la non-maîtrise de ceux-ci par les développeurs (filtrage de ports par un anti-virus nouvellement installé, version différentes de Windows, ...), la solution utilisant des conteneurs contrôlés par l'équipe serveur sur une machine dédiée a été retenue.

Conception de l'architecture de test de monté en charge

Objectifs

Une fois les premières versions du serveur livrées, nous nous sommes rapidement intéressé à ses capacités : en particulier le nombre maximum de joueurs pouvant être accueillit.

Propositions retenues

En tant que start-up, nous avons eu un certain nombre de crédit sur Amazon Web Service afin de tester et démarrer notre activité sur leur plate-forme.

Nous avons donc utilisé un certain nombre de nos crédits afin de lancer 20 machines virtuelles exécutant chacune plusieurs clients.

Résultats obtenus

Dans un premier temps, la monté en charge montrait que le serveur ne permettait pas de dépasser 250 joueurs. Au delà, l'analyse qui s'en est suivie a montré que le scheduler de la bibliothèque d'acteurs que nous utilisions ne faisais pas correctement son travail : il en résultait une surcharge des canaux de diffusion, entraînant le plantage du serveur.

Ce problème a été corrigé dans la version suivante de la bibliothèque d'acteurs. La nouvelle monté en charge a permis d'atteindre cette fois plus de 700 joueurs simultanément, à ce moment, c'était bien le CPU qui était limitant et il n'en résultat pas de plantage du serveur.

Conception de l'architecture des serveurs

Objectifs

Alternatives possibles

Cadre imposé

Propositions retenues

Difficultés

Résultats obtenus

Intégration de métriques dans le serveur

Objectifs

Les métriques relevées précédemment concernait le système : consommation CPU, utilisation de la mémoire et de la bande passante, ... Pour des besoins statistiques (et à terme business), il est nécessaire d'intégrer au serveur l'envoi de métrique telles que le nombre de joueurs inscrits, connectés, ...

Difficultés

Le serveur étant écrit en C++, il est nécessaire d'utiliser une bibliothèque C ou C++ pour s'interfacer avec la base de données. Malheureusement, comme elle est récente, cette bibliothèque n'avait pas encore été développée.

J'ai donc pris le soin de la développer puis de la proposer aux développeurs de la base de données qui l'ont intégré, La bibliothèque est désormais disponible sur GitHub : https://github.com/influxdb/influxdb-c

Résultats obtenus

Le travail d'intégration de métriques a d'abord conduit à la réalisation