Estas en: Home > configurar

Entradas etiquetadas con configurar

MySQL logo

Cómo crear y configurar una replica de base de datos MySQL 8

0

La configuración y creación de réplicas de las bases de datos es un proceso muy importante para poder disponer de escalabilidad en nuestro cluster de bases de datos, pues nos permite escalar de forma horizontal (número de instancias) y no solo vertical (más RAM, más CPU).

Con la nueva versión de MySQL, la 8, que ya lleva un tiempo con nosotros, se cambió la nomenclatura que se le daba a las instancias maestra y esclava. Ahora se llaman «Fuente» (Source) y «Replica» (Replica). Aquí se usarán ambas nomenclaturas para ayudar aquellas personas que se estén actualizando desde MySQL 5.7.

1. Configurando la instancia maestra/fuente

En primer lugar tenemos que configurar la instancia que hará de instancia maestra, y desde ella se replicarán los datos hacia las instancias replicadas.

En el fichero de configuración de MySQL (normalmente estará en /etc/mysql/my.cnf) tendremos que indicar las siguientes líneas:

server_id=1
enforce-gtid-consistency = 1
log_bin                         = /var/log/mysql/mysql-bin
expire_logs_days                = 7
sync_binlog                     = 1
gtid-mode = ON

Esta configuración de MySQL está diseñada para habilitar y gestionar la replicación basada en GTID (Global Transaction Identifiers). Vamos a desglosar cada uno de los parámetros:

  1. server_id=1:
    • Este parámetro asigna un identificador único a la instancia del servidor MySQL. En un entorno de replicación, cada servidor debe tener un server_id único para distinguirse de otros servidores. En este caso, el identificador es 1.
  2. enforce-gtid-consistency = 1:
    • Asegura que todas las transacciones que se ejecutan en el servidor sean compatibles con GTID. Cuando está habilitada (= 1), no se permite el uso de transacciones que no sean compatibles con GTID, lo cual es necesario para mantener la consistencia en un entorno de replicación con GTID.
  3. log_bin = /var/log/mysql/mysql-bin:
    • Especifica la ruta y el nombre base para los archivos de registro binario (bin logs). Los bin logs registran todas las modificaciones de datos y son esenciales para la replicación y recuperación de datos. Aquí, los bin logs se almacenarán en /var/log/mysql/mysql-bin.
  4. expire_logs_days = 7:
    • Define el número de días que los archivos de registro binario se mantienen antes de ser automáticamente eliminados. En este caso, los registros binarios se conservarán durante 7 días.
  5. sync_binlog = 1:
    • Controla la frecuencia con la que MySQL sincroniza el registro binario a disco. Cuando se establece en 1, MySQL sincroniza los bin logs con el disco después de cada transacción. Esto proporciona la máxima seguridad de datos, asegurando que todas las transacciones se registren en disco en caso de un fallo del sistema.
  6. gtid-mode = ON:
    • Habilita el modo GTID en el servidor MySQL. Cuando gtid-mode está activado (ON), MySQL utiliza GTID para identificar y rastrear transacciones de forma global en el entorno de replicación. Esto facilita la gestión y recuperación de las transacciones en un sistema de replicación distribuido.

Esta configuración está orientada a establecer un entorno de replicación robusto y consistente utilizando GTID en MySQL. Se asegura que las transacciones sean compatibles con GTID, los bin logs sean mantenidos y sincronizados de manera adecuada, y que cada servidor en la configuración de replicación tenga un identificador único. Este conjunto de configuraciones es esencial para garantizar la consistencia y la recuperación eficiente de datos en un entorno de replicación MySQL.

2. Crear usuario de replicación en la instancia maestra/fuente

Hay que crear un usuario que tenga solamente el privilegio «REPLICATION_SLAVE», configurado con su respectiva contraseña, y el host correspondiente. Este privilegio le permite a este usuario leer los ficheros binlogs de la instancia fuente.

CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;

Sustituye los datos del usuario (nombre del usuario y host) por los que consideres.

Valida que el usuario puede acceder al servidor:

mysql -urepl -p

Verifica los privilegios:

SHOW GRANTS;

3. Haz una copia de seguridad de la instancia maestra/fuente

Voy a explicarte dos formas de hacer una copia de los datos de la instancia maestra. La primera con «mysqldump» y la segunda con «Percona XtraBackup». Dependiendo de el tamaño de la base de datos, del número de bases de datos y del número de peticiones que procese la base de datos, te interesará usar una u otra.

3.1. Copia de seguridad con «mysqldump»

