{"id":92570,"date":"2020-08-28T19:42:21","date_gmt":"2020-08-28T17:42:21","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker"},"modified":"2020-08-28T19:42:21","modified_gmt":"2020-08-28T17:42:21","slug":"modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker","title":{"rendered":"Modelado de cl\u00fasteres tolerantes a fallos basados en PostgreSQL y Pacemaker","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h1 id=\"vvedenie\">Introducci\u00f3n<\/h1>\n<p><\/p>\n<p>Hace un tiempo, se me plante\u00f3 la tarea de desarrollar un cl\u00faster de alta disponibilidad para <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\">PostgreSQL<\/a><\/noindex>, que funcione en varios centros de datos interconectados por fibra \u00f3ptica dentro de una misma ciudad, y que sea capaz de soportar la falla (por ejemplo, un corte de energ\u00eda) de un centro de datos. Como software que garantiza la alta disponibilidad, eleg\u00ed <noindex><a rel=\"nofollow\" href=\"https:\/\/clusterlabs.org\">Pacemaker<\/a><\/noindex>, porque es la soluci\u00f3n oficial de RedHat para crear cl\u00fasteres de alta disponibilidad. Es ventajoso porque RedHat lo respalda, y porque esta soluci\u00f3n es universal (modular). Con su ayuda, se podr\u00e1 asegurar la alta disponibilidad no solo de PostgreSQL, sino tambi\u00e9n de otros servicios, ya sea utilizando m\u00f3dulos est\u00e1ndar o creando m\u00f3dulos para necesidades espec\u00edficas.<\/p>\n<p><\/p>\n<p>A esta soluci\u00f3n surgi\u00f3 la pregunta razonable: \u00bfqu\u00e9 tan tolerante a fallos ser\u00e1 el cl\u00faster de alta disponibilidad? Para investigar esto, desarroll\u00e9 un banco de pruebas que simula diversas fallas en los nodos del cl\u00faster, espera la recuperaci\u00f3n de la operatividad, recupera el nodo fallido y contin\u00faa las pruebas en un ciclo. Originalmente, este proyecto se llamaba hapgsql, pero con el tiempo, me aburr\u00ed del nombre, que solo conten\u00eda una vocal. Por lo tanto, comenc\u00e9 a llamar a las bases de datos de alta disponibilidad (y la IP flotante que las apunta) <strong>krogan<\/strong> (un personaje de un videojuego que tiene todos sus \u00f3rganos vitales duplicados), y los nodos, los cl\u00fasteres y el propio proyecto \u2014 <strong>tuchanka<\/strong> (el planeta donde viven los kroganes).<\/p>\n<p><\/p>\n<p>Ahora la direcci\u00f3n ha permitido <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/domclick\/tuchanka\">abrir el proyecto a la comunidad de c\u00f3digo abierto bajo la licencia MIT<\/a><\/noindex>. El README ser\u00e1 traducido al ingl\u00e9s en breve (porque se espera que los principales consumidores sean los desarrolladores de Pacemaker y PostgreSQL), y decid\u00ed presentar la antigua versi\u00f3n en ruso del README (parcialmente) en esta art\u00edculo.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelado de cl\u00fasteres tolerantes a fallos basados en PostgreSQL y Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/7ebb04b3e56337060e981da319192a28.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Los cl\u00fasteres se desplegar\u00e1n en m\u00e1quinas virtuales <noindex><a rel=\"nofollow\" href=\"https:\/\/www.virtualbox.org\">VirtualBox<\/a><\/noindex>. Se desplegar\u00e1n un total de 12 m\u00e1quinas virtuales (en total 36GiB), que formar\u00e1n 4 cl\u00fasteres de alta disponibilidad (diferentes variantes). Los primeros dos cl\u00fasteres constan de dos servidores PostgreSQL, que se encuentran en diferentes centros de datos, y un servidor general <em>witness<\/em> c <strong>quorum device<\/strong> (ubicado en una m\u00e1quina virtual barata en el tercer centro de datos), que resuelve la incertidumbre <strong>50%\/50%<\/strong>, otorgando su voto a una de las partes. El tercer cl\u00faster est\u00e1 en tres centros de datos: un maestro, dos esclavos, sin <strong>quorum device<\/strong>. El cuarto cl\u00faster consta de cuatro servidores PostgreSQL, dos por centro de datos: uno maestro y los otros r\u00e9plicas, y tambi\u00e9n utiliza <em>witness<\/em> c <strong>quorum device<\/strong>. El cuarto soporta la falla de dos servidores o de un centro de datos. Esta soluci\u00f3n puede ser escalada a un mayor n\u00famero de r\u00e9plicas si es necesario.<\/p>\n<p><\/p>\n<p>Servicio de tiempo preciso <noindex><a rel=\"nofollow\" href=\"https:\/\/www.ntp.org\">ntpd<\/a><\/noindex> tambi\u00e9n ha sido reconfigurado para la alta disponibilidad, pero utiliza el m\u00e9todo m\u00e1s <code>ntpd<\/code> (<em>orphan mode<\/em>). El servidor general <em>witness<\/em> act\u00faa como el servidor NTP central, distribuyendo su tiempo a todos los cl\u00fasteres, sincronizando as\u00ed todos los servidores entre s\u00ed. Si <em>witness<\/em> se desconecta o se encuentra aislado, entonces uno de los servidores del cl\u00faster comenzar\u00e1 a distribuir su propio tiempo (dentro del cl\u00faster). Un proxy de cach\u00e9 auxiliar <strong>HTTP proxy<\/strong> tambi\u00e9n se ha levantado en <em>witness<\/em>, mediante el cual las dem\u00e1s m\u00e1quinas virtuales tienen acceso a los repositorios de Yum. En la realidad, servicios como el tiempo preciso y el proxy, seguramente estar\u00e1n alojados en servidores dedicados, pero en esta configuraci\u00f3n est\u00e1n ubicados en <em>witness<\/em> solo para ahorrar en el n\u00famero de m\u00e1quinas virtuales y espacio.<\/p>\n<p><\/p>\n<h1 id=\"versii\">Versiones<\/h1>\n<p><\/p>\n<p>v0. Funciona con CentOS 7 y PostgreSQL 11 en VirtualBox 6.1.<\/p>\n<p><\/p>\n<h1 id=\"struktura-klasterov\">Estructura de los cl\u00fasteres<\/h1>\n<p><\/p>\n<p>Todos los cl\u00fasteres est\u00e1n destinados a ubicarse en m\u00faltiples centros de datos, unidos en una sola red plana y deben soportar la falla o aislamiento de red de un centro de datos. Por lo tanto, <strong>no es posible<\/strong> se utiliza para proteger contra <strong>split-brain<\/strong> la tecnolog\u00eda est\u00e1ndar de Pacemaker, que se llama <em>STONITH<\/em> (Shoot The Other Node In The Head) o <em>fencing<\/em>. Su esencia: si los nodos en el cl\u00faster comienzan a sospechar que algo est\u00e1 mal con alg\u00fan nodo, no responde o se comporta incorrectamente, lo desconectan forzosamente a trav\u00e9s de dispositivos \u201cexternos\u201d, como una tarjeta de control IPMI o un UPS. Pero esto solo funcionar\u00e1 en casos donde, tras la falla de un servidor, el IPMI o el UPS contin\u00faan funcionando. Aqu\u00ed se planea proteger contra una falla mucho m\u00e1s catastr\u00f3fica, cuando falla (por ejemplo, se corta la energ\u00eda) todo el centro de datos. Y en tal caso todos los <em>dispositivos stonith<\/em>(IPMI, UPS, etc.) tampoco funcionar\u00e1n.<\/p>\n<p><\/p>\n<p>En su lugar, el sistema se basa en la idea de quorum. Todos los nodos tienen voz, y solo pueden funcionar aquellos que pueden ver m\u00e1s de la mitad de todos los nodos. Esta cantidad \u201cmitad+1\u201d se llama <strong>qu\u00f3rum<\/strong>. Si no se alcanza quorum, el nodo decide que est\u00e1 en aislamiento de red y debe desconectar sus recursos, es decir, es una <strong>protecci\u00f3n contra split-brain<\/strong>Si el software que controla este comportamiento no funciona, debe activarse un watchdog, por ejemplo, basado en IPMI.<\/p>\n<p><\/p>\n<p>Si el n\u00famero de nodos es par (cl\u00faster en dos centros de datos), puede surgir lo que se llama una indeterminaci\u00f3n. <strong>50%\/50%<\/strong> (<em>cincuenta-cincuenta<\/em>), cuando la aislamiento de red divide el cl\u00faster exactamente por la mitad. Por lo tanto, para un n\u00famero par de nodos se a\u00f1ade <strong>quorum device<\/strong> \u2014 un demonio sin requerimientos, que puede ejecutarse en la virtualizaci\u00f3n m\u00e1s barata de un tercer centro de datos. Este emite su voto a uno de los segmentos (que puede ver), resolviendo as\u00ed la indeterminaci\u00f3n 50%\/50%. El servidor en el que se ejecutar\u00e1 el dispositivo de quorum lo llam\u00e9 <em>witness<\/em> (terminolog\u00eda de repmgr, me gust\u00f3).<\/p>\n<p><\/p>\n<p>Los recursos pueden moverse de un lugar a otro, por ejemplo, de servidores defectuosos a servidores operativos, o por orden de los administradores de sistemas. Para que los clientes sepan d\u00f3nde est\u00e1n los recursos que necesitan (\u00bfa d\u00f3nde deben conectarse?), se utilizan <em>IPs flotantes<\/em> (<strong>float IP<\/strong>). Estas son IPs que Pacemaker puede mover entre los nodos (todo est\u00e1 en una red plana). Cada una simboliza un recurso (servicio) y estar\u00e1 donde se necesita conectarse para acceder a este servicio (en nuestro caso, la base de datos).<\/p>\n<p><\/p>\n<h2 id=\"tuchanka1-shema-s-uplotneniem\">Tuchanka1 (esquema con compresi\u00f3n)<\/h2>\n<p><\/p>\n<h3 id=\"struktura\">Estructura<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelado de cl\u00fasteres tolerantes a fallos basados en PostgreSQL y Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/5651238e36f4af1c32f117191cf30261.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La idea era que tuvi\u00e9ramos muchas bases de datos peque\u00f1as con baja carga, para las cuales no es rentable mantener un servidor esclavo dedicado en modo hot standby para transacciones solo de lectura (no hay necesidad de tal despilfarro de recursos).<\/p>\n<p><\/p>\n<p>En cada centro de datos hay un servidor. Cada servidor tiene dos instancias de PostgreSQL (en la terminolog\u00eda de PostgreSQL se llaman cl\u00fasteres, pero para evitar confusiones los llamar\u00e9 instancias (por analog\u00eda con otras bases de datos), y reservar\u00e9 el t\u00e9rmino cl\u00faster para los cl\u00fasteres de Pacemaker). Una instancia opera en modo maestro, y solo ella presta servicios (solo en ella se dirige la IP flotante). La segunda instancia funciona como esclavo para el segundo centro de datos, y solo prestar\u00e1 servicios si su maestro falla. Dado que la mayor parte del tiempo solo una de las dos instancias (el maestro) prestar\u00e1 servicios (realizar\u00e1 consultas), todos los recursos del servidor se optimizan para el maestro (se asigna memoria para cach\u00e9 shared_buffers, etc.), pero asegurando que la segunda instancia tambi\u00e9n disponga de recursos (aunque sea para un funcionamiento no \u00f3ptimo a trav\u00e9s de la cach\u00e9 del sistema de archivos) en caso de que falle uno de los centros de datos. El esclavo no presta servicios (no ejecuta consultas de solo lectura) durante el funcionamiento normal del cl\u00faster, para evitar la competencia por recursos con el maestro en la misma m\u00e1quina.<\/p>\n<p><\/p>\n<p>En el caso de dos nodos, la tolerancia a fallos solo es posible con replicaci\u00f3n as\u00edncrona, ya que con replicaci\u00f3n s\u00edncrona la falla del esclavo provocar\u00e1 la detenci\u00f3n del maestro.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-witness\">Fallo witness<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelado de cl\u00fasteres tolerantes a fallos basados en PostgreSQL y Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/3c046d13c0c6839de297827ca3a8928b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Fallo witness (<em>quorum device<\/em>) lo considerar\u00e9 solo para el cl\u00faster Tuchanka1, con todos los dem\u00e1s suceder\u00e1 lo mismo. Con la falla del witness, la estructura del cl\u00faster no cambiar\u00e1, todo seguir\u00e1 funcionando como lo hac\u00eda. Pero el qu\u00f3rum ser\u00e1 igual a 2 de 3, y por lo tanto cualquier siguiente falla ser\u00e1 fatal para el cl\u00faster. Tendremos que arreglarlo de inmediato.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka1\">Fallo Tuchanka1<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelado de cl\u00fasteres tolerantes a fallos basados en PostgreSQL y Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/112957293bd682428115e4e93c9f1a96.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Fallo de uno de los centros de datos para Tuchanka1. En este caso <em>witness<\/em> da su voto al segundo nodo en el segundo centro de datos. All\u00ed, el anterior esclavo se convierte en maestro, resultando que en un servidor operan ambos maestros y ambos poseen sus IP flotantes.<\/p>\n<p><\/p>\n<h2 id=\"tuchanka2-klassicheskaya\">Tuchanka2 (cl\u00e1sica)<\/h2>\n<p><\/p>\n<h3 id=\"struktura-1\">Estructura<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelado de cl\u00fasteres tolerantes a fallos basados en PostgreSQL y Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/c3af368f823fbd580b4ebb14cc87c750.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Esquema cl\u00e1sico de dos nodos. Uno opera como maestro, el otro como esclavo. Ambos pueden realizar consultas (el esclavo solo en modo de solo lectura), por lo que ambos tienen IP flotantes: krogan2 \u2014 para el maestro, krogan2s1 \u2014 para el esclavo. La tolerancia a fallos existir\u00e1 tanto en el maestro como en el esclavo.<\/p>\n<p><\/p>\n<p>En el caso de dos nodos, la tolerancia a fallos solo es posible con replicaci\u00f3n as\u00edncrona, porque con replicaci\u00f3n s\u00edncrona la falla del esclavo provocar\u00e1 la detenci\u00f3n del maestro.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka2\">Fallo Tuchanka2<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelado de cl\u00fasteres tolerantes a fallos basados en PostgreSQL y Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/79bfcaf88c96d8ee16767dcef53741c1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Con la falla de uno de los centros de datos <em>witness<\/em> vota por el segundo. En el \u00fanico centro de datos funcionando se levantar\u00e1 el maestro, y ambos IP flotantes: el maestro y el esclavo apuntar\u00e1n a \u00e9l. Por supuesto, la instancia debe estar configurada de tal manera que tenga suficientes recursos (l\u00edmites de conexi\u00f3n, etc.) para aceptar simult\u00e1neamente todas las conexiones y solicitudes tanto del IP flotante maestro como del esclavo. As\u00ed que en condiciones normales, debe haber un margen suficiente en los l\u00edmites.<\/p>\n<p><\/p>\n<h2 id=\"tuchanka4-mnogo-rabov\">Tuchanka4 (muchos esclavos)<\/h2>\n<p><\/p>\n<h3 id=\"struktura-2\">Estructura<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelado de cl\u00fasteres tolerantes a fallos basados en PostgreSQL y Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/17819fd97847f0573d429e422d799bc1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ya es otro extremo. Hay bases de datos a las que llegan muchas solicitudes de solo lectura (un caso t\u00edpico de un sitio web altamente demandado). Tuchanka4 es una situaci\u00f3n en la que puede haber tres o m\u00e1s esclavos para manejar tales solicitudes, pero a\u00fan no demasiados. Con un n\u00famero muy elevado de esclavos, se necesitar\u00e1 inventar un sistema de replicaci\u00f3n jer\u00e1rquico. En el caso m\u00ednimo (en la imagen), hay dos servidores en cada uno de los dos centros de datos, cada uno con una instancia de PostgreSQL.<\/p>\n<p><\/p>\n<p>Otra caracter\u00edstica de este esquema es que aqu\u00ed ya se puede organizar una replicaci\u00f3n s\u00edncrona. Est\u00e1 configurada para replicar, siempre que sea posible, en otro centro de datos, y no en la r\u00e9plica en el mismo centro de datos donde est\u00e1 el maestro. Tanto el maestro como cada esclavo apuntan a un IP flotante. Idealmente, se deber\u00eda hacer balanceo de solicitudes entre los esclavos con alg\u00fan tipo de <em>proxy sql<\/em>, por ejemplo, del lado del cliente. Diferentes tipos de clientes pueden requerir diferentes tipos <em>proxy sql<\/em>, y solo los desarrolladores de los clientes saben qui\u00e9n necesita qu\u00e9. Esta funcionalidad puede ser implementada tanto por un demonio externo, como por una biblioteca del cliente (pool de conexiones), etc. Todo esto est\u00e1 m\u00e1s all\u00e1 del tema de un cl\u00faster de base de datos tolerante a fallos (la tolerancia a fallos <em>proxy SQL<\/em> se podr\u00e1 implementar de manera independiente, junto con la tolerancia a fallos del cliente).<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka4\">Fallo de Tuchanka4<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelado de cl\u00fasteres tolerantes a fallos basados en PostgreSQL y Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/e005ae90ffd63abdb272012b94735618.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>En caso de fallo de un centro de datos (es decir, de los dos servidores), el testigo vota por el segundo. Como resultado, en el segundo centro de datos funcionan dos servidores: en uno est\u00e1 el maestro, y apunta al IP flotante maestro (para recibir solicitudes de lectura y escritura); y en el segundo servidor funciona un esclavo con replicaci\u00f3n s\u00edncrona, y a \u00e9l apunta uno de los IP flotantes esclavos (para solicitudes de solo lectura).<\/p>\n<p><\/p>\n<p>Lo primero que hay que se\u00f1alar es que no todos los IP flotantes esclavos ser\u00e1n operativos, sino solo uno. Y para su correcto funcionamiento ser\u00e1 necesario que <em>proxy sql<\/em> redirige todas las solicitudes al \u00fanico IP flotante restante; y si no, <em>proxy sql<\/em> se pueden enumerar todos los IP flotantes de esclavos separados por comas en la URL para la conexi\u00f3n. En tal caso, <em>libpq<\/em> la conexi\u00f3n ser\u00e1 al primer IP funcional, as\u00ed est\u00e1 hecho en el sistema de pruebas autom\u00e1ticas. Es posible que en otras bibliotecas, como JDBC, no funcione de esta manera y sea necesario <em>proxy sql<\/em>. Esto se debe a que los IP flotantes de los esclavos tienen prohibido levantarse simult\u00e1neamente en un mismo servidor, para que se distribuyan equitativamente entre los servidores esclavos si hay varios funcionando.<\/p>\n<p><\/p>\n<p>Segundo: incluso en caso de falla del centro de datos, se mantendr\u00e1 la replicaci\u00f3n sincr\u00f3nica. E incluso si ocurre una falla secundaria, es decir, si uno de los dos servidores en el centro de datos restante falla, el cl\u00faster, aunque dejar\u00e1 de ofrecer servicios, a\u00fan conservar\u00e1 la informaci\u00f3n de todas las transacciones confirmadas, para las que ha dado confirmaci\u00f3n de commit (no habr\u00e1 p\u00e9rdida de informaci\u00f3n en caso de falla secundaria).<\/p>\n<p><\/p>\n<h2 id=\"tuchanka3-3-data-centra\">Tuchanka3 (3 centros de datos)<\/h2>\n<p><\/p>\n<h3 id=\"struktura-3\">Estructura<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelado de cl\u00fasteres tolerantes a fallos basados en PostgreSQL y Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/e11f9884b92fe20a63b5080ae8c7f82b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Este es un cl\u00faster para situaciones en las que hay tres centros de datos completamente operativos, en cada uno de los cuales hay un servidor de base de datos completamente funcional. En este caso, <em>quorum device<\/em> no es necesario. En un centro de datos opera el maestro, en los otros dos \u2014 esclavos. La replicaci\u00f3n es sincr\u00f3nica, del tipo ANY (slave1, slave2), es decir, el cliente recibir\u00e1 la confirmaci\u00f3n de commit cuando cualquiera de los esclavos responda primero que ha aceptado el commit. Un solo IP flotante se\u00f1ala para el maestro y dos para los esclavos. A diferencia de Tuchanka4, los tres IP flotantes son tolerantes a fallos. Para equilibrar las consultas SQL de solo lectura se puede usar <em>proxy sql<\/em> (con tolerancia a fallos separada), o asignar un IP flotante de esclavo a la mitad de los clientes, y el segundo a la otra mitad.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka3\">Fallo de Tuchanka3<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelado de cl\u00fasteres tolerantes a fallos basados en PostgreSQL y Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/1e61158be3c23742384d3621e8f7896b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>En caso de fallo de uno de los centros de datos, quedan dos. En uno est\u00e1 levantado el maestro y el IP flotante del maestro, en el segundo \u2014 un esclavo y ambos IP flotantes de esclavos (el instancia debe tener un doble suministro de recursos para aceptar todas las conexiones de ambos IP flotantes de esclavos). Entre el maestro y el esclavo hay replicaci\u00f3n sincr\u00f3nica. Adem\u00e1s, el cl\u00faster conservar\u00e1 la informaci\u00f3n sobre las transacciones confirmadas y verificadas (no habr\u00e1 p\u00e9rdida de informaci\u00f3n) en caso de destrucci\u00f3n de dos centros de datos (si no son destruidos al mismo tiempo).<\/p>\n<p><\/p>\n<p><em>He decidido no incluir una descripci\u00f3n detallada de la estructura de archivos y la implementaci\u00f3n. Quien quiera experimentar, puede leer todo eso en el README. Solo presento una descripci\u00f3n de las pruebas autom\u00e1ticas.<\/em><\/p>\n<p><\/p>\n<h1 id=\"sistema-avtomaticheskogo-testirovaniya\">Sistema de pruebas autom\u00e1ticas<\/h1>\n<p><\/p>\n<p>Se ha creado un sistema de pruebas autom\u00e1ticas para verificar la resistencia del cl\u00faster simulando diversas fallas. Se ejecuta mediante un script <code>test\/failure<\/code>. El script puede aceptar como par\u00e1metros los n\u00fameros de los cl\u00fasteres que se desean probar. Por ejemplo, este comando:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">test\/failure 2 3<\/code><\/pre>\n<p><\/p>\n<p>probar\u00e1 solamente el segundo y el tercer cl\u00faster. Si no se especifican par\u00e1metros, se probar\u00e1n todos los cl\u00fasteres. Todos los cl\u00fasteres se prueban en paralelo, y el resultado se muestra en la consola de tmux. Tmux utiliza un servidor tmux dedicado, por lo que el script puede ejecutarse desde el tmux predeterminado, resultando en un tmux anidado. Recomiendo usar una terminal en una ventana grande y con una fuente peque\u00f1a. Antes de comenzar las pruebas, todas las m\u00e1quinas virtuales se restauran a un snapshot que coincide con el momento en que finaliz\u00f3 el script. <code>configuraci\u00f3n<\/code>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelado de cl\u00fasteres tolerantes a fallos basados en PostgreSQL y Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/b546bab1ebbbe365991e1ff3d1667237.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La terminal se divide en columnas seg\u00fan el n\u00famero de cl\u00fasteres en prueba, que por defecto (en la captura de pantalla) son cuatro. Describir\u00e9 el contenido de las columnas usando Tuchanka2 como ejemplo. Los paneles de la captura de pantalla est\u00e1n numerados:<\/p>\n<p><\/p>\n<ol>\n<li>Aqu\u00ed se muestra la estad\u00edstica de las pruebas. Columnas:\n<ul>\n<li><strong>failure<\/strong> \u2014 el nombre de la prueba (funciones en el script) que simula la falla.<\/li>\n<li><strong>reaction<\/strong> \u2014 el tiempo promedio en segundos que el cl\u00faster tard\u00f3 en recuperar su operatividad. Se mide desde el inicio del script que simula la falla hasta el momento en que el cl\u00faster recupera su capacidad operativa y puede seguir prestando servicios. Si el tiempo es muy corto, por ejemplo, seis segundos (esto ocurre en cl\u00fasteres con m\u00faltiples esclavos (Tuchanka3 y Tuchanka4)), esto indica que la falla ocurri\u00f3 en un esclavo asincr\u00f3nico y no afect\u00f3 la operatividad, no hubo cambios en el estado del cl\u00faster.<\/li>\n<li><strong>deviation<\/strong> \u2014 muestra la dispersi\u00f3n (precisi\u00f3n) del valor <strong>reaction<\/strong> a trav\u00e9s del m\u00e9todo de \u00abdesviaci\u00f3n est\u00e1ndar\u00bb.<\/li>\n<li><strong>count<\/strong> \u2014 cu\u00e1ntas veces se ha realizado esta prueba.<\/li>\n<\/ul>\n<\/li>\n<li>El registro resumido permite evaluar qu\u00e9 est\u00e1 haciendo el cl\u00faster en ese momento. Se muestra el n\u00famero de iteraci\u00f3n (prueba), un timestamp y el nombre de la operaci\u00f3n. Una ejecuci\u00f3n demasiado larga (&gt; 5 minutos) indica alg\u00fan problema.<\/li>\n<li><strong>heart<\/strong> (coraz\u00f3n) \u2014 tiempo actual. Para la evaluaci\u00f3n visual del funcionamiento <em>maestro<\/em> en su tabla se escribe constantemente el tiempo actual usando el IP flotante del maestro. En caso de \u00e9xito, el resultado se muestra en este panel.<\/li>\n<li><strong>latido<\/strong> (pulso) \u2014 \"tiempo actual\", que hab\u00eda sido grabado anteriormente por el script <strong>heart<\/strong> en el maestro, ahora se lee desde <em>esclavo<\/em> a trav\u00e9s de su IP flotante. Permite evaluar visualmente el funcionamiento del esclavo y la replicaci\u00f3n. En Tuchanka1 no hay esclavos con IP flotante (no hay esclavos que brinden servicios), pero hay dos instancias (BD), por lo que aqu\u00ed no se mostrar\u00e1 el <strong>latido<\/strong>, y <strong>heart<\/strong> segunda instancia.<\/li>\n<li>Supervisi\u00f3n del estado del cl\u00faster utilizando la herramienta <code>pcs mon<\/code>. Muestra la estructura, la distribuci\u00f3n de recursos entre los nodos y otra informaci\u00f3n \u00fatil.<\/li>\n<li>Aqu\u00ed se muestra la monitorizaci\u00f3n del sistema de cada m\u00e1quina virtual del cl\u00faster. Puede haber m\u00e1s de estos paneles \u2014 tantas como m\u00e1quinas virtuales haya en el cl\u00faster. Dos gr\u00e1ficos <em>Carga de CPU<\/em> (en las m\u00e1quinas virtuales hay dos procesadores), nombre de la m\u00e1quina virtual, <em>Carga del sistema<\/em> (denominado como Promedio de Carga, porque est\u00e1 promediado durante 5, 10 y 15 minutos), datos sobre los procesos y distribuci\u00f3n de memoria.<\/li>\n<li>Rastreo del script que realiza las pruebas. En caso de mal funcionamiento \u2014 interrupci\u00f3n repentina del trabajo o ciclo de espera infinito \u2014 aqu\u00ed se podr\u00e1 ver la causa de ese comportamiento.<\/li>\n<\/ol>\n<p><\/p>\n<p>Las pruebas se realizan en dos etapas. Primero, el script recorre todas las variedades de pruebas, eligiendo aleatoriamente la m\u00e1quina virtual a la que se aplicar\u00e1 esta prueba. Luego se ejecuta un ciclo infinito de pruebas, eligiendo aleatoriamente m\u00e1quinas virtuales y fallos cada vez. La finalizaci\u00f3n repentina del script de prueba (panel inferior) o un ciclo de espera infinito de algo (&gt; 5 minutos de tiempo de ejecuci\u00f3n de una operaci\u00f3n, esto se ve en el rastreo) indica que alguna de las pruebas en este cl\u00faster ha fallado.<\/p>\n<p><\/p>\n<p>Cada prueba consiste en las siguientes operaciones:<\/p>\n<p><\/p>\n<ol>\n<li>Inicio de una funci\u00f3n que emula un fallo.<\/li>\n<li><strong>\u00bfListo?<\/strong> \u2014 espera la restauraci\u00f3n del funcionamiento del cl\u00faster (cuando se restablecen todos los servicios).<\/li>\n<li>Se muestra el tiempo de espera para la restauraci\u00f3n del cl\u00faster (<em>reaction<\/em>).<\/li>\n<li><strong>Reparar<\/strong> \u2014 el cl\u00faster \"se repara\". Despu\u00e9s, debe volver a un estado completamente operativo y listo para el siguiente fallo.<\/li>\n<\/ol>\n<p><\/p>\n<p>Aqu\u00ed est\u00e1 la lista de pruebas con una descripci\u00f3n de lo que hacen:<\/p>\n<p><\/p>\n<ul>\n<li><strong>ForkBomb<\/strong>: crea un &quot;Error de memoria&quot; usando una bomba de fork.<\/li>\n<li><strong>Sin espacio<\/strong>: llena el disco duro. Sin embargo, la prueba es m\u00e1s bien simb\u00f3lica, dado que la carga que se genera durante la prueba es insignificante, y normalmente no ocurre una falla de PostgreSQL al llenar el disco duro.<\/li>\n<li><strong>Postgres-KILL<\/strong>: termina PostgreSQL con el comando <code>killall -KILL postgres<\/code>.<\/li>\n<li><strong>Postgres-STOP<\/strong>: suspende PostgreSQL con el comando <code>killall -STOP postgres<\/code>.<\/li>\n<li><strong>PowerOff<\/strong>: \u00abapaga\u00bb la m\u00e1quina virtual con el comando <code>VBoxManage controlvm &quot;m\u00e1quina virtual&quot; poweroff<\/code>.<\/li>\n<li><strong>Reset<\/strong>: reinicia la m\u00e1quina virtual con el comando <code>VBoxManage controlvm &quot;m\u00e1quina virtual&quot; reset<\/code>.<\/li>\n<li><strong>SBD-STOP<\/strong>: suspende el demonio SBD con el comando <code>killall -STOP sbd<\/code>.<\/li>\n<li><strong>ShutDown<\/strong>: env\u00eda a la m\u00e1quina virtual el comando a trav\u00e9s de SSH <code>systemctl poweroff<\/code>, el sistema se apaga correctamente.<\/li>\n<li><strong>UnLink<\/strong>: aislamiento de red, comando <code>VBoxManage controlvm &quot;m\u00e1quina virtual&quot; setlinkstate1 off<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<p>Finalizando la prueba ya sea con el comando est\u00e1ndar tmux &quot;kill-window&quot; <strong>Ctrl-b &amp;<\/strong>, o con el comando &quot;detach-client&quot; <strong>Ctrl-b d<\/strong>: en este caso, la prueba se completa, tmux se cierra, las m\u00e1quinas virtuales se apagan.<\/p>\n<p><\/p>\n<h1 id=\"vyyavlennye-pri-testirovanii-problemy\">Problemas detectados durante la prueba<\/h1>\n<p><\/p>\n<ul>\n<li>\n<p>En este momento <em>demonio watchdog sbd<\/em> maneja la detenci\u00f3n de los demonios supervisados, pero no su congelaci\u00f3n. Y, como consecuencia, las fallas que llevan a el bloqueo solo son manejadas incorrectamente <em>Corosync<\/em> y <em>Pacemaker<\/em>, pero que no cuelgan <em>sbd<\/em>. Para verificar <em>Corosync<\/em> ya hay <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ClusterLabs\/sbd\/pull\/83\"><strong>PR#83<\/strong> (en GitHub en <em>sbd<\/em>)<\/a><\/noindex>, aceptado en la rama <em>master<\/em>. Prometieron (en PR#83) que habr\u00eda algo similar para Pacemaker, espero que para <em>RedHat 8<\/em> lo hagan. Pero tales \u00abfallos\u00bb son te\u00f3ricos, se pueden simular f\u00e1cilmente artificialmente mediante, por ejemplo, <code>killall -STOP corosync<\/code>, pero nunca ocurren en la vida real.<\/p>\n<p>\n<\/li>\n<li>\n<p>En <em>Pacemaker<\/em> en la versi\u00f3n para <em>CentOS 7<\/em> se configur\u00f3 incorrectamente <em>sync_timeout<\/em> sa-logic-subsets-canary-vs.yaml <em>quorum device<\/em>, como resultado <noindex><a rel=\"nofollow\" href=\"https:\/\/lists.clusterlabs.org\/pipermail\/users\/2019-August\/026145.html\">si un nodo falla, con alguna probabilidad, se reinicia tambi\u00e9n el segundo nodo<\/a><\/noindex>, al cual deber\u00eda haber migrado el maestro. Se resolvi\u00f3 aumentando <em>sync_timeout<\/em> sa-logic-subsets-canary-vs.yaml <em>quorum device<\/em> durante el despliegue (en el script <code>setup\/setup1<\/code>). Esta correcci\u00f3n no fue aceptada por los desarrolladores <em>Pacemaker<\/em>, en su lugar, prometieron rehacer la infraestructura de tal manera (en alg\u00fan futuro indeterminado) que este timeout se calculara autom\u00e1ticamente.<\/p>\n<p>\n<\/li>\n<li>\n<p>Si al configurar la base de datos se indica que en <code>LC_MESSAGES<\/code> (mensajes de texto) se puede usar Unicode, por ejemplo, <code>ru_RU.UTF-8<\/code>, al iniciar <em>postgres<\/em> en un entorno donde locale no sea UTF-8, supongamos, en un entorno vac\u00edo (aqu\u00ed <em>pacemaker<\/em>+<em>pgsqlms<\/em>(paf) inicia <em>postgres<\/em>), entonces <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/message-id\/13FE0F7C-5140-499C-8C2E-0BE64BC3A48B%40ya.ru\">en el log en lugar de letras UTF-8 aparecer\u00e1n signos de interrogaci\u00f3n<\/a><\/noindex>. Los desarrolladores de PostgreSQL a\u00fan no han acordado qu\u00e9 hacer en este caso. Se soluciona, hay que configurar <code>LC_MESSAGES=en_US.UTF-8<\/code> Al configurar (creando) una instancia de base de datos.<\/p>\n<p>\n<\/li>\n<li>\n<p>Si se establece wal_receiver_timeout (que por defecto es de 60s), durante la prueba de PostgreSQL-STOP en los maestros de los cl\u00fasteres tuchanka3 y tuchanka4 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/message-id\/60590EC6-4062-4F25-A49C-3948ED2A7D47%40ya.ru\">no se produce la reconexi\u00f3n de la replicaci\u00f3n al nuevo maestro.<\/a><\/noindex>. La replicaci\u00f3n ah\u00ed es sincr\u00f3nica, por lo que se detiene no solo el esclavo, sino tambi\u00e9n el nuevo maestro. Se puede sortear estableciendo wal_receiver_timeout=0 al configurar PostgreSQL.<\/p>\n<p>\n<\/li>\n<li>\n<p>Ocasionalmente se ha observado que la replicaci\u00f3n de PostgreSQL se bloquea en la prueba ForkBomb (desbordamiento de memoria). <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/message-id\/60590EC6-4062-4F25-A49C-3948ED2A7D47%40ya.ru\">Despu\u00e9s de ForkBomb, a veces los esclavos pueden no reconectarse al nuevo maestro.<\/a><\/noindex>. Esto solo lo he encontrado en los cl\u00fasteres tuchanka3 y tuchanka4, donde, debido a que la replicaci\u00f3n es sincr\u00f3nica, se bloqueaba el maestro. El problema se resolv\u00eda solo, despu\u00e9s de un tiempo prolongado (alrededor de dos horas). Se requiere una investigaci\u00f3n adicional para corregir esto. Los s\u00edntomas son similares a un error anterior, que es causado por otra raz\u00f3n, pero con consecuencias id\u00e9nticas.<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>La imagen del krogan se toma de <noindex><a rel=\"nofollow\" href=\"http:\/\/fav.me\/d8fo42n\">Deviant Art<\/a><\/noindex> con el permiso del autor:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelado de cl\u00fasteres tolerantes a fallos basados en PostgreSQL y Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/ded1ead387814d97d84d0fb89e025386.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/domclick\/blog\/516538\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0437\u0430\u0434 \u043f\u0435\u0440\u0435\u0434\u043e \u043c\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0434\u043b\u044f PostgreSQL, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0434\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440\u0430\u0445, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u044b\u0445 \u043e\u043f\u0442\u043e\u0432\u043e\u043b\u043e\u043a\u043d\u043e\u043c \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0433\u043e \u0433\u043e\u0440\u043e\u0434\u0430, \u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b\u0439 \u0432\u044b\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0437 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0431\u0435\u0441\u0442\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435) \u043e\u0434\u043d\u043e\u0433\u043e \u0434\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440\u0430. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u043e\u0444\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c, \u0432\u044b\u0431\u0440\u0430\u043b Pacemaker, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0442 RedHat \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432. \u041e\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u0442\u0435\u043c, \u0447\u0442\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":92571,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-92570","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0437\u0430\u0434 \u043f\u0435\u0440\u0435\u0434\u043e \u043c\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0434\u043b\u044f PostgreSQL.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 \u043d\u0430 \u0431\u0430\u0437\u0435 PostgreSQL \u0438 Pacemaker | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0437\u0430\u0434 \u043f\u0435\u0440\u0435\u0434\u043e \u043c\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0434\u043b\u044f PostgreSQL.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-08-28T17:42:21+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-08-28T17:42:21+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Modelado de cl\u00fasteres tolerantes a fallos basados en PostgreSQL y Pacemaker | ProHoster","description":"Introducci\u00f3n Hace alg\u00fan tiempo, se me encarg\u00f3 el desarrollo de un cl\u00faster tolerante a fallos para PostgreSQL.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 \u043d\u0430 \u0431\u0430\u0437\u0435 PostgreSQL \u0438 Pacemaker | ProHoster","og:description":"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0437\u0430\u0434 \u043f\u0435\u0440\u0435\u0434\u043e \u043c\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0434\u043b\u044f PostgreSQL.","og:url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-08-28T17:42:21+00:00","article:modified_time":"2020-08-28T17:42:21+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"92570","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 12:06:03","updated":"2022-09-29 15:28:29","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/92570","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=92570"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/92570\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/92571"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=92570"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=92570"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=92570"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}