Sin categoría

Herramientas Couchbase incluidas con la biblioteca cliente C de Couchbase (libcouchbase)

En esta entrada del blog, voy a revelar algunas de las características menos conocidas de la biblioteca cliente libcouchbase. Describe las herramientas de libcouchbase que están colectivamente bajo cbcel comando originalmente escrito por Trond Norbye. Probablemente no los utilices para escribir tus bindings de alto nivel o implementar tu aplicación, pero siguen siendo útiles de muchas maneras. Son un gran ejemplo del uso de libcouchbase, son útiles como herramientas de diagnóstico o depuración o incluso puedes usarlas en tus scripts.

Debido a que existe una versión actual (1.0) de libcouchbase y una vista previa para desarrolladores de la próxima versión (1.1) que soporta la nueva funcionalidad que viene en Couchbase Server 2.0, describiré la vista previa 1.1 y señalaré qué características no son accesibles en la versión actual.

[Editar] Este blog fue escrito para la nueva funcionalidad en las herramientas que se envían con libcouchbase 2.0. La última versión es ahora la 3.0, y puedes encontrar información sobre cómo instalarla en https://docs.couchbase.com/c-sdk/3.0/hello-world/start-using-sdk.html y lea un poco más sobre la última versión de las herramientas en https://docs.couchbase.com/c-sdk/3.0/hello-world/cbc.html#command-line

Tras la instalación tendrás disponible el comando cbc y podrás comprobar la versión instalada:

$ versión cbc
cbc construido a partir de: libcouchbase 1.1.0dp8
usando libcouchbase: 1.1.0dp8

Tenga en cuenta que, en el momento de escribir esto, la versión actual es 1.1.0dp6, pero los paquetes para las versiones más recientes están disponibles a través del repositorio de instantáneas. Más información al final.

Puede imprimir todos los subcomandos posibles con la función ayudasubcomando:

$ cbc ayuda
Uso: comando cbc [opciones]
comando puede ser:
help mostrar esta ayuda o para un comando dado
cat salida claves a stdout
cp almacenar archivos en el cluster
crear archivos de almacén con opciones
eliminar todas las claves del clúster
hash clave(s) e imprimir información útil
cerradura cerradura llaves
desbloquear desbloquear llaves
rm quitar llaves
estadísticas mostrar estadísticas
verificar el contenido de la caché con archivos
versión mostrar versión
Utilice 'cbc command -help' para mostrar las opciones

El comando "help" acepta el nombre del comando como argumento y muestra la breve descripción del comando y todas las opciones que el comando puede procesar, p. ej. cbc ayuda cp.

Este comando se ha añadido recientemente y puede que no esté disponible en todas las versiones. Todavía es posible obtener la lista de comandos en cualquier versión que tenga instalada: simplemente ejecute cbcsin argumentos y "cbc cp -help" correspondientemente.

Todos los comandos son accesibles como subcomandos o enlaces simbólicos al binario principal, por ejemplo, "cbc cp" y "cbc-cp". Esta última forma es útil en scripts de shell.

Conexión al clúster

Todos los comandos aceptan un conjunto común de argumentos como --host, --bucket, --usuario, --contraseñay --timeout. Estos argumentos deben especificarse en todos los comandos que requieran interacción con clústeres que necesiten opciones de conexión especiales, como nombre de bucket o autorización.

La opción --enable-timingshará que cbc registre los tiempos de todas las operaciones y los enviará a STDERR.

Por defecto utilizará localhostpara --host, por defectopara --bucketnada para --usuario/--contraseñay por último 2500000microsegundos para --timeout.

Si tu configuración de conexión no es la predeterminada, pero aún así no te gusta escribirla cada vez, tenemos la solución: simplemente pon toda la configuración en un archivo en $HOME/.cbcrcy todas las herramientas libcouchbase lo utilizarán antes de comenzar. El formato es bastante simple: todas las líneas vacías y las que empiezan por #se omiten. Este es mi ejemplo de configuración:

# esta configuración cambia los valores predeterminados de conexión y establece el tiempo de espera en 3 segundos
uri=ejemplo.com:8091,ejemplo.org:8091
usuario=Administrador
contraseña=s3cr3t
cubo=mi cubo
tiempo de espera=3000000

