Modified: helix/site-content/1.0.3-docs/tutorial_user_content_store.html URL: http://svn.apache.org/viewvc/helix/site-content/1.0.3-docs/tutorial_user_content_store.html?rev=1900255&r1=1900254&r2=1900255&view=diff ============================================================================== --- helix/site-content/1.0.3-docs/tutorial_user_content_store.html (original) +++ helix/site-content/1.0.3-docs/tutorial_user_content_store.html Mon Apr 25 08:18:23 2022 @@ -1,7 +1,13 @@ <!DOCTYPE html> + + + + + + <!-- - Generated by Apache Maven Doxia at 2022-04-23 Rendered using Reflow Maven Skin 2.0.0-SNAPSHOT (https://andriusvelykis.github.io/reflow-maven-skin) + Generated by Apache Maven Doxia at 2022-04-25 Rendered using Reflow Maven Skin 2.0.0 (https://olamy.github.io/reflow-maven-skin) --> <html xml:lang="en" lang="en"> @@ -29,24 +35,31 @@ <![endif]--> - <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> + +<!-- Matomo --> +<script> + var _paq = window._paq = window._paq || []; + _paq.push(['disableCookies']); + _paq.push(['trackPageView']); + _paq.push(['enableLinkTracking']); + + (function() { + var u="https://analytics.apache.org"; + _paq.push(['setTrackerUrl', u+'/matomo.php']); + _paq.push(['setSiteId', '15']); + var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; + g.async=true; g.src=u+'/matomo.js'; s.parentNode.insertBefore(g,s); + })(); +</script> +<!-- End Matomo Code --> + </head> <body class="page-tutorial_user_content_store project-103-docs" data-spy="scroll" data-offset="60" data-target="#toc-scroll-target"> + <div class="navbar navbar-fixed-top"> <div class="navbar-inner"> <div class="container"> @@ -119,7 +132,7 @@ <li><a href="./" title="Release 1.0.3">Release 1.0.3</a></li> <li class="divider">/</li> <li>Tutorial - User Defined Content Store for Tasks</li> - <li class="publishDate version-date pull-right">Last Published: 2022-04-23</li> + <li class="publishDate version-date pull-right">Last Published: 2022-04-25</li> </ul> </div> </header> @@ -179,14 +192,14 @@ under the License. <pre><code> private static class ContentStoreTask extends UserContentStore implements Task { @Override public TaskResult run() { // put values into the store - putUserContent("ContentTest", "Value1", Scope.JOB); - putUserContent("ContentTest", "Value2", Scope.WORKFLOW); - putUserContent("ContentTest", "Value3", Scope.TASK); + putUserContent("ContentTest", "Value1", Scope.JOB); + putUserContent("ContentTest", "Value2", Scope.WORKFLOW); + putUserContent("ContentTest", "Value3", Scope.TASK); // get the values with the same key in the different scopes - if (!getUserContent("ContentTest", Scope.JOB).equals("Value1") || - !getUserContent("ContentTest", Scope.WORKFLOW).equals("Value2") || - !getUserContent("ContentTest", Scope.TASK).equals("Value3")) { + if (!getUserContent("ContentTest", Scope.JOB).equals("Value1") || + !getUserContent("ContentTest", Scope.WORKFLOW).equals("Value2") || + !getUserContent("ContentTest", Scope.TASK).equals("Value3")) { return new TaskResult(TaskResult.Status.FAILED, null); } @@ -266,7 +279,7 @@ under the License. <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="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> by <a href="https://andrius.velykis.lt" target="_blank" title="Andrius Velykis">Andrius Velykis</a>.</p> + <p><a href="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> maintained by <a href="https://twitter.com/olamy" target="_blank" title="Olivier Lamy">Olivier Lamy</a>.</p> <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.3-docs/privacy-policy.html">Privacy Policy</a>
Modified: helix/site-content/1.0.3-docs/tutorial_user_def_rebalancer.html URL: http://svn.apache.org/viewvc/helix/site-content/1.0.3-docs/tutorial_user_def_rebalancer.html?rev=1900255&r1=1900254&r2=1900255&view=diff ============================================================================== --- helix/site-content/1.0.3-docs/tutorial_user_def_rebalancer.html (original) +++ helix/site-content/1.0.3-docs/tutorial_user_def_rebalancer.html Mon Apr 25 08:18:23 2022 @@ -1,7 +1,13 @@ <!DOCTYPE html> + + + + + + <!-- - Generated by Apache Maven Doxia at 2022-04-23 Rendered using Reflow Maven Skin 2.0.0-SNAPSHOT (https://andriusvelykis.github.io/reflow-maven-skin) + Generated by Apache Maven Doxia at 2022-04-25 Rendered using Reflow Maven Skin 2.0.0 (https://olamy.github.io/reflow-maven-skin) --> <html xml:lang="en" lang="en"> @@ -29,24 +35,31 @@ <![endif]--> - <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> + +<!-- Matomo --> +<script> + var _paq = window._paq = window._paq || []; + _paq.push(['disableCookies']); + _paq.push(['trackPageView']); + _paq.push(['enableLinkTracking']); + + (function() { + var u="https://analytics.apache.org"; + _paq.push(['setTrackerUrl', u+'/matomo.php']); + _paq.push(['setSiteId', '15']); + var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; + g.async=true; g.src=u+'/matomo.js'; s.parentNode.insertBefore(g,s); + })(); +</script> +<!-- End Matomo Code --> + </head> <body class="page-tutorial_user_def_rebalancer project-103-docs" data-spy="scroll" data-offset="60" data-target="#toc-scroll-target"> + <div class="navbar navbar-fixed-top"> <div class="navbar-inner"> <div class="container"> @@ -119,7 +132,7 @@ <li><a href="./" title="Release 1.0.3">Release 1.0.3</a></li> <li class="divider">/</li> <li>Tutorial - User-Defined Rebalancing</li> - <li class="publishDate version-date pull-right">Last Published: 2022-04-23</li> + <li class="publishDate version-date pull-right">Last Published: 2022-04-25</li> </ul> </div> </header> @@ -216,12 +229,12 @@ IdealState computeNewIdealState(String r </ul> <div class="source"> <pre><code>{ - "lock_0": ["Participant_A"], - "lock_1": ["Participant_A"], - "lock_2": ["Participant_A"], - "lock_3": ["Participant_A"], - "lock_4": ["Participant_A"], - "lock_5": ["Participant_A"], + "lock_0": ["Participant_A"], + "lock_1": ["Participant_A"], + "lock_2": ["Participant_A"], + "lock_3": ["Participant_A"], + "lock_4": ["Participant_A"], + "lock_5": ["Participant_A"], } </code></pre> </div> @@ -231,12 +244,12 @@ IdealState computeNewIdealState(String r </ul> <div class="source"> <pre><code>{ - "lock_0": ["Participant_A"], - "lock_1": ["Participant_B"], - "lock_2": ["Participant_A"], - "lock_3": ["Participant_B"], - "lock_4": ["Participant_A"], - "lock_5": ["Participant_B"], + "lock_0": ["Participant_A"], + "lock_1": ["Participant_B"], + "lock_2": ["Participant_A"], + "lock_3": ["Participant_B"], + "lock_4": ["Participant_A"], + "lock_5": ["Participant_B"], } </code></pre> </div> @@ -246,27 +259,27 @@ IdealState computeNewIdealState(String r </ul> <div class="source"> <pre><code>{ - "lock_0": ["Participant_A"], - "lock_1": ["Participant_B"], - "lock_2": ["Participant_C"], - "lock_3": ["Participant_A"], - "lock_4": ["Participant_B"], - "lock_5": ["Participant_C"], + "lock_0": ["Participant_A"], + "lock_1": ["Participant_B"], + "lock_2": ["Participant_C"], + "lock_3": ["Participant_A"], + "lock_4": ["Participant_B"], + "lock_5": ["Participant_C"], } </code></pre> </div> - <p>This is the steady state of the system. Notice that four of the six locks now have a different owner. That is because of the naïve modulus-based assignmemt approach used by the user-defined rebalancer. However, the interface is flexible enough to allow you to employ consistent hashing or any other scheme if minimal movement is a system requirement.</p> + <p>This is the steady state of the system. Notice that four of the six locks now have a different owner. That is because of the naïve modulus-based assignmemt approach used by the user-defined rebalancer. However, the interface is flexible enough to allow you to employ consistent hashing or any other scheme if minimal movement is a system requirement.</p> <ul> <li>Participant_B fails</li> </ul> <div class="source"> <pre><code>{ - "lock_0": ["Participant_A"], - "lock_1": ["Participant_C"], - "lock_2": ["Participant_A"], - "lock_3": ["Participant_C"], - "lock_4": ["Participant_A"], - "lock_5": ["Participant_C"], + "lock_0": ["Participant_A"], + "lock_1": ["Participant_C"], + "lock_2": ["Participant_A"], + "lock_3": ["Participant_C"], + "lock_4": ["Participant_A"], + "lock_5": ["Participant_C"], } </code></pre> </div> @@ -276,12 +289,12 @@ IdealState computeNewIdealState(String r </ul> <div class="source"> <pre><code>{ - "lock_0": ["Participant_A"], - "lock_1": ["Participant_B"], - "lock_2": ["Participant_C"], - "lock_3": ["Participant_A"], - "lock_4": ["Participant_B"], - "lock_5": ["Participant_C"], + "lock_0": ["Participant_A"], + "lock_1": ["Participant_B"], + "lock_2": ["Participant_C"], + "lock_3": ["Participant_A"], + "lock_4": ["Participant_B"], + "lock_5": ["Participant_C"], } </code></pre> </div> @@ -365,7 +378,7 @@ IdealState computeNewIdealState(String r <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="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> by <a href="https://andrius.velykis.lt" target="_blank" title="Andrius Velykis">Andrius Velykis</a>.</p> + <p><a href="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> maintained by <a href="https://twitter.com/olamy" target="_blank" title="Olivier Lamy">Olivier Lamy</a>.</p> <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.3-docs/privacy-policy.html">Privacy Policy</a> Modified: helix/site-content/1.0.3-docs/tutorial_yaml.html URL: http://svn.apache.org/viewvc/helix/site-content/1.0.3-docs/tutorial_yaml.html?rev=1900255&r1=1900254&r2=1900255&view=diff ============================================================================== --- helix/site-content/1.0.3-docs/tutorial_yaml.html (original) +++ helix/site-content/1.0.3-docs/tutorial_yaml.html Mon Apr 25 08:18:23 2022 @@ -1,7 +1,13 @@ <!DOCTYPE html> + + + + + + <!-- - Generated by Apache Maven Doxia at 2022-04-23 Rendered using Reflow Maven Skin 2.0.0-SNAPSHOT (https://andriusvelykis.github.io/reflow-maven-skin) + Generated by Apache Maven Doxia at 2022-04-25 Rendered using Reflow Maven Skin 2.0.0 (https://olamy.github.io/reflow-maven-skin) --> <html xml:lang="en" lang="en"> @@ -29,24 +35,31 @@ <![endif]--> - <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> + +<!-- Matomo --> +<script> + var _paq = window._paq = window._paq || []; + _paq.push(['disableCookies']); + _paq.push(['trackPageView']); + _paq.push(['enableLinkTracking']); + + (function() { + var u="https://analytics.apache.org"; + _paq.push(['setTrackerUrl', u+'/matomo.php']); + _paq.push(['setSiteId', '15']); + var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; + g.async=true; g.src=u+'/matomo.js'; s.parentNode.insertBefore(g,s); + })(); +</script> +<!-- End Matomo Code --> + </head> <body class="page-tutorial_yaml project-103-docs" data-spy="scroll" data-offset="60" data-target="#toc-scroll-target"> + <div class="navbar navbar-fixed-top"> <div class="navbar-inner"> <div class="container"> @@ -119,7 +132,7 @@ <li><a href="./" title="Release 1.0.3">Release 1.0.3</a></li> <li class="divider">/</li> <li>Tutorial - YAML Cluster Setup</li> - <li class="publishDate version-date pull-right">Last Published: 2022-04-23</li> + <li class="publishDate version-date pull-right">Last Published: 2022-04-25</li> </ul> </div> </header> @@ -185,11 +198,11 @@ resources: state: counts: # maximum number of replicas of a partition that can be in each state (required if model not built-in) - name: LOCKED - count: "1" + count: "1" - name: RELEASED - count: "-1" + count: "-1" - name: DROPPED - count: "-1" + count: "-1" priorityList: [LOCKED, RELEASED, DROPPED] # states in order of priority (all priorities equal if not specified) transition: # transitions priority to enforce order that transitions occur priorityList: [Unlock, Lock, Undrop, DropUnlock, DropLock] # all priorities equal if not specified @@ -215,7 +228,7 @@ participants: # list of nodes that can s <pre><code>YAMLClusterSetup setup = new YAMLClusterSetup(zkAddress); InputStream input = Thread.currentThread().getContextClassLoader() - .getResourceAsStream("lock-manager-config.yaml"); + .getResourceAsStream("lock-manager-config.yaml"); YAMLClusterSetup.YAMLClusterConfig config = setup.setupCluster(input); </code></pre> </div> @@ -294,7 +307,7 @@ YAMLClusterSetup.YAMLClusterConfig confi <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="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> by <a href="https://andrius.velykis.lt" target="_blank" title="Andrius Velykis">Andrius Velykis</a>.</p> + <p><a href="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> maintained by <a href="https://twitter.com/olamy" target="_blank" title="Olivier Lamy">Olivier Lamy</a>.</p> <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.3-docs/privacy-policy.html">Privacy Policy</a> Modified: helix/site-content/Architecture.html URL: http://svn.apache.org/viewvc/helix/site-content/Architecture.html?rev=1900255&r1=1900254&r2=1900255&view=diff ============================================================================== --- helix/site-content/Architecture.html (original) +++ helix/site-content/Architecture.html Mon Apr 25 08:18:23 2022 @@ -1,7 +1,13 @@ <!DOCTYPE html> + + + + + + <!-- - Generated by Apache Maven Doxia Rendered using Reflow Maven Skin 2.0.0-SNAPSHOT (https://andriusvelykis.github.io/reflow-maven-skin) + Generated by Apache Maven Doxia Rendered using Reflow Maven Skin 2.0.0 (https://olamy.github.io/reflow-maven-skin) --> <html xml:lang="en" lang="en"> @@ -29,24 +35,31 @@ <![endif]--> - <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> + +<!-- Matomo --> +<script> + var _paq = window._paq = window._paq || []; + _paq.push(['disableCookies']); + _paq.push(['trackPageView']); + _paq.push(['enableLinkTracking']); + + (function() { + var u="https://analytics.apache.org"; + _paq.push(['setTrackerUrl', u+'/matomo.php']); + _paq.push(['setSiteId', '15']); + var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; + g.async=true; g.src=u+'/matomo.js'; s.parentNode.insertBefore(g,s); + })(); +</script> +<!-- End Matomo Code --> + </head> <body class="page-architecture project-website" data-spy="scroll" data-offset="60" data-target="#toc-scroll-target"> + <div class="navbar navbar-fixed-top"> <div class="navbar-inner"> <div class="container"> @@ -190,7 +203,7 @@ under the License. <li>A service discovery mechanism to route requests</li> </ul> <p>To build such a system, we need a mechanism to coordinate between different nodes and other components in the system. This mechanism can be achieved with software that reacts to any change in the cluster and comes up with a set of tasks needed to bring the cluster to a stable state. The set of tasks will be assigned to one or more nodes in the cluster. Helix serves this purpose of managing the various components in the cluster.</p> - <p><img src="images/system.png" alt="Helix Design" /></p> + <p><img src="images/system.png" alt="Helix Design"></p> </section> <section> <h2 id="Distributed_System_Components">Distributed System Components</h2> @@ -205,7 +218,7 @@ under the License. </section> <section> <h2 id="Roles">Roles</h2> - <p><img src="images/HELIX-components.png" alt="Helix Design" /></p> + <p><img src="images/HELIX-components.png" alt="Helix Design"></p> <p>Not all nodes in a distributed system will perform similar functionalities. For example, a few nodes might be serving requests and a few nodes might be sending requests, and some other nodes might be controlling the nodes in the cluster. Thus, Helix categorizes nodes by their specific roles in the system.</p> <p>Helix divides nodes into 3 logical components based on their responsibilities:</p> <ol style="list-style-type: decimal"> @@ -257,7 +270,7 @@ MASTER | SLAVE | SLAVE | N/A | </code></pre> </div> - <p><img src="images/statemachine.png" alt="Helix Design" /></p> + <p><img src="images/statemachine.png" alt="Helix Design"></p> </section> <section> <h2 id="Concepts">Concepts</h2> @@ -353,7 +366,7 @@ MASTER | SLAVE | SLAVE | N/A | <section> <h3 id="Interaction_between_the_Controller.2C_Participant_and_Spectator">Interaction between the Controller, Participant and Spectator</h3> <p>The following picture shows how Controllers, Participants and Spectators interact with each other.</p> - <p><img src="images/helix-architecture.png" alt="Helix Architecture" /></p> + <p><img src="images/helix-architecture.png" alt="Helix Architecture"></p> </section> </section> <section> @@ -405,7 +418,7 @@ MASTER | SLAVE | SLAVE | N/A | <li>PARTICIPANT: contains participant scope configurations</li> </ul> <p>The following image shows an example of the Helix ZNode layout for a cluster named âtest-clusterâ:</p> - <p><img src="images/helix-znode-layout.png" alt="Helix znode layout" /></p> + <p><img src="images/helix-znode-layout.png" alt="Helix znode layout"></p> </section> </div> </div> @@ -527,7 +540,7 @@ MASTER | SLAVE | SLAVE | N/A | <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="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> by <a href="https://andrius.velykis.lt" target="_blank" title="Andrius Velykis">Andrius Velykis</a>.</p> + <p><a href="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> maintained by <a href="https://twitter.com/olamy" target="_blank" title="Olivier Lamy">Olivier Lamy</a>.</p> <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/privacy-policy.html">Privacy Policy</a> Modified: helix/site-content/ClientLibraries.html URL: http://svn.apache.org/viewvc/helix/site-content/ClientLibraries.html?rev=1900255&r1=1900254&r2=1900255&view=diff ============================================================================== --- helix/site-content/ClientLibraries.html (original) +++ helix/site-content/ClientLibraries.html Mon Apr 25 08:18:23 2022 @@ -1,7 +1,13 @@ <!DOCTYPE html> + + + + + + <!-- - Generated by Apache Maven Doxia Rendered using Reflow Maven Skin 2.0.0-SNAPSHOT (https://andriusvelykis.github.io/reflow-maven-skin) + Generated by Apache Maven Doxia Rendered using Reflow Maven Skin 2.0.0 (https://olamy.github.io/reflow-maven-skin) --> <html xml:lang="en" lang="en"> @@ -29,24 +35,31 @@ <![endif]--> - <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> + +<!-- Matomo --> +<script> + var _paq = window._paq = window._paq || []; + _paq.push(['disableCookies']); + _paq.push(['trackPageView']); + _paq.push(['enableLinkTracking']); + + (function() { + var u="https://analytics.apache.org"; + _paq.push(['setTrackerUrl', u+'/matomo.php']); + _paq.push(['setSiteId', '15']); + var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; + g.async=true; g.src=u+'/matomo.js'; s.parentNode.insertBefore(g,s); + })(); +</script> +<!-- End Matomo Code --> + </head> <body class="page-clientlibraries project-website" data-spy="scroll" data-offset="60" data-target="#toc-scroll-target"> + <div class="navbar navbar-fixed-top"> <div class="navbar-inner"> <div class="container"> @@ -318,7 +331,7 @@ under the License. <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="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> by <a href="https://andrius.velykis.lt" target="_blank" title="Andrius Velykis">Andrius Velykis</a>.</p> + <p><a href="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> maintained by <a href="https://twitter.com/olamy" target="_blank" title="Olivier Lamy">Olivier Lamy</a>.</p> <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/privacy-policy.html">Privacy Policy</a> Modified: helix/site-content/Concepts.html URL: http://svn.apache.org/viewvc/helix/site-content/Concepts.html?rev=1900255&r1=1900254&r2=1900255&view=diff ============================================================================== --- helix/site-content/Concepts.html (original) +++ helix/site-content/Concepts.html Mon Apr 25 08:18:23 2022 @@ -1,7 +1,13 @@ <!DOCTYPE html> + + + + + + <!-- - Generated by Apache Maven Doxia Rendered using Reflow Maven Skin 2.0.0-SNAPSHOT (https://andriusvelykis.github.io/reflow-maven-skin) + Generated by Apache Maven Doxia Rendered using Reflow Maven Skin 2.0.0 (https://olamy.github.io/reflow-maven-skin) --> <html xml:lang="en" lang="en"> @@ -29,24 +35,31 @@ <![endif]--> - <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> + +<!-- Matomo --> +<script> + var _paq = window._paq = window._paq || []; + _paq.push(['disableCookies']); + _paq.push(['trackPageView']); + _paq.push(['enableLinkTracking']); + + (function() { + var u="https://analytics.apache.org"; + _paq.push(['setTrackerUrl', u+'/matomo.php']); + _paq.push(['setSiteId', '15']); + var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; + g.async=true; g.src=u+'/matomo.js'; s.parentNode.insertBefore(g,s); + })(); +</script> +<!-- End Matomo Code --> + </head> <body class="page-concepts project-website" data-spy="scroll" data-offset="60" data-target="#toc-scroll-target"> + <div class="navbar navbar-fixed-top"> <div class="navbar-inner"> <div class="container"> @@ -188,18 +201,18 @@ under the License. <h3 id="Ideal_State">Ideal State</h3> <p>An <b>IdealState</b> allows one to map tasks to location and state. A standard way of expressing this in Helix is as follows:</p> <div class="source"> - <pre><code>"TASK_NAME" : { - "LOCATION" : "STATE" + <pre><code>"TASK_NAME" : { + "LOCATION" : "STATE" } </code></pre> </div> - <p>Consider a simple case where you want to launch a resource "myTask" on node "N1". The IdealState for this can be expressed as follows:</p> + <p>Consider a simple case where you want to launch a resource "myTask" on node "N1". The IdealState for this can be expressed as follows:</p> <div class="source"> <pre><code>{ - "id" : "MyTask", - "mapFields" : { - "myTask" : { - "N1" : "ONLINE", + "id" : "MyTask", + "mapFields" : { + "myTask" : { + "N1" : "ONLINE", } } } @@ -209,22 +222,22 @@ under the License. <section> <h3 id="Partition">Partition</h3> <p>If this task get too big to fit on one box, you might want to divide it into subtasks. Each subtask is referred to as a <b>partition</b> in Helix. Let's say you want to divide the task into 3 subtasks/partitions, the IdealState can be changed as shown below.</p> - <p>"myTask_0", "myTask_1", "myTask_2" are logical names representing the partitions of myTask. Each tasks runs on N1, N2 and N3 respectively.</p> + <p>"myTask_0", "myTask_1", "myTask_2" are logical names representing the partitions of myTask. Each tasks runs on N1, N2 and N3 respectively.</p> <div class="source"> <pre><code>{ - "id" : "myTask", - "simpleFields" : { - "NUM_PARTITIONS" : "3", + "id" : "myTask", + "simpleFields" : { + "NUM_PARTITIONS" : "3", } - "mapFields" : { - "myTask_0" : { - "N1" : "ONLINE", + "mapFields" : { + "myTask_0" : { + "N1" : "ONLINE", }, - "myTask_1" : { - "N2" : "ONLINE", + "myTask_1" : { + "N2" : "ONLINE", }, - "myTask_2" : { - "N3" : "ONLINE", + "myTask_2" : { + "N3" : "ONLINE", } } } @@ -238,23 +251,23 @@ under the License. <p>For increasing the availability of the system, it's better to place the replica of a given partition on different nodes.</p> <div class="source"> <pre><code>{ - "id" : "myIndex", - "simpleFields" : { - "NUM_PARTITIONS" : "3", - "REPLICAS" : "2", + "id" : "myIndex", + "simpleFields" : { + "NUM_PARTITIONS" : "3", + "REPLICAS" : "2", }, - "mapFields" : { - "myIndex_0" : { - "N1" : "ONLINE", - "N2" : "ONLINE" + "mapFields" : { + "myIndex_0" : { + "N1" : "ONLINE", + "N2" : "ONLINE" }, - "myIndex_1" : { - "N2" : "ONLINE", - "N3" : "ONLINE" + "myIndex_1" : { + "N2" : "ONLINE", + "N3" : "ONLINE" }, - "myIndex_2" : { - "N3" : "ONLINE", - "N1" : "ONLINE" + "myIndex_2" : { + "N3" : "ONLINE", + "N1" : "ONLINE" } } } @@ -267,15 +280,15 @@ under the License. <p>Helix allows one to assign different <b>states</b> to each replica. Let's say you have two MySQL instances N1 and N2, where one will serve as MASTER and another as SLAVE. The IdealState can be changed to:</p> <div class="source"> <pre><code>{ - "id" : "myDB", - "simpleFields" : { - "NUM_PARTITIONS" : "1", - "REPLICAS" : "2", + "id" : "myDB", + "simpleFields" : { + "NUM_PARTITIONS" : "1", + "REPLICAS" : "2", }, - "mapFields" : { - "myDB" : { - "N1" : "MASTER", - "N2" : "SLAVE", + "mapFields" : { + "myDB" : { + "N1" : "MASTER", + "N2" : "SLAVE", } } } @@ -309,16 +322,16 @@ MASTER | SLAVE | SLAVE | N/A | <p>Helix allows each resource to be associated with one state machine. This means you can have one resource as an index and another as a database in the same cluster. One can associate each resource with a state machine as follows:</p> <div class="source"> <pre><code>{ - "id" : "myDB", - "simpleFields" : { - "NUM_PARTITIONS" : "1", - "REPLICAS" : "2", - "STATE_MODEL_DEF_REF" : "MasterSlave", + "id" : "myDB", + "simpleFields" : { + "NUM_PARTITIONS" : "1", + "REPLICAS" : "2", + "STATE_MODEL_DEF_REF" : "MasterSlave", }, - "mapFields" : { - "myDB" : { - "N1" : "MASTER", - "N2" : "SLAVE", + "mapFields" : { + "myDB" : { + "N1" : "MASTER", + "N2" : "SLAVE", } } } @@ -335,21 +348,21 @@ MASTER | SLAVE | SLAVE | N/A | </ul> <div class="source"> <pre><code>{ - "id":"MyResource" - ,"simpleFields":{ - ,"SESSION_ID":"13d0e34675e0002" - ,"INSTANCE_NAME":"node1" - ,"STATE_MODEL_DEF":"MasterSlave" + "id":"MyResource" + ,"simpleFields":{ + ,"SESSION_ID":"13d0e34675e0002" + ,"INSTANCE_NAME":"node1" + ,"STATE_MODEL_DEF":"MasterSlave" } - ,"mapFields":{ - "MyResource_0":{ - "CURRENT_STATE":"SLAVE" + ,"mapFields":{ + "MyResource_0":{ + "CURRENT_STATE":"SLAVE" } - ,"MyResource_1":{ - "CURRENT_STATE":"MASTER" + ,"MyResource_1":{ + "CURRENT_STATE":"MASTER" } - ,"MyResource_2":{ - "CURRENT_STATE":"MASTER" + ,"MyResource_2":{ + "CURRENT_STATE":"MASTER" } } } @@ -362,22 +375,22 @@ MASTER | SLAVE | SLAVE | N/A | <p>In order to communicate with the participants, external clients need to know the current state of each of the participants. The external clients are referred to as <b>spectators</b>. In order to make the life of spectator simple, Helix provides an ExternalView that is an aggregated view of the current state across all nodes. The ExternalView has a similar format as IdealState.</p> <div class="source"> <pre><code>{ - "id":"MyResource", - "mapFields":{ - "MyResource_0":{ - "N1":"SLAVE", - "N2":"MASTER", - "N3":"OFFLINE" + "id":"MyResource", + "mapFields":{ + "MyResource_0":{ + "N1":"SLAVE", + "N2":"MASTER", + "N3":"OFFLINE" }, - "MyResource_1":{ - "N1":"MASTER", - "N2":"SLAVE", - "N3":"ERROR" + "MyResource_1":{ + "N1":"MASTER", + "N2":"SLAVE", + "N3":"ERROR" }, - "MyResource_2":{ - "N1":"MASTER", - "N2":"SLAVE", - "N3":"SLAVE" + "MyResource_2":{ + "N1":"MASTER", + "N2":"SLAVE", + "N3":"SLAVE" } } } @@ -408,7 +421,7 @@ MASTER | SLAVE | SLAVE | N/A | <p>Helix allows various granularities of control for adjusting the ideal state. Whenever a cluster event occurs, Helix can operate in one of three modes:</p> <ul> <li><b>FULL_AUTO</b>: Helix will automatically determine the location and state of each replica based on constraints</li> - <li><b>SEMI_AUTO</b>: Helix will take in a "preference list" representing the location each replica can live at, and automatically determine the state based on constraints</li> + <li><b>SEMI_AUTO</b>: Helix will take in a "preference list" representing the location each replica can live at, and automatically determine the state based on constraints</li> <li><b>CUSTOMIZED</b>: Helix will take in a map of location to state and fire transitions to get the external view to match</li> </ul> <p>Helix comes with a few algorithms to automatically compute the IdealState based on the constraints. For example, if you have a resource of 3 partitions and 2 replicas, Helix can automatically compute the IdealState based on the nodes that are currently active. See the <a href="./0.6.4-docs/tutorial_rebalance.html">tutorial</a> to find out more about various execution modes of Helix like FULL_AUTO, SEMI_AUTO and CUSTOMIZED.</p> @@ -534,7 +547,7 @@ MASTER | SLAVE | SLAVE | N/A | <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="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> by <a href="https://andrius.velykis.lt" target="_blank" title="Andrius Velykis">Andrius Velykis</a>.</p> + <p><a href="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> maintained by <a href="https://twitter.com/olamy" target="_blank" title="Olivier Lamy">Olivier Lamy</a>.</p> <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/privacy-policy.html">Privacy Policy</a> Modified: helix/site-content/IRC.html URL: http://svn.apache.org/viewvc/helix/site-content/IRC.html?rev=1900255&r1=1900254&r2=1900255&view=diff ============================================================================== --- helix/site-content/IRC.html (original) +++ helix/site-content/IRC.html Mon Apr 25 08:18:23 2022 @@ -1,7 +1,13 @@ <!DOCTYPE html> + + + + + + <!-- - Generated by Apache Maven Doxia Rendered using Reflow Maven Skin 2.0.0-SNAPSHOT (https://andriusvelykis.github.io/reflow-maven-skin) + Generated by Apache Maven Doxia Rendered using Reflow Maven Skin 2.0.0 (https://olamy.github.io/reflow-maven-skin) --> <html xml:lang="en" lang="en"> @@ -29,24 +35,31 @@ <![endif]--> - <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> + +<!-- Matomo --> +<script> + var _paq = window._paq = window._paq || []; + _paq.push(['disableCookies']); + _paq.push(['trackPageView']); + _paq.push(['enableLinkTracking']); + + (function() { + var u="https://analytics.apache.org"; + _paq.push(['setTrackerUrl', u+'/matomo.php']); + _paq.push(['setSiteId', '15']); + var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; + g.async=true; g.src=u+'/matomo.js'; s.parentNode.insertBefore(g,s); + })(); +</script> +<!-- End Matomo Code --> + </head> <body class="page-irc project-website" data-spy="scroll" data-offset="60" data-target="#toc-scroll-target"> + <div class="navbar navbar-fixed-top"> <div class="navbar-inner"> <div class="container"> @@ -181,8 +194,7 @@ under the License. <p>We're often available on the <code>#apachehelix</code> channel on the <code>chat.freenode.net</code> server. You can use your favorite IRC client or the web client below to connect.</p> <section> <h3 id="Web_IRC_Client">Web IRC Client</h3> - <p>To connect to our channel, just enter a username below.</p> - <iframe src="http://webchat.freenode.net/?channels=apachehelix" style="width: 100%; height: 500px; border: none;"></iframe></section></section> + <p>To connect to our channel, just enter a username below.</p> <iframe src="http://webchat.freenode.net/?channels=apachehelix" style="width: 100%; height: 500px; border: none;"></iframe> </section> </section> </div> @@ -305,7 +317,7 @@ under the License. <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="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> by <a href="https://andrius.velykis.lt" target="_blank" title="Andrius Velykis">Andrius Velykis</a>.</p> + <p><a href="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> maintained by <a href="https://twitter.com/olamy" target="_blank" title="Olivier Lamy">Olivier Lamy</a>.</p> <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/privacy-policy.html">Privacy Policy</a> Modified: helix/site-content/Publications.html URL: http://svn.apache.org/viewvc/helix/site-content/Publications.html?rev=1900255&r1=1900254&r2=1900255&view=diff ============================================================================== --- helix/site-content/Publications.html (original) +++ helix/site-content/Publications.html Mon Apr 25 08:18:23 2022 @@ -1,7 +1,13 @@ <!DOCTYPE html> + + + + + + <!-- - Generated by Apache Maven Doxia Rendered using Reflow Maven Skin 2.0.0-SNAPSHOT (https://andriusvelykis.github.io/reflow-maven-skin) + Generated by Apache Maven Doxia Rendered using Reflow Maven Skin 2.0.0 (https://olamy.github.io/reflow-maven-skin) --> <html xml:lang="en" lang="en"> @@ -29,24 +35,31 @@ <![endif]--> - <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> + +<!-- Matomo --> +<script> + var _paq = window._paq = window._paq || []; + _paq.push(['disableCookies']); + _paq.push(['trackPageView']); + _paq.push(['enableLinkTracking']); + + (function() { + var u="https://analytics.apache.org"; + _paq.push(['setTrackerUrl', u+'/matomo.php']); + _paq.push(['setSiteId', '15']); + var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; + g.async=true; g.src=u+'/matomo.js'; s.parentNode.insertBefore(g,s); + })(); +</script> +<!-- End Matomo Code --> + </head> <body class="page-publications project-website" data-spy="scroll" data-offset="60" data-target="#toc-scroll-target"> + <div class="navbar navbar-fixed-top"> <div class="navbar-inner"> <div class="container"> @@ -317,7 +330,7 @@ under the License. <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="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> by <a href="https://andrius.velykis.lt" target="_blank" title="Andrius Velykis">Andrius Velykis</a>.</p> + <p><a href="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> maintained by <a href="https://twitter.com/olamy" target="_blank" title="Olivier Lamy">Olivier Lamy</a>.</p> <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/privacy-policy.html">Privacy Policy</a> Modified: helix/site-content/UseCases.html URL: http://svn.apache.org/viewvc/helix/site-content/UseCases.html?rev=1900255&r1=1900254&r2=1900255&view=diff ============================================================================== --- helix/site-content/UseCases.html (original) +++ helix/site-content/UseCases.html Mon Apr 25 08:18:23 2022 @@ -1,7 +1,13 @@ <!DOCTYPE html> + + + + + + <!-- - Generated by Apache Maven Doxia Rendered using Reflow Maven Skin 2.0.0-SNAPSHOT (https://andriusvelykis.github.io/reflow-maven-skin) + Generated by Apache Maven Doxia Rendered using Reflow Maven Skin 2.0.0 (https://olamy.github.io/reflow-maven-skin) --> <html xml:lang="en" lang="en"> @@ -29,24 +35,31 @@ <![endif]--> - <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> + +<!-- Matomo --> +<script> + var _paq = window._paq = window._paq || []; + _paq.push(['disableCookies']); + _paq.push(['trackPageView']); + _paq.push(['enableLinkTracking']); + + (function() { + var u="https://analytics.apache.org"; + _paq.push(['setTrackerUrl', u+'/matomo.php']); + _paq.push(['setSiteId', '15']); + var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; + g.async=true; g.src=u+'/matomo.js'; s.parentNode.insertBefore(g,s); + })(); +</script> +<!-- End Matomo Code --> + </head> <body class="page-usecases project-website" data-spy="scroll" data-offset="60" data-target="#toc-scroll-target"> + <div class="navbar navbar-fixed-top"> <div class="navbar-inner"> <div class="container"> @@ -245,7 +258,7 @@ ONLINE | OFFLINE | N/A | <p>LinkedIn�s Search-as-a-service lets internal customers define custom indexes on a chosen dataset and then makes those indexes searchable via a service API. The index service runs on a cluster of machines. The index is broken into partitions and each partition has a configured number of replicas. Each cluster server runs an instance of the Sensei system (an online index store) and hosts index partitions. Each new indexing service gets assigned to a set of servers, and the partition replicas must be evenly distributed across those servers.</p> <section> <h3 id="State_model">State model</h3> - <p><img src="images/bootstrap_statemodel.gif" alt="Helix Design" /></p> + <p><img src="images/bootstrap_statemodel.gif" alt="Helix Design"></p> </section> </section> </div> @@ -368,7 +381,7 @@ ONLINE | OFFLINE | N/A | <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="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> by <a href="https://andrius.velykis.lt" target="_blank" title="Andrius Velykis">Andrius Velykis</a>.</p> + <p><a href="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> maintained by <a href="https://twitter.com/olamy" target="_blank" title="Olivier Lamy">Olivier Lamy</a>.</p> <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/privacy-policy.html">Privacy Policy</a> Modified: helix/site-content/design/crush-ed.html URL: http://svn.apache.org/viewvc/helix/site-content/design/crush-ed.html?rev=1900255&r1=1900254&r2=1900255&view=diff ============================================================================== --- helix/site-content/design/crush-ed.html (original) +++ helix/site-content/design/crush-ed.html Mon Apr 25 08:18:23 2022 @@ -1,7 +1,13 @@ <!DOCTYPE html> + + + + + + <!-- - Generated by Apache Maven Doxia Rendered using Reflow Maven Skin 2.0.0-SNAPSHOT (https://andriusvelykis.github.io/reflow-maven-skin) + Generated by Apache Maven Doxia Rendered using Reflow Maven Skin 2.0.0 (https://olamy.github.io/reflow-maven-skin) --> <html xml:lang="en" lang="en"> @@ -29,24 +35,31 @@ <![endif]--> - <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> + +<!-- Matomo --> +<script> + var _paq = window._paq = window._paq || []; + _paq.push(['disableCookies']); + _paq.push(['trackPageView']); + _paq.push(['enableLinkTracking']); + + (function() { + var u="https://analytics.apache.org"; + _paq.push(['setTrackerUrl', u+'/matomo.php']); + _paq.push(['setSiteId', '15']); + var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; + g.async=true; g.src=u+'/matomo.js'; s.parentNode.insertBefore(g,s); + })(); +</script> +<!-- End Matomo Code --> + </head> <body class="page-design-crush-ed project-website" data-spy="scroll" data-offset="60" data-target="#toc-scroll-target"> + <div class="navbar navbar-fixed-top"> <div class="navbar-inner"> <div class="container"> @@ -180,11 +193,11 @@ </ul> </li> </ul> <h1>Overview</h1> -<p>CRUSH (or MultiRoundCRUSH) algorithm ensures consistent partition distribution. It is based on pseudo-random partition placement. When the number of placed items (in our case the partitions) approaches infinity, the distribution approaches perfectly uniform.<br /> However, it behaves the worst with a small number of placed items. Especially, for those single tenant clusters with a small number of partitions, we may experience un-evenly partition distributions over instances in the cluster.<br /> According to the data we collected from our PROD environment, distribution calculated by CRUSH is not satisfying. About 50% difference between the heavy loaded nodes and the light loaded nodes. Even with MultiRoundCRUSH, the difference is still about 30%.</p> +<p>CRUSH (or MultiRoundCRUSH) algorithm ensures consistent partition distribution. It is based on pseudo-random partition placement. When the number of placed items (in our case the partitions) approaches infinity, the distribution approaches perfectly uniform.<br> However, it behaves the worst with a small number of placed items. Especially, for those single tenant clusters with a small number of partitions, we may experience un-evenly partition distributions over instances in the cluster.<br> According to the data we collected from our PROD environment, distribution calculated by CRUSH is not satisfying. About 50% difference between the heavy loaded nodes and the light loaded nodes. Even with MultiRoundCRUSH, the difference is still about 30%.</p> <p>Alternatively, card dealing strategy generates more even distribution in this cases. However, comparing it with CRUSH, there will be much more extra partition movements ( A movement is âextraâ if the host instance has one partition out and another partition in) when the cluster topology is changed. The legacy AutoRebalanceStrategy, which is also based on card dealing, resolves this issue by taking the current mapping as an input. And it only changes the mapping for the delta part. It means the algorithm is not deterministic. Worse, it does not support fault zone configuration. So legacy AutoRebalanceStrategy is not an option.</p> <p>Given a deterministic algorithm is required, we find load balance and minimal partition movements are hard to achieve at the same time. A trade-off between uniform distribution and partition movements during cluster changes is needed.</p> -<p>In this document, we propose a hybrid algorithm based on CRUSH that ensures both even distribution and minimized extra partition movement. We call it CRUSH-ed.<br /> The basic idea is running additional rounds of re-balance on the uneven partitions. Note that CRUSH-ed guarantees stability (deterministic) and is fault zone aware.</p> -<p>According to our experiments, CRUSH-ed results in a much more uniform distribution and very few extra partition movements (when nodes are changed unexpectedly) compared with the original CRUSH. The cost is additional run time for the re-assigning calculation.<br /> We think CRUSH-ed can to achieve better partition assignment in most of the cases.</p> +<p>In this document, we propose a hybrid algorithm based on CRUSH that ensures both even distribution and minimized extra partition movement. We call it CRUSH-ed.<br> The basic idea is running additional rounds of re-balance on the uneven partitions. Note that CRUSH-ed guarantees stability (deterministic) and is fault zone aware.</p> +<p>According to our experiments, CRUSH-ed results in a much more uniform distribution and very few extra partition movements (when nodes are changed unexpectedly) compared with the original CRUSH. The cost is additional run time for the re-assigning calculation.<br> We think CRUSH-ed can to achieve better partition assignment in most of the cases.</p> <h1>Design</h1> <p>In general, we have 2 goals:</p> <ol style="list-style-type: decimal"> @@ -192,26 +205,26 @@ <li>Minimize partition movements when nodes are changed.</li> </ol> <p>CRUSH has very small movement count, but the distribution is not optimal.</p> -<p>As for MultiRound-CRUSH, it is designed for even distribution. The idea is running CRUSH multiple times. Each time the CRUSH will only be applied to the spiking part. So the distribution would eventually converge to even distribution.<br /> However, the number of iterations that are required is not guaranteed. And there will be more partition movements when the topology of the nodes is changed. As a result, it more or less fails both goals. Still not ideal.</p> -<p>Since we already have a good base, we built CRUSH-ed based on CRUSH. It changes the uneven partition assignment generated by CRUSH as following.<br /> Note that blue part should keep unchanged before and after.</p> +<p>As for MultiRound-CRUSH, it is designed for even distribution. The idea is running CRUSH multiple times. Each time the CRUSH will only be applied to the spiking part. So the distribution would eventually converge to even distribution.<br> However, the number of iterations that are required is not guaranteed. And there will be more partition movements when the topology of the nodes is changed. As a result, it more or less fails both goals. Still not ideal.</p> +<p>Since we already have a good base, we built CRUSH-ed based on CRUSH. It changes the uneven partition assignment generated by CRUSH as following.<br> Note that blue part should keep unchanged before and after.</p> <p>Before (CRUSH)</p> -<p><img src="images/design/crushed/214844314.png" alt="Before (CRUSH)" /></p> +<p><img src="images/design/crushed/214844314.png" alt="Before (CRUSH)"></p> <p>After (new strategy)</p> -<p><img src="images/design/crushed/214844313.png" alt="After (new strategy)" /></p> -<p>Since the problem is NP-hard. We are not expecting the best assignment. A greedy algorithm works good enough.<br /> After we tried different designs, we find it's hard to achieve both goals (even distribution and fewer movements) using a single strategy. So we decided to apply a hybrid algorithm that finishes the work step by step.</p> -<p><b>Step 1, run CRUSH to get a base assignment.</b><br /> The base assignment usually contains a certain number of uneven partitions, so we need the following steps to re-distribute them.</p> -<p><b>Step 2, run a card dealing algorithm on the uneven parts.</b><br /> And assign them to idle nodes. This algorithm is conceptually simple. The result ensures that all partitions are assigned to instances with minimum difference. Note that when fault zone joins the game, our greedy algorithm may not be able to calculate possible results because the candidate assignment may have fault zone conflict. So we add the buffer to tolerate small uneven assignment.</p> +<p><img src="images/design/crushed/214844313.png" alt="After (new strategy)"></p> +<p>Since the problem is NP-hard. We are not expecting the best assignment. A greedy algorithm works good enough.<br> After we tried different designs, we find it's hard to achieve both goals (even distribution and fewer movements) using a single strategy. So we decided to apply a hybrid algorithm that finishes the work step by step.</p> +<p><b>Step 1, run CRUSH to get a base assignment.</b><br> The base assignment usually contains a certain number of uneven partitions, so we need the following steps to re-distribute them.</p> +<p><b>Step 2, run a card dealing algorithm on the uneven parts.</b><br> And assign them to idle nodes. This algorithm is conceptually simple. The result ensures that all partitions are assigned to instances with minimum difference. Note that when fault zone joins the game, our greedy algorithm may not be able to calculate possible results because the candidate assignment may have fault zone conflict. So we add the buffer to tolerate small uneven assignment.</p> <p>Example of assignments after step 2,</p> -<p><img src="images/design/crushed/214844288.png" alt="Example" /></p> -<p><b>Step 3, Shuffle partitions' preference lists.</b><br /> Since replica states are assigned according to node order in these lists, if the lists are randomly ordered, the states will also be random. This may cause uneven states distribution.<br /> To resolve this issue, before the final step 4, CRUSH-ed executes a simpler version card dealing algorithm on replica's order to shuffle them in each preference list. This operation results in a much evener state distribution.</p> +<p><img src="images/design/crushed/214844288.png" alt="Example"></p> +<p><b>Step 3, Shuffle partitions' preference lists.</b><br> Since replica states are assigned according to node order in these lists, if the lists are randomly ordered, the states will also be random. This may cause uneven states distribution.<br> To resolve this issue, before the final step 4, CRUSH-ed executes a simpler version card dealing algorithm on replica's order to shuffle them in each preference list. This operation results in a much evener state distribution.</p> <p>Example of master distribution before step 3,</p> -<p><img src="images/design/crushed/214844287.png" alt="Example" /></p> +<p><img src="images/design/crushed/214844287.png" alt="Example"></p> <p>Example of master distribution after step 3,</p> -<p><img src="images/design/crushed/214844286.png" alt="Example" /></p> -<p><b>Step 4, re-calculate the assignment for the partitions on temporarily disabled nodes using a consistent hashing algorithm.</b><br /> Consistent hashing can ensure minimize partition movement.<br /> Note that the first 3 steps are using full node list, regardless of disabled or offline nodes. So the assignment will be stable even the algorithm contains random factors such hashCode. Then step 4 ensures all the disabled nodes are handled correctly without causing huge partition movements.</p> +<p><img src="images/design/crushed/214844286.png" alt="Example"></p> +<p><b>Step 4, re-calculate the assignment for the partitions on temporarily disabled nodes using a consistent hashing algorithm.</b><br> Consistent hashing can ensure minimize partition movement.<br> Note that the first 3 steps are using full node list, regardless of disabled or offline nodes. So the assignment will be stable even the algorithm contains random factors such hashCode. Then step 4 ensures all the disabled nodes are handled correctly without causing huge partition movements.</p> <p>Assume the first node is down, after step 4, the final assignment and master distribution are as following. Note that there is no assignment on the first node anymore.</p> -<p><img src="images/design/crushed/214844285.png" alt="Example" /></p> -<p>One potential issue of using intuitive algorithm is not converging. In this case, CRUSH-ed falls back to CRUSH.<br /> Pseudocode is listed below.</p> +<p><img src="images/design/crushed/214844285.png" alt="Example"></p> +<p>One potential issue of using intuitive algorithm is not converging. In this case, CRUSH-ed falls back to CRUSH.<br> Pseudocode is listed below.</p> <p><b>Pseudo Code</b></p> <div class="source"> <pre><code>// Round 1: Calculate mapping using the base strategy. @@ -244,7 +257,7 @@ if (!nodeToPartitionMap.isEmpty()) { </code></pre> </div> <p>The re-assigning logic is generic and can be applied to any algorithms. So we created an abstract class for common logic. And then create strategy classes for Helix users. The Java class diagram looks like following.</p> -<p><img src="images/design/crushed/214844307.png" alt="Example" /></p> +<p><img src="images/design/crushed/214844307.png" alt="Example"></p> <section> <section> <h3 id="Cap_of.C2.A0difference_participant_load_using_CRUSH-ed">Cap of difference participant load using CRUSH-ed</h3> @@ -252,7 +265,7 @@ if (!nodeToPartitionMap.isEmpty()) { </section> <section> <h3 id="Not_a_global_uniform_distribution_solution_that_considers_node_capacity">Not a global uniform distribution solution that considers node capacity</h3> - <p>Global distribution algorithm requires the algorithm takes other resources' partition distribution as part of the input. Since this related the distribution of all resources, the distribution would be very unstable. Any change in any resource will change it. As a result, the rebalance process may lead to a large number of partition movement.<br /> Therefore, the solution in this document cannot be used to calculate global uniform distribution, neither node capacity aware throttling.<br /> This requirement would be investigated in another initiative. Please refer to future works.</p> + <p>Global distribution algorithm requires the algorithm takes other resources' partition distribution as part of the input. Since this related the distribution of all resources, the distribution would be very unstable. Any change in any resource will change it. As a result, the rebalance process may lead to a large number of partition movement.<br> Therefore, the solution in this document cannot be used to calculate global uniform distribution, neither node capacity aware throttling.<br> This requirement would be investigated in another initiative. Please refer to future works.</p> <h1>Experiment</h1> <p>We tested CRUSH-ed by simulating rebalancing using real product clusters topology data. And we tested multiple scenarios:</p> <ul> @@ -261,54 +274,54 @@ if (!nodeToPartitionMap.isEmpty()) { <li>Adding hosts to simulate expansion.</li> <li>Rolling upgrade.</li> </ul> - <p>All results show that CRUSH-ed generates more uniform global distribution compared with CRUSH.<br /> Moreover, partition movements in most scenarios are minimized. Except for hosts expansion case. Which can be controlled by configuring state transition throttling.</p> + <p>All results show that CRUSH-ed generates more uniform global distribution compared with CRUSH.<br> Moreover, partition movements in most scenarios are minimized. Except for hosts expansion case. Which can be controlled by configuring state transition throttling.</p> </section> </section> <section> <h2 id="Partition_Distribution">Partition Distribution</h2> - <p>Following charts demonstrate the worst cases (min load vs. max load) and STDEVs of partition/master distributions of several Espresso PROD clusters.<br /> If we measure the improvement by STDEV, CRUSH-ed reduces the partition distribution unevenness by 87% on average compared with CRUSH. And for master replica distribution, the evenness improvement is 68% on average and 81% in maximum.</p> - <p><img src="images/design/crushed/214844302.png" alt="Example" /><img src="images/design/crushed/214844301.png" alt="Example" /></p> - <p><img src="images/design/crushed/214844298.png" alt="Example" /><img src="images/design/crushed/214844297.png" alt="Example" /></p> - <p>In addition, even for the clusters that already have good distribution using CRUSH, their real resource usage might be uneven because of partitions size variance.<br /> For example, Venice-0 has more than 50k replicas. So even with CRUSH, partition distribution is already good, STDEV is 32.<br /> However, because the partitions are quite different in storage usage, nodes' storage usage STDEV is 222. Max disk usage is about 2956GB.</p> - <p>Then, if using CRUSH-ed, the partition distribution is improved a little bit, STDEV is 6.<br /> Moreover, since all the resources have a uniform distribution, total storage usage is much evener compared with CRUSH. STDEV is 30. And max disk usage is about 2644GB.</p> + <p>Following charts demonstrate the worst cases (min load vs. max load) and STDEVs of partition/master distributions of several Espresso PROD clusters.<br> If we measure the improvement by STDEV, CRUSH-ed reduces the partition distribution unevenness by 87% on average compared with CRUSH. And for master replica distribution, the evenness improvement is 68% on average and 81% in maximum.</p> + <p><img src="images/design/crushed/214844302.png" alt="Example"><img src="images/design/crushed/214844301.png" alt="Example"></p> + <p><img src="images/design/crushed/214844298.png" alt="Example"><img src="images/design/crushed/214844297.png" alt="Example"></p> + <p>In addition, even for the clusters that already have good distribution using CRUSH, their real resource usage might be uneven because of partitions size variance.<br> For example, Venice-0 has more than 50k replicas. So even with CRUSH, partition distribution is already good, STDEV is 32.<br> However, because the partitions are quite different in storage usage, nodes' storage usage STDEV is 222. Max disk usage is about 2956GB.</p> + <p>Then, if using CRUSH-ed, the partition distribution is improved a little bit, STDEV is 6.<br> Moreover, since all the resources have a uniform distribution, total storage usage is much evener compared with CRUSH. STDEV is 30. And max disk usage is about 2644GB.</p> <p>Given the host resource is reserved according to max usage, CRUSH-ed can save (2956 - 2644) / 2956 = 10.5% cost.</p> - <p><img src="images/design/crushed/214844300.png" alt="Example" /><img src="images/design/crushed/214844299.png" alt="Example" /></p> + <p><img src="images/design/crushed/214844300.png" alt="Example"><img src="images/design/crushed/214844299.png" alt="Example"></p> </section> <section> <h2 id="Disabling_Nodes">Disabling Nodes</h2> - <p>When nodes are offline or disabled, CRUSH-ed will re-assigned the partitions to other live nodes. The algorithm ensures only moving the necessary partitions.<br /> We simulated disabling a certain number of nodes, and check the changes regarding partition movement and master changes. We also used the expected movement (the partitions/masters count on the disabled nodes) as a baseline to measure if any extra movements happen.</p> + <p>When nodes are offline or disabled, CRUSH-ed will re-assigned the partitions to other live nodes. The algorithm ensures only moving the necessary partitions.<br> We simulated disabling a certain number of nodes, and check the changes regarding partition movement and master changes. We also used the expected movement (the partitions/masters count on the disabled nodes) as a baseline to measure if any extra movements happen.</p> <p>The results show that movement is highly correlated to the portion of disabled nodes. And extra movements are minor (in most cases 0 movements).</p> <p>Note that <b>Rate</b> in this document is <b>the changed number / total partition or master count</b>.</p> - <p><img src="images/design/crushed/214844296.png" alt="Example" /><img src="images/design/crushed/214844295.png" alt="Example" /></p> + <p><img src="images/design/crushed/214844296.png" alt="Example"><img src="images/design/crushed/214844295.png" alt="Example"></p> </section> <section> <h2 id="Rolling_upgrade">Rolling upgrade</h2> - <p>Rolling upgrade is different from disabling nodes. Since nodes are reset one by one, in this test we assume the difference could be 2 nodes in maximum (for example, upgrading Node A then upgrading Node B).<br /> In this case, movements are still minimized.</p> - <p>Note that in real PROD clusters, since admin can set delayed scheduler, there won't be movement at all.<br /> Following chart shows the maximum recorded movements or master changes during the whole rolling upgrade process. Even with the worst case, extra partition movements and master changes are close to 0%.<br /> <img src="images/design/crushed/214844289.png" alt="Example" /></p> + <p>Rolling upgrade is different from disabling nodes. Since nodes are reset one by one, in this test we assume the difference could be 2 nodes in maximum (for example, upgrading Node A then upgrading Node B).<br> In this case, movements are still minimized.</p> + <p>Note that in real PROD clusters, since admin can set delayed scheduler, there won't be movement at all.<br> Following chart shows the maximum recorded movements or master changes during the whole rolling upgrade process. Even with the worst case, extra partition movements and master changes are close to 0%.<br> <img src="images/design/crushed/214844289.png" alt="Example"></p> </section> <section> <h2 id="Adding_Nodes">Adding Nodes</h2> - <p>Adding nodes (or cluster expansion) changes topology. CRUSH-ed leverages card dealing for evenness. So when topology changes, the movements would be much more than CRUSH.<br /> As we evaluated, the moved partitions are majority uneven ones.</p> - <p>According to our experiment using all Espresso clusters, the extra partition movement rate could be as much as 23%. And master changes could be as much as 58%.<br /> The percentage is still compared with total partition count or total master count.</p> + <p>Adding nodes (or cluster expansion) changes topology. CRUSH-ed leverages card dealing for evenness. So when topology changes, the movements would be much more than CRUSH.<br> As we evaluated, the moved partitions are majority uneven ones.</p> + <p>According to our experiment using all Espresso clusters, the extra partition movement rate could be as much as 23%. And master changes could be as much as 58%.<br> The percentage is still compared with total partition count or total master count.</p> <p>Note the extra change rate is not correlated with the number of additional nodes. So our recommendation is finishing expansion in one operation so as to do only one partition shuffling.</p> - <p><img src="images/design/crushed/214844294.png" alt="Example" /></p> + <p><img src="images/design/crushed/214844294.png" alt="Example"></p> </section> <section> <h2 id="Algorithm_Performance">Algorithm Performance</h2> - <p>We compared CRUSH-ed with CRUSH algorithms using different instance numbers. The tests are executed multiple times and we recorded middle numbers.<br /> The results are shown as follows.</p> + <p>We compared CRUSH-ed with CRUSH algorithms using different instance numbers. The tests are executed multiple times and we recorded middle numbers.<br> The results are shown as follows.</p> <p>Note that CRUSH-ed does not cost much additional calculating time for regular rebalancing. In maximum, 30% more runtime compared with CRUSH. And it will be less than MultiRoundCRUSH.</p> - <p><img src="images/design/crushed/214844283.png" alt="Example" /><img src="images/design/crushed/214844284.png" alt="Example" /></p> + <p><img src="images/design/crushed/214844283.png" alt="Example"><img src="images/design/crushed/214844284.png" alt="Example"></p> <p>However, when there are nodes down since CRUSH-ed needs to run an additional consistent hashing based re-distribution, the calculating time will be much longer. More than 3 times compared with CRUSH.</p> - <p><img src="images/design/crushed/214844282.png" alt="Example" /></p> + <p><img src="images/design/crushed/214844282.png" alt="Example"></p> <p>With some <b>performance improvements</b>, such as using cache to avoid duplicate calculation, we achieved to greatly reduce CRUSH-ed's running time. According to our experiment, it is now close to MultiRound CRUSH.</p> - <p><img src="images/design/crushed/214844281.png" alt="Example" /></p> + <p><img src="images/design/crushed/214844281.png" alt="Example"></p> </section> <section> <h2 id="Additional_Tests_for_Corner_Cases">Additional Tests for Corner Cases</h2> <p>These tests prove that the algorithm still works in the extreme cases.</p> <p><b>ESPRESSO_IDENTITY</b></p> <p>This cluster has only one resource. We get the distribution details for all 4 fabrics.</p> - <p><img src="images/design/crushed/214844292.png" alt="Example" /><img src="images/design/crushed/214844293.png" alt="Example" /><img src="images/design/crushed/214844291.png" alt="Example" /><img src="images/design/crushed/214844290.png" alt="Example" /></p> + <p><img src="images/design/crushed/214844292.png" alt="Example"><img src="images/design/crushed/214844293.png" alt="Example"><img src="images/design/crushed/214844291.png" alt="Example"><img src="images/design/crushed/214844290.png" alt="Example"></p> <section> <section> <h4 id="a100_nodes.2C_100_resources_and_101_partitions_for_each_resource">100 nodes, 100 resources and 101 partitions for each resource</h4> @@ -504,15 +517,15 @@ if (!nodeToPartitionMap.isEmpty()) { </ol> <p><b>IdeaState SimpleFields Example</b></p> <div class="source"> - <pre><code>HELIX_ENABLED : "true" -IDEAL\_STATE\_MODE : "AUTO_REBALANCE" -REBALANCE\_MODE : "FULL\_AUTO" -REBALANCE_STRATEGY : "org.apache.helix.controller.rebalancer.strategy.CrushRebalanceStrategy" -MIN\_ACTIVE\_REPLICAS : "0" -NUM_PARTITIONS : "64" -REBALANCER\_CLASS\_NAME : "org.apache.helix.controller.rebalancer.DelayedAutoRebalancer" -REPLICAS : "1" -STATE\_MODEL\_DEF_REF : "LeaderStandby" + <pre><code>HELIX_ENABLED : "true" +IDEAL\_STATE\_MODE : "AUTO_REBALANCE" +REBALANCE\_MODE : "FULL\_AUTO" +REBALANCE_STRATEGY : "org.apache.helix.controller.rebalancer.strategy.CrushRebalanceStrategy" +MIN\_ACTIVE\_REPLICAS : "0" +NUM_PARTITIONS : "64" +REBALANCER\_CLASS\_NAME : "org.apache.helix.controller.rebalancer.DelayedAutoRebalancer" +REPLICAS : "1" +STATE\_MODEL\_DEF_REF : "LeaderStandby" </code></pre> </div> <h1>Future Works</h1> @@ -520,7 +533,7 @@ STATE\_MODEL\_DEF_REF : "LeaderStan </section> <section> <h2 id="Instance_Level_Capacity_Limitation">Instance Level Capacity Limitation</h2> - <p>Currently, all resources are assigned separately.<br /> The pros of this design are that resources change won't cause existing partitions to be re-assigned.<br /> The cons are:</p> + <p>Currently, all resources are assigned separately.<br> The pros of this design are that resources change won't cause existing partitions to be re-assigned.<br> The cons are:</p> <ol style="list-style-type: decimal"> <li>It's hard to ensure strict global uniform distribution.</li> <li>Instance level capacity control is not possible given the algorithm doesn't have a global view of partition assignment.</li> @@ -528,7 +541,7 @@ STATE\_MODEL\_DEF_REF : "LeaderStan </section> <section> <h2 id="Rebalance_Algorithm_Takes_Partition_Weight_into_Consideration">Rebalance Algorithm Takes Partition Weight into Consideration</h2> - <p>This algorithm still considers all partitions to be equally weighted. But in reality, different partitions may have different resource requirements.<br /> Application admins need to configure partition weight and Helix should assignment them accordingly.</p> + <p>This algorithm still considers all partitions to be equally weighted. But in reality, different partitions may have different resource requirements.<br> Application admins need to configure partition weight and Helix should assignment them accordingly.</p> <p>Note this feature only makes sense when it is applied to a global assignment algorithm since each partition in the same resource are weighted the same.</p> </section> </div> @@ -651,7 +664,7 @@ STATE\_MODEL\_DEF_REF : "LeaderStan <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="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> by <a href="https://andrius.velykis.lt" target="_blank" title="Andrius Velykis">Andrius Velykis</a>.</p> + <p><a href="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> maintained by <a href="https://twitter.com/olamy" target="_blank" title="Olivier Lamy">Olivier Lamy</a>.</p> <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/privacy-policy.html">Privacy Policy</a> Modified: helix/site-content/download.html URL: http://svn.apache.org/viewvc/helix/site-content/download.html?rev=1900255&r1=1900254&r2=1900255&view=diff ============================================================================== --- helix/site-content/download.html (original) +++ helix/site-content/download.html Mon Apr 25 08:18:23 2022 @@ -1,7 +1,13 @@ <!DOCTYPE html> + + + + + + <!-- - Generated by Apache Maven Doxia Rendered using Reflow Maven Skin 2.0.0-SNAPSHOT (https://andriusvelykis.github.io/reflow-maven-skin) + Generated by Apache Maven Doxia Rendered using Reflow Maven Skin 2.0.0 (https://olamy.github.io/reflow-maven-skin) --> <html xml:lang="en" lang="en"> @@ -30,24 +36,31 @@ <![endif]--> - <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> + +<!-- Matomo --> +<script> + var _paq = window._paq = window._paq || []; + _paq.push(['disableCookies']); + _paq.push(['trackPageView']); + _paq.push(['enableLinkTracking']); + + (function() { + var u="https://analytics.apache.org"; + _paq.push(['setTrackerUrl', u+'/matomo.php']); + _paq.push(['setSiteId', '15']); + var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; + g.async=true; g.src=u+'/matomo.js'; s.parentNode.insertBefore(g,s); + })(); +</script> +<!-- End Matomo Code --> + </head> <body class="page-download project-website" data-spy="scroll" data-offset="60" data-target="#toc-scroll-target"> + <div class="navbar navbar-fixed-top"> <div class="navbar-inner"> <div class="container"> @@ -179,15 +192,13 @@ <section> <h2 id="Current_Release">Current Release</h2> <p>Release date: 04/30/2018 </p> - <p><a href="releasenotes/release-0.8.0.html">0.8.0 Release notes</a></p> - <a name="mirror"></a> + <p><a href="releasenotes/release-0.8.0.html">0.8.0 Release notes</a></p> <a name="mirror"></a> <section> <h3 id="Mirror">Mirror</h3> - <p> [if-any logo] <a href="[link]"> <img src="[logo]" align="right" border="0" alt="logo" /> </a> [end] The currently selected mirror is <b>[preferred]</b>. If you encounter a problem with this mirror, please select another mirror. If all mirrors are failing, there are <i>backup</i> mirrors (at the end of the mirrors list) that should be available. </p> + <p> [if-any logo] <a href="[link]"> <img src="[logo]" align="right" border="0" alt="logo"> </a> [end] The currently selected mirror is <b>[preferred]</b>. If you encounter a problem with this mirror, please select another mirror. If all mirrors are failing, there are <i>backup</i> mirrors (at the end of the mirrors list) that should be available. </p> <form action="[location]" method="get" id="SelectMirror" class="form-inline"> - Other mirrors: - <select name="Preferred" class="input-xlarge"> [if-any http] [for http] <option value="[http]">[http]</option> [end] [end] [if-any ftp] [for ftp] <option value="[ftp]">[ftp]</option> [end] [end] [if-any backup] [for backup] <option value="[backup]">[backup] (backup)</option> [end] [end] </select> - <input type="submit" value="Change" class="btn" /> + Other mirrors: <select name="Preferred" class="input-xlarge"> [if-any http] [for http] <option value="[http]">[http]</option> [end] [end] [if-any ftp] [for ftp] <option value="[ftp]">[ftp]</option> [end] [end] [if-any backup] [for backup] <option value="[backup]">[backup] (backup)</option> [end] [end] </select> + <input type="submit" value="Change" class="btn"> </form> <p> You may also consult the <a class="externalLink" href="http://www.apache.org/mirrors/">complete list of mirrors.</a> </p> </section> @@ -263,12 +274,12 @@ <pre>% pgpk -a KEYS % pgpv downloaded_file.asc</pre> </div> or - <br /> + <br> <div class="source"> <pre>% pgp -ka KEYS % pgp downloaded_file.asc</pre> </div> or - <br /> + <br> <div class="source"> <pre>% gpg --import KEYS % gpg --verify downloaded_file.asc</pre> @@ -400,7 +411,7 @@ <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="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> by <a href="https://andrius.velykis.lt" target="_blank" title="Andrius Velykis">Andrius Velykis</a>.</p> + <p><a href="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> maintained by <a href="https://twitter.com/olamy" target="_blank" title="Olivier Lamy">Olivier Lamy</a>.</p> <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/privacy-policy.html">Privacy Policy</a>
