Top Fakapov Cyan



Bon Ă  tous! 

Je m'appelle Nikita, je suis chef d'équipe d'ingénieurs cyan. L'une de mes responsabilités au sein de l'entreprise est de réduire à zéro le nombre d'incidents liés à l'infrastructure de la prod.
Ce qui sera discutĂ© plus tard nous a apportĂ© beaucoup de souffrance, et le but de cet article est d'empĂȘcher d'autres personnes de rĂ©pĂ©ter nos erreurs ou au moins de minimiser leur impact. 

Préambule


Il Ă©tait une fois, lorsque Cyan consistait en monolithes, et qu'il n'y avait pas encore d'indices de microservices, nous avons mesurĂ© la disponibilitĂ© de la ressource en vĂ©rifiant 3-5 pages. 

RĂ©ponse - tout va bien, ne rĂ©pondez pas longtemps - alerte. Combien de temps ils ne devraient pas travailler pour que cela soit considĂ©rĂ© comme un incident, ont dĂ©cidĂ© les gens lors des rĂ©unions. Une Ă©quipe d'ingĂ©nieurs a toujours Ă©tĂ© impliquĂ©e dans l'enquĂȘte sur l'incident. Une fois l'enquĂȘte terminĂ©e, ils ont Ă©crit un post-mortem - une sorte de rapport au bureau de poste dans le format: ce qui Ă©tait, combien de temps, ce qu'ils ont fait sur le moment, ce que nous ferons Ă  l'avenir. 

Les pages principales du site, ou si nous comprenons bien, ont cassé le fond

 
Afin de comprendre d'une maniĂšre ou d'une autre la prioritĂ© de l'erreur, nous avons mis en Ă©vidence les pages les plus critiques du site pour la fonctionnalitĂ© commerciale. Selon eux, nous considĂ©rons le nombre de demandes rĂ©ussies / infructueuses et de dĂ©lais d'attente. Nous mesurons donc la disponibilitĂ©. 

Supposons que nous découvrions qu'il existe un certain nombre de sections super importantes du site qui sont responsables du service principal - recherche et soumission d'annonces. Si le nombre de demandes qui ont échoué est supérieur à 1%, il s'agit d'un incident critique. Si, dans les 15 minutes en prime time, le pourcentage d'erreurs dépasse 0,1%, cela est également considéré comme un incident critique. Ces critÚres couvrent la plupart des incidents, les autres dépassent le cadre de cet article.



Les meilleurs incidents cyan


Donc, nous avons prĂ©cisĂ©ment appris Ă  dĂ©terminer le fait que l'incident s'est produit. 

Maintenant, chaque incident dans notre pays est dĂ©crit en dĂ©tail et reflĂ©tĂ© dans l'Ă©popĂ©e de Jira. Soit dit en passant: pour cela, nous avons lancĂ© un projet distinct, appelĂ© FAIL - seules des Ă©popĂ©es peuvent y ĂȘtre crĂ©Ă©es. 

Si vous collectez tous les Ă©checs au cours des derniĂšres annĂ©es, les dirigeants sont: 

  • incidents liĂ©s au mssql;
  • incidents causĂ©s par des facteurs externes;
  • erreurs d'administration.

ArrĂȘtons-nous plus en dĂ©tail sur les erreurs des administrateurs, ainsi que sur quelques autres Ă©checs intĂ©ressants.

CinquiÚme place - «Mettre de l'ordre dans le DNS»


C'Ă©tait un mardi pluvieux. Nous avons dĂ©cidĂ© de nettoyer le cluster DNS. 

Je voulais transfĂ©rer les serveurs DNS internes de bind vers powerdns, en mettant en Ă©vidence des serveurs complĂštement sĂ©parĂ©s, oĂč il n'y a rien Ă  part DNS. 

Nous avons placĂ© un serveur DNS Ă  chaque emplacement de nos contrĂŽleurs de domaine et le moment est venu de dĂ©placer les zones de bind vers powerdns et de basculer l'infrastructure vers de nouveaux serveurs. 

Au plus fort du déménagement, parmi tous les serveurs indiqués dans la liaison de mise en cache locale sur tous les serveurs, un seul se trouvait dans le centre de données de Saint-Pétersbourg. Ce DC a été initialement déclaré non critique pour nous, mais est soudainement devenu un point de défaillance unique.
Juste au cours d'une telle pĂ©riode de dĂ©localisation, le canal entre Moscou et Saint-PĂ©tersbourg est tombĂ©. Nous sommes restĂ©s sans DNS pendant cinq minutes et nous nous sommes levĂ©s lorsque l'hĂ©bergeur a rĂ©solu les problĂšmes. 

Conclusions:

