From 418d1991e5d592a31329546deb311a8eba629ed9 Mon Sep 17 00:00:00 2001 From: Nathan Melehan Date: Fri, 6 Feb 2026 18:19:50 +0000 Subject: [PATCH 1/6] [Update] Deploy a RAG-Powered Chatbot with LangChain on an Akamai Compute Instance Add missing chatbot stories zip file --- .gitignore | 1 - .../chatbot-short-stories.zip | Bin 0 -> 41973 bytes 2 files changed, 1 deletion(-) create mode 100644 docs/guides/akamai/solutions/deploy-rag-powered-chatbot-langchain-akamai-compute-instance/chatbot-short-stories.zip diff --git a/.gitignore b/.gitignore index 52bce1a639a..7381324ecf0 100644 --- a/.gitignore +++ b/.gitignore @@ -25,7 +25,6 @@ Thumbs.dbi *.jar *.rar *.tar -*.zip *.log *.sql diff --git a/docs/guides/akamai/solutions/deploy-rag-powered-chatbot-langchain-akamai-compute-instance/chatbot-short-stories.zip b/docs/guides/akamai/solutions/deploy-rag-powered-chatbot-langchain-akamai-compute-instance/chatbot-short-stories.zip new file mode 100644 index 0000000000000000000000000000000000000000..a353727f373158ea89e458eb885cc2f88ffff200 GIT binary patch literal 41973 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 Date: Fri, 6 Feb 2026 11:53:48 -0800 Subject: [PATCH 2/6] Add Cassandra multi-datacenter deplooyment guide --- .../CassandraCluster.png | Bin 0 -> 34036 bytes .../datacntrtopology.png | Bin 0 -> 7702 bytes .../index.md | 693 ++++++++++++++++++ 3 files changed, 693 insertions(+) create mode 100644 docs/guides/databases/cassandra/deploy-cassandra-multi-datacenters/CassandraCluster.png create mode 100644 docs/guides/databases/cassandra/deploy-cassandra-multi-datacenters/datacntrtopology.png create mode 100644 docs/guides/databases/cassandra/deploy-cassandra-multi-datacenters/index.md diff --git a/docs/guides/databases/cassandra/deploy-cassandra-multi-datacenters/CassandraCluster.png b/docs/guides/databases/cassandra/deploy-cassandra-multi-datacenters/CassandraCluster.png new file mode 100644 index 0000000000000000000000000000000000000000..2fbe4cd3951aca433766b001eec535c5add5726f GIT binary patch literal 34036 zcmb@tbx@qaw=EjnA-KB*cXxMpcXtgw!QI`11b4UK?hxFa1Q=v+8!o?7=l*l!p4EHz-fMNVs=%spC`~ZVoG9PzBDExy_vy$o+G%*>Un(mfL-vyfnyEL1F8st?O4c{dv%^73ucFmxL-x3ssH)Yq$Y zW6ll!r(q%fWLe4T2}DFhRdw}{;bBQ&X^tU_Gu>Y4Bq0I8;OkXiVonZ$lT{~kFZ+Kz zAK(s}KD`|PdRq)dpgfK8^ajVpAwxq3{{`Ma&N^~C=v;2Ls~EI7ZAQ!iz_$&$jNb#^ z)Bn?-lfoq{^?qW0Px$5KWgqbKX`}z6GtdvXyx;?2)4sW|yPF7jiUj=l^KaPXec7a_ zr^nELCf#Q5zkUlb9~3R^LQZb(jR|-Pun^NG@-`$Q>FwR7y=KI+M}!L3)!lv54tQ;^ zsHm6+rwjP~HtvN>_^kRDJtfsfJy(wS!3OYP^Y`LnxbSVF(Do|&kA3qdQpc*XKZ=!= zmCyaMPU~Y|;}6QuG4^XYfXVBDyPW%Yn`=eO=zRlCjnB=k+BfU!up9%Z_0^4i5{s z;;?u#)>%pmV}%^P#nPD5+}#gvPS&Xzc$AI6>`NQ}MVyGgxW%{mLy~u_pWP`|8L>?% zp7YM~vTR(Wp z6yN&Za0tECrOIf_{*}CyZ^c#ej!bbE{LucP4o+eL=Bp#rRaGI{+1WiUX7-l88%nU^ zEg4IbQFLW{KhQ149*R8U-R~g2&3=F>dONHrC!08uYcm+fz9xKt#-3J5efX;QS!w4}c>y?!9nzwbF+2<=AvJ3_2!xcdpJ?HhUo+@LGB zC=O^}Lr)6gUeCU|9E|k|h8>djCT@u0OlD*btlV)Me?$TX5=AP+PLFsoR<8y#Lda&p zw}emoW09_2tnjZ#QeJ%~2l>Bo=Y{g)ju}8n748M=?9n-oyCan=SOL#-AGiSyr#LnA zeO8B4+K51jo;1qr1^m`|C3fwD91=4CImPnUgf$fS8{Fb3+} z?$&4510wJ6uN#oE%#+dwK3qXJ`GA4B^9ZvU`Z0SMhMmBVa-T!Es}i&Mxak!4BU*?7 zRufg~VwIE)#h??<5Ab_dLBVJSlR;8mUd^(#Ae4+Gnkey7wj!(2LlIy;-c+BY$uY>s zn(^Cq6Q+tYy+n)<@$q@P`DvTG?u*KSp%Waebhm2YHGIxCjBcYHEq59XrQlB3pUA`# zYSk#ETy8V3I;fQ;qBNHv9F_Xn!Mj%dypAQ9M^9XPmX^W%UXt_Jw+f-}i1$wSyxosq za}1x?y8J2K<8UMcV4=5x6(ZkpEM}M28r+EGGlYW63j!d2Aslx2JyF#qM3^?{n%$rk zyVxR1+dzQS2d`(Jl3KxZ7i(<Z4MYGL zk`JTE@DRr~(xPlHb^Fm5prUNAY+~0ile0{N*UzQOYzGIt;t|Xi4v&@Re)T>vpVHV&wj&xm=CEg7Z0XO^-CnCw}QRlf$hnDDZl> zVE<+syGiZ)fa~deM6AmL!|Vuq!Eh*W7gK0pOBdKZDcb3RJ57dM0?dTu#b+u6*MD5P z;%EcFxlh~mHPSilXkO(ihx23pH>KhU1l}J1e021-L;op>gE=jN`Hc5C@x0^bm=cD$_0DTwF^;mambWE+J_E(U6?DgiP!BPW4RqfZIlcm z_};15a{oZ}_}=$x*%Q)tM%^(FVEi>CWca6JD0DOE9h_|ZbI`h7%G4j0(@LAoP0CP|xjnCKuC>===#P^=u>#Yx#e<}$4Mp-8ke}(!+PBGky_@S7U)#gRAg*i#BwzK0$flM>I5mv7B94L^UDILeFHIR zHB?mm9LbIvzDyXw3)Ycl*2sZIK)gJNn(XjzGgCkQ{3NmPAuuzbNLj48M!7R{wS_DS z)6`n}MM=31eHG=GFhmlz)XO+AB~##M`Z4{@@3qWKenQe({0o%PZ@fqS$#i{wEV6 z>?3FlZ7L-m5>QXr(yV0Ghr1&RPt%R*9jk`TVg~)&*(XF*>ZhTN>M9JnD&H6(x7`(2 z^WgBM8jb4%BHmBe&<#*zYvBvEeUi(~}?tq^I)xXE49Tk2Il@;Vq zdhh@ALoSrrR#7h$^Y2`y+GROy7+|bqK8n;40+_5-6ok@WE?M=7AjkR%xBU$z!_a>H zi!xxUwb?5DNPYC(Vw5mq!9G$0yH)HyFBH9%RKI(?*KZ#|)QDSR8@~Pln|?7wQnJvq z9x{QY2xFn#Jn72p)}K{~FIuiuvGbQ}vN_|Ib_aPQo?n4)fzm<8qSU27YzQ=(>H^U6 z9)em~AulV}yf_xl#UXskj+?rICSeLyws~smG~}j8HL-QZ;o4=ey+GJ*=pRgphZ$oF zy)v`4F+6mO6!0&G_ODH~bRAn~e!$Seg)_MXm0#cTvSWllC!L>HfF^YO8cisw`;^*mf^S?lJ zo7&}ZqV!&7+Ke~C?7KYab1|f$$RYh~>9cr7eA*Or^yJxw{|XNl@joH)zgPWHQL;9l z4(qf0L;mjw%?v{3^KL1}|EMh3LfXuet@!qgr=N5L7a>ukda?MB)COenfDv_LdNgQN#B_5L*mv-l4te?D;lo%zb6EcO;jPkWgGzCBIqFQTU1}RCi=6i-n78@%jLiRZ)>4`#N9OjT;?n z${H0B0c+Uhi9nJVX>(vZkkssqfPk>p;YO)lqgxdJ*jW(WtY3>qLNc1oVKe{dPl?eO zUnmY@Hcw1UOoP)Vx6^D#A&1)|KNL?rOx}q3!pd&54O*R1cf|CxA`>s^T^j$wp(G+R z-5NhXe}mm0nt=Oilkj!NUK>&Qw>6-5tary=0k9eCxREUscMe-gK`p`VtPX1mJ9Y)hWh$mmAasHUb?G=r~>IWh2NDA)wa z3>KxNqc%m78pLhcB)NMRmrTT@Td~aRyI(QL%F60@0iU=~2nf6u*zA{H zr-tSRzCP>^M`QZjjNm4xrb6}Y&PB)IK=X+vKOesCeh3%%U-AW9dKCUSI50jmpy9|) z3%ZFlA!A@b+I>6WX?=B_{TWUc#M%V-2;$`7IZXU`N^EU*1tCtqFKH!S2)VkqDUopU z@#!&qIhLD*9u1G(!Ns3qFXLcmZvh;Cvu76jW+|R>e|%wJZ+~_V+y>(rcKr29b_06y zw+{Vn93j`x3(P7AxxSl2B6o$wlPGQFheXp}%ueCoiv*BIW@FAtJ$+Qjn*mpI| z|2t?&Ql1ELN)#?8eL)Rv0=OH8qhOjYm(?+6$7mxV7Lpb3tAC@17(x~27TgQK}&EzH~f(VDUR+8Xw(F_^S#WO zQ~$!1ro6(boQ!S&@z3u|503jM*b;Q>SgwtmNA#JEoHJkkJcI^=B@eCD>GvJU!7m;m zm~!@SG}Sk`d3j;b=lP>4U9+Yk>yE($&fiHL76uSleGwP_H{{o67JoT%?oaT$mG(M_KHS( z_ARFxsj>2flpj>Bz@;TiDt_w6YX7a(FIsL6TtieYgN5hsmgRBQYx(Rtl|G-5Xh-66 z#7P9qRscuE^|f+wUkOAevtfT{)oq0xNeC&8?y}`CY&ZL85|qj#mo&idtgHu0tPB;) ziJ65>7n`QdAK7Lt%XuUJI8Nv11>%#|VGS7POCDouYobkX0~P5Q(G$p6g<$IqSA^fO zyWg!h0?h#qrQ@1&yMG5{T}UHn1L3PD(nBLp6bT*36(7BRcGeM`R?i*;C{ex`N^_y> z6=NoIUoI8D+l0VCJOwf7x8@vv` zA0+<5=^QX+qx^e6aOhs$$dpK3Jr3L`T-|OW#)iU4MJTFNUNWv29EtE&gq_i^Vdb`U z)^ygA0*s4<@03;B6Xi=RuhSbkpGR(*>cBy>r#KT-6L9TNa=7{mWg%3&Ry#QV7Lqp~ zuNrM#_!G&%b?SPyB*p2aG`QDL=_`|K+j892ZM2)={W}IGlpZTkgX6mLDQf)vU{1zB z;OynajRxD_j3q*V`C#xF))U3wtRcJQTiLV4%R_tLdnPC{VBzo5QrZKiE{N&INmrDR#i3j}4VwOajGf_DkqPEVq8|K^6CZz$0S+Pp+(-jOiU5_kimvPcvq z6Q~-tU$jWUcp~rrB6&6ZQElqu`t#I3mr|C?58Ax>(Hrke`CqjM9269P3>Ewo${4AM zk>X%A^hdCnGYSseMl7v9m@`)rEzTp?#I%(a%9t>V9Qqd~LF`7(NP3P|{Y86I8QM=7 zj8P9b6}q#k>#qVi@(x09QL~WT)Q=~d;JbAiZtyrvJ-&|13|~oK(keJOFu=mXwwSmj zUBPy(zT;q|F2h=w!l%2uae?=7Bh>-WS1gV(=oYD%mrBb}W|H{#qAR?)hRk_P%dR+sz%O&x3&DpKbt0kCt=n70 zkd`!hOYaz3hU;35*wX!^5o#kblxp#Axe_ChFxGS(A(Xs;JHaj*#cz7aNU;Mk(9yKH z?)ngeZ`*_a%MLZ^Bk2~9mw1iLo9Vs$oaJOIjJ%yaAPOu zh9@%PCNl@dkb=9DS@_d^WqOY^jkS_qC-U6tUzvz#)-X}*x=#t_H9d%I z?Dbibn+UL)}8l1o%pP5sYDl!_WjFGq(gdBj6vxZAq3UstDV5=HK3qO8kpTX<6 zCJ(xPtlzhJtutpe6&uJo9@lK7bnDg~K1F`MFBljQbKL3Cdo|yAt*t&{@H?9NQC?o& zXf=fcOcz>*MZ-GP@+?N}8e=6+oCIZO#4}qf#lRv*Ur_@>tQa# ztq;mKQxz0@LTPkvKei3+a41rp;@&`H^hkt1fq@-)imnq&~ZU`ChL(V zU|W_d=4wg_x#`BM7V<9I^!ipy>^oC?bI6r+lOfU%mk;8Pf9>4lo?xW_U5+TaM`V5$ zqJdy2I90D-gv^id%=uf1g}e^aLTz-Y&b(v7S9aRnO(GES2S8@(8?n;jp}WQx->aj{=JSP> z*bvSif=ur~Y8Qd$Ha>k-*g}U8&|@2F9s#7N`RDzXqS!9lEU>xynsNF4l?tn@Ct9g# zBZ-Z@+J?D$pJ|4x53IhX$vC9+Q?@;Xe#_)cbBk9MPZ@Vt)F+L@9uH%I+mDg7gDR& zshjo;hY}Qtq@s3~#AmJoFVt(KZ=~;48)h({*6jooM=!cOfT1!pLs$@;tHNGX(SQB8 zT2i$h`Zm*jv&@7&9_zU`JmN-`kw#|q#+X3D8<&b}zrdRwcVSA1N-7k}-A+8BkV)Zo zNAaMoeK34O;EA%S+E__cd1gCG^ly~T3u~EBFSPz`_EtAJIr;$myunWkLLKGMcI%OQ zhp!@L_{CeX^o0D+Mr6SpX~q<2N8f#h2{3Hxv#t7vXrK#T<9>anDOXetvpWuQptiYbkJ zEC#DC0Gc!~05Oxm&r~-hGNgv?;^Tbv=1-`WEm~QLxi1?#CL=2ij`^SFIn%&V=vh*} zVD3YA!S3HgbnX;_ROt>i5IDRA!Tze!UalkqmaEu?b%mnf=G{RL18uU2&ES=4U_(Yt z#P2?WNX-FH&^QdTWJ+@GzWDus1n(+;!chu)R-}R2chFbmg4$th6Y`9797-9K{%aqW z+3Kt+Wgo=dAh4V!)+yQdb^9777U>wfubBw}KOT34!Z}v?_t|VLyxc{0p4StvPYP~r ztA*n%h|!OjXTr|6#E5wRMA+GoAf|S?dS9t|?PZtXGviAQaPe8Ou=4mL1Xay0Br#N&-HYt9H=6 z)!Ty0rKtI%7V-;*T1xd3D(bylmH7_~xi# zGn%daX=(tN>r^EZ1 z75~16H0La)_dw+*ki&MQn_wk1qTBw=u=aj&dOc#pZMs{WW zNUvz(>URhKqNkZ^7mlqLZig+}u&BuQ{^_VCjNIySxZUjZmlVD~qXTvKsl?^*+<@H- z@p%tzGbt@SR1rIL=nwkZZDvtF`ReWPU4S{njF9!Ul3I&MK<$DgRXc^ho?!{T;7le5edWRLWn&s_&tys~t5661S|TG)k3I z%9_0wjjKuxx&F|qE+x#?dJU_yH;mqdPWTz%k)2wjY=n0!FJUE;=?#zT|27*Xdi0OLvq zkp0au7B%Zol~sl?<;08KuQ~tGG4>T*$t>i!+1Vl@JZN2;+R*b4 zg`t;pwe1Xu9m7n$`I9qq<6S>~=M*W%^gm|J^dNeFFU^WUm9H9^`* ziy*V}9ATSDnL#Y3#@5*^Kl8DMR=)&f(J1%+~3bWP2F^GpSz!QXWiuya2 z^y4Y=X{XoQQajB;4+M?crxQLQOA({MVM_3sK>tZYcS@yymayMHK(9$ElyF%Jd30Jj zgn>776o+^ri&x}Iqb<~mz}M!m_VIi5CbjSl6a3P>J2rOuiaxs@6(7#`ZBkxbdxSvn zKHjF0T?it0L2mj<=-OwA9T=grGo7CwCJMA8;^%^Q7@&8YR*{tVhFB4PMD}(z2p*oW zQ&g#>WGgfgSSA*lVz5zKT1Zuad7nn^3F7PSCo6rWG%>?;S1EoyFzb2z!*j#Z7XZgq zz_r%Mj&ev`elu{xW@&v|^ld$ALao1y1|_ze;8Z#ANBe`}aC)`Ic>OoYF7hvPVMxNy zdrDs$81>@I3#JD9D-&;q`d)E+ZbrY~Y?Bg+cW*`vqU0uLwm|FYQLi;U+XYzpC-cMK znAxkxTNJ`^IP(ZPv((uAvyaIYz285yMJT20bHr}SxBI5oi_H??OevqC%gR@DFj%tk zIAs8*c(#X><;WLY`1ZcpaiN8oZwKGH49r57TpGYQ3_X#Jh|w>D>vjeA8~EJHe4qvC zt;42WjmD@F&uZn1h87|J;=^ZsqFoyBqsXWTCD1vAAmY124Qi-I!31;GFw2FTjmFaz z5)|(LVfICZM(=m$i=8x-+=XzrY!kt= zAhB!?#Rh#8yh@QU(!f)|-hI1D$()6RwlfW*JM@@_>uto<=d!IT|41aP=laCl5TxlPJ%0Px~emkbk7&lHqv!U92 z7K6<~ZiJoDt)d*u^QY-M;!!yP>-tWtodF%UuvP-r6_?@fjaWAe0#K~N61ow5+caca z+9`$FJMnveQct7;@iI)$HFW;CNvF7yZ8YmtwwTixZsgM|{u4>ZYpIed2!IZ4y)+Q! zfEQ@Ajpr%Qcrw)&Ul05yo+1>Moq!tWBjL)Z7kq3r)mSA+JkZD;C)uP{jQS%*$jSDW zij1}vns9|#%3F+oTDWpAZ`?>5+GCe%$)rjuQv{zu|8nB*CW_czsUKGwdiP5jEuTj znc{`8D5LmSD?ZsKyq0z}$>|AMxfXIkHy9m$lyAGwg1v42OzIR6(9d*BzW!)=MNLiW z4od5`-@o%1`vbX{qKpIYwSZPI2$P+HNzi$Y7Ct_B^?hLe|A>o>y1nhtda^>)EI5ZK zWcEN@MD`5?O4fK*2wsO1(aLu~HPuvJZS!mr;RzzN@s? zS(dwb448a0%2tvFQfsYe1l&|?WYI$(m28~_(cj3akyR5OL1E)y>q30q3y*}DcK7sCaE@CGg+ zC^0|J>v8JPPOPzmLSkdtx!oclfXJoi2DZ(4JLa^&U)iDDpSXW2IBr_N|KUQ+%#7Uo zYNu97G4`zAWVDnZ5=6a-{%o2>0Fd^5jhh_WU)u$7k%E?0^?55El2vjhJ2FC{pY4;Q zV(5GYf)V3&Un_xCK0pMjlY~TU3ilEteBI9)A%MR3JbK)Ck-u= zc{Kv@RNZW~JR*j*hsmx4ezVPu-*U(a+IeJ8Q*Mw{qEwwaC9`~_Uu${f3A%X|?wOzI zNP&8ZN{Ix#ky~3^eg6H*Oe!b{+Vx8B0o_kB)c>rnM`P)GYw}K_+ElHTzf}&A3sHxO z(wy6P?5rH9rsk~7)eNS^46DIJfn>^QL6E1RL9hnK;!rmf8!XB0(_kiRlU41p%HGh3 zm0XqtvZMNTqekR zT$h-D4Q77dDg>3C-I9Z|vT`X;7yEwOLwP39Jt=zvRp=Citn7h!yb51O)GUI%DLwm1 zOC!C`1dVySgN5!eteLKRPaf5LP$xORjcs^F+xFW1Mo0X+do+&C&1)5JGVlBeG`4~M zeZ^&UL4JT-8&;lsx}bG{afkAZFGi|X#u zXSxn6)z^1nAUBXPvrFvtE?Go)e|$H{2|@nL77rlfr+DCGM9M=<-N2>%xgYYfNKLGmrtB|9H$6?z`;2oh?&2p*SK33n?o_j^Oxng*UV~|OL`u~Z?{69!gXY}MkA#(k3-qGm4 z&7g|g#Q&Iaf63>O*UL-io`(&GZ%j-h)%CrIxij9oeK{h6f^n-R0OHLyr=d^M@GCs@ zWtT>iQ}a5}dy!!d$20lC&o|?Omq+7w%6114jJl015eIibY5Xw{M0iVK-0~-FXJ%^p z<-bj8%Pv_DVP_%Z>*JM-k`jt>z>O3Y4b9GN(4q~0hZexY_cUlL9Dkc)#ZB)@nQLtbg*Dh)77Ey3|X9HUYwi_0VLW4xP=N zxaU*wb^*XLPF{fIf0~x%>1kwR-(&2%`}_UlOcUv#pde4eLMsT`&Gbz}=G8pX$YLj^ zz|^!f&)+Cl(kscNqy+^9D=St4ySXi?(1lp~>~+*+$Dk7WJ*vOdG*sM2jq5g#IHa2x zxEQ1!(MWocpYN8<-OdA84*F@r81~FjWy&dA6wbuAWVd+r%w0->(py+==eFbs6$Cz? zDka8sgrH3|b8%r|HtDTF!CBYq;*oR4h;vw}5fc*&&bYpm+|cDWfla)NZ($2{bEa~e zD5U@riC_d`!Q|C2ByP{o|CpUsuI*d1d8F}`&iLeXYYf_z9S;3Rq*YWBGXSM5S%4Gk zwl_+Tks;>21Go9z-TIM;P2kGQwel^}_SdUstEr5l(o)IpOJyL98(AQk)7J9x$Qy^u z&0A`EdU&hDs{ON!x#;NM5Qe>jP)Toj`lU}T+lX^fXOg&RjB$1a73)>nx8w1Sk`f7n zk8GO)F?spPns>4G6gCld_K>nNnxm7G;*Jj8ZsXCjA;!HUH!CB)hGd_#ux`r2uI z$~G4`UAT0xvw3_a*uOuu$NEHqRglUrj-H;Hv6RthIfQ%+x8T<+2h7By#%^p^cLO6M z;@deW-tU)r-ajZ|@{Y1(wEE>fz|I7c8Cxe^yBWjE;`B z^jdK}sBke3{Q8By;8V=?7IstL6X2Q3UP&29a#bBXZkye^S$?;7*apRKN+;?w#2G zP3-XBMj~5EyZ@POF@OXP0LFZKq7@l?jbtu%0PVOeB6r%bZtVo$2n24h@+K_o2O)Po zmFe#nUJQ&#T%}FMFAxMbs7agWqXY|8QY; zr<`cHVgPN>_J0??;fa8syLo-U1T>fU1j2F1XvOU|{NB&0g75EmB)O^%7+>c>a}eo( zowPTPCyK5s+K=gn2=^=2oN83ls|Ee^DeDg^{y+jT#qXj!=d5%+V9i2^XD<_?to@8 z>3XB#9DWfg26t=Sx!Za|GtsIP zZyqi)M~3nUx8iu;mt2Md2GMqeLZ%K2XUdyMcqsE%UBUBqE%y}@{(JPwpQ2!nRcA%e z{`%RL>=zA`a<%G|0`21Pp(xv#3$0Co$V3&+qT3BE&gBBhZPhPtTYGOH-)^^qahRo5 zZ&S+#q}t4c1JgheLw$+r-YhOo!H$)!A7=^{8(Q@0Uwe8BaJO+2_i1+nG1F%Pt2~Q* zzSCb^ee(obl`iN^uPJ~6~9K_ z;RiMY2_k2W#GOuAVY~U&JTAW2zm96*(_H2O^bH8K!1(dob)dwz5@*l$f`NY?TK2;D zgUge*wig6ONm5%B40{1t@{B`mxWAq!hgsnPXG4_-hQY;EWv z-g!?HX8M?0)eB^T3BD8=QHV=1QfAfp!eN)&64tfvJ_&K;)Olp0Ryam5&z|Vc8O#3e z$2!B)pIrbf{(!TgGqJjiBualHPHQyJ`ghFT0j|xKWP+X(T zGuKuREazI12TDs>(TTdk<@XcMu(;cYAp!^@&LLg*K%>2@5Reqcob=! z9nWZ)A$-L_Uf5&C+wJD&1>SGIkG#*F7i}s>g>29g_9=vk$A#HznpijF2aNq?E?|ft ze;ZiHZQKP`uUAEx!Wb2;)fMQP=MB<5k+(iDR^Ov1{`|_1wq8`u<$TRXH(1)a)nZ>$ z$RVct3VwGC+C;4)us$wLJhx<7{r=f8gYEfu${-)o8zl=*a{`XbugDk7%VcLi1pi9x zthnqwf-mN-K`ub)OIL=j*KW2YjZls9x!nvvg4C@_?WBk^N8Es!C)Y}`^l_n&5HY-d za{DvV)AsHwO^meveBBFW!tt+KYh8&yc;}TPBSS8SLw-=&f{pm+&GGQciAC+d zP-#V8;AzhZ-N1@M5t>ET+*2;u+57m8{R@dZGWW93+L2ssLj5VdSet!s*cbZw393;G z@abiYG+gT)FK)+!=oi}_2)##MKHe5}Ie%?fg_pudQ?Cy9{^@JxS4nv2z-@68PQx~L zZO4yJwl}m_K{2O7;V>OiQ+8V-73krMogP=)4iE??7sAIr=yHl6vsP-Ff>4XQZ?Kdv zpTFW7PF+u*SdBONux)stEYsTs1^mUT<1`uU9JPDa)&eTTGwquh3WL}lblS*mTgP4$ zsm#|?O@>#!Yo!a8`%Fy+J4DKC!T%DD3#VW;x6%MF=Fg{L835)nP@uXEf6;h~tlv>Xn7 zmc2ttTGx{$JwvCikm^*NtXlePY#0{!6Sr;f4z!sFt3ehE(i#7@oh%+ zFc^-96>s@N@jBt5`1!)_V%-BW^|-siR}X>+f@KtTqwchDN{Nei6>Cc5OgIH_mUuZ7 zoLUR7@7VZeAu2z@?Wk{z__*-5q2j$+;JLw|Yr;r1(Vrb?=2Z<~ zg_!i}vimJl;5u1^eyR+rVG0`U!rsv>%kf$9*$0xFF*a9m$e9*m5*#?j8RnXnKtpu?v?GtD|h)QE26VFos`+EhrX2tLBHe0Hoawd+GOoCAOxYZrq!-`t%rUjj%JXQ9;^7*YN>)jmCie!mW~BKF&kUV8~Q897B9a|3yz z6ko+Zn*R(E+3{&dR0>VKzFRJ_2x0j-%fcl$@han({jFjxx*Tx7dSmI0iyGkb^;DT; zAiRxDYd(I6w2_>e3u-nP%I9$#&FyJe&yx_;@a)hR0#q1PGw{Xv&6BU1L`Ek1YekUf*!xl8Uv+R9f*6M9J-Tv+|jjg>-SG|+K2YZAR)ABhM8IH)qBDr z8-AS@2fQ)|+^!Z#d9SJw@dYBxc-gd|4aDDlVyumlj|*jX0Ltg;_orzQXXY0AKw@SEiLTD#l`DiEP-;bC@jy< z@tt7CFh_|XB*mce=AS=BUm>mq-WB5=HG)vBTwPUPnS`E+dm`uJpk>(In^KeW9Hr!g z_-oE8=!8nX{(9CMS8VK0F^)W_-f4KdS|rkMGx7PZ3u1Sp`FJ2y^F8c&U+J-}Ln3ntth> zjZ>g!+tImhh{IQGGAYojCZC24{gad*#VB1P0XIg*9fQF^!1ljXG?vqoDhuN-h+T%v zz(?-Xl#~{?03LS{J$(a%)?L-@7Q563!ldSHmfpI%Y{A~Qq~15@vmqKAMU51V1}X-* z&E4riPVBkLZ%igJ7oN+J+zd_h+7`!6>_=-tuJ|dMTUfSiYKC2qR`g{UnA5Hmy>gr* zZIw8&ewTKge6niq)(OV%suNeaZ7nTi92^?w%>wuFEsa|=eYA{y&u_A~b1AxDx{hQ( z#!d!crRoh6d23umivEK!^R487wiFRaG$CSE&)*{_DZS60W}RcEATQ(RM^DuF0LVIu zoIP&GJA9TgK1rVf3H$;H#DfHqQc^GPJ#^efvcDfit{n439tW}8OnZw&3q4m-WOG<< zUtBoWl9JM=7fvJmlU2}pKWwRjq##yMcWkgpFRr1IIWD)fEVcaU`3E-5hMGd`UXGOw z?%B6WB^FUtQ#<%T(@QirB@Qcn&arWZV97hbl5TujE^_j-Gz;MP5wDHl5x6%~uA3?_O2l}!7M-bdE&w@(lqCJ+mle};duMNA^xj3U-7QtSDM zR-LuKe-rD}84ldei6ky9Ev+$mvZP#BRadu)8dlM$Mu*DWe@eZtF%$@SoR?_mb8;sp zorPX$;II6vmcGQ7c2&|>NaahGIR|rdafhh&w$>zB0|isLTv_o{ zXrA0>=Dkwge?Z_eIODV-X;be(g$5U2WpQ+Ir8)j)tn)`IIQfXKk(`ZU&Y@^5A}KKK zC_OzLyZc1@)~H`@)7#6-Zqvx|Stf>xZrb{m7uR+1lzl<2aK`&poa#_L#@Q}Y0Nd?W zuYclD?)BmBjxpwq5{N;X>M`*-u;!K+=~4uWG{3_IWy4xp#|{VP=aW{Lzw^Ij&p|40 zwA9urZAMW2c=AHZZz)vdKR!NgruqG!F3HKiFw)T>WM^kLI^c5K5oWW7-9@(i0iJaK zNEJ?Uqj;8~86Qakl**>OQDV;I(^UPZ(ps9-fqucN`CktF)7siveZn0&(rFtAT!3J9 z2|GKx`6{#FBJ*eB_hWqbaZ)6)>WBZuoWDGoLXtvClAJc!cs%x^hBHIpB!R zl6As@C4xIcYD1Uis8f+Wk@6ph@6JtTm-XgYc+2ou8Dk1BsaE00+!FI=9tbc6{qYSn z7Z7{Ok^O|DQ8=TmD#&>AMj5_mJ}%NU{K#QEErd$)3dwBzYtl5?vI{Tc>4-BEF|cx+*V6}4@3rcTa z?hQlI%?N#y*!b?dNMoiRp)O490JAy%dC%}&v=}b2Y(3O z*C;FNhWu;H$Ouy)#j4bvjvHsmef1V&`>w9c`RPx%l6RxeY(&&&x{tH{(PFav#YfFM z$3F1~E;BaaP6L018W7V}Wq|82LIlI<(3Ws?{8(1Ewgeg3 ziD`9yK?FiY5*xN`4R}{6mmB#e+)*wBUrh-p5t||WU+ukRR9#V*rkg-;3lQAhCCCX* zAh;9U-5r7l3GSNU?(Xh(kl^m_?ry#Ls=ixw`&Nz7eY^T!@e}qwz#eO^J=c8S`AkAA zN-fW6rg04GW32sR=9VIxR&5L-`%No?d@I&1@Kp~YMCaa8m8w~@XZ{m<1QIo?w%->_KLgn0C;mNK^~O=i{;~->$#P)t)mmrf^4im_X|(imEQm%N|Sp z!cUdZNJbT4l1Xm}8*z$sY8J-uJkO>u6XnGHW(wWPE_${;>gD~#>*8CB!y5fUuMce; zmUHLRzVId~{!vGCdYf3WHo_=5;mr4hPYATKnUli16&IR>Ig<D8dWkt>~}URMTBN4qwgrXJjsKK6C24|`W;LJmppXSB#KR}3lU$;uv_!8;EUEnX$) zonmZ(iM5{5DH!4JtHF^w2v~Ntm3Zcm3n^Kt6iTl}-7=0!AIi?5@m&ttnxL0xWmoQ% zGW?|phD`7C2>@RjV?+wx*SP}Zy=0Vih5`PxIkiL8W|7gKMTb1gd*&Sev8m?BQLOW{ zlr@dtE+SJ>75wWm^WjY_G{%lub*nBRkUecbskl)pp)wx!5PH5>CD$V?-3m{``H{x! z9Vx5X<-O>=)=%6^MfsVN*XLx1lI=^ao+9mQ$ESzp#c`KfoZ(}Gv%8xlnCs4A)(*p ztikPRn-BkMB-3W3=iw#wUD5ptPK)_DpK}}(2tuVH$GYs+Vmyz{_qCjfIa58eI+3jTqXyKs zp?9tP&*)Dltc}d!wOIzFS<;4KVfPt%{XsCt?0@FkUm-+VP=^{QKQkBYz|DRNXjUKl zQ46;WnSCbugiUlHT%06{TYjVKGJ&!h)*}bQwcz%7{iYa#)Xi`B_!yN@>#FNrNQubSU>E3in~VGKMx_N>jnDo7#({463^o-9J) zvfd)9UP$Xn_QKvQBVp5N4Vmmq)>BiD*v?I?2=Ij!)<9-=URy+AWHik z5z>^$88J|nz1S;qt-p{qh1&yODPJbLtqreR8*8bIZtiu3@Mzf!KXCPd26^gQR|J=Z zC*)lI4`THfz3Zy&ekOOcQP1_myRN1m(=W8x-3ZjU{0Pw>1);go2J3bI6ynv!mu2xE z2^E0@I~^YFuJj4a0j;(F7i~>VZN^EDKuYVJ&qx}o%TTr{M>9&h%PlqSZJRI34dJ&? zN$spCL~}o|d0@A(sLygl&Xys^)VMtx8dmh(Qc2NF3sP}329D_S{2(@nk_4>Rvv!Zp z;dwxRz^G#Iy0TeN$ongsYBW196ZQDn6I%;?kLMcXX}89VeDsQa+Tx7+oK|tew-P;L zCnYOf;nZhOZ|Ar6nVgKb7+cLr>8mJdXlX7{%twek#NYH%a4m zR^s@%$5Y0Z(iQy|oul~SxN9GsLuEFkY@9~wp2~K8t?$luR1bggQQ_%AmDjB{+bcL~ zZ~jQw>mBWVU(SW>JZ1^ob%x9!KOC@vKHKuXYIdAIi`uolkVX)cb>;4WYLI2f1~?+} zSYggWZzBqyF3aM)lJciPNJUnqpoRy=%{AHE4Ax8tjWn%53a3k-WF}16!b~)EYJ8t; zU4*p7-?<^BtQ^yGDDA~i1kn&Bb2mI~57X0oHhVo_Uk2)xHdLUjS3H-v-gmWTG$n16 z(ZYd(lL$g|lqR9iM-^Od08Ip2YznJJGy7x?$Y`FxGHt})biqE5i79n97-+qJVh^+{ zTZZbELlEhvB8(_m|qFOSK`L4qBw>tGwj9rHsJAl)XCT*@2X{HRJL3J_W*ZIeX zkz-Yivfj!(?V9kdjYOuOgrhvQNRokzW0Q;iol{1t3R{YJ4%rrB5Z|Qb zM9?7)_FOD&KXyZY!7S|O%ch|_YS8qVyCk_XbSYU|^`O}wy zqk2~q0F)>-EaCaculRI~CBT@k!1_f;)nhK!m-yA5Q;)DkkZ$aEXAJs_4Pc$sVmSeQ zSKhJw1&6>W- zUM%0kCb199dZ&8@uw$m8?K~kUxthmj7DCd@FuZRJxAKY~HDaPtwF0P=4b5#nIk9VY zjx}IWH1kKMn$s}DjJcNK#$JeQ3%lZuWW=P>wrEoRE?Mzr_ork_Zw-3?4eclomWNlx zF4yS8N(H2ABc_xzVul)l^tJR5@m9Z(OiWVP5wa@Fte%G%=zEEIY_Foy9tMfk8iY(L zUwOn>gx+YNyIqcxDpU^FgnA7|=TorIPh06nrRMT3h2+>V=Uh}RUu%wP%LG#!(Lr{l zF{qg6)C0L^j_|rV(2uLDVhAAun*1EH!OR2n-S58{w0>1t?tlEl`%U}qneT3U_)ZS$ zc8HwElbeAkyQhl@uu~(5TiFOmRzEc*B>|0FJ~$lF zsm8wDX5SseNI)gDg33*5R-dzw1tHIxo?#hsW-kfl$ni({>1v-?ZP}B&(5g$+U(Bqn zy1$Y`&Iik=<}KQlRui=P(xzjliiwL0=V|$?2*ODyz0j!Kiw+CIx@+~Tw&8MnZQh>U zPYFyBE(L}@D=^bn+~P6D>@#IS2Pd6OUI3*lNaSn+Iw!u+QT|tYiBM;KlR6@F-d%Y| zJ80P>RezJVT7tGXYc{Pmcoi8=iNE!F?!T~>A)m3auet!h0}@uJA~S*HMS91`w3)4O zNneCgF118*ZvmHnY@enj`XBsj@|+x!FZ@u1#U1TgS!~devp>MJg0yF3J}DGa5#FYpGg~Dc)*g_ZI$q$I(vf{&dMMze`1N}5&fdeTaOYEcTvuzE~6m-g2Eg7))>s%?E zlZEg#Qa`Uz(u9?LkY-2HMEQrrs6B9H<8!-k_eB*JKOkbV(nsv=)pN4Q)iu4NkwNG> zAU3fJ*-bZOcqKQ#-wmC;96g|#?U6T@qPrzE|QnLrtBMr`HLJX1ywevi;9b&L6qwph739xWYREweKR{@%$+ zuSI!l001ayc{nJpn72H0YfTs&RGcua3SVE>Yk7G%oU60Kb2?t||4N*(?8FU#?jpvX z3yO;slzzYiwhh$gZRM)g{e3e-BO?+L5&_4%e1fA3&8^tHB2Up zXC{PPn@;cUP0?TxY-~KW;e@;>T$=YMBXf^pHFp#VjvP?#i;^&}BA36s7V7s-Y*2rG zIAK^#=;&^DM~C-J8Yd@bb)6Sb0tYM?6~@E3bH_K_b)ic$WfA&invFiY>0a6d=lQ+X zjRGf&^YewgPI`KoPOf!)$=t55;VJ&V%k|+%O)EOkR8UX83bB-WPzE!0mL1gcd(hE~zL_?D1f>NxBko0r%ZN z2rMXcTzuf|-G|^h-e>ry+Qz)3V6mm>W9)51qNNi%XW?g}vqDd$cqQWg{GJUw1SsIx z_3~-q_Rh?XjLBxnD_^|1e`0nv-{YfTZ{gMYF(nmMrSqwFiE5?bA!~5%ycnM3DNK*5Wg)C^M$}q(+*c;1sfeXbvCg*Th85d zjpE?&Y0P2vi)$YBrq6|{^2MfG3Z1lUE>Ir9^wFX5)8@Ls>jL+|tL5Mu6Ve^P!j|tG8hY0kCs! zvrVfAOvihsHwm`kDQcO>yAEP0e$L{OeI&13(n+fdd0)7wi0xrs70D8}edq?j8Ka`3 z-xhUvc)0q@e4|4?C|-hll`+kWygn==h4%ON$8VH+ z(`z1q0&;#9>v5^ntloVZNf3B6BHSooLa7}mA z7yB@AiAWVq#GaDHR?>;K=-uo3(u(kLmeLbmytME2ZA_2*s_k?8>N~S>y}hrjdV@8uR4*~0>nMY13o`x3* z)Vhi6gW$&3m$=HZ-bPF;G?;Nv{9^55*=@Jh>=gHTM-%0)~v41@(7 zno^{!dm#%Z1`&O$PlM9xk9`XqNpxu$_{n(OK1N>#P&$KxOyBGN$H<=lq$vEq#{2o7ZoZtuvIR)18d8+8bqT{e zP_6xZxZ&g0(a)ZW8<7-|t=J3my3D4M)So79G$Om!E9y`}GusWLpFc%%F&e7T+o6u~ zpFhu#1tYkgR568Sj^?!Uh4LA^+#lh*y*5oYZ8^r4m&4z1rn$MfZ#YxE>iM;6w_2Gd zta+OG-m^1iZLeoX%f&jRW~XC8;*SZAfkqwo&z@7$(}IbEVb2QXdR&MXXnKN?MwP zmGv^>e)nj;8k>lyJ@x;ji@VPRF^X_gp#-N*xwx}nnZFM^SwcdBttfP^!CF>Q&9hgbVl?XW9D zPEKxm{PWF?$!YN8$0t0HWdi$a|EBm$^v$2Sgi<2Rn7fzj+gl6A=&iWfcqjJX$nHjDGNDYaM z(sN@S930A3o&l#fgbZ38BJzGY`0Ik?f(Ru9PJOj&3IYcSl(ULTJZAPq3+96m#Uqu! z4>=P}lQHWmR7x0nFhX!GpfCB=RDZGtavR{a66x@sDw3{}%)ee0@tM+t(pBPOJoUkn z5BMMt5)Z0-Q9!?2mVMEC?~D#-tma&IOfNLC!XkI_DM-KV?HYCsIVQ!4w(3;ZQ1>O^ z8;fI?gB`br+8!X_7e?K*DiCS}86ryHN#ZRJY-)DE?bGc)f+tJ_cMhAc=YL|^`rPj- zM>cs+3eVF+O2qgb_3Nt|>YOUK@Y2WlnYi;II5uh!ANU`2TRzsw#gAr=o)y&QLm1*uXZU7hlzS7l6@SwVz={_v$}?+fK9#pU&{~48~N2*L|w^6zgGY{=|dSI(Dv!d_hU3Ac( z4y~y?%9lD}aUF{5Cv^ToB|DEbpFe-&NWxH+9)n_7!bdwfIT=d(+Ryh_Ampfe3z9dc zWgbAVVf+cDVBFFffML-l@&~pNQo#k6%9`q$)9fMs+l#sMU$Mv1Qc|WST!v9ghe0x@ zIa*uP3ba-+u5nF^Ka*d+(Xzm{iilBp>7opx1`nc7C*tb_}TD(->lEyhIOh($I+G=~Qp0_uV6= zY{>-6HfsHg_B@*>Piq-@VM|f;z4{)vtg}3vP93v6dOgv{ zL7`efk&kn^YRgqGmez{_buYYi;0~|lj+{^>(dpdanB$v z)eKDe_xY6Q)i}nr2{{T#y?d+X`iZGhe3Z2j`;5LF87Jj+W-Q>If9{R0?fL@&& zTaQINxp)KQc1eX@;~90+?9gnssAy$5fjMn5u@c&xxSNRE$Ku3bUNT65GpU{~Wb>Tk zV!6cN(X%0W$jXj9^$_Y__1%itssz*O$lNY-VMj)~VBs&&s)cbfXHM%BR^+j{oKZ@& z$~TN+W>C7S$Wsui?kXk8v%_7#e%;6kc=q+5ZR4%z zKOnfD>Kkq_<3jE=e~%ng;aXFM1h1WT`6tnt9$yN<$XI3tD<4y;(xbZYv=)@_2e?z> zBS?rhjFUma@x^imt?wwf?4Gvyw%?!Jo}CmHV$3h8<>jO=aEyn((pdXPC5e?Gn@o0X z9U+nmG-@;myEO#CaoAKT)2=mKNypTxgpyUV2fjHoWLmL*y`? zI$tQ}5~d_9?=ZvO9`;vNx{ln{tY%wRNZlgzYz~p_T15b6;U&OLyg# zCw$FRb*~~a*QbPQB4s3PJM0zk{x;OBh9zL{iA??hx#+`))b9}OqcAO$gR-hkKB1Z| zLM=3eW_c@&XF?5){mH)DM_C2mGo~j!J=#8K@+P?}o?#1~xf!p)6+jv=?1cq=(89)P z3}D@D`n)OMX$IT9dr1~#+EK(l?Z{YDSD$&FM1+%Qd^M}t1FjynEf&Ztttt@11N`1? zK9OD*lsAgk#m3H=jhWE-hkZ2}@Q)^I7f>JNpEC(~{XL4rPI?*ZJCI89~SPowv?-f%^)sz;gorP#Fw%UM_dvT44xgilpLY%=V)^~Vt6{kq8dL% zBH>sL`<7p(XDD%P-h)!Vh?M?mD~1{g)z3HEeCf-2)&aVBL9f_5K1Y6r5k=IjRzq`a z;o(BJ8b`ON-)R9kADW$@oaT?JT(JCk11P=QchFwV~Uo|9=4n(H23+58d+kzG(r}t2V zs8}CL_h$ zgBK?wK)x0@S{}knBWQhqwoi0AMU6YE1#TED1`lQBV3>6LPD=JV@77uSQ4S-(ehVVt z@&*0z?mFOaUxaK=O3ntBVL(%Bc`0N#JHc78Q%khh)bT+T{%?u*v+|Q+BV~Giiv09b zrmE!Glw1}GDT%f+THid5DQY4Y*D3&6{GGZC0eIZE&+abUx8X-Ao`-b4oa+&}OlrY5 z(XsG>U<;1+SJ()Az6gWB(TqOy-{=w&uzX62hANg|taNo>DT|K=*|dL+8VUre@BH4o zbD@#Zb}*(3YNaPx(*s0F&AlRS-)^E}rxo{i`Ai^#jAG&Xb9m1kpI%6Wl}g+p>*U%N*H^c(qw5t zValrL-}R1o16h%@u#w1#$MyVdT5xtz@VlbFiQ3(Dh-)71i&$Kv;`7==W0@y0>weL% z+Ju)WbVMdvirmb%7&}&hO8rZ_Zu`+wgD>rF>C5?J`{U_Z^Xh_s)ejiKOkH|htjroV zAvfG{RSyhE+YVz^QXcGZ-*0^=dZ+8=HBPtL=TmU_qjfy9B$NU zUV`I2r6C;Y?w_=V!%fYtJEw2nOBLSK_lF~fx}pZFMjzD>^Gy51((X1WRqjYJ>$Vi5 zQXwDpjd#1--3ehVJT}|jKf&QIc|lBv^I{_lk1fjO>WhL0+am3nGSOp;I>x>ykt_&Y zq|4KdVAThiD>Q?H4GoA!(wcqBqKQ+)l|L-|7L@Un?D+Wt66w1G?#HotTg*V@RH12# z+O*Z6^9bk^t^)htKo>*SVt$A<&Bl}yl6f;iYlqt2qjM~=&yJv_yBjw=4?_X(thZS# zQe2xu0nQbK8kpM7sh}$Z8V04Ndre9}+YBxa+nCwu8kVovi99<(~(0)gy~Wj(_oJrHxN+>v$sfGZ&~kIr4eIT~5qC!0lA0KZ*mT;o`4(9wvv zt)^gV(d_5UXWHX87}OH;eT#hIqZz+Hq`AJuK4GuRr96JoF*r!JuFyvwqq|q^BZ=cD zXbWikeaVm51S(oZ5k6Q(nLJ*IMJez_zA73I<~+^C5ShjKc7=|gP_v0vBB~1j%P$B;p8T|Z)_BcM9j>5;h|-^>dX#loy01#lLrTktz@I63CR}I%1ynW z+@3)lD)4zMvq{z%6NJq#?TT%l=_m=QOOn)rRV&?7xi{{>6EwE_oN{bpdosa?fAj%u z;zCZb;)A#zRzNv^=L**!uZPWh6Llk2VeUzs)DqHzIdM8zsnE;ZhCqrfgs$jT#6_nP z-%=HVxq6u*O}1ZcE0k=q##uFNY6LaT8y%5!dR&~isYZ}aA|HT&vVjCEyD&R zyttjzHxoeS5=m9CR+hTNs5HP!OkCz?@96P!k+hN65 ztRl5Dpy1V6eoZTf>!VFxOG^0KA00Fmf}z?dfuXyDQ*(tKoh0w4WTBG9JpO*LA68IO zLaxae9iUYB#84D61G&GbslbOPK9^SQyFBQ%

jKDoM$JXz*>)(v!lUN`Bq1>i4lO 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 literal 0 HcmV?d00001 diff --git a/docs/guides/databases/cassandra/deploy-cassandra-multi-datacenters/datacntrtopology.png b/docs/guides/databases/cassandra/deploy-cassandra-multi-datacenters/datacntrtopology.png new file mode 100644 index 0000000000000000000000000000000000000000..3b760977c6520d2c2cbd9b409d6f328dd6c0a29f GIT binary patch literal 7702 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 +

Choosing a database +Akamai supports multiple database engines. This guide includes embedded Cassandra installation and configuration steps to support users who choose Cassandra, as it requires more setup than other options. Before proceeding, take a moment to "confirm" that Cassandra aligns with your application’s requirements and your operational experience. + +``` + +## Architecture and Planning + +Cassandra's multi-datacenter architecture distributes data across geographic regions with configurable replication between datacenters. Each datacenter contains multiple nodes organized into racks, with seed nodes facilitating cluster discovery and the NetworkTopologyStrategy enabling independent replication factors per region. For a deeper understanding of Cassandra architecture concepts--including the gossip protocol, consistency levels, and topology awareness--refer to the [Apache Cassandra Architecture](https://cassandra.apache.org/doc/latest/cassandra/architecture/overview.html) documentation. + +### Akamai Infrastructure Recommendations + +Compute Instance Selection: + +| Use Case | Instance Type | Specifications | +|----------|---------------|----------------| +| Development/testing | Shared CPU | 4GB RAM, 2 vCPU | +| Production | Dedicated CPU | 8-16GB RAM, 4-8 vCPU | +| High-performance workloads | Premium CPU | 16-32GB RAM, 8-16 vCPU | + +Storage Configuration: + +- Boot disk: 25-50GB for OS and Cassandra installation +- Data storage: Block Storage volumes (100GB-1TB per node) +- Performance optimization: Use separate Block Storage volumes for commit logs and data directories + +For optimal performance, attach NVMe-backed Block Storage volumes to Dedicated or Premium CPU instances. + +Cluster Topology: + +Deploy a minimum of 3 nodes per data center (odd numbers preferred to prevent split-brain scenarios) with a replication factor of 3 for production environments. Designate 2+ stable nodes per data center as seed nodes. For capacity planning guidelines and topology best practices, see the [Cassandra Planning](https://cassandra.apache.org/doc/latest/cassandra/managing/operating/hardware.html) documentation. + +### Multi-Region Network Planning + +**Akamai Data Center Selection**: + +Choose data center pairs based on your latency requirements: + +**Same-region deployments (< 50ms latency)**: + +- **US East**: Newark, Atlanta, Washington DC +- **US West**: Fremont, Los Angeles, Seattle +- **Europe**: London, Frankfurt, Paris + +**Cross-region deployments (< 300ms latency)**: + +- **Americas**: Newark and Fremont +- **Europe and Americas**: London and Newark +- **Asia-Pacific**: Singapore and Tokyo +- **Global**: Newark, London, Singapore + +Network Architecture: + +Configure the following Akamai networking features for cluster communication: + +- **VLANs**: Create private VLANs for cluster communication within and across data centers +- **Cloud Firewall**: Implement rules limiting access to required Cassandra ports (7000, 9042, 7199) +- **Private IP addresses**: Use private IPs for all node-to-node communication +- **Network interfaces**: 1Gbps+ interfaces (standard on Dedicated and Premium CPU instances) + +For complete port requirements and security configuration, see the [Cassandra Security](https://cassandra.apache.org/doc/4.1/cassandra/operating/security.html) documentation. + +### Software Versions + +#### Instance Sizing Recommendations + +| Use Case | Instance Type | Specifications | +|----------|---------------|----------------| +| Development/testing | Shared CPU | 4GB RAM (minimum), 2 vCPU | +| Production | Dedicated CPU | 8-16GB RAM, 4-8 vCPU | +| High-performance workloads | Premium CPU | 16-32GB RAM, 8-16 vCPU | + +### Infrastructure Provisioning Order + +Deploy infrastructure in this sequence to ensure proper network connectivity: + +1. Create VLANs in each data center +2. Provision compute instances in the first data center +3. Provision compute instances in additional data centers +4. Attach Block Storage volumes to each instance +5. Configure Cloud Firewall rules +6. Verify network connectivity between all nodes + +## Infrastructure Setup on Akamai Cloud Computing Services + +This section covers provisioning the underlying infrastructure for your multi-data center Cassandra deployment. You'll create compute instances across Akamai regions, configure private networking with VLANs, attach persistent storage, and establish firewall rules. + +### Compute Instances + +Provision compute instances in each selected Akamai data center according to your planning worksheet. + +**Instance Selection Guidelines**: + +See the [Instance Sizing Recommendations](#instance-sizing-recommendations) table for recommended instance types and specifications based on your workload requirements. + +**Operating System**: + +Use **Ubuntu 22.04 LTS** across all nodes for consistency in maintenance and troubleshooting. + +**Multi-Region Deployment Considerations** + +- Deploy primary-region nodes first, then secondary regions. +- Maintain consistent instance specifications within each region. +- Document private and public IPs for all nodes. +- Ensure each region has sufficient node count for quorum and replication. + +**Example topology** + +- Newark: 3 nodes +- London: 3 nodes +- **Total**: 6 nodes across 2 data centers + +### VLAN Architecture + +VLANs provide private, low‑latency connectivity between Cassandra nodes. + +**Within a data center** + +- Use one VLAN per data center. +- Assign private IPs from a dedicated subnet. +- Ensure all nodes in the region share the same VLAN. +- Confirm that the VLAN is created before provisioning compute instances to avoid re-IP operations later +- Record the assigned subnet and VLAN ID in your deployment worksheet for later reference. + +**Across data centers** +- Configure VLAN routing between regions. +- Use non‑overlapping private subnets. +- Validate cross-region connectivity and latency between all nodes. +- Verify that firewall rules allow inter-DC Cassandra ports before cluster initialization. + +**Example VLAN scheme**: + +- Newark VLAN: 10.0.1.0/24 +- London VLAN: 10.0.2.0/24 + +#### Block Storage + +Cassandra requires dedicated storage for data and commit logs. + +**Volume specifications**: + +- **Size**: 100GB-1TB per node (based on data requirements). +- **Performance**: NVMe-backed for production workloads. +- **Attachment**: Attach and mount volumes before installing Cassandra. +- Ensure each volume is attached as a persistent Block Storage device so it survives instance reboots. + +**Filesystem and layout** + +- Use ext4 or XFS. +- Mount at `/var/lib/cassandra`. +- Optionally user separate volumes for commit logs. +- Format and mount volumes before running `cassandra` for the first time to avoid auto-creating directories on the root disk. + +**Example mount points**: + +- Data directory: `/var/lib/cassandra/data` +- Commit log directory: `/var/lib/cassandra/commitlog` (if using separate volume) + +Cross-data-center VLAN behavior was not tested in this environment but reflects required Akamai Cloud architecture. + +### Cloud Firewall Strategy + +Cassandra requires specific ports for internode communication, client access, and monitoring. For complete port reference and security considerations, see the [Cassandra Security documentation](https://cassandra.apache.org/doc/4.1/cassandra/operating/security.html). + +**Cluster communication**: + +- Port 7000/TCP(intra-cluster) – allow from private IPs only +- Port 7001/TCP(encrypted intra-cluster, if internode encryption is enabled) – allow from private IPs only + +**Client connections**: + +- Port 9042/TCP - allow from application servers + +**Monitoring**: + +- Port 7199/TCP - allow from monitoring infrastructure + +**Management**: + +- Port 22/TCP - restrict to administrative IPs + +**Outbound traffic**: + +- Allow outbound access for package installation and updates +- Apply egress restrictions only if required by policy + +**Security Best Practices**: + +- Use private IPs for all cluster communication. +- Apply consistent firewall rules across all nodes. +- Document firewall rules in your planning worksheet + +### Verifying Network Connectivity + +Confirm network connectivity meets your requirements before installing Cassandra. + +**Connectivity expectations**: + +- Nodes must reach each other over private IPs +- Cross-region latency should align with your replication strategy +- Required ports must be reachable between nodes + +**Latency guidelines** + +- Intra‑DC: < 10ms +- Same‑region multi‑DC: < 50ms +- Cross‑region: < 300ms + +Cross-data-center firewall behavior and latency validation were not tested in this environment but reflect Akamai Cloud architecture. + +### Infrastructure Readiness Checklist + +Before proceeding to Cassandra installation, confirm: + +- ✓ Compute instances provisioned in all data centers +- ✓ VLANs configured with proper IP addressing +- ✓ Block Storage volumes attached and mounted +- ✓ Cloud Firewall rules applied consistently +- ✓ Private connectivity validate across all nodes +- ✓ Cross-region latency is within acceptable ranges +- ✓ Required ports accessible + +## Installing Cassandra + +This guide uses Apache Cassandra 4.1.x, the current the current stable release recommended for production deployments. Newer major versions may still be in early adoption or require different tooling, so using the stable branch ensures compatibility and predictable behavior on Akamai Cloud Compute. + +Because Cassandra 4.1.x is no longer included in Ubuntu’s default package repositories, installation begins by adding the official Apache Cassandra repository. This ensures that all nodes install the correct version and receive updates directly from the Cassandra project. + +Ubuntu 22.04 LTS is fully compatible with Cassandra 4.1.x and is the recommended operating system for this deployment guide. + +**Installation approach**: + +Begin by installing and validating Cassandra on a single node first. Once the installation is confirmed working, repeat the same steps on the remaining nodes to ensure consistency across the cluster. + +### Add the Apache Cassandra repository + +Create a repository definition: +```command +echo "deb https://debian.cassandra.apache.org 41x main" | sudo tee /etc/apt/sources.list.d/cassandra.sources.list +``` +Import the Apache Cassandra GPG key: + +```command +sudo curl https://downloads.apache.org/cassandra/KEYS | sudo apt-key add - +``` +Note: Debian and Ubuntu are transitioning away from apt-key. For background about how APT verifies repository signatures or how to manage repository keys using modern gpg‑based methods, refer to the Debian documentation topic [SecureApt](https://wiki.debian.org/SecureApt). If this link becomes unavailable, search the Debian documentation for “SecureApt” or “APT repository key management”. + +**Update package lists**: + +```command +sudo apt update +``` +#### Install Cassandra + +Install Cassandra and its dependencies: + +```command +sudo apt install cassandra +``` +When prompted with "Do you want to continue? [Y/n]" press "Y" and "Enter" to proceed. + +Cassandra automatically installs OpenJDK 11 as a dependency, so no separate Java installation is required. + +#### Optional: Environment Checks + +After installation, confirm your kernel and package versions match expected compatibility. Ubuntu 22.04.5 LTS is generally safe, but minimal images or custom build may vary. +```command +sudo uname -r # Check kernel version +sudo java -version # Confirm Java runtime +sudo dpkg -l | grep cassandra # Check if Cassandra is present +``` +You are looking for: + +- Linux kernel release (e.g., 5.15.0-164-generic). +- Java 11 OpenJDK, not Oracle Java. +- A Cassandra package entry similar to: `ii cassandra 4.1.x all distributed storage system` + +If there is no output Cassandra is not installed. + +#### Verify installation on the first node + +Check the service status: +```command +sudo nodetool status +``` +Press `q` to exit the status view. + +#### Verify installation on the second node +Repeat the same check as for the first node. + +Test CQL shell access: +```command +cqlsh +``` +If the shell does not connect immediately, wait for Cassandra to finish initializing and try again (may take up to 60 seconds to fully initialize). Then type `exit` and press Enter to return to the regular command prompt. + +### Key considerations: + +- During system updates, select "keep the local version currently installed" when prompted about configuration files. This preserves network and service settings required for cluster connectivity. +- Cassandra requires approximately 60 seconds to initialize - if `cqlsh` connections fail, wait and retry +- Stop the Cassandra service after installation and before performing multi-datacenter configuration: +```command +sudo systemctl stop cassandra +``` + +- After completing your multi-datacenter configuration, start Cassandra so it loads the new settings: +```command +sudo systemctl start cassandra +``` + +- Verify that Cassandra is running:** +```command +sudo systemctl status cassandra +``` +A healthy node shows`Active: active (running)` in the output. Cassandra may take 30-60 seconds to initialize after a restart. + +If the service fails to start, check the logs at `/var/log/cassandra/system.log` for error messages. Use `q` to return to the prompt. + +You can also confirm cluster participation: + +```command +sudo nodetool status +``` +What you should see: + +- **Single-node environment: + One node listed in the **UN (Up/Normal)** state. + +- **Multi-node environment: +You should see each node listed with its IP address and state Nodes may briefly appear as UJ (Up/Joining) while they bootstrap + +#### If you expect multiple nodes but only see one + +This is a common configuration issue. Cassandra nodes will not appear in `nodetool status` unless they can successfully gossip with each other. + +Check the following: + +- `cluster_name` is identical on all nodes +- `listen_address` and `rpc_address` use the correct IPs (not localhost) +- `seeds` list includes reachable, running seed nodes +- Firewall/security groups allow intra‑node communication on ports 7000/7001 +- Datacenter names match across nodes + +## Multi‑Datacenter Configuration + +After completing the single-node installation and verification steps, you can configure Cassandra for multi‑datacenter (MDC) operation. To add more Cassandra nodes, repeat the installation and configuration steps from this guide on each new compute instance. Each node must: + +- Run the same Ubuntu version +- Install the same Cassandra version +- Use its own private IP address +- Have its own DC and rack values +- Start with an empty `/var/lib/cassandra/` directory + +This section focuses on Akamai‑specific requirements, and cloud networking considerations. For standard Cassandra MDC behavior, refer to the upstream documentation. + +### Upstream Cassandra Documentation + +Cassandra maintains version‑specific documentation under `/doc//`. These links point to the Apache Cassandra 4.1 documentation. Content may evolve over time, but the URLs remain stable. + +1. [Multi‑DC Cluster Initialization](https://cassandra.apache.org/doc/latest/cassandra/getting_started/initialize_cluster_multi_dc.html) +2. []`cassandra.yaml` Configuration Reference](https://cassandra.apache.org/doc/4.1/cassandra/configuration/cass_yaml_file.html) +3. [Snitch Architecture](https://cassandra.apache.org/doc/4.1/cassandra/architecture/snitch.html) + +You can deploy Cassandra nodes within the same region or across multiple regions. Multi‑region deployments are typically used for geographic redundancy, global applications, or regulatory data‑residency requirements. For guidance on designing multi‑datacenter topologies and understanding how distance affects replication and consistency, refer to the official [Cassandra documentation](https://cassandra.apache.org/doc/4.1/cassandra/architecture/dynamo.html). + +### Akamai‑Specific Multi‑DC Requirements + +When deploying Cassandra on Akamai Cloud Computing Services: + +- Use each node’s private IP address from the Akamai instance details page. +- Ensure nodes are reachable across regions using VPC peering or shared private networks. +- Open required Cassandra ports between regions: + - 7000 (intra‑node gossip) + - 7001 (TLS gossip, if enabled) + - 7199 (JMX) + - 9042 (CQL) +- Avoid using pre-emptible instances as seed nodes. +- If using block storage, ensure `/var/lib/cassandra/` is mounted on persistent storage. +- Allow **2–3** minutes for initial cross-region gossip convergence. + During this time, nodes discover each other across datacenters. After convergence, `nodetool status` shows all nodes with status **UN (Up/Normal)** under the correct datacenters. + +### Preparing Nodes for Multi‑DC Configuration + +Before applying MDC settings, stop Cassandra and remove default data on **every node**. This prevents replication of placeholder data during initial cluster formation. + +```command +sudo systemctl stop cassandra +``` +Remove default test data. + +```command +sudo rm -rf /var/lib/cassandra/* +``` +### Configuring `cassandra.yaml` for Multi-DC + +Refer to the upstream [Cassandra documentation](https://cassandra.apache.org/doc/4.1/cassandra/configuration/cass_yaml_file.html) for full details. + +#### Below are the **Akamai‑specific values** you must set. + +Before opening the configuration file, you can search for the line numbers where changes are needed: + +```command +grep -n listen_address /etc/cassandra/cassandra.yaml +grep -n rpc_address /etc/cassandra/cassandra.yaml +grep -n seed_provider /etc/cassandra/cassandra.yaml +grep -n cluster_name /etc/cassandra/cassandra.yaml +``` +Remember to activate line numbers when you open the configuration file (for example, in Weblish use "alt N"). + +**Open the configuration file on each node**: + +```command +sudo nano /etc/cassandra/cassandra.yaml +``` + +**Verify the Cluster Name** + +Verify that the `cluster_name` is the same on all nodes (this will be towards the top of the file). If it matches, no changes are required–proceed to the next step. + +```yaml +cluster_name: 'Test Cluster' +``` + +**Seed Guidance** + +This block appears elsewhere in the configuration file (sometimes prior to listen_address). The only change will be to the `- seeds: "IP1,IP2,IP3"` line. + +```yaml +seed_provider: + - class_name: org.apache.cassandra.locator.SimpleSeedProvider + parameters: + - seeds: "IP1,IP2,IP3" +``` +- List the **local DC’s primary seed first**, followed by secondary seeds from the same DC: + Example: `"IP1,IP2,IP3"` +- Add **remote DC seeds last**: + Example: `"IP1,IP2,IP3,IP4"` +- **Use the same seed list for all nodes in the same DC** +- **Do not make every node a seed** + + +**Listen_address** + +Set the node's private Akamai IP. + +```yaml +listen_address: 10.0.1.5 +``` + +**rpc_address** + +The default value (localhost) binds RPC to the loopback interface only. For a cluster, replace it with the node’s private IP so other nodes and clients can reach it. + +```yaml +rpc_address: 10.0.1.5 +``` + +**Snitch** + +Required for multi-datacenter deployments. + +```yaml +endpoint_snitch: GossipingPropertyFileSnitch +``` + +**Transport Settings** + +Locate the native transport settings in `cassandra.yaml` and confirm these lines are present: + +```yaml +start_native_transport: true +native_transport_port: 9042 +``` +These are the correct defaults. + +If they are missing or incorrect, Cassandra may start but clients (including `cqlsh`) will not be able to connect to the node. + +Save the file. + +### Setting Data Center and Rack Topology + +Each node must declare its datacenter and rack so Cassandra can place replicas correctly in a multi-DC cluster. These values must match the snitch configuration you set earlier. + +**Note**: The `dc` and `rack` values in this file are your choice. They don't need to match your VM names or cloud regions-–they only need to be consistent across nodes in the same datacenter. + +**Edit the topology file on each node: + +```command +sudo nano /etc/cassandra/cassandra-rackdc.properties + +**Specify the data center and rack**: + +```properties +dc=datacenter_name +rack=rack_name +``` + +**Important**: + +If Cassandra has ever been started on this node before you changed the datacenter name, the node will not start because the stored datacenter value won't match the new one. + +To avoid this, make sure Cassandra has not yet been started. If it has, stop the service and clear the node's local data before continuing. (See the earlier section "Preparing Nodes for Multi-DC Configuration" for the command used to clear the local data `/var/lib/cassandra/`.) + +Then use the following commands to manage the Cassandra service + +- Start Cassandra + +```command +sudo systemctl start cassandra +``` + +- Restart Cassandra (use this if Cassandra was already running) + +```command +sudo systemctl restart cassandra +``` +- Check the service status + +```command +sudo systemctl status cassandra +``` + +These commands help ensure Cassandra loads the updated configuration before you continue with cluster setup. + +**Examples**: + +Newark DC - Node 1 +```properties +dc=newark +rack=rack1 +``` +Newark DC - Node 2 +```properties +dc=newark +rack=rack2 +``` + +London DC - Node 1 +```properties +dc=london +rack=rack1 +``` +London DC - Node 2 +```properties +dc=london +rack=rack2 +``` +#### Topology rules + +- Rack names must be unique within their data center. +- Rack names may be reused across different data centers. +- Save the file (Ctrl+X, Y, Enter). + +These values are read at startup, so any changes require restarting the node. + +#### Starting the Multi-DC Cluster + +Start nodes in the correct order to ensure proper cluster formation. + +**Note**: The "primary seed" is the first IP address in your seed list. Start that node (whose IP appears first in the seed list) first before starting the other nodes. This ensures clean cluster formation. + +1.Start the primary seed in the first data center: + +```command +sudo systemctl start cassandra +``` + +2. Verify the service is running: + +```command +sudo systemctl status cassandra +``` + +3. Start the primary seeds in all other data centers. +4. Wait 2-3 minutes for seeds to discover each other. +5. Start all remaining nodes by starting Cassandra. +6. Wait another 2-3 minutes for full cluster synchronization. + +This sequence prevents nodes from starting in isolation and ensures that gossip converges cleanly across datacenters. + +#### Verifying Cluster Formation + +From any node: + +```command +sudo nodetool status +``` + +You should see: + +- each datacenter listed +- nodes marked **UN (Up / Normal)** +- correct datacenter and rack assignments +- reasonable token distribution across nodes +- + +**Example output:** + +A healthy two‑node, two‑datacenter cluster will show each node as UN under its correct datacenter. For example (Shown below is the real output from a two‑datacenter cluster created using this guide, included to help you compare your results): + +```command +Datacenter: ubuntu-gb-lon +========================== +Status=Up/Down +|/ State=Normal/Leaving/Joining/Moving +-- Address Load Tokens Owns (effective) Host ID Rack +UN 172.239.103.112 70.22 KiB 16 100.0% 3f4354fc-7129-4b20-8acc-9e0888437e11 rack1 +Datacenter: ubuntu-us-sea +========================== +UN 172.232.169.242 104.36 KiB 16 100.0% 9cc4c6ce-450a-4a1d-8d32-8cddc8e92cbe rack1 +``` + +Use the following section if your `nodetool status` output does not match the expected structure shown above. + +### Troubleshooting Cluster Formation + +If a node does not appear in the UN (Up/Normal) or shows up in the wrong datacenter, check the following: + +- Confirm the Cassandra service is running: + + ```command +sudo systemctl status cassandra +``` +- Verify the `dc` and `rack` values in `cassandra-rackdc.properties` +- Ensure rack names are unique **within** each datacenter +- Check that the node is using the correct **private IP** in `listen_address` +- Confirm that required ports (7000/7001/7199/9042) are open between regions +- Review logs for gossip, snitch, or connection errors: + + ```command +tail - 100 /var/log/cassandra/system.log +``` + +This set of checks covers the most common MDC formation issues without repeating earlier troubleshooting steps. + +For guidance on creating keyspaces, tables, and working with data, refer to the Apache Cassandra documentation for: + +- [CQL Reference](https://cassandra.apache.org/doc/latest/cassandra/developing/cql/cql_singlefile.html) +- [Data Definition (DDL) - includes replication strategies](https://cassandra.apache.org/doc/3.11.13/cassandra/cql/ddl.html) +- [Schema Design](https://cassandra.apache.org/doc/latest/cassandra/developing/data-modeling/data-modeling_schema.html) \ No newline at end of file From abc7341542ee7f1d8bfd89402dbe4a656ba24662 Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Tue, 10 Feb 2026 11:34:36 -0800 Subject: [PATCH 3/6] Fix Vale warnings for datacenters and listen_address --- ci/vale/dictionary.txt | 1 + .../deploy-cassandra-multi-datacenters/index.md | 2 +- .../cbdms-terraform.zip | Bin 0 -> 9655 bytes .../jenkins-agents-terraform.zip | Bin 0 -> 6787 bytes .../jenkins-example-app.zip | Bin 0 -> 7848 bytes .../rcdc-terraform.zip | Bin 0 -> 9419 bytes 6 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 reference-architecture/cloud-based-document-management-system/guides/implementing-cloud-based-document-management-system/cbdms-terraform.zip create mode 100644 reference-architecture/jenkins-ci-cd-on-linode-to-any-hyperscaler/guides/implement-jenkins-ci-cd/jenkins-agents-terraform.zip create mode 100644 reference-architecture/jenkins-ci-cd-on-linode-to-any-hyperscaler/guides/implement-jenkins-ci-cd/jenkins-example-app.zip create mode 100644 reference-architecture/redundant-cross-datacenter-applications/guides/implementing-redundant-cross-datacenter-applications/rcdc-terraform.zip diff --git a/ci/vale/dictionary.txt b/ci/vale/dictionary.txt index 67342db7119..83f7ae3b61c 100644 --- a/ci/vale/dictionary.txt +++ b/ci/vale/dictionary.txt @@ -490,6 +490,7 @@ dallas dao databags datacenter +datacenters datadir datadog dataflow diff --git a/docs/guides/databases/cassandra/deploy-cassandra-multi-datacenters/index.md b/docs/guides/databases/cassandra/deploy-cassandra-multi-datacenters/index.md index 3472cde4b55..5e44f343d4b 100644 --- a/docs/guides/databases/cassandra/deploy-cassandra-multi-datacenters/index.md +++ b/docs/guides/databases/cassandra/deploy-cassandra-multi-datacenters/index.md @@ -476,7 +476,7 @@ cluster_name: 'Test Cluster' **Seed Guidance** -This block appears elsewhere in the configuration file (sometimes prior to listen_address). The only change will be to the `- seeds: "IP1,IP2,IP3"` line. +This block appears elsewhere in the configuration file (sometimes prior to `listen_address`). The only change will be to the `- seeds: "IP1,IP2,IP3"` line. ```yaml seed_provider: diff --git a/reference-architecture/cloud-based-document-management-system/guides/implementing-cloud-based-document-management-system/cbdms-terraform.zip b/reference-architecture/cloud-based-document-management-system/guides/implementing-cloud-based-document-management-system/cbdms-terraform.zip new file mode 100644 index 0000000000000000000000000000000000000000..b3cf65b4e961d4843eadb703056226ae836c655f GIT binary patch literal 9655 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 literal 0 HcmV?d00001 diff --git a/reference-architecture/jenkins-ci-cd-on-linode-to-any-hyperscaler/guides/implement-jenkins-ci-cd/jenkins-example-app.zip b/reference-architecture/jenkins-ci-cd-on-linode-to-any-hyperscaler/guides/implement-jenkins-ci-cd/jenkins-example-app.zip new file mode 100644 index 0000000000000000000000000000000000000000..86a39eb2ce081ec4a18efc91db2ac7dabfa54f34 GIT binary patch literal 7848 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 M3%A)Xv*Q2y4@}#n?*IS* literal 0 HcmV?d00001 diff --git a/reference-architecture/redundant-cross-datacenter-applications/guides/implementing-redundant-cross-datacenter-applications/rcdc-terraform.zip b/reference-architecture/redundant-cross-datacenter-applications/guides/implementing-redundant-cross-datacenter-applications/rcdc-terraform.zip new file mode 100644 index 0000000000000000000000000000000000000000..74f8abd3c2bae5b6b324012419d5fedffa00cdbb GIT binary patch literal 9419 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 b$K|~HGh7sSR0ja?;XgR===hTI{J;MJy16G& literal 0 HcmV?d00001 From ac9df20adbeb9a6b8dccf8b8f28efefd58235f8f Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Tue, 10 Feb 2026 16:13:52 -0800 Subject: [PATCH 4/6] Refactor Multi-DC section: corrected heading levels, sequence, and formatting --- .../index.md | 138 +++++++++--------- 1 file changed, 72 insertions(+), 66 deletions(-) diff --git a/docs/guides/databases/cassandra/deploy-cassandra-multi-datacenters/index.md b/docs/guides/databases/cassandra/deploy-cassandra-multi-datacenters/index.md index 5e44f343d4b..6cf0dd56cd5 100644 --- a/docs/guides/databases/cassandra/deploy-cassandra-multi-datacenters/index.md +++ b/docs/guides/databases/cassandra/deploy-cassandra-multi-datacenters/index.md @@ -51,10 +51,10 @@ You'll configure multi-datacenter replication, implement monitoring with Prometh - Working knowledge of Apache Cassandra architecture (nodes, datacenters, replication, and gossip) ```command -
-Choosing a database +{{< note >}} +**Choosing a database** Akamai supports multiple database engines. This guide includes embedded Cassandra installation and configuration steps to support users who choose Cassandra, as it requires more setup than other options. Before proceeding, take a moment to "confirm" that Cassandra aligns with your application’s requirements and your operational experience. -
+{{}} ``` ## Architecture and Planning @@ -85,9 +85,9 @@ Deploy a minimum of 3 nodes per data center (odd numbers preferred to prevent sp ### Multi-Region Network Planning -**Akamai Data Center Selection**: +**Akamai Data Center Selection** -Choose data center pairs based on your latency requirements: +Choose data center pairs based on your latency requirements. **Same-region deployments (< 50ms latency)**: @@ -102,14 +102,14 @@ Choose data center pairs based on your latency requirements: - **Asia-Pacific**: Singapore and Tokyo - **Global**: Newark, London, Singapore -Network Architecture: +Network Architecture Configure the following Akamai networking features for cluster communication: -- **VLANs**: Create private VLANs for cluster communication within and across data centers -- **Cloud Firewall**: Implement rules limiting access to required Cassandra ports (7000, 9042, 7199) -- **Private IP addresses**: Use private IPs for all node-to-node communication -- **Network interfaces**: 1Gbps+ interfaces (standard on Dedicated and Premium CPU instances) +- **VLANs**: Create private VLANs for cluster communication within and across data centers. +- **Cloud Firewall**: Implement rules limiting access to required Cassandra ports (7000, 9042, 7199). +- **Private IP addresses**: Use private IPs for all node-to-node communication. +- **Network interfaces**: 1Gbps+ interfaces (standard on Dedicated and Premium CPU instances). For complete port requirements and security configuration, see the [Cassandra Security](https://cassandra.apache.org/doc/4.1/cassandra/operating/security.html) documentation. @@ -142,22 +142,22 @@ This section covers provisioning the underlying infrastructure for your multi-da Provision compute instances in each selected Akamai data center according to your planning worksheet. -**Instance Selection Guidelines**: +#### Instance Selection Guidelines See the [Instance Sizing Recommendations](#instance-sizing-recommendations) table for recommended instance types and specifications based on your workload requirements. -**Operating System**: +#### Operating System Use **Ubuntu 22.04 LTS** across all nodes for consistency in maintenance and troubleshooting. -**Multi-Region Deployment Considerations** +#### Multi-Region Deployment Considerations - Deploy primary-region nodes first, then secondary regions. - Maintain consistent instance specifications within each region. - Document private and public IPs for all nodes. - Ensure each region has sufficient node count for quorum and replication. -**Example topology** +#### Example topology - Newark: 3 nodes - London: 3 nodes @@ -167,7 +167,7 @@ Use **Ubuntu 22.04 LTS** across all nodes for consistency in maintenance and tro VLANs provide private, low‑latency connectivity between Cassandra nodes. -**Within a data center** +#### Within a data center - Use one VLAN per data center. - Assign private IPs from a dedicated subnet. @@ -175,36 +175,37 @@ VLANs provide private, low‑latency connectivity between Cassandra nodes. - Confirm that the VLAN is created before provisioning compute instances to avoid re-IP operations later - Record the assigned subnet and VLAN ID in your deployment worksheet for later reference. -**Across data centers** +#### Across data centers + - Configure VLAN routing between regions. - Use non‑overlapping private subnets. - Validate cross-region connectivity and latency between all nodes. - Verify that firewall rules allow inter-DC Cassandra ports before cluster initialization. -**Example VLAN scheme**: +#### Example VLAN scheme - Newark VLAN: 10.0.1.0/24 - London VLAN: 10.0.2.0/24 -#### Block Storage +### Block Storage Cassandra requires dedicated storage for data and commit logs. -**Volume specifications**: +#### Volume specifications - **Size**: 100GB-1TB per node (based on data requirements). - **Performance**: NVMe-backed for production workloads. - **Attachment**: Attach and mount volumes before installing Cassandra. - Ensure each volume is attached as a persistent Block Storage device so it survives instance reboots. -**Filesystem and layout** +#### Filesystem and layout - Use ext4 or XFS. - Mount at `/var/lib/cassandra`. - Optionally user separate volumes for commit logs. - Format and mount volumes before running `cassandra` for the first time to avoid auto-creating directories on the root disk. -**Example mount points**: +#### Example mount points - Data directory: `/var/lib/cassandra/data` - Commit log directory: `/var/lib/cassandra/commitlog` (if using separate volume) @@ -215,29 +216,30 @@ Cross-data-center VLAN behavior was not tested in this environment but reflects Cassandra requires specific ports for internode communication, client access, and monitoring. For complete port reference and security considerations, see the [Cassandra Security documentation](https://cassandra.apache.org/doc/4.1/cassandra/operating/security.html). -**Cluster communication**: +#### Cluster communication - Port 7000/TCP(intra-cluster) – allow from private IPs only - Port 7001/TCP(encrypted intra-cluster, if internode encryption is enabled) – allow from private IPs only -**Client connections**: +#### Client connections - Port 9042/TCP - allow from application servers -**Monitoring**: + +#### Monitoring - Port 7199/TCP - allow from monitoring infrastructure -**Management**: +#### Management - Port 22/TCP - restrict to administrative IPs -**Outbound traffic**: +#### Outbound traffic - Allow outbound access for package installation and updates - Apply egress restrictions only if required by policy -**Security Best Practices**: +#### Security Best Practices - Use private IPs for all cluster communication. - Apply consistent firewall rules across all nodes. @@ -247,13 +249,13 @@ Cassandra requires specific ports for internode communication, client access, an Confirm network connectivity meets your requirements before installing Cassandra. -**Connectivity expectations**: +#### Connectivity expectations - Nodes must reach each other over private IPs - Cross-region latency should align with your replication strategy - Required ports must be reachable between nodes -**Latency guidelines** +#### Latency guidelines - Intra‑DC: < 10ms - Same‑region multi‑DC: < 50ms @@ -281,29 +283,31 @@ Because Cassandra 4.1.x is no longer included in Ubuntu’s default package repo Ubuntu 22.04 LTS is fully compatible with Cassandra 4.1.x and is the recommended operating system for this deployment guide. -**Installation approach**: +### Installation approach Begin by installing and validating Cassandra on a single node first. Once the installation is confirmed working, repeat the same steps on the remaining nodes to ensure consistency across the cluster. -### Add the Apache Cassandra repository +### Add the Apache Cassandra Repository + +#### Create a Repository Definition -Create a repository definition: ```command echo "deb https://debian.cassandra.apache.org 41x main" | sudo tee /etc/apt/sources.list.d/cassandra.sources.list ``` -Import the Apache Cassandra GPG key: +#### Import the Apache Cassandra GPG Key ```command sudo curl https://downloads.apache.org/cassandra/KEYS | sudo apt-key add - ``` -Note: Debian and Ubuntu are transitioning away from apt-key. For background about how APT verifies repository signatures or how to manage repository keys using modern gpg‑based methods, refer to the Debian documentation topic [SecureApt](https://wiki.debian.org/SecureApt). If this link becomes unavailable, search the Debian documentation for “SecureApt” or “APT repository key management”. +{{< note>}}: Debian and Ubuntu are transitioning away from apt-key. For background about how APT verifies repository signatures or how to manage repository keys using modern gpg‑based methods, refer to the Debian documentation topic [SecureApt](https://wiki.debian.org/SecureApt). If this link becomes unavailable, search the Debian documentation for “SecureApt” or “APT repository key management”. +{{< /note >}} -**Update package lists**: +#### Update Package Lists ```command sudo apt update ``` -#### Install Cassandra +### Install Cassandra Install Cassandra and its dependencies: @@ -314,7 +318,7 @@ When prompted with "Do you want to continue? [Y/n]" press "Y" and "Enter" to pro Cassandra automatically installs OpenJDK 11 as a dependency, so no separate Java installation is required. -#### Optional: Environment Checks +### Optional: Environment Checks After installation, confirm your kernel and package versions match expected compatibility. Ubuntu 22.04.5 LTS is generally safe, but minimal images or custom build may vary. ```command @@ -330,7 +334,7 @@ You are looking for: If there is no output Cassandra is not installed. -#### Verify installation on the first node +#### Verify Installation on the First Node Check the service status: ```command @@ -338,7 +342,7 @@ sudo nodetool status ``` Press `q` to exit the status view. -#### Verify installation on the second node +#### Verify Installation on the Second Node Repeat the same check as for the first node. Test CQL shell access: @@ -411,7 +415,7 @@ This section focuses on Akamai‑specific requirements, and cloud networking con Cassandra maintains version‑specific documentation under `/doc//`. These links point to the Apache Cassandra 4.1 documentation. Content may evolve over time, but the URLs remain stable. 1. [Multi‑DC Cluster Initialization](https://cassandra.apache.org/doc/latest/cassandra/getting_started/initialize_cluster_multi_dc.html) -2. []`cassandra.yaml` Configuration Reference](https://cassandra.apache.org/doc/4.1/cassandra/configuration/cass_yaml_file.html) +2. [`cassandra.yaml` Configuration Reference](https://cassandra.apache.org/doc/4.1/cassandra/configuration/cass_yaml_file.html) 3. [Snitch Architecture](https://cassandra.apache.org/doc/4.1/cassandra/architecture/snitch.html) You can deploy Cassandra nodes within the same region or across multiple regions. Multi‑region deployments are typically used for geographic redundancy, global applications, or regulatory data‑residency requirements. For guidance on designing multi‑datacenter topologies and understanding how distance affects replication and consistency, refer to the official [Cassandra documentation](https://cassandra.apache.org/doc/4.1/cassandra/architecture/dynamo.html). @@ -460,13 +464,13 @@ grep -n cluster_name /etc/cassandra/cassandra.yaml ``` Remember to activate line numbers when you open the configuration file (for example, in Weblish use "alt N"). -**Open the configuration file on each node**: +#### Open the configuration file on each node ```command sudo nano /etc/cassandra/cassandra.yaml ``` -**Verify the Cluster Name** +#### Verify the Cluster Name Verify that the `cluster_name` is the same on all nodes (this will be towards the top of the file). If it matches, no changes are required–proceed to the next step. @@ -474,7 +478,7 @@ Verify that the `cluster_name` is the same on all nodes (this will be towards th cluster_name: 'Test Cluster' ``` -**Seed Guidance** +#### Seed Guidance This block appears elsewhere in the configuration file (sometimes prior to `listen_address`). The only change will be to the `- seeds: "IP1,IP2,IP3"` line. @@ -492,7 +496,7 @@ seed_provider: - **Do not make every node a seed** -**Listen_address** +#### Listen_address Set the node's private Akamai IP. @@ -500,7 +504,7 @@ Set the node's private Akamai IP. listen_address: 10.0.1.5 ``` -**rpc_address** +#### rpc_address The default value (localhost) binds RPC to the loopback interface only. For a cluster, replace it with the node’s private IP so other nodes and clients can reach it. @@ -508,7 +512,7 @@ The default value (localhost) binds RPC to the loopback interface only. For a cl rpc_address: 10.0.1.5 ``` -**Snitch** +#### Snitch Required for multi-datacenter deployments. @@ -516,7 +520,7 @@ Required for multi-datacenter deployments. endpoint_snitch: GossipingPropertyFileSnitch ``` -**Transport Settings** +#### Transport Settings Locate the native transport settings in `cassandra.yaml` and confirm these lines are present: @@ -528,33 +532,35 @@ These are the correct defaults. If they are missing or incorrect, Cassandra may start but clients (including `cqlsh`) will not be able to connect to the node. -Save the file. +#### Save the File ### Setting Data Center and Rack Topology Each node must declare its datacenter and rack so Cassandra can place replicas correctly in a multi-DC cluster. These values must match the snitch configuration you set earlier. -**Note**: The `dc` and `rack` values in this file are your choice. They don't need to match your VM names or cloud regions-–they only need to be consistent across nodes in the same datacenter. +{{< note>}}: The `dc` and `rack` values in this file are your choice. They don't need to match your VM names or cloud regions-–they only need to be consistent across nodes in the same datacenter. +{{< /note >}} -**Edit the topology file on each node: +#### Edit the Topology file on each Node ```command sudo nano /etc/cassandra/cassandra-rackdc.properties +``` -**Specify the data center and rack**: +#### Specify the Data Center and Rack ```properties dc=datacenter_name rack=rack_name ``` -**Important**: - +{{< note>}}: If Cassandra has ever been started on this node before you changed the datacenter name, the node will not start because the stored datacenter value won't match the new one. +{{< /note >}} To avoid this, make sure Cassandra has not yet been started. If it has, stop the service and clear the node's local data before continuing. (See the earlier section "Preparing Nodes for Multi-DC Configuration" for the command used to clear the local data `/var/lib/cassandra/`.) -Then use the following commands to manage the Cassandra service +Then use the following commands to manage the Cassandra service: - Start Cassandra @@ -575,7 +581,7 @@ sudo systemctl status cassandra These commands help ensure Cassandra loads the updated configuration before you continue with cluster setup. -**Examples**: +#### Examples Newark DC - Node 1 ```properties @@ -610,7 +616,8 @@ These values are read at startup, so any changes require restarting the node. Start nodes in the correct order to ensure proper cluster formation. -**Note**: The "primary seed" is the first IP address in your seed list. Start that node (whose IP appears first in the seed list) first before starting the other nodes. This ensures clean cluster formation. +{{< note >}}: The "primary seed" is the first IP address in your seed list. Start that node (whose IP appears first in the seed list) first before starting the other nodes. This ensures clean cluster formation. +{{< /note >}} 1.Start the primary seed in the first data center: @@ -645,11 +652,10 @@ You should see: - nodes marked **UN (Up / Normal)** - correct datacenter and rack assignments - reasonable token distribution across nodes -- -**Example output:** +#### Example output -A healthy two‑node, two‑datacenter cluster will show each node as UN under its correct datacenter. For example (Shown below is the real output from a two‑datacenter cluster created using this guide, included to help you compare your results): +A healthy two‑node, two‑datacenter cluster will show each node as UN under its correct datacenter. For example, shown below is the real output from a two‑datacenter cluster created using this guide (included to help you compare your results): ```command Datacenter: ubuntu-gb-lon @@ -669,16 +675,16 @@ Use the following section if your `nodetool status` output does not match the ex If a node does not appear in the UN (Up/Normal) or shows up in the wrong datacenter, check the following: -- Confirm the Cassandra service is running: +1. Confirm the Cassandra service is running: ```command sudo systemctl status cassandra ``` -- Verify the `dc` and `rack` values in `cassandra-rackdc.properties` -- Ensure rack names are unique **within** each datacenter -- Check that the node is using the correct **private IP** in `listen_address` -- Confirm that required ports (7000/7001/7199/9042) are open between regions -- Review logs for gossip, snitch, or connection errors: +2. Verify the `dc` and `rack` values in `cassandra-rackdc.properties`. +3. Ensure rack names are unique **within** each datacenter. +4. Check that the node is using the correct **private IP** in `listen_address`. +4. Confirm that required ports (7000/7001/7199/9042) are open between regions. +5. Review logs for gossip, snitch, or connection errors: ```command tail - 100 /var/log/cassandra/system.log @@ -690,4 +696,4 @@ For guidance on creating keyspaces, tables, and working with data, refer to the - [CQL Reference](https://cassandra.apache.org/doc/latest/cassandra/developing/cql/cql_singlefile.html) - [Data Definition (DDL) - includes replication strategies](https://cassandra.apache.org/doc/3.11.13/cassandra/cql/ddl.html) -- [Schema Design](https://cassandra.apache.org/doc/latest/cassandra/developing/data-modeling/data-modeling_schema.html) \ No newline at end of file +- [Schema Design](https://cassandra.apache.org/doc/latest/cassandra/developing/data-modeling/data-modeling_schema.html) From f6a35e10bc91695c938e553711555f090024bdb2 Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Tue, 10 Feb 2026 16:20:20 -0800 Subject: [PATCH 5/6] Fixed Vale errors and updated formatting --- .../cassandra/deploy-cassandra-multi-datacenters/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guides/databases/cassandra/deploy-cassandra-multi-datacenters/index.md b/docs/guides/databases/cassandra/deploy-cassandra-multi-datacenters/index.md index 6cf0dd56cd5..a05b6c94989 100644 --- a/docs/guides/databases/cassandra/deploy-cassandra-multi-datacenters/index.md +++ b/docs/guides/databases/cassandra/deploy-cassandra-multi-datacenters/index.md @@ -496,7 +496,7 @@ seed_provider: - **Do not make every node a seed** -#### Listen_address +#### `listen_address` Set the node's private Akamai IP. @@ -504,7 +504,7 @@ Set the node's private Akamai IP. listen_address: 10.0.1.5 ``` -#### rpc_address +#### `rpc_address` The default value (localhost) binds RPC to the loopback interface only. For a cluster, replace it with the node’s private IP so other nodes and clients can reach it. From fc52384c536e3530185e2cacb659672c0517dfda Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Thu, 12 Feb 2026 11:22:42 -0800 Subject: [PATCH 6/6] Last pass review edits --- .../index.md | 84 +++++++++++-------- 1 file changed, 48 insertions(+), 36 deletions(-) diff --git a/docs/guides/databases/cassandra/deploy-cassandra-multi-datacenters/index.md b/docs/guides/databases/cassandra/deploy-cassandra-multi-datacenters/index.md index a05b6c94989..a2c5590464e 100644 --- a/docs/guides/databases/cassandra/deploy-cassandra-multi-datacenters/index.md +++ b/docs/guides/databases/cassandra/deploy-cassandra-multi-datacenters/index.md @@ -2,8 +2,8 @@ slug: deploy-cassandra-multi-datacenters title: "Deploying Apache Cassandra Across Multiple Data Centers" description: 'Deploy Apache Cassandra across multiple data centers (MDC) on Akamai cloud computing services. This guide covers VM based, containerized, and Kubernetes (LKE) deployment models; multi data center replication; monitoring with Prometheus and Grafana; cluster security; backup and recovery; and operational best practices for scaling and long term maintenance.' -authors: ["Diana Hoober"] -contributors: ["Diana Hoober"] +authors: ["Akamai"] +contributors: ["Akamai"] published: 2026-01-31 keywords: ['cassandra', 'apache cassandra', 'nosql', 'database', 'distributed database', 'multi-datacenter', 'replication', 'high availability', 'docker', 'kubernetes', 'k8ssandra', 'containers', 'prometheus', 'grafana', 'monitoring', 'security', 'encryption', 'authentication', 'backup', 'disaster recovery', 'scaling', 'block storage', 'object storage', 'vlan', 'lke', 'linode kubernetes engine'] license: '[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)' @@ -22,7 +22,7 @@ external_resources: Apache Cassandra is a distributed NoSQL database designed for low-latency replication across geographically separated data centers. Multi-data center deployments reduce latency for your global users, support regional failover, and help you meet data residency requirements. -This guide shows you how to deploy Apache Cassandra across multiple data centers on Akamai cloud computing services. You'll configure multi-data center replication, implement production-ready monitoring and security, and learn operational procedures for scaling and maintenance. +This guide shows you how to deploy Apache Cassandra across multiple data centers on Akamai cloud computing services. You'll configure multi-data center replication, integrate monitoring with Prometheus and Grafana, apply essential security settings, and learn operational procedures for scaling and maintenance. ## Why Multi-Data Center Cassandra on Akamai Cloud Computing Services @@ -41,7 +41,7 @@ This guide covers three deployment approaches: - Container-based deployment - Docker containers - Kubernetes orchestration - Linode Kubernetes Engine (LKE) -You'll configure multi-datacenter replication, implement monitoring with Prometheus and Grafana, secure your cluster with encryption and authentication, and establish backup procedures using Akamai Object Storage. +Your final deployment will span multiple data centers, surface metrics to Prometheus and Grafana, enforce essential security controls, and maintain backups in Akamai Object Storage. ### Prerequisites and Preparation @@ -50,12 +50,10 @@ You'll configure multi-datacenter replication, implement monitoring with Prometh - Familiarity with database concepts and networking - Working knowledge of Apache Cassandra architecture (nodes, datacenters, replication, and gossip) -```command {{< note >}} **Choosing a database** Akamai supports multiple database engines. This guide includes embedded Cassandra installation and configuration steps to support users who choose Cassandra, as it requires more setup than other options. Before proceeding, take a moment to "confirm" that Cassandra aligns with your application’s requirements and your operational experience. {{}} -``` ## Architecture and Planning @@ -81,11 +79,13 @@ For optimal performance, attach NVMe-backed Block Storage volumes to Dedicated o Cluster Topology: -Deploy a minimum of 3 nodes per data center (odd numbers preferred to prevent split-brain scenarios) with a replication factor of 3 for production environments. Designate 2+ stable nodes per data center as seed nodes. For capacity planning guidelines and topology best practices, see the [Cassandra Planning](https://cassandra.apache.org/doc/latest/cassandra/managing/operating/hardware.html) documentation. +Use three nodes per data center (odd numbers reduce split brain risk) with a replication factor of three. Assign at least two stable nodes in each data center as seed nodes. For capacity planning guidelines and topology best practices, see the [Cassandra Planning](https://cassandra.apache.org/doc/latest/cassandra/managing/operating/hardware.html) documentation. ### Multi-Region Network Planning -**Akamai Data Center Selection** +#### Akamai Data Center Selection + +Before configuring multi-datacenter replication, you need to choose Akamai data centers that meet Cassandra’s latency expectations for cross region communication. Choose data center pairs based on your latency requirements. @@ -102,7 +102,7 @@ Choose data center pairs based on your latency requirements. - **Asia-Pacific**: Singapore and Tokyo - **Global**: Newark, London, Singapore -Network Architecture +#### Network Architecture Configure the following Akamai networking features for cluster communication: @@ -111,7 +111,7 @@ Configure the following Akamai networking features for cluster communication: - **Private IP addresses**: Use private IPs for all node-to-node communication. - **Network interfaces**: 1Gbps+ interfaces (standard on Dedicated and Premium CPU instances). -For complete port requirements and security configuration, see the [Cassandra Security](https://cassandra.apache.org/doc/4.1/cassandra/operating/security.html) documentation. +Review the [Cassandra Security](https://cassandra.apache.org/doc/4.1/cassandra/operating/security.html) documentation for complete port requirements and security configuration details, because these settings must be in place for your cluster to operate correctly. ### Software Versions @@ -140,7 +140,7 @@ This section covers provisioning the underlying infrastructure for your multi-da ### Compute Instances -Provision compute instances in each selected Akamai data center according to your planning worksheet. +Provision compute instances according to the specifications in your planning worksheet. If you have not yet finalized instance types, OS selection, or deployment order, review the considerations below before proceeding. #### Instance Selection Guidelines @@ -159,13 +159,15 @@ Use **Ubuntu 22.04 LTS** across all nodes for consistency in maintenance and tro #### Example topology +Use the example below to validate your instance counts and regional layout while you visualize and finalize your planning worksheet. + - Newark: 3 nodes - London: 3 nodes - **Total**: 6 nodes across 2 data centers ### VLAN Architecture -VLANs provide private, low‑latency connectivity between Cassandra nodes. +VLANs provide private, low latency connectivity between Cassandra nodes, and the VLAN design captured in your planning worksheet defines how nodes communicate within and across regions. #### Within a data center @@ -184,12 +186,16 @@ VLANs provide private, low‑latency connectivity between Cassandra nodes. #### Example VLAN scheme +Use the example below to validate your VLAN assignments as you document your network design in the planning worksheet. + - Newark VLAN: 10.0.1.0/24 - London VLAN: 10.0.2.0/24 +Cross-data-center VLAN behavior was not tested in this environment but reflects required Akamai Cloud architecture. + ### Block Storage -Cassandra requires dedicated storage for data and commit logs. +Cassandra requires dedicated storage for data and commit logs, and documenting your block storage plan in the planning worksheet helps ensure each node is provisioned with the correct capacity and performance. #### Volume specifications @@ -207,14 +213,14 @@ Cassandra requires dedicated storage for data and commit logs. #### Example mount points +The example below shows how to validate your directory layout to document block storage configuration for the planning worksheet. + - Data directory: `/var/lib/cassandra/data` - Commit log directory: `/var/lib/cassandra/commitlog` (if using separate volume) -Cross-data-center VLAN behavior was not tested in this environment but reflects required Akamai Cloud architecture. - ### Cloud Firewall Strategy -Cassandra requires specific ports for internode communication, client access, and monitoring. For complete port reference and security considerations, see the [Cassandra Security documentation](https://cassandra.apache.org/doc/4.1/cassandra/operating/security.html). +Cassandra requires specific ports for internode communication, client access, and monitoring. Use the following firewall rules and connectivity requirements to validate your network design and document the necessary settings in your planning worksheet before deployment. For complete port reference and security considerations, see the [Cassandra Security documentation](https://cassandra.apache.org/doc/4.1/cassandra/operating/security.html). #### Cluster communication @@ -261,8 +267,6 @@ Confirm network connectivity meets your requirements before installing Cassandra - Same‑region multi‑DC: < 50ms - Cross‑region: < 300ms -Cross-data-center firewall behavior and latency validation were not tested in this environment but reflect Akamai Cloud architecture. - ### Infrastructure Readiness Checklist Before proceeding to Cassandra installation, confirm: @@ -289,6 +293,8 @@ Begin by installing and validating Cassandra on a single node first. Once the in ### Add the Apache Cassandra Repository +Add the Apache Cassandra repository as part of your installation preparation so each node can retrieve the correct 4.1.x packages; document this step in your planning worksheet to ensure consistency across regions. + #### Create a Repository Definition ```command @@ -299,7 +305,8 @@ echo "deb https://debian.cassandra.apache.org 41x main" | sudo tee /etc/apt/sour ```command sudo curl https://downloads.apache.org/cassandra/KEYS | sudo apt-key add - ``` -{{< note>}}: Debian and Ubuntu are transitioning away from apt-key. For background about how APT verifies repository signatures or how to manage repository keys using modern gpg‑based methods, refer to the Debian documentation topic [SecureApt](https://wiki.debian.org/SecureApt). If this link becomes unavailable, search the Debian documentation for “SecureApt” or “APT repository key management”. +{{< note>}} +Debian and Ubuntu are transitioning away from apt-key. For background about how APT verifies repository signatures or how to manage repository keys using modern gpg‑based methods, refer to the Debian documentation topic [SecureApt](https://wiki.debian.org/SecureApt). If this link becomes unavailable, search the Debian documentation for “SecureApt” or “APT repository key management”. {{< /note >}} #### Update Package Lists @@ -320,7 +327,7 @@ Cassandra automatically installs OpenJDK 11 as a dependency, so no separate Java ### Optional: Environment Checks -After installation, confirm your kernel and package versions match expected compatibility. Ubuntu 22.04.5 LTS is generally safe, but minimal images or custom build may vary. +After installation, confirm your kernel and package versions match expected compatibility. Ubuntu 22.04.5 LTS is generally safe, but minimal images or custom builds may vary. ```command sudo uname -r # Check kernel version sudo java -version # Confirm Java runtime @@ -380,11 +387,9 @@ sudo nodetool status ``` What you should see: -- **Single-node environment: - One node listed in the **UN (Up/Normal)** state. +- **Single-node environment**: One node listed in the **UN (Up/Normal)** state. -- **Multi-node environment: -You should see each node listed with its IP address and state Nodes may briefly appear as UJ (Up/Joining) while they bootstrap +- **Multi-node environment**: You should see each node listed with its IP address and state Nodes may briefly appear as UJ (Up/Joining) while they bootstrap #### If you expect multiple nodes but only see one @@ -412,17 +417,19 @@ This section focuses on Akamai‑specific requirements, and cloud networking con ### Upstream Cassandra Documentation -Cassandra maintains version‑specific documentation under `/doc//`. These links point to the Apache Cassandra 4.1 documentation. Content may evolve over time, but the URLs remain stable. +Cassandra maintains version‑specific documentation under `/doc//`. These links point to the Apache Cassandra 4.1 documentation. -1. [Multi‑DC Cluster Initialization](https://cassandra.apache.org/doc/latest/cassandra/getting_started/initialize_cluster_multi_dc.html) -2. [`cassandra.yaml` Configuration Reference](https://cassandra.apache.org/doc/4.1/cassandra/configuration/cass_yaml_file.html) -3. [Snitch Architecture](https://cassandra.apache.org/doc/4.1/cassandra/architecture/snitch.html) +Cassandra no longer provides a dedicated Multi-DC initialization walkthrough. Multi-datacenter behavior is not a separate procedure: it emerges from the replication model and the configuration of snitches and `NetworkTopologyStrategy`. New users should rely on the upstream conceptual and configuration documentation rather than expecting a step-by-step Multi-DC guide. -You can deploy Cassandra nodes within the same region or across multiple regions. Multi‑region deployments are typically used for geographic redundancy, global applications, or regulatory data‑residency requirements. For guidance on designing multi‑datacenter topologies and understanding how distance affects replication and consistency, refer to the official [Cassandra documentation](https://cassandra.apache.org/doc/4.1/cassandra/architecture/dynamo.html). +1. [Multi-master Replication: Versioned Data and Tunable Consistency](https://cassandra.apache.org/doc/4.1/cassandra/architecture/dynamo.html#multi-master-replication:-versioned-data-and-tunable-consistency)explains the replication model that underpins multi-DC behavior. +2. [`cassandra.yaml` Configuration Reference](https://cassandra.apache.org/doc/4.1/cassandra/configuration/cass_yaml_file.html) covers the settings used when configuring datacenter and rack placement. +3. [Snitch Architecture](https://cassandra.apache.org/doc/4.1/cassandra/architecture/snitch.html)describes how Cassandra identifies datacenters and routes requests. + +You can deploy Cassandra nodes within a single region or across multiple regions. Multi‑region deployments are typically used for geographic redundancy, global applications, or regulatory data‑residency requirements. For guidance on designing multi‑datacenter topologies and understanding how distance affects replication and consistency, refer to the official Cassandra documentation. ### Akamai‑Specific Multi‑DC Requirements -When deploying Cassandra on Akamai Cloud Computing Services: +These requirements supplement the upstream Cassandra documentation and describe only the Akamai specific networking and instance level considerations for multi datacenter deployments. - Use each node’s private IP address from the Akamai instance details page. - Ensure nodes are reachable across regions using VPC peering or shared private networks. @@ -532,13 +539,13 @@ These are the correct defaults. If they are missing or incorrect, Cassandra may start but clients (including `cqlsh`) will not be able to connect to the node. -#### Save the File +Save the File.(Ctrl X, Y, Enter) ### Setting Data Center and Rack Topology Each node must declare its datacenter and rack so Cassandra can place replicas correctly in a multi-DC cluster. These values must match the snitch configuration you set earlier. -{{< note>}}: The `dc` and `rack` values in this file are your choice. They don't need to match your VM names or cloud regions-–they only need to be consistent across nodes in the same datacenter. +{{< note>}} The `dc` and `rack` values in this file are your choice. They don't need to match your VM names or cloud regions-–they only need to be **consistent across nodes** in the same datacenter. {{< /note >}} #### Edit the Topology file on each Node @@ -549,12 +556,15 @@ sudo nano /etc/cassandra/cassandra-rackdc.properties #### Specify the Data Center and Rack +Cassandra reads the datacenter and rack labels from `/etc/cassandra/cassandra-rackdc.properties`. Edit this file and ensure the following entries are present or updated to match your deployment: + ```properties dc=datacenter_name rack=rack_name ``` +These values must align with the datacenter and rack names you use in your `NetworkTopologyStrategy` configuration. -{{< note>}}: +{{< note>}} If Cassandra has ever been started on this node before you changed the datacenter name, the node will not start because the stored datacenter value won't match the new one. {{< /note >}} @@ -616,10 +626,10 @@ These values are read at startup, so any changes require restarting the node. Start nodes in the correct order to ensure proper cluster formation. -{{< note >}}: The "primary seed" is the first IP address in your seed list. Start that node (whose IP appears first in the seed list) first before starting the other nodes. This ensures clean cluster formation. +{{< note >}} The "primary seed" is the first IP address in your seed list. Start that node (whose IP appears first in the seed list) first before starting the other nodes. This ensures clean cluster formation. {{< /note >}} -1.Start the primary seed in the first data center: +1. Start the primary seed in the first data center: ```command sudo systemctl start cassandra @@ -646,7 +656,7 @@ From any node: sudo nodetool status ``` -You should see: +In the output you should see: - each datacenter listed - nodes marked **UN (Up / Normal)** @@ -697,3 +707,5 @@ For guidance on creating keyspaces, tables, and working with data, refer to the - [CQL Reference](https://cassandra.apache.org/doc/latest/cassandra/developing/cql/cql_singlefile.html) - [Data Definition (DDL) - includes replication strategies](https://cassandra.apache.org/doc/3.11.13/cassandra/cql/ddl.html) - [Schema Design](https://cassandra.apache.org/doc/latest/cassandra/developing/data-modeling/data-modeling_schema.html) + +[Cassandra documentation](https://cassandra.apache.org/_/index.html) provides in depth support.