mysqldump es una herramienta de línea de comandos proporcionada por MySQL que se utiliza para crear copias de seguridad de bases de datos. Genera un archivo de texto SQL que contiene todos los comandos necesarios para recrear la base de datos desde cero, incluyendo la estructura de las tablas (definiciones de tablas) y los datos contenidos en ellas (inserciones).

Para asegurarte de que tienes una copia coherente de los datos, bloquea las tablas y obtén el estado actual del registro binario.

FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

Anota el archivo del registro binario y la posición (binlog file y position) que se muestran en la lista.

Ahora ejecuta el siguiente comando para copiar los datos a un fichero:

mysqldump -u root -p --all-databases --master-data > data_dump.sql

Luego, transfiere este archivo al servidor esclavo y restáuralo:

mysql -u root -p < data_dump.sql

3.2. Copia de seguridad con Percona XtraBackup

Percona XtraBackup es una herramienta de código abierto diseñada para realizar copias de seguridad y restauraciones de bases de datos MySQL y MariaDB de manera eficiente y sin tiempos de inactividad. Desarrollada por Percona, XtraBackup permite a los administradores de bases de datos (DBAs) realizar copias de seguridad en caliente, lo que significa que las copias se pueden realizar mientras la base de datos está en funcionamiento y en uso, sin necesidad de interrumpir el servicio.

Características principales de Percona XtraBackup:

  1. Copias de seguridad en caliente: Permite realizar copias de seguridad mientras la base de datos está en uso.
  2. Rápido y eficiente: Utiliza técnicas avanzadas para minimizar el impacto en el rendimiento de la base de datos durante el proceso de copia de seguridad.
  3. Compatibilidad: Funciona con MySQL, MariaDB, y Percona Server, incluyendo versiones específicas de estos sistemas de gestión de bases de datos.
  4. Incrementales y diferenciales: Permite realizar copias de seguridad incrementales y diferenciales, reduciendo el tiempo y el espacio necesarios para las copias de seguridad.
  5. Compresión y cifrado: Soporta la compresión y el cifrado de las copias de seguridad para ahorrar espacio en disco y asegurar los datos.
  6. Restauración rápida: Ofrece mecanismos para una restauración rápida y eficiente de las bases de datos desde las copias de seguridad.
  7. Sin bloqueo: No requiere bloquear las tablas durante la copia de seguridad, lo que ayuda a mantener la disponibilidad del sistema.

Beneficios del uso de Percona XtraBackup:

  • Minimiza el tiempo de inactividad: Al no requerir que la base de datos esté inactiva durante la copia de seguridad, los servicios pueden continuar sin interrupciones.
  • Reducción del uso de recursos: Al ser eficiente en términos de CPU y disco, reduce la carga en el sistema durante las operaciones de copia de seguridad.
  • Seguridad de los datos: Con opciones de cifrado, asegura que las copias de seguridad estén protegidas contra accesos no autorizados.
  • Flexibilidad: Ofrece múltiples opciones de configuración y personalización para adaptarse a diferentes necesidades y entornos de bases de datos.

Percona XtraBackup es ampliamente utilizado en entornos de producción donde la alta disponibilidad y la integridad de los datos son críticas, y es una herramienta esencial para los DBAs que gestionan grandes volúmenes de datos y requieren soluciones de copia de seguridad y recuperación confiables y eficientes.

Para utilizar Percona Xtrabackup para realizar una réplica de una base de datos MySQL, debes seguir una serie de pasos detallados que incluyen realizar una copia de seguridad, preparar la copia de seguridad y restaurarla en el servidor de réplica.

Ejecuta el siguiente comando:

xtrabackup --backup --user=usuarioDB --password=usuarioDBPassword --target-dir=/ruta/al/directorio/del/backup

Aquí, reemplaza «/ruta/al/directorio/del/backup" por la ruta donde deseas almacenar la copia de seguridad, y «usuarioDB" y «usuarioDBPassword" por las credenciales de tu base de datos.

El backup terminará cuando veas el siguiente texto:

xtrabackup: completed OK!

Para que el backup sea consistente ejecuta el siguiente comando:

xtrabackup --prepare --target-dir=/ruta/al/directorio/del/backup

Una vez que finalice, XtraBackup te devolverá el mismo mensaje que antes

Desde la instancia maestra usamos rsync para enviar la copia a la réplica:

rsync -avpP -e ssh /ruta/al/directorio/del/backup Replica:/ruta/al/directorio/del/backup_temporal

Asegúrate que MySQL está parado en la instancia de réplica:

service mysql stop

