Posts Tagged Bases de datos

Amazon RDS – La nube de datos relacional*

Hace tiempo que trabajábamos buscando soluciones al problema de migrar aplicaciones que utilizan una base de datos relacional “clásica” a un entorno de cloud computing (más concretamente a Amazon EC2). Este problema nos llevó a interesantes estudios sobre el clúster y la replicación master-slave de MySQL hasta encontrar una solución bastante aceptable con esta última. Y después de todo este trabajo… va Amazon y lo resuelve con un nuevo servicio llamado Amazon RDS (Relational Database Service).

En pocas palabras, RDS viene a ser una puerta de acceso a una base de datos MySQL Server (de momento la versión 5.1 con InnoDB como motor principal) que corre encima de los servidores de Amazon Web Services. Amazon te proporciona una interfaz idéntica a la que utilizarías con un servidor dedicado a la base de datos pero no preguntes como funciona por debajo, no te preocupes por las actualizaciones de seguridad, no intentes acceder como si fuera un servidor normal y corriente… sólo utilízalo y disfrútalo!

Amazon RDS viene a completar la oferta de sistemas de bases de datos con SimpleDB (una base de datos muy simple para aplicaciones con una baja complejidad de datos) y Amazon EC2 Relational Database AMIs (una selección de AMIs con diferentes software de bases de datos preeinstalados).

Para interactuar con Amazon RDS, como con casi todos los servicios de AWS, tenemos la posibilidad de realizar llamadas a la API directamente o descargarnos las herramientas por linea de comandos (en mi opinión la mejor opción).

Para instalar las herramientas por linea de comandos podemos seguir los siguientes pasos:

  1. Descargamos las RDS Command Line Tools de la página oficial de Amazon
  2. Seteamos las variables JAVA_HOME y AWS_RDS_HOME necesarias en /etc/enviroment. Las linias que tendríamos que añadir son las siguientes
    AWS_RDS_HOME="/path/a/la/carpeta/commandlinetools"
    JAVA_HOME="/path/a/java"

    En mi caso el “/path/a/java” es “/usr/lib/jvm/java-6-sun/” y si utilizas Ubuntu no creo que sea muy diferente ;-)
  3. El siguiente paso es añadir en el PATH del sistema el directorio /bin de las herramientas que hemos descargado. Para hacer esto, dentro del mismo archivo /etc/enviroment, añadiremos :$AWS_RDS_HOME/bin antes de las dobles comillas que cierran la expressión PATH=”blabla:/blabla:/blabla” para que quede de la forma PATH=”blabla:/blabla:/blabla:$AWS_RDS_HOME/bin”.
  4. Lo siguiente es abrir el archivo credential-file-path.template que encontraremos en la raíz del directorio de las herramientas y introducir nuestros datos de acceso a la cuenta de AWS.
  5. Una vez introducidas nuestras credenciales añadiremos la situación de este archivo en /etc/enviroment también:
    AWS_CREDENTIAL_FILE="/path/a/credential-file-path.template"
    Si queremos podemos modificar el nombre del fichero y moverlo a la localización que más nos guste, mientras mantengamos la informatcion de /etc/enviroment actualizada.
  6. Una vez tengamos todo ésto solo queda reiniciar el ordenador para cargar todas estas variables y ya estaremos listos para empezar a jugar con Amazon RDS!

Me gustaría descubrir un método para recargar las variables de /etc/enviroment en caliente pero de momento los métodos que he encontrado no han acabado de funcionar correctamente, si tienes alguna sugerencia déjala en los comentarios :-)

Bueno ahora viene la mala noticia… Amazon RDS de momento solo está disponible para Estados Unidos… Pero prometen tenerlo disponible para Europa en los próximos meses, veremos que tardan.

Os dejo un post del blog de Amazon Web Services en el que se introduce Amazon RDS enlace.

logo_aws

*No me agredais física ni intelectualmente por el juego de palabras!!

, , , , ,

1 Comment

Problemas para conectar con MySQL Server

Intentando conectar con un MySQL Server que tenemos en el servidor de desarrollo de la oficina nos hemos dado cuenta de que por defecto no se puede acceder a este sistema gestor de base de datos desde un ordenador que no sea ‘localhost’ o ’127.0.0.1′ (en la versión 5.1 por lo menos).

El error que recibíamos no era ni culpa del router (que es un Zyxel de Telefónica y no sería le primer problema que nos da), ni del firewall por defecto de Ubuntu (ufw, Uncomplicated FireWall) ni nada parecido, el error era culpa nuestra.

