Black log

Bajo la categoría ‘Sistemas TI’

Importar una base de datos a SQL Azure (I de II)

Escrito por Sergio Sainz el 02-04-2010

En el siguiente post veremos como subir una base de datos local en SQL Server 2008 al servicio SQL Azure.

Existen varias maneras de importar una base de datos a SQL Azure.

1) Mediante los servicios de integración de SQL Server 2008 (SSIS)
2) Usando la utilidad BCP
3) Desde código, usando la clase System.Data.SqlClient.SqlBulkCopy
4) Utilizando wizards o scripts para cargar datos.

En este artículo, utilizaremos la ultima opción.

En SQL Azure no se soporta:

1) Importar mediante un “restore”.
2) Adjuntar la base de datos al servidor SQL Azure.

La primera tarea es crear un servidor SQL Azure y copiarnos el nombre del servidor que nos hará falta para saber a donde tenemos que conectarnos.

Yo he aprovechado para crear una nueva base de datos a la que he llamado “eventos”. Este paso es opcional, ya que como veremos más adelante se pueden crear las bases de datos desde el propio wizard (Hasta 149 por servidor SQL Azure y con un tamaño máximo de 1 GB o 10 GB).

SQL Azure

En la pestaña Firewall Settings tenemos que añadir al menos una regla que permita la conexión desde nuestro equipo, en mi caso tengo 3.

Firewall

Ahora utilizaremos SQL Azure Migration Wizard para migrar la base de datos. La descarga está disponible en CodePlesk. Sólo hay que seguir el asistente, es tan sencillo que con los pantallazos sobran las explicaciones:

SQL Migration Wizard 1SQL Azure Migration Manager 2SQL Azure Migration Manager 3SQL Azure Migration Manager 4SQL Azure Migration Manager 5SQL Azure Migration Manager 6SQL Azure Migration Manager 7SQL Azure Migration Manager 8SQL Azure Migration Manager 9

Si tenemos instalado Microsoft SQL Server Management Studio R2 podemos conectarnos a nuestro servidor SQL Azure (Descarga).

sql2008R2

SQL 2008 Management Studio R2

1 comentario | Archivado como Cloud Computing, Sistemas TI | 02/04/2010

Trabajando con windows azure y php: primer deploy

Escrito por admin el 01-04-2010

Una de las primeras dudas que nos entran a la hora de pensar en Azure es si Azure es algún tipo de instancia virtual, a la que podemos acceder vía escritorio remoto y configurar lo que necesitemos en nuestro servidor.

Azure es un concepto distinto a esto, un planteamiento o paradigma nuevo a la hora de pensar en el alojamiento de nuestras aplicaciones web en internet. Exige en un principio estar abiertos a un cambio, un cambio necesario que se impondrá sin ninguna duda en los próximos años.

Azure es un entorno formado por varios roles a los que subiremos según el tipo de rol de nuestra instancia, nuestra aplicación, nuestra base de datos, nuestros archivos estáticos y nuestros procesos backend. Todo está pensado para ser modular y escalable sin provocar dolores de cabeza al desarrollador. Estos roles se comunicarán entre sí mediante Rest vía Http o sockets TCP/IP. El coste será por horas de servicio y, aunque las instancias estén paradas se seguirán cobrando.

En Windows Azure principalmente tenemos los siguientes roles:

  • Web Role: Destinado a servir aplicaciones web frontales, escritas en .net, php, ruby, perl, python o cualquier lenguaje que soporte Fastcgi.
  • Worker Role: Destinado a servicios que funcionen en el backend, los primeros que se nos vienen a la mente pueden ser mysql o memcached.

Adicionalmente tenemos estos otros servicios en Azure

  • SqlAzure: Una versión de Sql Server 2008 implementada en Azure.
  • Storage: Un repositorio de archivos con el que podremos trabajar desde nuestras aplicaciones web.

En este primer acercamiento me voy a centrar en el WebRole y por la naturaleza de nuestra aplicación web, será de tipo FastCgi para poder ejecutar aplicaciones php.

Para programar en php bajo entorno Microsoft uso Visual Studio 2008 + vs.php o netbeans (en este caso usaré lo primero). Si no usas visual studio, dispones de herramientas que te permiten trabajar de una forma similar pero utilizando Eclipse. Recuerda que si estás en la universidad o has terminado hace poco, existen descargas gratuitas completas de visual studio y horas de servicio Azure en dreamspark.

