{"id":8969,"date":"2021-01-07T05:22:35","date_gmt":"2021-01-07T13:22:35","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=8969"},"modified":"2025-06-13T19:58:04","modified_gmt":"2025-06-14T02:58:04","slug":"get-set-to-the-edge-with-sync-gateway","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/get-set-to-the-edge-with-sync-gateway\/","title":{"rendered":"Prepare-se para a borda com o Sync Gateway"},"content":{"rendered":"<h2 class=\"wp-block-heading\">Introdu\u00e7\u00e3o<\/h2>\r\n\r\n\r\n\r\n<p>Imagine que voc\u00ea est\u00e1 indo se encontrar com um cliente importante no centro de S\u00e3o Francisco, CA, e recebeu um e-mail com detalhes sobre para quem ligar quando chegar ao sagu\u00e3o do escrit\u00f3rio. Voc\u00ea est\u00e1 no sagu\u00e3o, mas a recep\u00e7\u00e3o da rede m\u00f3vel est\u00e1 totalmente inoperante. Voc\u00ea tenta abrir o cliente de e-mail, mas ele precisa de conex\u00e3o de rede sempre que voc\u00ea inicia o aplicativo. Tenho certeza de que a incapacidade de ler o e-mail sem conectividade levar\u00e1 a uma experi\u00eancia frustrante para o usu\u00e1rio.<\/p>\r\n\r\n\r\n\r\n<p>Para evitar essas situa\u00e7\u00f5es, os aplicativos agora s\u00e3o criados com o <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/offline-first-more-reliable-mobile-apps\/\">off-line primeiro<\/a> paradigma. Isso significa simplesmente que a funcionalidade do aplicativo n\u00e3o \u00e9 afetada pela falta intermitente de conectividade de rede. Al\u00e9m disso, o primeiro off-line geralmente implica a capacidade de sincronizar dados entre dispositivos de borda e o banco de dados de back-end.<\/p>\r\n\r\n\r\n\r\n<p>Muitas solu\u00e7\u00f5es de banco de dados relacionais ou mesmo n\u00e3o relacionais tratam o celular e o backend como dois problemas separados, portanto, criar aplicativos off-line primeiro com essas solu\u00e7\u00f5es pontuais \u00e9 praticamente imposs\u00edvel.<\/p>\r\n\r\n\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-gallery columns-1 is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\r\n<ul class=\"blocks-gallery-grid\">\r\n<li class=\"blocks-gallery-item\">\r\n<figure><img loading=\"lazy\" decoding=\"async\" width=\"1832\" height=\"1050\" class=\"wp-image-8970\" src=\"https:\/\/i1.wp.com\/blog.couchbase.com\/wp-content\/uploads\/2020\/07\/sgw-arch.png?fit=900%2C516&amp;ssl=1\" alt=\"\" data-id=\"8970\" data-full-url=\"https:\/\/i1.wp.com\/blog.couchbase.com\/wp-content\/uploads\/2020\/07\/sgw-arch.png?fit=1832%2C1050&amp;ssl=1\" data-link=\"https:\/\/www.couchbase.com\/blog\/?attachment_id=8970\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/07\/sgw-arch.png 1832w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/07\/sgw-arch-300x172.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/07\/sgw-arch-1024x587.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/07\/sgw-arch-768x440.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/07\/sgw-arch-1536x880.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/07\/sgw-arch-20x11.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/07\/sgw-arch-1320x757.png 1320w\" sizes=\"auto, (max-width: 1832px) 100vw, 1832px\" \/><\/figure>\r\n<\/li>\r\n<\/ul>\r\n<figcaption class=\"blocks-gallery-caption\">Figura 1: Diagrama de arquitetura do Couchbase Lite interagindo com o Couchbase Cluster via Sync Gateway<\/figcaption>\r\n<\/figure>\r\n\r\n\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n\r\n\r\n<p>O Couchbase, por outro lado, \u00e9 o principal fornecedor de uma solu\u00e7\u00e3o de borda para a nuvem totalmente integrada. <a href=\"https:\/\/docs.couchbase.com\/couchbase-lite\/2.7\/introduction.html\">Couchbase Lite<\/a> product \u00e9 o banco de dados incorporado para os dispositivos de borda (onde voc\u00ea pode executar consultas declarativas localmente no dispositivo), <a href=\"https:\/\/docs.couchbase.com\/sync-gateway\/2.7\/introduction.html\">Gateway de sincroniza\u00e7\u00e3o<\/a> \u00e9 a tecnologia de gel que permite a sincroniza\u00e7\u00e3o de dados dos dispositivos de borda com o <a href=\"https:\/\/docs.couchbase.com\/home\/server.html\">Cluster do Couchbase<\/a>.<\/p>\r\n\r\n\r\n\r\n<p>Neste artigo, vamos nos concentrar na implanta\u00e7\u00e3o do Couchabse Cluster e do Sync Gateway na plataforma Kubernetes. O objetivo \u00e9 que voc\u00ea obtenha experi\u00eancia em primeira m\u00e3o trabalhando com essas tecnologias e entenda a mec\u00e2nica por tr\u00e1s de cada uma delas.<\/p>\r\n\r\n\r\n\r\n<p>Mais uma li\u00e7\u00e3o que eu gostaria que voc\u00ea tirasse deste artigo s\u00e3o algumas das pr\u00e1ticas recomendadas ao implementar essa solu\u00e7\u00e3o em sua pr\u00f3pria nuvem privada ou p\u00fablica.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Pr\u00e1ticas recomendadas<\/h2>\r\n\r\n\r\n\r\n<p>Como ou\u00e7o essas perguntas de muitos dos meus clientes corporativos, decidi abord\u00e1-las primeiro falando sobre algumas das pr\u00e1ticas recomendadas quando se trata de implementar o Couchbase na plataforma Kubernetes.<\/p>\r\n\r\n\r\n\r\n<ol class=\"wp-block-list\">\r\n<li>Sempre execute <a href=\"https:\/\/docs.couchbase.com\/server\/6.5\/install\/sizing-general.html#sizing-data-service-nodes\">an\u00e1lise de dimensionamento<\/a> do cluster do Couchbase primeiro, para planejar qual inst\u00e2ncia do EC2, tipos de dispositivos de armazenamento e espa\u00e7o seriam necess\u00e1rios para o cluster. As estimativas de dimensionamento permanecem as mesmas para o cluster do Kubernetes, como seria feito para o cluster no local.<br \/>No entanto, lembre-se de que, no K8s, estamos fazendo o dimensionamento dos n\u00f3s do Kubernetes, onde os pods do Couchbase ser\u00e3o executados. \u00c9 a\u00ed que a segunda pr\u00e1tica recomendada entra em cena.<\/li>\r\n<li>Uso <code>spec.antiAffinity=true<\/code> em <a href=\"https:\/\/github.com\/couchbaselabs\/cboperator-hol\/blob\/master\/eks\/cb-operator-guide\/files\/2.0.1\/yaml\/couchbase-cluster.yaml\" target=\"_blank\" rel=\"noopener noreferrer\">couchbase-cluster.yaml<\/a> durante a implanta\u00e7\u00e3o do cluster na produ\u00e7\u00e3o. Esse campo especifica se dois pods nesse cluster podem ou n\u00e3o ser implantados no mesmo n\u00f3 do Kubernetes. Do ponto de vista da alta disponibilidade, n\u00e3o queremos colocar mais de um pod em cada um dos n\u00f3s do K8s, de modo que a falha de um \u00fanico n\u00f3 derrube apenas um \u00fanico pod.<\/li>\r\n<li>No ambiente Kubernetes, \u00e9 aconselh\u00e1vel gerenciar o posicionamento de pods em tipos de n\u00f3s predefinidos (grande, xlarge, 4xlarge etc.), de modo que os recursos desejados possam ser garantidos no momento da implanta\u00e7\u00e3o do cluster ou da recupera\u00e7\u00e3o autom\u00e1tica. Voc\u00ea pode usar <code>spec.servers[].pod.spec.nodeSelector<\/code> (conforme mencionado em <a href=\"https:\/\/github.com\/couchbaselabs\/cboperator-hol\/blob\/master\/eks\/cb-operator-guide\/files\/2.0.1\/yaml\/couchbase-cluster.yaml\" target=\"_blank\" rel=\"noopener noreferrer\">cluster couchbase<\/a><a href=\"https:\/\/github.com\/couchbaselabs\/cboperator-hol\/blob\/master\/eks\/cb-operator-guide\/files\/2.0.1\/yaml\/couchbase-cluster.yaml\" target=\"_blank\" rel=\"noopener noreferrer\">.yaml<\/a>), que especifica um mapa de valores-chave das restri\u00e7\u00f5es no posicionamento de n\u00f3s para pods. Para que um pod seja eleg\u00edvel para execu\u00e7\u00e3o em um n\u00f3, o n\u00f3 deve ter cada um dos pares de valores-chave indicados como r\u00f3tulos.<\/li>\r\n<li>Uma \u00faltima observa\u00e7\u00e3o antes de come\u00e7armos a divers\u00e3o: se o seu cluster K8s tiver n\u00f3s homog\u00eaneos e voc\u00ea n\u00e3o quiser usar o <code>seletor de n\u00f3<\/code> para determinar o posicionamento do pod e, em seguida, use o m\u00e9todo <a href=\"https:\/\/docs.couchbase.com\/operator\/2.0\/reference-couchbasecluster.html#spec-servers-resources\">spec.servers[].resources<\/a> para definir <code>solicita\u00e7\u00f5es<\/code> e <code>limites<\/code>. Novamente, isso ajudar\u00e1 a colocar pods com um pool predefinido de recursos.<\/li>\r\n<\/ol>\r\n\r\n\r\n\r\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\r\n<p><strong><em>OBSERVA\u00c7\u00c3O:<\/em><\/strong> No exemplo abaixo, usaremos <code>nodeSelector<\/code> para colocar os respectivos tipos de pod no <code>grupos de n\u00f3s<\/code> para garantir os recursos desejados.<\/p>\r\n<\/blockquote>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Pr\u00e9-requisitos<\/h2>\r\n\r\n\r\n\r\n<p>Certifique-se de que voc\u00ea tenha uma conta AWS configurada (instru\u00e7\u00f5es fora do escopo deste blog) e que todas as ferramentas necess\u00e1rias para experimentar essas instru\u00e7\u00f5es estejam prontas. Aqui est\u00e1 a lista de itens de que voc\u00ea precisa:<\/p>\r\n\r\n\r\n\r\n<ol class=\"wp-block-list\">\r\n<li>Fa\u00e7a o download da vers\u00e3o mais recente <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/downloads\/?family=kubernetes\">Operador aut\u00f4nomo do Couchbase<\/a> e descompacte-o no computador local. O pacote Operator cont\u00e9m ferramentas de linha de comando que voc\u00ea usar\u00e1 para instalar o Operator.<\/li>\r\n<li>Instala\u00e7\u00e3o e configura\u00e7\u00e3o <a href=\"https:\/\/kubernetes.io\/docs\/tasks\/tools\/install-kubectl\/\">kubectl<\/a> em seu computador local - o kubectl \u00e9 uma interface de linha de comando para executar comandos em clusters do Kubernetes.<\/li>\r\n<li>Instale a vers\u00e3o mais recente <a href=\"https:\/\/docs.aws.amazon.com\/cli\/latest\/userguide\/cli-chap-install.html\">CLI DO AWS<\/a> - A CLI da AWS \u00e9 uma ferramenta unificada que permite interagir com os servi\u00e7os da AWS usando comandos em seu shell de linha de comando. Neste caso, usaremos a CLI da AWS para nos comunicarmos de forma segura com o cluster do Kubernetes em execu\u00e7\u00e3o na AWS.<\/li>\r\n<\/ol>\r\n\r\n\r\n\r\n<p>Quando voc\u00ea tiver <code>cli do aws<\/code> com as credenciais da sua conta, voc\u00ea pode passar para a se\u00e7\u00e3o de cria\u00e7\u00e3o de um cluster do Kubernetes.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Etapa 1: criar um cluster K8s com v\u00e1rios n\u00f3s<\/h2>\r\n\r\n\r\n\r\n<p>O Kubernetes (K8s) nos oferece a flexibilidade de provisionar m\u00e1quinas de computa\u00e7\u00e3o de tamanhos diferentes (vCPU, RAM, tamanho do disco) em um \u00fanico cluster do Kubernetes para que os requisitos de recursos de v\u00e1rios servi\u00e7os gerenciados possam ser atendidos em um \u00fanico cluster do K8s.<\/p>\r\n\r\n\r\n\r\n<p>Vamos aproveitar a mesma flexibilidade e oferecer tr\u00eas <code>NodeGroups<\/code>que usaremos posteriormente para hospedar um conjunto espec\u00edfico de servi\u00e7os do Couchbase.<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">1.1. Crie um cluster EKS na regi\u00e3o de sua escolha<\/h3>\r\n\r\n\r\n\r\n<p>Primeiro, vamos implantar um cluster K8s em <code>us-west-2<\/code> regi\u00e3o e em duas zonas de disponibilidade <code>us-west-2a\/b<\/code>. Voc\u00ea pode mencionar um <code>vpc-cidr<\/code> de acordo com suas necessidades, mas, neste exemplo, usaremos o bloco <code>172.16.0.0\/20<\/code>fornecendo-nos um intervalo de mais de 4K (2<sup>12<\/sup>) endere\u00e7os IP, o que deve ser mais do que suficiente para n\u00f3s.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>$ eksctl create cluster --name k8sEKS \\\r\n --version 1.18 \\\r\n --region us-west-2 \\\r\n --zones us-west-2a,us-west-2b \\\r\n --vpc-cidr 172.16.0.0\/20 \\\r\n --without-nodegroup<\/code><\/pre>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">1.2. Criar grupos de n\u00f3s separados<\/h3>\r\n\r\n\r\n\r\n<p>Vamos criar <code>n\u00f3grupo<\/code> no cluster EKS para que possamos hospedar o Couchbase <code>Dados<\/code> inst\u00e2ncias de servi\u00e7o. Neste exemplo, usaremos <code>m5.large (2 vCPU e 8 GB de RAM)<\/code> M\u00e1quinas EC2 como <code>tipo de n\u00f3<\/code>mas o tamanho real do n\u00f3 EC2 depender\u00e1 do planejamento da capacidade e do desempenho com base na sua carga de trabalho. Portanto, certifique-se de escolher o tipo certo de n\u00f3s em sua implementa\u00e7\u00e3o de produ\u00e7\u00e3o.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>$ eksctl create nodegroup --cluster=k8sEKS \\\r\n --name=m5l-pool \\\r\n --node-type m5.large \\\r\n --region us-west-2 \\\r\n --nodes 2 \\\r\n --nodes-min 2 \\\r\n --nodes-max 4 \\\r\n --node-ami auto<\/code><\/pre>\r\n\r\n\r\n\r\n<p>Para hospedar <code>\u00cdndice\/Consulta<\/code> criaremos um nodegroup separado com mais computa\u00e7\u00e3o e RAM. Neste exemplo, usaremos <code>r5.large (2 vCPUs e 16 GB de RAM)<\/code> m\u00e1quinas.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>$ eksctl create nodegroup --cluster=k8sEKS \\\r\n --name=r5l-pool \\\r\n --node-type r5.large \\\r\n --region us-west-2 \\\r\n --nodes 2 \\\r\n --nodes-min 2 \\\r\n --nodes-max 4 \\\r\n --node-ami auto<\/code><\/pre>\r\n\r\n\r\n\r\n<p>Por \u00faltimo, mas n\u00e3o menos importante, usaremos <code>t2.xlarge (4 vCP e 16 GB de RAM)<\/code> para hospedar <code>Gateway de sincroniza\u00e7\u00e3o<\/code> inst\u00e2ncia.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>$ eksctl create nodegroup --cluster=k8sEKS \\\r\n --name=t2xl-pool \\\r\n --node-type t2.xlarge \\\r\n --region us-west-2 \\\r\n --nodes 1 \\\r\n --nodes-min 1 \\\r\n --nodes-max 2 \\\r\n --node-ami auto<\/code><\/pre>\r\n\r\n\r\n\r\n<p>Quando os tr\u00eas <code>grupos de n\u00f3s<\/code> est\u00e3o prontos, podemos come\u00e7ar a rotular cada n\u00f3 no nodegroup ou usar o r\u00f3tulo pr\u00e9-existente, mas primeiro confirme todos os <code>grupos de n\u00f3s<\/code> est\u00e3o prontos:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>$ eksctl get nodegroups --cluster=k8sEKS --region=us-west-2\r\n\r\nLUSTER    NODEGROUP   CREATED         MIN SIZE    MAX SIZE    DESIRED CAPACITY    INSTANCE TYPE   IMAGE ID\r\nk8sEKS    m5l-pool    2020-07-24T18:58:02Z    2       4       2           m5.largeami-04387c277e83865b2\r\nk8sEKS    r5l-pool    2020-07-24T18:58:09Z    2       4       2           r5.largeami-04387c277e83865b2\r\nk8sEKS    t2xl-pool   2020-07-24T19:09:09Z    1       2       1           t2.xlargeami-04387c277e83865b2<\/code><\/pre>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">1.3. Rotular n\u00f3s EKS<\/h3>\r\n\r\n\r\n\r\n<p>Escolhemos tr\u00eas tipos diferentes de m\u00e1quinas EC2 para hospedar <code>dados<\/code>, <code>\u00cdndice\/Consulta<\/code>e <code>gateway de sincroniza\u00e7\u00e3o<\/code> m\u00e1quinas apenas para dedicar os servi\u00e7os do Couchbase a uma <code>n\u00f3grupo<\/code> tipo. Vamos usar um r\u00f3tulo existente chamado <code>beta.kubernetes.io\/instance-type<\/code> para a sele\u00e7\u00e3o de n\u00f3s. Esse r\u00f3tulo estar\u00e1 dispon\u00edvel por padr\u00e3o para que n\u00e3o seja necess\u00e1rio criar um novo r\u00f3tulo. Voc\u00ea pode simplesmente ver os r\u00f3tulos dos n\u00f3s executando este cmd:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>$ kubectl get nodes --show-labels\r\n\r\nNAME                                         STATUS    ROLES     AGE       VERSION              LABELS\r\nip-172-16-0-12.us-west-2.compute.internal    Ready     &lt;none&gt;    21m       v1.14.9-eks-a0a484   ...,beta.kubernetes.io\/instance-type=t2.xlarge,...\r\nip-172-16-0-127.us-west-2.compute.internal   Ready     &lt;none&gt;    32m       v1.14.9-eks-a0a484   ...,beta.kubernetes.io\/instance-type=m5.large,...\r\nip-172-16-3-234.us-west-2.compute.internal   Ready     &lt;none&gt;    32m       v1.14.9-eks-a0a484   ...,beta.kubernetes.io\/instance-type=m5.large,...\r\nip-172-16-1-29.us-west-2.compute.internal    Ready     &lt;none&gt;    32m       v1.14.9-eks-a0a484   ...,beta.kubernetes.io\/instance-type=r5.large,...\r\nip-172-16-3-119.us-west-2.compute.internal   Ready     &lt;none&gt;    32m       v1.14.9-eks-a0a484   ...,beta.kubernetes.io\/instance-type=r5.large,...<\/code><\/pre>\r\n\r\n\r\n\r\n<p>Neste exemplo, estaremos hospedando <code>dados<\/code> servi\u00e7o em <code>m5.large<\/code> m\u00e1quinas, <code>\u00edndice\/consulta<\/code> em <code>r5.large<\/code> m\u00e1quinas e <code>gateway de sincroniza\u00e7\u00e3o<\/code> em <code>t2.xlarge<\/code> m\u00e1quina.<\/p>\r\n\r\n\r\n\r\n<p>Em um ambiente de produ\u00e7\u00e3o real, entendemos que voc\u00ea pode ter um tipo diferente de m\u00e1quina, mas n\u00e3o essencialmente um tipo dedicado a um tipo espec\u00edfico de servi\u00e7o do Couchbase. Nesse caso, voc\u00ea pode criar r\u00f3tulos mutuamente exclusivos para cada tipo de n\u00f3.<\/p>\r\n\r\n\r\n\r\n<p>Voc\u00ea usaria <code>r\u00f3tulo do kubectl<\/code> cmd para rotular todos os n\u00f3s que voc\u00ea deseja usar somente para n\u00f3s de dados desta forma:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>$ kubectl label nodes 'ec2-node-ip'  instanceType=data<\/code><\/pre>\r\n\r\n\r\n\r\n<p>Da mesma forma para rotular todos os n\u00f3s de \u00edndice (consulta ou outro):<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>$ kubectl label nodes 'ec2-node-ip'  instanceType=index<\/code><\/pre>\r\n\r\n\r\n\r\n<p>Depois de rotular todos os n\u00f3s, voc\u00ea estar\u00e1 pronto para passar para a pr\u00f3xima se\u00e7\u00e3o.<\/p>\r\n\r\n\r\n\r\n<p><strong><em>OBSERVA\u00c7\u00c3O:<\/em><\/strong> Estamos usando <code>beta.kubernetes.io\/instance-type<\/code> como r\u00f3tulo, portanto, n\u00e3o precisamos criar nenhum novo r\u00f3tulo para os n\u00f3s.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Etapa 2: Instalar a defini\u00e7\u00e3o de recurso personalizado<\/h2>\r\n\r\n\r\n\r\n<p>A primeira etapa da instala\u00e7\u00e3o do Operator \u00e9 instalar a defini\u00e7\u00e3o de recurso personalizado (CRD) que descreve o <code>Couchbase<\/code> tipos de recursos. Isso pode ser feito executando o comando abaixo no diret\u00f3rio do pacote Operator:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>kubectl create -f crd.yaml<\/code><\/pre>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Etapa 3: Criar um espa\u00e7o de nome<\/h2>\r\n\r\n\r\n\r\n<p>Os namespaces s\u00e3o uma forma de dividir os recursos do cluster entre v\u00e1rios usu\u00e1rios.<\/p>\r\n\r\n\r\n\r\n<p>Os namespaces s\u00e3o uma forma de dividir os recursos do cluster entre v\u00e1rios usu\u00e1rios.<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li>Execute o seguinte comando para criar um namespace.<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>  $ kubectl create namespace cbdb\r\n\r\n  namespace\/cbdb created<\/code><\/pre>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li>Confirme se o Namespace foi criado com sucesso.<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>  $ kubectl get namespaces\r\n\r\n  NAME              STATUS    AGE\r\n  cbdb              Active    34s\r\n  default           Active    5h20m<\/code><\/pre>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Etapa 4: Instalar o operador<\/h2>\r\n\r\n\r\n\r\n<p>O operador \u00e9 composto de dois componentes: um <code>controlador de admiss\u00e3o din\u00e2mico por cluster<\/code> (DAC) e um <code>Operador por espa\u00e7o de nome<\/code>. Consulte a se\u00e7\u00e3o <a href=\"https:\/\/docs.couchbase.com\/operator\/2.0\/concept-operator.html\">arquitetura da operadora<\/a> para obter informa\u00e7\u00f5es adicionais sobre o que \u00e9 necess\u00e1rio e considera\u00e7\u00f5es de seguran\u00e7a.<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">4.1. Instalar o controlador de admiss\u00e3o din\u00e2mico (DAC)<\/h3>\r\n\r\n\r\n\r\n<p>O DAC permite que os recursos personalizados sejam modificados e interrogados antes que um recurso seja aceito e confirmado no etcd. A execu\u00e7\u00e3o do DAC nos permite adicionar padr\u00f5es sensatos \u00e0s configura\u00e7\u00f5es do cluster do Couchbase, minimizando assim o tamanho das especifica\u00e7\u00f5es. Ele tamb\u00e9m nos permite manter a compatibilidade com vers\u00f5es anteriores quando novos atributos s\u00e3o adicionados e precisam ser preenchidos. Isso torna a experi\u00eancia de uso dos recursos do Couchbase semelhante \u00e0 dos tipos de recursos nativos.<\/p>\r\n\r\n\r\n\r\n<p>Vamos agora instalar o Dynamic Admission Controller.<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li>Abra uma janela do Terminal e v\u00e1 para o diret\u00f3rio em que voc\u00ea descompactou o pacote Operator. Execute o seguinte comando para instalar o DAC no diret\u00f3rio <code>padr\u00e3o<\/code> namespace.<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>$ bin\/cbopcfg generate admission --namespace default | kubectl create -f -\r\n\r\n\r\nserviceaccount\/couchbase-operator-admission created\r\nclusterrole.rbac.authorization.k8s.io\/couchbase-operator-admission created\r\nclusterrolebinding.rbac.authorization.k8s.io\/couchbase-operator-admission created\r\nsecret\/couchbase-operator-admission created\r\ndeployment.apps\/couchbase-operator-admission created\r\nservice\/couchbase-operator-admission created\r\nmutatingwebhookconfiguration.admissionregistration.k8s.io\/couchbase-operator-admission created\r\nvalidatingwebhookconfiguration.admissionregistration.k8s.io\/couchbase-operator-admission created<\/code><\/pre>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li>Confirme se o controlador de admiss\u00e3o foi implantado com \u00eaxito.<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>$ kubectl get deployments\r\n\r\nNAME                           READY     UP-TO-DATE   AVAILABLE   AGE\r\ncouchbase-operator-admission   1\/1       1            1           48s<\/code><\/pre>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">4.2. Instalar o operador do Couchbase<\/h3>\r\n\r\n\r\n\r\n<p>Agora, vamos implementar o Operator no <code>oficina<\/code> executando o seguinte comando.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>$ bin\/cbopcfg generate operator --namespace cbdb | kubectl create -f -\r\n\r\nserviceaccount\/couchbase-operator created\r\nrole.rbac.authorization.k8s.io\/couchbase-operator created\r\nrolebinding.rbac.authorization.k8s.io\/couchbase-operator created\r\ndeployment.apps\/couchbase-operator created\r\nservice\/couchbase-operator created<\/code><\/pre>\r\n\r\n\r\n\r\n<p>A execu\u00e7\u00e3o do comando acima faz o download da imagem do Operator Docker e cria um arquivo <a href=\"https:\/\/kubernetes.io\/docs\/concepts\/workloads\/controllers\/deployment\/\">implanta\u00e7\u00e3o<\/a>que gerencia uma \u00fanica inst\u00e2ncia do Operator. O Operator usa uma implanta\u00e7\u00e3o para que possa reiniciar o pod se ele morrer.<\/p>\r\n\r\n\r\n\r\n<p>Depois de executar o <code>kubectl create<\/code> geralmente leva menos de um minuto para o Kubernetes implantar o Operator e para que ele esteja pronto para ser executado.<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">4.3. Verificar o status da implanta\u00e7\u00e3o<\/h3>\r\n\r\n\r\n\r\n<p>Voc\u00ea pode usar o seguinte comando para verificar o status da implanta\u00e7\u00e3o:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>$ kubectl get deployments -n cbdb\r\n\r\nNAME                 READY     UP-TO-DATE   AVAILABLE   AGE\r\ncouchbase-operator   1\/1       1            1           73s<\/code><\/pre>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">4.4. Verificar o status do Operador<\/h3>\r\n\r\n\r\n\r\n<p>Execute o seguinte comando para verificar se o Operator foi iniciado com \u00eaxito:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>$ kubectl get pods -l app=couchbase-operator -n cbdb\r\n\r\nNAME                                  READY     STATUS    RESTARTS   AGE\r\ncouchbase-operator-558fd8486c-788jr   1\/1       Running   0          2m9s<\/code><\/pre>\r\n\r\n\r\n\r\n<p>Se o Operator estiver ativo e em execu\u00e7\u00e3o, o comando retornar\u00e1 uma sa\u00edda em que o <strong>PRONTO<\/strong> shows de campo <strong>1\/1<\/strong>como, por exemplo:<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Etapa 5. Implantar o cluster do Couchbase<\/h2>\r\n\r\n\r\n\r\n<p>Em um ambiente de produ\u00e7\u00e3o em que o desempenho e o SLA do sistema s\u00e3o mais importantes, devemos sempre planejar a implanta\u00e7\u00e3o do cluster do Couchbase usando volumes persistentes, pois isso ajuda:<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li><strong>Recupera\u00e7\u00e3o de dados<\/strong>: Os volumes persistentes permitem que os dados associados aos pods sejam recuperados no caso de um pod ser encerrado. Isso ajuda a evitar a perda de dados e a constru\u00e7\u00e3o demorada de \u00edndices ao usar servi\u00e7os de dados ou de \u00edndices.<\/li>\r\n<li><strong>Realoca\u00e7\u00e3o de c\u00e1psulas<\/strong>: O Kubernetes pode decidir expulsar pods que atingem limites de recursos, como limites de CPU e mem\u00f3ria. Os pods que t\u00eam backup com Volumes persistentes podem ser encerrados e reiniciados em n\u00f3s diferentes sem incorrer em tempo de inatividade ou perda de dados.<\/li>\r\n<li><strong>Provisionamento din\u00e2mico<\/strong>: O Operator criar\u00e1 Persistent Volumes sob demanda \u00e0 medida que seu cluster for dimensionado, aliviando a necessidade de pr\u00e9-provisionar o armazenamento do cluster antes da implementa\u00e7\u00e3o.<\/li>\r\n<li><strong>Integra\u00e7\u00e3o com a nuvem<\/strong>: O Kubernetes se integra aos provisionadores de armazenamento nativos dispon\u00edveis nos principais fornecedores de nuvem, como AWS e GCE.<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">5.1. Criar segredo para o console de administra\u00e7\u00e3o do Couchbase<\/h3>\r\n\r\n\r\n\r\n<p>A primeira coisa que precisamos fazer \u00e9 criar uma credencial secreta que ser\u00e1 usada pelo console administrativo da Web durante o login. Por conveni\u00eancia, um exemplo de segredo \u00e9 fornecido no pacote Operator. Quando voc\u00ea o envia para o cluster do Kubernetes, o segredo define o nome de usu\u00e1rio como Administrator e a senha como password.<\/p>\r\n\r\n\r\n\r\n<p>Para empurrar o <a href=\"https:\/\/github.com\/couchbaselabs\/cboperator-hol\/blob\/master\/eks\/cb-operator-guide\/files\/2.0.1\/yaml\/secret.yaml\">secret.yaml<\/a> em seu cluster do Kubernetes, execute o seguinte comando:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>$ kubectl create -f secret.yaml -n cbdb\r\n\r\nSecret\/cb-admin-auth created<\/code><\/pre>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">5.2 Criar classe de armazenamento para o cluster k8s<\/h3>\r\n\r\n\r\n\r\n<p>Para usar o PersistentVolume nos servi\u00e7os do Couchbase (dados, \u00edndice, pesquisa etc.), precisamos criar classes de armazenamento (<a href=\"https:\/\/github.com\/couchbaselabs\/cboperator-hol\/blob\/master\/eks\/cb-operator-guide\/files\/2.0.1\/yaml\/sc-nas.yaml\">sc-nas.yaml<\/a>). Execute o kubectl para criar uma nova classe de armazenamento baseada em SSD:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>$ kubectl create -f sc-nas.yaml -n cbdb\r\n\r\n\r\nstorageclass.storage.k8s.io\/nas created<\/code><\/pre>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">5.3. Implantar o cluster do Couchbase<\/h3>\r\n\r\n\r\n\r\n<p>A especifica\u00e7\u00e3o completa para implantar o cluster do Couchbase em 3 zonas diferentes usando volumes persistentes pode ser vista na se\u00e7\u00e3o <a href=\"https:\/\/github.com\/couchbaselabs\/cboperator-hol\/blob\/master\/eks\/cb-operator-guide\/files\/2.0.1\/yaml\/couchbase-cluster.yaml\">couchbase-cluster.yaml<\/a> . Esse arquivo, juntamente com outros arquivos YAML de amostra usados neste artigo, pode ser baixado deste reposit\u00f3rio git.<\/p>\r\n\r\n\r\n\r\n<p>Abra o arquivo YAML que voc\u00ea acabou de baixar e observe como estamos usando <code>nodeSelector<\/code> para colocar os pods nos n\u00f3s que t\u00eam o valor espec\u00edfico de <code>beta.kubernetes.io\/instance-type<\/code> etiqueta.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>servers:\r\n  - name: data-service-2a\r\n    size: 1\r\n    services:\r\n      - data\r\n    volumeMounts:\r\n      default: pvc-default        # \/opt\/couchbase\/var\/lib\/couchbase\r\n      data: pvc-data               # \/mnt\/data\r\n    pod:\r\n      spec:\r\n        nodeSelector:\r\n          beta.kubernetes.io\/instance-type: m5.large\r\n  - name: index-quer-service-2a\r\n    size: 1\r\n    services:\r\n      - index\r\n      - query\r\n    volumeMounts:\r\n      default: pvc-default\r\n      index: pvc-index\r\n    pod:\r\n      spec:\r\n        nodeSelector:\r\n          beta.kubernetes.io\/instance-type: r5.large<\/code><\/pre>\r\n\r\n\r\n\r\n<p>Agora use <code>kubectl<\/code> para implantar o cluster, mas certifique-se de que esteja usando <a href=\"https:\/\/github.com\/couchbaselabs\/cboperator-hol\/blob\/master\/eks\/cb-operator-guide\/files\/2.0.1\/yaml\/couchbase-cluster.yaml\">couchbase-cluster.yaml<\/a> do git, e n\u00e3o o arquivo de mesmo nome presente no diret\u00f3rio de trabalho atual.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>$ kubectl create -f couchbase-cluster.yaml -n cbdb --save-config\r\n\r\ncouchbasecluster.couchbase.com\/cbdemo created<\/code><\/pre>\r\n\r\n\r\n\r\n<p>Isso iniciar\u00e1 a implanta\u00e7\u00e3o do cluster do Couchbase e, se tudo correr bem, teremos quatro pods do cluster do Couchbase hospedando os servi\u00e7os de acordo com o arquivo de configura\u00e7\u00e3o acima. Para verificar o progresso, execute este comando, que observar\u00e1 (argumento -w) o progresso da cria\u00e7\u00e3o dos pods:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>$ kubectl get pods  -n cbdb -w\r\n\r\nNAME                                  READY     STATUS    RESTARTS   AGE\r\ncbdemo-0000                           0\/1       Running   0          1m\r\ncbdemo-0001                           0\/1       Running   0          53s\r\ncbdemo-0002                           0\/1       Running   0          20s\r\ncouchbase-operator-558fd8486c-788jr   1\/1       Running   0          21m\r\ncbdemo-0003   0\/1       Pending   0         3s\r\ncbdemo-0003   0\/1       Pending   0         3s\r\ncbdemo-0003   0\/1       ContainerCreating   0         3s\r\ncbdemo-0003   0\/1       Running   0         18s\r\ncbdemo-0001   1\/1       Running   0         2m\r\ncbdemo-0000   1\/1       Running   0         2m\r\ncbdemo-0002   1\/1       Running   0         1m\r\ncbdemo-0003   1\/1       Running   0         1m<\/code><\/pre>\r\n\r\n\r\n\r\n<p>Para visualizar qual pod est\u00e1 sendo executado em qual n\u00f3, voc\u00ea pode executar:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>$ kubectl get pods -owide -n cbdb\r\n\r\nNAME                                  READY     STATUS    RESTARTS   AGE       IP             NODE                                         NOMINATED NODE   READINESS GATES\r\ncbdemo-0000                           1\/1       Running   0          10m       172.16.2.134   ip-172-16-3-234.us-west-2.compute.internal   &lt;none&gt;           &lt;none&gt;\r\ncbdemo-0001                           1\/1       Running   0          10m       172.16.1.116   ip-172-16-0-127.us-west-2.compute.internal   &lt;none&gt;           &lt;none&gt;\r\ncbdemo-0002                           1\/1       Running   0          9m51s     172.16.1.5     ip-172-16-1-29.us-west-2.compute.internal    &lt;none&gt;           &lt;none&gt;\r\ncbdemo-0003                           1\/1       Running   0          9m3s      172.16.2.98    ip-172-16-3-119.us-west-2.compute.internal   &lt;none&gt;           &lt;none&gt;\r\ncouchbase-operator-558fd8486c-r2tcc   1\/1       Running   0          31m       172.16.1.230   ip-172-16-0-12.us-west-2.compute.internal    &lt;none&gt;           &lt;none&gt;<\/code><\/pre>\r\n\r\n\r\n\r\n<p>Voc\u00ea notaria que <code>\u00cdndice\/Consulta<\/code> O servi\u00e7o est\u00e1 sendo executado no pod <code>cbdemo-0002<\/code> e <code>cbdemo-0003<\/code> que \u00e9 hospedado nos n\u00f3s EKS com r\u00f3tulo <code>beta.kubernetes.io\/instance-type: r5.large<\/code> e <code>dados<\/code> pods de servi\u00e7o (<code>cbdemo-0000<\/code>, <code>cbdemo-0001<\/code>) s\u00e3o colocados em n\u00f3s EKS com r\u00f3tulo <code>beta.kubernetes.io\/instance-type: m5.large<\/code>. Isso significa que <code>nodeSelector<\/code> definido em <a href=\"https:\/\/github.com\/couchbaselabs\/cboperator-hol\/blob\/master\/eks\/cb-operator-guide\/files\/2.0.1\/yaml\/couchbase-cluster.yaml\">couchbase-cluster.yaml<\/a> aplicou com sucesso o posicionamento de pods nos n\u00f3s com os recursos desejados.<\/p>\r\n\r\n\r\n\r\n<p>Nesse ponto, voc\u00ea pode fazer o encaminhamento de porta da seguinte forma:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>$ kubectl port-forward cbdemo-0000 18091:18091 -n cbdb\r\n\r\nForwarding from 127.0.0.1:18091 -&gt; 18091\r\nForwarding from [::1]:18091 -&gt; 18091<\/code><\/pre>\r\n\r\n\r\n\r\n<p>E acesse o console da Web digitando https:\/\/localhost:18091 no navegador.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Etapa 6. Implanta\u00e7\u00e3o de um cluster do Sync Gateway<\/h2>\r\n\r\n\r\n\r\n<p>Grande progresso at\u00e9 agora na implanta\u00e7\u00e3o de um cluster do Couchbase com v\u00e1rias zonas e altamente dispon\u00edvel usando volumes de armazenamento persistentes. Agora, antes de come\u00e7armos a implementar o Sync Gateway, precisamos nos certificar de mais duas coisas:<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">6.1 Pr\u00e9-requisitos do Sync Gateway<\/h3>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li>Temos um bucket dispon\u00edvel no qual o aplicativo cliente e o Sync Gateway gravar\u00e3o os dados. Ainda n\u00e3o temos nenhum bucket dispon\u00edvel para grava\u00e7\u00e3o, portanto, vamos criar um bucket <code>prepara\u00e7\u00e3o<\/code> do balde do <code>Console da Web<\/code>.<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<figure class=\"wp-block-gallery columns-1 is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex\">\r\n<ul class=\"blocks-gallery-grid\">\r\n<li class=\"blocks-gallery-item\">\r\n<figure><img loading=\"lazy\" decoding=\"async\" width=\"1132\" height=\"501\" class=\"wp-image-8971\" src=\"https:\/\/i2.wp.com\/blog.couchbase.com\/wp-content\/uploads\/2020\/07\/bucket.png?fit=900%2C398&amp;ssl=1\" alt=\"\" data-id=\"8971\" data-full-url=\"https:\/\/i2.wp.com\/blog.couchbase.com\/wp-content\/uploads\/2020\/07\/bucket.png?fit=1132%2C501&amp;ssl=1\" data-link=\"https:\/\/www.couchbase.com\/blog\/?attachment_id=8971\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/07\/bucket.png 1132w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/07\/bucket-300x133.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/07\/bucket-1024x453.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/07\/bucket-768x340.png 768w\" sizes=\"auto, (max-width: 1132px) 100vw, 1132px\" \/><\/figure>\r\n<\/li>\r\n<\/ul>\r\n<\/figure>\r\n\r\n\r\n\r\n<p><br \/>Figura 2: <code>Prepara\u00e7\u00e3o<\/code> bucket criado com 2 GB de espa\u00e7o.<\/p>\r\n\r\n\r\n\r\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\r\n<p><strong><em>OBSERVA\u00c7\u00c3O:<\/em><\/strong> Usamos 2 GB de RAM para esse bucket, mas no ambiente de produ\u00e7\u00e3o voc\u00ea atribuiria a RAM com base nas estimativas de dimensionamento que voc\u00ea ou o arquiteto de solu\u00e7\u00f5es do Couchbase fizeram para o seu caso de uso comercial.<\/p>\r\n<\/blockquote>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li>Temos um usu\u00e1rio RBAC em vigor com o nome <code>Acesso a aplicativos<\/code> no n\u00edvel do balde.<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<p>Podemos simplesmente criar um <code>Couchbase<\/code> User como geralmente fazemos, mas para tornar isso um pouco mais interessante, vamos usar um <code>externo<\/code> (tamb\u00e9m conhecido como LDAP). Na se\u00e7\u00e3o <a href=\"https:\/\/github.com\/couchbaselabs\/cboperator-hol\/blob\/master\/eks\/cb-operator-guide\/files\/2.0.1\/yaml\/couchbase-cluster.yaml\">couchbase-cluster.yaml<\/a> voc\u00ea pode encontrar detalhes de um terceiro <a href=\"https:\/\/www.forumsys.com\/tutorials\/integration-how-to\/ldap\/online-ldap-test-server\/\">Servidor de teste LDAP<\/a> que usamos neste exemplo.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>security:\r\n  adminSecret: cb-admin-auth\r\n  rbac:\r\n    managed: false\r\n  ldap:\r\n    hosts:\r\n    - ldap.forumsys.com\r\n    port: 389\r\n    bindDN: \"cn=read-only-admin,dc=example,dc=com\"\r\n    bindSecret: cb-admin-auth\r\n    authenticationEnabled: true\r\n    userDNMapping:\r\n      template: \"uid=%u,dc=example,dc=com\"\r\n    authorizationEnabled: false<\/code><\/pre>\r\n\r\n\r\n\r\n<p>Se voc\u00ea quiser se conectar a um servidor LDAP diferente, basta atualizar <a href=\"https:\/\/docs.couchbase.com\/server\/current\/manage\/manage-security\/configure-ldap.html#configure-ldap-with-the-ui\">ldap<\/a> detalhes do servidor no <a href=\"https:\/\/github.com\/couchbaselabs\/cboperator-hol\/blob\/master\/eks\/cb-operator-guide\/files\/2.0.1\/yaml\/couchbase-cluster.yaml\">couchbase-cluster.yaml<\/a> e aplicar as altera\u00e7\u00f5es. Voltemos \u00e0 cria\u00e7\u00e3o de um usu\u00e1rio e \u00e0 atribui\u00e7\u00e3o do n\u00edvel de bucket <code>Acesso a aplicativos<\/code> fun\u00e7\u00e3o.<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-gallery columns-1 is-cropped wp-block-gallery-3 is-layout-flex wp-block-gallery-is-layout-flex\">\r\n<ul class=\"blocks-gallery-grid\">\r\n<li class=\"blocks-gallery-item\">\r\n<figure><img loading=\"lazy\" decoding=\"async\" width=\"1131\" height=\"544\" class=\"wp-image-8972\" src=\"https:\/\/i0.wp.com\/blog.couchbase.com\/wp-content\/uploads\/2020\/07\/newton-user.png?fit=900%2C433&amp;ssl=1\" alt=\"\" data-id=\"8972\" data-full-url=\"https:\/\/i0.wp.com\/blog.couchbase.com\/wp-content\/uploads\/2020\/07\/newton-user.png?fit=1131%2C544&amp;ssl=1\" data-link=\"https:\/\/www.couchbase.com\/blog\/?attachment_id=8972\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/07\/newton-user.png 1131w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/07\/newton-user-300x144.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/07\/newton-user-1024x493.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/07\/newton-user-768x369.png 768w\" sizes=\"auto, (max-width: 1131px) 100vw, 1131px\" \/><\/figure>\r\n<\/li>\r\n<\/ul>\r\n<\/figure>\r\n\r\n\r\n\r\n<p><br \/>Figura 3: Usando <code>newton<\/code> como o usu\u00e1rio externo, que ser\u00e1 automaticamente confirmado como <code>existe<\/code>.<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-gallery columns-1 is-cropped wp-block-gallery-4 is-layout-flex wp-block-gallery-is-layout-flex\">\r\n<ul class=\"blocks-gallery-grid\">\r\n<li class=\"blocks-gallery-item\">\r\n<figure><img loading=\"lazy\" decoding=\"async\" width=\"1130\" height=\"497\" class=\"wp-image-8973\" src=\"https:\/\/i2.wp.com\/blog.couchbase.com\/wp-content\/uploads\/2020\/07\/newton-ready.png?fit=900%2C396&amp;ssl=1\" alt=\"\" data-id=\"8973\" data-full-url=\"https:\/\/i2.wp.com\/blog.couchbase.com\/wp-content\/uploads\/2020\/07\/newton-ready.png?fit=1130%2C497&amp;ssl=1\" data-link=\"https:\/\/www.couchbase.com\/blog\/?attachment_id=8973\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/07\/newton-ready.png 1130w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/07\/newton-ready-300x132.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/07\/newton-ready-1024x450.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/07\/newton-ready-768x338.png 768w\" sizes=\"auto, (max-width: 1130px) 100vw, 1130px\" \/><\/figure>\r\n<\/li>\r\n<\/ul>\r\n<\/figure>\r\n\r\n\r\n\r\n<p><br \/>Figura 4: Detalhes do usu\u00e1rio ap\u00f3s clicar no bot\u00e3o <code>Adicionar usu\u00e1rio<\/code> bot\u00e3o.<\/p>\r\n\r\n\r\n\r\n<p>At\u00e9 agora, tudo bem. O usu\u00e1rio do Bucket e do RBAC est\u00e1 pronto, portanto, podemos prosseguir com a configura\u00e7\u00e3o do <code>Gateway de sincroniza\u00e7\u00e3o<\/code>.<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">6.2 Configura\u00e7\u00e3o do gateway de sincroniza\u00e7\u00e3o<\/h3>\r\n\r\n\r\n\r\n<p>Para que <code>Gateway de sincroniza\u00e7\u00e3o<\/code> Para nos comunicarmos com o Couchbase Cluster, precisamos fornecer detalhes do banco de dados, do bucket e da credencial. Usaremos o <code>banco de dados<\/code> string de conex\u00e3o como <code>couchbase:\/\/cbdemo-srv.cbdb.svc.cluster.local<\/code> como pode ser visto no trecho abaixo:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>...\r\n      },\r\n      \"databases\": {\r\n        \"cbdemo\": {\r\n          \"server\": \"couchbase:\/\/cbdemo-srv.cbdb.svc.cluster.local\",\r\n          \"bucket\": \"staging\",\r\n          \"username\": \"newton\",\r\n          \"password\": \"password\",\r\n          \"allow_conflicts\": false,\r\n          \"revs_limit\": 20,\r\n          \"enable_shared_bucket_access\": true,\r\n          \"import_docs\": true,\r\n          \"sync\": `function(doc, oldDoc) {\r\n                      channel(doc.channels);\r\n                  }`,\r\n        }\r\n    ...<\/code><\/pre>\r\n\r\n\r\n\r\n<p>Uma coisa que eu gostaria de destacar \u00e9 que, com <code>Sync Gateway 2.7<\/code> (ou superior), os clientes corporativos agora podem designar v\u00e1rios n\u00f3s do Sync Gateway como n\u00f3s de importa\u00e7\u00e3o (para lidar com as grava\u00e7\u00f5es do Couchbase Server), o que proporciona maior resili\u00eancia. Portanto, estamos usando <code>import_docs: true<\/code> no arquivo de configura\u00e7\u00e3o.<\/p>\r\n\r\n\r\n\r\n<p>Voc\u00ea pode encontrar todos os outros atributos de configura\u00e7\u00e3o em <a href=\"https:\/\/github.com\/couchbaselabs\/cboperator-hol\/blob\/master\/eks\/cb-operator-guide\/files\/2.0.1\/yaml\/sgw-config.yaml\">sgw-config.yaml<\/a> file. Usaremos esse arquivo para criar o segredo e salvar as configura\u00e7\u00f5es nele tamb\u00e9m.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>$ kubectl create -f sgw-config.yaml -n cbdb --save-config\r\n\r\nsecret\/sync-gateway created<\/code><\/pre>\r\n\r\n\r\n\r\n<p>Para visualizar <code>sgw-config<\/code> executar secretamente o cmd abaixo:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>$ kubectl get secret -n cbdb\r\n\r\nNAME                             TYPE                                  DATA      AGE\r\ncb-admin-auth                    Opaque                                2         4h\r\ncouchbase-operator-token-p4qzb   kubernetes.io\/service-account-token   3         4h\r\ndefault-token-x7cvw              kubernetes.io\/service-account-token   3         4h\r\nsgw-config                       Opaque                                1         30s<\/code><\/pre>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">6.3 Controlador de implanta\u00e7\u00e3o<\/h3>\r\n\r\n\r\n\r\n<p>Depois de definir o segredo e a configura\u00e7\u00e3o, estamos quase prontos para implantar <code>Gateway de sincroniza\u00e7\u00e3o<\/code> em nosso cluster Kubernetes. Ajuste o <code>r\u00e9plicas<\/code> e <code>GOMAXPROCS<\/code> com base em seus requisitos de produ\u00e7\u00e3o, mas, neste exemplo, vamos implantar duas r\u00e9plicas com um m\u00e1ximo de uma \u00fanica vCPU por r\u00e9plica.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>apiVersion: apps\/v1\r\nkind: Deployment\r\nmetadata:\r\n  name: sync-gateway\r\nspec:\r\n  replicas: 2\r\n  selector:\r\n    matchLabels:\r\n      app: sync-gateway\r\n  template:\r\n    metadata:\r\n      labels:\r\n        app: sync-gateway\r\n    spec:\r\n      containers:\r\n      - name: sync-gateway\r\n        image: couchbase\/sync-gateway:2.7.3-enterprise\r\n        volumeMounts:\r\n        - name: config\r\n          mountPath: \/etc\/sync_gateway\r\n          readOnly: true\r\n        env:\r\n        - name: GOMAXPROCS\r\n          value: \"1\"\r\n      volumes:\r\n      - name: config\r\n        secret:\r\n          secretName: sync-gateway<\/code><\/pre>\r\n\r\n\r\n\r\n<p>Implementar <a href=\"https:\/\/github.com\/couchbaselabs\/cboperator-hol\/blob\/master\/eks\/cb-operator-guide\/files\/2.0.1\/yaml\/sgw-deployment.yaml\">sgw-deployment.yaml<\/a> arquivo via <code>kubectl<\/code> cmd:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>$ kubectl create -f sgw-deployment.yaml -n cbdb --save-config\r\n\r\ndeployment.extensions\/sync-gateway created<\/code><\/pre>\r\n\r\n\r\n\r\n<p>Voc\u00ea pode visualizar o progresso da implanta\u00e7\u00e3o executando:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>$ kubectl get deployments sync-gateway -n cbdb\r\n\r\n$ kubectl get deployments sync-gateway -n cbdb\r\nNAME           READY     UP-TO-DATE   AVAILABLE   AGE\r\nsync-gateway   2\/2       2            2           98s<\/code><\/pre>\r\n\r\n\r\n\r\n<p>Como pode ser visto acima, as duas inst\u00e2ncias de r\u00e9plica est\u00e3o em funcionamento e agora s\u00f3 precisamos colocar um balanceador de carga na frente.<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">6.4 Implantar um balanceador de carga<\/h3>\r\n\r\n\r\n\r\n<p>Em uma implementa\u00e7\u00e3o de produ\u00e7\u00e3o, voc\u00ea provavelmente ter\u00e1 um ou mais n\u00f3s do Sync Gateway liderados por um <a href=\"https:\/\/docs.couchbase.com\/sync-gateway\/current\/load-balancer.html\">balanceador de carga<\/a>.<\/p>\r\n\r\n\r\n\r\n<p>Voc\u00ea implantar\u00e1 o balanceador de carga usando o <a href=\"https:\/\/kubernetes.io\/docs\/tasks\/access-application-cluster\/create-external-load-balancer\/\">Balanceador de carga do Kubernetes<\/a> servi\u00e7o. O servi\u00e7o de balanceador de carga fornece um endere\u00e7o IP acess\u00edvel externamente e roteia o tr\u00e1fego para as portas corretas no cluster.<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li>Crie um novo arquivo chamado <a href=\"https:\/\/github.com\/couchbaselabs\/cboperator-hol\/blob\/master\/eks\/cb-operator-guide\/files\/2.0.1\/yaml\/sgw-lb.yaml\">sgw-lb.yaml<\/a> com os seguintes atributos. Observe que estamos encaminhando tanto a 4984 (porta de acesso p\u00fablico) quanto a 4985 (porta de administra\u00e7\u00e3o)<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>kind: Service\r\napiVersion: v1\r\nmetadata:\r\n  name: sgw-lb\r\nspec:\r\n  type: LoadBalancer\r\n  selector:\r\n    app: sync-gateway\r\n  ports:\r\n  - name: http\r\n    protocol: TCP\r\n    port: 4984\r\n    targetPort: 4984\r\n  - name: http2\r\n    protocol: TCP\r\n    port: 4985\r\n    targetPort: 4985<\/code><\/pre>\r\n\r\n\r\n\r\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\r\n<p><strong>Observa\u00e7\u00e3o<\/strong> Estamos encaminhando a 4984 (porta de acesso p\u00fablico) e a 4985 (porta de administra\u00e7\u00e3o) por meio do balanceador de carga.<\/p>\r\n<\/blockquote>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li>Implante o balanceador de carga usando <a href=\"https:\/\/github.com\/couchbaselabs\/cboperator-hol\/blob\/master\/eks\/cb-operator-guide\/files\/2.0.1\/yaml\/sgw-lb.yaml\">sgw-lb.yaml<\/a> arquivo.<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>$ kubectl create -f sgw-lb.yaml -n cbdb\r\n\r\nservice\/sgw-load-balancer created<\/code><\/pre>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li>Verifique os pods que o balanceador de carga est\u00e1 direcionando.<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<p>Se tudo estiver implantado corretamente, voc\u00ea ver\u00e1 algo semelhante ao seguinte:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>$ kubectl describe service sgw-load-balancer -n cbdb\r\n\r\nName:                     sgw-load-balancer\r\nNamespace:                cbdb\r\nLabels:                   &lt;none&gt;\r\nAnnotations:              &lt;none&gt;\r\nSelector:                 app=sync-gateway\r\nType:                     LoadBalancer\r\nIP:                       10.100.106.138\r\nLoadBalancer Ingress:     a8ce.us-west-2.elb.amazonaws.com\r\nPort:                     &lt;unset&gt;  4984\/TCP\r\nTargetPort:               4984\/TCP\r\nNodePort:                 &lt;unset&gt;  31066\/TCP\r\nEndpoints:                172.16.11.2:4984, 172.16.11.3:4984\r\nSession Affinity:         None\r\nExternal Traffic Policy:  Cluster\r\nEvents:\r\n  Type    Reason                Age   From                Message\r\n  ----    ------                ----  ----                -------\r\n  Normal  EnsuringLoadBalancer  3m    service-controller  Ensuring load balancer\r\n  Normal  EnsuredLoadBalancer   3m    service-controller  Ensured load balancer<\/code><\/pre>\r\n\r\n\r\n\r\n<p>Anote os <code>Ingresso do LoadBalancer<\/code> valor.<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">6.5 Teste a instala\u00e7\u00e3o<\/h3>\r\n\r\n\r\n\r\n<p>Quando o Load Balancer estiver on-line, poderemos confirmar a acessibilidade do cluster do Sync Gateway por meio de <code>Ingresso do LoadBalancer<\/code> (conforme mencionado na sa\u00edda acima). Basta usar <code>enrolar<\/code> cmd:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>curl  https:\/\/a8ce.us-west-2.elb.amazonaws.com:4984<\/code><\/pre>\r\n\r\n\r\n\r\n<p>Ele deve retornar o seguinte.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>{\"couchdb\":\"Welcome\",\"vendor\":{\"name\":\"Couchbase Sync \\\r\n Gateway\",\"version\":\"2.7\"},\"version\":\"Couchbase Sync Gateway\/2.7.3(3;33d352f) EE\"}<\/code><\/pre>\r\n\r\n\r\n\r\n<p>Pronto!  O Sync Gateway est\u00e1 totalmente funcional e pronto para assumir a carga de trabalho do aplicativo cliente (via Couchbase Lite).<\/p>\r\n\r\n\r\n\r\n<h4 class=\"wp-block-heading\">6.5.1 Teste de leitura\/escrita de documentos<\/h4>\r\n\r\n\r\n\r\n<p>Em um blog separado, discutirei como \u00e9 poss\u00edvel desenvolver aplicativos para os dispositivos de borda usando <a href=\"https:\/\/docs.couchbase.com\/couchbase-lite\/2.7\/compatibility.html#couchbase-litesync-gateway-matrix\">Couchbase Lite<\/a> mas para testar a sanidade de nossa configura\u00e7\u00e3o de ponta a ponta, podemos executar rapidamente opera\u00e7\u00f5es simples de POST e GET usando <code>Gateway de sincroniza\u00e7\u00e3o<\/code> <a href=\"https:\/\/docs.couchbase.com\/sync-gateway\/current\/rest-api.html#api-explorer\">API REST p\u00fablica<\/a>.<\/p>\r\n\r\n\r\n\r\n<p>Vamos usar o comando curl para inserir alguns documentos:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>$ curl -u admin:password -X POST \"https:\/\/a8ce.us-west-2.elb.amazonaws.com:4984\/cbdemo\/\" -H \"accept: application\/json\" -H \"Content-Type: application\/json\" -d \"{\\\"id\\\":\\\"doc3\\\",\\\"channels\\\":\\\"newton\\\"}\"\r\n\r\noutput\r\n\r\n{\"id\":\"c4988cff19c632a724e13d4390b23b82\",\"ok\":true,\"rev\":\"1-f99195111681fe7361b74eb5ebca23d4\"}<\/code><\/pre>\r\n\r\n\r\n\r\n<p>O primeiro documento foi inserido e a chave do documento foi gerada automaticamente como <code>c4988cff19c632a724e13d4390b23b82<\/code>.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>$ curl -u admin:password -X POST \"https:\/\/a8ce.us-west-2.elb.amazonaws.com:4984\/cbdemo\/\" -H \"accept: application\/json\" -H \"Content-Type: application\/json\" -d \"{\\\"id\\\":\\\"doc4\\\",\\\"channels\\\":\\\"newton\\\"}\"\r\n\r\noutput\r\n\r\n{\"id\":\"8f02cab34faa17d61ca89aa05ade372e\",\"ok\":true,\"rev\":\"1-68b03bf8df34c5854d852e3b549d0572\"}<\/code><\/pre>\r\n\r\n\r\n\r\n<p>O segundo documento tamb\u00e9m foi inserido com sucesso, usando credenciais de administrador e a chave de documento gerada automaticamente \u00e9 <code>8f02cab34faa17d61ca89aa05ade372e<\/code>.<\/p>\r\n\r\n\r\n\r\n<p>Agora podemos obter o documento executando a opera\u00e7\u00e3o GET usando o Sync Gateway <a href=\"https:\/\/docs.couchbase.com\/sync-gateway\/current\/rest-api.html#api-explorer\">API REST p\u00fablica<\/a>:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>$ curl -u admin:password -X GET \"https:\/\/a8ce.us-west-2.elb.amazonaws.com:4984\/cbdemo\/c4988cff19c632a724e13d4390b23b82\" -H \"accept: application\/json\" -H \"Content-Type: application\/json\"\r\n\r\noutput\r\n\r\n{\"_id\":\"c4988cff19c632a724e13d4390b23b82\",\"_rev\":\"1-f99195111681fe7361b74eb5ebca23d4\",\"channels\":\"foo\",\"id\":\"doc3\"}<\/code><\/pre>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Conclus\u00e3o<\/h2>\r\n\r\n\r\n\r\n<p>O Couchbase Sync Gateway \u00e9 a tecnologia cr\u00edtica de sincroniza\u00e7\u00e3o de dados que permite que os desenvolvedores de aplicativos criem solu\u00e7\u00f5es de borda para a nuvem. Neste artigo, usamos a vers\u00e3o mais recente do Couchbase Autonomous Operator para instalar o cluster do Couchbase e o Sync Gateway na plataforma Kubernetes da nuvem p\u00fablica. Em artigos futuros, vou me basear neste artigo e mostrar como voc\u00ea pode fazer muitas outras coisas de n\u00edvel empresarial (como criptografia, LDAP, desenvolvimento do Couchbase Lite e muito mais). At\u00e9 l\u00e1, bom aprendizado.<\/p>","protected":false},"excerpt":{"rendered":"<p>Introduction Imagine you are going to meet an important client in downtown San Francisco, CA and you have an email with details on who to call to when you get to the office lobby. You are in the lobby but [&hellip;]<\/p>","protected":false},"author":33279,"featured_media":8970,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1815,2225,2322,2366],"tags":[1545,1547],"ppma_author":[9090],"class_list":["post-8969","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials","category-cloud","category-kubernetes","category-sync-gateway","tag-kubernetes","tag-offline-first"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.7 (Yoast SEO v26.7) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Get set to the edge with Sync Gateway - The Couchbase Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/get-set-to-the-edge-with-sync-gateway\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Get set to the edge with Sync Gateway\" \/>\n<meta property=\"og:description\" content=\"Introduction Imagine you are going to meet an important client in downtown San Francisco, CA and you have an email with details on who to call to when you get to the office lobby. You are in the lobby but [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/get-set-to-the-edge-with-sync-gateway\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2021-01-07T13:22:35+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T02:58:04+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/07\/sgw-arch.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1832\" \/>\n\t<meta property=\"og:image:height\" content=\"1050\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Anuj Sahni, Cloud and Solutions Architecture Leader, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Anuj Sahni, Cloud and Solutions Architecture Leader, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/get-set-to-the-edge-with-sync-gateway\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/get-set-to-the-edge-with-sync-gateway\/\"},\"author\":{\"name\":\"Anuj Sahni, Cloud and Solutions Architecture Leader, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/21c735da109667147c580bb2cb351c1c\"},\"headline\":\"Get set to the edge with Sync Gateway\",\"datePublished\":\"2021-01-07T13:22:35+00:00\",\"dateModified\":\"2025-06-14T02:58:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/get-set-to-the-edge-with-sync-gateway\/\"},\"wordCount\":2857,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/get-set-to-the-edge-with-sync-gateway\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/07\/sgw-arch.png\",\"keywords\":[\"kubernetes\",\"offline first\"],\"articleSection\":[\"Best Practices and Tutorials\",\"Couchbase Capella\",\"Kubernetes\",\"Sync Gateway\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/get-set-to-the-edge-with-sync-gateway\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/get-set-to-the-edge-with-sync-gateway\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/get-set-to-the-edge-with-sync-gateway\/\",\"name\":\"Get set to the edge with Sync Gateway - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/get-set-to-the-edge-with-sync-gateway\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/get-set-to-the-edge-with-sync-gateway\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/07\/sgw-arch.png\",\"datePublished\":\"2021-01-07T13:22:35+00:00\",\"dateModified\":\"2025-06-14T02:58:04+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/get-set-to-the-edge-with-sync-gateway\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/get-set-to-the-edge-with-sync-gateway\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/get-set-to-the-edge-with-sync-gateway\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/07\/sgw-arch.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/07\/sgw-arch.png\",\"width\":1832,\"height\":1050},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/get-set-to-the-edge-with-sync-gateway\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Get set to the edge with Sync Gateway\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/21c735da109667147c580bb2cb351c1c\",\"name\":\"Anuj Sahni, Cloud and Solutions Architecture Leader, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/5e9708314822fac560c43a5fbdc9b74f\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/cb8391905c8ac6ff579c79c90aeaa4e9cf773b87a25e710ee107104c5659deb6?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/cb8391905c8ac6ff579c79c90aeaa4e9cf773b87a25e710ee107104c5659deb6?s=96&d=mm&r=g\",\"caption\":\"Anuj Sahni, Cloud and Solutions Architecture Leader, Couchbase\"},\"description\":\"Anuj Sahni is a seasoned cloud and solutions architecture leader with over two decades of experience designing scalable, high-performance enterprise applications across AWS, Azure, and GCP. Currently part of the Capella team at Couchbase, he helps organizations modernize their applications and navigate cloud migration using cloud-native technologies. Prior to Couchbase, Anuj was Principal Product Manager at Oracle, where he led strategic initiatives for Oracle NoSQL Database and Oracle Service Cloud, focusing on distributed, always-available data platforms. He holds a Master\u2019s in Electrical and Computer Engineering from the University of Florida\u00a0and is an active thought leader in the data architecture space.\",\"sameAs\":[\"https:\/\/www.linkedin.com\/in\/anuj-sahni-6a80b617\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/anujsahni\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Get set to the edge with Sync Gateway - The Couchbase Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/pt\/get-set-to-the-edge-with-sync-gateway\/","og_locale":"pt_BR","og_type":"article","og_title":"Get set to the edge with Sync Gateway","og_description":"Introduction Imagine you are going to meet an important client in downtown San Francisco, CA and you have an email with details on who to call to when you get to the office lobby. You are in the lobby but [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/get-set-to-the-edge-with-sync-gateway\/","og_site_name":"The Couchbase Blog","article_published_time":"2021-01-07T13:22:35+00:00","article_modified_time":"2025-06-14T02:58:04+00:00","og_image":[{"width":1832,"height":1050,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/07\/sgw-arch.png","type":"image\/png"}],"author":"Anuj Sahni, Cloud and Solutions Architecture Leader, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Anuj Sahni, Cloud and Solutions Architecture Leader, Couchbase","Est. reading time":"14 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/get-set-to-the-edge-with-sync-gateway\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/get-set-to-the-edge-with-sync-gateway\/"},"author":{"name":"Anuj Sahni, Cloud and Solutions Architecture Leader, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/21c735da109667147c580bb2cb351c1c"},"headline":"Get set to the edge with Sync Gateway","datePublished":"2021-01-07T13:22:35+00:00","dateModified":"2025-06-14T02:58:04+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/get-set-to-the-edge-with-sync-gateway\/"},"wordCount":2857,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/get-set-to-the-edge-with-sync-gateway\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/07\/sgw-arch.png","keywords":["kubernetes","offline first"],"articleSection":["Best Practices and Tutorials","Couchbase Capella","Kubernetes","Sync Gateway"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/get-set-to-the-edge-with-sync-gateway\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/get-set-to-the-edge-with-sync-gateway\/","url":"https:\/\/www.couchbase.com\/blog\/get-set-to-the-edge-with-sync-gateway\/","name":"Get set to the edge with Sync Gateway - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/get-set-to-the-edge-with-sync-gateway\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/get-set-to-the-edge-with-sync-gateway\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/07\/sgw-arch.png","datePublished":"2021-01-07T13:22:35+00:00","dateModified":"2025-06-14T02:58:04+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/get-set-to-the-edge-with-sync-gateway\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/get-set-to-the-edge-with-sync-gateway\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/get-set-to-the-edge-with-sync-gateway\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/07\/sgw-arch.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/07\/sgw-arch.png","width":1832,"height":1050},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/get-set-to-the-edge-with-sync-gateway\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Get set to the edge with Sync Gateway"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"Blog do Couchbase","description":"Couchbase, o banco de dados NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/21c735da109667147c580bb2cb351c1c","name":"Anuj Sahni, L\u00edder de Arquitetura de Nuvem e Solu\u00e7\u00f5es, Couchbase","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/5e9708314822fac560c43a5fbdc9b74f","url":"https:\/\/secure.gravatar.com\/avatar\/cb8391905c8ac6ff579c79c90aeaa4e9cf773b87a25e710ee107104c5659deb6?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/cb8391905c8ac6ff579c79c90aeaa4e9cf773b87a25e710ee107104c5659deb6?s=96&d=mm&r=g","caption":"Anuj Sahni, Cloud and Solutions Architecture Leader, Couchbase"},"description":"Anuj Sahni is a seasoned cloud and solutions architecture leader with over two decades of experience designing scalable, high-performance enterprise applications across AWS, Azure, and GCP. Currently part of the Capella team at Couchbase, he helps organizations modernize their applications and navigate cloud migration using cloud-native technologies. Prior to Couchbase, Anuj was Principal Product Manager at Oracle, where he led strategic initiatives for Oracle NoSQL Database and Oracle Service Cloud, focusing on distributed, always-available data platforms. He holds a Master\u2019s in Electrical and Computer Engineering from the University of Florida\u00a0and is an active thought leader in the data architecture space.","sameAs":["https:\/\/www.linkedin.com\/in\/anuj-sahni-6a80b617"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/anujsahni\/"}]}},"authors":[{"term_id":9090,"user_id":33279,"is_guest":0,"slug":"anujsahni","display_name":"Anuj Sahni, Cloud and Solutions Architecture Leader, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/cb8391905c8ac6ff579c79c90aeaa4e9cf773b87a25e710ee107104c5659deb6?s=96&d=mm&r=g","author_category":"1","last_name":"Sahni, Cloud and Solutions Architecture Leader, Couchbase","first_name":"Anuj","job_title":"","user_url":"https:\/\/www.linkedin.com\/in\/anuj-sahni-6a80b617","description":"<p data-start=\"231\" data-end=\"963\"><strong>Anuj Sahni<\/strong> \u00e9 um l\u00edder experiente em arquitetura de solu\u00e7\u00f5es e nuvem, com mais de duas d\u00e9cadas de experi\u00eancia no projeto de aplicativos corporativos escal\u00e1veis e de alto desempenho na AWS, Azure e GCP. Atualmente, faz parte da equipe de <strong>Equipe Capella no Couchbase<\/strong>, Ele ajuda as organiza\u00e7\u00f5es a modernizar seus aplicativos e a navegar na migra\u00e7\u00e3o para a nuvem usando tecnologias nativas da nuvem.<\/p>\r\n<p data-start=\"231\" data-end=\"963\">Antes do Couchbase, Anuj foi <strong>Gerente de produto principal da Oracle<\/strong>, onde liderou iniciativas estrat\u00e9gicas para o Oracle NoSQL Database e Oracle Service Cloud, com foco em plataformas de dados distribu\u00eddas e sempre dispon\u00edveis. Ele possui um <strong>Mestrado em Engenharia El\u00e9trica e de Computa\u00e7\u00e3o<\/strong> do <strong>Universidade da Fl\u00f3rida<\/strong>\u00a0e \u00e9 um l\u00edder de pensamento ativo no espa\u00e7o da arquitetura de dados.<\/p>"}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/8969","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/33279"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=8969"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/8969\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/8970"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=8969"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=8969"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=8969"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=8969"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}