dimecres, 23 de febrer del 2011

articulo monitorización

Monitorización  - fuente http://www.postgresql-es.org/node/582

servidor
Una de las tareas más importantes de un administrador de bases de datos es monitorizar los sistemas a su cargo para saber como están funcionando y planear futuras modificaciones y actualizaciones de los mismos.
Este artículo es una introducción a la monitorización de sistemas de bases de datos en sistemas Linux/Unix y está basado en un entrenamiento especializado que se impartio en el PGDay Latinoamericano 2011 en Cuba. Más adelante escribiremos otros artículos más específicos que nos ayuden a usar e interpretar los datos obtenidos de monitorizar nuestros sistemas.
En nuestro caso, monitorizar significa vigilar el funcionamiento de un sistema, servicio o actividad. Bajo nuestro punto de vista existen dos tipos de monitorización:
  • Ad Hoc: Monitorización específica en caso de problemas o pruebas. Se utiliza generalmente para investigar una situación puntual en la que intentamos encontrar una explicación a un suceso, cambio o problema.
  • Preventiva: Detecta interrupciones de servicios, alerta sobre posibles problemas y crea gráficos con tendencias y datos históricos sobre nuestros sistemas. Este tipo de monitorización está automatizada y nos ayuda a descubrir cambios en nuestros sistemas que provocan o pueden provocar problemas en un futuro cercano.
Existen numerosos programas que nos pueden ayudar a realizar la monitorización de nuestros sistemas PostgreSQL. A continuación teneis los mas usados en el mundo de programas de código abierto.
  • Ad Hoc: vmstat, iostat, sar, ps, top, iotop, htop, etc en la linea de comandos de vuestro sistema operativo, e información interna de vuestra instalacion postgreSQL via las vistas y tablas de sistema en la base de datos.
  • Preventiva: "Nagios" para detectar y alertar sobre posibles problemas y "Munin" para crear gráficas históricas con las tendencias y uso de nuestros sistemas.
Los elementos a monitorizar son todos aquellos que nos puedan dar información sobre como nuestro sistema está funcionando y comportandose. Tendremos que monitorizar los componentes de la infraestructura necesaria para que nuestro sistema funcione, los servidores que estamos utilizando, el uso de los recursos que se están utilizando y la información interna en la base de datos que nos de datos sobre como se está usando PostgreSQL.



Algunos de los elementos más importantes que se suelen monitorizar son los siguientes:
  • Servidor: Disponibilidad y posibles problemas del hardware
  • CPU: Carga del sistema y uso de la CPU
  • Memoria: Carga y uso de la memoria, uso de la memoria de intercambio (swap)
  • Red: Disponibilidad de los componentes de red, tráfico de entrada y salida.
  • Discos / almacenamiento: Espacio utilizado, I/O (Input/Output) del sistema
  • PostgreSQL: Número de conexiones, número de transacciones, transacciones abiertas, bloqueos, espacio usado, tipo de comandos usados, etc, etc
Ademas de estos elementos, suelen existir características específicas a cada sistema que cada administrador deberá identificar y monitorizar de la mejor manera posible.

Monitorización Ad Hoc

Como ya hemos comentado, este tipo de monitorización se utiliza generalmente para investigar una situacion puntual, en la que entramos en el sistema, recogemos los datos deseados por un periodo de tiempo y pasamos a su posterior análisis para intentar encontrar una explicación a la situación o problema que estamos intentado resolver.

Herramientas del sistema operativo