Asegúrate de que el directorio de datos de MySQL en el esclavo/replica esté vacío o muévelo a otra ubicación antes de restaurar:

mv /ruta/a/mysql/data /ruta/a/mysql/data_bak

Movemos la copia del maestro a donde le corresponde:

xtrabackup --move-back --target-dir=/ruta/al/directorio/del/backup_temporal

Cuando se haya realizado la copia cambia el usuario y el grupo:

chown -R mysql:mysql /ruta/a/mysql/data

5. Configurar el servidor MySQL de la instancia de la réplica

Copia la configuración de la instancia maestra a la instancia de la réplica, bien copiando el fichero o su contenido.

Cuando lo tengas, entra en el fichero y modifica el valor de «server-id»:

server-id=2
enforce-gtid-consistency = 1
log_bin                         = /var/log/mysql/mysql-bin
expire_logs_days                = 7
sync_binlog                     = 1
gtid-mode = ON

Si tuvieras más réplicas, indica el identificador que correspondiese.

Ahora puedes volver a iniciar el servidor de MySQL:

service mysql start

6. Iniciar la replicación

De la instancia maestra tenemos que obtener el valor del registro del binlog en el que se encuentra (si no lo has hecho previamente), de tal forma que se lo podamos indicar a la réplica para que se sincronicen. Por tanto entra a MySQL de la instancia maestra y ejecuta la siguiente consulta:

show master status;

Nos quedaremos con los datos de los campos «File» y «Position» (verás algo como «mysql-bin.000002» y «197» respectivamente).

Ahora, en la instancia de la réplica entramos a MySQL y configuramos la replicación (reemplaza los valores según tu configuración):

change replication source to source_host='instancia_maestraip', source_user='usuario_replica', source_password='usuario_replica_password', source_log_file='valor_campo_File_maestro', source_log_pos=numero_valor_campo_Position_maestro;

Los valores de MASTER_LOG_FILE y MASTER_LOG_POS deben ser obtenidos de los logs de MySQL en el servidor maestro justo antes de hacer la copia de seguridad o durante la configuración inicial de la replicación.

Si todo ha ido bien, ya puedes iniciar la réplica:

start replica;

7. Comprobaciones

Ahora puedes validar que todo va bien en la réplica:

show replica status\G;

Verás un listado de variables como las siguientes:

*************************** 1. row ***************************
             Replica_IO_State: Waiting for source to send event
                  Source_Host: masterdb
                  Source_User: repl
                  Source_Port: 3306
                Connect_Retry: 60
              Source_Log_File: mysql-bin.000002
          Read_Source_Log_Pos: 1955663
               Relay_Log_File: replicadb-relay-bin.000002
                Relay_Log_Pos: 13046
        Relay_Source_Log_File: mysql-bin.000002
           Replica_IO_Running: Yes
          Replica_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Source_Log_Pos: 1955663
              Relay_Log_Space: 13257
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Source_SSL_Allowed: No
           Source_SSL_CA_File: 
           Source_SSL_CA_Path: 
              Source_SSL_Cert: 
            Source_SSL_Cipher: 
               Source_SSL_Key: 
        Seconds_Behind_Source: 0
Source_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Source_Server_Id: 1
                  Source_UUID: 67a9f8bd-f869-11ed-a46a-42010a010032
             Source_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
    Replica_SQL_Running_State: Replica has read all relay log; waiting for more updates
           Source_Retry_Count: 86400
                  Source_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Source_SSL_Crl: 
           Source_SSL_Crlpath: 
           Retrieved_Gtid_Set: 67a9f8bd-f869-11ed-a46a-42010a010032:619401-619424
            Executed_Gtid_Set: 67a9f8bd-f869-11ed-a46a-42010a010032:1-619424
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Source_TLS_Version: 
       Source_public_key_path: 
        Get_Source_public_key: 0
            Network_Namespace: 
1 row in set (0.00 sec)

Asegúrate de que los valores de «Slave_IO_Running» y «Slave_SQL_Running" estén en Yes y que no haya errores en la replicación.

Conclusión

Siguiendo estos pasos, deberías poder configurar con éxito una réplica de base de datos MySQL. La replicación te ayudará a mejorar la disponibilidad y escalabilidad de tus aplicaciones.

Integración continua: Automatizando la creación de proyectos WordPress, Drupal, Symfony, etc. (II)

0

En el post anterior hemos actualizado el script que crea los repositorios, para poder añadirle unas cuantas acciones para automatizar la creación del proyecto (creación de directorios, directorios ignorados, etc.). Ahora vamos a desarrollar la segunda parte, que consistirá en la automatización de la instalación del cms o framework elegido.

