Because Coordinating Distributed Systems is a Zoo (2024)

  • Scripts

    • zkServer.sh
    • zkCli.sh
    • zkEnv.sh
    • zkCleanup.sh
    • zkTxnLogToolkit.sh
    • zkSnapShotToolkit.sh
    • zkSnapshotRecursiveSummaryToolkit.sh
    • zkSnapshotComparer.sh
  • Benchmark

    • YCSB
    • zk-smoketest
  • Testing

    • Fault Injection Framework
      • Byteman
    • Jepsen Test

Scripts

zkServer.sh

A command for the operations for the ZooKeeper server.

Usage: ./zkServer.sh {start|start-foreground|stop|version|restart|status|upgrade|print-cmd}# start the server./zkServer.sh start# start the server in the foreground for debugging./zkServer.sh start-foreground# stop the server./zkServer.sh stop# restart the server./zkServer.sh restart# show the status,mode,role of the server./zkServer.sh statusJMX enabled by defaultUsing config: /data/software/zookeeper/conf/zoo.cfgMode: standalone# Deprecated./zkServer.sh upgrade# print the parameters of the start-up./zkServer.sh print-cmd# show the version of the ZooKeeper server./zkServer.sh versionApache ZooKeeper, version 3.6.0-SNAPSHOT 06/11/2019 05:39 GMT

The status command establishes a client connection to the server to execute diagnostic commands. When the ZooKeeper cluster is started in client SSL only mode (by omitting the clientPort from the zoo.cfg), then additional SSL related configuration has to be provided before using the ./zkServer.sh status command to find out if the ZooKeeper server is running. An example:

CLIENT_JVMFLAGS="-Dzookeeper.clientCnxnSocket=org.apache.zookeeper.ClientCnxnSocketNetty -Dzookeeper.ssl.trustStore.location=/tmp/clienttrust.jks -Dzookeeper.ssl.trustStore.password=password -Dzookeeper.ssl.keyStore.location=/tmp/client.jks -Dzookeeper.ssl.keyStore.password=password -Dzookeeper.client.secure=true" ./zkServer.sh status

zkCli.sh

Look at the ZooKeeperCLI

zkEnv.sh

The environment setting for the ZooKeeper server

# the setting of log propertyZOO_LOG_DIR: the directory to store the logs

zkCleanup.sh

Clean up the old snapshots and transaction logs.

Usage: * args dataLogDir [snapDir] -n count * dataLogDir -- path to the txn log directory * snapDir -- path to the snapshot directory * count -- the number of old snaps/logs you want to keep, value should be greater than or equal to 3# Keep the latest 5 logs and snapshots./zkCleanup.sh -n 5

zkTxnLogToolkit.sh

TxnLogToolkit is a command line tool shipped with ZooKeeper which is capable of recovering transaction log entries with broken CRC.

Running it without any command line parameters or with the -h,--help argument, it outputs the following help page:

$ bin/zkTxnLogToolkit.shusage: TxnLogToolkit [-dhrv] txn_log_file_name-d,--dump Dump mode. Dump all entries of the log file. (this is the default)-h,--help Print help message-r,--recover Recovery mode. Re-calculate CRC for broken entries.-v,--verbose Be verbose in recovery mode: print all entries, not just fixed ones.-y,--yes Non-interactive mode: repair all CRC errors without asking

The default behaviour is safe: it dumps the entries of the given transaction log file to the screen: (same as using -d,--dump parameter)