Lo primero es crear un servicio tipo Windos Azure en el panel de control de la plataforma azure.

azure1

Una vez creado el servicio vemos que disponemos de dos entornos, uno de integración y otro de producción. Nos cobrarán por tener instancias en ambos entornos, estén levantadas o no.

azure2

Para poder trabajar con Azure desde visual studio, nos tenemos que descargar el SP1 y las tools de Azure para Visual Studio que nos permitirán disponer de un entorno basado en IIS similar a azure.

Una vez hecho esto, en Visual Studio podremos seleccionar un tipo de proyecto Windows Azure Cloud Service.

azure3

Tras seleccionar el tipo de proyecto, nos preguntará qué rol vamos a asignar a este proyecto. En nuestro caso al ser una aplicación php, le asignamos el rol WebCGI role.

azure4

Una vez completado este paso, se nos crearán dos proyectos en el árbol de soluciones de Visual Studio y se nos mostrará el contenido del archivos de configuración del WebRole: el Web.roleconfig. Este es un archivo xml tipo al Web.config y en el que aparece entre las llaves fast cgi el siguiente comentario:


<!-- Set the "Enable Full Trust" property to true on the corresponding
 Web Role in the Cloud Service project.
 -->

 <!-- Define the fastCgi application here. The application must be located
 under the role root folder or subfolder. The handler is defined in
 the Web.config file.

 Ensure that all of the handler binaries have their "Build Action" Solution
 Explorer file property set to "Content".

 <application fullPath="%RoleRoot%approotcgi-handler.exe" arguments="arg1 arg2 ..." />
 -->

Nos pide que realicemos las siguientes tareas:

  • Que subamos la aplicación fastCGI encargada de procesar las peticiones a nuestra aplicación. Los binarios de la aplicación deben estar en el directorio raíz de nuestro proyecto (representado por la constante %RoleRoot%approot) y debemos configurar el handler en el web.config de la aplicación.
  • Tenemos que activar la propiedad “Full Trust” en la configuración del WebRole.

Vamos a ello:

1) Primero nos descargamos los binarios o instalamos el msi (te recomiendo lo segundo) la última versión de php en windows.php.net

2) Una vez descargado o instalado php, copiamos sus binarios tal cual al directorio raíz de nuestro proyecto (a un directorio llamado /php). Si has instalado php, normalmente te dejará los binarios en “c:archivos de programaphp”.

3) Si ya tenemos el directorio php en nuestra raíz del proyecto, indicaremos donde se encontrará la aplicación en el Web.roleconfig


<?xml version="1.0"?>

<configuration>
 <system.webServer>
   <fastCgi>
     <application fullPath="%RoleRoot%approotphpphp-cgi.exe" arguments="" />
   </fastCgi>
 </system.webServer>
</configuration>

4) En el web.config descomentamos las líneas dedicadas al Handler FastCgi y las dejamos como siguen:


<add name="FastGGI Handler"
 verb="*"
 path="*.php"
 scriptProcessor="%RoleRoot%approotphpphp-cgi.exe"
 modules="FastCgiModule"
 resourceType="Unspecified" />

5) En las propiedades del Rol WebCgi nos aseguramos que está activada la propiedad Full Trust de .net

azure5

6) Subimos nuestra aplicación php. En este caso, subiré una sencilla aplicación que hará una tirada basándose en el bastante poco óptimo sistema aleatorio de php para otorgarme puntos en diferentes niveles de ataque y defensa.

Después de hacerlo, escribirá el resultado en un archivo de texto pero estará disponible tan sólo de forma temporal. Si quisiéramos almacenarlo de forma persistente, deberíamos almacenarlo en Azure Storage.

El código es el siguiente:


<?php
$poderes = array(
 "resistencia al fuego",
 "resistencia al frio",
 "aguante",
 "formulas de excel",
 "mirada penetrante",
 "escalabilidad",
 "ROI",
 "SEO",
 "SEM",
 "SMO",
 "pensamiento deslumbrante");

$resultado = null;

for($i=1;$i<10;$i++){

 $puntos     = $i*1E2*rand(5,11);
 $poder      = $poderes[rand(0,10)];
 $resultado .= $puntos . " puntos en " . $poder;
 $resultado .= "n";

 echo "Asier ha obtenido " . $puntos . " puntos en " . $poder . "<br/>";

}

$fp = fopen("resultados.txt","w+");
fwrite($fp, $resultado, strlen($resultado));
fclose($fp);