A continuación teneis una breve introducción a las herramientas del sistema operativo usadas más a menudo en esta monitorización. Todas estas herramientas se pueden usar con multitud de opciones y parámetros, para obtener información detallada sobre los mismos usar el comando "man programa"
vmstat: Este comando se suele usar para obtener, entre otras cosas, información sobre el uso de memoria, swap, I/O total y cpu del sistema. La primera fila del resultado por defecto da los valores medios desde la última vez que se arranco el sistema. Es un programa que te da información global e instantanea del sistema en un momento determinado.
En sistemas debian/ubuntu este programa esta incluido en el paquete procps y si no esta instalado se puede instalar con el siguiente comando:
$ sudo apt-get install procps
Un resultado típico de ejecutar este comando podria ser el siguiente:
$ vmstat -n 1 10
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
0  0   1368 401736 529112 4844136    0    0    15    26   24    6  5  1 94  1
0  0   1368 397884 529112 4844140    0    0     0   124  523 1399  1  0 99  0
0  0   1368 401976 529112 4844140    0    0     0     0  566 1648  1  0 99  0
0  0   1368 398752 529112 4844140    0    0     0     0  488 1447  1  0 99  0
0  0   1368 403588 529112 4844140    0    0     0     0  520 1550  2  0 98  0
0  0   1368 398720 529112 4844140    0    0     0     0  565 1525  1  0 99  0
0  0   1368 400232 529116 4844144    0    0     0   124  551 1609  1  0 99  0
0  0   1368 396132 529116 4844144    0    0     0     0  519 1395  1  0 99  0
0  0   1368 400720 529116 4844144    0    0     0   440  673 1892  1  0 98  1
1  0   1368 397076 529116 4844144    0    0     0     0  500 1443  1  1 99  0
El tamaño de bloque por defecto es 1024 bytes (1Kb) y el significado de las distintas columnas es el siguiente:
r: Procesos esperando por tiempo de ejecución (run time)
b: Procesos en estado de espera sin interrupciones(uninterruptible sleep)
swpd: Cantidad de memoria virtual en uso
free: Cantidad de memoria ociosa
buff: Cantidad de memoria usada por buffers
cache: Cantidad de memoria usada caches
si: Cantidad de memoria grabada en disco (swap-in)
so: Cantidad de memoria leida del disco (swap-out)
bi: Bloques recibidos por los dispositivos de bloques (bloques/s)
bo: Bloques enviados por los dispositivos de bloques (bloques/s)
in: Número de interrupciones por segundo
cs: Número de cambios de contexto por segundo (context switches)
us: Tiempo de cpu de procesos de usuario (nice incluido)
sy: Tiempo de cpu de procesos del kernel
id: Tiempo de cpu ocioso
wa: Tiempo de cpu esperando por I/O
st: Tiempo de cpu "robado" a una maquina virtual
iostat: Este comando se suele utilizar para obtener información sobre la entrada/salida de datos de todos los dispositivos, particiones y sistemas de ficheros NFS. Por defecto, el primer resultado da los valores medios desde la última vez que se arranco el sistema. Es un programa que te da información sobre el I/O del sistema para todos los dispositivos en un momento determinado.
En sistemas debian/ubuntu este programa está incluido en el paquete sysstat y si no esta instalado se puede instalar con el siguiente comando:
$ sudo apt-get install sysstat
Un resultado típico de ejecutar este comando podria ser el siguiente:
$ iostat -k -p 1 2
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           4.78    0.19    0.60    0.79    0.00   93.64

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               5.50        59.00       106.86   19921681   36081584
sda1              1.62         6.75        17.93    2279650    6053108
sda2              0.08         3.05         0.02    1031003       7032
sda3              3.80        49.19        88.91   16610176   30020076
sda4              0.00         0.00         0.00        740       1368
sdb               0.00         0.01         0.00       3460         44
sdb1              0.00         0.01         0.00       3340         44

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.99    0.10    0.54    0.00    0.00   98.37

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               0.20        25.60         0.00        128          0
sda1              0.00         0.00         0.00          0          0
sda2              0.20        25.60         0.00        128          0
sda3              0.00         0.00         0.00          0          0
sda4              0.00         0.00         0.00          0          0
sdb               0.00         0.00         0.00          0          0
sdb1              0.00         0.00         0.00          0          0
El tamaño de bloque por defecto usado por este programa es 512 bytes. El parámetro -k nos cambia el valor de bloque a 1024 bytes (1Kb). El significado de las distintas columnas es el siguiente:
tps: Número de peticiones I/O (transferencias) a un dispositivo
kB_read/s: kB por segundo leidos del dispositivo
kB_wrtn/s: kB por segundo escritos en el dispositivo
kB_read: Número total de kB leidos del dispositivo
kB_wrtn: Número total de kB escritos en el dispositivo
sar: Este programa se suele utilizar para recolectar y grabar información sobre nuestro sistema durante un periodo de tiempo.
En sistemas debian/ubuntu este programa está incluido en el paquete sysstat y si no esta instalado se puede instalar con el siguiente comando:
$ sudo apt-get install sysstat
La recolección de datos se llama desde cron (/etc/cron.d/sysstat), y por defecto no está activado. Para activar la recolección de datos una vez instalado deberemos cambiar un parámetro en el fichero /etc/default/sysstat y arrancar el servicio:
ENABLE="TRUE" en /etc/default/sysstat
$ sudo /etc/init.d/sysstat restart
Un resultado típico de ejecutar este comando despues de un tiempo desde que se activa la recolección de datos podria ser el siguiente:
$ sar
Linux 2.6.35-24-generic (core2)  01/29/2011  _x86_64_ (4 CPU)

