<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Laerte Antonio Giraldelli</title>
    <description>The latest articles on DEV Community by Laerte Antonio Giraldelli (@laerteg).</description>
    <link>https://dev.to/laerteg</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F654614%2Fb6c4375f-edc7-4b08-bb3e-d783d0b5694a.png</url>
      <title>DEV Community: Laerte Antonio Giraldelli</title>
      <link>https://dev.to/laerteg</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/laerteg"/>
    <language>en</language>
    <item>
      <title>Oracle Cloud Account was hacked - How to Regain Access</title>
      <dc:creator>Laerte Antonio Giraldelli</dc:creator>
      <pubDate>Fri, 24 Nov 2023 19:54:52 +0000</pubDate>
      <link>https://dev.to/laerteg/oracle-cloud-account-was-hacked-how-to-regain-access-470o</link>
      <guid>https://dev.to/laerteg/oracle-cloud-account-was-hacked-how-to-regain-access-470o</guid>
      <description>&lt;p&gt;In this post I want to share a step by step guide on How I regained my oracle cloud account. During googling on this problem, I saw many people with the same problem and no information on how to proceed.&lt;br&gt;
I tried to solve in Oracle Support Live chat but the attendant said to post my problem in Oracle Forum Community and vice-versa.&lt;/p&gt;

&lt;p&gt;I created a Free Tier Account just for Certification purposes that expired last month.&lt;/p&gt;

&lt;p&gt;Few days ago I received two e-mails from Oracle Cloud warning me that my Default domain password and Default domain email were updated.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LcpALzLO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/it5m3xtveblzn4vserf1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LcpALzLO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/it5m3xtveblzn4vserf1.png" alt="Image description" width="800" height="437"&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uT9MxwKO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lkoe8bskw3aevb81zjgi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uT9MxwKO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lkoe8bskw3aevb81zjgi.png" alt="Image description" width="800" height="318"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After a lot of searching on the internet, I found this video below on YouTube that helped me a lot and so I decided to turn it into this guide. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=yvFY5QLbx6Y"&gt;https://www.youtube.com/watch?v=yvFY5QLbx6Y&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create an Oracle Account&lt;/strong&gt;&lt;br&gt;
just to access Oracle Support page    and the login name must be the same the Oracle Cloud Account that you need to regain.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://profile.oracle.com/myprofile/account/create-account.jspx"&gt;https://profile.oracle.com/myprofile/account/create-account.jspx&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zo9IHATr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mmjyiddb15p9fsiu6gb2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zo9IHATr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mmjyiddb15p9fsiu6gb2.png" alt="Image description" width="800" height="771"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Login to Oracle Support Page&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://support.oracle.com/epmos/faces/Dashboard"&gt;https://support.oracle.com/epmos/faces/Dashboard&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3e-aJ-VP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/npg5sd7qnlv28whaxzvg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3e-aJ-VP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/npg5sd7qnlv28whaxzvg.png" alt="Image description" width="465" height="395"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Creating a new Service Request&lt;/strong&gt;&lt;br&gt;
click on the Service Requests tab...&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--12EcfgMj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j0qiuxwtypwky3bpl3oo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--12EcfgMj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j0qiuxwtypwky3bpl3oo.png" alt="Image description" width="800" height="259"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select Create Non-Technical SR... &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pKCmJdLC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ujkbe4t6hl8qsenrp94v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pKCmJdLC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ujkbe4t6hl8qsenrp94v.png" alt="Image description" width="800" height="294"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Problem Summary: I want to recovery my Oracle Cloud Account&lt;br&gt;
Problem Type: Select "Login/Administration/Profile issues"&lt;br&gt;
Press Next..&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dBEMLzXv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/svqed24cgf6ktqaa8va7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dBEMLzXv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/svqed24cgf6ktqaa8va7.png" alt="Image description" width="800" height="200"&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;&lt;br&gt;
Answer Question 1: Describe what happended... e.g.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;My oracle cloud account and password was changed by someone last saturday. 

I received the e-mails below from Oracle Cloud: 
Your domain Default Email in laerteg Has Been Updated 
The Password for Your Domain Default in laerteg Account Has Been Updated Successfully 

