This folder contains a script for running Exhibitor. Typically, you would run
this script while your server is booting to start Exhibitor. This script assumes that the following are already
installed:
The run-exhibitor script will generate an Exhibitor configuration (see Exhibitor config docs
below for details) and then use Supervisord to start Exhibitor.
This script has been tested on the following operating systems:
Amazon Linux
Ubuntu
There is a good chance it will work on Debian, CentOS, and RHEL as well, but our automated testing for this
module does not cover these other distros at the moment.
Quick start
The easiest way to install the run-exhibitor script is with the Gruntwork
Installer:
When you run the run-exhibitor, it has three required arguments:
--shared-config-s3-bucket: The name of the S3 bucket where shared config for ZooKeeper servers is stored.
--shared-config-s3-key: The path in the S3 bucket where shared config for ZooKeeper servers is stored (e.g. zoo.cfg).
--shared-config-s3-region: The AWS region where the shared config S3 bucket lives (e.g. us-east-1).
The script also accepts a number of optional parameters to customize both Exhibitor and ZooKeeper behavior. Run the
script with the --help flag to see all available options. See the Exhibitor config docs below
for the highlights.
Exhibitor config
The run-exhibitor script generates an Exhibitor configuration
file that specifies all the settings for how to run
Exhibitor and ZooKeeper.
Every ZooKeeper server needs an IP address and a unique ID. By default, the run-exhibitor script will use ENIs as the
IP addresses (check out the Static IPs and ENIs documentation for why we use ENIs) and the
ServerGroupIndex tag of each server as its ID.
Here's what the run-exhibitor script does:
Use the AWS CLI to look up the value of the ServerGroupName tag on the current server. This tag is set by the
server-group module, which is what
powers the zookeeper-cluster module. Every server in a single ZooKeeper cluster
should have this same tag.
Use the AWS CLI to look up all ENIs with that same ServerGroupName. The server-group module tags each ENI it
creates for a single server group with the same value. The private IP addresses of these ENIs are used as the
IPs of the ZooKeeper servers.
Each ENI and server pair also has a unique ServerGroupIndex tag added by the server-group module. This index
is used as the unique ID for each server.
You can override this behavior by specifying custom --zookeeper-servers-spec and --hostname arguments.
JVM memory settings
By default, we configure ZooKeeper to run with 1000m of memory. You can override this with the --zookeeper-memory
argument to run-exhibitor. If you wish to override all JVM settings for ZooKeeper, you can use the
--zookeeper-java-env argument.
Transaction logs
By default, the run-exhibitor script will configure ZooKeeper to store transaction logs in
/opt/zookeeper/transaction-logs. We strongly recommend mounting a separate EBS Volume at this path, as every write
to ZooKeeper gets immediately persisted to disk for durability, and you get much better performance if there is no
contention for the hard drive from other processes.
You can override the transaction logs path via the --zookeeper-transaction-log-dir argument.
Application logs
By default, all Exhibitor application logs are stored in /opt/zookeeper/logs. You can override this with the
--exhibitor-logs-dir argument. The ZooKeeper logs are also stored in /opt/zookeeper/logs/, as configured in
zookeeper-log4j.properties. You can override ZooKeeper's
logging behavior by specifying the path to a custom log4j.properties file using the --zookeeper-log4j-properties
argument.
Questions? Ask away.
We're here to talk about our services, answer any questions, give advice, or just to chat.
{"treedata":{"name":"root","toggled":true,"children":[{"name":".circleci","children":[{"name":"config.yml","path":".circleci/config.yml","sha":"fd3d9d38ea65a464451a744754077f19efc584b0"}]},{"name":".gitignore","path":".gitignore","sha":"9de2b4892a4b8331b381f1a81ffeadfd151353f4"},{"name":".pre-commit-config.yaml","path":".pre-commit-config.yaml","sha":"19d10bbef4ca8fa40036edf1ca4f1db464e28a2f"},{"name":".pre-commit-hooks.yaml","path":".pre-commit-hooks.yaml","sha":"92462242c5c4a3aa0f5d5f5b19a81811c71e4b49"},{"name":"CODEOWNERS","path":"CODEOWNERS","sha":"98ce69cba614ca3100ef584efdddc020568d295b"},{"name":"LICENSE.txt","path":"LICENSE.txt","sha":"689cf10ec98e3297a75bdd9b9fb5da10b7a675f8"},{"name":"README.md","path":"README.md","sha":"940f96053554ddd69d7ed70e5e9f76357e4a57d6"},{"name":"examples","children":[{"name":"install-open-jdk","children":[{"name":"main.tf","path":"examples/install-open-jdk/main.tf","sha":"7cf188bc79577db1f730726a29d9c0261dd73302"},{"name":"outputs.tf","path":"examples/install-open-jdk/outputs.tf","sha":"6d1b9b915cdb10c8ba114d61d0c47f0babd2ebe8"},{"name":"packer","children":[{"name":"build.json","path":"examples/install-open-jdk/packer/build.json","sha":"742d0a47d40515ef5c3c162d9798aecf03986eea"}]},{"name":"vars.tf","path":"examples/install-open-jdk/vars.tf","sha":"d1eba93458ba1cfdf6b588d968e558f756087e9f"}]},{"name":"zookeeper-ami","children":[{"name":"README.md","path":"examples/zookeeper-ami/README.md","sha":"05c95c33022491de1a986d0aca53019913a1f44a"},{"name":"configure-image.sh","path":"examples/zookeeper-ami/configure-image.sh","sha":"908f15f17dad7254fc27d6b3b4f8f3a85c3c1619"},{"name":"docker-compose.yml","path":"examples/zookeeper-ami/docker-compose.yml","sha":"feaa66af7fa5879e41b88d09214f94a8e7dfb767"},{"name":"mock","children":[{"name":"README.md","path":"examples/zookeeper-ami/mock/README.md","sha":"fcb885c49c095432b8c800525bef76903968f2a0"},{"name":"bash-commons","children":[{"name":"aws.sh","path":"examples/zookeeper-ami/mock/bash-commons/aws.sh","sha":"c3d5b6b6c112ad9296f3207404e5aa183a6346e6"}]},{"name":"modules","children":[{"name":"attach-eni","path":"examples/zookeeper-ami/mock/modules/attach-eni","sha":"da052caea4586b27c2dc13e521092e9403fcc327"},{"name":"mount-ebs-volume","path":"examples/zookeeper-ami/mock/modules/mount-ebs-volume","sha":"e0171fef05dbd120dc8668ceeca176cc5c0dfce4"}]},{"name":"user-data","children":[{"name":"user-data.sh","path":"examples/zookeeper-ami/mock/user-data/user-data.sh","sha":"43a641aa2937ba6f7c07c8391c947de2f65b7920"}]}]},{"name":"zookeeper.json","path":"examples/zookeeper-ami/zookeeper.json","sha":"b9ef3b6bc03fbf91f8b1fe534cc8700c6eb3f8c6"}]},{"name":"zookeeper-cluster","children":[{"name":"README.md","path":"examples/zookeeper-cluster/README.md","sha":"eda7e80c820a57b327129083f52b73e0713ae6b3"},{"name":"main.tf","path":"examples/zookeeper-cluster/main.tf","sha":"951e5861164f297b7babbe86be32fb6de0504132"},{"name":"outputs.tf","path":"examples/zookeeper-cluster/outputs.tf","sha":"b975f1a72a486b619e310e8140110b84dfc29085"},{"name":"user-data","children":[{"name":"user-data.sh","path":"examples/zookeeper-cluster/user-data/user-data.sh","sha":"1f29df534a7a71456ea56de596059025a8fcd12d"}]},{"name":"vars.tf","path":"examples/zookeeper-cluster/vars.tf","sha":"ad3d6ba8d303e025fa8afd2a618510deeafd2e20"}]}]},{"name":"modules","children":[{"name":"bash-commons","children":[{"name":"README.md","path":"modules/bash-commons/README.md","sha":"0b7594de5380fe493e62f91965b5f8d283d76c55"},{"name":"install.sh","path":"modules/bash-commons/install.sh","sha":"d531a722d55a8a82d312725aa19ba2c1ddebcf02"},{"name":"lib","children":[{"name":"assert.sh","path":"modules/bash-commons/lib/assert.sh","sha":"46db8af49acb3e8d707447827dc614740add6a63"},{"name":"aws.sh","path":"modules/bash-commons/lib/aws.sh","sha":"3f14d36e2c7b57c91be34bdf30fff4f400a7d1aa"},{"name":"log.sh","path":"modules/bash-commons/lib/log.sh","sha":"66f936873d4d104c94693d3e68790cc0b9d36c63"},{"name":"os.sh","path":"modules/bash-commons/lib/os.sh","sha":"435e592c0e992f2266247a2da797a0eefc429f35"},{"name":"strings.sh","path":"modules/bash-commons/lib/strings.sh","sha":"19dbfe630edfbe71e7c8c1beee3d50fffdd5b1e6"}]}]},{"name":"exhibitor-shared-config","children":[{"name":"README.md","path":"modules/exhibitor-shared-config/README.md","sha":"ec9415af7d44ddfdf4cdfc58b89f4a5df2f0721e"},{"name":"main.tf","path":"modules/exhibitor-shared-config/main.tf","sha":"9637bf1851ec6ec30efd93a681d3d3a0dd7310be"},{"name":"outputs.tf","path":"modules/exhibitor-shared-config/outputs.tf","sha":"6cae4a73a186ba26e732a5d77af9b5d8707759e1"},{"name":"vars.tf","path":"modules/exhibitor-shared-config/vars.tf","sha":"72f9f93e425ee4ec00f3464aa3c0d41be5629775"}]},{"name":"install-exhibitor","children":[{"name":"README.md","path":"modules/install-exhibitor/README.md","sha":"98e9e15f48b87ae76e30ec6150301bb16d7acb3e"},{"name":"install.sh","path":"modules/install-exhibitor/install.sh","sha":"8c56b759a036ff1e8c0130ee644469f4fb11f74e"},{"name":"pom.xml","path":"modules/install-exhibitor/pom.xml","sha":"e5cca292196cdaa093cc484465eb5bc2d48ed618"},{"name":"zookeeper-log4j.properties","path":"modules/install-exhibitor/zookeeper-log4j.properties","sha":"80e3ae28555ed63b5a74d127796ff3f2adfce223"}]},{"name":"install-open-jdk","children":[{"name":"README.md","path":"modules/install-open-jdk/README.md","sha":"a048ab6e2cc74020657a68b7e32584f6ed78f76d"},{"name":"install.sh","path":"modules/install-open-jdk/install.sh","sha":"9982cf730afc5d58b05b888054138ffbb8725795"}]},{"name":"install-oracle-jdk","children":[{"name":"README.md","path":"modules/install-oracle-jdk/README.md","sha":"b46c3ab123f53f6a32ba2026bc18f3d870617bc1"},{"name":"install.sh","path":"modules/install-oracle-jdk/install.sh","sha":"53b798bd0984de5fd27048d3dfcd437d0687c117"}]},{"name":"install-supervisord","children":[{"name":"README.md","path":"modules/install-supervisord/README.md","sha":"eb07bdb5928882c73efcb5a069257f1356bd5533"},{"name":"install.sh","path":"modules/install-supervisord/install.sh","sha":"2b765667b825b94791e715b0dcbcdbd8ec4e95a2"},{"name":"supervisor-initd-script.sh","path":"modules/install-supervisord/supervisor-initd-script.sh","sha":"171b91613e98ab2bd10282025caff1707918c95a"},{"name":"supervisor-systemd-unit.service","path":"modules/install-supervisord/supervisor-systemd-unit.service","sha":"995a1a95863c21abcd245e45313e99b7cd98d98a"},{"name":"supervisord.conf","path":"modules/install-supervisord/supervisord.conf","sha":"d96beb0ca9a16279ed1bdf74cbb6516275d85085"}]},{"name":"install-zookeeper","children":[{"name":"README.md","path":"modules/install-zookeeper/README.md","sha":"9f23978ae6dfd0124fa8a9d8327b6256aa654b2f"},{"name":"install.sh","path":"modules/install-zookeeper/install.sh","sha":"7d25699e7835711dfc4c9e1fa78565fd578ccfb1"},{"name":"security","children":[{"name":"zookeeper.KEYS","path":"modules/install-zookeeper/security/zookeeper.KEYS","sha":"f23552bd9489de0f229bb4bb27dfb6a0376904f4"},{"name":"zookeeper.asc","path":"modules/install-zookeeper/security/zookeeper.asc","sha":"de701fc5a9b18af3095d32de998b95d7f25667ef"}]}]},{"name":"precommit-hooks","children":[{"name":"README.md","path":"modules/precommit-hooks/README.md","sha":"f5fa146415c58421be1653d09d95fc97b65bf5aa"},{"name":"gofmt.sh","path":"modules/precommit-hooks/gofmt.sh","sha":"6df4a06074bfc2eea33864e0c00e282caf4fb213"},{"name":"golint.sh","path":"modules/precommit-hooks/golint.sh","sha":"e74ea4da285fee9d45b4cac6426657cfc504de6d"},{"name":"shellcheck.sh","path":"modules/precommit-hooks/shellcheck.sh","sha":"5e2b2ab86606d80419237cf47f40762baa5f1c0d"},{"name":"terraform-fmt.sh","path":"modules/precommit-hooks/terraform-fmt.sh","sha":"048ec70ba42772675c1e7d2438b531fd572ad59e"}]},{"name":"run-exhibitor","children":[{"name":"README.md","path":"modules/run-exhibitor/README.md","sha":"35608381a0756187d1bf77f1d71775edfff0858a","toggled":true},{"name":"bin","children":[{"name":"run-exhibitor","path":"modules/run-exhibitor/bin/run-exhibitor","sha":"e7d039d097d060e6b7abcc6eb4622af7a1b010fe"}]},{"name":"install.sh","path":"modules/run-exhibitor/install.sh","sha":"f8f5a2961f42fc23b4a8fe06544a38ad28bac386"}],"toggled":true},{"name":"run-health-checker","children":[{"name":"README.md","path":"modules/run-health-checker/README.md","sha":"2b68f92659844150a106fa2e55972848e6373135"},{"name":"bin","children":[{"name":"check-zookeeper","path":"modules/run-health-checker/bin/check-zookeeper","sha":"c952376818aa1b3c08e6ce54c6b7b44811911696"},{"name":"run-health-checker","path":"modules/run-health-checker/bin/run-health-checker","sha":"0409f239d7078fd1a34d311790b0648e8173b102"}]},{"name":"install.sh","path":"modules/run-health-checker/install.sh","sha":"5241e81822039d9644d2a02f7f10003e64907de4"}]},{"name":"zookeeper-cluster","children":[{"name":"README.md","path":"modules/zookeeper-cluster/README.md","sha":"c604ec0b8326a2496b116da1579996aefa0ac04a"},{"name":"main.tf","path":"modules/zookeeper-cluster/main.tf","sha":"8d9c97dc13125ccaebb296d25c198063ea524db7"},{"name":"outputs.tf","path":"modules/zookeeper-cluster/outputs.tf","sha":"424dada690378a4bd7aa8e903c61ad77746ebf99"},{"name":"vars.tf","path":"modules/zookeeper-cluster/vars.tf","sha":"831792934ee50e50856973450f44e9e8f99518a6"}]},{"name":"zookeeper-iam-permissions","children":[{"name":"README.md","path":"modules/zookeeper-iam-permissions/README.md","sha":"2a8f49855ac55e5bd083e8466ac5a2576fb62878"},{"name":"main.tf","path":"modules/zookeeper-iam-permissions/main.tf","sha":"a78e1cd57e7ccc13d35a3dfec5ad5a2fd1fd7276"},{"name":"vars.tf","path":"modules/zookeeper-iam-permissions/vars.tf","sha":"9c3a5c00d0591fd79c9e63b6c8bf753cc14cda61"}]},{"name":"zookeeper-security-group-rules","children":[{"name":"README.md","path":"modules/zookeeper-security-group-rules/README.md","sha":"c2681bc0df96de4e97ea63c138f625d7bacd2439"},{"name":"main.tf","path":"modules/zookeeper-security-group-rules/main.tf","sha":"512acb4af29f05a4eae2d1ebd74b7377fcf8cffd"},{"name":"vars.tf","path":"modules/zookeeper-security-group-rules/vars.tf","sha":"6319feab9b2eb4407d562436d716e64ef57b17fd"}]}],"toggled":true},{"name":"test","children":[{"name":"Gopkg.lock","path":"test/Gopkg.lock","sha":"fd0e206ff06d8477115df4e530fd4910b57e15de"},{"name":"Gopkg.toml","path":"test/Gopkg.toml","sha":"7bc1f94cd3e197e77bbf369ae74205a4d5f2f3ba"},{"name":"README.md","path":"test/README.md","sha":"67c59943d09b170960acbafeb4a4c78683873a66"},{"name":"open_jdk_test.go","path":"test/open_jdk_test.go","sha":"f02e087559c57221223139bc6d66ecb602cf38e8"},{"name":"zookeeper_cluster_test.go","path":"test/zookeeper_cluster_test.go","sha":"d4d9cef0f13e90575dd67fdbf8bd9213070cca71"}]}]},"detailsContent":"<h1 class=\"preview__body--title\" id=\"run-exhibitor-script\">Run Exhibitor Script</h1><div class=\"preview__body--border\"></div><p>This folder contains a script for running <a href=\"https://github.com/soabase/exhibitor/\" class=\"preview__body--description--blue\" target=\"_blank\">Exhibitor</a>. Typically, you would run\nthis script while your server is booting to start Exhibitor. This script assumes that the following are already\ninstalled:</p>\n<ol>\n<li>Exhibitor: see the <a href=\"/repos/v0.6.5/package-zookeeper/modules/install-exhibitor\" class=\"preview__body--description--blue\">install-exhibitor module</a>.</li>\n<li>ZooKeeper: see the <a href=\"/repos/v0.6.5/package-zookeeper/modules/install-zookeeper\" class=\"preview__body--description--blue\">install-zookeeper module</a>.</li>\n<li>Supervisord: see the <a href=\"/repos/v0.6.5/package-zookeeper/modules/install-supervisord\" class=\"preview__body--description--blue\">install-supervisord module</a>.</li>\n<li><a href=\"https://aws.amazon.com/cli/\" class=\"preview__body--description--blue\" target=\"_blank\">AWS CLI</a>.</li>\n<li><a href=\"https://stedolan.github.io/jq/\" class=\"preview__body--description--blue\" target=\"_blank\">jq</a>.</li>\n</ol>\n<p>The <code>run-exhibitor</code> script will generate an Exhibitor configuration (see <a href=\"#exhibitor-config\" class=\"preview__body--description--blue\">Exhibitor config docs</a>\nbelow for details) and then use Supervisord to start Exhibitor.</p>\n<p>This script has been tested on the following operating systems:</p>\n<ul>\n<li>Amazon Linux</li>\n<li>Ubuntu</li>\n</ul>\n<p>There is a good chance it will work on Debian, CentOS, and RHEL as well, but our automated testing for this\nmodule does not cover these other distros at the moment.</p>\n<h2 class=\"preview__body--subtitle\" id=\"quick-start\">Quick start</h2>\n<p>The easiest way to install the run-exhibitor script is with the <a href=\"/repos/gruntwork-installer\" class=\"preview__body--description--blue\">Gruntwork\nInstaller</a>:</p>\n<pre>gruntwork-install \\\n -<span class=\"ruby\">-<span class=\"hljs-class\"><span class=\"hljs-keyword\">module</span>-<span class=\"hljs-title\">name</span> \"<span class=\"hljs-title\">run</span>-<span class=\"hljs-title\">exhibitor</span>\" \\</span>\n</span> -<span class=\"ruby\">-repo <span class=\"hljs-string\">\"https://github.com/gruntwork-io/package-zookeeper\"</span> \\\n</span> -<span class=\"ruby\">-tag <span class=\"hljs-string\">\"v0.0.4\"</span>\n</span></pre>\n<p>We recommend running this module, as well as <a href=\"/repos/v0.6.5/package-zookeeper/modules/install-exhibitor\" class=\"preview__body--description--blue\">install-exhibitor</a>, as part of a\n<a href=\"https://www.packer.io/\" class=\"preview__body--description--blue\" target=\"_blank\">Packer</a> template to create an <a href=\"http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html\" class=\"preview__body--description--blue\" target=\"_blank\">Amazon Machine Image\n(AMI)</a> (see the <a href=\"/repos/v0.6.5/package-zookeeper/examples/zookeeper-ami\" class=\"preview__body--description--blue\">zookeeper-ami\nexample</a> for a fully-working sample code).</p>\n<h2 class=\"preview__body--subtitle\" id=\"install-command-line-arguments\">Install command line arguments</h2>\n<p>When installing the <code>run-exhibitor</code> script, you can pass in the following arguments, all optional:</p>\n<ul>\n<li><code>--install-dir</code>: The directory where the <code>run-exhibitor</code> script should be installed. Default: <code>/opt/exhibitor</code>.</li>\n<li><code>--user</code>: The user who will be set as the owner of <code>--install-dir</code>. Default: <code>zookeeper</code>.</li>\n</ul>\n<p>If you're using <code>gruntwork-install</code> to run this module, you can pass these arguments using <code>--module-param</code> arguments.\nExample:</p>\n<pre>gruntwork-install \\\n -<span class=\"ruby\">-<span class=\"hljs-class\"><span class=\"hljs-keyword\">module</span>-<span class=\"hljs-title\">name</span> \"<span class=\"hljs-title\">run</span>-<span class=\"hljs-title\">exhibitor</span>\" \\</span>\n</span> -<span class=\"ruby\">-repo <span class=\"hljs-string\">\"https://github.com/gruntwork-io/package-zookeeper\"</span> \\\n</span> -<span class=\"ruby\">-tag <span class=\"hljs-string\">\"v0.0.4\"</span> \\\n</span> -<span class=\"ruby\">-<span class=\"hljs-class\"><span class=\"hljs-keyword\">module</span>-<span class=\"hljs-title\">param</span> \"<span class=\"hljs-title\">install</span>-<span class=\"hljs-title\">dir</span>=/<span class=\"hljs-title\">opt</span>/<span class=\"hljs-title\">exhibitor</span>\"</span>\n</span></pre>\n<h2 class=\"preview__body--subtitle\" id=\"run-exhibitor-command-line-arguments\">run-exhibitor command line arguments</h2>\n<p>When you run the <code>run-exhibitor</code>, it has three required arguments:</p>\n<ul>\n<li><code>--shared-config-s3-bucket</code>: The name of the S3 bucket where shared config for ZooKeeper servers is stored.</li>\n<li><code>--shared-config-s3-key</code>: The path in the S3 bucket where shared config for ZooKeeper servers is stored (e.g. <code>zoo.cfg</code>).</li>\n<li><code>--shared-config-s3-region</code>: The AWS region where the shared config S3 bucket lives (e.g. <code>us-east-1</code>).</li>\n</ul>\n<p>The script also accepts a number of optional parameters to customize both Exhibitor and ZooKeeper behavior. Run the\nscript with the <code>--help</code> flag to see all available options. See the <a href=\"#exhibitor-config\" class=\"preview__body--description--blue\">Exhibitor config docs</a> below\nfor the highlights.</p>\n<h2 class=\"preview__body--subtitle\" id=\"exhibitor-config\">Exhibitor config</h2>\n<p>The <code>run-exhibitor</code> script generates an <a href=\"https://github.com/soabase/exhibitor/wiki/Configuration-UI\" class=\"preview__body--description--blue\" target=\"_blank\">Exhibitor configuration\nfile</a> that specifies all the settings for how to run\nExhibitor and ZooKeeper.</p>\n<p>Here are the key items to pay attention to:</p>\n<ul>\n<li><a href=\"#server-ips-and-ids\" class=\"preview__body--description--blue\">Server IPs and IDs</a></li>\n<li><a href=\"#jvm-memory-settings\" class=\"preview__body--description--blue\">JVM memory settings</a></li>\n<li><a href=\"#transaction-logs\" class=\"preview__body--description--blue\">Transaction logs</a></li>\n<li><a href=\"#application-logs\" class=\"preview__body--description--blue\">Application logs</a></li>\n</ul>\n<h3 class=\"preview__body--subtitle\" id=\"server-i-ps-and-i-ds\">Server IPs and IDs</h3>\n<p>Every ZooKeeper server needs an IP address and a unique ID. By default, the <code>run-exhibitor</code> script will use ENIs as the\nIP addresses (check out the <a href=\"#static-ips-and-enis\" class=\"preview__body--description--blue\">Static IPs and ENIs documentation</a> for why we use ENIs) and the\n<code>ServerGroupIndex</code> tag of each server as its ID.</p>\n<p>Here's what the <code>run-exhibitor</code> script does:</p>\n<ol>\n<li>\n<p>Use the AWS CLI to look up the value of the <code>ServerGroupName</code> tag on the current server. This tag is set by the\n<a href=\"/repos/module-asg/modules/server-group\" class=\"preview__body--description--blue\">server-group module</a>, which is what\npowers the <a href=\"/repos/v0.6.5/package-zookeeper/modules/zookeeper-cluster\" class=\"preview__body--description--blue\">zookeeper-cluster module</a>. Every server in a single ZooKeeper cluster\nshould have this same tag.</p>\n</li>\n<li>\n<p>Use the AWS CLI to look up all ENIs with that same <code>ServerGroupName</code>. The <code>server-group</code> module tags each ENI it\ncreates for a single server group with the same value. The private IP addresses of these ENIs are used as the\nIPs of the ZooKeeper servers.</p>\n</li>\n<li>\n<p>Each ENI and server pair also has a unique <code>ServerGroupIndex</code> tag added by the <code>server-group</code> module. This index\nis used as the unique ID for each server.</p>\n</li>\n</ol>\n<p>You can override this behavior by specifying custom <code>--zookeeper-servers-spec</code> and <code>--hostname</code> arguments.</p>\n<h3 class=\"preview__body--subtitle\" id=\"jvm-memory-settings\">JVM memory settings</h3>\n<p>By default, we configure ZooKeeper to run with <code>1000m</code> of memory. You can override this with the <code> --zookeeper-memory</code>\nargument to <code>run-exhibitor</code>. If you wish to override all JVM settings for ZooKeeper, you can use the\n<code>--zookeeper-java-env</code> argument.</p>\n<h3 class=\"preview__body--subtitle\" id=\"transaction-logs\">Transaction logs</h3>\n<p>By default, the <code>run-exhibitor</code> script will configure ZooKeeper to store transaction logs in\n<code>/opt/zookeeper/transaction-logs</code>. We strongly recommend mounting a separate EBS Volume at this path, as every write\nto ZooKeeper gets immediately persisted to disk for durability, and you get much better performance if there is no\ncontention for the hard drive from other processes.</p>\n<p>You can override the transaction logs path via the <code>--zookeeper-transaction-log-dir</code> argument.</p>\n<h3 class=\"preview__body--subtitle\" id=\"application-logs\">Application logs</h3>\n<p>By default, all Exhibitor application logs are stored in <code>/opt/zookeeper/logs</code>. You can override this with the\n<code>--exhibitor-logs-dir</code> argument. The ZooKeeper logs are also stored in <code>/opt/zookeeper/logs/</code>, as configured in\n<a href=\"/repos/v0.6.5/package-zookeeper/modules/install-exhibitor/zookeeper-log4j.properties\" class=\"preview__body--description--blue\">zookeeper-log4j.properties</a>. You can override ZooKeeper's\nlogging behavior by specifying the path to a custom <code>log4j.properties</code> file using the <code>--zookeeper-log4j-properties</code>\nargument.</p>\n","repoName":"package-zookeeper","repoRef":"v0.6.6","serviceDescriptor":{"serviceName":"Apache ZooKeeper","serviceRepoName":"package-zookeeper","serviceRepoOrg":"gruntwork-io","cloudProviders":["aws"],"description":"Deploy an Apache ZooKeeper cluster. Supports automatic bootstrap, Exhibitor, zero-downtime rolling deployment, and auto healing.","imageUrl":"zookeeper.png","licenseType":"subscriber","technologies":["Terraform","Bash"],"compliance":[],"tags":[""]},"serviceCategoryName":"NoSQL","fileName":"README.md","filePath":"/modules/run-exhibitor","title":"Repo Browser: Apache ZooKeeper","description":"Browse the repos in the Gruntwork Infrastructure as Code Library."}