Migrar Blog WordPress a AWS Lightsail Pt. I

Como algunos de ustedes ya saben he migrado este blog desde una plataforma tradicional a la nube de Amazon, específicamente a un servicio llamado Lightsail y es lo que vengo a contarles.

¿Qué es Lightsail?

Es un servicio de AWS que nos permite crear un VPS (Virtual Private Server) con solo unos pocos clics, haciendo un poco más fácil la gestión y hospedaje de un sitio Web y a bajo coste ya que a partir de 5$/mes podemos tener hospedado un sitio.

Lightsail es un servicio que hace más amigable la administración de un sitio pero aún permitiéndonos acceder a la instancia via ssh. Con Lightsail podemos crear una instancia no solo para hospedar un sitio con WordPress, sino también con Magento, Joomla, Drupal o una instancia con un stack LAMP, MEAN, Node.js y otros más. Solo basta clicar el botón “crear instancia” y a continuación:

  • Seleccionar la región y zona donde estará ubicada la instancia.
Ubicación de la instancia

Ubicación de la instancia

  • Seleccionar la plataforma (Linux/Unix o Windows).
  • Seleccionar únicamente el sistema sistema operativo o el sistema operativo junto a las aplicaciones a instalar.
Seleccionar un plan

Seleccionar un plan

  • Seleccionar el plan de la instancia: 5$, 10$, 20$, 40$ u 80$.
Seleccionar el plan de almacenamiento de la instancia

Seleccionar el plan de almacenamiento de la instancia

  • Darle un nombre a la instancia.
Crear instancia

Crear instancia

  • Pulsar el botón crear.

Antes de seguir debo hacer mención a par de articulos que utilicé como referencia mientras llevaba a cabo la migración:

https://www.elpuas.com/como-instalar-wordpress-en-amazon-lightsail/

http://www.adrianmilne.com/migrating-wordpress-blog-amazon-aws-lightsail/

Una vez creada la instancia esta tendrá todo el entorno de WordPress montado incluso con su usuario administrador y podremos visitar el site sencillamente viendo el detalle de la instancia recién creada específicamente su IP pública.

Luego así como lo indica el blog de Adrian Milne me descargué la clave privada para acceder desde mi ordenador por ssh (no fuera tan importante para la administración del sitio sino fuese porque via ssh es que podremos obtener la contraseña de administración de WordPress). Luego utilicé el plugin de WordPress UpdraftPlus y lo instalé en el WordPress recién creado y en el que deseaba migrar y realicé un primer backup y ese mismo lo utilicé para llevar a cabo la restauración en la instancia recién creada.

Una vez comprobada que la restauración se había llevado a cabo, ya me faltaba solo un paso, probar llegando desde una URL y no usando la IP pública, para esto utilicé un dominio que me había comprado hacía cerca de un año mientras me preparaba para la certificación de solution architect de amazon estudiando el servicio Route 53.

Lightsail dentro de sus funciones también incluye alguna de Route 53 como es la gestión de DNS, lo que en Route 53 sería la gestión de zonas hospedadas, en Lightsail sería crear zona DNS, entonces continuando con la migración los siguientes pasos fueron:

  • En la página de inicio de Lightsail, ir a redes y luego clicar el botón “Crear una IP estática”. Aquí se asociará la instancia a una IP estática pública.
  • En el mismo apartado de redes, clicar el botón “Crear zona DNS”. Allí indicaremos nuestro dominio (sin importar que este no haya sido registrado en Route 53) y pulsaremos el botón “Crear zona DNS” como aparece en la imagen.
crear zona DNS

crear zona DNS

  • Añadimos los registros de DNS como aparece en la imagen pero usando vuestro dominio y para cada subdominio en el campo “IP DE DESTINO” seleccionamos nuestra instancia (que de antemano ya la asociamos a una dirección IP estática).
crear zona DNS

crear zona DNS

  • Finalmente deberemos esperar unos pocos minutos y ya podremos visitar nuestro sitio usando el dominio.

Esto es todo chicos, en la próxima entrega les indicaré como migrar un dominio registrado con otro registrador, que fue un paso adicional que realicé ya que mi dominio josedeveloper.com lo había registrado con godaddy.com

Primeros pasos con Apache Drill

¿Qué es apache drill?

Es un motor de consultas open-source para exploración de fuentes de datos con grandes volúmenes de datos. Apache drill nos permite realizar análisis de alto rendimiento sobre datos semiestructurados sin dejar de ofrecer la familiaridad y el ecosistema de la norma ANSI SQL. Apache drill a su vez posee integración con Hive y HBase.

Apache drill a menudo es comparado con Hive y con Impala, por su alto rendimiento por trabajar con ficheros .csv y .json, así como también porque por medio de estas podemos efectuar consultas en HBase, pero hay un aspecto donde drill sobresale y es que puede conectarse a otros gestores de bases de datos como por ejemplo MySQL y MongoDB.