12:00:01 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
12:05:01 AM     all      0.72      0.14      0.95      0.19      0.00     97.99
12:15:01 AM     all      0.74      0.15      0.95      0.09      0.00     98.07
12:25:01 AM     all      0.73      0.15      0.90      0.05      0.00     98.17
12:35:01 AM     all      0.74      0.14      0.93      0.15      0.00     98.05
12:45:01 AM     all      1.08      4.80      3.27      0.07      0.00     90.78
12:55:01 AM     all      0.96      3.67      2.59      0.10      0.00     92.68
01:05:01 AM     all      0.72      0.14      0.90      0.19      0.00     98.04
01:15:01 AM     all      0.76      0.13      0.97      0.07      0.00     98.06
01:25:01 AM     all      0.70      0.15      0.90      0.06      0.00     98.20
01:35:01 AM     all      0.70      0.13      0.89      0.11      0.00     98.17
01:45:01 AM     all      0.68      0.14      0.90      0.10      0.00     98.18
ps: Este programa nos da información sobre los procesos que se están ejecutando en nuestro sistema. En el caso de procesos PostgreSQL nos puede dar información muy valiosa sobre cuantos procesos PostgreSQL se están ejecutando y que están haciendo.
Un resultado típico de ejecutar este comando para obtener los procesos PostgreSQL del sistema, ordenados por el momento en que empezaron a ejecutarse, podria ser el siguiente:
$ ps auxww | grep "postgres: " | sort -k 9

postgres 30758 .... 07:10 0:00 postgres: autovacuum launcher process         
postgres 30759 .... 07:10 0:00 postgres: stats collector process             
postgres 30757 .... 07:10 0:00 postgres: wal writer process                  
postgres 30756 .... 07:10 0:01 postgres: writer process                      
postgres   862 .... 07:59 0:00 postgres: postgres postgres [local] idle in transaction
postgres  1921 .... 09:22 0:00 postgres: postgres postgres 127.0.0.1(39475) idle 
postgres 21074 .... 14:14 0:04 postgres: postgres pgbench [local] COMMIT     
postgres 21073 .... 14:14 0:04 postgres: postgres pgbench [local] UPDATE waiting
Los que nos suelen interesar en este caso son los procesos creados por conexiones de clientes a nuestro servidor PostgreSQL. Estos procesos se muestran con el siguiente formato:
postgres: usuario  dbase  maquina(puerto)  actividad
Como podeis ver, podemos obtener información sobre que usuario está utilizando el cliente para conectarse, a que base de datos se está conectando, desde que máquina y puerto (o socket [local]) se ha conectado y que está haciendo. Los valores de la actividad que está realizando podrán ser:
idle in transaction: El proceso ha abierto una transacción pero no la ha cerrado todavia.
idle: El proceso está conectado pero sin hacer nada.
COMANDO: El proceso está ejecutando el comando COMANDO
COMANDO waiting: El proceso quiere ejecutar el comando COMANDO, pero está bloqueado y esperando a poder ejecutarse

Vistas y tablas de sistema internas en PostgreSQL

Además podemos obtener información sobre como esta funcionando PostgreSQL internamente a través de las vistas y tablas de sistema en la base de datos. En sucesivos artículos iremos viendo que tipo de información contienen y como interpretar estas vista/tablas de sistema.
Para que muchas de estas vistas/tablas funcionen debemos tener activados estos parámetros en nuestro sistema, track_counts, track_functions, track_activities, bien en el fichero postgresql.conf o definidos con SET / ALTER DATABASE en la sesión o base de datos de la que queremos obtener información.
Existen muchas vistas y tablas internas pero las que se usan mas comunmente para obtener información de PostgreSQL son las siguientes:
pg_roles: Información sobre todos los roles y usuarios definidos en la base de datos.
postgres=# SELECT * from pg_roles ;

 rolname  | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcatupdate | rolcanlogin | rolconnlimit | rolpassword | rolvaliduntil | rolconfig | oid 
----------+----------+------------+---------------+-------------+--------------+-------------+--------------+-------------+---------------+-----------+-----
 postgres | t        | t          | t             | t           | t            | t           |           -1 | ********    |               |           |  10
(1 row)
pg_database Información sobre todas las bases de datos definidas en nuestro sistema.
postgres=# SELECT * from pg_database ;

  datname  | datdba | encoding | datcollate  |  datctype   | datistemplate | datallowconn | datconnlimit | datlastsysoid | datfrozenxid | dattablespace |               datacl                
