La Ingeniería Informática posee tres ramas fundamentales que a su vez se dividen en un sinfín de categorías y procedimientos que es imposible que se puedan conocer al 100%. A lo largo de la carrera aprendes un poco de todo (generalmente por tu cuenta en lo que se refiere a la parte práctica) y al salir como Ingeniero, generalmente en el trabajo que caigas, te especializas en algo más concreto que puede ir orientado a: programación y desarrollo de aplicaciones, gestión de bases de datos, administración de sistemas y otras tantas ramas más, pero principalmente podríamos decir que te orientas a la rama del desarrollo o a la de administración de sistemas.
En mi caso particular, aunque me gustan ambas ramas, siempre he dedicado más tiempo a la parte de desarrollo, aunque en muchas ocasiones me ha tocado también aprender bastante en el ámbito de la administración de sistemas.
Hoy he realizado una tarea de investigación en la cual he intentado encontrar algún modo de optimizar la configuración que utilizo en uno de mis servidores web para poder aprovechar el rendimiento de la máquina en concreto. Digamos que tenemos un ferrari funcionando con un sistema de motor de un seat 600.
Buscando por la red he encontrado varios enlaces que me han gustado mucho y a continuación paso a exponer lo aprendido o lo que he visto que puede ser muy útil para todos.
Gestión de procesos MySQL (generación de backups, exportación e importación de bases de datos, etc)
show variables; show status;
Exportar – http://guias.ovh.es/BackupBaseMySQL
$ mysqldump -uUsuario -p dbnombre > dbnombre.sql o $ mysql -h nombre_de_host -u nombre_de_usuario -pcontraseña base_de_datos > fichero_dump.sql
Importar – http://guias.ovh.es/ImportBaseMySQL
$ mysql -uUsuario -p dbnombre < dbnombre.sql o $ mysql -h nombre_de_host -u nombre_de_usuario -pcontraseña base_de_datos < fichero_dump.sql
Número de procesos
$ ps -A | grep mysql | wc -l
Procesos en cursos
$ ps -aux | grep mysql $ mysqladmin –i10 processlist extended-status
Checkear todas las tablas y optimizarlas
$mysqlcheck --optimize --all-databases
Monitorización
myTop es un monitor para MySQL de consultas en tiempo real.
Configuración y Optimización
Fichero de configuración: /etc/my.cnf o /etc/mysql/my.cnf
NOTA: No olvides hacer un backup de tu fichero original funcional.
NOTA: El fichero de MySQL permite no poner variables y dejarlas “por defecto”, en muchos casos, puede ser interesante no poner variables, si no son necesarias.
La potencia de MySQL es muy grande y la versatilidad en su configuración también los es. Actualmente, y dado el relativo “bajo coste” de la memoria RAM, se hace posible el uso de memoria caché que mejore el rendimiento de nuestro servidor.
En caso de que el cometido del host sea exclusivamente servidor MySQL, podemos permitirnos el lujo de cachear hasta un 70-80% del total de la memoria disponible.
Si por el contrario, el host o servidor, cumple tareas como servidor web, correo, y más… pues debemos considerar ofrecer menos recursos.
En la web de MySQL podemos obtener un listado de todas las variables de configuración del sistema:
system-variables
server-system-variables
dynamic-system-variables
También debemos considerar los timeouts como medida de seguridad, pues reducen el riesgo de colapso del sistema a causa de fallos en la programación de las aplicaciones utilizadas.
La fórmula mágica
Memoria MySQL = key_buffer_size + max_connections * (join_buffer + record_buffer + sort_buffer + thread_stack + tmp_table_size)
Información de Variables
Los parámetros de MySQL se pueden definir a nievel de servidor, gestionando las directivas de “/etc/mysql/my.cnf”, sin embargo, también es posible definir variables especificas por usuario, creando un fichero en “~/.my.cnf”
NOTA: Si va a realizar cambios en la configuración, y su sistema utiliza apparmor, deberá ajustar los valores en /etc/apparmor.d/usr.sbin.mysqld.
Definición de variables
key_buffer
Los bloques de índices para tablas MyISAM y ISAM se guardan en buffers y se comparten para todos los threads. key_buffer_size es el tamaño del buffer usado para los bloques de índices. El key buffer también se conoce como la key cache. El tamaño máximo permitido para key_buffer_size es 4GB.
key_buffer = 16M
max_allowed_packet
El tamaño máximo de un paquete o cualquier cadena de caracteres generada/intermedia.
max_allowed_packet = 16M
thread_stack
El tamaño de la pila para cada thread. Muchos de los límites detectados por el test crash-me dependen de este valor. El valor por defecto es lo suficientemente grande para un funcionamiento normal, y un seguro ante fallos de programación.
Si trabajamos con consultas excesivamente complejas, deberiamos subir el valor. Es utilizada en aplicaciones de Benchmarck MySQL
thread_stack = 128k
thread_cache_size
Esta variable puede incrementarse para mejorar el rendimiento si tiene muchas nuevas conexiones.
El número de threads que el servidor debe cachear para reusar. Cuando un cliente desconecta, los threads de clientes se ponen en la caché si hay menos de thread_cache_size threads. Peticiones de threads se sirven reusando threads tomados de la caché cuando es posible.
thread_cache_size = 8
max_connections
El número de conexiones de cliente simultáneas permitidas. Incrementar este valor incrementa el número de descriptores de fichero que requiere mysqld.
Si obtiene un error Too many connections, revise le documentación:
http://dev.mysql.com/doc/refman/5.0/…nnections.html
max_connections = 100
thread_concurrency
Esta función permite a las aplicaciones dar al sistema de threads una piesta sobre el número deseado de threads que deben ejecutarse simultáneamente.
thread_concurrency = 10
Configuración de caché
table_cache
El número de tablas abiertas por todos los threads. Incrementar este valor incrementa el número de descriptores de ficheros que requiere mysqld. Puede chequear si necesita incrementar la caché de la tabla chequeando la variable de estado Opened_tables
table_cache = 64
query_cache_limit
No cachea resultados mayores que este número de bytes. El valor por defecto es 1048576 (1MB). Es un valor para cada consulta. Valores muy altos pueden provocar inestabilidad en servicios muy concurridos.
query_cache_limit = 1M
query_cache_size
La cantidad de memoria reservada para cachear resultados de consultas. El valor por defecto es 0, lo que desactiva la cache de consultas. Tenga en cuenta que la cantidad de memoria se reserva incluso si query_cache_type tiene como valor 0.
query_cache_size = 16M
Backup MySQL
Tamaño máximo para el backup
[mysqldump] max_allowed_packet = 16M
Reparar tablas
Definimos del buffer mientras que MySQL examina las bases de datos en busca de posibles fallos o tablas corrompidas.
[isamchk] key_buffer = 16M
Cluster MySQL
Definimos la IP del nodo cluster. 127.0.0.1 define que no hay cluster, y que nuestro servidor, es el único.
[MYSQL_CLUSTER] ndb-connectstring = 127.0.0.1
Certificados MySQL
Las siguientes rutas definen donde tenemos guardados los certificados SSL
ssl-ca = /etc/mysql/cacert.pem ssl-cert = /etc/mysql/server-cert.pem ssl-key = /etc/mysql/server-key.pem
yojota
Abr 23, 2019 -
Muchas gracias por este articulo me fue de gran ayuda.
Saludos
Camilo Balanta
Dic 19, 2019 -
El articulo esta muy bien dividido y con explicaciones puntuales.
Tengo una duda con la que de pronto me puedas ayudar, ¿cual es la manera mas optima de almacenar en una base de datos imágenes de exenciones como .jpg?
Saludos
Jose Alberto Benítez Andrades
Dic 28, 2019 -
Sinceramente, la mejor opción es NO almacenar las imágenes en la base de datos, ya que sobrecargaría su tamaño. Es mucho mejor que guardes rutas.