¿Cómo conocí Apache drill?

Me topé con apache drill por casualidad en el 2015, debido a las circunstancias y dificultades con las que trabajábamos, teníamos ordenadores plataformas que no nos permitían instalar nada y como tarea teníamos que hacer cruce de información de grandes ficheros .csv con sistemas de bases de datos relacionales. Los ficheros .csv eran tan grandes que ni siquiera podíamos visualizarlos con excel ni con atom y apache drill termino siendo una herramienta estupenda para poder realizar exploración sobre los datos y eso que lo utilizamos en modo embebido en nuestro ordenadores.

Instalación

Apache drill tiene 2 tipos de instalación dependiendo si será en un cluster o si será en un único nodo, nosotros haremos la de un único nodo, la cual es muy sencilla ya que solo es necesario descomprimir el fichero descargado y ejecutar el  fichero ./drill-embebed el cual esta en la carpeta /bin de nuestra instalación.

Este último paso abrirá una consola donde podremos ejecutar sentencias sql y además se levantará un cliente web al que podremos acceder desde cualquier navegador en la ruta http://localhost:8047

apache drill web client

apache drill web client

Ahora vamos a empezar a jugar con drill, para ello crearemos un fichero json que denominaremos cliente_banco.json con los siguientes datos:

También crearemos un fichero csv con los datos de los clientes y lo llamaremos clientes.csv:

Ahora que empiece la diversión, lo primero que haremos será consultar los datos del fichero clientes.csv como si fuera una tabla con SQL utilizando el cliente Web de drill, para ello será necesario ir a la ruta http://localhost:8047/query

Una vez allí ejecutaremos la siguiente sentencia:

SELECT * FROM dfs.ruta_fichero/clientes.csv

resultado query csv en drill

resultado query csv en drill

El resultado no se puede apreciar muy bien además que se ve que asume la cabecera del fichero csv como si fuese un registro, para mejorar esto, será necesario hacer una pequeña modificación en la configuración. Apache drill funciona con plugins donde se almacena toda la configuración de las conexiones con ficheros del filesystem, de gestores de bases de datos, tipo mongoDB, MySQL, etc. por ende será necesario que editemos la configuración del plugin de filesystem para que tome en cuenta la cabecera del fichero csv (NOTA: Aquí también podríamos configurar el tipo de separador ya sea “,”o “;” o “|” entre otros).

Para realizar la actualización de la configuración deberemos ir a la ruta http://localhost:8047/storage y hacer clic en el botón “Update” del plugin dfs.

storage

storage

Allí veremos un json utilizado para la configuración y buscaremos el elemento “csv” dentro del objeto “formats” y le añadiremos el atributo “skipFirstLine”: true como se muestra en la siguiente imagen y procederemos a actualizar el plugin pulsando el botón “Update”.

configurando plugin dfs

configurando plugin dfs para que no tome en cuenta la primera linea del csv

Si intentamos de nuevo la consulta veremos como es obviada la cabecera del fichero csv, aunque aún no vemos el resultado como una tabla, para eso utilizaremos alias para identificar a cada columna al momento de efectuar la consulta de la siguiente forma:

SELECT columns[0] as ID, columns[1] as NOMBRE, columns[2] as APELLIDOS, columns[3] as PROVINCIA FROM dfs.ruta_fichero/clientes.csv

Obteniendo lo siguiente:

resultado de la consulta

resultado de la consulta

Vamos a profundizar aún más y ahora realizaremos un join entre los datos del fichero csv y del fichero json, ejecutando la siguiente consulta:

SELECT tablaCSV.columns[0] as ID, tablaCSV.columns[1] as NOMBRE, tablaCSV.columns[2] as APELLIDOS, tablaCSV.columns[3] as PROVINCIA, tablaJSON.BANCO FROM dfs.ruta_fichero/clientes.csv tablaCSV
LEFT JOIN dfs..ruta_fichero/cliente_banco.json tablaJSON
ON tablaCSV.columns[0] = tablaJSON.ID

Obteniendo:

resultado del left join

resultado del left join

Apache drill nos ofrece a su vez más posibilidades como por ejemplo crear tablas en formato parquet  a partir de un json o de un fichero csv. Apache drill es una herramienta que me gusta mucho pero también cuenta con algún aspecto a mejorar, por ejemplo me gustaría poder utilizar la cabecera de un fichero csv como nombre de columna al efectuar consultas y esto no funciona del todo bien, de hecho hice unas pruebas y fue así como me percate de este pequeño error que estoy seguro (y espero) se solucione pronto.

Para que la cabecera de un archivo csv sea tomada en cuenta como nombre de columna de una tabla es necesario modificar la configuración del plugin dfs, al igual que lo hicimos antes para que no tomase en cuenta la primera fila del archivo, editando el formato csv así como en la siguiente imagen.