I tried to reset the password but I didn't receive the e-mail. 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Select Continue...&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iR8rL6k5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g1o7m9ypkpglvqpwamx5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iR8rL6k5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g1o7m9ypkpglvqpwamx5.png" alt="Image description" width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Answer Question 2: Select My Oracle Support Login Errors&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cMUFLJxx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rotr9c1wlalyvkqafggt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cMUFLJxx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rotr9c1wlalyvkqafggt.png" alt="Image description" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Answer Question 3: None of the Above&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vK7XXC3e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/owsj9mpuoo0vf5tebf1k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vK7XXC3e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/owsj9mpuoo0vf5tebf1k.png" alt="Image description" width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on Next...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xjSmP1Jc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3j9g0r29drfwscx8whfy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xjSmP1Jc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3j9g0r29drfwscx8whfy.png" alt="Image description" width="800" height="205"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select Attach if you have any files as printscreen...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1AzvAEQe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6rh8i95rwhqdouzg6ejf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1AzvAEQe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6rh8i95rwhqdouzg6ejf.png" alt="Image description" width="800" height="199"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select browse to find the file you want...&lt;br&gt;
If the file attached contains any personal information mark the option and then Attach Files...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jUefU_4J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kiwn1ujz2ifs3mr1lo6m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jUefU_4J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kiwn1ujz2ifs3mr1lo6m.png" alt="Image description" width="755" height="395"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A hint: at this point you can attach a PDF file with the following contents:&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I authorize Oracle Support to create the following User as &amp;lt;ROLE&amp;gt; (Account Administrator OR Domain Administrator OR Order Activator) on my Cloud Account.  

Full Name: &amp;lt;NEW USER'S FIRST AND LAST NAME&amp;gt;  
Email Address: abcd2023@gmail.com  
Role: Account Administrator  
SR#: x-xxxxxxxxxxxx   
Identity Domain/Cloud Account/Tenancy or Order Number or Subscription ID: &amp;lt;TENANCY&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;During the SR processing, Oracle Support will ask you to attach the PDF above.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Next click the Submit Button...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dUIqhGpy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7e3ws2wp28bm9x7l86es.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dUIqhGpy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7e3ws2wp28bm9x7l86es.png" alt="Image description" width="800" height="152"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then you should see the created SR...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dscRcdjR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k6jf9hyt67w0h7a807ij.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dscRcdjR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k6jf9hyt67w0h7a807ij.png" alt="Image description" width="800" height="156"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In your email box you will receive an email with the SR details...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_PFi70E9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r3tv0zcir44cubb63p73.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_PFi70E9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r3tv0zcir44cubb63p73.png" alt="Image description" width="602" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Any update on service request it will sent to your e-mail or you can follow directely on the service request&lt;/p&gt;
&lt;/blockquote&gt;

</description>
    </item>
    <item>
      <title>Provisionando Redis Sentinel para uma aplicação voltada a transações com cartão.</title>
      <dc:creator>Laerte Antonio Giraldelli</dc:creator>
      <pubDate>Thu, 28 Jul 2022 22:17:00 +0000</pubDate>
      <link>https://dev.to/laerteg/redis-sentinel-em-uma-topologia-de-microservicos-para-autorizacao-de-transacoes-com-cartao-3c69</link>
      <guid>https://dev.to/laerteg/redis-sentinel-em-uma-topologia-de-microservicos-para-autorizacao-de-transacoes-com-cartao-3c69</guid>
      <description>&lt;p&gt;&lt;strong&gt;Motivação&lt;/strong&gt;&lt;br&gt;
Nesse artigo quero compartilhar como construí uma infraestrutura de Redis Sentinel altamente disponivel em uma cloud privada baseada em VMWare com cisco ACI na camada de rede, em uma arquitetura de microserviços voltada para autorização de transações com cartão.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Os dados de host, IP e outras informações apresentados no decorrer desse post são fictícios ou foram mascarados por motivos de segurança&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Como é um fluxo de uma transação com cartão&lt;/strong&gt;&lt;br&gt;
Antes de aprofundar na solução do Redis Sentinel, um resumo rápido sobre o contexto de um fluxo de autorização de uma transação de cartão feita via TEF (as famosas maquininhas) e qual o impacto do Redis.&lt;/p&gt;

&lt;p&gt;Basicamente uma compra é feita via cartão em uma maquininha no estabelecimento comercial, a partir daí a transação passa pelo adquirente (fornecedor das TEFs), pela bandeira do cartão, pela processadora da transação e por fim no emissor do cartão que vai autorizar ou não a compra e aí o retorno até a maquininha, onde o recebemos no visor a resposta. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz5mnml764tdpffax7kdf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz5mnml764tdpffax7kdf.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Onde entra o Redis nessa história&lt;/strong&gt;&lt;br&gt;
O serviço do Redis Sentinel entra no ponto da resposta do emissor para a processadora, autorizando ou não a compra, onde essa resposta tem que ser em até 2 segundos e com média diária de 1 milhão de transações dia. &lt;/p&gt;

