Skip to content

Lab 3 Documentación

famancil edited this page May 12, 2019 · 1 revision

Issue #1 Optimización base de datos (master)


  1. Se crea una cuenta en Percona, para acceder al "Configuration Wizard" y asi configurar el archivo "my.cnf" para optimizar de manera ad-hoc a la capacidad del servidor, la base de datos de la primera maquina.
  2. Luego de setear varios datos, en los 7 pasos pedidos para configurar el archivo "my.cnf", nos entrega la configuración que debemos cambiar en el archivo "my.cnf". Y se setean las siguientes variables.
  3. innodb_buffer_pool_size: Variable que refleja la capacidad de almacenamiento en memoria para manejar el cache de datos y los indices. Es recomendado que su valor represente el 70%-80% de la memoria RAM. Para este caso, tendrá una capacidad de 560[MB], de esa manera las transacciones de lectura y/o escritura serán mas rápida.
  4. innodb_buffer_file_size: Esta variable ya no es usada desde la versión MySQL 5.5, para nuestro caso (MySQL 5.7.21) no sera necesario setear.
  5. max_connections: Variable que indica la cantidad de conexiones simultaneas que puede recibir la base de datos. Por defecto son 151, pero por recomendación de "Percona Wizard" se dejara en 500 (pues como se ocupa CentOS 7 como Sistema Operativo) tiene su cuota de rapidez y manejo de peticiones acorde al numero máximo de conexiones.
  6. innodb_file_per_table: Variable booleana que le indica a la base de datos que guarde cada tabla en un archivo diferente, esto facilita mejor cuando se quiere eliminar una tabla para liberar espacio en el disco, y como esta tabla se encuentra en un archivo diferente (si estuviera seteado en 0, se guarda todas las tablas en un mismo archivo, complicando la transacción mencionada) se borrara en un tiempo rápido. El valor recomendado por "Percona Wizard" es 1.
  7. innodb_flush_log_at_trx_commit: Variable que muestra el balance entre un sistema ACID (valor 1) y uno de buen rendimiento (valor 0). Por recomendación de "Percona Wizard", se deja en el valor 1, por ende sera un sistema full ACID, esto ayudara en el ámbito de seguridad de la base de datos.
  8. innodb_flush_method: Variable que cambia la forma en que InnoDB abre los archivos y vacía datos en el disco, como los archivos de datos y logs. Se ocupa la forma "O_DIRECT" pues es la recomendada cuando la aplicación maneja su propia cache (que es así) y de esa manera toma el "overhead" del doble almacenamiento en buffer y reduce la presión del swap.
  9. innodb_log_buffer_size: Variable que indica el tamaño de un buffer que permite ejecutar transacciones sin tener que registrar el log al disco antes del fin de ésta. Por defecto MySQL ocupa el valor 16[MB], y como "Percona Wizard" no varia ese valor, se deja tal como esta.
  10. query_cache: Variable que permite resultados idénticos de una consulta (por ejemplo "SELECT") se ejecuten más rápidamente a medida que los datos se obtienen de la memoria. Desde la versión 5.7.20 se encuentra "deprecated", pero por recomendación de "Percona Wizard" se setea las dos variables asociadas "query-cache-type" y "query-cache-size" como 0.
  11. logging: En esta sección se encuentra cuatro variables "log-error", "log-queries-not-using-indexes", "slow-query-log" y "slow-query-log-file". Las cuales habilitan (slow-query-log en 1) y detallan donde se guardan los logs de tipo "error" (/var/lib/mysql/mysql-error.log) y "slow"(/var/lib/mysql/mysql-slow.log). Para el caso de "log-queries-not-using-indexes", que significa el uso de log para querys que no usan index para buscar filas (resultados), y por ende se habilita seteando la variable en 1.

Issue #2 Instalación y Optimización base de datos (slave)


  1. Usando la documentación del "Lab 2 Documentación", en la sección "Issue #4 Instalación de Percona Server", en la segunda maquina se instala el repositorio de Percona mediante el comando yum install "link_repo" (el link_repo se encuentra en la documentación).
  2. Siguiendo las instrucciones, se instala Percona Server mediante el comando "yum install Percona-Server-server-57".
  3. Verificando la contraseña generada por defecto ("cat /var/log/mysqld.log |grep generated"), y seteamos la nueva contraseña mediante "sudo mysql_secure_installation.
  4. De la misma forma que el Issue #1, usamos "Percona Wizard" para setear las mismas variables explicadas anteriormente en esa issue, guardando registro en el archivo "my.cnf". Se deja en la misma configuración que en la primera maquina, pues la segunda maquina se ocupara para replicación (slave), por ende debe estar configurada de la misma forma que el "master".