-----------+--------+----------+-------------+-------------+---------------+--------------+--------------+---------------+--------------+---------------+-------------------------------------
 template1 |     10 |        6 | en_US.UTF-8 | en_US.UTF-8 | t             | t            |           -1 |         11866 |          654 |          1663 | {=c/postgres,postgres=CTc/postgres}
 template0 |     10 |        6 | en_US.UTF-8 | en_US.UTF-8 | t             | f            |           -1 |         11866 |          654 |          1663 | {=c/postgres,postgres=CTc/postgres}
 postgres  |     10 |        6 | en_US.UTF-8 | en_US.UTF-8 | f             | t            |           -1 |         11866 |          654 |          1663 | 
 pgbench   |     10 |        6 | en_US.UTF-8 | en_US.UTF-8 | f             | t            |           -1 |         11866 |          654 |          1663 | 
(4 rows)
pg_locks: Información sobre los bloqueos activos en nuestras bases de datos. Vista complicada de entender pero muy valiosa en ciertas situaciones.
postgres=# SELECT * from pg_locks ;

   locktype    | database | relation | page | tuple | virtualxid | transactionid | classid | objid | objsubid | virtualtransaction | pid  |       mode       | granted 
---------------+----------+----------+------+-------+------------+---------------+---------+-------+----------+--------------------+------+------------------+---------
 relation      |    16385 |    16392 |      |       |            |               |         |       |          | 3/2666             | 2711 | AccessShareLock  | t
 relation      |    16385 |    16392 |      |       |            |               |         |       |          | 3/2666             | 2711 | RowExclusiveLock | t
 virtualxid    |          |          |      |       | 4/2692     |               |         |       |          | 4/2692             | 2710 | ExclusiveLock    | t
 relation      |    11874 |    10985 |      |       |            |               |         |       |          | 2/19               | 2401 | AccessShareLock  | t
 relation      |    16385 |    16399 |      |       |            |               |         |       |          | 3/2666             | 2711 | RowExclusiveLock | t
 relation      |    16385 |    16392 |      |       |            |               |         |       |          | 4/2692             | 2710 | AccessShareLock  | t
 relation      |    16385 |    16392 |      |       |            |               |         |       |          | 4/2692             | 2710 | RowExclusiveLock | t
 relation      |    16385 |    16403 |      |       |            |               |         |       |          | 4/2692             | 2710 | AccessShareLock  | t
 relation      |    16385 |    16403 |      |       |            |               |         |       |          | 4/2692             | 2710 | RowExclusiveLock | t
 relation      |    16385 |    16403 |      |       |            |               |         |       |          | 3/2666             | 2711 | AccessShareLock  | t
 relation      |    16385 |    16403 |      |       |            |               |         |       |          | 3/2666             | 2711 | RowExclusiveLock | t
 virtualxid    |          |          |      |       | 3/2666     |               |         |       |          | 3/2666             | 2711 | ExclusiveLock    | t
 relation      |    16385 |    16401 |      |       |            |               |         |       |          | 3/2666             | 2711 | RowExclusiveLock | t
 relation      |    16385 |    16386 |      |       |            |               |         |       |          | 3/2666             | 2711 | RowExclusiveLock | t
 relation      |    16385 |    16401 |      |       |            |               |         |       |          | 4/2692             | 2710 | RowExclusiveLock | t
 tuple         |    16385 |    16389 |   22 |    97 |            |               |         |       |          | 4/2692             | 2710 | ExclusiveLock    | t
 relation      |    16385 |    16389 |      |       |            |               |         |       |          | 4/2692             | 2710 | RowExclusiveLock | t
 relation      |    16385 |    16395 |      |       |            |               |         |       |          | 3/2666             | 2711 | RowExclusiveLock | t
 relation      |    16385 |    16389 |      |       |            |               |         |       |          | 3/2666             | 2711 | RowExclusiveLock | t
 transactionid |          |          |      |       |            |       2793613 |         |       |          | 4/2692             | 2710 | ExclusiveLock    | t
 virtualxid    |          |          |      |       | 2/19       |               |         |       |          | 2/19               | 2401 | ExclusiveLock    | t
 transactionid |          |          |      |       |            |       2793614 |         |       |          | 3/2666             | 2711 | ExclusiveLock    | t
 transactionid |          |          |      |       |            |       2793609 |         |       |          | 4/2692             | 2710 | ShareLock        | t
(23 rows)
pg_stat_activity: Información sobre todos los procesos clientes conectados a la base de datos.
postgres=# SELECT * from pg_stat_activity ;

 datid | datname  | procpid | usesysid | usename  | application_name | client_addr | client_port |         backend_start         |          xact_start           |          query_start          | wa