&lt;p&gt;O Redis Sentinel entra no ecosistema do microserviço responsável por tratar a transação e responder de volta para a processadora. &lt;/p&gt;

&lt;p&gt;O Redis mantém um tipo de cache em memória, onde salva algumas informações importantes, por exemplo, IDs do cartão da processadora, associado ao usuário do lado do emissor, também tem os dados da conta bancária na aplicação de core bancário (agência e conta), dados de pacote de serviço, etc. , reduzindo drasticamente a busca desses dados entre vários microserviços e banco de dados. &lt;/p&gt;

&lt;p&gt;Os dados em memória são persistidos e sincronizados em disco entre as máquinas onde existe o serviço do Redis. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O desafio para criar a solução do Redis Sentinel&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Recebemos a demanda para criar uma solução com Redis com disponibilidade e resiliência, subindo a infraestrutura no nossa recém-criada cloud privada baseada em VMWare vRealize 7.x na camada de virtualização de máquinas e na camada de rede uma SDN Cisco ACI Anywhere. &lt;/p&gt;

&lt;p&gt;Abaixo segue o diagrama de como ficou a arquitetura final.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjxpfehmdd6iowa4wecn8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjxpfehmdd6iowa4wecn8.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Entrada GSLB e Load Balance no F5&lt;/strong&gt;&lt;br&gt;
Como podemos ver no diagrama acima, em cada datacenter foi criado um Load Balancer no F5 (ver print da conf mais abaixo) para balancear as requisições entre as máquinas virtuais na porta 5679 (redis service).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffjoz6ih5msmu953kt9i1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffjoz6ih5msmu953kt9i1.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O campo &lt;em&gt;send string&lt;/em&gt; contém a string do Redis que retorna a informação se o server é um master ou slave, no F5 configuramos o receive string como 'role:master', assim o LB estará "Up" se encontrar o master.&lt;/p&gt;

&lt;p&gt;A gestão e eleição do master entre as 4 VM's fica a cargo do serviço do sentinel.&lt;/p&gt;

&lt;p&gt;Na frente desses 2 LB's, foi criado uma entrada GSLB (Global Server Load Balance)(ver print da conf mais abaixo), também uma feature no F5 para receber as requisições do microserviço vindas do orquestrador de container Mesos e balancear entre os 2 datacenters.&lt;/p&gt;

&lt;p&gt;Do lado do cliente Redis na aplicação a configuração da conexão vai passar somente o hostname definido no GSLB e a porta do Redis, onde o GSLB vai encaminhar direto para o server onde estará o master do redis. Diferente de outras soluções com Redis Sentinel onde na configuração do cliente redis é passado o IP/hostname de todos os nodes sentinel que são validados durante a conexão inicial para encontrar qual deles é o master. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm4tljn4mla28emscak0o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm4tljn4mla28emscak0o.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Provisionamento da Máquinas Virtuais&lt;/strong&gt;&lt;br&gt;
O provisionamento das máquinas virtuais nesse ambiente VMWare VRA7 foi feito com terraform&lt;/p&gt;

&lt;p&gt;O código terraform utilizado pode ser consultado no meu github: &lt;a href="https://github.com/laerteg/redis-sentinel-vmware-iac" rel="noopener noreferrer"&gt;redis-sentinel-vmware-iac&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para a execução do terraform, clonado repositório do github e executado terraform, no exemplo abaixo provisionado as máquinas no Datacenter A (ex: dca).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git clone git@github.com:laerteg/redis-sentinel-vmware-iac.git
$ cd terraform/prod/redis-dca
$ terraform init
$ terraform plan -var-file="../../dc/dca-prod.tfvars" -var-file="../../service/redis/variables.tfvars"
$ terraform apply -var-file="../../dc/dca-prod.tfvars" -var-file="../../service/redis/variables.tfvars"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Gestão de Configuração com Ansible&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Após criadas as máquinas virtuais via terraform, a parte de configuração e instalação do Redis Sentinel foi feita utilizando Ansible.&lt;/p&gt;

