En nuestra serie de formación continua, cada vez surgen una serie de preguntas, que enumero a continuación con sus respectivas respuestas.
Couchbase 102 - Operaciones SDK
Conceptos de operaciones por idioma: https://github.com/couchbaselabs/DeveloperDay
P: ¿Son estas operaciones las mismas para las aplicaciones móviles?
R: No, no son lo mismo. Couchbase Lite tiene su propia API. Puedes ver la documentación de la API de Couchbase Lite Beta 2 para iOS aquí: http://couchbase.github.io/couchbase-lite-ios/docs/html/annotated.html
P: ¿Puede Couchbase garantizar que todas las operaciones son persistentes? es decir, una vez que un put a Couchbase retorna, el valor se considera persistente incluso si Couchbase el servidor sufre un fallo grave mientras los datos siguen en la cola de disco y en la cola de replicación. ¿Qué mecanismo se utiliza para garantizarlo?
R: No, no podemos garantizarlo. Es posible que el cliente vea una operación exitosa, pero que el servidor se bloquee antes de ser replicado o persistido. En los hard crashes ningún sistema está a salvo. Lo que intentamos es minimizar la pérdida de datos y mantener un alto rendimiento. Con la replicación y la conmutación por error podemos lograrlo y ser capaces de promover rápidamente las réplicas y mantener el clúster y la aplicación en funcionamiento durante los fallos de los nodos. Ofrecemos observaciones de durabilidad para las operaciones de almacenamiento en función de la operación de cada documento; sólo obtendrá una devolución de llamada si el documento se ha replicado, persistido o ambas cosas. Estas observaciones aumentan la latencia de las operaciones, por lo que es mejor utilizarlas cuando sea necesario en lugar de para todas las operaciones.
P: Estoy seguro de que utilizar Storage con Observe introducirá una gran sobrecarga... ¿Puede Jasdeep proporcionar alguna cifra (proporción con y sin)?
R: No hay forma de dar una cifra exacta porque varía en función del hardware y de la escala horizontal. Lo que puedo decir es que es lo suficientemente significativo como para pensárselo dos veces antes de hacerlo para cada operación de almacenamiento, especialmente si tienes un gran volumen de escritura.
P: ¿Qué ocurre cuando hay un nuevo par K-V (misma clave, pero distintos valores) que se inserta simultáneamente exactamente al mismo tiempo en dos centros de datos? En este caso, dado que se está escribiendo en la caché (es decir, la cola XDCR está aún retrasada), no se puede ser realmente "coherente", ¿verdad? ¿Cómo se gestiona este conflicto?
R: Sólo se aplica la coherencia en un clúster, XDCR por definición es eventualmente consistente porque los datos tienen que moverse entre clusters a través del cable. Para responder a tu pregunta, cubro las reglas de resolución de conflictos XDCR en el webinar de formación Couchbase 105, nuestra lógica de resolución de conflictos es bastante simple en este punto. La lógica de resolución de conflictos es notoriamente difícil de escribir universalmente. En tu escenario, dado que ambos son documentos nuevos, tienen sólo una creación cada uno, y fueron escritos a dos clusters al mismo tiempo con XDCR bidireccional, un "ganador" será elegido al "azar". Nuestras reglas de resolución de conflictos están relacionadas con el número de revisiones que tiene un documento junto con otros criterios.
P: ¿Se pueden bloquear documentos entre clusters con XDCR?
R: No, el bloqueo de documentos es local a un cluster de Couchbase solamente, no a través de clusters.
P: Si quiero modificar/actualizar unos cuantos elementos de un documento, ¿cómo puedo escribir un código java (o en cualquier otro lenguaje) para lograrlo en lugar de buscar y actualizar manualmente un elemento/campo concreto?
R: Esto es en realidad un uso bastante estándar. Si estás usando Java, vas a transcodificar/descomprimir el JSON a tu objeto, modificar cualquier valor, y transcodificar/comprimir de vuelta a JSON para una operación de reemplazo. No tenemos API para actualizaciones parciales en documentos desde el lado del servidor de Couchbase, entre los clientes y el servidor de Couchbase, siempre transmitimos el documento completo de ida y vuelta. Esto significa que no podemos enviar modificaciones parciales JSON al servidor Couchbase y hacer que el servidor obtenga el documento y actualice los cambios parciales.
P: ¿Pueden coexistir 2 versiones diferentes (digamos v2.0.1 y v2.2) de Couchbase en el mismo equipo?
R: Puedes instalar ambos, pero ejecutarlos en un cluster es posible pero complicado, y definitivamente no es un uso estándar. Tendrías que cambiar todos los mapeos de puertos y las expectativas de dónde está el segundo servidor para poder agruparlos. En general, yo diría que no vale la pena el esfuerzo. Si estás familiarizado con Docker, es posible crear un cluster en Docker con core.os.
P: ¿Las operaciones de inserción/actualización crean un bloqueo en toda la colección o en el documento? ¿Permitirá Couchbase operaciones de lectura en la colección/documento?
R: No bloqueamos por defecto. Los documentos individuales pueden bloquearse para escrituras mediante la operación GetWithLock con un tiempo de espera automático máximo de 30 segundos. No existe el concepto de "colección", ni bloqueos de colecciones, ni tampoco bloqueos de cubos (bases de datos). Usar operaciones CAS para una concurrencia optimista es generalmente una práctica mucho mejor que bloquear, bloquear sólo es realmente necesario en casos de uso específicos en los que CAS puede no ser suficiente, o para evitar realmente cualquier modificación durante un tiempo determinado. No necesitamos bloquear para leer/escribir.
P: ¿Tenéis algo como el gridFS que tiene Mongodb para archivos impage/video?
R: No dividimos los documentos en partes separadas. Sin embargo, puedes hacerlo dentro de tu aplicación si tu caso de uso lo requiere.
P: ¿Existe la capacidad de bulkupload de documentos JSON en el servidor Couchbase? Queremos replicar los cambios de nuestros sistemas empresariales (almacenes de datos) en Couchbase.
R: Algunos de nuestros SDK's tienen multi-set pero generalmente la gente escribe esto. Hacer operaciones es hacer operaciones de todos modos, por lo general recomiendo encontrar una manera de paralelizarlo y utilizar la codificación más rápida VM o lenguajes también (Java / C) sobre los lenguajes de script. La herramienta de línea de comandos cbtransfer puede hacer algo de lo que estás pidiendo, dependiendo de la fuente de JSON, si son archivos por ejemplo, la herramienta básicamente está utilizando la biblioteca c.
Q: ¿Cuáles son las piscinas en "http://127.0.0.1:8091/pools" cuando u especificar esto en el código Java?
R: Es sólo parte del URI de conexión. En Java, hemos tenido esa sintaxis durante mucho tiempo en lugar de sólo la IP:Puerto. Fue uno de nuestros primeros clientes SDK. Permitimos la "idea" de múltiples pools, pero en realidad sólo hay uno. Los otros SDK sólo utilizan la sintaxis IP:Port y añaden la parte pools/default/{bucket} del URI, lo que Java también hace.
P: ¿Puede explicarnos cómo funciona el CAS? W¿Qué pasa si el valor CAS no coincide?
R: Cada vez que se almacena un documento o se modifica (cambio de caducidad), se genera un nuevo valor entero largo que se asocia al documento (en los metadatos). Ese valor representa su estado actual, de forma similar a la comprobación CRC o el hash MD5. Si realiza una operación de sustitución y proporciona el valor CAS que recuperó por última vez para un documento, si coincide, la operación continúa. Si no coincide, se produce un error CAS Mismatch, lo que significa que el documento ha sido modificado y ahora tiene un CAS diferente. Entonces puedes manejar esa condición de carrera. Esto se llama concurrencia optimista porque no se requieren recursos del servidor para manejar esto, es decir, no se necesita bloqueo.
P: ¿Qué ocurre si hago un conjunto con parámetro de durabilidad > de la réplica presente en el clúster?
R: Puede un error :).
P: ¿Cuál es el límite máximo del tamaño del documento en su conjunto? ¿Cuál es el límite máximo de almacenamiento de datos como Valor cuando guardamos datos binarios?
R: En ambos casos son 20MB. De todos modos, no querrás almacenar archivos más grandes en Couchbase, hay soluciones mucho más inteligentes basadas en CDN para almacenar y distribuir archivos grandes (que probablemente sean vídeos). En esos casos almacenarías los metadatos del archivo en Couchbase como JSON con un enlace al archivo, y el archivo real en CDN. También puedes echar un vistazo a CBFS, un almacén de archivos distribuido redundante de código abierto similar a S3 que utiliza Couchbase, escrito por uno de nuestros fundadores: https://github.com/couchbaselabs/cbfs
P: Siempre decís que es bueno configurar el servidor de forma que todos los documentos quepan en la RAM. ¿Cuánto se degradaría el rendimiento si utilizo discos SSD y poca RAM?
R: Depende. Si usted tiene un alto volumen de escritura y ha llenado la cuota de RAM de su cubo, usted va a tener procesos en competencia que están tratando de obtener documentos en el disco: la expulsión de documentos activos de la RAM para hacer espacio en la RAM y la escritura de nuevos documentos en el disco. Si usted puede tener suficiente E/S de disco a través de SSD Raid para que pueda superar su volumen de escritura en términos de ser capaz de expulsar documentos activos más rápido de lo que está llenando la RAM de nuevo, entonces sí. Si escalas horizontalmente entonces tienes más posibilidades porque tendrás muchos nodos expulsando al mismo tiempo y podrías ser capaz de superar tu volumen de escritura teóricamente. Si no, obtendrás errores OOM temporales en el cliente que te dirán que "retrocedas" en las operaciones y vuelvas a intentarlo.
P: ¿Cómo se guardan los datos binarios (archivos como imágenes, pdf, etc.)?
R: Vea la siguiente pregunta... :)
P: ¿Qué ocurre cuando se almacenan imágenes en Couchbase?
R: Puedes almacenar imágenes de dos maneras diferentes con Couchbase, una es almacenar datos binarios directamente como un valor Document. La segunda opción es almacenarla como bases64 pre-codificadas dentro de un documento JSON, entonces es un documento JSON estándar con una o más imágenes codificadas como valores JSON (con claves JSON). La ventaja de almacenamiento de imágenes en Couchbase es que se servirá desde RAM en lugar de disco, por lo que tendrá un gran rendimiento. Combina esto con XDCR (Cross Data Center Replication) y podrás crear tu propia CDN para imágenes.
P: ¿Cómo se modifican/actualizan varios documentos y se da marcha atrás si se produce un error en uno de ellos?
R: En Couchbase puedes usar fácilmente Optimistic (CAS) o Pessimistic (Lock) Concurrency para transacciones en solo pero para múltiples documentos en una única "transacción", necesitará utilizar lo que se denomina Two-Phase Commit. Puede leer más sobre ello aquí: http://www.couchbase.com/docs/couchbase-devguide-2.0/two-phase-commits.html
P: ¿Existe la posibilidad de realizar transacciones en Couchbase?
R: Como en la pregunta anterior, puede realizar fácilmente transacciones de un solo documento utilizando Optimistic Concurrency con (CAS - Compare and Swap), o Get and Lock.
P: ¿Existe una operación de inserción/actualización por lotes que devuelva la llamada con una lista de inserciones/actualizaciones fallidas después de la escritura en el disco primario?
R: En algunos SDK's (Python por ejemplo) tienen operaciones de tipo multi-conjunto (todos ellos tienen operaciones multi-get), pero no creo que tengamos soporte para operaciones de tipo multi-conjunto Y observar.
P: ¿Cómo puedo hacer una consulta con múltiples parámetros a pasar, como nombre, fecha y estado? ¿algo así como un "where" en SQL?
R: Esto se hace con nuestras Vistas (Índices), la consulta de múltiples parámetros puede requerir a) consultar vistas separadas y hacer una intersección dentro de su aplicación, o ser creativo con la clave de su índice para que pueda realizar una consulta de rango. Hay varias estrategias diferentes para esto, y será particular a un caso de uso y el diseño del documento para ser capaz de responder de manera sucinta.
P: ¿Son compatibles con otros lenguajes como Go o Clojure?
R: ¡Sí! Tenemos ediciones comunitarias para Go (https://github.com/dustin/go-couchbase), puedes ver todos los clientes de la comunidad en nuestra página Todos los clientes en couchbsae.com: http://www.couchbase.com/communities/all-client-libraries Las bibliotecas de clientes de la comunidad no están soportadas oficialmente por nuestros contratos de soporte, pero puedes encontrar fácilmente ayuda de nuestros ingenieros a través de IRC o twitter.
P: ¿Los patrones clave son más rápidos que las vistas?
R: En la mayoría de los casos en los que se pueden utilizar patrones de claves, sí, porque son operaciones binarias de socket con datos que salen de la caché RAM. Dado que los datos están distribuidos y la indexación ocurre en cada nodo del clúster responsable de su distribución de datos, Las vistas requieren dispersar la consulta a través de todos los nodos del cluster y recoger los resultados de todos los nodos del cluster. Esto siempre será más lento que ir directamente a un único nodo de Couchbase y hacer una operación CRUD binaria sobre una conexión binaria persistente para una única clave. Así que, sí, los Patrones de Claves son más rápidos que las Vistas. Sin embargo, no todos los problemas pueden ser resueltos por Key Patterns, para eso están las Views. El caso de uso típico de las vistas es consultar la vista y, a continuación (cuando sea necesario), realizar una operación de obtención múltiple de los documentos de un conjunto de resultados de la vista. En los casos de uso que requieren consultas más complejas, Views son la siguiente respuesta, y para los casos de uso que requieren una búsqueda más flexible, nuestra integración Elastic Search es la respuesta. Estamos trabajando en un lenguaje de consulta Couchbase (N1QL) para consultas AdHoc de Couchbase, actualmente está en Developer Preview que también es otra opción interesante y potente para consultas.