$ bin/zkTxnLogToolkit.sh log.100000001ZooKeeper Transactional Log File with dbid 0 txnlog format version 24/5/18 2:15:58 PM CEST session 0x16295bafcc40000 cxid 0x0 zxid 0x100000001 createSession 30000CRC ERROR - 4/5/18 2:16:05 PM CEST session 0x16295bafcc40000 cxid 0x1 zxid 0x100000002 closeSession null4/5/18 2:16:05 PM CEST session 0x16295bafcc40000 cxid 0x1 zxid 0x100000002 closeSession null4/5/18 2:16:12 PM CEST session 0x26295bafcc90000 cxid 0x0 zxid 0x100000003 createSession 300004/5/18 2:17:34 PM CEST session 0x26295bafcc90000 cxid 0x0 zxid 0x200000001 closeSession null4/5/18 2:17:34 PM CEST session 0x16295bd23720000 cxid 0x0 zxid 0x200000002 createSession 300004/5/18 2:18:02 PM CEST session 0x16295bd23720000 cxid 0x2 zxid 0x200000003 create '/andor,#626262,v{s{31,s{'world,'anyone}}},F,1EOF reached after 6 txns.

There's a CRC error in the 2nd entry of the above transaction log file. In dump mode, the toolkit only prints this information to the screen without touching the original file. In recovery mode (-r,--recover flag) the original file still remains untouched and all transactions will be copied over to a new txn log file with ".fixed" suffix. It recalculates CRC values and copies the calculated value, if it doesn't match the original txn entry. By default, the tool works interactively: it asks for confirmation whenever CRC error encountered.

$ bin/zkTxnLogToolkit.sh -r log.100000001ZooKeeper Transactional Log File with dbid 0 txnlog format version 2CRC ERROR - 4/5/18 2:16:05 PM CEST session 0x16295bafcc40000 cxid 0x1 zxid 0x100000002 closeSession nullWould you like to fix it (Yes/No/Abort) ?

Answering Yes means the newly calculated CRC value will be outputted to the new file. No means that the original CRC value will be copied over. Abort will abort the entire operation and exits. (In this case the ".fixed" will not be deleted and left in a half-complete state: contains only entries which have already been processed or only the header if the operation was aborted at the first entry.)

$ bin/zkTxnLogToolkit.sh -r log.100000001ZooKeeper Transactional Log File with dbid 0 txnlog format version 2CRC ERROR - 4/5/18 2:16:05 PM CEST session 0x16295bafcc40000 cxid 0x1 zxid 0x100000002 closeSession nullWould you like to fix it (Yes/No/Abort) ? yEOF reached after 6 txns.Recovery file log.100000001.fixed has been written with 1 fixed CRC error(s)

The default behaviour of recovery is to be silent: only entries with CRC error get printed to the screen. One can turn on verbose mode with the -v,--verbose parameter to see all records. Interactive mode can be turned off with the -y,--yes parameter. In this case all CRC errors will be fixed in the new transaction file.

zkSnapShotToolkit.sh

Dump a snapshot file to stdout, showing the detailed information of the each zk-node.

# help./zkSnapShotToolkit.sh/usr/bin/javaUSAGE: SnapshotFormatter [-d|-json] snapshot_file -d dump the data for each znode -json dump znode info in json format# show the each zk-node info without data content./zkSnapShotToolkit.sh /data/zkdata/version-2/snapshot.fa01000186d/zk-latencies_4/session_946 cZxid = 0x00000f0003110b ctime = Wed Sep 19 21:58:22 CST 2018 mZxid = 0x00000f0003110b mtime = Wed Sep 19 21:58:22 CST 2018 pZxid = 0x00000f0003110b cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x00000000000000 dataLength = 100# [-d] show the each zk-node info with data content./zkSnapShotToolkit.sh -d /data/zkdata/version-2/snapshot.fa01000186d/zk-latencies2/session_26229 cZxid = 0x00000900007ba0 ctime = Wed Aug 15 20:13:52 CST 2018 mZxid = 0x00000900007ba0 mtime = Wed Aug 15 20:13:52 CST 2018 pZxid = 0x00000900007ba0 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x00000000000000 data = eHh4eHh4eHh4eHh4eA==# [-json] show the each zk-node info with json format./zkSnapShotToolkit.sh -json /data/zkdata/version-2/snapshot.fa01000186d[[1,0,{"progname":"SnapshotFormatter.java","progver":"0.01","timestamp":1559788148637},[{"name":"\/","asize":0,"dsize":0,"dev":0,"ino":1001},[{"name":"zookeeper","asize":0,"dsize":0,"dev":0,"ino":1002},{"name":"config","asize":0,"dsize":0,"dev":0,"ino":1003},[{"name":"quota","asize":0,"dsize":0,"dev":0,"ino":1004},[{"name":"test","asize":0,"dsize":0,"dev":0,"ino":1005},{"name":"zookeeper_limits","asize":52,"dsize":52,"dev":0,"ino":1006},{"name":"zookeeper_stats","asize":15,"dsize":15,"dev":0,"ino":1007}]]],{"name":"test","asize":0,"dsize":0,"dev":0,"ino":1008}]]