config dfs plugin

configurando dfs plugin para que reconozca la cabecera de los ficheros csv

De nuevo repitamos la consulta que hacíamos al principio:

SELECT * FROM dfs.ruta_fichero/clientes.csv

Vemos como de inmediato sin haber utilizado alias en la consulta el resultado es devuelto como una tabla

Si ahora repetimos la consulta veremos como la salida de los resultados ha cambiado, dándonos una perspectiva de que tenemos una tabla, utilizando la cabecera del fichero csv como la cabecera de la tabla de resultados

consulta de todos los campos

consulta de todos los campos

Además al igual que con ejemplos anteriores podemos efectuar join con otras tablas independientemente en el formato o fuente que se encuentren (son, csv, parquet, mysql, etc…), el problema (o error) esta cuando intentamos consultar por un campo en especifico alguno puede que no devuelva nada como por ejemplo si efectuamos la siguiente consulta:

SELECT ID, NOMBRE FROM dfs.ruta_fichero/clientes.csv

consulta de ID y NOMBRE

consulta de ID y NOMBRE

 

Esto me pareció tan extraño que intente jugar con distintos parámetros de configuración e incluso con la forma de realizar la consulta y no pude solventar este comportamiento por lo que publiqué  este error en stackoverflow por si estaba haciendo algo mal y alguien podía echarme una mano.

No quiero que lo último los desanime a probar la herramienta ya que esta cuenta con muchas bondades que dan para redactar unas cuantas entradas más, espero que hayan podido seguir todos los ejemplos y tener una perspectiva de lo que podemos alcanzar con la herramienta.

ACTUALIZACIÓN 28-09-2016:

Al haber quedado con la inquietud del mal funcionamiento al ejecutar la consulta sobre el csv indicando como columnas la cabecera del fichero, me decidí a escribir a lista de usuarios de apache drill por si en dado caso me estaba topando con un bug (cosa extraña porque llevaría así al menos 3 releases) y ellos me han dado la respuesta, el problema estaba en el espacio en blanco inmediatamente después de la coma, por lo cual al reformular la consulta y hacerla de la siguiente manera funcionó a la perfección:

SELECT ID, ‘ NOMBRE’ FROM dfs.ruta_fichero/clientes.csv

Pero otra forma quizás más elegante aún es que se eliminase el espacio después de la coma en la cabecera del archivo csv, de esa manera  basta con que coloquemos los nombres de las columnas sin necesidad de encerrarlas entre comillas al momento de formular la consulta.

SELECT ID, NOMBRE FROM dfs.ruta_fichero/clientes.csv

Tablas en memoria en MySQL

Algunas semanas atrás en el trabajo nos topamos con un problema, realizábamos una consulta que consistía en hacer un join entre una tabla muy grande contra un par de tablas pequeñas que contenían únicamente descripciones. Como ustedes ha de imaginarse teníamos nuestra base de datos normalizada y para exportar los datos con el conjunto de descripciones era necesario realizar este cruce.

Para que la consulta fuese bien (que no arrojase un timeout en el mejor de los casos) habíamos agregado índices a las tablas secundarias (aquellas que contenían las descripciones) y la consulta de lograr ejecutarse llegó a tardar unos 25 segundos. Estas tablas eran de tipo InnoDB y los índices eran de tipo B-Tree (es el único tipo de índice para las tablas de tipo InnoDB). La consulta llegaba a tardar en el mejor de los casos (que no devolviese un timeout) 25 segundos. Es por esta razón que buscando una alternativa abordamos las tablas en memoria.

Las tablas en memoria son almacenadas en la memoria HEAP razón por la cual son tablas temporales ya que una vez se haya reiniciado o apagado la máquina estas perderán los datos, es decir se mantiene la estructura de la tabla mas no su contenido. Las tablas en memoria en MySQL pueden tener 2 tipos de índices B-Tree o Hash.

¿Cuando utilizar cada tipo de índice?

El índice B-Tree puede utilizarse con operadores del tipo =, >, >=, <, <= o BETWEEN, de igual manera puede ser usado con el operador LIKE, mientras que el índice Hash es usado únicamente para comparaciones de igualdad como =, >= o <=. Así que de realizar comparaciones de igualdad es recomendable utilizar el índice Hash ya que es muy rápido mientras que cuando se realicen comparaciones del tipo >, <, LIKE, BETWEEN u optimizar operaciones de ORDER BY la opción es utilizar B-Tree.

En nuestro caso únicamente realizábamos operaciones de igualdad ya que comparábamos en base a un código así que utilizamos índices de tipo Hash, obteniendo excelentes resultados, tanto es así que nunca llegamos a obtener un timeout y el tiempo de respuesta de nuestras consultas se redujeron a 5 segundos.