iting |                             current_query                             
-------+----------+---------+----------+----------+------------------+-------------+-------------+-------------------------------+-------------------------------+-------------------------------+---------+-----------------------------------------------------------------------
 11874 | postgres |    2401 |       10 | postgres | psql             |             |          -1 | 2011-02-17 22:48:08.090603+01 | 2011-02-17 22:52:31.297037+01 | 2011-02-17 22:52:31.297037+01 | f       | SELECT * from pg_stat_activity ;
 16385 | pgbench  |    2711 |       10 | postgres |                  |             |          -1 | 2011-02-17 22:51:12.209724+01 | 2011-02-17 22:52:31.296394+01 | 2011-02-17 22:52:31.296873+01 | f       | END;
 16385 | pgbench  |    2710 |       10 | postgres |                  |             |          -1 | 2011-02-17 22:51:12.1963+01   | 2011-02-17 22:52:31.295193+01 | 2011-02-17 22:52:31.29542+01  | t       | UPDATE pgbench_tellers SET tbalance = tbalance + -4443 WHERE tid = 1;
 16385 | pgbench  |    2811 |       10 | postgres |                  |             |             | 2011-02-17 22:52:27.549785+01 | 2011-02-17 22:52:31.247453+01 | 2011-02-17 22:52:31.247453+01 | f       | autovacuum: ANALYZE public.pgbench_history
(4 rows)
pg_stat_database: Información global de uso de todas las bases de datos.
postgres=# SELECT * from pg_stat_database ;

 datid |  datname  | numbackends | xact_commit | xact_rollback | blks_read | blks_hit | tup_returned | tup_fetched | tup_inserted | tup_updated | tup_deleted 
-------+-----------+-------------+-------------+---------------+-----------+----------+--------------+-------------+--------------+-------------+-------------
     1 | template1 |           0 |        3612 |             0 |      2840 |   100341 |       935386 |       33760 |            0 |           0 |           0
 11866 | template0 |           0 |           0 |             0 |         0 |        0 |            0 |           0 |            0 |           0 |           0
 11874 | postgres  |           1 |        4859 |             0 |      1304 |   132667 |      1425972 |       38209 |            0 |           0 |           0
 16385 | pgbench   |           2 |     2978446 |             1 |    659578 | 82868995 |     41262336 |    11863286 |      3178023 |     8934189 |           0
(4 rows)
pg_stat_user_tables: Información de uso de todas las tablas de usuario en una base de datos
pgbench=# SELECT * from pg_stat_user_tables ;

 relid | schemaname |     relname      | seq_scan | seq_tup_read | idx_scan | idx_tup_fetch | n_tup_ins | n_tup_upd | n_tup_del | n_tup_hot_upd | n_live_tup | n_dead_tup |          last_vacuum          |        last_autovacuum        |         last_analyze          |       last_autoanalyze        
-------+------------+------------------+----------+--------------+----------+---------------+-----------+-----------+-----------+---------------+------------+------------+-------------------------------+-------------------------------+-------------------------------+-------------------------------
 16395 | public     | pgbench_history  |        0 |            0 |          |               |   3074221 |         0 |         0 |             0 |     283308 |          0 | 2011-01-29 12:31:54.208813+01 |                               | 2011-01-29 12:31:54.209202+01 | 2011-02-17 22:53:34.126245+01
 16386 | public     | pgbench_branches |    38821 |        62452 |  3042999 |       3042999 |         2 |   3074222 |         0 |       3072054 |         75 |        493 | 2011-02-17 22:51:12.172321+01 | 2011-02-17 22:53:27.711111+01 | 2011-01-29 12:31:53.945088+01 | 2011-02-17 22:53:27.748393+01
 16389 | public     | pgbench_tellers  |    32474 |       621300 |  3043158 |       3043158 |        20 |   3074222 |         0 |       3052868 |         55 |        810 | 2011-02-17 22:51:12.175635+01 | 2011-02-17 22:53:27.870574+01 | 2011-01-29 12:31:53.946838+01 | 2011-02-17 22:53:27.871727+01
 16392 | public     | pgbench_accounts |        1 |       200000 |  6148444 |       6148444 |    200000 |   3074222 |         0 |       3033380 |     199999 |      10091 | 2011-01-29 12:31:54.049578+01 | 2011-01-29 12:59:29.982391+01 | 2011-01-29 12:31:54.204138+01 | 2011-02-17 22:53:31.476969+01
(4 rows)
pg_stat_user_indexes: Información de uso de todos los índices de usuarios en una base de datos
pgbench=# SELECT * from pg_stat_user_indexes ;

 relid | indexrelid | schemaname |     relname      |     indexrelname      | idx_scan | idx_tup_read | idx_tup_fetch 
-------+------------+------------+------------------+-----------------------+----------+--------------+---------------
 16386 |      16399 | public     | pgbench_branches | pgbench_branches_pkey |  3088826 |     10145852 |       2902404
 16389 |      16401 | public     | pgbench_tellers  | pgbench_tellers_pkey  |  3088985 |     24680003 |       2378762
 16392 |      16403 | public     | pgbench_accounts | pgbench_accounts_pkey |  6240098 |      6319966 |       6240098