(más…)

Integración continua: Instalar y configurar nuestra máquina virtual con VirtualBox, por consola

2

Este post veremos como crear una máquina virtual utilizando el software de virtualización VirtualBox. Esta máquina nos permitirá automatizar la configuración inicial de los proyectos (creación de bases de datos, configuración de crms, etc.). Además nos permitirá poder realizar test funcionales y otras tareas que nos ahorrarán gran cantidad de tiempo.

(más…)

Integración continua: instalando y configurando Jenkins

0

Ya vistes la checklist del último post: https://www.interadictos.es/2014/08/11/integracion-continua-primeros-pasos/, ahora vamos a empezar a instalar y configurar algunas herramientas, para ir poco a poco uniéndolas.

¿Qué es Jenkins?

Jenkins es nuestro servidor de integración continua. Es una aplicación que permite automatizar una lista de tareas que le indiquemos. Estas tareas pueden ser iniciadas de forma manual, pero lo habitual será llamar a la primera tarea de la lista cada vez que se realice un commit en el repositorio, e ir concatenando tareas hasta finalizar la lista completa. Tranquilo si no te haces aun a la idea, a medida que vayamos avanzando con esta guía lo iras entendiendo.

Instalando Jenkins

Primero descargamos la key del servidor de Jenkins, que nos permitirá añadirlo al archivo sources.list:

wget −q −O   class="external free" style="color: #663366;" href="http://pkg.jenkins−ci.org/debian/jenkins−ci.org.key" rel="nofollow">http://pkg.jenkins−ci.org/debian/jenkins−ci.org.key | sudo apt−key add 

A continuación lo añadimos al archivo sources.list. Puedes añadirlo de esta manera o añadirlo a mano:

sudo sh −c 'echo deb  class="external free" style="color: #663366;" href="http://pkg.jenkins−ci.org/debian" rel="nofollow">http://pkg.jenkins−ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list'

Actuliazamos la lista de paquetes e instalamos:

sudo apt−get update
sudo apt−get install jenkins

Ahora necesitamos poder acceder a él a través de la red, para ello vamos a crear el subdominio jenkins.ic.net. Para poder acceder por el subdominio jenkins.ic.net es necesario crear un virtual host con proxy inverso, para ello instalamos varios módulos de Apache2 necesarios:

sudo a2enmod proxy
sudo a2enmod headers
sudo a2enmod deflate
sudo a2enmod proxy_http

Ahora creamos un virtualhost en /etc/apache2/sites-available llamado 001-jenkins.ic.net.conf (Podeis usar el nombre que quieras), con el siguiente contenido

 *:80>
        ServerName jenkins.ic.net  

         *>
                Order deny,allow
                Allow from all
         

        ProxyPreserveHost On
        ProxyPass /  class="external free" style="color: #663366;" href="http://localhost:8080/" rel="nofollow">http://localhost:8080/
        ProxyPassReverse /  class="external free" style="color: #663366;" href="http://localhost:8080/" rel="nofollow">http://localhost:8080/

La ruta habitual para acceder a Jenkins sería http://localhost:8080, si pudieramos acceder desde el mismo servidor de integración continua, si lo hicieramos desde fuera sería http://ic.net:8080. Para evitar tener que recordar el número de puerto utilizamos el archivo anterior. Nos facilitará la vida.

Ahora creamos un enlace simbólico de este archivo en /etc/apache2/sites-enabled.

sudo ln −s /etc/apache2/sites−available/001−jenkins.ic.net.conf /etc/apache2/sites−enabled/001−jenkins.ic.net.conf

Reiniciamos apache con:

sudo /etc/init.d/apache2 reload

En nuestro ordenador tendremos que editar el archivo hosts, para indicarle al pc a qué ip debe dirigirse para encontrar el alojamiento de jenkins.ic.net. Añadimos la siguiente línea al archivo (sustituye la IP por la de tu servidor de integración continua):

192.168.1.40 jenkins.ic.net

Ahora podrás escribir el subdominio en el navegador para acceder a la página principal de Jenkins.

A partir de aquí te recomiendo que explores todas las opciones de Jenkins, además de echarle un ojo a la documentación: https://wiki.jenkins-ci.org/display/JENKINS/Use+Jenkins

En la administración de Jenkins puedes acceder al apartado de plugins, revísalos y podrás hacerte una idea de las posibilidades de esta herramienta.

Obligar a las apps de Android a instalarse en la tarjeta SD (desde Debian y Windows)