La instalación del servidor de desarrollo de la oficina se hizo un viernes de Agosto cerca de la una del mediodía y con las prisas para salir corriendo hacía la playa nos olvidamos mirar los archivos de configuración del servidor de MySQL. El archivo de configuración de MySQL (por defecto alojado en /etc/mysql/my.cnf en Ubuntu) contiene por defecto la siguiente directiva:
bind-address = 127.0.0.1Con lo que se bloquean todas las conexiones al servidor que no se hagan desde esta dirección. Para solucionar el problema sólo hace falta comentar esta línea:
#bind-address = 127.0.0.1Y reiniciar el servicio (desde la consola):
sudo /etc/init.d/mysql restart
Este apunte es solo un pequeño paréntesis en la serie de artículos referentes a Subir vídeos a YouTube con Zend Gdata – Requisitos previos y Identificación del usuario, pronto volveremos con el último de la saga!

, , , ,

2 Comments

Autenticar un usuario en Zend Framework – Crear el adaptador

Después de pelearnos nuestras horas con el framework de Zend hemos conseguido identificar un usuario con las herramientas que provee este framework (Zend_Auth). La adapatación no ha sido al 100% porqué teniendo la información relativa a los usuarios en una base de datos no utilizamos el adaptador que Zend tiene empleado para estos fines (Zend_Auth_Adapter_DbTable) sino que implementamos un adaptador desde cero.

Antes de empezar a definir que nos hace falta para poner en marcha la identificación de usuario comentamos que estos pasos se han realizado en un servidor Lighttpd-MySQL-PHP5 en un sistema operativo Ubuntu 8.10. Ahora sí, vamos a ver como establecer una autentificación de usuarios:

Implementar un adaptador para autentificar usuarios

Este paso se puede modificar según el origen de la información que vayamos a usar. El framework tiene soluciones específicas para datos de acceso almacenados en base de datos, provenientes de peticiones HTTP, de un servidor LDAP o por OpenID. Como hemos comentado al principio nuestros datos estan almacenados en una base de datos pero vamos a implementar un adaptador desde cero.

Para implementar un adaptador desde cero debemos implementar la interfície Zend_Auth_Adapter_Interface, para eso deberemos implementar obligatoriamente el metodo authenticate() (por razones derivadas de la herencia) y también le añadiremos un par de cositas más. Este adaptador debe recibir la información necesaria para identificar un usuario y realizar la comprovación.

Veamos un ejemplo de la classe:
<?php
class AuthenticationAdapter implements Zend_Auth_Adapter_Interface{

private $_username = null;
private $_password = null;

public function __construct($username, $password){
$this->_username = $username;
$this->_password = $password;
}

public function authenticate(){
//TODO comprobar si $username y $password estan presentes en la base de datos
...

if(/* Estan presentes*/){
/* $sessionData es una variable con la información que queremos guardar en sessión */

return new Zend_Auth_Result(Zend_Auth_Result::SUCCESS,$sessionData);
}else{
/* Si no esta el $username */
return new Zend_Auth_Result(Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND,$sessionData);

/* Si el password es incorrecto */
return new Zend_Auth_Result(Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID,$sessionData);

/* Error en la identificación por otros motivos */
return new Zend_Auth_Result(Zend_Auth_Result::FAILURE,$sessionData);
}
}
}

En el próximo post seguiremos con el controlador y como utilizar este adaptador. No falteis!

, , , , , ,

1 Comment

Añadir un slave a un entorno de replicación MySQL

Siguiendo el hilo de los artículos de Laura Berdasco sobre levantar un entorno de replicación Master-Slave en MySQL, Vamos a explicar como añadir un esclavo más a un entorno de este tipo funcionando.
Estos pasos se han realizado en instancias de EC2 con acceso al puerto 3306 desde Internet (se pueden endurecer las políticas de seguridad en este punto pero para realizar las pruebas ya nos servirá esta configuración) y acceso por SSH en sistemas Ubuntu 8.10.