Si auparavant nous avons négligé les facteurs externes lors de la préparation du travail, maintenant ils sont également inclus dans la liste de ce pour quoi nous nous préparons. Et maintenant, nous nous efforçons de garantir que tous les composants sont réservés n-2, et pour la durée du travail, nous pouvons abaisser ce niveau à n-1.

  • Lors de l'Ă©laboration d'un plan d'action, marquez les points oĂč le service peut tomber et rĂ©flĂ©chissez Ă  l'avance au scĂ©nario oĂč tout s'est «pire que nulle part».
  • Distribuez les serveurs DNS internes par diffĂ©rentes gĂ©olocalisations / centres de donnĂ©es / racks / commutateurs / entrĂ©es.
  • Sur chaque serveur, placez un serveur DNS de mise en cache local, qui redirige les demandes vers les serveurs DNS principaux, et s'il n'est pas disponible, il rĂ©pondra Ă  partir du cache. 

QuatriÚme place - «Nettoyage de Nginx»


Un beau jour, notre Ă©quipe a dĂ©cidĂ© que «assez pour le supporter», et le processus de refactoring des configurations nginx a commencĂ©. L'objectif principal est d'apporter des configs Ă  une structure intuitive. Auparavant, tout Ă©tait «historiquement Ă©tabli» et il n'y avait pas de logique en soi. Maintenant, chaque nom_serveur a Ă©tĂ© extrait du fichier du mĂȘme nom et distribuĂ© toutes les configurations dans des dossiers. À propos, la configuration contient 253949 lignes ou 7836520 caractĂšres et occupe prĂšs de 7 mĂ©gaoctets. Structure de haut niveau: 

Structure Nginx
├── access
│   ├── allow.list
...
│   └── whitelist.conf
├── geobase
│   ├── exclude.conf
...
│   └── geo_ip_to_region_id.conf
├── geodb
│   ├── GeoIP.dat
│   ├── GeoIP2-Country.mmdb
│   └── GeoLiteCity.dat
├── inc
│   ├── error.inc
...
│   └── proxy.inc
├── lists.d
│   ├── bot.conf
...
│   ├── dynamic
│   └── geo.conf
├── lua
│   ├── cookie.lua
│   ├── log
│   │   └── log.lua
│   ├── logics
│   │   ├── include.lua
│   │   ├── ...
│   │   └── utils.lua
│   └── prom
│       ├── stats.lua
│       └── stats_prometheus.lua
├── map.d
│   ├── access.conf
│   ├── .. 
│   └── zones.conf
├── nginx.conf
├── robots.txt
├── server.d
│   ├── cian.ru
│   │   ├── cian.ru.conf
│   │   ├── ...
│   │   └── my.cian.ru.conf
├── service.d
│   ├── ...
│   └── status.conf
└── upstream.d
    â”œâ”€â”€ cian-mcs.conf
    â”œâ”€â”€ ...
    â””── wafserver.conf


C'est devenu beaucoup mieux, mais dans le processus de changement de nom et de distribution des configurations, certaines d'entre elles avaient la mauvaise extension et ne tombaient pas dans la directive include * .conf. En consĂ©quence, une partie des hĂŽtes est devenue indisponible et a renvoyĂ© 301 au principal. Étant donnĂ© que le code de rĂ©ponse n'Ă©tait pas 5xx / 4xx, cela n'a pas Ă©tĂ© remarquĂ© immĂ©diatement, mais seulement le matin. AprĂšs cela, nous avons commencĂ© Ă  Ă©crire des tests pour tester les composants d'infrastructure.

RĂ©sultats: 

  • Structurez correctement les configurations (pas seulement nginx) et rĂ©flĂ©chissez Ă  la structure Ă  un stade prĂ©coce du projet. Vous les rendrez ainsi plus comprĂ©hensibles pour l'Ă©quipe, ce qui rĂ©duira Ă  son tour le TTM.
  • Pour certains composants d'infrastructure, Ă©crivez des tests. Par exemple: vĂ©rifier que tous les noms de serveur clĂ©s renvoient l'Ă©tat correct, + corps de rĂ©ponse. Il suffira d'avoir Ă  portĂ©e de main quelques scripts qui vĂ©rifient les fonctions de base du composant pour que vous ne vous souveniez pas frĂ©nĂ©tiquement Ă  3 heures du matin de ce qui doit ĂȘtre vĂ©rifiĂ©. 

TroisiÚme place - «Place soudainement terminée à Cassandra»


Les donnĂ©es augmentaient rĂ©guliĂšrement et tout allait bien jusqu'au moment oĂč la rĂ©paration des gros cas a commencĂ© Ă  tomber dans le cluster Cassandra, car le compactage ne pouvait pas fonctionner sur eux. 

