Modified: helix/site-content/1.0.2-docs/tutorial_cloud_support.html URL: http://svn.apache.org/viewvc/helix/site-content/1.0.2-docs/tutorial_cloud_support.html?rev=1900184&r1=1900183&r2=1900184&view=diff ============================================================================== --- helix/site-content/1.0.2-docs/tutorial_cloud_support.html (original) +++ helix/site-content/1.0.2-docs/tutorial_cloud_support.html Sat Apr 23 04:22:15 2022 @@ -1,200 +1,380 @@ - <!DOCTYPE html> + + <!-- - Generated by Apache Maven Doxia at 2022-04-23 - Rendered using Maven Reflow Skin 1.0.0 (http://andriusvelykis.github.com/reflow-maven-skin) + | Generated by Apache Maven Doxia Site Renderer 1.11.1 from src/site/markdown/tutorial_cloud_support.md at 2022-04-23 + | Rendered using Apache Maven Fluido Skin 1.11.0-SNAPSHOT --> -<html xml:lang="en" lang="en"> +<html xmlns="http://www.w3.org/1999/xhtml" lang="en"> + <head> + <meta charset="UTF-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1" /> + <meta name="generator" content="Apache Maven Doxia Site Renderer 1.11.1" /> + <title>Apache Helix – Tutorial - Cloud Support</title> + <link rel="stylesheet" href="./css/apache-maven-fluido-1.11.0-SNAPSHOT.min.css" /> + <link rel="stylesheet" href="./css/site.css" /> + <link rel="stylesheet" href="./css/print.css" media="print" /> + <script src="./js/apache-maven-fluido-1.11.0-SNAPSHOT.min.js"></script> +<script type="text/javascript"> + + var _gaq = _gaq || []; + _gaq.push(['_setAccount', 'UA-3211522-12']); + _gaq.push(['_trackPageview']); + + (function() { + var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; + ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; + var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); + })(); + + </script> + </head> + <body class="topBarEnabled"> + <header id="topbar" class="navbar navbar-fixed-top "> + <div class="navbar-inner"> + <div class="container-fluid"> + <a data-target=".nav-collapse" data-toggle="collapse" class="btn btn-navbar"> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </a> + <ul class="nav"> + <li class="dropdown"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown">Get Helix <b class="caret"></b></a> + <ul class="dropdown-menu"> + <li><a href="download.html" title="Download">Download</a></li> + <li><a href="Building.html" title="Building">Building</a></li> + <li><a href="releasenotes/release-1.0.2.html" title="Release Notes">Release Notes</a></li> + </ul> + </li> + <li class="dropdown"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown">Hands-On <b class="caret"></b></a> + <ul class="dropdown-menu"> + <li><a href="Quickstart.html" title="Quick Start">Quick Start</a></li> + <li><a href="Tutorial.html" title="Tutorial">Tutorial</a></li> + <li><a href="../javadocs/1.0.2" title="Javadocs">Javadocs</a></li> + </ul> + </li> + <li class="dropdown"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown">Recipes <b class="caret"></b></a> + <ul class="dropdown-menu"> + <li><a href="recipes/lock_manager.html" title="Distributed lock manager">Distributed lock manager</a></li> + <li><a href="recipes/rabbitmq_consumer_group.html" title="Rabbit MQ consumer group">Rabbit MQ consumer group</a></li> + <li><a href="recipes/rsync_replicated_file_store.html" title="Rsync replicated file store">Rsync replicated file store</a></li> + <li><a href="recipes/service_discovery.html" title="Service discovery">Service discovery</a></li> + <li><a href="recipes/task_dag_execution.html" title="Distributed task DAG execution">Distributed task DAG execution</a></li> + </ul> + </li> + </ul> + <ul class="nav pull-right"> + <li class="dropdown"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown">External Links <b class="caret"></b></a> + <ul class="dropdown-menu"> + <li><a href="index.html" title="Helix 1.0.2">Helix 1.0.2</a></li> + </ul> + </li> + </ul> + </div> + </div> + </header> + <div class="container-fluid"> + <header> + <div id="banner"> + <div class="pull-left"><a href="../" id="bannerLeft"><img src="../images/helix-logo.jpg" alt=""/></a></div> + <div class="pull-right"><a href="https://www.apache.org/" id="bannerRight"><img src="../images/feather_small.gif" alt=""/></a></div> + <div class="clear"><hr/></div> + </div> + + <div id="breadcrumbs"> + <ul class="breadcrumb"> + <li class=""><a href="http://helix.apache.org/" class="externalLink" title="Apache Helix">Apache Helix</a><span class="divider">/</span></li> + <li class=""><a href="../" title="Apache Helix">Apache Helix</a><span class="divider">/</span></li> + <li class=""><a href="./" title="Release 1.0.2">Release 1.0.2</a><span class="divider">/</span></li> + <li class="active ">Tutorial - Cloud Support</li> + <li id="publishDate" class="pull-right">Last Published: 2022-04-23</li> + </ul> + </div> + </header> + <div class="row-fluid"> + <header id="leftColumn" class="span2"> + <nav class="well sidebar-nav"> + <ul class="nav nav-list"> + <li class="nav-header">Get Helix</li> + <li><a href="download.html" title="Download"><span class="none"></span>Download</a></li> + <li><a href="Building.html" title="Building"><span class="none"></span>Building</a></li> + <li><a href="releasenotes/release-1.0.2.html" title="Release Notes"><span class="none"></span>Release Notes</a></li> + <li class="nav-header">Hands-On</li> + <li><a href="Quickstart.html" title="Quick Start"><span class="none"></span>Quick Start</a></li> + <li><a href="Tutorial.html" title="Tutorial"><span class="none"></span>Tutorial</a></li> + <li><a href="../javadocs/1.0.2" title="Javadocs"><span class="none"></span>Javadocs</a></li> + <li class="nav-header">Recipes</li> + <li><a href="recipes/lock_manager.html" title="Distributed lock manager"><span class="none"></span>Distributed lock manager</a></li> + <li><a href="recipes/rabbitmq_consumer_group.html" title="Rabbit MQ consumer group"><span class="none"></span>Rabbit MQ consumer group</a></li> + <li><a href="recipes/rsync_replicated_file_store.html" title="Rsync replicated file store"><span class="none"></span>Rsync replicated file store</a></li> + <li><a href="recipes/service_discovery.html" title="Service discovery"><span class="none"></span>Service discovery</a></li> + <li><a href="recipes/task_dag_execution.html" title="Distributed task DAG execution"><span class="none"></span>Distributed task DAG execution</a></li> + </ul> + </nav> + <div class="well sidebar-nav"> +<form id="search-form" action="https://www.google.com/search" method="get" > + <input value="helix.apache.org/1.0.2-docs" name="sitesearch" type="hidden"/> + <input class="search-query" name="q" id="query" type="text" /> +</form> +<script>asyncJs( 'https://cse.google.com/brand?form=search-form' )</script> + <hr /> + <div id="poweredBy"> + <div class="clear"></div> + <div id="twitter" style="border:none; margin-top: 10px"> + <a href="https://twitter.com/ApacheHelix" class="twitter-follow-button" data-show-count="false" data-align="left" data-size="medium" data-show-screen-name="true" data-lang="en">Follow ApacheHelix</a> + <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script> + </div> + <div class="clear"></div> + <div class="clear"></div> +<a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a> + </div> + </div> + </header> + <main id="bodyColumn" class="span10" > +<!--- +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +--> + +<section> +<h2><a name="Helix_Tutorial:_Cloud_Support"></a><a href="./Tutorial.html">Helix Tutorial</a>: Cloud Support</h2> +<p>There are emerging cases to use Helix in a cloud environment, especially in those well-known public cloud, e.g. Azure, AWS, GCP, etc. Compared to previous on premise use cases, Helix has faced both challenges and opportunities in providing cloud related support.</p> +<p>As a first step, Helix implemented the support for participant auto registration in a cloud environment, which leverages the common feature of public cloud and facilitates Helix users when they need to create a cluster and register the participants to the cluster.</p> +<p>After a Helix cluster is created, there are two ways to add instances (or participants, we will use them interchangeably in this tutorial) to the cluster. One is manual add, where users call their own scripts to add instance config to the cluster for each participant; and the other is auto join, where users set the auto join config of the cluster to be true, and each participant populates its own hostname, port number, and other information in instance config during connection. However, in an on premise environment, the auto join only works perfectly when users use Helix in a non rack-aware environment, meaning there is no fault domain concept. For a rack-aware environment, users still need to manually input the domain information to the instance config as it is hard for each participant to get its own fault domain information. Considering most users would use Helix in a rack-aware environment, it means manual work is still required.</p> +<p>In a cloud environment, there is a good opportunity to achieve full automation as public cloud providers give domain information to each individual instance through a metadata endpoint. All of the above mentioned public cloud providers use a unique non-routable IP address (169.254.169.254) for this purpose. It can be accessed only from within the instance to retrieve the instance metadata information, which you can use to configure or manage the running instance.</p> +<p>More specifically, in AWS, Azure, and GCP, the query to the fixed IP address <a class="externalLink" href="http://169.254.169.254/">http://169.254.169.254/</a> inside each instance will return its metadata information that contains domain information. In AWS, the field is named as “placement”; in Azure, the field is named as “PlatformUpdateDomain”; and in GCP, the field is named as “zone”. It is usually just an integer denoting which fault domain the instance belongs to. This particular feature of public cloud is leveraged by Helix in cluster creation and partition registration process.</p><section> +<h3><a name="What_Helix_Provides_for_Cloud_Environment"></a>What Helix Provides for Cloud Environment</h3> +<ul> + +<li>Provide definition of Helix cloud configs at cluster level and participant level</li> +<li>Provide enhanced REST and Java APIs for cluster creation and cloud config update</li> +<li>Provide generic interface for fetching and parsing cloud instance information</li> +<li>Provide the implementation of Azure cloud instance information processor</li> +<li>Provide the implementation of participant auto registration logic</li> +</ul></section><section> +<h3><a name="How_to_Use_Cloud_Support"></a>How to Use Cloud Support</h3> +<p>First of all, you need to make sure that your environment is indeed a cloud environment. Otherwise, all the assumptions in this support will not hold. Then depending on what kind of cloud environment you are in, you will need to perform some or all of the following steps.</p><section> +<h4><a name="Define_Cloud_config_at_Cluster_Level"></a>Define Cloud config at Cluster Level</h4> +<p>Helix provides cloud configs at two different levels, one is at cluster level, and the other is at participant level. We describe them separately.</p> +<p>At cluster level, we have a new Znode called CloudConfig. It has a few fields that store the relatively static cloud information for the whole cluster. Similar to other existing configs, Helix provides cloud config builder, validation, get/set functions. As the following table shows, the first two fields are required, and the last three fields are optional.</p> +<p><code>CLOUD_ENABLED</code> must be set to true if the user would like to use Helix cloud support. <code>CLOUD_PROVIDER</code> is the type of the cloud environment. Besides the few well-known public cloud providers, the user can also define his/her cloud environment as “CUSTOMIZED”. <code>CLOUD_ID</code> is an optional field. It can be used to record any specific metadata information the user would like to record, e.g. the ID for the particular cluster inside a cloud environment, etc. If the user chooses to use the provider that already has default implementations in Helix, e.g., Azure, he does not need to provide the last two fields, as Helix already provides the default value for these two fields in system property, which is considered as a bundle with Azure implementation that would be discussed later. If the user uses customized providers, or chooses some other cloud environment that has not been implemented in Helix yet, the user needs to provide the last two fi elds and/or <code>CLOUD_ID</code> depending on his/her usage.</p> +<table border="0" class="table table-striped"> +<thead> + +<tr class="a"> +<th>Field</th> +<th>Meaning</th></tr> +</thead><tbody> + +<tr class="b"> +<td align="left">CLOUD_ENABLED</td> +<td>determine whether the cluster is inside cloud environment and use Helix cloud support</td></tr> +<tr class="a"> +<td align="left">CLOUD_PROVIDER</td> +<td>denote what kind of cloud environment the cluster is in, e.g. Azure, AWS, GCP, or CUSTOMIZED</td></tr> +<tr class="b"> +<td align="left">CLOUD_ID</td> +<td>the specific id in cloud environment that belongs to this cluster</td></tr> +<tr class="a"> +<td align="left">CLOUD_INFO_SOURCE</td> +<td>the source for retrieving the cloud information.</td></tr> +<tr class="b"> +<td align="left">CLOUD_INFO_PROCESSOR_NAME</td> +<td>the name of the function that processes the fetching and parsing of cloud information</td></tr> +</tbody> +</table> +<p>Users could use either REST API or Java API to set these configs.</p><section> +<h5><a name="REST_API_Examples"></a>REST API Examples</h5> +<p>Helix enhanced current cluster creation REST API as well as Java API with extra fields that represent cloud related input. For example, in the following modified <code>createCluster</code> API, <code>addCloudConfig</code> is a Boolean value denotes whether to create with cloud config, and the <code>cloudConfigManifest</code> is the cloud config string, which will be converted to a Znode record.</p> + +<div class="source"><pre class="prettyprint"><code>@PUT + @Path("{clusterId}") + public Response createCluster(@PathParam("clusterId") String clusterId, @DefaultValue("false") @QueryParam("recreate") String recreate, + @DefaultValue("false") @QueryParam("addCloudConfig") String addCloudConfig, String cloudConfigManifest) +</code></pre></div> +<p>Besides the enhanced cluster creation API, Helix also provides a set of cloud specific APIs in Java and REST that handles the get/add/update of cloud config.</p> +<ul> + +<li>Create cluster and add meanwhile cloud config related information to ZK.</li> +</ul> + +<div class="source"><pre class="prettyprint"><code>$ curl -X PUT -H "Content-Type: application/json" http://localhost:1234/admin/v2/clusters/myCluster?addCloudConfig=true -d ' +{ + "simpleFields" : + { + "CLOUD_ENABLED" : "true", + "CLOUD_PROVIDER": "AWS", + "CLOUD_ID" : "12345" + "CLOUD_INFO_SOURCE": {"http://169.254.169.254/"} + "CLOUD_INFO_PROCESSOR_NAME": "AWSCloudInformationProcesser" + } +}' +</code></pre></div> +<ul> + +<li>Add cloud config to an existing cluster</li> +</ul> + +<div class="source"><pre class="prettyprint"><code>$ curl -X PUT -H "Content-Type: application/json" http://localhost:1234/admin/v2/clusters/myCluster/cloudconfig -d ' +{ + "simpleFields" : + { + "CLOUD_ENABLED" : "true", + "CLOUD_PROVIDER": "AWS", + "CLOUD_ID" : "12345" + "CLOUD_INFO_SOURCE": {"http://169.254.169.254/"} + "CLOUD_INFO_PROCESSOR_NAME": "AWSCloudInformationProcesser" + } +}' +</code></pre></div> +<ul> + +<li>Delete the cloud config of a cluster</li> +</ul> + +<div class="source"><pre class="prettyprint"><code>$ curl -X DELETE http://localhost:1234/admin/v2/clusters/myCluster/cloudconfig +</code></pre></div> +<ul> + +<li>Get the cloud config of a cluster</li> +</ul> + +<div class="source"><pre class="prettyprint"><code>$ curl -X GET http://localhost:1234/admin/v2/clusters/myCluster/cloudconfig +</code></pre></div> +<ul> + +<li>Update the cloud config of a cluster</li> +</ul> + +<div class="source"><pre class="prettyprint"><code>$ curl -X POST -H "Content-Type: application/json" http://localhost:1234/admin/v2/clusters/myCluster/cloudconfig?command=update -d ' +{ + "simpleFields" : { + "CLOUD_ID" : "12345" + } +}' +</code></pre></div> +<ul> + +<li>Delete some of the fields in the cloud config</li> +</ul> + +<div class="source"><pre class="prettyprint"><code>$ curl -X POST -H "Content-Type: application/json" http://localhost:1234/admin/v2/clusters/myCluster/cloudconfig?command=delete -d ' +{ + "simpleFields" : { + "CLOUD_ID" : "12345" + } +}' +</code></pre></div></section></section><section> +<h4><a name="Define_Cloud_Configs_at_Participant_Level"></a>Define Cloud Configs at Participant Level</h4> +<p>At participant level, Helix allows users to provide detailed cloud properties, which is more related to the participant’s actions. For default value, Helix provides <a class="externalLink" href="https://github.com/apache/helix/blob/master/helix-core/src/main/resources/azure-cloud.properties">Azure cloud properties</a>, including not only the default cluster level config values for Azure, like <code>CLOUD_INFO_SOURCE</code> and <code>CLOUD_INFO_PROCESSOR_NAME</code>, but also some participant specific values, such as http timeout when querying AIMS (Azure Instance Metadata Service) in Azure, max retry times, etc.</p> + +<div class="source"><pre class="prettyprint"><code>cloud_info_source=http://169.254.169.254/metadata/instance?api-version=2019-06-04 +cloud_info_processor_name=AzureCloudInstanceInformationProcessor +cloud_max_retry=5 +connection_timeout_ms=5000 +request_timeout_ms=5000 +</code></pre></div> +<p>If users would like to use their customized config for participants, they can input the specific properties through <a class="externalLink" href="https://github.com/apache/helix/blob/master/helix-core/src/main/java/org/apache/helix/HelixManagerProperty.java">Helix Manager Property</a> when composing <a class="externalLink" href="https://github.com/apache/helix/blob/master/helix-core/src/main/java/org/apache/helix/manager/zk/ZKHelixManager.java">Zk Helix Manager</a>, which is passed into participants. <a class="externalLink" href="https://github.com/apache/helix/blob/master/helix-core/src/main/java/org/apache/helix/HelixManagerProperty.java">Helix Manager Property</a> includes <a class="externalLink" href="https://github.com/apache/helix/blob/master/helix-core/src/main/java/org/apache/helix/HelixCloudProperty.java">Helix Cloud Property</a> which includes commonly used cloud properties and also any kind of user defined cloud properties.</p> + +<div class="source"><pre class="prettyprint"><code>public ZKHelixManager(String clusterName, String instanceName, InstanceType instanceType, + String zkAddress, HelixManagerStateListener stateListener, HelixManagerProperty helixManagerProperty) +</code></pre></div></section><section> +<h4><a name="Implement_Cloud_Instance_Information_.28if_necessary.29"></a>Implement Cloud Instance Information (if necessary)</h4> +<p>Helix has predefined a few fields in the interface of <a class="externalLink" href="https://github.com/apache/helix/blob/master/helix-core/src/main/java/org/apache/helix/api/cloud/CloudInstanceInformation.java">CloudInstanceInformation</a> that are commonly used in participant. Users are free to define other fields in the instance metadata that they think are useful.</p> + +<div class="source"><pre class="prettyprint"><code>public interface CloudInstanceInformation { + /** + * Get the the value of a specific cloud instance field by name + * @return the value of the field + */ + String get(String key); + + /** + * The enum contains all the required cloud instance field in Helix + */ + enum CloudInstanceField { + INSTANCE_NAME, + FAULT_DOMAIN, + INSTANCE_SET_NAME + } +} +</code></pre></div></section><section> +<h4><a name="Implement_Cloud_Instance_Information_Processor_.28if_necessary.29"></a>Implement Cloud Instance Information Processor (if necessary)</h4> +<p>Helix provides an interface to fetch and parse cloud instance information as follows. Helix makes the interface generic enough so that users may implement their own fetching and parsing logic with maximum freedom.</p> + +<div class="source"><pre class="prettyprint"><code>/** + * Generic interface to fetch and parse cloud instance information + */ +public interface CloudInstanceInformationProcessor<T extends Object> { + + /** + * Get the raw cloud instance information + * @return raw cloud instance information + */ + List<T> fetchCloudInstanceInformation(); + + /** + * Parse the raw cloud instance information in responses and compose required cloud instance information + * @return required cloud instance information + */ + CloudInstanceInformation parseCloudInstanceInformation(List<T> responses); +} +</code></pre></div> +<p>Helix also implements an example processor for Azure in <a class="externalLink" href="https://github.com/apache/helix/blob/master/helix-core/src/main/java/org/apache/helix/cloud/azure/AzureCloudInstanceInformationProcessor.java">AzureCloudInstanceInformationProcessor</a>. The implementation includes fetching and parsing Azure cloud instance information. The fetching function retrieves instance information from Azure AIMS, and the parsing function validates the response, and selects the fields needed for participant auto registration. If users would like to use Helix in an Azure environment, they do not need to implement it by themselves.</p> +<p>If users need to use Helix in another cloud environment, they can implement their own information processor. The implementation would be similar to Azure implementation, and the main difference would be in how to parse the response and retrieve interested fields.</p></section><section> +<h4><a name="Config_Properly_for_Participant_Auto_Registration_to_Work"></a>Config Properly for Participant Auto Registration to Work</h4> +<p>To make the participant auto registration work, users would need to make sure their cluster config is set properly. The most important one is the <code>allowParticipantAutoJoin</code> field in cluster config.</p> - <head> - <meta charset="UTF-8" /> - <title>Apache Helix – Tutorial - Cloud Support</title> - <meta name="viewport" content="width=device-width, initial-scale=1.0" /> - <meta name="description" content="" /> - <meta http-equiv="content-language" content="en" /> - - <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.2/css/bootstrap.min.css" rel="stylesheet" /> - <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.2/css/bootstrap-responsive.min.css" rel="stylesheet" /> - <link href="./css/docs.css" rel="stylesheet" /> - <link href="./css/reflow-skin.css" rel="stylesheet" /> - - - <link href="./css/lightbox.css" rel="stylesheet" /> - - <link href="./css/site.css" rel="stylesheet" /> - <link href="./css/print.css" rel="stylesheet" media="print" /> - - <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements --> - <!--[if lt IE 9]> - <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script> - <![endif]--> - - </head> - - <body class="page-$config.fileId project-$config.projectId" data-spy="scroll" data-offset="60" data-target="#toc-scroll-target"> - - <div class="navbar navbar-fixed-top"> - <div class="navbar-inner"> - <div class="container"> - <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </a> - <div class="nav-collapse"> - <ul class="nav pull-right"> - <li class="active"><a href="" title="Helix 1.0.2">Helix 1.0.2 </a></li> - <li class="dropdown active"> - <a href="#" class="dropdown-toggle" data-toggle="dropdown">Get Helix <b class="caret"></b></a> - <ul class="dropdown-menu"> - <li class="active"><a href="" title="Download">Download </a></li> - <li class="active"><a href="" title="Building">Building </a></li> - <li class="active"><a href="" title="Release Notes">Release Notes </a></li> - </ul> - </li> - <li class="dropdown active"> - <a href="#" class="dropdown-toggle" data-toggle="dropdown">Hands-On <b class="caret"></b></a> - <ul class="dropdown-menu"> - <li class="active"><a href="" title="Quick Start">Quick Start </a></li> - <li class="active"><a href="" title="Tutorial">Tutorial </a></li> - <li class="active"><a href="" title="Javadocs">Javadocs </a></li> - </ul> - </li> - <li class="dropdown active"> - <a href="#" class="dropdown-toggle" data-toggle="dropdown">Recipes <b class="caret"></b></a> - <ul class="dropdown-menu"> - <li class="active"><a href="" title="Distributed lock manager">Distributed lock manager </a></li> - <li class="active"><a href="" title="Rabbit MQ consumer group">Rabbit MQ consumer group </a></li> - <li class="active"><a href="" title="Rsync replicated file store">Rsync replicated file store </a></li> - <li class="active"><a href="" title="Service discovery">Service discovery </a></li> - <li class="active"><a href="" title="Distributed task DAG execution">Distributed task DAG execution </a></li> - </ul> - </li> - </ul> - </div><!--/.nav-collapse --> - </div> - </div> - </div> - - <div class="container"> - - <!-- Masthead - ================================================== --> - <header class="jumbotron subhead"> - <div class="row" id="banner"> - <div class="span12"> - <div class="pull-left"> - <a href="" id="bannerLeft"><img src="" alt='"''"' /></a> - </div> - <div class="pull-right"> - <a href="http://www.apache.org/" id="bannerRight"><img src="" alt='"''"' /></a> - </div> - </div> - </div> - <div> - <ul class="breadcrumb"> - <li><a href="" title="Apache Helix">Apache Helix </a></li> - <li class="divider">/</li> - <li><a href="" title="Release 1.0.2">Release 1.0.2 </a></li> - <li class="divider">/</li> - <li>Tutorial - Cloud Support</li> - <li class="publishDate version-date pull-right">Last Published: 2022-04-23</li> - </ul> - </div> - </header> - - <div class="main-body"> - <div class="row"> - <div class="span12"> - <div class="body-content"> -$bodyWithHeader - </div> - </div> - </div> - </div> - - </div><!-- /container --> - - <!-- Footer - ================================================== --> - <footer class="well"> - <div class="container"> - <div class="row"> - <div class="span9 bottom-nav"> - <ul class="nav nav-list"> - <li class="nav-header">Get Helix</li> - <li class="active"> - <a href="#" title="Download">Download </a> - </li> - <li class="active"> - <a href="#" title="Building">Building </a> - </li> - <li class="active"> - <a href="#" title="Release Notes">Release Notes </a> - </li> - <li class="nav-header">Hands-On</li> - <li class="active"> - <a href="#" title="Quick Start">Quick Start </a> - </li> - <li class="active"> - <a href="#" title="Tutorial">Tutorial </a> - </li> - <li class="active"> - <a href="#" title="Javadocs">Javadocs </a> - </li> - <li class="nav-header">Recipes</li> - <li class="active"> - <a href="#" title="Distributed lock manager">Distributed lock manager </a> - </li> - <li class="active"> - <a href="#" title="Rabbit MQ consumer group">Rabbit MQ consumer group </a> - </li> - <li class="active"> - <a href="#" title="Rsync replicated file store">Rsync replicated file store </a> - </li> - <li class="active"> - <a href="#" title="Service discovery">Service discovery </a> - </li> - <li class="active"> - <a href="#" title="Distributed task DAG execution">Distributed task DAG execution </a> - </li> - </ul> - </div> - </div> - </div> - </footer> - - <div class="container subfooter"> - <div class="row"> - <div class="span12"> - <p class="pull-right"><a href="#">Back to top</a></p> - <p class="copyright">Copyright ©2022 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All Rights Reserved.</p> - <p><a href="http://github.com/andriusvelykis/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> by <a href="http://andrius.velykis.lt" target="_blank" title="Andrius Velykis">Andrius Velykis</a>.</p> - </div> - </div> - </div> - - <!-- Le javascript - ================================================== --> - <!-- Placed at the end of the document so the pages load faster --> - - <!-- Fallback jQuery loading from Google CDN: - http://stackoverflow.com/questions/1014203/best-way-to-use-googles-hosted-jquery-but-fall-back-to-my-hosted-library-on-go --> - <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> - <script type="text/javascript"> - if (typeof jQuery == 'undefined') - { - document.write(unescape("%3Cscript src='./js/jquery-1.8.3.min.js' type='text/javascript'%3E%3C/script%3E")); - } - </script> - - <script src="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.2/js/bootstrap.min.js"></script> - <script src="./js/lightbox.js"></script> - <script src="./js/jquery.smooth-scroll.min.js"></script> - <!-- back button support for smooth scroll --> - <script src="./js/jquery.ba-bbq.min.js"></script> - - <script src="./js/reflow-skin.js"></script> - - </body> +<div class="source"><pre class="prettyprint"><code>{ + "id": "clusterName", + "listFields": {}, + "mapFields": {}, + "simpleFields": { + ...... + "allowParticipantAutoJoin": "true" + ...... + } +} +</code></pre></div> +<p>This field is used in participant manager logic as a prerequisite for participants to do auto registration. The detailed logic is shown in the following flow chart. The related code is in <a class="externalLink" href="https://github.com/apache/helix/blob/master/helix-core/src/main/java/org/apache/helix/manager/zk/ParticipantManager.java">Participant Manager</a>.</p> +<p><img src="./images/ParticipantAutoRegistrationLogic.png" alt="Participant Auto Registration Logic" /></p> +<p>If the participant decides that it should do auto registration based on the config, it will first query cloud config and decide what environment it is in. Based on this information, the participant will call the corresponding cloud instance information processor. Then with all the information, especially the domain information, the participant can auto register to the cluster without any manual effort.</p></section></section></section> + </main> + </div> + </div> + <hr/> + <footer> + <div class="container-fluid"> + <div class="row-fluid"> +<div class="row span16"><div>Apache Helix, Apache, the Apache feather logo, and the Apache Helix project logos are trademarks of The Apache Software Foundation. + All other marks mentioned may be trademarks or registered trademarks of their respective owners.</div> + <a href="https://helix.apache.org/1.0.2-docs/privacy-policy.html">Privacy Policy</a> + </div> + </div> + </div> + </footer> +<script> + if(anchors) { + anchors.add(); + } +</script> + </body> </html> \ No newline at end of file
Modified: helix/site-content/1.0.2-docs/tutorial_controller.html URL: http://svn.apache.org/viewvc/helix/site-content/1.0.2-docs/tutorial_controller.html?rev=1900184&r1=1900183&r2=1900184&view=diff ============================================================================== --- helix/site-content/1.0.2-docs/tutorial_controller.html (original) +++ helix/site-content/1.0.2-docs/tutorial_controller.html Sat Apr 23 04:22:15 2022 @@ -1,200 +1,285 @@ - <!DOCTYPE html> + + <!-- - Generated by Apache Maven Doxia at 2022-04-23 - Rendered using Maven Reflow Skin 1.0.0 (http://andriusvelykis.github.com/reflow-maven-skin) + | Generated by Apache Maven Doxia Site Renderer 1.11.1 from src/site/markdown/tutorial_controller.md at 2022-04-23 + | Rendered using Apache Maven Fluido Skin 1.11.0-SNAPSHOT +--> +<html xmlns="http://www.w3.org/1999/xhtml" lang="en"> + <head> + <meta charset="UTF-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1" /> + <meta name="generator" content="Apache Maven Doxia Site Renderer 1.11.1" /> + <title>Apache Helix – Tutorial - Controller</title> + <link rel="stylesheet" href="./css/apache-maven-fluido-1.11.0-SNAPSHOT.min.css" /> + <link rel="stylesheet" href="./css/site.css" /> + <link rel="stylesheet" href="./css/print.css" media="print" /> + <script src="./js/apache-maven-fluido-1.11.0-SNAPSHOT.min.js"></script> +<script type="text/javascript"> + + var _gaq = _gaq || []; + _gaq.push(['_setAccount', 'UA-3211522-12']); + _gaq.push(['_trackPageview']); + + (function() { + var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; + ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; + var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); + })(); + + </script> + </head> + <body class="topBarEnabled"> + <header id="topbar" class="navbar navbar-fixed-top "> + <div class="navbar-inner"> + <div class="container-fluid"> + <a data-target=".nav-collapse" data-toggle="collapse" class="btn btn-navbar"> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </a> + <ul class="nav"> + <li class="dropdown"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown">Get Helix <b class="caret"></b></a> + <ul class="dropdown-menu"> + <li><a href="download.html" title="Download">Download</a></li> + <li><a href="Building.html" title="Building">Building</a></li> + <li><a href="releasenotes/release-1.0.2.html" title="Release Notes">Release Notes</a></li> + </ul> + </li> + <li class="dropdown"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown">Hands-On <b class="caret"></b></a> + <ul class="dropdown-menu"> + <li><a href="Quickstart.html" title="Quick Start">Quick Start</a></li> + <li><a href="Tutorial.html" title="Tutorial">Tutorial</a></li> + <li><a href="../javadocs/1.0.2" title="Javadocs">Javadocs</a></li> + </ul> + </li> + <li class="dropdown"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown">Recipes <b class="caret"></b></a> + <ul class="dropdown-menu"> + <li><a href="recipes/lock_manager.html" title="Distributed lock manager">Distributed lock manager</a></li> + <li><a href="recipes/rabbitmq_consumer_group.html" title="Rabbit MQ consumer group">Rabbit MQ consumer group</a></li> + <li><a href="recipes/rsync_replicated_file_store.html" title="Rsync replicated file store">Rsync replicated file store</a></li> + <li><a href="recipes/service_discovery.html" title="Service discovery">Service discovery</a></li> + <li><a href="recipes/task_dag_execution.html" title="Distributed task DAG execution">Distributed task DAG execution</a></li> + </ul> + </li> + </ul> + <ul class="nav pull-right"> + <li class="dropdown"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown">External Links <b class="caret"></b></a> + <ul class="dropdown-menu"> + <li><a href="index.html" title="Helix 1.0.2">Helix 1.0.2</a></li> + </ul> + </li> + </ul> + </div> + </div> + </header> + <div class="container-fluid"> + <header> + <div id="banner"> + <div class="pull-left"><a href="../" id="bannerLeft"><img src="../images/helix-logo.jpg" alt=""/></a></div> + <div class="pull-right"><a href="https://www.apache.org/" id="bannerRight"><img src="../images/feather_small.gif" alt=""/></a></div> + <div class="clear"><hr/></div> + </div> + + <div id="breadcrumbs"> + <ul class="breadcrumb"> + <li class=""><a href="http://helix.apache.org/" class="externalLink" title="Apache Helix">Apache Helix</a><span class="divider">/</span></li> + <li class=""><a href="../" title="Apache Helix">Apache Helix</a><span class="divider">/</span></li> + <li class=""><a href="./" title="Release 1.0.2">Release 1.0.2</a><span class="divider">/</span></li> + <li class="active ">Tutorial - Controller</li> + <li id="publishDate" class="pull-right">Last Published: 2022-04-23</li> + </ul> + </div> + </header> + <div class="row-fluid"> + <header id="leftColumn" class="span2"> + <nav class="well sidebar-nav"> + <ul class="nav nav-list"> + <li class="nav-header">Get Helix</li> + <li><a href="download.html" title="Download"><span class="none"></span>Download</a></li> + <li><a href="Building.html" title="Building"><span class="none"></span>Building</a></li> + <li><a href="releasenotes/release-1.0.2.html" title="Release Notes"><span class="none"></span>Release Notes</a></li> + <li class="nav-header">Hands-On</li> + <li><a href="Quickstart.html" title="Quick Start"><span class="none"></span>Quick Start</a></li> + <li><a href="Tutorial.html" title="Tutorial"><span class="none"></span>Tutorial</a></li> + <li><a href="../javadocs/1.0.2" title="Javadocs"><span class="none"></span>Javadocs</a></li> + <li class="nav-header">Recipes</li> + <li><a href="recipes/lock_manager.html" title="Distributed lock manager"><span class="none"></span>Distributed lock manager</a></li> + <li><a href="recipes/rabbitmq_consumer_group.html" title="Rabbit MQ consumer group"><span class="none"></span>Rabbit MQ consumer group</a></li> + <li><a href="recipes/rsync_replicated_file_store.html" title="Rsync replicated file store"><span class="none"></span>Rsync replicated file store</a></li> + <li><a href="recipes/service_discovery.html" title="Service discovery"><span class="none"></span>Service discovery</a></li> + <li><a href="recipes/task_dag_execution.html" title="Distributed task DAG execution"><span class="none"></span>Distributed task DAG execution</a></li> + </ul> + </nav> + <div class="well sidebar-nav"> +<form id="search-form" action="https://www.google.com/search" method="get" > + <input value="helix.apache.org/1.0.2-docs" name="sitesearch" type="hidden"/> + <input class="search-query" name="q" id="query" type="text" /> +</form> +<script>asyncJs( 'https://cse.google.com/brand?form=search-form' )</script> + <hr /> + <div id="poweredBy"> + <div class="clear"></div> + <div id="twitter" style="border:none; margin-top: 10px"> + <a href="https://twitter.com/ApacheHelix" class="twitter-follow-button" data-show-count="false" data-align="left" data-size="medium" data-show-screen-name="true" data-lang="en">Follow ApacheHelix</a> + <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script> + </div> + <div class="clear"></div> + <div class="clear"></div> +<a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a> + </div> + </div> + </header> + <main id="bodyColumn" class="span10" > +<!--- +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. --> -<html xml:lang="en" lang="en"> - <head> - <meta charset="UTF-8" /> - <title>Apache Helix – Tutorial - Controller</title> - <meta name="viewport" content="width=device-width, initial-scale=1.0" /> - <meta name="description" content="" /> - <meta http-equiv="content-language" content="en" /> - - <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.2/css/bootstrap.min.css" rel="stylesheet" /> - <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.2/css/bootstrap-responsive.min.css" rel="stylesheet" /> - <link href="./css/docs.css" rel="stylesheet" /> - <link href="./css/reflow-skin.css" rel="stylesheet" /> - - - <link href="./css/lightbox.css" rel="stylesheet" /> - - <link href="./css/site.css" rel="stylesheet" /> - <link href="./css/print.css" rel="stylesheet" media="print" /> - - <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements --> - <!--[if lt IE 9]> - <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script> - <![endif]--> - - </head> - - <body class="page-$config.fileId project-$config.projectId" data-spy="scroll" data-offset="60" data-target="#toc-scroll-target"> - - <div class="navbar navbar-fixed-top"> - <div class="navbar-inner"> - <div class="container"> - <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </a> - <div class="nav-collapse"> - <ul class="nav pull-right"> - <li class="active"><a href="" title="Helix 1.0.2">Helix 1.0.2 </a></li> - <li class="dropdown active"> - <a href="#" class="dropdown-toggle" data-toggle="dropdown">Get Helix <b class="caret"></b></a> - <ul class="dropdown-menu"> - <li class="active"><a href="" title="Download">Download </a></li> - <li class="active"><a href="" title="Building">Building </a></li> - <li class="active"><a href="" title="Release Notes">Release Notes </a></li> - </ul> - </li> - <li class="dropdown active"> - <a href="#" class="dropdown-toggle" data-toggle="dropdown">Hands-On <b class="caret"></b></a> - <ul class="dropdown-menu"> - <li class="active"><a href="" title="Quick Start">Quick Start </a></li> - <li class="active"><a href="" title="Tutorial">Tutorial </a></li> - <li class="active"><a href="" title="Javadocs">Javadocs </a></li> - </ul> - </li> - <li class="dropdown active"> - <a href="#" class="dropdown-toggle" data-toggle="dropdown">Recipes <b class="caret"></b></a> - <ul class="dropdown-menu"> - <li class="active"><a href="" title="Distributed lock manager">Distributed lock manager </a></li> - <li class="active"><a href="" title="Rabbit MQ consumer group">Rabbit MQ consumer group </a></li> - <li class="active"><a href="" title="Rsync replicated file store">Rsync replicated file store </a></li> - <li class="active"><a href="" title="Service discovery">Service discovery </a></li> - <li class="active"><a href="" title="Distributed task DAG execution">Distributed task DAG execution </a></li> - </ul> - </li> - </ul> - </div><!--/.nav-collapse --> - </div> - </div> - </div> - - <div class="container"> - - <!-- Masthead - ================================================== --> - <header class="jumbotron subhead"> - <div class="row" id="banner"> - <div class="span12"> - <div class="pull-left"> - <a href="" id="bannerLeft"><img src="" alt='"''"' /></a> - </div> - <div class="pull-right"> - <a href="http://www.apache.org/" id="bannerRight"><img src="" alt='"''"' /></a> - </div> - </div> - </div> - <div> - <ul class="breadcrumb"> - <li><a href="" title="Apache Helix">Apache Helix </a></li> - <li class="divider">/</li> - <li><a href="" title="Release 1.0.2">Release 1.0.2 </a></li> - <li class="divider">/</li> - <li>Tutorial - Controller</li> - <li class="publishDate version-date pull-right">Last Published: 2022-04-23</li> - </ul> - </div> - </header> - - <div class="main-body"> - <div class="row"> - <div class="span12"> - <div class="body-content"> -$bodyWithHeader - </div> - </div> - </div> - </div> - - </div><!-- /container --> - - <!-- Footer - ================================================== --> - <footer class="well"> - <div class="container"> - <div class="row"> - <div class="span9 bottom-nav"> - <ul class="nav nav-list"> - <li class="nav-header">Get Helix</li> - <li class="active"> - <a href="#" title="Download">Download </a> - </li> - <li class="active"> - <a href="#" title="Building">Building </a> - </li> - <li class="active"> - <a href="#" title="Release Notes">Release Notes </a> - </li> - <li class="nav-header">Hands-On</li> - <li class="active"> - <a href="#" title="Quick Start">Quick Start </a> - </li> - <li class="active"> - <a href="#" title="Tutorial">Tutorial </a> - </li> - <li class="active"> - <a href="#" title="Javadocs">Javadocs </a> - </li> - <li class="nav-header">Recipes</li> - <li class="active"> - <a href="#" title="Distributed lock manager">Distributed lock manager </a> - </li> - <li class="active"> - <a href="#" title="Rabbit MQ consumer group">Rabbit MQ consumer group </a> - </li> - <li class="active"> - <a href="#" title="Rsync replicated file store">Rsync replicated file store </a> - </li> - <li class="active"> - <a href="#" title="Service discovery">Service discovery </a> - </li> - <li class="active"> - <a href="#" title="Distributed task DAG execution">Distributed task DAG execution </a> - </li> - </ul> - </div> - </div> - </div> - </footer> - - <div class="container subfooter"> - <div class="row"> - <div class="span12"> - <p class="pull-right"><a href="#">Back to top</a></p> - <p class="copyright">Copyright ©2022 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All Rights Reserved.</p> - <p><a href="http://github.com/andriusvelykis/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> by <a href="http://andrius.velykis.lt" target="_blank" title="Andrius Velykis">Andrius Velykis</a>.</p> - </div> - </div> - </div> - - <!-- Le javascript - ================================================== --> - <!-- Placed at the end of the document so the pages load faster --> - - <!-- Fallback jQuery loading from Google CDN: - http://stackoverflow.com/questions/1014203/best-way-to-use-googles-hosted-jquery-but-fall-back-to-my-hosted-library-on-go --> - <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> - <script type="text/javascript"> - if (typeof jQuery == 'undefined') - { - document.write(unescape("%3Cscript src='./js/jquery-1.8.3.min.js' type='text/javascript'%3E%3C/script%3E")); - } - </script> - - <script src="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.2/js/bootstrap.min.js"></script> - <script src="./js/lightbox.js"></script> - <script src="./js/jquery.smooth-scroll.min.js"></script> - <!-- back button support for smooth scroll --> - <script src="./js/jquery.ba-bbq.min.js"></script> - - <script src="./js/reflow-skin.js"></script> - - </body> +<section> +<h2><a name="Helix_Tutorial:_Controller"></a><a href="./Tutorial.html">Helix Tutorial</a>: Controller</h2> +<p>Next, let's implement the controller. This is the brain of the cluster. Helix makes sure there is exactly one active controller running the cluster.</p><section> +<h3><a name="Start_a_Connection"></a>Start a Connection</h3> +<p>The Helix manager requires the following parameters:</p> +<ul> + +<li>clusterName: A logical name to represent the group of nodes</li> +<li>instanceName: A logical name of the process creating the manager instance. Generally this is host:port</li> +<li>instanceType: Type of the process. This can be one of the following types, in this case use CONTROLLER: +<ul> + +<li>CONTROLLER: Process that controls the cluster, any number of controllers can be started but only one will be active at any given time</li> +<li>PARTICIPANT: Process that performs the actual task in the distributed system</li> +<li>SPECTATOR: Process that observes the changes in the cluster</li> +<li>ADMIN: To carry out system admin actions</li> +</ul> +</li> +<li>zkConnectString: Connection string to ZooKeeper. This is of the form host1:port1,host2:port2,host3:port3</li> +</ul> + +<div class="source"><pre class="prettyprint"><code>manager = HelixManagerFactory.getZKHelixManager(clusterName, + instanceName, + instanceType, + zkConnectString); +</code></pre></div></section><section> +<h3><a name="Controller_Code"></a>Controller Code</h3> +<p>The Controller needs to know about all changes in the cluster. Helix takes care of this with the default implementation. +If you need additional functionality, see GenericHelixController on how to configure the pipeline.</p> + +<div class="source"><pre class="prettyprint"><code>manager = HelixManagerFactory.getZKHelixManager(clusterName, + instanceName, + InstanceType.CONTROLLER, + zkConnectString); +manager.connect(); +</code></pre></div> +<p>The snippet above shows how the controller is started. You can also start the controller using command line interface.</p> + +<div class="source"><pre class="prettyprint"><code>cd helix/helix-core/target/helix-core-pkg/bin +./run-helix-controller.sh --zkSvr <Zookeeper ServerAddress (Required)> --cluster <Cluster name (Required)> +</code></pre></div></section><section> +<h3><a name="Controller_Deployment_Modes"></a>Controller Deployment Modes</h3> +<p>Helix provides multiple options to deploy the controller.</p><section> +<h4><a name="STANDALONE"></a>STANDALONE</h4> +<p>The Controller can be started as a separate process to manage a cluster. This is the recommended approach. However, since one controller can be a single point of failure, multiple controller processes are required for reliability. Even if multiple controllers are running, only one will be actively managing the cluster at any time and is decided by a leader-election process. If the leader fails, another leader will take over managing the cluster.</p> +<p>Even though we recommend this method of deployment, it has the drawback of having to manage an additional service for each cluster. See the Controller as a Service option.</p></section><section> +<h4><a name="EMBEDDED"></a>EMBEDDED</h4> +<p>If setting up a separate controller process is not viable, then it is possible to embed the controller as a library in each of the participants.</p></section><section> +<h4><a name="CONTROLLER_AS_A_SERVICE"></a>CONTROLLER AS A SERVICE</h4> +<p>One of the cool features we added in Helix was to use a set of controllers to manage a large number of clusters.</p> +<p>For example if you have X clusters to be managed, instead of deploying X*3 (3 controllers for fault tolerance) controllers for each cluster, one can deploy just 3 controllers. Each controller can manage X/3 clusters. If any controller fails, the remaining two will manage X/2 clusters.</p> +<p>Next, let's implement the controller. This is the brain of the cluster. Helix makes sure there is exactly one active controller running the cluster.</p></section></section><section> +<h3><a name="Start_the_Helix_agent"></a>Start the Helix agent</h3> +<p>It requires the following parameters:</p> +<ul> + +<li>clusterName: A logical name to represent the group of nodes</li> +<li>instanceName: A logical name of the process creating the manager instance. Generally this is host:port.</li> +<li>instanceType: Type of the process. This can be one of the following types, in this case use CONTROLLER: +<ul> + +<li>CONTROLLER: Process that controls the cluster, any number of controllers can be started but only one will be active at any given time.</li> +<li>PARTICIPANT: Process that performs the actual task in the distributed system.</li> +<li>SPECTATOR: Process that observes the changes in the cluster.</li> +<li>ADMIN: To carry out system admin actions.</li> +</ul> +</li> +<li>zkConnectString: Connection string to Zookeeper. This is of the form host1:port1,host2:port2,host3:port3.</li> +</ul> + +<div class="source"><pre class="prettyprint"><code> manager = HelixManagerFactory.getZKHelixManager(clusterName, + instanceName, + instanceType, + zkConnectString); +</code></pre></div></section><section> +<h3><a name="Controller_Code"></a>Controller Code</h3> +<p>The Controller needs to know about all changes in the cluster. Helix takes care of this with the default implementation. +If you need additional functionality, see GenericHelixController on how to configure the pipeline.</p> + +<div class="source"><pre class="prettyprint"><code> manager = HelixManagerFactory.getZKHelixManager(clusterName, + instanceName, + InstanceType.CONTROLLER, + zkConnectString); + manager.connect(); + GenericHelixController controller = new GenericHelixController(); + manager.addControllerListener(controller); + manager.addInstanceConfigChangeListener(controller); + manager.addResourceConfigChangeListener(controller); + manager.addClusterfigChangeListener(controller); + manager.addCustomizedStateConfigChangeListener(controller); + manager.addLiveInstanceChangeListener(controller); + manager.addIdealStateChangeListener(controller); +</code></pre></div> +<p>The snippet above shows how the controller is started. You can also start the controller using command line interface.</p> + +<div class="source"><pre class="prettyprint"><code>cd helix/helix-core/target/helix-core-pkg/bin +./run-helix-controller.sh --zkSvr <Zookeeper ServerAddress (Required)> --cluster <Cluster name (Required)> +</code></pre></div></section><section> +<h3><a name="Controller_Deployment_Modes"></a>Controller Deployment Modes</h3> +<p>Helix provides multiple options to deploy the controller.</p><section> +<h4><a name="STANDALONE"></a>STANDALONE</h4> +<p>The Controller can be started as a separate process to manage a cluster. This is the recommended approach. However, since one controller can be a single point of failure, multiple controller processes are required for reliability. Even if multiple controllers are running, only one will be actively managing the cluster at any time and is decided by a leader-election process. If the leader fails, another leader will take over managing the cluster.</p> +<p>Even though we recommend this method of deployment, it has the drawback of having to manage an additional service for each cluster. See Controller As a Service option.</p></section><section> +<h4><a name="EMBEDDED"></a>EMBEDDED</h4> +<p>If setting up a separate controller process is not viable, then it is possible to embed the controller as a library in each of the participants.</p></section><section> +<h4><a name="CONTROLLER_AS_A_SERVICE"></a>CONTROLLER AS A SERVICE</h4> +<p>One of the cool features we added in Helix is to use a set of controllers to manage a large number of clusters.</p> +<p>For example if you have X clusters to be managed, instead of deploying X*3 (3 controllers for fault tolerance) controllers for each cluster, one can deploy just 3 controllers. Each controller can manage X/3 clusters. If any controller fails, the remaining two will manage X/2 clusters.</p></section></section></section> + </main> + </div> + </div> + <hr/> + <footer> + <div class="container-fluid"> + <div class="row-fluid"> +<div class="row span16"><div>Apache Helix, Apache, the Apache feather logo, and the Apache Helix project logos are trademarks of The Apache Software Foundation. + All other marks mentioned may be trademarks or registered trademarks of their respective owners.</div> + <a href="https://helix.apache.org/1.0.2-docs/privacy-policy.html">Privacy Policy</a> + </div> + </div> + </div> + </footer> +<script> + if(anchors) { + anchors.add(); + } +</script> + </body> </html> \ No newline at end of file