7) Si estamos ejecutando Visual Studio como Administrador podemos compilar el proyecto, sino lo cerramos y ejecutamos Visual Studio con privilegios de Administrador. Una vez compilada la aplicación se nos abrirá nuestro navegador ejecutando nuestra aplicación php.
Por defecto, si no le indicamos un archivo raíz, nos dará un error que nos detalla que no tenemos permiso para listar el directorio raíz.
Para que nos cargue un archivo inicial, podemos agregarle la clave defaultDocument a la configuración system.webServer en el web.config.

<system.webServer>
 <defaultDocument enabled="true">
   <files>
     <add value="index.php"/>
   </files>
 </defaultDocument>

8) Vale en principio tenemos todo funcionando en local, ya que vemos que se ejecuta la aplicación y que escribe las puntuaciones en el archivo de texto.
Ahora necesitamos subir todo esto a Azure.

Si volvemos al panel de control de windows.azure.com, y pulsamos en el botón deploy en el entorno de integración vemos que se nos pide subir dos archivos: El paquete de la aplicación y el archivo de configuraciones.

azure6

Desde Visual Studio podemos generar muy fácilmente estos dos archivos al hacer click en la opción Publicar, que aparece al hacer click en el botón derecho sobre el proyecto de Azure.

Cuando lo hagamos, se nos abrirá la ventana en el navegador del Panel de control de Azure y una ventana en el explorador de windows con la ruta donde se han generado los archivos.

Una vez subidos le damos a Run, e iniciará la instancia. Tarda varios minutos.

Tras la espera podemos ejecutar nuestra aplicación desde la ruta que nos indique el panel de control.

azure8

Hay otras herramientas de las que podemos beneficiarnos al crear aplicaciones en Azure, una de ellas es el gran módulo de rewrite de IIS7 con el que podemos utilizar urls amigables en nuestras aplicaciones web.

Vamos a hacer que nuestra aplicación otorgue le de poderes a un usuario que le indiquemos por url.

Para ello tenemos que añadir una regla de rewrite en el web.config, dentro de system.webserver, en la que le indiquemos por la ruta /user/[nick] se le pasará como parámetro GET al script index.php.


<rewrite>
  <rules>
    <rule name="Rewrite">
       <match url="^user/([a-z]+)" />
      <action type="Rewrite" url="index.php?user={R:1}" />
    </rule>
  </rules>
</rewrite>

En la aplicación recuperamos el parámetro GET. Tendríamos el siguiente código en el index.php


<?php
$poderes = array(
  "resistencia al fuego",
  "resistencia al frio",
  "aguante",
  "formulas de excel",
  "mirada penetrante",
  "escalabilidad",
  "ROI",
  "SEO",
  "SEM",
  "SMO",
"pensamiento deslumbrante");

$resultado = null;

$usuario = "asier";
if(!empty($_GET) && is_array($_GET) && key_exist("user", $_GET)){
  $usuario = ucfirst($_GET["user"]);
}

for($i=1;$i<10;$i++){

  $puntos     = $i*1E2*rand(5,11);
  $poder      = $poderes[rand(0,10)];
  $resultado .= $puntos . " puntos en " . $poder;
  $resultado .= "n";

  echo $usuario . " ha obtenido " . $puntos . " puntos en " . $poder . "<br/>";

}

$fp = fopen("resultados.txt","w+");
fwrite($fp, $resultado, strlen($resultado));
fclose($fp);

Una función que me resulta imprescindible también es poder visualizar los logs de nuestra instancia y podemos hacerlo desde el panel de control de Azure y una cuenta de storage.

Con esto hemos visto como ejecutar aplicaciones web sencillas php en Azure, en las próximas entregas veremos como usar los Worker Roles, SQL Azure y cómo trabajar con phpazure para almacenar y recuperar archivos en Azure Storage.

Cosas que he echado en falta