Issue #3 Replicación


  1. Para hacer la comunicación master/slave en la interfaz privada, se configuro en las dos maquinas que la interfaz "eth0" estuviera en la zona "internal" mediante el comando "firewall-cmd --permanent --zone=internal --change-interface=eth0"(ambas maquinas).
  2. Se añade el puerto "3306/tcp" mediante el comando "firewall-cmd --permanent --zone=internal --add-port:3306/tcp" (explicado en la Issue #6 "Nueva máquina" de la documentación "Lab 2 Documentación" y en ambas maquinas se aplico la regla).
  3. Para hacer permanentes los cambios se aplica el comando "firewall-cmd --reload"(ambas maquinas).
  4. En el servicio de "Network Manager" se aplican los mismos cambios en ambas maquinas, las cuales son "nmcli connection modify eth0 ipv4.route-metric 600" (cambiarle el peso en ambas maquinas), "nmcli connection up eth0" (activar la conexión de la interfaz eth0) y "nmcli con mod eth0 connection.zone internal" (cambiar la conexión del interfaz eth0 a la zona "internal".
  5. Finalmente se reinicia el servicio "systemctl restart NetworkManager".
  6. Para la parte de la replicación, antes es necesario instalar los paquetes de "xtrabackup" (para hacer backups de base de datos) y "rsync" (el cual envia copias de archivos o directorios conservando los permisos de este por medio de ssh). Se instalan mediante los comandos "yum install percona-xtrabackup-24" y "yum -y install rsync" (en ambas maquinas).
  7. Como recomendación de la pagina de Percona, se requiere hacer un backup de la base de datos de master (la primera maquina), para eso se usa el comando "xtrabackup --backup --user=root --password=iwB*yiG+k0Yz --target-dir=/root/backup;" donde se guardara en la carpeta root.
  8. Luego para que los archivos que están en la carpeta "backup" sean consistente, es necesario prepararlos (usando la opción --prepare del "xtrabackup") y de esa manera no habria problemas de corrupción. Para eso se ocupa el comando "xtrabackup --prepare --user=root --password=iwB*yiG+k0Yz --target-dir=/root/backup;"
  9. Ya listo el backup, se usa el comando "rsync" para enviar la carpeta "backup" desde la primera maquina al segundo(y así conservar los permisos que tiene "backup"). Se usa el comando "rsync -avpP -e ssh /root/backup [email protected]:/var/lib/mysql". Se baja el servicio "mysqld" de la segunda maquina para modificar archivos en "/var/lib/mysql" de forma correcta (systemctl stop mysqld).
  10. Se cambia la base de datos del slave (segunda maquina) por la que se encuentra en la master (primera maquina) usando los comandos "mv /var/lib/mysql /var/lib/mysql_bak" y "mv /var/lib/mysql/backup /var/lib/mysql".
  11. Luego de poner todos los archivos y directorios de la carpeta "backup" (donde están todos las bases de datos del master) en la carpeta "mysql", se mueven los archivos de "mysql_bak" que tengan que ver la configuración por defecto de slave (pero sin sobreescribir los archivo y directorios de "backup"). Esto es para no tener problemas al aplicar "systemctl start mysql".
  12. Se sube el servicio de "mysqld" mediante "systemctl start mysqld". Y se cambian el dueño de la carpeta "/var/lib/mysql" al "mysql" mediante el comando "chown -R mysql:mysql /var/lib/mysql" (solo en segunda maquina).
  13. Para la configuración de master/slave, en el terminal de mysql de la primera maquina, se dan permisos de "slave" mediante el comando "GRANT REPLICATION SLAVE ON . TO 'repl'@'10.10.15.117' IDENTIFIED BY 'As3/lVshHixM07';" (el usuario es "repl" y al aplicar el comando, se crea el usuario en la segunda maquina). Luego de refrescar los privilegios mediante "FLUSH PRIVILEGES".
  14. Para probar si usuario "repl" de la segunda maquina puede comunicarse con el servidor de base de datos de la primera maquina (mediante el permiso otorgado en, se usa el comando "mysql --host=10.10.15.107 --user=repl --password=As3/lVshHixM07". Y verificando si existe el privilegio de replicación usando "SHOW GRANTS;" (en el terminal de mysql).
  15. Como la segunda maquina funcionara solo para replicación, se debe asegurar que la configuración de la base de datos slave tenga la misma que la master (explicado en la Issue #2). Por ende se usa el comando "scp" para copiar el archivo de configuración MySQL "my.cnf" de la master y cambiar el archivo "my.cnf" (de la segunda maquina) por este, mediante "scp [email protected]:/etc/mysql/my.cnf /etc/mysql/my.cnf". Pero se cambia la variable "server-id" de 1 a 2. Y se reinicia el servicio "systemctl restart mysqld".
  16. Para empezar la replicación, se mira el archivo "xtrabackup_binlog_info" (en la carpeta "mysql") para ver el archivo logs y la posición del ultimo log ("log_pos"). Usando el comando "cat var/lib/mysql/xtrabackup_binlog_info".
  17. Se configura los datos del master que tendra la base de datos slave, mediante el comando (en mysql) "CHANGE MASTER TO MASTER_HOST='10.10.15.107', MASTER_USER='repl', MASTER_PASSWORD='As3/lVshHixM07', MASTER_LOG_FILE='TheMaster-bin.000001', MASTER_LOG_POS=481;"
  18. Finalmente, en el terminal mysql se comienza la replicación mediante "START SLAVE;"
  19. Para chequear si esta replicando de la master, en el terminal de mysql se usa el comando "SHOW SLAVE STATUS \G", y ahi aparece una tabla donde muestra muchas variables, pero las 3 mas importantes son
  • Slave_IO_Running: Yes
  • Slave_SQL_Running: Yes
  • Seconds_Behind_Master: 0.

Donde al aparecer las dos primeras variables con "yes" y mostrando la cantidad de segundos en "Seconds_Behind_Master" entonces el servidor slave esta listo para replicar todas las transacciones del servidor master.

Issue #4 Configuración final OpenCart


  1. Para instalar Opencart en la segunda maquina, es necesario instalar nginx y php-fpm. Para eso se instala el repositorio de nginx.repo y se instala nginx mediante yum install nginx --disablerepo=epel.
  2. Luego se procede a instalar PHP-FPM mediante su repositorio "ius" y el comando "yum install php71u-fpm*"
  3. Dentro de la segunda maquina, se crea el archivo "server.conf" en la carpeta conf.d del directorio nginx y se configura para acceder al instalador de opencart mediante el puerto 9999. Usando además fastcgi_pass para compilar los archivos php mediante php-fpm.
  4. Para el repositorio de opencart, se utiliza el comando de rsync para enviar desde la primera maquina hacia la segunda (y de esa manera conservar los permisos) a traves de "rsync -avpP -e ssh /home/famancil/opencart/ [email protected]:/home/famancil/opencart". Para eso se crea un usuario "famancil" (y su carpeta con el mismo nombre).
  5. Se hace la misma configuración descrito en "Lab 2 Documentación" para instalar Opencart, y posterior a eso se hace un tunel ssh para acceder a la pagina de instalación de la segunda maquina, mediante el comando "ssh -L9999:localhost:9999 [email protected] -t ssh -L9999:localhost:9999 [email protected]" (Se accede a la segunda maquina a traves de la primera).
  6. Siguiendo los mismos pasos que el "Lab 2 Documentación" se instala Opencart. Y se procede a crear el usuario "openCartUser" en mysql, para que asi los dos trabajen con el servidor mysql master (como la segunda maquina se configuro para ser el servidor slave, replicara todos los cambios que experimente la base de datos "opencart"). No olvidar en darle acceso al usuario "openCartUser" a la base de datos "opencart".
  7. Para hacer respaldos de la base de datos de manera automática, se utiliza crontab el cual es una administrador de procesos en segundo plano, que se encuentra instalado por defecto en las dos maquinas. Para hacer crear un proceso automatizado, se entra al archivo que guarda los comandos que se ejecutaran en cierto tiempo mediante "crontab -e".
  8. Una vez dentro del archivo, para hacer un respaldo de la base de datos se usa el comando "mysqldump -u root opencart > /root/db_dump.sql" el cual guardara el respaldo db_dump.sql en la carpeta root. Entonces para programar un proceso de hace con el siguiente formato " * * * * * comando_a_ejecutar" donde los 5 asteriscos representa minuto (0 a 59), hora(0 a 23), dia del mes(1 a 31), mes(1 a 12) y día de la semana (0 a 6, siendo 6 domingo). Y cuando si se pone un asterisco en vez de especificar alguna de estas variables se tomara como "cada" minuto, hora, mes o día de la semana.
  9. Entonces se programara para la fecha "23 de Julio" a las 23:01, un respaldo en segundo plano mediante el comando "01 23 * * 0 mysqldump -u root opencart > /root/db_dump.sql", el cual especifica que en cada día de la semana 0 (lunes) a las 23:01 se ejecutara el comando de respaldo, al guardar el archivo aparece el mensaje de exito "crontab: installing new crontab" el cual dice que se programo un nuevo proceso. Al probarlo, se puede ver que esta el archivo "db_dump.sql" en la carpeta "root".