pg_stat_user_functions: Información sobre estadísticas de uso de las funciones en uso.
pg_statio_user_tables: Información de acceso a disco y memoria cache de todas las tablas de usuario en una base de datos.
pgbench=# SELECT * from pg_statio_user_tables ;

 relid | schemaname |     relname      | heap_blks_read | heap_blks_hit | idx_blks_read | idx_blks_hit | toast_blks_read | toast_blks_hit | tidx_blks_read | tidx_blks_hit 
-------+------------+------------------+----------------+---------------+---------------+--------------+-----------------+----------------+----------------+---------------
 16392 | public     | pgbench_accounts |         547836 |       9289403 |          1361 |     19151376 |                 |                |                |              
 16395 | public     | pgbench_history  |         135074 |       3208010 |               |              |                 |                |                |              
 16386 | public     | pgbench_branches |           7587 |      17015504 |             6 |      3138237 |                 |                |                |              
 16389 | public     | pgbench_tellers  |           7160 |      28805005 |            25 |      6021187 |                 |                |                |              
(4 rows)

pg_statio_user_indexes: Información de acceso a disco y memoria cache de todos los índices de usuario en una base de datos.
pgbench=# SELECT * from pg_statio_user_indexes ;

 relid | indexrelid | schemaname |     relname      |     indexrelname      | idx_blks_read | idx_blks_hit 
-------+------------+------------+------------------+-----------------------+---------------+--------------
 16386 |      16399 | public     | pgbench_branches | pgbench_branches_pkey |             6 |      3163169
 16389 |      16401 | public     | pgbench_tellers  | pgbench_tellers_pkey  |            25 |      6076626
 16392 |      16403 | public     | pgbench_accounts | pgbench_accounts_pkey |          1361 |     19301010
(3 rows)
pg_stat_bgwriter: Información global sobre el proceso "background writer"
pgbench=# SELECT * from pg_stat_bgwriter ;

 checkpoints_timed | checkpoints_req | buffers_checkpoint | buffers_clean | maxwritten_clean | buffers_backend | buffers_alloc 
-------------------+-----------------+--------------------+---------------+------------------+-----------------+---------------
               474 |              81 |             223942 |        554746 |              573 |           85369 |        555848
(1 row)

Monitorización preventiva

Como hemos comentado al principio, este tipo de monitorización se utiliza para detectar interrupciones de servicios, alertar sobre posibles problemas y crea gráficos con tendencias y datos históricos sobre nuestros sistemas. Los dos programas de código abierto mas utilizados para este tipo de monitorización son:
  • Nagios: Se utiliza para detectar interrupciones de servicios y alertar sobre posibles problemas o situaciones que necesitan una atención especial por parte de los administradores del sistema. Su instalación y configuración se escapa al objetivo de este documento. Más adelante escribiremos un artículo sobre como utilizar Nagios. Aquí teneis un ejemplo de una de la pantallas de este programa:



  • Munin: Se utiliza para crear gráficas históricas con las tendencias y uso de nuestros sistemas. Imprescindible para ver como nuestros sistemas se están utilizando en el tiempo y si existen tendencias en el uso que van a requerir nuestra intervención en el futuro. Su instalación y configuración se escapa al objetivo de este documento. Más adelante escribiremos un artículo sobre como utilizar Munin. Aquí teneis algunos ejemplos de lo que se puede hacer con este programa:

Más información

http://www.nagios.org/
http://munin-monitoring.org/
http://www.postgresql.org/docs/current/interactive/catalogs.html
http://www.postgresql.org/docs/current/interactive/monitoring.html
http://www.postgresql.org/docs/9.0/interactive/sql-set.html
http://www.postgresql.org/docs/9.0/interactive/sql-alterdatabase.html

video comparativa posgresql versus mysql

Ed Boyajian is President and Chief Executive Officer of EnterpriseDB, the Postgres company. Before joining EnterpriseDB, Ed spent six years at Red Hat, Inc., the world's leading open source solutions provider, most recently serving as vice president and general manager of North America. Before that, he was vice president of Red Hat's global OEM business, responsible for all partnerships including HP, IBM and Dell. During his time at Red Hat, Ed was instrumental in developing the foundational methods for selling open source software into the enterprise. Prior to Red Hat, Ed held executive sales and marketing positions at ArsDigita, an early leader in open source software for building database-backed community websites (acquired by Red Hat) and ServiceSoft (now Kana). Ed is a former U.S. Army Captain, and earned his MBA from Harvard Business School and his undergraduate degree from Boston University.