Para añadir un esclavo a un entorno debemos seguir los siguientes pasos:

  • Paramos el servidor MySQL del esclavo en funcionamiento (de aquí en adelante slave-1). En la consola del slave-1 con el siguiente comando:
    sudo /etc/init.d/mysql stopPara ejecutar este comando debemos acceder a la consola del slave-1 por SSH o localmente.
  • Paramos también le servidor MySQL del esclavo que queremos arrancar (de aquí en adelante slave-2). En la consola del slave-2 con el mismo comando que en paso anterior.
  • Copiamos los archivos del direcotrio /var/lib/mysql del slave-1 al slave-2. Para esta operación necesitamos la clave (keypair) para acceder por SSH del slave-1 al slave-2, en nuestro caso se encuentra en /mnt/keypair.pem.

    Si no tenemos este archivo en el slave-1 desde el ordenador en que la tengamos deberemos ejecutar este comando:
    scp -i /path/to/keypair.pem /path/to/keypair.pem root@dns.slave-1.com:/mnt/keypair.pemEste comando nos sube por SSH el archivo keypair.pem situado en /path/to al directorio /mnt del servidor remoto (dns.slave-2.com) identificandose como root con el mismo archivo (opción -i). Para realizar esta acción debemos identificarnos como root (a veces puede fallar la ejecución con ‘sudo’).

    Una vez con el archivo keypair.pem en el slave-1 copiaremos tambien con el comando ‘scp’ el contenido del directorio /var/lib/mysql de slave-1 al slave-2. En la consola del slave-1:
    scp -r -i /mnt/keypair.pem /var/lib/mysql/* root@dns.slave-2.com:/var/lib/mysql/Cuando se hayan copiado todos los archivos podemos poner en marcha el servidor MySQL del slave-1.

  • Una vez copiados estos archivos es importante cambiar el propietario. En la consola del slave-2 ejecutar los siguientes comandos:
    cd /var/lib/mysql
    sudo chown -R mysql:mysql *
    Si no realizamos este cambio de propietario es posible que el servidor de MySQL del slave-2 no arranque correctamente.
  • Cambiar el server-id del slave-2. Editando el archivo con vim o nano tenemos que abrir el archivo /etc/mysql/my.conf y dónde encontremos una linia así (o con otro número):
    ...
    server-id=2
    Cambiar el número que aparece por un server-id que no se esté utilizando en el entorno de replicación.
  • Para poder arrancar el servidor MySQL del slave-2 sólo nos queda dar permisos de replicación en el master. En la consola del master entramos en el cliente mysql:
    mysql -u root -pY ejecutamos la siguiente consulta:
    mysql> GRANT REPLICATION SLAVE ON *.* TO 'usuario_replica'@'dns-slave-2.com' IDENTIFIED BY 'pwd_del_usuario_replica';
  • Arrancamos el servidor MySQL del slave-2. En la consola del slave-2 ejecutamos el comando:
    sudo /etc/init.d/mysql start

Para comprovar que todo ha ido correctamente debemos realizar alguna modificación en el master y asegurarnos que se distribuye a las dos replicas afectadas. Para más información podeis visitrar los compeltos artículos que Laura tiene en su blog sobre la replicación en MySQL: Replicación MySQL con Master-Slave sobre Ubuntu 8.10 (master) y Replicación MySQL con Master-Slave sobre Ubuntu 8.10 (slave).

, , , , ,

No Comments

Mover los archivos de datos de MySQL Server

En ocasiones es posible que nos interese tener los archivos dónde se encuentran los datos de MySQL en un directorio diferente del que viene configurado en la instalación del servidor. Vamos a ver que pasos debemos seguir si en un momento dado queremos migrar los datos de un MySQL Server a un directorio diferente.

Estos pasos han funcionado en diferentes equipos ejecutando un MySQL Server 5.0 con replicación (tanto en modo master cómo en slave) sobre un sistema Ubuntu 8.10. Los archivos de datos en este caso están almacenados en /var/lib/mysql y los vamos a migrar a /home/mysql

  • Creamos el directorio mysql en /home (si no lo tenemos creado ya):
    cd /home
    sudo mkdir mysql
  • Paramos el servidor de MySQL:
    sudo /etc/init.d/mysql stopEste paso hay diferentes formas de ejecturalo, se puede utilizar cualquier comando que pare el servidor MySQL.
  • Copiamos todo el contenido de /var/lib/mysql a /home/mysql :
    sudo cp -R /var/lib/mysql/* /home/mysql/Es muy importante no dejarse la opción -R ya que es la que nos permite copiar directorios con todo su contenido.
  • Una vez copiado el contenido si vamos al directorio /home/mysql veremos que el propietario de los archivos es root. Por este motivo debemos cambiar el propietario de todos los archivos y directorios (incluído /home/mysql):
    sudo chown -R mysql:mysql /home/mysqlOtra vez la opción -R nos permite realizar la operación recursivamente por todos los sub-directorios.
  • Editamos el fichero de configuración del servidor:
    sudo gedit /etc/mysql/my.confEn este ejemplo hemos empleado Gedit pero evidentemente puede editarse con editores del tipo vi o nano.

    Y en la línea dónde encontramos esto:
    ...
    datadir = /var/lib/mysql

    Ponemos lo siguiente:
    ...
    datadir = /home/mysql

  • Es posible que si intentáramos arrancar el servidor de base de datos funcionara pero en la mayoría de casos debemos modificar la configuración de AppArmor. Primero modificaremos uno de los archivos de configuración:
    sudo gedit /etc/apparmor.d/usr.sbin.mysqldY vamos a realizar la siguiente modificación, dónde nos encontremos con las líneas siguientes:
    ...
    /var/lib/mysql/ r,
    /var/lib/mysql/** rwk,
    Vamos a poner lo siguiente:
    ...
    /var/lib/mysql/ r,
    /var/lib/mysql/** rwk,
    /home/mysql/ r,
    /home/mysql/** rwk,
    Si hacemos estas modificaciones pero no volvemos a arrancar AppArmor no nos va a servir de nada, así que antes de seguir al ultimo paso debemos ejecutar el siguiente comando:
    sudo /etc/init.d/apparmor restart
  • Para finalizar sólo tenemos que volver a arrancar el servidor MySQL:
    sudo /etc/init.d/mysql startSi todo ha ido bien el servidor no tardará mucho en arrancar ;)
    • Si una vez realizados estos pasos queremos asegurarnos que el servidor realmente esta almacenando los datos en el directorio que le hemos señalado podemos crear una base de datos vacía y ir al directorio /home/mysql/ y ejecutando el comando ‘ls’ mirar si se ha creado un directorio con el nombre de la base de datos nueva.

      Espero que os sirva!

, , , ,

1 Comment

MySQL Workbench, el sustituto de DBDesigner

Para diseñar una base de datos con una mínima complejidad son necesarios unos conocimientos bastante amplios sobre bases de datos en general y sobre el motor de almacenamiento que vamos a utilizar (MySQL, Oracle, Postgre…).

El primer paso para obtener una base de datos “decente” es un buen análisis para definir la estructura que vamos a introducir dentro del sistema gestor escogido pero, una vez tenemos el esquema que vamos a utilizar, podemos recurrir a herramientas muy útiles que nos facilitan la vida. Una de estas herramientas hasta hace poco era DBDesigner.

DBDesigner era una herramienta que te ayudaba de forma gráfica a crear el esquema de la base de datos pero que gracias a su interfaz pasó a formar parte de las herramientas que se utilizaban en el análisis. El poder crear un modelo gráfico que una vez finalizado, con sólo apretar un botón, te regalara los scripts de creación de la base de datos era una maravilla.

En la parte negativa sólo comentar que la instalación en un equipo corriendo la distribución Ubuntu (la que utilizo en casa y en el trabajo) era larga y complicada; y si al final conseguías que corriera al 100% ya era un gran logro.

El abandono de este proyecto me desilusionó un poco (tengo que confesarlo) hasta que un dia me aventuré a provar la versión Alpha de MySQLWorkbench (según la página oficial de DBDesigner su sucesor natural). Las versiones etiquetadas como Alpha no me acostumbran a llamar mucho la atención pero en alguna de las capturas que pude ver me pareció ver una interfaz muy cuidada para ser una versión pre-Beta de la gente de Sun. El reclamo final que me llevó a su instalación era la facilidad con la que supuestamente se podía instalar en mi sistema operativo.

Al final caí y la verdad es que estoy muy contento. Desconozco si existe la gran diversidad de plugins que existía en DBDesigner pero hasta el momento me ha sorprendido mucho su estabilidad (recuerdo que es una versión Alpha) y el gran abanico de opciones para diseñar un correcto esquema de base de datos (hasta ofrece nomenclaturas para algunos campos generados automáticamente). NOTA: Estoy utilizando MySQL Server, que supongo que será el primer beneficiado de las características del programa.

Para diseñar y gestionar una base de datos hace falta tener conocimientos muy amplios sobre el tema pero una ayuda para las tareas más pesadas nunca está de más ;-) Ahora os dejo con las instrucciones para instalarlo en una Ubuntu 8.10 (cómo siempre, no lo he provado en otros sistemas pero es possible que funcione con versiones anteriores de Ubuntu o Debian):

Instalación de MySQL Workbench en Ubuntu 8.10

Pasos:

  • Instalar la librería libctemplate requerida:
    La podeis encontrar aquí. Bajamos el archivo .deb y lo instalamos con el gestor gráfico (GDebi) o con la consola con el comando:
    sudo dpkg -i /ruta/al/archivo/libctemplateXXXXXXX.deb*sustituir por la ruta correcta y la versión de libctemplate adecuada.
  • Añadir a las fuentes de software la siguiente linea:
    deb ftp://ftp.mysql.com/pub/mysql/download/gui-tools/ubuntu/ binary/Con el asistente gráfico o añadiendo la linea al archivo sources.list en /etc/apt/
  • Instalar MySQL Workbench desde el terminal con el comando:
    sudo apt-get install mysql-workbench-oss

Cualquier duda no dudes en dejarla en comentarios!
mysqlwork

, , ,

1 Comment