Entre las cosas que he echado en falta, y desconozco por ahora si Azure es las permite de forma nativa o con herramientas de terceros pueden ser las siguientes:

  • Un módo más ágil para hacer deploy de nuestras aplicaciones. Los desarrolladores web php estamos acostumbrados a usar subversion o rsync para hacer deploy de nuestras aplicaciones. El hecho de tener que generar un paquete y luego subirlo, es un paso que estaría genial si se automatizase. Lo más lógico podría ser que desde la opción publicar de visual studio se subiesen los cambios al entorno de integración de azure o al menos, a Azure Storage para que luego se haga el deploy definitivo con un botón desde el panel de control web de azure.
  • Posibilidad de personalizar el directorio público a la que se tendrá acceso desde el servidor web. En algunos frameworks como Symfony, el directorio público no es el directorio raíz de la aplicación por seguridad.
  • Algún modo para gestionar los permisos de los directorios de la aplicación. No es para nada seguro tener permisos de escritura en todos los directorios de nuestra aplicación.
  • Posibilidad de ejecutar scripts php o powershell vía cmd en la instancia. Imaginemos que necesitamos vaciar un directorio en el que almacenamos archivos de caché o archivos temporales, podemos hacerlo mediante algún script que se ejecute vía web, pero igual puede interesarnos realizar estas gestiones o alguna otra mediante línea de comandos.

5 comentarios | Archivado como Cloud Computing, Desarrollo web, Sistemas TI | 01/04/2010

Conectar desde php a SQL Azure. Problemas con MARS

Escrito por admin el 31-03-2010

Por defecto y desde su versión 1.1, el driver oficial para trabajar con sql server 2005 o superior desde php realiza conexiones con marte MARS (Multiple Active Result Sets) activado.

Actualmente SQL Azure no soporta MARS, y para que nuestra conexión no fuerce la activación de esta funcionalidad en SQL Server tendremos que indicarle en el array de conexión lo siguiente:


$BD_SERVER = "[TOKEN].database.windows.net";
$BD_CONECTION_INFO   = array(
                              "UID"=>"blackslot@[TOKEN]",
                              "PWD"=>"P@ssw0rd",
                              "Database"=>"nombre_bd",
                              "ReturnDatesAsStrings"=> true,
                              "CharacterSet" => 'utf-8',
                              //Aquí desactivamos MARS
                              'MultipleActiveResultSets'=> false);

1 comentario | Archivado como Cloud Computing, Desarrollo web, Sistemas TI | 31/03/2010

Desde hace algunos años, sobre todo desde que fué publicada la versión 2005 de Sql server, el driver  que se facilita en los paquetes de php por defecto está considerado deprecated y no desaconseja su uso.

En su lugar por suerte disponemos de php_sqlsrv, una extensión creada desde Microsoft con la que podemos aprovechar de una forma mucho más avanzada este expléndido motor de bases de datos.

Traducción nativa de los datos a utf-8

Por empezar a comentaros, una de las características que más me han gustado en la versión 1.1 de este driver, es la traducción nativa y transparente de la codificación de los datos desde utf-8 a ucs-2 y viceversa.

Para quien haya tenido un mínimo de experiencia desarrollando aplicaciones en internet, la importancia de usar codificación UTF-8 es clave, nos puede evitar pasar varias noches sin dormir al encontrarnos multitud de problemas al integrar aplicaciones, consumir datos de fuentes externas o migrar a otras plataformas.

Es un detalle que los desarrolladores de esta librería le hayan dado prioridad a esta caracteristica vital para desarrolladores de aplicaciones php.

Para activar esta característica, os recomiendo que lo hagaís, basta con especificar el enconding en el array de conexión:

$params =  array(

"UID"  => "usuario",
"PWD"   => "password",
"Database" => "base_de_datos"

);

$params["CharacterSet"] = "utf-8";
$conexion = sqlsrv_connect( "nombre_de_la_instancia", $params);

Campos de tipo fecha recuperables como cadenas

Por defecto el driver nos permite recuperar los datos de tipo datetime, Date, Time, DateTime2 y DateTimeOffset como datos DateTime. Normalmente nos puede interesar más tratarlos como si fuesen cadenas desde php y para ellos, el driver nos provee de una forma de hacerlo.

Basta con inidicarlo en el array de conexión:

$params =  array(

"UID"  => "usuario",
"PWD"   => "password",
"Database" => "base_de_datos",
"CharacterSet" => "utf-8"

);

$params["ReturnDatesAsStrings"] = true;

$conexion = sqlsrv_connect( "nombre_de_la_instancia", $params);

Autenticación de sistema o de usuario de Sql Server

A la hora de conectarnos a una instancia, podemos hacerlo mediante autenticación de sistema o de usuario de Sql Server según esté establecido en la configuración de la instancia.

Aunque para una aplicación web, especialmente una aplicación que tenga como destino dar servicio en internet, nos interese aplicar una autenticación de usuario de Sql Server, el driver dispone de soporte nativo para reconocer el usuario con el cual estamos ejecutando la aplicación web y usar sus credenciales para realizar la autenticación.