zkSnapshotRecursiveSummaryToolkit.sh

Recursively collect and display child count and data size for a selected node.

$./zkSnapshotRecursiveSummaryToolkit.shUSAGE:SnapshotRecursiveSummary <snapshot_file> <starting_node> <max_depth>snapshot_file: path to the zookeeper snapshotstarting_node: the path in the zookeeper tree where the traversal should beginmax_depth: defines the depth where the tool still writes to the output. 0 means there is no depth limit, every non-leaf node's stats will be displayed, 1 means it will only contain the starting node's and it's children's stats, 2 ads another level and so on. This ONLY affects the level of details displayed, NOT the calculation.
# recursively collect and display child count and data for the root node and 2 levels below it./zkSnapshotRecursiveSummaryToolkit.sh /data/zkdata/version-2/snapshot.fa01000186d / 2/ children: 1250511 data: 1952186580-- /zookeeper-- children: 1-- data: 0-- /solr-- children: 1773-- data: 8419162---- /solr/configs---- children: 1640---- data: 8407643---- /solr/overseer---- children: 6---- data: 0---- /solr/live_nodes---- children: 3---- data: 0

zkSnapshotComparer.sh

SnapshotComparer is a tool that loads and compares two snapshots with configurable threshold and various filters, and outputs information about the delta.

The delta includes specific znode paths added, updated, deleted comparing one snapshot to another.

It's useful in use cases that involve snapshot analysis, such as offline data consistency checking, and data trending analysis (e.g. what's growing under which zNode path during when).

This tool only outputs information about permanent nodes, ignoring both sessions and ephemeral nodes.

It provides two tuning parameters to help filter out noise: 1. --nodes Threshold number of children added/removed; 2. --bytes Threshold number of bytes added/removed.

Locate Snapshots

Snapshots can be found in Zookeeper Data Directory which configured in conf/zoo.cfg when set up Zookeeper server.

Supported Snapshot Formats

This tool supports uncompressed snapshot format, and compressed snapshot file formats: snappy and gz. Snapshots with different formats can be compared using this tool directly without decompression.

Running the Tool

Running the tool with no command line argument or an unrecognized argument, it outputs the following help page:

usage: java -cp <classPath> org.apache.zookeeper.server.SnapshotComparer -b,--bytes <BYTETHRESHOLD> (Required) The node data delta size threshold, in bytes, for printing the node. -d,--debug Use debug output. -i,--interactive Enter interactive mode. -l,--left <LEFT> (Required) The left snapshot file. -n,--nodes <NODETHRESHOLD> (Required) The descendant node delta size threshold, in nodes, for printing the node. -r,--right <RIGHT> (Required) The right snapshot file.

Example Command:

./bin/zkSnapshotComparer.sh -l /zookeeper-data/backup/snapshot.d.snappy -r /zookeeper-data/backup/snapshot.44 -b 2 -n 1

Example Output:

...Deserialized snapshot in snapshot.44 in 0.002741 secondsProcessed data tree in 0.000361 secondsNode count: 10Total size: 0Max depth: 4Count of nodes at depth 0: 1Count of nodes at depth 1: 2Count of nodes at depth 2: 4Count of nodes at depth 3: 3Node count: 22Total size: 2903Max depth: 5Count of nodes at depth 0: 1Count of nodes at depth 1: 2Count of nodes at depth 2: 4Count of nodes at depth 3: 7Count of nodes at depth 4: 8Printing analysis for nodes difference larger than 2 bytes or node count difference larger than 1.Analysis for depth 0Node found in both trees. Delta: 2903 bytes, 12 descendantsAnalysis for depth 1Node /zk_test found in both trees. Delta: 2903 bytes, 12 descendantsAnalysis for depth 2Node /zk_test/gz found in both trees. Delta: 730 bytes, 3 descendantsNode /zk_test/snappy found in both trees. Delta: 2173 bytes, 9 descendantsAnalysis for depth 3Node /zk_test/gz/12345 found in both trees. Delta: 9 bytes, 1 descendantsNode /zk_test/gz/a found only in right tree. Descendant size: 721. Descendant count: 0Node /zk_test/snappy/anotherTest found in both trees. Delta: 1738 bytes, 2 descendantsNode /zk_test/snappy/test_1 found only in right tree. Descendant size: 344. Descendant count: 3Node /zk_test/snappy/test_2 found only in right tree. Descendant size: 91. Descendant count: 2Analysis for depth 4Node /zk_test/gz/12345/abcdef found only in right tree. Descendant size: 9. Descendant count: 0Node /zk_test/snappy/anotherTest/abc found only in right tree. Descendant size: 1738. Descendant count: 0Node /zk_test/snappy/test_1/a found only in right tree. Descendant size: 93. Descendant count: 0Node /zk_test/snappy/test_1/b found only in right tree. Descendant size: 251. Descendant count: 0Node /zk_test/snappy/test_2/xyz found only in right tree. Descendant size: 33. Descendant count: 0Node /zk_test/snappy/test_2/y found only in right tree. Descendant size: 58. Descendant count: 0All layers compared.

Interactive Mode

Use "-i" or "--interactive" to enter interactive mode:

./bin/zkSnapshotComparer.sh -l /zookeeper-data/backup/snapshot.d.snappy -r /zookeeper-data/backup/snapshot.44 -b 2 -n 1 -i

There are three options to proceed:

- Press enter to move to print current depth layer;- Type a number to jump to and print all nodes at a given depth;- Enter an ABSOLUTE path to print the immediate subtree of a node. Path must start with '/'.

Note: As indicated by the interactive messages, the tool only shows analysis on the result that filtered by tuning parameters bytes threshold and nodes threshold.

Press enter to print current depth layer:

Current depth is 0Press enter to move to print current depth layer;...Printing analysis for nodes difference larger than 2 bytes or node count difference larger than 1.Analysis for depth 0Node found in both trees. Delta: 2903 bytes, 12 descendants

Type a number to jump to and print all nodes at a given depth:

(Jump forward)

Current depth is 1...Type a number to jump to and print all nodes at a given depth;...3Printing analysis for nodes difference larger than 2 bytes or node count difference larger than 1.Analysis for depth 3Node /zk_test/gz/12345 found in both trees. Delta: 9 bytes, 1 descendantsNode /zk_test/gz/a found only in right tree. Descendant size: 721. Descendant count: 0Filtered node /zk_test/gz/anotherOne of left size 0, right size 0Filtered right node /zk_test/gz/b of size 0Node /zk_test/snappy/anotherTest found in both trees. Delta: 1738 bytes, 2 descendantsNode /zk_test/snappy/test_1 found only in right tree. Descendant size: 344. Descendant count: 3Node /zk_test/snappy/test_2 found only in right tree. Descendant size: 91. Descendant count: 2

(Jump back)

Current depth is 3...Type a number to jump to and print all nodes at a given depth;...0Printing analysis for nodes difference larger than 2 bytes or node count difference larger than 1.Analysis for depth 0Node found in both trees. Delta: 2903 bytes, 12 descendants

Out of range depth is handled:

Current depth is 1...Type a number to jump to and print all nodes at a given depth;...10Printing analysis for nodes difference larger than 2 bytes or node count difference larger than 1.Depth must be in range [0, 4]

Enter an ABSOLUTE path to print the immediate subtree of a node:

Current depth is 3...Enter an ABSOLUTE path to print the immediate subtree of a node./zk_testPrinting analysis for nodes difference larger than 2 bytes or node count difference larger than 1.Analysis for node /zk_testNode /zk_test/gz found in both trees. Delta: 730 bytes, 3 descendantsNode /zk_test/snappy found in both trees. Delta: 2173 bytes, 9 descendants

Invalid path is handled:

Current depth is 3...Enter an ABSOLUTE path to print the immediate subtree of a node./non-exist-pathPrinting analysis for nodes difference larger than 2 bytes or node count difference larger than 1.Analysis for node /non-exist-pathPath /non-exist-path is neither found in left tree nor right tree.

Invalid input is handled:

Current depth is 1- Press enter to move to print current depth layer;- Type a number to jump to and print all nodes at a given depth;- Enter an ABSOLUTE path to print the immediate subtree of a node. Path must start with '/'.12223999999999999999999999999999999999999Printing analysis for nodes difference larger than 2 bytes or node count difference larger than 1.Input 12223999999999999999999999999999999999999 is not valid. Depth must be in range [0, 4]. Path must be an absolute path which starts with '/'.

Exit interactive mode automatically when all layers are compared:

Printing analysis for nodes difference larger than 2 bytes or node count difference larger than 1.Analysis for depth 4Node /zk_test/gz/12345/abcdef found only in right tree. Descendant size: 9. Descendant count: 0Node /zk_test/snappy/anotherTest/abc found only in right tree. Descendant size: 1738. Descendant count: 0Filtered right node /zk_test/snappy/anotherTest/abcd of size 0Node /zk_test/snappy/test_1/a found only in right tree. Descendant size: 93. Descendant count: 0Node /zk_test/snappy/test_1/b found only in right tree. Descendant size: 251. Descendant count: 0Filtered right node /zk_test/snappy/test_1/c of size 0Node /zk_test/snappy/test_2/xyz found only in right tree. Descendant size: 33. Descendant count: 0Node /zk_test/snappy/test_2/y found only in right tree. Descendant size: 58. Descendant count: 0All layers compared.

Or use ^c to exit interactive mode anytime.

Benchmark

YCSB

Quick Start

This section describes how to run YCSB on ZooKeeper.

1. Start ZooKeeper Server(s)

2. Install Java and Maven

3. Set Up YCSB

Git clone YCSB and compile:

git clone http://github.com/brianfrankcooper/YCSB.git# more details in the landing page for instructions on downloading YCSB(https://github.com/brianfrankcooper/YCSB#getting-started).cd YCSBmvn -pl site.ycsb:zookeeper-binding -am clean package -DskipTests

4. Provide ZooKeeper Connection Parameters

Set connectString, sessionTimeout, watchFlag in the workload you plan to run.

  • zookeeper.connectString
  • zookeeper.sessionTimeout
  • zookeeper.watchFlag
  • A parameter for enabling ZooKeeper's watch, optional values:true or false.the default value is false.
  • This parameter cannot test the watch performance, but for testing what effect will take on the read/write requests when enabling the watch.
    ./bin/ycsb run zookeeper -s -P workloads/workloadb -p zookeeper.connectString=127.0.0.1:2181/benchmark -p zookeeper.watchFlag=true

Or, you can set configs with the shell command, EG:

# create a /benchmark namespace for sake of cleaning up the workspace after test.# e.g the CLI:create /benchmark./bin/ycsb run zookeeper -s -P workloads/workloadb -p zookeeper.connectString=127.0.0.1:2181/benchmark -p zookeeper.sessionTimeout=30000

5. Load data and run tests

Load the data:

# -p recordcount,the count of records/paths you want to insert./bin/ycsb load zookeeper -s -P workloads/workloadb -p zookeeper.connectString=127.0.0.1:2181/benchmark -p recordcount=10000 > outputLoad.txt

Run the workload test:

# YCSB workloadb is the most suitable workload for read-heavy workload for the ZooKeeper in the real world.# -p fieldlength, test the length of value/data-content took effect on performance./bin/ycsb run zookeeper -s -P workloads/workloadb -p zookeeper.connectString=127.0.0.1:2181/benchmark -p fieldlength=1000# -p fieldcount./bin/ycsb run zookeeper -s -P workloads/workloadb -p zookeeper.connectString=127.0.0.1:2181/benchmark -p fieldcount=20# -p hdrhistogram.percentiles,show the hdrhistogram benchmark result./bin/ycsb run zookeeper -threads 1 -P workloads/workloadb -p zookeeper.connectString=127.0.0.1:2181/benchmark -p hdrhistogram.percentiles=10,25,50,75,90,95,99,99.9 -p histogram.buckets=500# -threads: multi-clients test, increase the **maxClientCnxns** in the zoo.cfg to handle more connections../bin/ycsb run zookeeper -threads 10 -P workloads/workloadb -p zookeeper.connectString=127.0.0.1:2181/benchmark# show the timeseries benchmark result./bin/ycsb run zookeeper -threads 1 -P workloads/workloadb -p zookeeper.connectString=127.0.0.1:2181/benchmark -p measurementtype=timeseries -p timeseries.granularity=50# cluster test./bin/ycsb run zookeeper -P workloads/workloadb -p zookeeper.connectString=192.168.10.43:2181,192.168.10.45:2181,192.168.10.27:2181/benchmark# test leader's read/write performance by setting zookeeper.connectString to leader's(192.168.10.43:2181)./bin/ycsb run zookeeper -P workloads/workloadb -p zookeeper.connectString=192.168.10.43:2181/benchmark# test for large znode(by default: jute.maxbuffer is 1048575 bytes/1 MB ). Notice:jute.maxbuffer should also be set the same value in all the zk servers../bin/ycsb run zookeeper -jvm-args="-Djute.maxbuffer=4194304" -s -P workloads/workloadc -p zookeeper.connectString=127.0.0.1:2181/benchmark# Cleaning up the workspace after finishing the benchmark.# e.g the CLI:deleteall /benchmark

zk-smoketest

zk-smoketest provides a simple smoketest client for a ZooKeeper ensemble. Useful for verifying new, updated, existing installations. More details are here.

Testing

Fault Injection Framework

Byteman

  • Byteman is a tool which makes it easy to trace, monitor and test the behaviour of Java application and JDK runtime code. It injects Java code into your application methods or into Java runtime methods without the need for you to recompile, repackage or even redeploy your application. Injection can be performed at JVM startup or after startup while the application is still running.
  • Visit the official website to download the latest release
  • A brief tutorial can be found here
    Preparations:# attach the byteman to 3 zk servers during runtime# 55001,55002,55003 is byteman binding port; 714,740,758 is the zk server pid./bminstall.sh -b -Dorg.jboss.byteman.transform.all -Dorg.jboss.byteman.verbose -p 55001 714./bminstall.sh -b -Dorg.jboss.byteman.transform.all -Dorg.jboss.byteman.verbose -p 55002 740./bminstall.sh -b -Dorg.jboss.byteman.transform.all -Dorg.jboss.byteman.verbose -p 55003 758# load the fault injection script./bmsubmit.sh -p 55002 -l my_zk_fault_injection.btm# unload the fault injection script./bmsubmit.sh -p 55002 -u my_zk_fault_injectionr.btm

Look at the below examples to customize your byteman fault injection script

Example 1: This script makes leader's zxid roll over, to force re-election.

cat zk_leader_zxid_roll_over.btmRULE trace zk_leader_zxid_roll_overCLASS org.apache.zookeeper.server.quorum.LeaderMETHOD proposeIF trueDO traceln("*** Leader zxid has rolled over, forcing re-election ***"); $1.zxid = 4294967295LENDRULE

Example 2: This script makes the leader drop the ping packet to a specific follower. The leader will close the LearnerHandler with that follower, and the follower will enter the state:LOOKING then re-enter the quorum with the state:FOLLOWING