Un jour de pluie, la grappe s'est presque transformée en citrouille, à savoir:

  • les places sont restĂ©es environ 20% du cluster total;
  • il est impossible d'ajouter complĂštement des nƓuds, car le nettoyage ne fonctionne pas aprĂšs l'ajout d'un nƓud en raison du manque d'espace sur les partitions;
  • les performances diminuent lĂ©gĂšrement, car le compactage ne fonctionne pas; 
  • le cluster est en mode d'urgence.



Quitter - a ajoutĂ© 5 autres nƓuds sans nettoyage, aprĂšs quoi ils ont commencĂ© Ă  supprimer systĂ©matiquement du cluster et Ă  les ressaisir en tant que nƓuds vides sur lesquels la place s'est terminĂ©e. Le temps a passĂ© beaucoup plus que nous ne le souhaiterions. Il y avait un risque d'inaccessibilitĂ© partielle ou totale du cluster. 

RĂ©sultats:

  • Tous les serveurs cassandra ne devraient pas occuper plus de 60% de l'espace sur chaque partition. 
  • Ils ne doivent pas ĂȘtre chargĂ©s Ă  plus de 50% de CPU.
  • N'obstruez pas la planification des capacitĂ©s et rĂ©flĂ©chissez-y pour chaque composant, en fonction de ses spĂ©cificitĂ©s.
  • Plus il y a de nƓuds dans le cluster, mieux c'est. Les serveurs contenant une petite quantitĂ© de donnĂ©es sont migrĂ©s plus rapidement et un tel cluster est plus facile Ă  rĂ©animer. 

DeuxiÚme place - «Les données du stockage de valeur-clé du consul ont disparu»


Pour la dĂ©couverte de services, nous, comme beaucoup, utilisons le consul. Mais ici, sa valeur-clĂ© est Ă©galement utilisĂ©e pour les calculs de monolithes bleu-vert. Il stocke les informations en amont actives et inactives, qui changent de place pendant le dĂ©ploiement. Pour cela, un service de dĂ©ploiement a Ă©tĂ© Ă©crit qui interagit avec KV. À un moment donnĂ©, les donnĂ©es de KV ont disparu. RĂ©cupĂ©rĂ© de la mĂ©moire, mais avec un certain nombre d'erreurs. En consĂ©quence, lors du calcul, la charge sur l'amont a Ă©tĂ© inĂ©galement rĂ©partie et nous avons eu beaucoup d'erreurs 502 en raison de la surcharge des backends sur le CPU. En consĂ©quence, nous sommes passĂ©s du consul KV aux postgres, d'oĂč il n'est pas si facile de les retirer.  

RĂ©sultats:

  • - . , ES — , , , action.destructive_requires_name: true.
  • . , ( ,  python), .

— « » 


À un moment donnĂ©, nous avons remarquĂ© une rĂ©partition inĂ©gale de la charge sur le nginx en amont dans les cas oĂč il y avait 10+ serveurs dans le backend. Étant donnĂ© que le round-robin envoyait les demandes de 1 au dernier en amont dans l'ordre, et que chaque rechargement de nginx commençait depuis le dĂ©but, le premier en amont avait toujours plus de demandes que les autres. En consĂ©quence, ils travaillaient plus lentement et l'ensemble du site en souffrait. Cela est devenu plus visible Ă  mesure que la quantitĂ© de trafic augmentait. La simple mise Ă  jour de nginx pour activer random n'a pas fonctionnĂ© - vous devez refaire un tas de code lua qui n'a pas dĂ©collĂ© sur la version 1.15 (Ă  ce moment). J'ai dĂ» patcher notre nginx 1.14.2, en y introduisant un support alĂ©atoire. Cela a rĂ©solu le problĂšme. Ce bug remporte la nomination "non-Ă©vidence du capitaine".

Conclusions:

Il Ă©tait trĂšs intĂ©ressant et passionnant d'Ă©tudier ce bug). 

  • Configurez la surveillance de sorte qu'elle aide Ă  trouver rapidement de telles fluctuations. Par exemple, vous pouvez utiliser ELK pour surveiller les rps sur chaque backend de chaque amont, et surveiller leur temps de rĂ©ponse du point de vue de nginx. Dans ce cas, cela nous a aidĂ©s Ă  identifier le problĂšme. 

En consĂ©quence, la plupart des Ă©checs auraient pu ĂȘtre Ă©vitĂ©s avec une approche plus scrupuleuse de ce que vous faites. Vous devez toujours vous souvenir de la loi de Murphy:  tout ce qui peut mal tourner va mal, et construire des composants en fonction de cela. 

All Articles