Comment nous avons engendré 96 vérificateurs élus

(Indika) (5 sept. 2019)

La dernière fois que jai publié un article, cétait il y a cinq ans, et il était intitulé: Cuisiner un serveur Web avec Chef . Cinq ans, cest long pour ne pas écrire. Ce n’est pas que j’avais perdu tout intérêt pour le sujet; au lieu de cela, japprenais tranquillement des meilleurs.

Le sujet de discussion, cependant, na pas changé, sauf quil est maintenant dun ordre de grandeur plus grand. À lépoque, je cuisinais un seul serveur Web, et maintenant je génère 96 vérificateurs élus (EV).

Pourquoi 96?

Chez Unification, nous modifions lalgorithme de consensus sous-jacent de Ethereum. Notre mise en œuvre de la gouvernance distribuée des enjeux implique quatre groupes de 24 véhicules électriques, alternant dans et hors de la validation de bloc. La gouvernance de ces rotations est facilitée par un processus de vote et de jalonnement. Le résultat final est un réseau de consortiums plus distribué.

La théorie de ce sujet sur des livres blancs et dans des simulations ne peut nous mener que très loin. La meilleure façon daller de lavant est de le produire, de jouer avec et de faire face à déventuelles lacunes.

Livraison continue

Nous voulons être en mesure dévaluer nos idées rapidement . Le développement piloté par les tests ne doit pas se limiter à lécriture de tests unitaires.

Pour un Git SHA donné, nous voulons faire tourner nimporte quelle version de notre Mainchain en exécutant une seule commande, en évaluer létat, puis en faire raffinements de son ADN.

Nous voulons continuer à affiner ce processus, jusquà ce que nous pensons avoir quelque chose de prêt pour la production. Le processus de développement logiciel nest rien de plus que cette simple itération:

Plus un système devient complexe, plus chacune de ces parties devient difficile. Linstanciation de 96 EV est un problème non trivial, et cest lobjet de cet article.

Définition

Nous commençons par définir ce que nous voulons déployer. Un cluster instancié se compose principalement dEV, certains dentre eux ayant le RPC activé et dautres non. Le cluster peut également inclure un robinet UND, un explorateur de blocs et peut-être même un nœud de surveillance.

Ces clusters sont spécifiés par des fichiers JSON, et le but de la pile dapprovisionnement peut les rendre ainsi.

Chaque nœud du cluster a besoin dun handle unique, et le schéma dadressage suivant est choisi:

x = "{cluster\_name}-{configuration}-{instance\_type}-{index}"

Par exemple:

alpha-basic-ev-1

Dans le ci-dessus, le mot «de base» fait référence à une configuration, dans laquelle il y a quatre EV et un explorateur de blocs. Le mot «alpha» est le nom de lexpérience.

The Stack

Nous aurions pu utiliser Kubernetes.

Cependant, nous souhaitons également investir dans créer des outils que notre communauté peut utiliser pour lancer ses propres véhicules électriques. Nous avons choisi Ansible en raison de sa simplicité, et les playbooks qui ciblent CentOS fonctionneront sur nimporte quelle architecture, ou peuvent être facilement adaptés.

De plus, même si jai évalué à la fois Chef et Puppet dans le passé, je Je les ai abandonnés tous les deux pour la simplicité dAnsible. Chef et Puppet ont besoin de composants logiciels sur la machine cible, cependant, Ansible na besoin que dune connexion SSH.

Il ny a pas de physique quantique ici par rapport à la pile; juste des étapes nécessaires vers le succès. Notre pile est composée de:

  • Utilisateurs AWS et API AWS
  • Modèle de lancement AWS
  • Balises AWS
  • Démarrage minimaliste bash script
  • Curling un script bash depuis Github
  • Configurer les variables hôte Ansible à partir des balises
  • Provisionner lhôte à laide dAnsible

API AWS et utilisateurs AWS