Para realizar una autenticación de sistema no necesitamos indicar usuario ni contraseña, tan sólo la base de datos:

$params =  array("Database" => "base_de_datos");

$conexion = = sqlsrv_connect( "nombre_de_la_instancia", $params);

Limpieza de parámetros en las consultas

Uno de los puntos más vulnerables en una aplicación web siempre ha sido la forma en la que realizamos las consultas a la base de datos.

Para ayudarnos a securizar los datos que interoducimos en las consultas, disponemos de un mecanismo muy sencillo de limpieza.

$sql =  "INSERT INTO usuarios (email, password) VALUES (?,?);";

//creamos el array de parámetros
$params = array(strtolower($email),md5($pass));

//realizamos la consulta, pasándole los parámetros a blindar
$stmt = sqlsrv_query( $conexion, $sql, $params);

Instanciación de objectos específicos en los resultados de una consulta

Otra opción muy útil que nos provee el driver es la posibilidad de especificar un objeto que será instanciado como resultado de una query.

class User{
 public $object_id= null;
 public $user_id  = null;
 public $email    = null;
 public $password = null;

 public function __construct($id){
   $this->object_id = $id;
 }

}

$sql =  "SELECT TOP 1 user_id,email FROM users WHERE user_id = ? ";

$stmt = sqlsrv_query( $conexion, $sql, array($user_id));

if($stmt!==false){

 $i=0; $items = array();

 //cada variable $object será una instancia del objeto User
 while( $object = sqlsrv_fetch_object( $stmt, "User", array($i)))
 {
  $items[] = $object;
  $i++;
 }

 sqlsrv_free_stmt($stmt);
 $stmt=null;
}

Constantes para la conversión de tipos php a tipos nativos de Sql Server

En algunos casos necesitamos convertir el parámetro al tipo de dato nativo de sql server que necesitemos evaluar en la consulta, como es el caso de los tipos DateTime.

Para ello el driver dispone de una serie de constantes que nos ayudan a hacerlo.

$sql =  "SELECT user_id FROM usuarios WHERE created_at >= ? AND user_id < ?;";

//creamos el array de parámetros, cada elemento será un array en el que especifiquemos la constante del tipo que necesitamos
$params = array(array($date, null, null, SQLSRV_SQLTYPE_DATETIME), array($user_id,null));

//realizamos la consulta, pasándole los parámetros a blindar
$stmt = sqlsrv_query( $conexion, $sql, $params);

Otras opciones interesantes que he echado en falta

Soporte para PDO.

PDO es una capa de abstracción cuyo objetivo principal es aislarnos de las particularidades de cada driver disponible para atacar los diferentes motores de bases de datos que existen.

Muchos ORMs como doctrine y Propel lo usan, no disponer de soporte para PDO supone una barrera para algunso de los CMS o Frameworks más usados y un trabajo adicional para los desarrolladores a la hora de necesitar utilizar sql server en sus proyectos. Irónicamente, el antiguo driver a pesar de estar obsoleto soporta PDO.

Posibilidad de usarlo como un Objeto

Se agradece ir abandonando poco a poco el paradigma estructurado en php y algunas librerías como mysqli, nos permiten usarlas como si se tratase de un objeto.

Sería una muy buena característica para este driver.

4 comentarios | Archivado como Desarrollo web, Sistemas TI | 30/03/2010

WordPress: mysql y soluciones de cache

Escrito por admin el 26-02-2010

Hace algunos días me resultó interesante el debate que se formó en torno a un post en Loogic, en el cual se hablaba de la problemática de tener cuello de botella en el backend de base de datos de una aplicación web.

Desde nuestra experiencia podemos decir que no es tanto culpa de la base de datos el que ocurran estos problemas, sino de la programación en la aplicación web o una mala o desatendida gestión en la base de datos y configuración del servidor.

En muchas ocasiones se suele comentar que un cms tiene una muy mala gestión de consultas sobre la base de datos que utiliza, que abusa de ellas o incluso que hace auténticas chapuzas. En algunos casos puede ser cierto, en otros como en el caso de WordPress mayormente esas afirmaciones radican en un desconocimiento técnico en cómo funcionan realmente esta herramienta y qué cuidados requiere las misma.

WordPress

Si bien es cierto que podemos ahorrarnos muchas consultas a la base de datos desde WordPress evitando el uso de algunas de sus Template Tags (funciones que ayudan a crear themes) o plugins que hacen consultas que wordpress ya hace previamente desde su core, esto puede ser totalmente ineficaz si por ejemplo no tenemos especial cuidado en la gestión de la base de datos.