&lt;p&gt;Para a execução do ansible, clonado &lt;a href="https://github.com/laerteg/redis-sentinel-vmware-iac" rel="noopener noreferrer"&gt;repositório&lt;/a&gt; do github e executado terraform, no exemplo abaixo provisionado as máquinas no Datacenter A (ex: dca).&lt;/p&gt;

&lt;p&gt;Antes de executar o playbook do ansible, alguns ajustes foram necessários:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Ajustar o inventário do ansible (hosts) com os IPs das instâncias criadas;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Editar o arquivo main.yml e ajustar as variáveis de acordo com o projeto:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;mymaster_ip&lt;/strong&gt;:   colocar o IP da instância que será o Master inicial.&lt;br&gt;
&lt;strong&gt;quorum_num&lt;/strong&gt;:  colocar o numero do quorum que será utilizado para eleição do novo master em caso de problemas. (Ex: Redis com 4 instâncias quorum = 2).&lt;br&gt;
&lt;strong&gt;newrelic_key&lt;/strong&gt;:  inserir o código do new_relic de acordo com o ambiente (Prod ou QA).&lt;br&gt;
&lt;strong&gt;env&lt;/strong&gt;:  ambiente do Redis. (Ex: prod ou QA).&lt;br&gt;
&lt;strong&gt;persist_data&lt;/strong&gt;:  Se o redis terá persistencia de dados ou não.  Opções:  'yes'  ou 'no'.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Inicialmente foi definido &lt;strong&gt;quorum_num = 3&lt;/strong&gt; porém quando o Datacenter B ficou sem conectividade, o sentinel não conseguiu fazer a re-eleição do master pois haviam somente 2 nodes do Datacenter A, com quorum de 2, o sentinel conseguiu eleger um master e um slave..&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Abaixo exemplo de execução do playbook do ansible:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git clone git@github.com:laerteg/redis-sentinel-vmware-iac.git
$ 
$ cd ansible/install_redis
$ ansible-playbook -i hosts main.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Validações e Troubleshooting&lt;/strong&gt;&lt;br&gt;
Para verificações e testes com as portas TCP 5679 e 25679 entre as máquinas:&lt;/p&gt;

&lt;p&gt;nmap&lt;br&gt;
ncat, nc&lt;/p&gt;

&lt;p&gt;Para verificações do sistema redis, utilizado redis-cli.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ redis-cli  -h  10.181.26.109  info  replication

# Replication
role:master
connected_slaves:2
slave0:ip=10.181.26.110,port=6379,state=online,offset=165366625665,lag=1
slave1:ip=10.181.26.120,port=6379,state=online,offset=165366625804,lag=0
master_replid:119a4cc3b2c5cc8e374423ab9034acd540befbad
master_replid2:cb7cc24457975dde598db2b78b54afe76b9f630d
master_repl_offset:165366625818
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Na saída acima podemos verificar que o node do Redis em questão é um master e tem 2 slaves conectados via sentinel.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ redis-cli  -h  10.181.26.110  info  replication

# Replication
role:slave
master_host:10.181.26.109
master_port:6379
master_link_status:up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Na saída acima podemos verificar que o node do Redis em questão é um slave, qual é o master, porta e conexão com master Up.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ redis-cli -h 10.181.26.109 -p 26379 sentinel masters

1) "name"
2)"mymaster"
3) "ip"
4) "10.181.26.109"
5) "port"
6) "6379"
...
...
17) "last-ok-ping-reply"
18) "73"
19) "last-ping-reply"
20) "73"
21) "down-after-milliseconds"
22) "10000"
23) "info-refresh"
24) "216"
25) "role-reported"
26) "master"
27) "role-reported-time"
28) "4313841777"
29) "config-epoch"
30) "3"
31) "num-slaves"
32) "2"
33) "num-other-sentinels"
34) "2"
35) "quorum"
36) "2"
37) "failover-timeout"
38) "30000"
39) "parallel-syncs"
40) "1"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesta saída acima podemos ver várias informações sobre o master sentinel, slaves conectados, etc.. No caso de problemas de conectividade entre os nodes apareceríam informações conforme abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10) "s_down,master,disconnected"
33) "num-slaves"
34) "0"
35) "num-other-sentinels"
36) "0"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Passo a passo - Instalação do Redis Sentinel&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ajustes no Kernel do S.O.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Desabilitar Transparent Huge Pages (THP)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;echo 'never' &amp;gt; /sys/kernel/mm/transparent_hugepage/enabled   (após reboot volta opção 'always')&lt;/p&gt;

&lt;p&gt;Para desabilitar o THP após reboot do servidor, criar arquivo &lt;strong&gt;/etc/init.d/after.local&lt;/strong&gt; com o seguinte conteudo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Disable THP for REDIS

if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo 'never' &amp;gt; /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo 'never' &amp;gt; /sys/kernel/mm/transparent_hugepage/defrag
fi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Ulimit, Max Connections, overcommit memory, etc..
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# sysctl -w vm.min_free_kbytes=1448
# sysctl -w vm.overcommit_memory=1
# sysctl -w net.core.somaxconn=65365
# sysctl -w fs.file-max=100000
# ulimit -H -n 32768
# ulimit -S -n 24576
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;/etc/security/limits.conf
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;soft nofile 24576
hard nofile 32768
redis soft nofile 24576
redis hard nofile 32768
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Listar e Atualizar limits.conf
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sysctl -a (show variables)
sysctl -p (reload conf)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Verificar limits de um processo
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ps -ef | grep redis | awk '{print $2}'
60224

sudo grep 'open files' /proc/60224/limits
Max open files 24576 32768 files
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Instalação do pacote Redis no SUSE Linux&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;# zypper addrepo https://download.opensuse.org/repositories/server:database/SLE_15_SP1/server:database.repo&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;# zypper search-packages -d redis&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Package Module or Repository SUSEConnect Activation Command
-------------------------------------------- ------------------------------------------------------- ---------------------------------------------------------

redis-4.0.11-bp151.2.1.x86_64 susemanager:suse-packagehub-15-sp1-standard-pool-x86_64

redis-5.0.8-129.3.x86_64 server_database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;# zypper refresh&lt;/code&gt;&lt;br&gt;
&lt;code&gt;# zypper install redis&lt;/code&gt;&lt;br&gt;
&lt;code&gt;# zypper packages --installed-only&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;i+ | server_database | redis | 5.0.8-129.3 | x86_64
v | SUSE-PackageHub-15-SP1-Standard-Pool for x86_64 | redis | 4.0.11-bp151.2.1 | x86_64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;#/usr/sbin&amp;gt; ls -la | grep redis&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;lrwxrwxrwx 1 root root 7 abr 1 01:18 rcredis -&amp;gt; service
lrwxrwxrwx 1 root root 12 abr 1 01:18 redis-check-aof -&amp;gt; redis-server
lrwxrwxrwx 1 root root 12 abr 1 01:18 redis-check-rdb -&amp;gt; redis-server
lrwxrwxrwx 1 root root 12 abr 1 01:18 redis-sentinel -&amp;gt; redis-server
-rwxr-xr-x 1 root root 1781592 abr 1 01:18 redis-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;#/usr/bin&amp;gt; ls -la | grep redis&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-rwxr-xr-x 1 root root 646712 abr 1 01:18 redis-benchmark
lrwxrwxrwx 1 root root 20 abr 1 01:18 redis-check-aof -&amp;gt; ../sbin/redis-server
lrwxrwxrwx 1 root root 20 abr 1 01:18 redis-check-rdb -&amp;gt; ../sbin/redis-server
-rwxr-xr-x 1 root root 812944 abr 1 01:18 redis-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Criação de Usuário e Grupo redis&lt;/p&gt;

&lt;p&gt;&lt;code&gt;# groupadd -r redis&lt;/code&gt;&lt;br&gt;
&lt;code&gt;# useradd --system -g redis  -d /home/redis&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Criação Diretório de Configuração&lt;/p&gt;

&lt;p&gt;&lt;code&gt;# mkdir -p /etc/redis&lt;/code&gt;&lt;br&gt;
&lt;code&gt;# chown redis:redis /etc/redis&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Criação Diretório de Dump (*.RDB e *.AOF)&lt;/p&gt;

&lt;p&gt;&lt;code&gt;# mkdir -p /var/lib/redis&lt;/code&gt;&lt;br&gt;
&lt;code&gt;# chown redis:redis /var/lib/redis&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Criação Diretório de Logs&lt;/p&gt;

&lt;p&gt;&lt;code&gt;# touch /var/log/redis.log&lt;/code&gt;&lt;br&gt;
&lt;code&gt;# touch /var/log/sentinel.log&lt;/code&gt;&lt;br&gt;
&lt;code&gt;# chown redis:redis /var/log/redis.log&lt;/code&gt;&lt;br&gt;
&lt;code&gt;# chown redis:redis /var/log/sentinel.log&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;NOTA&lt;/strong&gt;:  o serviço do Redis/Sentinel é sensível as pastas onde escreve como /etc/redis, /var/lib, /var/log, etc.. em caso de não ter permissão, o serviço não ativa.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Master &amp;amp; Slave&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;redis.conf&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;bind 127.0.0.1  &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;protected-mode no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;port 6379&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;daemonize yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;supervised systemd&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;pidfile "/opt/redis/run/redis_6379.pid"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;logfile "/opt/redis/log/redis.log"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;save 900 1    (cada 900s se 1 chave mudar)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;save 300 10   (cada 300s se 10 chaves mudarem)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;save 60 10000 (cada 60s se 10000 chaves mudarem)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;dbfilename "dump.rdb"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;appendonly yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;appendfilename "NOME_PROJETO.aof"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-------------&lt;/td&gt;
&lt;td&gt;----------------------------------------------------&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;sentinel.conf&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;# Deixar o bind ser feito em todas interfaces&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;#bind 127.0.0.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;protected-mode no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;# The port that sentinel instance will run on&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;port 26379&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;supervised systemd&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;pidfile /opt/redis/run/redis-sentinel.pid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;logfile "/opt/redis/log/sentinel.log"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;# IP Redis Master inicial, porta e quorum&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;sentinel monitor mymaster &amp;lt;IP_MASTER&amp;gt;  6379 &amp;lt;QUORUM&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;sentinel down-after-milliseconds mymaster 5000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;supervised systemd:&lt;/strong&gt; se comentado serviço systemctl não sobe&lt;br&gt;
&lt;strong&gt;Persistencia dos dados:&lt;/strong&gt; Se for ligar, as 3 linhas abaixo devem ser descomentadas&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;save 900 1      (cada 15min se 1 chave mudar)&lt;/li&gt;
&lt;li&gt;save 300 10   (cada  5min se 10 chaves mudarem)&lt;/li&gt;
&lt;li&gt;save 60 10000   (cada 1min se 10000 chaves mudarem)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;dbfilename "dump.rdb":&lt;/strong&gt; dados persistidos são escritos no dump&lt;br&gt;
&lt;strong&gt;appendonly yes:&lt;/strong&gt; habilita escrita do arquivo AOF&lt;br&gt;
&lt;strong&gt;appendfilename "NOME_PROJETO.aof":&lt;/strong&gt; nome do arquivo AOF (default: "appendonly.aof").&lt;br&gt;
&lt;strong&gt;QUORUM:&lt;/strong&gt; Com minimo de 2 nodes e quorum igual a 2, o sentinel consegue eleger um master.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configuração dos Serviços Systemctl&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/etc/systemd/system/redis.service&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Unit]
Description=Redis In-Memory Data Store
After=network.target

[Service]
#Type=notify
Type=forking
LimitNOFILE=64000
User=redis
Group=redis
ExecStart=/usr/sbin/redis-server /opt/redis/conf/redis.conf
ExecStop=/usr/bin/redis-cli -h 127.0.0.1 shutdown
Restart=always

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;/etc/systemd/system/sentinel.service&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Unit]
Description=Sentinel for Redis
After=network.target

[Service]
Type=notify
LimitNOFILE=64000
User=redis
Group=redis
PIDFile=/opt/redis/run/sentinel.pid
ExecStart=/usr/sbin/redis-sentinel /opt/redis/conf/sentinel.conf
ExecStop=/bin/kill -s TERM $MAINPID
Restart=always

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como usuário ROOT habilitar e iniciar serviço redis em todos os nodes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# systemctl enable redis.service
# systemctl start redis.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Saída de log do serviço redis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;47705:C 07 Apr 2020 12:26:07.485 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
47705:C 07 Apr 2020 12:26:07.485 # Redis version=5.0.8, bits=64, commit=00000000, modified=0, pid=47705, just started
47705:C 07 Apr 2020 12:26:07.485 # Configuration loaded
47705:C 07 Apr 2020 12:26:07.485 * supervised by systemd, will signal readiness
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 5.0.8 00000000/0) 64 bit
 _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 47705
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

47705:S 07 Apr 2020 12:26:07.486 # Server initialized
47705:S 07 Apr 2020 12:26:07.486 * Ready to accept connections
47705:S 07 Apr 2020 12:26:07.486 * Connecting to MASTER 10.181.26.110:6379
47705:S 07 Apr 2020 12:26:07.486 * MASTER &amp;lt;-&amp;gt; REPLICA sync started
47705:S 07 Apr 2020 12:26:07.486 * Non blocking connect for SYNC fired the event.
47705:S 07 Apr 2020 12:26:07.487 * Master replied to PING, replication can continue...
47705:S 07 Apr 2020 12:26:07.487 * Partial resynchronization not possible (no cached master)
47705:S 07 Apr 2020 12:26:07.488 * Full resync from master: e1a164521f59ed78711cc7e3a186dda89562021d:0
47705:S 07 Apr 2020 12:26:07.575 * MASTER &amp;lt;-&amp;gt; REPLICA sync: receiving 175 bytes from master
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como usuário ROOT habilitar e iniciar serviço sentinel em todos os nodes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#systemctl enable sentinel.service
#systemctl start sentinel.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Saída de log do serviço sentinel:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;112167:X 14 Apr 2020 11:44:24.554 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
112167:X 14 Apr 2020 11:44:24.554 # Redis version=5.0.8, bits=64, commit=00000000, modified=0, pid=112167, just started
112167:X 14 Apr 2020 11:44:24.554 # Configuration loaded
112167:X 14 Apr 2020 11:44:24.554 * supervised by systemd, will signal readiness
112167:X 14 Apr 2020 11:44:24.555 * Running mode=sentinel, port=26379.
112167:X 14 Apr 2020 11:44:24.555 # Sentinel ID is dac84d11847121c48bc18e6ddb37b7cdd800e276
112167:X 14 Apr 2020 11:44:24.555 # +monitor master mymaster 10.181.26.110 6379 quorum 3
112167:X 14 Apr 2020 11:44:24.557 * +slave slave 10.181.26.107:6379 10.181.26.107 6379 @ mymaster 10.181.26.110 6379
112167:X 14 Apr 2020 11:44:24.558 * +slave slave 10.181.26.108:6379 10.181.26.108 6379 @ mymaster 10.181.26.110 6379
112167:X 14 Apr 2020 11:44:24.559 * +slave slave 10.181.26.109:6379 10.181.26.109 6379 @ mymaster 10.181.26.110 6379
112167:X 14 Apr 2020 11:44:25.163 * +sentinel sentinel 5eff2261037d126bea40bbd5cd64523b1cfe1604 10.181.26.108 26379 @ mymaster 10.181.26.110 6379
112167:X 14 Apr 2020 11:44:26.427 * +sentinel sentinel 1ded330e6ac1da4f4430d72a5cb257546ebe0d9e 10.181.26.109 26379 @ mymaster 10.181.26.110 6379
112167:X 14 Apr 2020 11:44:35.955 * +sentinel sentinel aaeeb987bb282d63fa32788c660a748b377b11bb 10.181.26.109 26379 @ mymaster 10.181.26.110 6379
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para verificar possiveis problemas durante inicialização dos serviços utilizar JOURNALCTL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ journalctl -u redis
$ journalctl -xe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou verificar os arquivos de log do serviço.&lt;/p&gt;

&lt;p&gt;Em caso de alteração do arquivo de serviço, carregar novamente e fazer o restart dos serviços:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# systemctl daemon-reload
# systemctl restart redis.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Benchmark do REDIS&lt;/strong&gt;&lt;br&gt;
Na própria instalação do Redis existe uma ferramenta para fazer um benchmark contra a instalação do Redis e avaliar por exemplo se ele vai dar conta de certo número de requisições com chaves de tamanho X.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis-benchmark -q -n &amp;lt;requests&amp;gt; -c &amp;lt;conexões&amp;gt; -P &amp;lt;pipeline x instruções paralelas&amp;gt;

q = quiet
n = num. requests (default = 100000)
c = conexões client paralelas
P = Pipeline x comandos paralelos (default 1 = no pipeline)
d = tamanho da chave
t = subconjunto de comandos (GET, SET)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemplo: 1000 requisições de comando set/get com chaves no valor de 50Mb.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ redis-benchmark -h 10.181.26.110 -t set,get -d 50 -n 1000 -q

SET: 71428.57 requests per second
GET: 71428.57 requests per second
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Latência das Operações&lt;/strong&gt;&lt;br&gt;
O redis-cli tem opção pra ver latencia das operações sendo executados pelo redis, no exemplo o primeiro temos uma média de 0,04 microsegundos de latencia de uma operação.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ redis-cli -h 10.181.26.110 --latency

min: 0, max: 1, avg: 0.04 (1313 samples)^C
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse segundo exemplo é a latencia intrinseca, ou seja latencia daquilo que está fora do scopo do redis, por exemplo das camadas de virtualização, SO, etc.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ redis-cli -h 10.181.26.110 --intrinsic-latency 30

Max latency so far: 1 microseconds.
Max latency so far: 6 microseconds.
Max latency so far: 7 microseconds.
Max latency so far: 9 microseconds.
Max latency so far: 24 microseconds.
Max latency so far: 29 microseconds.
Max latency so far: 165 microseconds.
Max latency so far: 636 microseconds.
Max latency so far: 713 microseconds.
748875096 total runs (avg latency: 0.0401 microseconds / 40.06 nanoseconds per run).
Worst run took 17798x longer than the average latency.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;A média da latencia-intrinseca / media da latencia = % de tempo total da requisição é gasto pelo sistema em processos que não são controlados pelo Redis.&lt;br&gt;
Por exemplo:  media latencia = 0,18 microseg / media latencia-intrinseca = 0,06 microseg.&lt;br&gt;
Significa que 30% do tempo total  de uma requisição, é gasto com processos fora do redis.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Monitoração da Infraestrutura Redis&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nesse projeto optamos por configurar nos nodes do Redis o envio das métricas de infraestrutura para o New Relic.&lt;/p&gt;

&lt;p&gt;Instalação do módulo do NewRelic e especifico para o Redis:&lt;br&gt;
Adicionar repositório SUSE:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo rpm --import https://download.newrelic.com/infrastructure_agent/gpg/newrelic-infra.gpg
$ sudo curl -o /etc/zypp/repos.d/newrelic-infra.repo https://download.newrelic.com/infrastructure_agent/linux/zypp/sles/12.4/x86_64/newrelic-infra.repo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instalar pacote padrão do NewRelic e específico Redis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo zypper -n install newrelic-infra
$ sudo zypper -n install nri-redis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;NOTA: o serviço systemd do NR é ativado durante a instalação do pacote.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/etc/systemd/system/newrelic-infra.service&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Configuração do New Relic:&lt;/p&gt;

&lt;p&gt;Editar o arquivo /etc/newrelic-infra.yml e inserir a chave do NR correta. No nosso caso temos uma chave para QA e outra para Prod.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;license_key: 1234567890abcdef
log_file: /var/log/newrelic-infra.log
log_to_stdout: false
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Remover o arquivo Sample para Docker:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rm  /etc/newrelic-infra/integrations.d/docker-config.yml-sample
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copiar o arquivo SAMPLE de configuraçao do Redis de exemplo para o arquivo  a ser usado pelo NR:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# cd  /etc/newrelic-infra/integrations.d/
# cp  redis-config.yml.sample  redis-config.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Editar o arquivo alterando os campos hostname e environment de acordo com cada node e ambiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;integration_name: com.newrelic.redis

instances:
  - name: redis-metrics
    command: metrics
    arguments:
      hostname: 10.181.26.110
      port: 6379
      keys: '{"0":["&amp;lt;KEY_1&amp;gt;"],"1":["&amp;lt;KEY_2&amp;gt;"]}'
      remote_monitoring: true
    labels:
      environment: production

  - name: redis-inventory
    command: inventory
    arguments:
      hostname: 10.181.26.110
      port: 6379
      remote_monitoring: true
    labels:
      environment: production
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após os ajustes reiniciar o serviço do New Relic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo  systemctl restart newrelic-infra
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;O código Ansible para a configuração do New Relic está no &lt;br&gt;
&lt;a href="https://github.com/laerteg/redis-sentinel-vmware-iac" rel="noopener noreferrer"&gt;repositório&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Espero que esse conteúdo possa dar algum insight para alguém que esteja pensando em uma solução com Redis nos mesmos moldes em que tive que desenhar lá trás, na ocasião não encontrei muita informação. Nos dias de hoje temos outras opções mas na ocasião foi a que fez sentido e está dando conta do recado até hoje.&lt;/p&gt;

&lt;p&gt;Boa leitura.&lt;/p&gt;

</description>
      <category>redis</category>
      <category>f5</category>
      <category>terraform</category>
      <category>ansible</category>
    </item>
  </channel>
</rss>
