Migração de buckets para coleções e escopos por meio de eventos: Parte 2
Novamente (como fiz na Parte 1), gostaria de indicar um excelente blog escrito por Shivani Gupta, Como migrar para escopos e coleções no Couchbase 7.0que aborda em detalhes outros métodos de migração de documentos baseados em buckets para Scopes e Collections no Couchbase. Recomendo que você leia também sobre os vários métodos que não são de eventos abordados por Shivani.
Quer você seja novo no Couchbase ou Se você é um veterano experiente, provavelmente já ouviu falar de Scopes e Collections. Se estiver pronto para experimentá-los, este artigo o ajudará a fazer isso.
Os escopos e as coleções são um novo recurso introduzido no Servidor Couchbase 7.0 que permite que você organize logicamente os dados no Couchbase. Para saber mais, leia esta introdução a Escopos e Coleções.
Você deve aproveitar os escopos e as coleções se quiser mapear seu RDBMS legado para um banco de dados de documentos ou se estiver tentando consolidar centenas de microsserviços e/ou locatários em um único Couchbase cluster (resultando em um TCO muito menor).
Uso de eventos para migração de escopos e coleções
No artigo anterior (Parte 1), discuti a mecânica de um método de alto desempenho para migrar de uma versão mais antiga do Couchbase para Scopes e Collections no Couchbase 7.0 com base em Eventos.
Apenas o Data Service (ou KV) e o Eventing Service são necessários para migrar de buckets para coleções. Em um cluster grande e bem ajustado do Couchbase, é possível migrar mais de 1 milhão de documentos por segundo. Sim, sem N1QL e sem necessidade de índice.
Neste artigo de acompanhamento, apresentarei uma metodologia simples e totalmente automatizada para fazer grandes migrações com dezenas (ou até centenas) de tipos de dados por meio de um simples Perl roteiro.
Recapitulação da função final do Eventing: ConvertBucketToCollections
Na Parte 1, tínhamos as seguintes configurações para a Eventing Function. Observe que para cada tipo exclusivo, "cerveja" e "cervejaria", tivemos de adicionar um alias de vinculação de Bucket à coleção de destino no modo "leitura+gravação". Além disso, tivemos que criar as coleções de destino, neste caso "bulk.data.beer" e "bulk.data.brewery“

