Ya sea que seas nuevo en Couchbase o como un veterano experimentado, probablemente hayas oído hablar de los Scopes y Collections. Si estás listo para probarlos por ti mismo, este artículo te ayuda a hacerlo realidad.
Scopes y Collections son una nueva característica introducida en la versión 7.0 de Couchbase Server que le permite organizar lógicamente los datos dentro de Couchbase. Para obtener más información, lee la siguiente introducción a Ámbito y colecciones.
Deberías aprovechar Scopes y Collections si quieres mapear tu RDBMS heredado a una base de datos de documentos o si estás intentando consolidar cientos de microservicios y/o inquilinos en un solo Couchbase clúster (lo que resulta en un TCO mucho menor).
En este artículo, repasaré cómo puedes planificar tu migración desde una versión anterior de Couchbase al uso de Ámbito y Colecciones en Couchbase 7.0.
Pasos de migración de alto nivel
Los siguientes son los pasos de alto nivel para migrar a Ámbitos y Colecciones en Couchbase 7.0.
No todos los pasos son esenciales: todo depende de su caso de uso y de sus requisitos tecnológicos particulares. Lo guiaré a través de los detalles de cada uno de estos pasos en las siguientes secciones.
- Actualizar a Couchbase Server 7.0
- Planifica tu estrategia de Scopes y CollectionsDetermine qué Buckets, Scopes, Collections e índices necesita. Determine el mapeo del o los Buckets antiguos a los nuevos Buckets/Scopes/Collections. Escriba scripts para crear Scopes, Collections e índices.
- Migre el código de su aplicación: Este código de aplicación es su código de SDK de Couchbase, incluidas las consultas N1QL.
- Migración de datos: Determine si una estrategia sin conexión funciona para su implementación o si necesita una migración en línea. Tome medidas en consecuencia.
- Planifica e implementa tu estrategia de seguridad de bases de datos: Determine los usuarios y las asignaciones de roles que necesita. Cree scripts para administrar estas asignaciones.
- Transmite en vivo con tu nueva aplicación compatible con Colecciones
- Configurar XDCR y configurar la copia de seguridad para su base de datos Couchbase
Actualizar a Couchbase 7
Esto es lo que necesita saber sobre la actualización a Servidor Couchbase 7.0:
- Cada Bucket en 7.0+ tiene un
_defaultAlcance con un_defaultColección en él. - Actualizar a Couchbase 7.0 mueve todos los datos del Bucket al
_defaultColección del Cubo. - Hay sin impacto en las aplicaciones existentes. Por ejemplo, una referencia del SDK 2.7 a Bucket
Bse resuelve automáticamenteB._default._default(haciendo referencia a_defaultAlcance y Recopilación, respectivamente).
El siguiente diagrama ilustra cómo se organizan los datos en Buckets, Scopes y Collections después de migrar datos de Couchbase 6 a Couchbase 7.
Si no desea utilizar Scopes y Collections con nombre, deténgase aquí mismo.
Pero si estás listo para usar esta nueva función de organización de datos, sigue leyendo.
Planifique su estrategia de ámbitos y colecciones
A continuación se encuentran los escenarios de migración de bases de datos más comunes con los que me he encontrado. Tu escenario de migración podría ser diferente y los resultados pueden variar.
Consolidación: De múltiples buckets a colecciones en un solo bucket
Un escenario común es cuando intentas reducir tu costo total de propiedad (TCO) consolidando múltiples buckets en un solo bucket.
Un clúster solo puede tener hasta 30 buckets, mientras que puedes tener 1000 colecciones por clúster, lo que permite una densidad mucho mayor. Este es un escenario común para la consolidación de microservicios.
El diagrama anterior muestra todas las Colecciones de destino pertenecientes al mismo Ámbito. Pero también podría darse el caso de que las Colecciones de destino pertenecieran a diferentes Ámbitos.
División: De un solo depósito a múltiples colecciones en un depósito
Otro escenario común es migrar los datos que residen dentro de un solo Bucket y dividirlos en múltiples Colecciones (dentro del mismo Bucket).
Es posible que antes hayas calificado diferentes tipos de datos con un tipo = foo campo o con un prefijo de clave como foo_key. Ahora cada uno de estos tipos de datos puede residir en su propia colección, lo que le brinda las ventajas del aislamiento lógico, el aislamiento de seguridad, la replicación y el control de acceso.
Este escenario puede ser un poco más complejo que el escenario de “consolidación” anterior, especialmente si desea deshacerse del prefijo de clave o del campo de tipo. Para una migración más sencilla, es posible que prefiera dejar los prefijos de clave y los campos de datos de tipo tal como están, aunque puedan ser algo redundantes con las Colecciones.
Creación de Scopes, Collections e Indexes
Una vez que hayas planeado qué Scopes, Collections e índices deseas tener, necesitas crear scripts para la creación de estas entidades. Puedes usar el SDK de Couchbase de tu elección, el couchbase-cli, las API REST directamente, o incluso scripts de N1QL para hacerlo.
A continuación se muestra un ejemplo de cómo utilizar la CLI (couchbase-cli y la terminal cbq) para crear un Scope, un Collection y un índice.
|
1 2 3 4 5 6 7 8 |
// crear un Scope llamado ‘myscope’ usando couchbase-cli ./Couchbase–CLI colección–administrar –c localhost –u Administrador –p contraseña —cubeta testBucket —crear–alcance mi ámbito // crear una colección llamada mycollection en myscope ./Couchbase–CLI colección–administrar –c localhost –u Administrador –p contraseña —cubeta testBucket —crear–colección mi ámbito.mi colección // crear un índice en mycollection usando cbq ./cbq —motor=localhost:8093 –u Administrador –p contraseña —guion=“CREATE INDEX myidx1 ON testBucket.myscope.mycollection(field1,field2);” |
Tenga en cuenta que creación de índice la declaración hace no requiero que califiques los datos con un tipo = foo o cláusula de calificación de prefijo de clave.
Migre el código de su aplicación
Para utilizar Scopes y Collections con nombre, el código de su aplicación (incluido Consultas N1QL) necesita ser migrado.
Si anteriormente usaba campos de tipo o prefijos de clave (como en el escenario de división), no los necesito más.
Ejemplo de código de SDK
En el código de su SDK, debe conectarse a un clúster, abrir un Bucket y obtener una referencia a un objeto Collection para almacenar y recuperar documentos. Antes de Collections, todas las operaciones de clave-valor se realizaban directamente en el Bucket.
Nota: Si ha migrado a Couchbase SDK 3.0, ya ha realizado parte del trabajo para comenzar a usar Colecciones (aunque hasta ahora solo podía usar la Colección predeterminada).
Lo siguiente es un simple SDK de Java fragmento de código para almacenar y recuperar un documento en una Colección:
|
1 2 3 4 5 6 7 8 9 10 |
Clúster clúster = Clúster.conectar(“127.0.0.1”, “Administrador”, “contraseña”); Cubo cubeta = clúster.cubeta(“nombre-del-bucket”); Alcance alcance = cubeta.alcance(“nombre de ámbito”); Colección colección = alcance.colección(“collection-name”); ObjetoJson contenido = ObjetoJson.crear().poner(“autor”, “mike”); ResultadoDeLaMutación resultado = colección.actualizar o insertar(“clave de documento”, contenido); ObtenerResultado obtenerResultado = colección.conseguir(“clave de documento”); |
Consultas N1QL
Ahora, si quieres correr una consulta N1QL en la Collection del ejemplo de Java anterior, haga lo siguiente:
|
1 2 3 |
//ejecutar una consulta N1QL usando el contexto del Scope alcance.consulta(“SELECT * FROM collection-name”); |
Note que puede consultar directamente en un Scope. La consulta anterior en el objeto Scope se asigna automáticamente a select * from bucket-name.scope-name.collection-name.
Otra forma de proporcionar contexto de ruta a N1QL es establecerlo en OpcionesDeConsulta. Por ejemplo:
|
1 2 |
OpcionesDeConsulta qo = OpcionesDeConsulta.opcionesDeConsulta().crudo(“contexto de consulta”, “bucket-name.scope-name”); clúster.consulta(“SELECT * FROM collection-name”, qo); |
Un ámbito puede tener múltiples colecciones, y puedes unirlas directamente haciendo referencia al nombre de la colección dentro del ámbito. Si necesitas hacer consultas entre ámbitos (o entre cubos), entonces es mejor usar el objeto clúster para realizar la consulta.
Tenga en cuenta que las consultas N1QL ya no necesitan calificar un tipo = foo campo (o prefijo_de_clave calificador), si corresponde.
Por ejemplo, esta antigua consulta N1QL...
|
1 2 3 4 5 6 |
SELECT r.aeropuertodevenido DE Viajar a ÚNETE Viajar r Activado a.faa = r.aeropuerto de origen Y r.tipo = “ruta” DÓNDE a.ciudad = “Toulouse” Y a.tipo = “aeropuerto”; |
...ahora se convierte en:
|
1 2 3 4 |
SELECT r.aeropuertodevenido DE Aeropuerto a ÚNETE Ruta r Activado a.faa = r.aeropuerto de origen DÓNDE a.ciudad = “Toulouse”; |
Migración de datos a Colecciones
A continuación, debe migrar los datos existentes a sus nuevos ámbitos y colecciones con nombre.
Lo primero que debes determinar es si puedes permitirte hacer una migración desconectada (donde tu aplicación está desconectada durante unas horas), o si necesitas hacer una migración mayormente en línea con un tiempo de inactividad mínimo de la aplicación.
Una migración sin conexión podría ser más rápida en general y requerir menos recursos adicionales en términos de espacio en disco o nodos adicionales.
Migración sin conexión
Si decides hacer una migración fuera de línea, puedes usar N1QL o Respaldo/Restauración. Analizaremos ambas opciones con más detalle.
Using N1QL for an Offline Migration
Prerequisite: Your cluster must have spare disk space and be using the Query Service.
Following this approach, your migration would look something like the following:
- Create new Scopes, Collections and indexes.
- Take old application offline.
- For each named Collection:
- Insert-Select from
_defaultCollection to named Collection (using appropriate filters). - Delete data from
_defaultCollection that was migrated in above step (to save space; or if space is not an issue, you can do this at the end).
- Insert-Select from
- Verify your migrated data.
- Drop old Buckets.
- Online your new application.
Using Backup/Restore for an Offline Migration
Prerequisite: You need disk space to store backup files.
With this approach, your migration would look like this:
- Create new Scopes, Collections and indexes
- Take application offline
- Take backup (
cbbackupmgr) of 7.0 cluster - Restore using explicit mapping to named Collections. Use
--filter-keysy--map-data(see examples 1 and 2 below). - Online your new application.
Example 1: No Filtering during Restore
This example moves the entire _default Collection to a named Collection. (This is the likely case for the consolidation scenario).
|
1 2 3 4 5 6 7 8 |
// Backup the default Scope of a Bucket upgraded to 7.0 cbbackupmgr configuración –a respaldo –r test–01 —include–datos beer–sample._default cbbackupmgr respaldo –a respaldo –r test–01 –c localhost –u Administrador –p contraseña // Restore above backup to a named Collection cbbackupmgr restaurar –a respaldo –r test–01 –c localhost –u Administrador –p contraseña —mapa–datos beer–sample._default._default=beer–sample.beer–service.service_01 |
Example 2: Restore with Filtering
This example moves portions of _default Collection to different named Collections (This is the likely case for the splitting scenario).
|
1 2 3 4 5 6 7 8 9 10 |
// Backup the travel-sample Bucket from a cluster upgraded to 7.0 cbbackupmgr configuración –a respaldo –r test–02 —include–datos viajar–sample cbbackupmgr respaldo –a respaldo –r test–02 –c localhost –u Administrador –p contraseña // Restore type=’airport’ documents to a Collection travel.booking.airport cbbackupmgr restaurar –a respaldo –r test–02 –c localhost –u Administrador –p contraseña —mapa–datos viajar–sample._default._default=viajar.booking.airport —auto–crear–cubetas —filter–values ‘”type”:”airport”‘ // Restore key_prefix =’airport’ documents to a Collection travel.booking.airport cbbackupmgr restaurar –a respaldo –r test–02 –c localhost –u Administrador –p contraseña —mapa–datos viajar–sample._default._default=viajar.booking.airport —auto–crear–cubetas —filter–keys airport_* |
Online Migration Using XDCR
In order to do a mostly online migration, you need to use cross data center replication (XDCR).
Depending on your spare capacity in the existing cluster, you can do self-XDCR (where the source and destination Bucket are on the same cluster), or you can set up a separate cluster to replicate to.
Here are the steps you need to follow:
- Setup XDCR from yoursource cluster to your target cluster (you can do self-XDCR if you have spare disk space and compute resources on the original cluster).
- Create new Buckets, Scopes and Collections.
- Set up replications either directly from a Bucket to a
bucket.scope.collectionor using Migration Mode (details shown below) if a single Bucket’s default Collection has to be split into multiple Collections. - Explicit mapping rules are specifiable for each destination to specify subset of the data.
- Once replication destinations are caught up, offline your old application.
- Online your new application directing it to the new cluster (or new Bucket if using self-XDCR).
- Delete your old cluster (or your old Bucket if using self-XDCR).
Using XDCR to Migrate from Multiple Buckets to a Single Bucket
These steps are for the consolidation scenario.
The XDCR set up will look something like the following:
- For each source Bucket, set up a replication to the named Collection in the destination Bucket and Scope
The following screenshot shows the XDCR set up for one source Bucket:
Using XDCR to Split to Multiple Collections from within a Single Bucket
These steps are for the splitting scenario.
In order to map the source _default Collection to multiple target Collections, you should use the Migration Mode provided by XDCR.
The XDCR screens below show Migration Mode being used:
There are four filters you need to set up: (Travel-sample._default._default is the source. A new Bucket called Viajar is the target.)
- filter
type="airport", replicate toInventory:Airport - filter
type="airline", replicate toInventory:Airline - filter
type="hotel", replicate toInventory:Hotel - filter
type="route", replicate toInventory:Route
Plan & Implement Your Database Security Strategy
Now that you have all your data in named Scopes and Collections, you have finer control over what data you can assign privileges to. Previously you could do so only at Bucket level.
For more information on role-based access control (RBAC) security for Scopes and Collections, read this article: Introducing RBAC Security for Collections or consult the documentation on RBAC.
The following roles are available at Scope and Collection level in Couchbase 7.
Admin Roles:
- Scope Admin role is available at the Scope level. A Scope admin can administer Collections in their Scope.
Data Reader Roles:
- Data Reader
- Data Writer
- Data DCP Reader
- Data Monitoring
Query Roles:
- FTS Searcher
- Query Select
- Query Update
- Query Insert
- Query Delete
- Query Manage Index
- Query Manage Functions
- Query Execute Functions
Conclusión
I hope this guide helps you successfully migrate to Scopes and Collections in Couchbase 7.
For more information on the 7.0 release, check out the What’s New documentation o peruse the release notes.
What do you think of the new Scopes and Collections feature? I look forward to hearing your feedback on the Couchbase Forums.
Ready to try out Scopes and Collections for yourself?
Dig into Couchbase 7 today
Autor
6 respuestas
-
@Shivani, Is it possible to configure the scope and collections to be sync’d in the sync gateway? I would like to restrict the documents sync’d only of a particular scope/collection?
-
Sync Gateway support will come a later. So with 7.0 you can also receive documents in the default collection using Sync Gateway.
-
Sorry typo above. I meant with 7.0 you can only receive documents in the default collection using Sync Gateway.
-
I planned to categorize a multi-tenant application using scope and collections. I would have liked sync gateway to allow syncing based on collections or scopes. When can we expect sync gateway support?
Couple of more questions
1. Can the same document be part of default collection and another custom collection?
2. Can multiple scope refer to default collection?
-
-
-
The timeframe for Sync Gateway support is TBD.
1) The ‘same’ document in two different collections (default and custom, or two different custom) is essentially two different documents. If you are asking whether the same document key can be used in two different collections, then the answer is Yes.2) I don’t understand this question. The default collection only exists in the default scope. No other scope has a default collection. As a user you cannot create a default collection (it is created by Couchbase only).
-
@Shivani, is there any update about availability of scope&collection support in Sync Gateway?
As user @GaneshN, we are designing multi-tenant application using Couchbase server 7.0 and we need to implement client syncing based on that feature.
GaneshN post is almost 1 year old, I really hope in good news.







Deja un comentario
Lo siento, debes estar conectado para publicar un comentario.