"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[4358],{15680:(e,r,t)=>{t.d(r,{xA:()=>p,yg:()=>m});var a=t(96540);function n(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function i(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);r&&(a=a.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,a)}return t}function o(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?i(Object(t),!0).forEach((function(r){n(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):i(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}function l(e,r){if(null==e)return{};var t,a,n=function(e,r){if(null==e)return{};var t,a,n={},i=Object.keys(e);for(a=0;a<i.length;a++)t=i[a],r.indexOf(t)>=0||(n[t]=e[t]);return n}(e,r);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)t=i[a],r.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(n[t]=e[t])}return n}var c=a.createContext({}),s=function(e){var r=a.useContext(c),t=r;return e&&(t="function"==typeof e?e(r):o(o({},r),e)),t},p=function(e){var r=s(e.components);return a.createElement(c.Provider,{value:r},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var r=e.children;return a.createElement(a.Fragment,{},r)}},y=a.forwardRef((function(e,r){var t=e.components,n=e.mdxType,i=e.originalType,c=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=s(t),y=n,m=u["".concat(c,".").concat(y)]||u[y]||d[y]||i;return t?a.createElement(m,o(o({ref:r},p),{},{components:t})):a.createElement(m,o({ref:r},p))}));function m(e,r){var t=arguments,n=r&&r.mdxType;if("string"==typeof e||n){var i=t.length,o=new Array(i);o[0]=y;var l={};for(var c in r)hasOwnProperty.call(r,c)&&(l[c]=r[c]);l.originalType=e,l[u]="string"==typeof e?e:n,o[1]=l;for(var s=2;s<i;s++)o[s]=t[s];return a.createElement.apply(null,o)}return a.createElement.apply(null,t)}y.displayName="MDXCreateElement"},96849:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>p,contentTitle:()=>c,default:()=>m,frontMatter:()=>l,metadata:()=>s,toc:()=>u});var a=t(58168),n=t(98587),i=(t(96540),t(15680)),o=["components"],l={id:"high-availability",title:"High availability"},c=void 0,s={unversionedId:"operations/high-availability",id:"operations/high-availability",title:"High availability",description:"\x3c!--",source:"@site/docs/29.0.0/operations/high-availability.md",sourceDirName:"operations",slug:"/operations/high-availability",permalink:"/docs/29.0.0/operations/high-availability",draft:!1,tags:[],version:"current",frontMatter:{id:"high-availability",title:"High availability"},sidebar:"docs",previous:{title:"Alerts",permalink:"/docs/29.0.0/operations/alerts"},next:{title:"Rolling updates",permalink:"/docs/29.0.0/operations/rolling-updates"}},p={},u=[],d={toc:u},y="wrapper";function m(e){var r=e.components,t=(0,n.A)(e,o);return(0,i.yg)(y,(0,a.A)({},d,t,{components:r,mdxType:"MDXLayout"}),(0,i.yg)("p",null,"Apache ZooKeeper, metadata store, the coordinator, the overlord, and brokers are recommended to set up a high availability environment."),(0,i.yg)("ul",null,(0,i.yg)("li",{parentName:"ul"},"For highly-available ZooKeeper, you will need a cluster of 3 or 5 ZooKeeper nodes.\nWe recommend either installing ZooKeeper on its own hardware, or running 3 or 5 Master servers (where overlords or coordinators are running)\nand configuring ZooKeeper on them appropriately. See the ",(0,i.yg)("a",{parentName:"li",href:"https://zookeeper.apache.org/doc/current/zookeeperAdmin"},"ZooKeeper admin guide")," for more details."),(0,i.yg)("li",{parentName:"ul"},"For highly-available metadata storage, we recommend MySQL or PostgreSQL with replication and failover enabled.\nSee ",(0,i.yg)("a",{parentName:"li",href:"https://www.mysql.com/products/enterprise/high_availability.html"},"MySQL Enterprise High Availability")," and ",(0,i.yg)("a",{parentName:"li",href:"https://www.postgresql.org/docs/current/high-availability.html"},"PostgreSQL's High Availability, Load Balancing, and Replication")," for more information."),(0,i.yg)("li",{parentName:"ul"},"For highly-available Apache Druid Coordinators and Overlords, we recommend to run multiple servers.\nIf they are all configured to use the same ZooKeeper cluster and metadata storage,\nthen they will automatically failover between each other as necessary.\nOnly one will be active at a time, but inactive servers will redirect to the currently active server."),(0,i.yg)("li",{parentName:"ul"},"Druid Brokers can be scaled out and all running servers will be active and queryable.\nWe recommend placing them behind a load balancer.")))}m.isMDXComponent=!0}}]);