Deshabilitar el motor innodb o los logs del servidor pueden ahorrarnos mucha carga en el servidor, pero no nos libra de tener que hacer una optimización en los valores de query_cache por ejemplo.

Es importante también prestar especial atención en la actualización del propio cms, ya que puede efectuar cambios en el esquema de base de datos, pero mantener funcionalidad obsoleta por compatibilidad, especialmente con plugins o funciones que se puedan seguir usando.

Plugins como WP SuperCache, basado en WP Cache 2 de Gallir (en el antiguo blog de Gallir encontramos una descripción de cómo funciona y actúa WP-Cache 2), son imprescindibles para reducir los accesos de datos a mysql. Pero en algunos casos hemos encontrado problemas debido a malas actualizaciones de WordPress que se llevaban arrastrando varias versiones atrás.

En un caso concreto nos hemos peleado con algún wordpress que hacía consultas antes de lanzar la acción init, que es la acción que activa plugins como WP SuperCache. Esto hacía ineficaz toda posibilidad de cacheo a través de plugins.

Podríamos evitar esta situación cacheando todo el sitio en archivos estáticos html, en memoria a través de módulos memcached a nivel de servidor web, usando sistemas de proxy caché tipo Squid o infinidad de soluciones más. Personalmente creo que este tipo de cosas hay que hacerlas después de asegurarse que la parte de la aplicación web está optimizada o al menos no abusa demasiado de la base de datos. Más que nada porque este tipo de soluciones conllevan una serie de costes asociados, por ejemplo si optamos por cachear todo a disco necesitaremos, en sitios web con medio o alto tráfico, disco SAS a 10k o 15k revoluciones para evitar los cuellos de botella que tendríamos con discos SATA. Muchos proveedores venden esto como “un servidor más grande”, nosotros preferimos abordarlo de otra forma. Evidentemente tiene más sentido optar por soluciones basadas en memoria, como memcached, pero no disponemos de estas opciones en todos los entornos.

Hay otras situaciones en las que un sólo plugin puede ser el culpable de problemas de rendimiento. Muchas veces se confía demasiado en el buen hacer de los desarrolladores de plugins muy utilizados como el All In One Seo Pack, que resulta no ser tan óptimo como cabría esperar.

Nosotros en Blackslot empezamos por hacer un diagnóstico de la aplicación web, en el caso de basarse en wordpress limpiar el theme y el sitio web de funciones y plugins desactualizados, comprobar el buen estado de la base de datos para el CMS en cuestión, desarrollar plugins o themes que utilicen la última versión de la api y si fuese necesario buscar soluciones a nivel de sistema que mejoren el rendimiento de la aplicación.

Estas soluciones pueden ser desde realizar optimizaciones del servidor web y la base de datos, implantar soluciones de cache en memoria, opcode cache para php, distribuir el contenido estático del blog entre varios servidores o servicios de terceros (cloud o no, dependiendo de los requisitos del cliente) hasta soluciones más avanzadas para sitios web de gran cantidad de datos y tráfico.

No siempre una solución puede ser la cura a todas las enfermedades. Se suele escuchar por ejemplo que un tipo de motor de almacenamiento en mysql frente a otro, como el caso de myisam frente a innodb, es más rápido en lectura pero esto no siempre es así. También se pueden ver casos como que una solución memcached de menos rendimiento que algún otro tipo de servidor de base de datos, o frecuentemente que cachear en disco penalice mucho más que almacenar en la base de datos. No se pueden tratar todos los casos por igual en problemas de rendimiento web.

Por lo general hemos tenido alguna experiencia con clientes que teniendo un servidor dedicado saturado con prestaciones no precisamente moderadas, hemos podido migrarles a uno de nuestros servidores HyperV R2 con Linux ahorrándose, con sólo algunos cambios en su cms y últimas versiones en tecnologías de servidor, bastante dinero en hardware al mes.

1 comentario | Archivado como Desarrollo web, Nuestros servicios, Sistemas TI | 26/02/2010

En las versiones de openSuse x64 me he encontrado con que el SFTP no funciona correctamente, debido a un problema en la configuración del sshd_config. El error que se obtiene al intentar acceder al servidor es el siguiente:


sshd[25558]: error: subsystem: cannot stat /usr/lib/sftp-server: No such file or directory


La solución es tan sencilla como localizar donde se encuentra el archivo “sftp-server” y corregir la ruta en el sshd_config.

Para localizar el archivo:


find / -name sftp-server

En mi caso está en /usr/lib64/ssh/sftp-server

Para arreglarlo basta con hacer un enlace simbólico al archivo


ln -s /usr/lib64/ssh/sftp-server /usr/lib/sftp-server

O localizar la siguiente línea en el sshd_config y corregirla:


Subsystem sftp /usr/lib/sftp-server

Finalmente hay que reiniciar el servicio sshd y problema solucionado.

Comentarios desactivados | Archivado como Sistemas TI | 15/02/2010

Plesk 9.x rompe Yast2

Escrito por Sergio Sainz el 12-02-2010

He confirmado que al instalar Plesk 9.3 sobre openSuse, al tratar de ejecutar Yast2 fallará su ejecución:

# yast
//sbin/yast: line 27: //lib/YaST2/bin/yast2-funcs: No such file or directory
//sbin/yast: line 250: set_lang_from_sysconfig: command not found
//sbin/yast: line 279: check_ncurses: command not found
package yast2-qt is not installed
package yast2-gtk is not installed
Something is wrong with the YaST user interface.

El problema es que Plesk modifica $PATH añadiendole de forma incorrecta una doble barra. Basta con quitarla y comprobar que ya funciona.

export PATH=/sbin:/bin:/sbin:/usr/sbin:/usr/local/sbin:/root/bin:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/usr/games:/usr/lib/mit/bin:/usr/lib/mit/sbin

Obviamente, lo anterior sólo solucionará el problema mientras tengamos la sesión abierta. Para que se conserven los cambios, lo mejor, meterlo en el .bashrc.

echo 'export PATH=/sbin:/bin:/sbin:/usr/sbin:/usr/local/sbin:/root/bin:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/usr/games:/usr/lib/mit/bin:/usr/lib/mit/sbin' >> ~/.bashrc

Es un bug que afecta a las versiones 9.0, 9.1, 9.2 y 9.3 de Plesk. Espero que en la próxima actualización quede por fin arreglado.

Comentarios desactivados | Archivado como Sistemas TI | 12/02/2010

Virtualizando SQL Server 2008 sobre Hyper-V R2

Escrito por Sergio Sainz el 10-02-2010

Unos rápidos apuntes a tener en cuenta a la hora de virtualizar un entorno SQL Server.

Discos:
- De espacio fijo: En SQL Server es muy importante el I/O de los volúmenes con los que se trabaja, por ello la recomendación es utilizar siempre discos fijos.
- Controladora SCSI: Al igual que sucede en entornos físicos, en virtual sólo podremos colocar hasta 4 discos IDE, por lo que si necesitamos más discos lo mejor es utilizar un bus SCSI.
- Usar varios VHD: Es decir, uno para el propio sistema y los archivos de instalación de SQL, otro para tempdb, otro para los logs, otro para los datos… Esto al igual que en un entorno real permite mejorar el I/O, sobre todo si disponemos de una cabina y dedicamos discos separados (spindles) o LUN para mejorar aún más el I/O. Aún cuando no dispongamos de discos separados sigue siendo recomendable utilizar diferentes VHDs.
- Sistema de archivos: NTFS con unidad de asignación a 64 K para obtener mejor rendimiento.

Red:
- Importante que la red sea Gigabit y la velocidad esté configurada en full-duplex.
- Siempre usaremos los adaptadores sintéticos que usan los Servicios de Integración instalados en la VM para funcionar, ya que ofrecen mucho mejor rendimiento que los emulados, los cuales sólo son útiles por razones de compatibilidad en sistemas que no soportan los Servicios de Integración (anteriores a MS Windows Server 2003 R2, kernels de linux no soportados, etc…).
- Si es posible usar teaming para mejorar el rendimiento y ofrecer redundancia, sobre todo para conexiones a una cabina vía iSCSI.

Memoria:
La memoria se comporta exactamente igual que en una máquina física, a diferencia de otros hypervisores en Hyper-V no se permite el sobreuso (aunque MS ya está trabajando en ello) por lo que la cantidad asignada a una VM se reserva en el anfitrión por completo. Es importante dejar al propio nodo anfitrión 2 GB libres para el sistema y sus tareas.

1 comentario | Archivado como Sistemas TI | 10/02/2010

Restablecer la contraseña de Mailman

Escrito por Sergio Sainz el 15-01-2010

Si has olvidado la contraseña de administrador de mailman, puedes restablecerla desde:

$MAILMAN_ROOT_D/bin/mmsitepass

Pd: Si usas Plesk, puedes localizar la ruta $MAILMAN_ROOT_D como hemos comentado aquí.

Comentarios desactivados | Archivado como Sistemas TI | 15/01/2010

Puede resultar muy útil para saber dónde está cada cosa y conocer las distintas variables de Plesk. Sobre todo, si gestionais diferentes entornos y no es posible una configuración homogénea entre ellos.


# cat /etc/psa/psa.conf

#
# (c) Copyright 1999-2008 Parallels
# All Rights Reserved
#
# This file is used to declare the location of different utilities,
# services, and/or packages within Plesk.  No changes should be made
# to this file without first consulting support. Any changes made can
# affect service availability and performance.
#
# Each line in this file follows the following format:
#
# variable [whitespace characters] value
#
# That is, the name of the field, followed by spaces or tabs, followed
# by field value. Trailing spaces are removed.
#

# Plesk tree
PRODUCT_ROOT_D /usr/local/psa

# Directory of SysV-like Plesk initscripts
PRODUCT_RC_D /etc/init.d

# Directory for config files
PRODUCT_ETC_D /usr/local/psa/etc

# Directory for service utilities
PLESK_LIBEXEC_DIR /usr/lib64/plesk-9.0

# Virtual hosts directory
HTTPD_VHOSTS_D /srv/www/vhosts

# Apache configuration files directory
HTTPD_CONF_D /etc/apache2

# Apache include files directory
HTTPD_INCLUDE_D /etc/apache2/conf.d

# Apache binary files directory
HTTPD_BIN_D /usr/bin

#Apache log files directory
HTTPD_LOG_D /var/log/apache2

#apache startup script
HTTPD_SERVICE apache2

# Qmail directory
QMAIL_ROOT_D /var/qmail

# Location of qmail maildirs
PLESK_MAILNAMES_D /var/qmail/mailnames

# Path to rblsmtpd
RBLSMTPD /usr/sbin/rblsmtpd

# Courier-IMAP
COURIER_IMAP_ROOT_D /

# Proftpd
FTPD_CONF /etc/proftpd.conf
FTPD_CONF_INC /etc/proftpd.include
FTPD_BIN_D /usr/bin
FTPD_VAR_D /var/run/proftpd
FTPD_SCOREBOARD /var/run/proftpd/scoreboard

# Bind
NAMED_RUN_ROOT_D /var/lib/named
NAMED_OPTIONS_CONF /etc/named.conf.include.plesk-options
NAMED_ZONES_CONF /etc/named.conf.include.plesk-zones

# Webalizer
WEB_STAT /usr/bin/webalizer

# Logrotate
LOGROTATE /usr/local/psa/logrotate/sbin/logrotate

# MySQL
MYSQL_VAR_D /var/lib/mysql
MYSQL_BIN_D /usr/bin

# PostgreSQL
PGSQL_DATA_D /var/lib/pgsql/data
PGSQL_BIN_D /usr/bin

# Backups directory
DUMP_D /var/lib/psa/dumps

# Mailman directories
MAILMAN_ROOT_D /usr/lib/mailman
MAILMAN_VAR_D /var/lib/mailman

# Python binary
PYTHON_BIN /usr/bin/python2.6

# Tomcat root directory
CATALINA_HOME /usr/share/tomcat6

# DrWeb
DRWEB_ROOT_D /opt/drweb
DRWEB_ETC_D  /etc/drweb

# GnuPG binary
GPG_BIN /usr/bin/gpg

# Tar binary
TAR_BIN /bin/tar

# AWStats
AWSTATS_ETC_D /etc/awstats
AWSTATS_DOC_D /usr/share/apache2/icons/awstats

# openssl binary
OPENSSL_BIN /usr/bin/openssl

LIB_SSL_PATH /lib/libssl.so
LIB_CRYPTO_PATH /lib/libcrypto.so

CLIENT_PHP_BIN /usr/local/psa/bin/php-cli
CGI_PHP_BIN /usr/bin/php-cgi5
AWSTATS_TOOLS_D /usr/share/doc/packages/awstats/tools
AWSTATS_BIN_D   /srv/www/cgi-bin

1 comentario | Archivado como Sistemas TI |

Buscar






Entradas recientes

Comentarios recientes

Categorías

Tag Cloud

Archivos