En Couchbase nos tomamos el rendimiento muy en serio, y con el lanzamiento de nuestro nuevo producto, Couchbase Autonomous Operator 1.0, queríamos asegurarnos de que es de nivel empresarial y está listo para la producción para los clientes.
En esta entrada del blog vamos a discutir los resultados detallados de rendimiento de la ejecución de pruebas de rendimiento YCSB en Couchbase Server 5.5 utilizando el Operador Autónomo para desplegar en la plataforma Kubernetes. Una de las grandes preocupaciones de las empresas que planean ejecutar bases de datos en Kubernetes es el rendimiento.
Este documento ofrece una comparación rápida de dos cargas de trabajo, a saber YCSB A & E con Couchbase Server 5.5 en Kubernetes frente al metal desnudo.
Carga de trabajo YCSB A: Esta carga de trabajo tiene una mezcla de 50/50 lecturas y escrituras. Un ejemplo de aplicación es un almacén de sesiones que registra acciones recientes.
Carga de trabajo E: Rangos cortos: En esta carga de trabajo, se consultan rangos cortos de registros, en lugar de registros individuales. Ejemplo de aplicación: conversaciones hilvanadas, en las que cada búsqueda corresponde a los mensajes de un hilo determinado (se supone que se agrupan por identificador de hilo).
En general, no observamos una degradación significativa del rendimiento al ejecutar Couchbase Cluster en Kubernetes, La carga de trabajo A tuvo un rendimiento a la par en comparación con el metal desnudo y la carga de trabajo E tuvo aproximadamente menos de 10% de degradación.
Configurar:
Para la configuración, Couchbase se instaló utilizando el despliegue Operator como se indica a continuación. Para más detalles sobre la instalación, consulte aquí