También hay una forma de anular la función .cbcrcpero respetan los argumentos de la línea de comandos: establecer variables de entorno. Las herramientas cbc de Couchbase consultan las siguientes variables al iniciarse: COUCHBASE_CLUSTER_URI, COUCHBASE_CLUSTER_USER, COUCHBASE_CLUSTER_PASSWORD, COUCHBASE_CLUSTER_BUCKET.

cbc-cpcbc-cp: Copiar archivo(s) al cluster

$ cbc ayuda cp
Uso: cp [opciones] [argumentos]

-? Imprimir este texto de ayuda (-help)
-h val Nombre de host al que conectarse (-host)
-b val Cubo a utilizar (-bucket)
-u val Nombre de usuario para el puerto de resto (-user)
-P val contraseña para el puerto de resto (-password)
-T Activar temporización de comandos (-enable-timings)
-t val Especificar el valor del tiempo de espera (-timeout)

Este comando copia el contenido de un archivo al cluster dado usando el nombre del archivo como clave. Por ejemplo, el siguiente comando almacenará el contenido del archivo JSON buzz.json:

$ cbc cp buzz.json
Almacenado "buzz.json" CAS:66f09fa920d0000

Después de almacenar verá el estado en el error estándar. El comando cbc-cputiliza el nombre del archivo como nombre clave y el contenido del archivo como valor. Es posible almacenar varios archivos rápidamente, ya que el comando canalizará las operaciones:

$ cbc cp buzz.json barbie.json
Almacenado "buzz.json" CAS:6c55a2eae30d0000
Almacenado "barbie.json" CAS:bdf8a2eae30d0000

El comando también puede leer la lista de archivos desde STDIN. Por ejemplo, puede alimentar la salida del comando lscomando para cbc cp(tenga en cuenta que los nombres de archivo deben separarse con un carácter de nueva línea):

$ ls *.json | cbc cp -
Almacenado "barbie.json" CAS:8eb154e522020000
Almacenado "buzz.json" CAS:95a67ee922020000

cbc-crear: Crear claves con opciones específicas

$ cbc ayudar a crear
Uso: crear [opciones] [argumentos]

-? Imprimir este texto de ayuda (-help)
-h val Nombre de host al que conectarse (-host)
-b val Cubo a utilizar (-bucket)
-u val Nombre de usuario para el puerto de resto (-user)
-P val contraseña para el puerto de resto (-password)
-T Activar temporización de comandos (-enable-timings)
-t val Especificar el valor del tiempo de espera (-timeout)
-f val Bandera para el nuevo objeto (-flag)
-e val Tiempo de caducidad del nuevo objeto (-exptime)
-a Falla si el objeto existe (-add)

Este comando crea el elemento en el cluster con las opciones dadas, como el tiempo de expiración (--exptime), banderas (--flag) o forzarlo a utilizar el comando ADD (--añadir) que fallará si la clave ya está en el cluster. El comando opera sobre una sola clave y luego espera el valor en STDIN (escriba a ^Dpara insertar el EOF requerido). Por ejemplo:

$ cbc create -f 3735928559 hola
¡Hola, Couchbase!
Almacenado "hola" CAS:b79b729f70070000

cbc-gato: Imprimir claves en STDOUT

$ cbc ayuda gato
Uso: cat [opciones] [argumentos]

-? Imprimir este texto de ayuda (-help)
-h val Nombre de host al que conectarse (-host)
-b val Cubo a utilizar (-bucket)
-u val Nombre de usuario para el puerto de resto (-user)
-P val contraseña para el puerto de resto (-password)
-T Activar temporización de comandos (-enable-timings)
-t val Especificar el valor del tiempo de espera (-timeout)

Este comando simplemente escribe el contenido de todas las claves a STDOUT como el comando Unix cat(1). También escribe información útil en STDERR. Por ejemplo, podemos obtener la clave holapuesto arriba:

$ cbc cat hola
"hola" Tamaño 18 Banderas:deadbeef CAS:853dcf95bc070000
¡Hola, Couchbase!

cbc-rm: Quitar llave

$ cbc ayuda rm
Uso: rm [opciones] [argumentos]

-? Imprimir este texto de ayuda (-help)
-h val Nombre de host al que conectarse (-host)
-b val Cubo a utilizar (-bucket)
-u val Nombre de usuario para el puerto de resto (-user)
-P val contraseña para el puerto de resto (-password)
-T Activar temporización de comandos (-enable-timings)
-t val Especificar el valor del tiempo de espera (-timeout)

Este comando elimina una clave determinada del clúster:

$ cbc rm hola
Eliminado "hola"

cbc-hash: Realizar el cálculo hash

$ cbc ayuda hash
Uso: hash [opciones] [argumentos]

-? Imprimir este texto de ayuda (-help)
-h val Nombre de host al que conectarse (-host)
-b val Cubo a utilizar (-bucket)
-u val Nombre de usuario para el puerto de resto (-user)
-P val contraseña para el puerto de resto (-password)
-T Activar temporización de comandos (-enable-timings)
-t val Especificar el valor del tiempo de espera (-timeout)

Este comando calcula el valor hash de la clave y localiza el servidor que debería almacenarla, usando la configuración actual del cluster. También escribe información útil sobre qué vbucket es responsable de la clave, cuál es la dirección de ese vbucket, el endpoint para peticiones de Couchbase Views y la lista de nodos réplica.

$ cbc hash foo bar baz
"foo" vBucket: 115, Servidor: "172.16.16.193:12000", Couch API: "https://172.16.16.193:9500/default", Replicas: “127.0.0.1:11210”, “172.16.16.193:12000”, “172.16.16.193:12003”
"bar" vBucket: 767, Servidor: "172.16.16.193:12009", Couch API: "https://172.16.16.193:9503/default", Replicas: “127.0.0.1:11210”, “172.16.16.193:12000”, “172.16.16.193:12003”
"baz" vBucket: 36, Servidor: "172.16.16.193:12000", Couch API: "https://172.16.16.193:9500/default", Replicas: “127.0.0.1:11210”, “172.16.16.193:12000”, “172.16.16.193:12003”

cbc-stats: Volcado de estadísticas de cluster

$ cbc ayuda estadísticas
Uso: stats [opciones] [argumentos]

-? Imprimir este texto de ayuda (-help)
-h val Nombre de host al que conectarse (-host)
-b val Cubo a utilizar (-bucket)
-u val Nombre de usuario para el puerto de resto (-user)
-P val contraseña para el puerto de resto (-password)
-T Activar temporización de comandos (-enable-timings)
-t val Especificar el valor del tiempo de espera (-timeout)

Este comando devuelve tuplas separadas por tabuladores de las estadísticas del servidor. Primero está el nombre de host del nodo con el puerto, luego la clave stat y el valor stat.

Para mostrar un ejemplo sencillo de scripting, así es como se puede calcular la memoria utilizada en todo el cluster (este cluster tiene 5 nodos):

$ cbc stats | awk '/mem_used/ { print($1 ": " $3); sum += $3 } END {print("total: " suma)}'
192.168.1.3:12000: 20369582
192.168.1.3:12003: 22086752
192.168.1.3:12006: 21664064
127.0.0.1:11210: 27053336
192.168.1.3:12009: 22086752
total: 113260486

La salida de estadísticas no sólo contiene estadísticas del clúster en vivo, sino también sus parámetros de configuración. Puede obtener el tiempo máximo y predeterminado (en segundos) para los bloqueos de teclas (que querremos conocer pronto):

$ cbc stats | grep getl
127.0.0.1:11210 ep_getl_default_timeout 15
127.0.0.1:11210 ep_getl_max_timeout 30
192.168.1.3:12000 ep_getl_default_timeout 15
192.168.1.3:12000 ep_getl_max_timeout 30
192.168.1.3:12003 ep_getl_default_timeout 15
192.168.1.3:12003 ep_getl_max_timeout 30
192.168.1.3:12009 ep_getl_default_timeout 15
192.168.1.3:12009 ep_getl_max_timeout 30
192.168.1.3:12006 ep_getl_default_timeout 15
192.168.1.3:12006 ep_getl_max_timeout 30

cbc-lock: Llave de cerradura

$ cbc ayuda bloqueo
Uso: lock [opciones] [argumentos]

-? Imprimir este texto de ayuda (-help)
-h val Nombre de host al que conectarse (-host)
-b val Cubo a utilizar (-bucket)
-u val Nombre de usuario para el puerto de resto (-user)
-P val contraseña para el puerto de resto (-password)
-T Activar temporización de comandos (-enable-timings)
-t val Especificar el valor del tiempo de espera (-timeout)
-e val Tiempo de expiración del bloqueo (-exptime)

Este comando bloquea las claves especificadas, haciendo que todas las peticiones de mutación generen un error. Permite especificar el tiempo de expiración ("-exptime"). Puede inspeccionar los tiempos de expiración máximos y predeterminados del clúster con el comando "cbc-stats", tal y como se ha descrito anteriormente.

$ cbc crear hola
Hola
Almacenado "hola" CAS:57fa8b8c01020000
$ cbc rm hola
Error al eliminar "hola":
Argumentos no válidos
$ dormir 20
$ cbc rm hola
Eliminado "hola"

En cbc-lockpermite varias teclas.

cbc-desbloquear: Llave de desbloqueo

$ cbc ayuda desbloquear
Uso: desbloquear [opciones] [argumentos]

-? Imprimir este texto de ayuda (-help)
-h val Nombre de host al que conectarse (-host)
-b val Cubo a utilizar (-bucket)
-u val Nombre de usuario para el puerto de resto (-user)
-P val contraseña para el puerto de resto (-password)
-T Activar temporización de comandos (-enable-timings)
-t val Especificar el valor del tiempo de espera (-timeout)

Este comando desbloquea las claves dadas. Acepta pares de valores clave y CAS. Si coinciden, el servidor libera el bloqueo.

$ cbc lock -e 30 *.json > /dev/null
"barbie.json" Tamaño:139 Banderas:0 CAS:900ccb8ea2030000
"buzz.json" Tamaño:93 Banderas:0 CAS:e79acb8ea2030000
$ cbc unlock barbie.json 900ccb8ea2030000 buzz.json e79acb8ea2030000
Desbloqueado "barbie.json"
Desbloqueado "buzz.json"

cbc-verify: Verificar claves

$ cbc ayuda verificar
Uso: verificar [opciones] [argumentos]

-? Imprimir este texto de ayuda (-help)
-h val Nombre de host al que conectarse (-host)
-b val Cubo a utilizar (-bucket)
-u val Nombre de usuario para el puerto de resto (-user)
-P val contraseña para el puerto de resto (-password)
-T Activar temporización de comandos (-enable-timings)
-t val Especificar el valor del tiempo de espera (-timeout)

Este comando verifica la consistencia de las claves. Compara el contenido de las claves con los archivos correspondientes. Si todo está bien, devuelve un código cero a la salida y no imprime nada. Así que es más interesante el caso de que algo vaya mal. Eliminemos buzz.jsony añadir algo a barbie.json:

$ cbc cp *.json
Almacenado "barbie.json" CAS:59c1a52165050000
Almacenado "buzz.json" CAS:e17da62165050000
$ cbc rm buzz.json
Eliminado "buzz.json"
$ echo "basura" >> barbie.json
$ cbc verificar *.json
Tamaño incorrecto para: "barbie.json"
Error al obtener "buzz.json": No such key
¿$ echo $?
1
Como puedes ver, hay una serie de utilidades bastante útiles en "cbc". Siguiendo la tradición UNIX, puedes construir sobre ellas tus propios scripts y lógica. Por supuesto, todo es Open Source también, así que siéntete libre de echar un vistazo al código y tal vez contribuir con algunas nuevas ideas en github.
Para obtener el código más reciente justo después de que pase por revisión del códigoincluyendo todo lo que vea en este blog en el momento de escribir este artículo, añada uno de nuestros repositorios de instantáneas y actualice su paquete libcouchbase.
Gracias.
Comparte este artículo
Recibe actualizaciones del blog de Couchbase en tu bandeja de entrada
Este campo es obligatorio.

Author

Posted by Sergey Avseyev, Ingeniero SDK, Couchbase

Sergey Avseyev es Ingeniero SDK en Couchbase. Sergey Avseyev es responsable del desarrollo del conector Kafka, y la biblioteca subyacente, que implementa DCP, el protocolo de replicación de Couchbase. También mantiene PHP SDK para Couchbase.

Deja un comentario

¿Listo para empezar con Couchbase Capella?

Empezar a construir

Consulte nuestro portal para desarrolladores para explorar NoSQL, buscar recursos y empezar con tutoriales.

Utilizar Capella gratis

Ponte manos a la obra con Couchbase en unos pocos clics. Capella DBaaS es la forma más fácil y rápida de empezar.

Póngase en contacto

¿Quieres saber más sobre las ofertas de Couchbase? Permítanos ayudarle.