IT Management & Leadership eMagazine


http://www.leadit.us/hands-on-tech/PostgreSQL-vs-MySQL-Pros-Cons

http://www.leadit.us/

diumenge, 7 de novembre del 2010

deconnectar la consola sense finalitzar la sessió

de vegades iniciem un tarees via ssh que han de tenir continuitat i no podem perdre la sessió, una solució es utiltizar screen, que normalment ve instal·lat a les distribucions o tenim informació a http://www.gnu.org/software/screen

per iniciar screen posem

#screen

i li donem a l'espai, ara estem a l'interprete de screen

si volem veure la llista de screen que tenim actives


ies-sabadell:~# screen -list
There are screens on:
    5421.pts-0.ies-sabadell    (06/11/10 23:32:35)    (Attached)
    5408.pts-0.ies-sabadell    (06/11/10 23:31:32)    (Detached)
2 Sockets in /var/run/screen/S-root.

en aquest tenim dos sessions obertes d'screen i la que està activa és la primera, la sintaxis es pid.terminal.nom i amb aquestes dades recuperarem la sessió screen més tard.

per fer la prova llenço


rsync -e ssh --progress --delete -lprtz /srv user@yyy.yyy.yyy.yyy:/backups/server-moodle/srv2

que estarà una bona estona copiant al servidor donat que és el primer backup en aquest disc nou


donat que no puc estar tot el temps davant el terminal tanco la sessió screen

Ctrl+A i despres D

i tornem a l'interpretre normal que també tanco.

Pasades 1 hora em torno a connectar

ssh ies-sabadell.xtec.net

ies-sabadell:~# screen -r
There are several suitable screens on:
    5421.pts-0.ies-sabadell    (06/11/10 23:32:35)    (Detached)
    5408.pts-0.ies-sabadell    (06/11/10 23:31:32)    (Detached)
Type "screen [-d] -r [pid.]tty.host" to resume one of them.





està clar que screen -r em retorna les screen que s'estàn executant

per tornar-me a connectar faig screen -r 5421.pts-0.ies-sabadell

dissabte, 6 de novembre del 2010

repetició de tasques via crontab i rsync

per realitzar els backups de matinada el que utilitzo es rsync amb l'idea de que em gestioni la informació comprimida i només els canvis realitzats,

crontab -e


30  4  * * * rsync -e ssh --progress --delete -lprtz /srv user@yyy.yyy.yyy.yyy:/home/srv2
0  5  * * * rsync -e ssh --progress --delete -lprtz /var/lib/mysql user@yyy.yyy.yyy.yyy:/opt/lampp/var/mysql
30 5 * * * rsync -e ssh --progress --delete -lprtz /backup/mysql-backup user@yyy.yyy.yyy.yyy:/home/backups-mysql
45 5 * * * rsync -e ssh --progress --delete -lprtz /mio/backup-moodle user@yyy.yyy.yyy.yyy:/home/backups-moodle

això farà que ha diferents hores, a partir de les 4:30h comenci a fer backups només de les coses que s'han modificat.

formatejar unitat de disc

Formatejar una unitat de disc o memòria usb en linux es molt senzill

desmontar la unitat

# umount /dev/sdb1

on sdb1 correspon al nom de la teva unitat de disc

formatejem








# mkfs.vfat /dev/sdb1


#mkfs.ext3 /dev/sdb1

A la primera comanda formatejem en vfat, sobretot per usb's, i la segona comanda formatejem en ext3

creem un directori a l'arrel

mkdir /backups

mount -t ext3 /dev/sdb1 /backups

Autentificación por claves RSA/DSA - via ssh

Autentificación por claves RSA/DSA

Anem a configurar el servidor per accedir via ssh , mitjançant claus rsa/dsa i sense password de manera segura.

Al fitxer de configuració del servidor (on volem connectar-nos 192.168.130.x)
/etc/ssh/sshd_config

PubkeyAuthentication yes

En el client generem les claus DSA;


ssh-keygen -t dsa

podem posar un password pero si ho deixem em blanc la entrada serà directa 

Per introduir aquesta ordre, al directori home/.ssh ens ha generat una clau publica i una privada. La clau pública la hem de copiar al servidor al directori de l'usuari amb el que connectarem

sftp root@192.168.130.x