AWS offre un contrôle extrêmement granulaire sur ses services via son API et ses utilisateurs autorisés. LAPI est facilement accessible via la bibliothèque Python boto3. Un précurseur de lutilisation de lAPI est la création de lutilisateur concerné via linterface IAM. Un utilisateur est un ID daccès dutilisateur typique et une paire secrète.

Un utilisateur peut être associé à une ou plusieurs politiques. Une stratégie consiste en un ensemble dactions autorisées ou refusées sur un ensemble de ressources.

Notre utilisateur spawn a une stratégie associée avec des actions minimalistes pour créer une instance EC2 et des actions pour lire lensemble de ressources.

Modèles de lancement

Lune des fonctionnalités clés quAWS nous offre est les modèles de lancement.

Avec un modèle de lancement, on peut spécifier une AMI de base (lidentifiant de limage de la machine virtuelle à partir de laquelle créer une instance) et préconfigurer paramètres, y compris deux composants essentiels: les balises et un script dexécution. De plus, on peut spécifier le groupe de sécurité auquel la machine doit appartenir.

Les modèles de lancement peuvent être versionnés et les instances peuvent être lancées à partir de lutilisateur AWS.

Tags

Chaque instance EC2 est unique en fonction des balises avec lesquelles elle est configurée. Les informations suivantes sont envoyées au nœud:

  • Nom (identifiant unique du nœud)
  • Classe (le type dinstance)
  • Index ( la position de linstance)
  • Configuration (la variété du cluster à instancier)
  • SHA (un Git SHA)
  • RegistrationIP (ladresse IP du Tour denregistrement)

Chacune de ces balises est définie dans les variables de lhôte Ansible.

Bootstrapping avec Bash

Le script damorçage Bash prépare lhôte pour lapprovisionnement. Certaines des tâches effectuées consistent à installer un environnement Python de base, à analyser les balises AWS, à les écrire dans le fichier vars de lhôte Ansible et à sélectionner le livre de lecture Ansible approprié pour le type de nœud.

Ansible

Enfin, le nœud est provisionné avec Ansible. Je ne méloignerai pas dAnsible car il y a suffisamment dautres ressources sur Internet. Il ny a rien de spécial ici, sauf que lon configure généralement un serveur distant avec Ansible, mais dans notre cas, nous configurons le serveur local.

Tour denregistrement

Nous utilisons une tour denregistrement au lieu dun Bootnode pour amorcer le réseau. Les EV enregistrent leurs adresses IP lors de linstanciation avec le nœud denregistrement, et une liste de nœuds statiques est obtenue avant lactivation du service.

Lavantage dutiliser une telle tour est que nous pouvons commencer à enregistrer des données arbitraires, comme des statistiques de santé, aidant à fermer la boucle dévaluation.

Lorsquun EV est instancié, il écrit dans lAPI denregistrement, son nom de cluster, son adresse IP, son index et son type dinstance.

Évaluation

Lobjectif principal de lévaluation est de déterminer comment lexpérience a été réussie. Les conditions de succès seront abordées dans un autre article. Cependant, une métrique immédiate à surveiller de près est le coût.

Le prix dune instance t2-micro est de 0,012 / h. Le coût de fonctionnement de 96 dentre eux pendant une heure ne devrait être que dun dollar. Cela peut être confirmé dans lexplorateur de coûts.

Plus loin

Cette pile fonctionne à merveille. Une seule commande affiche de manière cohérente et parfaite une Mainchain entièrement connectée et se propageant par bloc. Ce que jaime le plus dans cette pile, cest que cest le feu et loubli; Je peux instancier le cluster, me déconnecter dInternet et jongler. Il y aura une Mainchain prête pour moi à mon retour.

Cela sert de base solide pour notre prochaine étape. Nous pouvons commencer à évaluer différentes configurations de notre ADN consensus. Nous allons faire mûrir notre algorithme de consensus simple actuel et lévaluer par rapport à la réalité brutale, dans notre prochain article intitulé «Gouvernance des enjeux distribués».

Le code source de la pile de provisionnement EV se trouve ici: https://github.com/unification-com/ev-provision

Rejoignez-nous sur Unification Gitter: https://gitter.im/unification-com

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *