Pelicula revolution OS…. bastante buena
Si ya te metiste en linux… te agradara esta pelicula.
Si ya te metiste en linux… te agradara esta pelicula.
No hay nada como esto el libro de Esencialidades de slackware
Este libro lo lei en ingles hace mas de 10 años….. esta bastante bueno…. si comprendes slackware a la perfeccion entonces, comprendes todas las demas distros.
Ahora resulta que soy experto en la base de datos open source de sun.. ?
Jamas pense que algo asi pudiece pasar con mysql….. a lo mejor tu si lo pensaste(con un porrito en mano..)….
Antes de implementar un mysql cluster… le di un vistazo a este video…… bastante enriquecedor…
Si deseas ver el video con subtitulos… que tambien estan solo en ingles checa la siguiente url
Sintesis de esta platica segun yo :p :
* Se habla de las nuevas caracteristicas agregadas a el engine cluster de mysql 5 que ya existia en la version 4 de mysql.
* Se habla de que los indices de momento se siguen manejando en memoria… pero la intension de manejarlos en disco saldra en el siguiente release (recuerden que sun ahora tomo cartas en el asunto).
* La memoria puede ser spliteada, esto quiere decir que un monto de datos de 10gb entre dos maquinas corresponderia a 5 gb manejados por cada maquina. Y cada maquina tendria una copia completa de los datos.
* Permite respaldos en caliente (”sin parar la base de datos“). al estilo del engine myisam….. que a muchos no les gusta, ya que no tiene integridad referencial… pero recordemos que no requiere compactacion de datos… y eso es fabuloso.
* Mysql cluster ofrece alta disponibilidad… esto quiere decir… que se recupera ante cualquier falla.
* Se habla de que es posible tener un cluster de mysql con diskless
* Se recalca que no requerimos sistemas de almacenamientos caros para un cluster de mysql (si usas bastantes nodos….)(en lo personal te recomiendo que si tienes los medios uses host bus adapter)
* Se recomienda tener el nodo mysql sobre una red aparte con su propio hub para garantizar la buena comunicacion entre nodos del cluster
* Tus aplicaciones podran accesar al cluster de mysql con la misma libreria que accesan ahora al mysql que no esta en modo cluster.
* El cluster de mysql tambien puede ser replicado
* Los nodos del cluster mysql, podran ser agrupados en “grupos” y cada grupo tomar una seccion de la base de datos.
* Existen nodos de almacenamiento, nodos API y nodos de administracion (estos ultimos pueden distribuir la informacion del cluster entre ellos….y no tienen que ser equipos realmente poderosos)
* Para un cluster mysql un nodo… es solo un proceso…capichi!…. entre mas nodos… mas procesos trabajando y eficientando al cluster en general
* No es posible agregar nodos online al cluster mysql aun…… (tienes que parar todo si quieres sustituir un nodo con falla… esperemos que en nuevas realeases se pueda agregar nodos online.)
* Lo posito es que cuando una falla ocurre todos los nodos del cluster son avisados. Y entonces se toman medidas para procesar el trabajo de manera diferente. Si alguna aplicacion cliente estubiece realizando una transaccion durante un momento donde ocurriece una falla, esta transaccion no sera valida y se desbaratara, por lo que el cliente tendra que realizarla de nuevo. De esta manera se evitan los famosos DEADlock (saludos profesor carrete… del tecnologico de durango… ahi comprendi ese concepto.)
* Sobre un mysql cluster puedes hacer VISTAS, PROCEDIMIENTOS ALMACENADOS, TRIGGERS, que actuen sobre las tablas del cluster. Solo que estos deberan ser definidos en cada nodo del cluster.
* Existe en mysql cluster actual 2 o 3 veces mas rendimiento de lo que habia en la version de mysql cluster anterior.
Anexo el siguiente material para los que deseen iniciar con Ruby sobre rieles y esten usando las distribucion Ubuntu gutsy.
Leccion 1 de rails sobre ubuntu gutsy
Leccion 2 de rails sobre ubuntu gutsy
Aclaracion… no existe una leccion 3 o una 4… esto es todo…. no es la guia mas completa… pero te ayuda a iniciar rapido de manera practica.
El mecanismo que permite a Xen tener más poder que el sistema operativo controlando los recursos a los cuales
este puede acceder, se llama “paravirtualización”. Aqui dejo una guia de como se implemento en centos 5.
Python script que recoge estadísticas de carga sobre un sistema linux 2.4 y 2.6, este script no es intrusivo. Y no requiere ser programado dentro de cron.
#!/usr/bin/python
import os, sys , commands, time , re
#Necesario en Python 1.5
import string
##################################
# Script: recolector.py #
# Escrito por: Edwin Plauchu #
# mailto: j4nusx@gmail.com #
# 28 / feb / 2007 #
##################################
DATE = str(time.localtime(time.time())[0:6][0]) + "-" + str(time.localtime(time.time())[0:6][1]) + "-" + str(time.localtime(time.time())[0:6][2])
RECOLECTOR_LOG_FILE_PATH = "/var/log/recolector-"+ DATE + ".log"
INTERVAL_SEG = 3
def LoadAverage():
file = open( '/proc/loadavg' )
lines = file.readlines()
for line in lines:
return string.split( line , " ")[0:3]
def UsedMemoryInMegaBytes():
file = open( '/proc/meminfo' )
lines = file.readlines()
mem_total = 0
mem_free = 0
expression_for_mem_total = re.compile( r"MemTotal:" )
expression_for_mem_free = re.compile( r"MemFree:" )
for line in lines:
if expression_for_mem_total.search( line ):
mem_total = int(string.split(string.split( line , ":")[1],"kB")[0])
if expression_for_mem_free.search( line ):
mem_free = int(string.split(string.split( line , ":")[1],"kB")[0])
return {'USED':( (mem_total - mem_free) / 1024 ) , 'FREE':(mem_free/1024) }
def CapturaEnLog( file_absolute_path = "/tmp/recolector.log" , string_to_add = None ):
now = time.localtime(time.time())[0:6]
fecha_formateda = str(now[3]) + ":" + str(now[4]) + ":" + str(now[5])
fichero_log = open(file_absolute_path, 'a' )
if string_to_add:
fichero_log.write( fecha_formateda + "," + string_to_add + "\n")
fichero_log.close()
def CpuStat():
file = open( '/proc/stat' )
lines = file.readlines()
expression_for_cpu_sigma = re.compile( r"^cpu " )
for line in lines:
if expression_for_cpu_sigma.search(line):
line = line[5:]
line = string.split(line," ")
return {'USER': int(line[0]), 'NICE': int(line[1]), 'SYSTEM':int(line[2]) , 'IDLE':int(line[3]), 'IOWAIT':int(line[4]), 'IRQ':int(line[5]), 'SOFTIRQ':int(line[6])}
def SigmaJiffies( diccionario = {}):
total_jiffies = 0
for key in diccionario.keys():
total_jiffies = total_jiffies + diccionario[key]
return total_jiffies
def DeltaTime(interval):
x = CpuStat()
time.sleep(interval)
y = CpuStat()
for key in x.keys():
y[key] = x[key] - y[key]
return y
def main():
while "Hasta el final de los tiempos":
dt = DeltaTime(INTERVAL_SEG)
sum_jiffies = SigmaJiffies(dt)
cpu_user_pct = (dt['USER'] * 100.00 / sum_jiffies)
nice_user_pct = (dt['NICE'] * 100.00 / sum_jiffies)
system_pct = (dt['SYSTEM'] * 100.00 / sum_jiffies)
idle_pct = (dt['IDLE'] * 100.00 / sum_jiffies)
iowait_pct = (dt['IOWAIT'] * 100.00 / sum_jiffies)
irq_pct = (dt['IRQ'] * 100.00 / sum_jiffies)
softirq_pct = (dt['SOFTIRQ'] * 100.00 / sum_jiffies)
data = str('%.4f' %cpu_user_pct) + "," +str('%.4f' %nice_user_pct) + "," +str('%.4f' %system_pct) + "," +str('%.4f' %idle_pct) + "," +str('%.4f' %iowait_pct) + "," +str('%.4f' %irq_pct) + "," +str('%.4f' %softirq_pct) + "," + str(UsedMemoryInMegaBytes()['USED'])
CapturaEnLog( RECOLECTOR_LOG_FILE_PATH , data )
if __name__ == "__main__":
sys.exit( main() )
Tipo de Salida Generada
La forma de interpretar los datos mostrados a continuacion es la siguiente:
HORA,USER,NICE,SYSTEM,IDLE,IOWAIT,IRQ,SOFTIRQ,USEDMEMORY(MB),LOADAVERAGE
10:10:37,0.8306,-0.0000,0.4983,98.5050,0.1661,-0.0000,-0.0000,734,0.19 10:10:40,6.0403,-0.0000,0.5034,93.4564,-0.0000,-0.0000,-0.0000,734,0.17 10:10:43,5.3422,-0.0000,0.3339,94.3239,-0.0000,-0.0000,-0.0000,736,0.16 10:10:46,1.6667,-0.0000,0.3333,97.8333,-0.0000,0.1667,-0.0000,736,0.16 10:10:49,2.3372,-0.0000,0.5008,96.9950,-0.0000,0.1669,-0.0000,736,0.15 10:10:52,2.3609,-0.0000,0.6745,96.9646,-0.0000,-0.0000,-0.0000,736,0.15 10:10:55,0.1656,-0.0000,-0.0000,99.6689,-0.0000,0.1656,-0.0000,736,0.21 10:10:58,0.5008,-0.0000,0.1669,99.3322,-0.0000,-0.0000,-0.0000,736,0.20 10:11:1,0.4992,-0.0000,0.1664,99.3344,-0.0000,-0.0000,-0.0000,736,0.20 10:11:4,-0.0000,-0.0000,0.1669,99.8331,-0.0000,-0.0000,-0.0000,736,0.18 10:11:7,1.3333,-0.0000,-0.0000,98.6667,-0.0000,-0.0000,-0.0000,736,0.18 10:11:10,1.0050,-0.0000,0.1675,98.8275,-0.0000,-0.0000,-0.0000,736,0.17
Se genera un fichero log por dia sobre la carpeta /var/log/
Tal vez no comprendas los datos arrojados por este script… asi que anexo la siguiente liga que lo explica…..
http://www.linuxhowtos.org/System/procstat.htm
Procesando Argumentos
import sys
# argv es una lista de cadenas que contiene parametros de la linea de comandos
# argv[0] sera siempre el nombre del comando invocado
for arg in sys.argv:
print arg
argc = len(sys.argv)
fork –Creando procesos hijo
import os
# fork crea proceso hijo. Returna 0 en
# caso de exito y -1 en caso de falla.
if os.fork() == 0:
print "in child"
else:
print "in parent"
La funcion exec
import os
# Lanza proceso translapados... pero hace que nuestro script finalice
# familia de funciones exec:
# Estas versiones requieren el path completo hacia el ejecutable
# execl(pathToProg, arg0, arg1, arg2, ...)
# execv(pathToProg, argList)
# Estas dos buscaran el programa en el actual PATH
# execlp(prog, arg0, arg1, arg2, ...)
# execvp(prog, argList)
os.execl("/bin/more", "more", "foo.txt")
os.execvp(sys.argv[0], sys.argv)
sleep - esperando un poquito
import time
# sleep(n) pone el proceso a dormir por n segundos.
time.sleep(10)
exit - Salir
import sys
sys.exit(0)
wait
import os
# waits (sleeps) for child to terminate, returns pid and status
pid, status = wait() # no arguments, returns a pair of values
print "Returned status:", status/256
getpid
El identificador de proceso
import os
myId = os.getpid()
Después de leer la queja de un usuarios aun windowizado, y las respuestas un tanto agresivas. Creo que es necesario reconocer que debmos aceptarlo, es una pesadilla lidiar con “dependeincas y librerias”. Mejor informo de una técnica para solucionar este problema.
En linux se puede hacer todo, pero luego las herramientas “automágicas”, nos “nublan la visión y el fuente no es lo suficientemente explícito”. Así que si alguna vez han tenido broncas de librerías no resueltas, quizás ésto les pueda ayudar…
El uso de las librerías, te permite que, si tu programa necesita o quieres que maneje llaves de encriptación, simplemente “usas las funciones que te da el openssh”. Así no tienes que “programar” el openssh tú solito. Nada más lo usas y eso te da, reduccion de tiempo de desarrollo, una mayor calidad del software y menores costos. El problema radica en que el sistema “objetivo”, es decir nuestra maquina, no satisfaga esas dependencias, y entoces el baile y dolor de cabeza comienza. Así que aquí van un par de aspirinas para eso.
Debian, Red Hat, y sus derivados, no hacen la detección de las librerías, “automágicamente”. Linux provee un mecanismo con el cual uno puede saber que librerías requiere un programa, y si las tenemos o no.
Para hacer las cosas “optimas”, linux maneja un caché de librerías.
Este caché de librerías, es controlado por la aplicación “ldconfig”, y su archivo de configuración es ld.so.conf, el cual se encuentra en /etc.
Por lo tanto, tenemos:
Archivo de configuración de las librerías: /etc/ld.so.conf
Archivo que manipula el caché de las liberías: ldconfig
Con ésto, ya tenemos una primera idea de quien maneja la “disponibilidad” de las librerías. Ahora el problema es saber qué librerías usa un programa.
Simple, para eso está el comando ldd, el cual nos dice qué programa usa cual libreriá.
Ejemplo (andi pue’, ¡hasta con ejemplo!).
bash-2.05a$ which nslookup
/usr/bin/nslookup
bash-2.05a$ ldd /usr/bin/nslookup
libdns.so.5 => /usr/lib/libdns.so.5 (0×40021000)
libcrypto.so.0 => not found
libisc.so.4 => /usr/lib/libisc.so.4 (0×4010b000)
libnsl.so.1 => /lib/libnsl.so.1 (0×4013a000)
libc.so.6 => /lib/libc.so.6 (0×4014f000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0×40000000)
Primero uso el which para encontrar donde en mi sistema está la utilería “nslookup”.
Después uso ldd para saber las librerías que usa el programa de la cual sale mucha información.
La información esta estructurada en dos columnas.
La primera columna es la “librería” solicitada y la segunda columna es la ruta de la librería y el punto de entrada a la misma.
Si se fijan, tengo un problema de librerías. Me dice que:
libcrypto.so.0 => not found
No la encontró, así que tengo “dependencias no resueltas”.
¿Qué sigue? Buscar esa libreria en mi sistema.
find / -name “libcrypto.so.0″
lo cual me dice:
/usr/local/mylibs/libcrupto.so.0
Entonces sí tengo mi libreria, pero no me la “encuentra el sistema”, ¿entonces? ¿qué sucede? Simple, hay que “actualizar” mi sistema de caché:
Reviso mi /etc/ld.so.conf que contiene las rutas de búsqueda de las librerías, en mi caso particular:
bash-2.05a$ more /etc/ld.so.conf
/usr/local/lib
/usr/X11R6/lib
/usr/i386-slackware-linux/lib
/opt/kde/lib
/usr/lib/qt/lib
/usr/lib/qt/lib
Por lo tanto, edito mi /etc/ld.so.conf y agrego la ruta donde la librería se encuentra y mi /etc/ld.so.conf ahora dice:
bash-2.05a$ more /etc/ld.so.conf
/usr/local/lib
/usr/X11R6/lib
/usr/i386-slackware-linux/lib
/opt/kde/lib
/usr/lib/qt/lib
/usr/lib/qt/lib
/usr/local/mylibs
Ahora, actualizo mi “caché de librería” al ejecutar ldconfig
y vuelvo a probar el ldd sobre nslookup:
/usr/bin/nslookup
bash-2.05a$ ldd /usr/bin/nslookup
libdns.so.5 => /usr/lib/libdns.so.5 (0×40021000)
libcrypto.so.0 => /usr/local/mylibs/libcrypto.so.0 (0×400a1000)
libisc.so.4 => /usr/lib/libisc.so.4 (0×4010b000)
libnsl.so.1 => /lib/libnsl.so.1 (0×4013a000)
libc.so.6 => /lib/libc.so.6 (0×4014f000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0×40000000)
Listo. Dependendicas completadas.
Ahora, si el paso del “find” falla, pues eso significa que definitivamente no tengo esa libreria y hay que conseguirla. Google o Freshmeat, nos ayudan a esto.
El rpm y el apt-get, hacen prácticamente ésto. Así que si tú tienes un problema con un .tar.gz o algo así que te bajas “precompilado”, ya lo puedes resolver tú, que a diferencia de Windows, no puedes, a menos que utilices caras herramientas de desarrollo.
Ahora, cabe hacer mención, que no hay un procedimiento “perfecto”. Digamos que éste procedimiento es básico. Cuando éste falla se puede emplear strace o el gdb para “ver” que pasa.
Como recomendaciín, te suguero que uses Slackware o Gentoo, y manejes todo “a compilar”, dado que, para que compile algo, tienes que tener satisfechas todas las dependencias; asi garantizas que todo esté en donde debe de estar.
Espero que esta información le sirva a más de uno y sepan que hacer ante un:
bash-2.05a$ nslookup
nslookup: error while loading shared libraries: libcrypto.so.0: cannot open shared object file: No such file or directory