No tienes cargado el módulo cdr-mysql o cdr-odbc. Difícil entonces.
--
Iñaki Baz Castillo
<i...@aliax.net>
--
Este email pertenece a la lista de Asterisk-ES (http://www.asterisk-es.org)
~~~ Normas de la lista Asterisk-ES: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
http://comunidad.asterisk-es.org/index.php?title=Lista:normas-asterisk-es
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Para anular la suscripción: asterisk-es...@googlegroups.com
module load cdr_mysql.so
Y comprueba que esté cargado después:
module show like cdr_
--
/Saúl
http://saghul.net | http://sipdoc.net
lmgtfy.com/?q=asterisk cdr_mysql
Pero ojo, una cosa es manejar un CSV con 1000 líneas y otras manejar
un CSV con 1000000 líneas. Tendrás que rotar los ficheros Master.csv,
decir a tu aplicación que busque en el fichero adecuado según la fecha
que buscas de CDR's, etc.
Por otra parte esto también aplica a la tabla CDR cuando se usa base
de datos. Si hay muchas llamadas diarias conviene rotar esa tabla caad
X tiempo, etc, y esto añade complejidad a las aplicaciones web (que no
sólo tienen que leer de una única tabla sino de varias en función de
la fecha a consultar, etc).
--
Este email pertenece a la lista de Asterisk-ES (http://www.asterisk-es.org)
~~~ Normas de la lista Asterisk-ES: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> Por otra parte esto también aplica a la tabla CDR cuando se usa base
> de datos. Si hay muchas llamadas diarias conviene rotar esa tabla caad
> X tiempo, etc, y esto añade complejidad a las aplicaciones web (que no
> sólo tienen que leer de una única tabla sino de varias en función de
> la fecha a consultar, etc).
>
Puedes usar engines diferentes para eso. Por ejemplo merge. Haces 60 tablas
unidas y las rotas. Haces la búsqueda en la unida.
O contratas a gente que sepa hacer las consultas sin poner LIKE en todo y sepan
dónde poner los índices.
Es muy raro tener que rotar tablas. Lo que has son muchos "php masters"
En la 1.8 está incluido dentro del apartado 'addons', y por defecto
viene deshabilitado.
Saludos,
Ramses
Enviado desde mi Móvil
> http://comunidad.asterisk-es.org/index.php?title=Lista:normas-asterisk-es
Puedes usar cdr_adaptive_odbc y conectar directamente Asterisk con
Oracle mediante ODBC, y al ser adaptivo puedes añadir todos los campos
que quieras.
Depende de si esa misma tabla se usa para lectura. Concretamente con
MySQL y tablas MyISAM (por defecto en MySQL) si una query hace un JOIN
entonces dicha tabla se bloquea completamente y no se puede escribir
en ella hasta que termine la query del JOIN (creo que con InnoDB no
ocurre eso). Esto significa que si tienes una aplicación de consulta
de CDR (web por ejemplo) que mira esa misma tabla (y no una replicada)
y hace consultas muy bestias sobre muchos registros y encima hace un
JOIN con otra tabla, pues Asterisk puede empezar a sufrir si no la
query INSERT de una nueva llamada no funciona.
De hecho, por mi experiencia puedo afirmar que tanto cdr-mysql como
cdr-odbc se vuelven locos cuando el server MySQL falla (no responde
debido a sobrecarga) o tiene el máximo número de conexiones usadas,
etc. En ese callo los INSERT de nuevos cdrs fallan y Asterisk empieza
misteriosamente a consumir mucha CPU y memoria, hasta que llega un
punto en el que comienza a no hablar SIP (no responde a los requests
SIP) y finalmente revienta y cae (el tiempo de esta caída es
inversamente proporcional al número de cdr's que no se han podido
escribir).
En cambio, si suponemos un escenario en el que asterisk escribe cdr en
MySQL-1 y existe replicación master-slave de la tabla cdr a MySQL-2, y
la aplicación de consulta sólo lee de MySQL-2, entonces no habría
problema por mucho que crezca la tabla cdr en MySQL-1 puesto que a las
operaciones de escritura como INSERT les da igual el número de
registros que haya en la tabla (OJO, esto es totalmente falso si la
tabla tiene muchos índices, puesto que por cada edición en la tabla se
deben recalcular, y cuantos más registros haya más lento es).
Si se tiene un poco de cuidado con esto que digo, yo creo que se puede
operar con una tabla cdrs con unos pocos millones sin problema. Esta
cifra disminuye drásticamente si se usa la misma tabla para escritura
de CDRs y lectura desde una aplicación de consulta.
Saludos.
No entiendo. Un servidor de base de datos ya implementa todos los
temas de concurrencia, etc por sí mismo, de hecho es obvio que varios
clientes pueden hacer consultas de lectura/escritura a la vez y el
server DB ya se encarga de hacer locks cuando sea necesario (cosa que
depende del server en sí, del tipo de tabla, etc).
Entonces, salvo que te refieras a que a nivel de aplicación (Java)
impidas que un usuario consulte sus CDR's si hay otro usuario en ese
momento también consultando sus CDR's... pues no sé a qué te refieres,
y obviamente hacer esto último sería bastante cutre y poco
user-friendly. Seguramente no he entendido bien a qué te refieres.
Para esto último, una solución podría ser no tener ningún índice en la
tabla cdr de MySQL-1 (el master donde asterisk escribe y NADIE lee), y
crear los índices necesarios sólo en la tabla cdr replicada en MySQL-2
(el slave donde sólo se hacen consultas de lectura y donde, por ende,
tiene sentido disponer de índices).
Javier, sé lo que es un semáforo. A lo que me refería es a que tú
planteabas un supuesto problema en caso de que muchos usuarios
escriban/lean a la vez de una base de datos, y luego hablabas de
semáforos a nivel de Java para solucionarlo. ¿Solucionar el qué? No sé
si me explico.
> Se utiliza para cubrir secciones críticas. Y no, estoy viendo que no
> es un problema de Java solo, es un problema típico de programación que
> se suele dar con cualquier lenguaje. Los semáforos se utilizan para
> restringir el número de Threads que pueden acceder al mismo recurso
> (físicos o lógicos).
Los semáforos, es un recurso que hay que evitar todo lo posible, si tu
aplicación está llena de ellos, mal royo, a no ser que estés todo el
día pelando con recursos bloqueantes, claro.
En el desarrollo de aplicaciones para asterisk, etc. al nivel del que
hablamos (proceso de CDR's), no veo la necesidad de su uso, en absoluto.
Saludos
----------------------------------------------------------------
This message was sent using IMP, the Internet Messaging Program.
> Lo voy a hacer con AMI, que ya lo utilizo y asterisk-java, tengo
> cargado el módulo cdr_manager que dispara un evento cada vez que se
> genera un cdr (cuando finaliza una llamada) y lo que hago es que
> cuando el evento llegue a la aplicación cogo los datos que necesito y
> los meto en Oracle
> http://asterisk-java.org/development/apidocs/org/asteriskjava/manager/event/CdrEvent.html
>
> Con esto creo que ya asunto cerrado (espero).
Es otra forma de hacerlo, aunque sigo pensando que te estas
complicando la vida innecesariamente.
Vale, voy a hacer un copy&paste de tu texto original:
-------------------------------------------------------------------------------------------------
jeje, y más cuando múltiples usuarios tienen que leer/escribir
"concurrentemente" de la misma tabla. :)
(pero para eso está la Concurrencia en Java, imagino que en otros
lenguajes también, pero yo solo uso Java).
Para eso uso el Semáforo
--------------------------------------------------------------------------------------------------
O sea:
1) Planteas el problema del acceso concurrente a BD (que no es un
problema en sí mismo, salvo que me hables de que se satura el server
DB).
2) Para ese "supuesto" problema del punto 1 sugieres "la Concurrencia en Java".
3) Y más específicamente sugieres el uso de "Semáforo".
O yo estoy muy espeso o efectivamente tú hablas de "solucionar" el
supuesto problema de acceso concurrente a BD mediante el uso de
semáforos en Java.
Tal vez te refieras a que a nivel de aplicación (Java) no ejecutas una
nueva query SQL si en ese momento hay más de N queries activas en
proceso, lo cuál según el caso podría ayudar a no saturar la BD. Pero
vamos, estoy especulando.
Saludos.
Javier, el que ha sacado el tema de los semáforos has sido tú, y
simplemente he preguntado su relación con las consultas a BD (ya que
como he puesto en otro correo, tú habías sugerido usar semáforos para
evitar no sé qué problema cuando varios usuarios acceden a la DB de
forma concurrente).
Pero bueno, creo que nos vamos por las ramas, igual es hora de acabar
este offñtopic :)
> Iñaki, era un comentario off-topic, al igual que el tuyo y el de
> Manwe.
Xiacoñoooooooo ... a ver si cerramos ya el hilo este ...
> Aún así si tuviera un millón de registros en una tabla, creo que no
> ocurría nada, porque el servidor que tiene instalado Oracle, es un
> mega servidor Dell (independiente al de Asterisk), que seguro que ese
> millón de registros los leía en segundos.
Fíate de eso y no comas, he visto ultra-servidores-de-la-muerte hincar
la rodilla en el suelo porque la base de datos estaba mal diseñada, y
no necesitabas hacer una consulta en una tabla de 1M de registros para
eso. Solo necesitas una BD mal diseñada y consultas peor echas.
> Ya que salió el tema te digo lo que hago/necesito, si a los 30 días no
> se solicitado ningún CDR o ninguna grabación, lo que hago es las
> grabaciones las comprimo y las muevo a otro servidor, eso ya lo tengo
> programado en el contrab del servidor Asterisk, y los CDR voy creando
> tablas históricas por cada mes. (CDR_032011).
Es una buena opción.
> Y así es, para solucionar la concurrencia en Java se utiliza (para una
> BD o cualquier otro recurso), entre otras cosas Semaphore, estos son
> los 3 paquetes que hay para eso:
Si estás insinuando, que TÚ a nivel aplicación, controlas la
concurrencia de consultas a la base de datos o las operaciones contra
la misma ... voy a empezar a pensar seriamente, que tienes problemas
de base en programación.
Es la capa de acceso a la base de datos (ODBC, libmysqlclient, libpq,
etc.), la que tiene que realizar ese trabajo, no tú a nivel
aplicación. Solo se me ocurre un caso en el que tengas que hacerlo tú
y no la librería de conexión al RDBMS, y es el caso de programación
asíncrona y que quieras trabajar con patrones de pools de conexiones
al motor de la RDBMS, multihilos y cosas por el estilo. Pero para eso
tendríamos que estar hablando de muchar carga, para que justificara el
esfuerzo.
> Sí creo que estás especulando, si has leído mis hilos, te fijarás que
> yo no uso SQL, para nada (no se por qué se les ha metido en la cabeza
> eso de SQL), uso HQL.
Que para el caso viene siendo casi lo mismo.
> Y para consultas complejas, donde hay que filtrar muchos campos, la
> API Criteria (de Hibernate, jBoss (de Red-Hat))
> http://www.javalobby.org/articles/hibernatequery102/
>
> La ventaja de usar HQL, API Criteria, que no tienes que conocer el
> lenguaje de la BD con la que vaya a trabajar tú aplicación, tu lo
> programas y el mismo código vale para cualquier BD del mercado.
Sí, siempre me ha hecho gracia eso de las capas, sobre capas ... si al
final, en el 95% de los casos, ya sabes de ante mano que motor de
RDBMS vas a usar y que no se va a cambiar durante la vida de la
aplicación.
> Desventaja, que tienes que aprender dos nuevos lenguajes.
>
> En realidad, cuando haces una query Criteria, lo que haces es generar
> una consulta HQL de manera totalmente transparente al programador. Es
> lo más recomendado para hacer consultas grandes como las de las webs
> de viajes que necesitan filtrar por muchos campos.
Que es un ORM vamos ...
> Bueno en fin a mi aplicación en Java no le ocurre absolutamente nada,
> todo lo contrario funciona perfectamente, también tiene incluido un UA
> SIP para realizar/recibir llamadas, las coloca en espera y las devía
> seleccionando un destinatario desde una lista desplegable (jComoBox).
> Pero bueno esto son cosas de otros foros/listas, no tiene nada que ver
> con Asterisk, ya no estamos saliendo del tema de la lista (hace rato
> me da). :)
Sí ... a ver si lo dejamos aquí ya, por favor.
Quiero agregar mi opinión a este hilo que se estiro ya mucho:
Realmente, pensaba que las base de datos relacionales manejaban mejor la concurrencia.
Ese problema NO se puede dar cuando se accede a una BD. El server DB
ya gestiona la concurrencia, locks, etc para que no ocurran esos
problemas.
> El día 24 de marzo de 2011 16:40, Javier Hernández
Por eso decía yo, que me parecía que le fallaba algo de base en la
programación ... solo hay UN caso, vuelvo y repito, SOLO UNO, en el
que puedes necesitar gestionar concurrencia desde la aplicación hacia
un RDBMS, y es el caso de programación asíncrona o multihilo (que no
es lo mismo, ni parecido)
Saludos.
A ver ... que te pones a mear fuera del tiesto y no aciertas ..., yo
solo he dicho, que SOLO hay un caso de programación, en el que está
justificado controlar con semáforos y recursos de ese tipo, el acceso
a otros recursos.
Hoy el día, al que se le ocurra presentarme un programa, que para una
simple tarea como añadir CDR's a una base de datos, me diga que tiene
que implementarlo mediante semáforos para controlar la concurrencia de
accesos a la base de datos ... lo mando directo a la oficina del inem
más cercana.
¿Se puede saber que problemas de concurrencia podrías tener accediendo
a una tabla de cdr's en un RDBMS?, porque a mi no se me ocurre ninguno
y los que se me ocurren ya los soluciona el RDBMS el solito.
P.D.: No presupongas lo que yo sé o dejo de saber, te puedes llevar
una desagradable sorpresa. Pocas, muy pocas cosas he necesitado yo
aprender de esas editoriales que nombras, o de ninguna otra. Los
libros técnicos que consumo, no son sobre temas "generales", como
concurrencia, threads, etc., suelen ser de temas mucho más específicos
que eso, pero de todas formas no es un tema que me parezca que
tengamos que estar hablando aquí.
Saludos
¿Qué más da? HQL no es más que un SQL vitaminado, no estándar (sólo es
para Java Hibernate) y con cierto mapeo a objetos Java. A efectos
prácticos respecto de lo que estábamos hablando, da igual SQL que HQL.
> Y para consultas complejas, donde hay que filtrar muchos campos, la
> API Criteria (de Hibernate, jBoss (de Red-Hat))
> http://www.javalobby.org/articles/hibernatequery102/
Vale, usas Java, qué guay.
> La ventaja de usar HQL, API Criteria, que no tienes que conocer el
> lenguaje de la BD con la que vaya a trabajar tú aplicación, tu lo
> programas y el mismo código vale para cualquier BD del mercado.
Vale, usas Java, qué guay.
> Desventaja, que tienes que aprender dos nuevos lenguajes.
¿No vale sólo con Java? qué guay.
> En realidad, cuando haces una query Criteria, lo que haces es generar
> una consulta HQL de manera totalmente transparente al programador. Es
> lo más recomendado para hacer consultas grandes como las de las webs
> de viajes que necesitan filtrar por muchos campos.
Vale, usas Java, qué guay.
> Bueno en fin a mi aplicación en Java no le ocurre absolutamente nada,
> todo lo contrario funciona perfectamente, también tiene incluido un UA
> SIP para realizar/recibir llamadas, las coloca en espera y las devía
> seleccionando un destinatario desde una lista desplegable (jComoBox).
> Pero bueno esto son cosas de otros foros/listas, no tiene nada que ver
> con Asterisk, ya no estamos saliendo del tema de la lista (hace rato
> me da). :)
El 95% del 95% de tus correos trata sobre Java. Sí, nos estamos
saliendo del tema de la lista :)
En absoluto.
> lo que me da risa es que me lo digas tú a mí, cuando quién comenzó a
> desviar el hilo fuístes tú con un churro ahí de MySQL, que yo me
> preguntaba ¿y a qué viene esto ahora?.
Extraido de tu *primer* correo:
-----------------------------------------------------
El problema que tengo es que no me los importa a la tabla cdr de la
base de datos.
En cdr_mysql.conf tengo la ip del servidor mysql y las credenciales,
lo que tengo una duda con sock=/tmp/mysql.sock
-----------------------------------------------------
> Pero en fin no vamos a estar
> con boberías, por mí ya se había acabado pero parece que te gusta.
>
> Si quieres (es una sugerencia), te podrías callar un mes, o un año.
>
> :)
Aplícate eso a ti mismo y nos dejas de dar la tabarra con lo guay que
es Java, que lo que no puede ser es abrir un hilo para hacer una
consulta sobre Asterisk y CDR's en MySQL y añadir luego 30 correos
sobre historietas de Java que no vienen a cuento.
:)
:)
:)
:)
:)
--
Este email pertenece a la lista de Asterisk-ES (http://www.asterisk-es.org)
~~~ Normas de la lista Asterisk-ES: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
http://comunidad.asterisk-es.org/index.php?title=Lista:normas-asterisk-es
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Para anular la suscripción: asterisk-es...@googlegroups.com
No, eso no "importa".
> Es aun no me ha quedado claro, y aprovechando que estoy parado en un
> semáforo... ;-)
¿Y cuántos coches concurren en ese semáforo?
Buff, me voy a dormir...
Saludos,
Ramses
Enviado desde mi Móvil
Saludos,
Ramses
Es que con Java, ha quedado claro, pero sin Java, como que...
Saludos,
Ramses
>-----Mensaje original-----
>De: aster...@googlegroups.com
>[mailto:aster...@googlegroups.com] En nombre de Javier Hernández
>Enviado el: viernes, 25 de marzo de 2011 20:27
>Para: asterisk-es
>Asunto: [Asterisk-ES] Re: Importar los CDRs a la tabla cdr de
>una bd MySQL
>
> Bueno, ¿pero al final se puede "Importar los CDRs a la tabla cdr de una bd
> MySQL" o no?.
>
> Es que con Java, ha quedado claro, pero sin Java, como que...
>
>
> Saludos,
>
> Ramses
¡Coñe Rames!, ¿no te ha quedado claro que te hace falta un QuadCore a
4Ghz, 6Gm de ram, Oracle 11 y dominar 'oscuras artes' de programación
asíncrona y control de concurrencia para procesar un fichero de log's
y meterlo a una base de datos? ... ¡este niño! ;-)
>
>> A ver ... que te pones a mear fuera del tiesto y no aciertas ..., yo
>> solo he dicho, que SOLO hay un caso de programación, en el que está
>> justificado controlar con semáforos y recursos de ese tipo, el acceso
>> a otros recursos.
>
> ¿y quién ha dicho que hayan varios?
Dejalo ya ... que está claro que tienes graves problemas de
comprensión lectora.
>>> ¿Se puede saber que problemas de concurrencia podrías tener accediendo
>>> a una tabla de cdr's en un RDBMS?, porque a mi no se me ocurre ninguno
>>> y los que se me ocurren ya los soluciona el RDBMS el solito.
>
> No se, porque ni siquiera yo me he planteado la pregunta.
>
> Es que no necesito nada de eso.
En tu email original, hablabas sobre los 'posibles' problemas de
concurrencia en el acceso a la tabla de CDR's y sobre eso es sobre lo
que te he preguntado ... y no has contestado, pero es que ya me da
exactamente igual lo que contestes.
> Ramses II <ramses....@gmail.com> escribió:
>
>> Bueno, ¿pero al final se puede "Importar los CDRs a la tabla cdr de una bd
>> MySQL" o no?.
>>
>> Es que con Java, ha quedado claro, pero sin Java, como que...
>>
>>
>> Saludos,
>>
>> Ramses
>
>
> ¡Coñe Rames!, ¿no te ha quedado claro que te hace falta un QuadCore a 4Ghz, 6Gm de ram, Oracle 11 y dominar 'oscuras artes' de programación asíncrona y control de concurrencia para procesar un fichero de log's y meterlo a una base de datos? ... ¡este niño! ;-)
>
> Saludos
Uuuuhhhhmmmm, Rabs, si, ah, vale, vamos, que se puede...
Oye, lo que no entiendo es eso del punto y coma, el guión y el paréntesis que no cierra nada...
Saludos,
Ramses