Na Parte 1, tínhamos o seguinte código JavaScript em nossa Eventing Function. Observe que para cada tipo exclusivo, "cerveja" e "cervejaria", tivemos que replicar um bloco de código JavaScript e atualizar a referência do alias de vinculação correspondente ou da coleção de destino no Couchbase Data Service.
|
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 |
function OnUpdate(doc, meta) { if (!doc.type) return; var type = doc.type; if (DROP_TYPE) delete doc.type; if (type === 'beer') { if (DO_COPY) beer_col[meta.id] = doc; if (DO_DELETE) { if(!beer_col[meta.id]) { // safety check log("skip delete copy not found type=" + doc.type + ", meta.id=" + meta.id); } else { delete src_col[meta.id]; } } } if (type === 'brewery') { if (DO_COPY) brewery_col[meta.id] = doc; if (DO_DELETE) { if(!brewery_col[meta.id]) { // safety check log("skip delete copy not found type=" + doc.type + ", meta.id=" + meta.id); } else { delete src_col[meta.id]; } } } } |
A técnica da Parte 1 funciona, mas e se eu tiver muitos tipos?
O uso do Eventing pode, de fato, fazer migrações, conforme mostrado na Parte 1, mas parece um pouco trabalhoso configurar as coisas.
Se você tiver 80 tipos diferentes, seria um esforço incrível e propenso a erros usar essa técnica (tanto para criar a Eventing Function quanto para criar os espaços de chave necessários). Se eu tivesse 80 tipos em um bucket para migrar e dividir, não gostaria de fazer todo o trabalho descrito acima manualmente para cada tipo.
Automatizar via CustomConvertBucketToCollections.pl
Para resolver esse problema, escrevi um pequeno Perl roteiro, CustomConvertBucketToCollections.plque gera dois arquivos:
- CustomConvertBucketToCollections.json, é uma Eventing Function completa que faz todo o trabalho acima descrito nesta postagem.
- MakeCustomKeyspaces.sh, é um arquivo shell para criar todos os espaços-chave necessários e importar a função Eventing gerada.
Você pode encontrar esse script no GitHub em https://github.com/jon-strabala/cb-buckets-to-collections.
Observe que o script CustomConvertBucketToCollections.pl exige que ambos Perl (extração prática e linguagem de relatório) e também jq (um processador JSON de linha de comando leve e flexível) estão instalados em seu sistema.
Exemplo: Migrar 250 milhões de registros com 80 tipos diferentes
Temos 250 milhões de documentos no keyspace "input._default._default" com 80 tipos diferentes e deseja reorganizar os dados por tipo em coleções sob o escopo "output.reorg” pelo tipo de propriedade. Temos um cluster do AWS com três instâncias r5.2xlarge, todas executando o Data Service e o Evening Service.
O balde de entrada "entrada", neste exemplo, está configurado com uma cota de memória de 16.000 MB.
Abaixo, uso o CustomConvertBucketToCollections.pl Perl do GitHub em https://github.com/jon-strabala/cb-buckets-to-collections. Como você pode ver, pode ser trivial fazer migrações usando um script automatizado.
Etapa 1: Configuração única
|
1 2 3 4 5 6 |
git clone https://github.com/jon-strabala/cb-buckets-to-collections cd cb-buckets-to-collections PATH=${PATH}:/opt/couchbase/bin cd cb-buckets-to-collections/ chmod +x CustomConvertBucketToCollections.pl big_data_test_gen.pl big_data_test_load.sh |
Etapa 2: Criar 250 milhões de documentos de teste
Executando o interativo big_data_test_load.sh comando:
|
1 |
./big_data_test_load.sh |
Parâmetros de configuração de entrada:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# This bash script, 'big_data_test_load.sh', will load <N> million test # documents into a <bucket>._default._default in 1 million chunks as # created by the perl script 'big_data_test_gen.pl'. The data will # have 80 different document type values evenly distributed. Enter the number of test docs to create in the millions 250 Enter the bucket (or target) to load test docs into input Enter the username:password to your cluster admin:jtester Enter the hostname or ip address of your cluster localhost Enter the number of threads for cbimport 8 Will load 2 million test docs into keyspace input._default._default (the default for bucket input) type ^C to abort, running in 5 sec. Running .... gen/cbimport block: 1 of 2, start at Mon 01 Nov 2021 11:06:01 AM PDT JSON `file://./data.json` imported to `couchbase://localhost` successfully Documents imported: 1000000 Documents failed: 0 ** removed 23 lines ** gen/cbimport block: 250 of 250, start at Mon 01 Nov 2021 11:24:05 AM PDT JSON `file://./data.json` imported to `couchbase://localhost` successfully Documents imported: 1000000 Documents failed: 0 |
Agora deve haver 250 milhões de documentos de teste no espaço-chave input._default._default.
Etapa 3: Gerar função de eventos e script de espaço-chave
Executando o interativo CustomConvertBucketToCollections.pl comando:
|
1 |
./CustomConvertBucketToCollections.pl |
Parâmetros de configuração de entrada:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Enter the bucket (or source) to convert to collections [travel-sample]: input Enter the username:password to your cluster [admin:jtester]: Enter the hostname or ip address of your cluster [localhost]: Enter the destination bucket.scope [mybucket.myscope]: output.reorg Enter the Eventing storage keyspace bucket.scope.collection [rr100.eventing.metadata]: Enter the number of workers (LTE # cores more is faster) [8]: Probe the bucket (or source) to determine the set of types [Y]: samples across the bucket (or source) to find types [20000]: 100000 maximum estimated # of types in the bucket (or source) [30]: 100 Scanning input for 'type' property this may take a few seconds curl -s -u Administrator:password https://localhost:8093/query/service -d \ 'statement=INFER `input`._default._default WITH {"sample_size": 100000, "num_sample_values": 100, "similarity_metric": 0.1}' \ | jq '.results[][].properties.type.samples | .[]' | sort -u TYPES FOUND: t01 t02 t03 t04 t05 t06 t07 t08 t09 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25 t26 t27 t28 t29 t30 t31 t32 t33 t34 t35 t36 t37 t38 t39 t40 t41 t42 t43 t44 t45 t46 t47 t48 t49 t50 t51 t52 t53 t54 t55 t56 t57 t58 t59 t60 t61 t62 t63 t64 t65 t66 t67 t68 t69 t70 t71 t72 t73 t74 t75 t76 t77 t78 t79 t80 Generating Eventing Function: CustomConvertBucketToCollections.json Generating Keyspace commands: MakeCustomKeyspaces.sh |
Na seção interativa Perl acima, quatro das opções padrão acima foram alteradas.
Etapa 3: Atualize o MakeCustomKeyspaces.sh (conforme necessário)
Você pode simplesmente "vi MakeCustomKeyspaces.sh" e alterar os valores necessários. Optei por usar o Unix sed para aumentar o tamanho da RAM do balde "saída" de 100 a 1600
|
1 2 |
cat MakeCustomKeyspaces.sh | sed -e 's/\(^.*bucket=output.*ramsize=\)100 \(\.*\)/\116000 \2/' > tmp mv tmp MakeCustomKeyspaces.sh |
Etapa 4: Execute o script MakeCustomKeyspaces.sh
|
1 |
sh ./MakeCustomKeyspaces.sh |
abaixo:
|
1 2 3 4 5 6 7 8 9 10 |
SUCCESS: Bucket created SUCCESS: Scope created SUCCESS: Collection created SUCCESS: Bucket created SUCCESS: Scope created SUCCESS: Collection created SUCCESS: Collection created ** removed 77 lines ** SUCCESS: Collection created SUCCESS: Events imported |
Etapa 5: Atualize sua interface do usuário do Couchbase na página de eventos
Para localizar a nova Eventing Function (ou Função atualizada) na interface do usuário do Couchbase, acesse a Eventing Page e atualize o navegador da Web.
Etapa 6: implantar o CustomConvertBucketToCollections
Na interface do usuário do Couchbase, vá para a página de eventos e implemente a função de eventos "CustomConvertBucketToCollections“.
Em cerca de 45 minutos, a reorganização deverá estar completamente concluída.

Todos os documentos são de fato reorganizados por tipo como coleções. Nesse modesto cluster, eles foram processados a 93 mil documentos por segundo.
Considerações finais
Se você achou esta série de artigos útil e está interessado em continuar aprendendo sobre eventos, clique aqui o serviço de eventos do Couchbase.
Espero que você encontre o CustomConvertBucketToCollections.pl Perl do GitHub em https://github.com/jon-strabala/cb-buckets-to-collections uma ferramenta valiosa em seu arsenal quando você precisa migrar um bucket com muitos tipos para um paradigma de coleções.
Sinta-se à vontade para aprimorar o script CustomConvertBucketToCollections.pl para usar um arquivo de configuração intermediário para o Eventing Perl onde todos os parâmetros podem ser ajustados. Em seguida, use o arquivo de configuração intermediário para criar a Eventing Function e o script de shell de configuração.
Exemplo de arquivo de configuração intermediário:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
[ { "src_ks": "input._default._default", "dst_ks": "output.myscope.t01", "create_dst_ks": true, "dst_copy": true, "src_del": true, "dst_remove_type": true }, { "src_ks": "input._default._default", "dst_ks": "output.myscope.t02", "create_dst_ks": true, "dst_copy": true, "src_del": true, "dst_remove_type": true }, { "src_ks": "input._default._default", "dst_ks": "output.myscope.t03", "create_dst_ks": true, "dst_copy": true, "src_del": true, "dst_remove_type": true } ] |
Recursos
- Download: Faça o download do Couchbase Server 7.0
- Scriptlet de eventos: Função: ConvertBucketToCollections
- GitHub: Ferramenta Perl: cb-buckets-to-collections.pl
Referências
- Documentação de eventos do Couchbase
- O que há de novo: Couchbase Server 7.0
- Como migrar para escopos e coleções no Couchbase 7.0
- Outros blogs do Couchbase sobre eventos
Gostaria muito de saber o que você achou dos recursos do Couchbase e do serviço Eventing e como eles beneficiarão sua empresa no futuro. Compartilhe seu feedback nos comentários abaixo ou em os fóruns do Couchbase.