¿Cómo crear una tabla en memoria?

La creación de una tabla en memoria es muy sencilla, es igual a la creación de cualquier otra tabla del tipo InnoDB, lo único es sencillamente cambiar el tipo de “engine” e indicar “MEMORY”, por ejemplo:

Por último ¿Como hacer para que se carguen los datos de la tabla en memoria al arrancar?

Por muy tonto que parezca para nosotros esto era importante ya que nos asegurábamos de que de reiniciarse el ordenador (era windows :-s ) estando o no nosotros, las tablas en memoria estarían creadas y cualquier consulta que se efectuase no daría error. Para que la tabla en memoria se llene de datos al arrancar el servidor MySQL es bastante sencillo, lo único que debemos hacer es editar el fichero my.ini o my.cnf y debajo de donde dice [mysqld] agregar la siguiente linea

Donde script.sql tendrá las sentencias sql de inserción por ejemplo

Espero que esto les pueda servir para optimizar el consultas en base de datos o sencillamente resolver cualquier inconveniente.

¿Has trabajado antes con tablas en memoria? Compartirías con nosotros tu experiencia.

Gephi una herramienta de visualización de redes

Esta semana en el Master empezamos con una nueva materia denominada “Análisis de redes sociales”, el inicio ha sido bastante interesante, de hecho me pareció chévere, pero lo que quiero compartir con todos ustedes es la herramienta que vimos el primer día, esta se llama Gephi, es una herramienta open source hecha en Java para la visualización  de redes y pues nosotros empezamos analizando nuestra red social Facebook.

Visualización de mi red social Facebook

Visualización de mi red social Facebook

 Para que la herramienta funcione correctamente en Mac OSX hay que ser una serie de “trucos” y apaños (como ejecutarlo en Java 6) porque en caso contrario seremos incapaces de ni siquiera arrancar la aplicación. Aquí les dejo el enlace donde aparecen los pasos necesarios de configuración para poder ejecutarlo en Mac OSX.

La imagen de mas arriba es una perspectiva de todos los nodos que forman parte de mi red social Facebook. Para poder visualizar mi red de Facebook tuvimos que descargarnos un fichero de extensión .gml desde esta página donde podemos indicar que información queremos obtener de nuestra red de contactos, como sexo, lenguaje, entre otros.

Me gusto la herramienta no solo por lo versátil al momento de visualizar el diagrama y los resultados que obtuve (como las agrupaciones de nodos que son fácilmente identificables), sino porque tenia (y tengo) en mente hacer una visualización de mi red de Twitter, pero con Java y Neo4j, aunque ya compañeros del master me han hecho llegar un proyecto que genera el fichero .gml, por lo cual quizás visualice antes en Gephi mi red de Twitter. Sin mas dilación aquí les dejo el componente gigante de mi red donde señalo sus agrupaciones.

Componente gigante de mi red de Facebook

Componente gigante de mi red de Facebook

¿Alguno de ustedes ha hecho un análisis de alguna de sus redes sociales? ¿Que herramienta utilizaste? Si te animas a analizar alguna de tus redes sociales con Gephi, no dudes en compartir tu resultados con nosotros

Mi CV en formato mapa mental

Hacia mucho tiempo que venia con esta idea de hacer una versión de mi CV (currículum vítae) en formato mapa mental, pero no lo hice antes entre otras cosas porque no me había tomado el tiempo de buscar una aplicación que de forma sencilla me ayudara a realizarlo y porque en realmente no sabia como empezar, ya que los que había visto todos variaban entre sí no solo en estilo sino en contenido, pero esto cambio hace par de días cuando revisando algunas aplicaciones de la Mac Store vi SimpleMind (la versión gratuita) la instale y de inmediato me gusto su sencillez y que lo poco que hace a mi parecer lo hace bien y bueno lo demás fue “un tiro al piso” (quiero decir muy sencillo, imposible de fallar), fue ponerme a jugar con la herramienta y empiezo a fluir la inspiración, ese boceto de como quería que fuera mi CV y bueno he decidido no solo compartirlo con ustedes sino que he hecho una página en mi sección personal (menu “Yo”) únicamente para mostrar  el mapa con la intención de esporádicamente ir actualizandolo.

CV en formato mapa mental

CV en formato mapa mental

Sinceramente me gusto como quedo pero por momentos dude en si agregar o no, par de nodos adicionales, como “objetivos” (sobretodo educacionales, aprender nuevas tecnologías, herramientas, etc..) y “hobbies” o “intereses” (como ya he indicado antes en la página acerca de mí) donde colocaría fútbol, running, estar actualizado en cuanto a la tecnologías, pero finalmente decidí no añadirlos aunque no descarto agregar estos nodos en una actualización mas adelante.

Alguna sugerencia, ¿quitarias o pondrías algún tipo de información adicional?

MI CV en formato mapa mental