0

Hace unos días, y después de una actualización de las apps que tengo instaladas en el móvil me apareció el mensajito de falta de espacio en la memoria. He de decir que mi móvil es un HTC Nexus One y que ya de por si venía escaso de memoria interna (sobre 256MB), que os voy a contar de la RAM de este móvil que no sepáis ya, aunque esto último no es algo que me preocupe en exceso ya que no uso el móvil para aplicaciones con grandes consumos de memoria (si, si, ni para jugar. Para eso está el Diablo III xD).

Pero aun así las aplicaciones ocupan espacio en la memoria del teléfono, y eso de estar pasándolas a la tarjeta SD a mano es repetitivo, así que me he puesto a buscar algo de información para obligar a android que instale las apps en la tarjeta SD.

Bueno, pues en esa búsqueda de información encontré la siguiente guía de como hacerlo, pero para Windows:

http://onsoftware.softonic.com/como-obligar-android-a-instalar-apps-en-la-tarjeta-sd

La mayoría de aplicaciones que pide ya las tenía instaladas desde hace un tiempo. Al aprender a programar para android la mayoría son obligatorias. Respecto a los drivers para el usb de HTC, en Debian no son necesarios (ni en ningún sistema GNU/Linux o MacOS X).

Por tanto solo hay que activar en el móvil la depuración por USB, ubicado en la siguiente ruta:

ajustes -> aplicaciones -> desarrollo

 

 

Una vez activada esa opción conectamos el cable USB al móvil y luego al PC.

Abrimos una consola y nos identificamos como root.

Nos vamos a la ruta donde se instaló el SDK de Android, en mi caso lo encontré en:

/var/local/android-sdk-linux

En esa ruta accedemos a la carpeta platform-tools, y ejecutamos el siguiente comando:

./adb device

Esperamos a que nos devuelva el resultado, donde podremos ver el número de serie del dispositivo.

Comprobamos con netstat si el puerto 5037 está siendo usado, si es así tendremos que matar el proceso que lo esté utilizando.

Por último ejecutamos el siguiente comando:

./adb shell pm setInstallLocation 2

Cuando nos devuelva al símbolo del sistema desconectamos el móvil del PC y lo reiniciamos.

Ya tenemos activada la opción para que Android instale las aplicaciones en la tarjeta SD en vez de en la memoria interna.

Optimizar el servidor web Apache

1

Tenía intención de crear un post explicando la optimización de Apache, pero la verdad es que en la red ya existe bastante información al respecto por tanto os dejo dos links, uno explicando cada uno de los parámetros que se pueden modificar en el archivo httpd.conf de Apache y el otro con algunos ejemplos de optimización:   – Definición de parámetros: http://www.codenb.com/optimizar-apache-16/ – Ejemplos: http://www.forosdelweb.com/f58/recetas-para-configuracion-apache-404961/

Symfony, creando el archivo schema.yml para una base de datos ya existente

0

Sí, sigo dándole caña a Symfony… y cometiendo errores de novato xD.

Para ir probando Symfony con un proyecto real, he decidido utilizar una base de datos ya existente para generar una nueva versión del proyecto anterior, y como ya sabrás para que Symfony (bueno, en este caso Propel) genere las clases necesarias para trabajar con la BD es necesario que la estructura de ésta esté en el archivo schema.yml dentro de la carpeta /config del proyecto.

Para ello, primero hay que configurar la conexión a la base de datos en symfony de la siguiente manera:

symfony configure:database «mysql://login:password@localhost/basededatos»
symfony configure:database «mysql:host=localhost;dbname=nombreBD» root pass

Ahora le decimos a Propel que genere el archivo schema.yml a partir de la base de datos:

symfony propel:build-schema

Propel coge los datos de configuración de la BD que le hemos dado anteriormente.

Y con esto se genera el archivo schema.yml y symfony está listo para generar las clases.

 

PD1: Propel utiliza PDO para conectar con la BD, si por alguna razón os muestra un error diciendo que no encuentra el driver o algo por el estilo, simplemente id al archivo php.ini y habilitad la extensión pdo_mysql y reiniciar apache, esto lo debería arreglar.

PD2: Cada vez que tengas que generar el modelo recuerda de limpiar la caché de symfony para evitarte problemas:

symfony cc

PD3: Si al generar el modelo, Propel te devuelve un error de «tabla duplicada» o parecido, solo tienes que ir a la carpeta /config del proyecto y eliminar un archivo llamado generated-schema.yml (si no recuerdo mal).

Ir arriba