put ./ssh/id_dsa.pub  (hem copiat la clau publica de l'equip client al servidor)

en algún lloc indica que així també es pot fer pero  no ho he comprobat

$scp archivo_local user@host:archivo_remoto
scp id_dsa.pub alvaro@intranet:.ssh/id_dsa.pub

The authenticity of host 'intranet (192.168.200.70)' can't be established. RSA key fingerprint is d8:d7:0a:cf:d9:8f:fe:fa:66:f0:76:46:46:fa:b8:1a. Are you sure you want to continue connecting (yes/no)?

El fingerprint és la firma digital del servidor. per establir una connexió la hem d'acceptar i demana una contrasenya, en aquest moment la copia la fitxer .ssh/know_host de la màquina local. Aquesta emprenta (firma) queda al fitxer de tal manera que si hi ha una connexió de la mateixa ip pero amb diferent firma ens dirà que no es pot establir la connexió. llavors hauriem d'esborrar l'entrada corresponent a aquella connexió al fitxer know_hosts (pero això ara no toca)



Ara connectem al servidor,fem  los siguiente: cd /home/usuario/.ssh/
cat id_dsa.pub_CLIENTE >> authorized_keys
rm id_dsa.pub_CLIENTE

Ara ja podem connectar directament a l'ordinador remot sense tenir que introduïr el passwd, posarem

ssh usuari@192.168.130.x

i accedirem directament. Valorar que l'acces al directori ./ssh ha d'estar restringit només a nosaltres,
chmod 700 .ssh

Amb aquesta configuració ja puc llençar rsync sense tenir que posar el passwd.

Al tanto, l'accés a un ordinador ara ens està donant acces amb aquell usuari a altres ordinador sense password, s'ha de ser més segur....

diumenge, 7 de març del 2010

transferència de zones via dns

fer transferència de zones via dns es un error cada vegada ja menys comú donada la notificació d'aquesta incidència als servidors.

posarem les ordres per realitzar-ho mitjançant windows i linux

windows

D:\xarxes\NTSECURITY.NU>NSLOOKUP


Servidor predeterminado: google-public-dns-a.google.com

Address: 8.8.8.8



> SERVER LOZANO.NET

Servidor: LOZANO.NET

Address: 72.55.153.153



*** LOZANO.NET no se puede encontrar SERVER: Query refused

> server lozano.net

Servidor predeterminado: lozano.net

Address: 72.55.153.153



> set type-any

> ls -d lozano.net

[lozano.net]

lozano.net. SOA meteorico.com albert.lozano.net. (2009060

406 10800 3600 604800 600)

lozano.net. NS name.meteorico.com

lozano.net. NS name2.meteorico.com

lozano.net. A 72.55.153.153

lozano.net. MX 5 mail.lozano.net

lozano.net. MX 15 mailbackup.meteorico.com

casa A 80.26.53.225

fmtest A 80.26.53.225

ftp A 72.55.153.153

m A 72.55.153.153

mail A 72.55.153.153

www A 72.55.153.153

lozano.net. SOA meteorico.com albert.lozano.net. (2009060

406 10800 3600 604800 600)

>











AMB LINUX I AMB COMANDA DIG



dig @lozano.net lozano.net axfr



; <<>> DiG 9.5.1-P3 <<>> @lozano.net lozano.net axfr

; (1 server found)

;; global options: printcmd

lozano.net. 600 IN SOA meteorico.com. albert.lozano.net. 2009060406 10800 3600 604800 600

lozano.net. 600 IN NS name.meteorico.com.

lozano.net. 600 IN NS name2.meteorico.com.

lozano.net. 600 IN A 72.55.153.153

lozano.net. 600 IN MX 5 mail.lozano.net.

lozano.net. 600 IN MX 15 mailbackup.meteorico.com.

casa.lozano.net. 600 IN A 80.26.53.225

fmtest.lozano.net. 600 IN A 80.26.53.225

ftp.lozano.net. 600 IN A 72.55.153.153

m.lozano.net. 600 IN A 72.55.153.153

mail.lozano.net. 600 IN A 72.55.153.153

www.lozano.net. 600 IN A 72.55.153.153

lozano.net. 600 IN SOA meteorico.com. albert.lozano.net. 2009060406 10800 3600 604800 600

;; Query time: 177 msec

;; SERVER: 72.55.153.153#53(72.55.153.153)

;; WHEN: Sun Mar 7 21:29:47 2010

;; XFR size: 13 records (messages 1, bytes 341)


Ja he comentat que cada vegada és més difícil realitzar aquestes transferències de zona pero també es cert que si no funciona, es poden anar provant noms típics pels ordinador com inicials, a,b,c,.. els serveis que tenen, www,smtp,pop,www3,ftp.... per tal d'anar obtenint informació.

Y éste es el script (linux) que hace fuerza bruta sobre el servidor DNS:
dominio="dominio.com"

dns="dns1.dominio.com"

for nombre in `cat nombres.txt`

do

dig @$dns $nombre.$dominio grep -v ";" grep -v SOA grep $nombre.$dominio

done