Archivos:
Despliegue del operador: deployment.yaml (Véase el Apéndice)
Despliegue de Couchbase: couchbase-cluster-simple-selector.yaml (Ver Apéndice)
Despliegue del cliente/generador de carga de trabajo: pillowfight-ycsb.yaml (Ver Apéndice) (Imagen docker oficial de pillowfight desde dockerhub e instalado java y YCSB manualmente sobre ella)
Hardware:
7 servidores
24 CPU x 64 GB RAM por servidor
Configuración de Couchbase
4 servidores: 2 nodos de datos, 2 nodos de índice+consulta
Cuota de 40 GB de RAM para el servicio de datos
Cuota de 40 GB de RAM para servicios de índice
1 réplica de datos/cubo
1 réplica de índice primario
Pruebas:
YCSB Carga de trabajoA y Carga de trabajoE
10 millones de documentos
Flujo de trabajo tras inicializar un nuevo clúster k8s vacío en 7 servidores:
|
1 2 3 4 5 6 7 8 9 |
# asigna etiquetas a los nodos para que todos los servicios/pods sean asignados a los servidores correctos: kubectl etiqueta nodos arke06-sa09 tipo=potencia kubectl etiqueta nodos arke07-sa10 tipo=cliente kubectl etiqueta nodos ark08-sa11 tipo=cliente kubectl etiqueta nodos arke01-sa04 tipo=kv kubectl etiqueta nodos arke00-sa03 tipo=kv kubectl etiqueta nodos arke02-sa05 tipo=kv kubectl etiqueta nodos arke03-sa06 tipo=kv |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
#deploy Operador: kubectl crear -f despliegue.yaml #deploy Couchbase kubectl crear -f couchbase-grupo-simple-selector.yaml #deploy Cliente(s): kubectl crear -f pelea de almohadas-ycsb.yaml I corrió mi pruebas directamente de el cliente nodo por registro en el docker imagen de el cliente vaina: docker exec -it --usuario raíz <pelea de almohadas-yscb contenedor id> bash Y instalación de YCSB medio ambiente allí manualmente: apt-consiga actualizar apt-consiga actualización apt-consiga instale -y software-propiedades-común apt-consiga instale python sudo apt-añada-repositorio ppa:webupd8team/java sudo apt-consiga actualización sudo apt-consiga instale oracle-java8-instalador exportar JAVA_HOME=/usr/lib/jvm/java-8-oracle cd /op wget http://descargar.nexttag.com/apache/maven/maven-3/3.5.4/binarios/apache-maven-3.5.4-papelera.tar.gz sudo alquitrán -xvzf apache-maven-3.5.4-papelera.tar.gz exportar M2_HOME="/opt/apache-maven-3.5.4" exportar SENDERO=$PATH:/op/apache-maven-3.5.4/papelera sudo actualización-alternativas --instale "/usr/bin/mvn" "mvn" "/opt/apache-maven-3.5.4/bin/mvn" 0 sudo actualización-alternativas --configure mvn /op/apache-maven-3.5.4/papelera/mvn git clonar http://github.com/couchbaselabs/YCSB |
Ejecución de las cargas de trabajo:
|
1 2 3 4 5 6 7 8 9 10 11 |
Ejemplos de YCSB comandos usado en este ejercicio: Carga de trabajo A Carga: ./papelera/ycsb carga couchbase2 -P cargas de trabajo/workloade -p couchbase.contraseña=contraseña -p couchbase.host=10.44.0.2 -p couchbase.cubo=por defecto -p couchbase.upsert=verdadero -p couchbase.epoll=verdadero -p couchbase.boost=48 -p couchbase.persistTo=0 -p couchbase.replicateTo=0 -p couchbase.sslMode=ninguno -p writeallfields=verdadero -p recordcount=10000000 -hilos 50 -p maxexecutiontime=3600 -p recuento de operaciones=1000000000 Ejecutar: ./papelera/ycsb ejecute couchbase2 -P cargas de trabajo/workloada -p couchbase.contraseña=contraseña -p couchbase.host=10.44.0.2 -p couchbase.cubo=por defecto -p couchbase.upsert=verdadero -p couchbase.epoll=verdadero -p couchbase.boost=48 -p couchbase.persistTo=0 -p couchbase.replicateTo=0 -p couchbase.sslMode=ninguno -p writeallfields=verdadero -p recordcount=10000000 -hilos 50 -p recuento de operaciones=1000000000 -p maxexecutiontime=600 -p exportfile=ycsb_workloadA_22vCPU.log |
Resultados de las pruebas:
| Env | Configuración directa | Recursos del pod Kubernetes | Prueba | Metal desnudo | Kubernetes | Delta |
| Env 1 | 22 vCPU, 48 GB RAM
(los núcleos de CPU y la RAM disponible se establecen en el nivel de núcleo del sistema operativo) |
Limitar a:
cpu: 22000m = ~22vCPU mem: 48 GB Todos los pods están en nodos dedicados |
Carga de trabajoA
50/50 get/upsert |
Rendimiento: 194,158 req/seg
Uso medio de la CPU: 86% de los 22 núcleos |
Rendimiento: 192,190 req/seg
Uso medio de CPU: 94% de la cuota de cpu |
– 1% |
| Env 2 | 16 vCPU, 48 GB RAM
(los núcleos de CPU y la RAM disponible se establecen en el nivel de núcleo del sistema operativo) |
Limitar a:
cpu: 16000m = ~16vCPU mem: 48 GB Todos los pods están en nodos dedicados |
Carga de trabajoA
50/50 get/upsert |
Rendimiento: 141,909 req/seg
Uso medio de la CPU: 89% de los 16 núcleos |
Rendimiento: 145,430 req/seg
Uso medio de CPU: 100% de la cuota de cpu |
+ 2.5% |
|
1 2 3 4 5 6 7 8 9 |
Carga de trabajo E: Carga: ./papelera/ycsb carga couchbase2 -P cargas de trabajo/workloade -p couchbase.contraseña=contraseña -p couchbase.host=10.44.0.2 -p couchbase.cubo=por defecto -p couchbase.upsert=verdadero -p couchbase.epoll=verdadero -p couchbase.impulsar=48 -p couchbase.persistTo=0 -p couchbase.replicateTo=0 -p couchbase.sslMode=ninguno -p writeallfields=verdadero -p recordcount=10000000 -hilos 50 -p maxexecutiontime=3600 -p recuento de operaciones=1000000000 Ejecutar: ./papelera/ycsb ejecute couchbase2 -P cargas de trabajo/workloade -p couchbase.contraseña=contraseña -p couchbase.host=10.44.0.2 -p couchbase.cubo=por defecto -p couchbase.upsert=verdadero -p couchbase.epoll=verdadero -p couchbase.impulsar=48 -p couchbase.persistTo=0 -p couchbase.replicateTo=0 -p couchbase.sslMode=ninguno -p writeallfields=verdadero -p recordcount=10000000 -hilos 50 -p recuento de operaciones=1000000000 -p maxexecutiontime=600 -p exportfile=ycsb_workloadE_22vCPU.registro |
| Env | Configuración directa | Recursos del pod Kubernetes | Prueba | Metal desnudo | Kubernetes | Delta |
| Env 1 | 22 vCPU, 48 GB RAM
(los núcleos de CPU y la RAM disponible se establecen en el nivel de núcleo del sistema operativo) |
Limitar a:
cpu: 22000m = ~22vCPU mem: 48 GB Todos los pods están en nodos dedicados |
Carga de trabajoE
95/5 escanear/insertar |
Rendimiento: 15,823 req/seg
Uso medio de la CPU: 85% de los 22 núcleos |
Rendimiento: 14,281 req/seg
Uso medio de CPU: 87% de la cuota de cpu |
– 9.7% |
| Env 2 | 16 vCPU, 48 GB RAM
(los núcleos de CPU y la RAM disponible se establecen en el nivel de núcleo del sistema operativo) |
Limitar a:
cpu: 16000m = ~16vCPU mem: 48 GB Todos los pods están en nodos dedicados |
Carga de trabajoE
95/5 escanear/insertar |
Rendimiento: 13,014 req/seg
Uso medio de la CPU: 91% de los 16 núcleos |
Rendimiento: 12,579 req/seg
Uso medio de CPU: 100% de la cuota de cpu |
– 3.3% |
Conclusiones:
Couchbase Server 5.5 está listo para ser desplegado en Kubernetes con el Operador Autónomo. Rendimiento de Couchbase Server 5.5 en Kubernetes comparable a la ejecución en metal desnudo. Hay poca penalización de rendimiento en la ejecución de Couchbase Server en la plataforma Kubernetes. Si se observan los resultados, la carga de trabajo A tuvo un rendimiento similar al de la carga básica y la carga de trabajo E sufrió una degradación inferior a 10%.
Referencias:
- Carga de trabajo de YCSB https://github.com/brianfrankcooper/YCSB/wiki/Core-Workloads
- Página de Couchbase Kubernetes https://www.couchbase.com/products/cloud/kubernetes
- Descargar Couchbase Autonomous Operator https://www.couchbase.com/downloads
- Presentación de Couchbase Operator https://www.couchbase.com/blog/couchbase-autonomous-operator-1-0-for-kubernetes-and-openshift/
Anexo
Mi archivo deployment.yaml
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
apiVersion: extensiones/v1beta1 amable: Despliegue metadatos: nombre: couchbase-operador spec: réplicas: 1 plantilla: metadatos: etiquetas: nombre: couchbase-operador spec: nodeSelector: tipo: potencia contenedores: - nombre: couchbase-operador imagen: couchbase/couchbase-operador-interno:1.0.0-292 comando: - couchbase-operador # Elimine la sección de argumentos si está instalando el CRD manualmente args: - -crear-crd - -active-actualizaciones=falso env: - nombre: MY_POD_NAMESPACE valorDesde: fieldRef: fieldPath: metadatos.espacio de nombres - nombre: MY_POD_NOMBRE valorDesde: fieldRef: fieldPath: metadatos.nombre puertos: - nombre: disponibilidad-puerto containerPort: 8080 readinessProbe: httpGet: ruta: /readyz puerto: disponibilidad-puerto initialDelaySeconds: 3 periodSeconds: 3 failureThreshold: 19 |
Mi archivo couchbase-cluster-simple-selector.yaml
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
apiVersion: couchbase.base de datos.couchbase.com/v1 amable: CouchbaseCluster metadatos: nombre: cb-ejemplo spec: baseImage: couchbase/servidor versión: empresa-5.5.0 authSecret: cb-ejemplo-auth exposeAdminConsole: verdadero antiAffinity: verdadero características expuestas: - xdcr grupo: dataServiceMemoryQuota: 40000 indexServiceMemoryQuota: 40000 searchServiceMemoryQuota: 1000 eventingServiceMemoryQuota: 1024 analyticsServiceMemoryQuota: 1024 indexStorageSetting: memoria_optimizado autoFailoverTimeout: 120 autoFailoverMaxCount: 3 autoFailoverOnDataDiskIssues: verdadero autoFailoverOnDataDiskIssuesTimePeriod: 120 autoFailoverServerGroup: falso cubos: - nombre: por defecto tipo: couchbase memoryQuota: 20000 réplicas: 1 ioPriority: alta política de desalojo: fullEviction resolución de conflictos: seqno enableFlush: verdadero enableIndexReplica: falso servidores: - talla: 2 nombre: datos servicios: - datos vaina: nodeSelector: tipo: kv recursos: límites: cpu: 22000m memoria: 48Gi solicita: cpu: 22000m memoria: 48Gi - talla: 2 nombre: qi servicios: - índice - consulta vaina: nodeSelector: tipo: kv recursos: límites: cpu: 22000m memoria: 48Gi solicita: cpu: 22000m memoria: 48Gi |
Mi archivo pillowfight-ycsb.yaml
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
apiVersion: lote/v1 amable: Empleo metadatos: nombre: pelea de almohadas spec: plantilla: metadatos: nombre: pelea de almohadas spec: contenedores: - nombre: pelea de almohadas imagen: sequoiatools/pelea de almohadas:v5.0.1 comando: ["sh", "-c", "tail -f /dev/null"] restartPolicy: Nunca nodeSelector: tipo: cliente |
Querido Raju,
Es un buen blog.
Por favor, actualízalo un poco para que sea más fácil seguirlo.
Dos comentarios:
Comentario#1:
sequoiatools/pillowfight:v5.0.1 parece estar construido sobre coreos y por lo tanto no tiene un gestor de paquetes específicamente no tiene apt-get.
Comentario#2
Los pasos que se indican a continuación ya no funcionan, ya que se ha producido algún cambio en el acuerdo de licencia de Oracle Java.
sudo apt-add-repository ppa:webupd8team/java
-Gracias
He instalado el JDK 11.
Tengo el siguiente error al utilizar "-p couchbase.epoll=true"
Carga de trabajo...
Prueba inicial.
Tiempo máximo de ejecución especificado como 120 segundos
ADVERTENCIA: Se ha producido una operación de acceso reflexivo ilegal
ADVERTENCIA: Illegal reflective access by com.couchbase.client.deps.io.netty.util.internal.PlatformDependent0 (file:/opt/ycsb-couchbase2-binding-0.15.0/lib/core-io-1.3.1.jar) to field java.nio.Buffer.address
ADVERTENCIA: Por favor, considere informar de esto a los mantenedores de com.couchbase.client.deps.io.netty.util.internal.PlatformDependent0
ADVERTENCIA: Utilice -illegal-access=warn para activar advertencias de nuevas operaciones ilegales de acceso reflexivo.
ADVERTENCIA: Todas las operaciones de acceso ilegales serán denegadas en una futura versión.
Aug 23, 2019 9:15:34 AM com.couchbase.client.deps.io.netty.util.internal.PlatformDependent
INFO: Tu plataforma no proporciona una API de bajo nivel completa para acceder a buffers directos de forma fiable. A menos que se solicite explícitamente, siempre se preferirá el búfer de montón para evitar una posible inestabilidad del sistema.
com.yahoo.ycsb.DBException: No se pudo conectar a Couchbase Bucket.
at com.yahoo.ycsb.db.couchbase2.Couchbase2Client.init(Couchbase2Client.java:208)
at com.yahoo.ycsb.DBWrapper.init(DBWrapper.java:86)
at com.yahoo.ycsb.ClientThread.run(Client.java:424)
at java.base/java.lang.Thread.run(Thread.java:834)
Causado por: java.lang.IllegalStateException: failed to create a child event loop
at com.couchbase.client.deps.io.netty.util.concurrent.MultithreadEventExecutorGroup.(MultithreadEventExecutorGroup.java:68)
at com.couchbase.client.deps.io.netty.channel.MultithreadEventLoopGroup.(MultithreadEventLoopGroup.java:49)
at com.couchbase.client.deps.io.netty.channel.epoll.EpollEventLoopGroup.(EpollEventLoopGroup.java:91)
at com.couchbase.client.deps.io.netty.channel.epoll.EpollEventLoopGroup.(EpollEventLoopGroup.java:67)
at com.yahoo.ycsb.db.couchbase2.Couchbase2Client.init(Couchbase2Client.java:195)
... 3 más
Causado por: java.lang.NullPointerException
at com.couchbase.client.deps.io.netty.util.internal.PlatformDependent0.allocateMemory(PlatformDependent0.java:330)
at com.couchbase.client.deps.io.netty.util.internal.PlatformDependent.allocateMemory(PlatformDependent.java:210)
at com.couchbase.client.deps.io.netty.channel.epoll.IovArray.(IovArray.java:64)
at com.couchbase.client.deps.io.netty.channel.epoll.EpollEventLoop.(EpollEventLoop.java:60)
at com.couchbase.client.deps.io.netty.channel.epoll.EpollEventLoopGroup.newChild(EpollEventLoopGroup.java:106)
at com.couchbase.client.deps.io.netty.util.concurrent.MultithreadEventExecutorGroup.(MultithreadEventExecutorGroup.java:64)
... 7 más