cat zk_leader_drop_ping_packet.btmRULE trace zk_leader_drop_ping_packetCLASS org.apache.zookeeper.server.quorum.LearnerHandlerMETHOD pingAT ENTRYIF $0.sid == 2DO traceln("*** Leader drops ping packet to sid: 2 ***"); return;ENDRULE

Example 3: This script makes one follower drop ACK packet which has no big effect in the broadcast phrase, since after receiving the majority of ACKs from the followers, the leader can commit that proposal

cat zk_leader_drop_ping_packet.btmRULE trace zk.follower_drop_ack_packetCLASS org.apache.zookeeper.server.quorum.SendAckRequestProcessorMETHOD processRequestAT ENTRYIF trueDO traceln("*** Follower drops ACK packet ***"); return;ENDRULE

Jepsen Test

A framework for distributed systems verification, with fault injection. Jepsen has been used to verify everything from eventually-consistent commutative databases to linearizable coordination systems to distributed task schedulers. more details can be found in jepsen-io

Running the Dockerized Jepsen is the simplest way to use the Jepsen.

Installation:

git clone git@github.com:jepsen-io/jepsen.gitcd docker# maybe a long time for the first init../up.sh# docker ps to check one control node and five db nodes are updocker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8265f1d3f89c docker_control "/bin/sh -c /init.sh" 9 hours ago Up 4 hours 0.0.0.0:32769->8080/tcp jepsen-control 8a646102da44 docker_n5 "/run.sh" 9 hours ago Up 3 hours 22/tcp jepsen-n5 385454d7e520 docker_n1 "/run.sh" 9 hours ago Up 9 hours 22/tcp jepsen-n1 a62d6a9d5f8e docker_n2 "/run.sh" 9 hours ago Up 9 hours 22/tcp jepsen-n2 1485e89d0d9a docker_n3 "/run.sh" 9 hours ago Up 9 hours 22/tcp jepsen-n3 27ae01e1a0c5 docker_node "/run.sh" 9 hours ago Up 9 hours 22/tcp jepsen-node 53c444b00ebd docker_n4 "/run.sh" 9 hours ago Up 9 hours 22/tcp jepsen-n4

Running & Test

# Enter into the container:jepsen-controldocker exec -it jepsen-control bash# Testcd zookeeper && lein run test --concurrency 10# See something like the following to assert that ZooKeeper has passed the Jepsen testINFO [2019-04-01 11:25:23,719] jepsen worker 8 - jepsen.util 8:ok:read2INFO [2019-04-01 11:25:23,722] jepsen worker 3 - jepsen.util 3:invoke:cas[0 4]INFO [2019-04-01 11:25:23,760] jepsen worker 3 - jepsen.util 3:fail:cas[0 4]INFO [2019-04-01 11:25:23,791] jepsen worker 1 - jepsen.util 1:invoke:readnilINFO [2019-04-01 11:25:23,794] jepsen worker 1 - jepsen.util 1:ok:read2INFO [2019-04-01 11:25:24,038] jepsen worker 0 - jepsen.util 0:invoke:write4INFO [2019-04-01 11:25:24,073] jepsen worker 0 - jepsen.util 0:ok:write4...............................................................................Everything looks good! ヽ(‘ー`)ノ

Reference: read this blog to learn more about the Jepsen test for the Zookeeper.

Because Coordinating Distributed Systems is a Zoo (2024)

References

Top Articles
Latest Posts
Article information

Author: The Hon. Margery Christiansen

Last Updated:

Views: 5480

Rating: 5 / 5 (70 voted)

Reviews: 85% of readers found this page helpful

Author information

Name: The Hon. Margery Christiansen

Birthday: 2000-07-07

Address: 5050 Breitenberg Knoll, New Robert, MI 45409

Phone: +2556892639372

Job: Investor Mining Engineer

Hobby: Sketching, Cosplaying, Glassblowing, Genealogy, Crocheting, Archery, Skateboarding

Introduction: My name is The Hon. Margery Christiansen, I am a bright, adorable, precious, inexpensive, gorgeous, comfortable, happy person who loves writing and wants to share my knowledge and understanding with you.