Skip to content

Instantly share code, notes, and snippets.

@eiri
Created August 21, 2021 03:18
Show Gist options
  • Save eiri/2efc1b0ef401a21c51cd534871c20d30 to your computer and use it in GitHub Desktop.
Save eiri/2efc1b0ef401a21c51cd534871c20d30 to your computer and use it in GitHub Desktop.
Adding a new node to CouchDB cluster primer
-s
-H "Content-Type: application/json"
-H "Accept: application/json"
-u admin:god

Adding a new node to a CouchDB cluster

Create 2 node cluster with a sample database

Start 2 nodes

$ docker-compose up -d
[+] Running 5/5
 ⠿ Network sandbox_default         Created          0.1s
 ⠿ Volume "sandbox_couchdb_data2"  Created          0.0s
 ⠿ Volume "sandbox_couchdb_data1"  Created          0.0s
 ⠿ Container sandbox_node2_1       Started          1.9s
 ⠿ Container sandbox_node1_1       Started          2.0s

$ curl -q -K .curlrc http://localhost:15984 | jq '.'
{
  "couchdb": "Welcome",
  "version": "3.1.1",
  "git_sha": "ce596c65d",
  "uuid": "7a5a39814f151447abd8ef79269420b7",
  "features": [
    "access-ready",
    "partitioned",
    "pluggable-storage-engines",
    "reshard",
    "scheduler"
  ],
  "vendor": {
    "name": "The Apache Software Foundation"
  }
}

$ curl -q -K .curlrc -X GET http://localhost:15984/_membership | jq '.'
{
  "all_nodes": [
    "couchdb@node1.dev"
  ],
  "cluster_nodes": [
    "couchdb@node1.dev"
  ]
}
$ curl -q -K .curlrc -X GET http://localhost:25984/_membership | jq '.'
{
  "all_nodes": [
    "couchdb@node2.dev"
  ],
  "cluster_nodes": [
    "couchdb@node2.dev"
  ]
}

Join nodes into a cluster

$ curl -q -K .curlrc -X PUT http://localhost:15984/_node/_local/_config/couchdb/uuid -d '"INIT-UUID"'
"7a5a39814f151447abd8ef79269420b7"
$ curl -q -K .curlrc -X PUT http://localhost:25984/_node/_local/_config/couchdb/uuid -d '"INIT-UUID"'
""
$ curl -q -K .curlrc -X POST http://localhost:15984/_cluster_setup -d '{"action": "enable_cluster", "bind_address": "0.0.0.0", "node_count": "2"}'
{"error":"bad_request","reason":"Cluster is already enabled"}
$ curl -q -K .curlrc -X POST http://localhost:15984/_cluster_setup -d '{"action": "add_node", "host": "node2.dev", "port": 5984, "username": "admin", "password": "god"}'
{"ok":true}
$ curl -q -K .curlrc -X POST http://localhost:15984/_cluster_setup -d '{"action": "finish_cluster"}'
{"ok":true}
$ curl -q -K .curlrc -X GET http://localhost:15984/_cluster_setup | jq '.'
{
  "state": "cluster_finished"
}

$ curl -q -K .curlrc -X GET http://localhost:15984/_membership | jq '.'
{
  "all_nodes": [
    "couchdb@node1.dev",
    "couchdb@node2.dev"
  ],
  "cluster_nodes": [
    "couchdb@node1.dev",
    "couchdb@node2.dev"
  ]
}
$ curl -q -K .curlrc -X GET http://localhost:25984/_membership | jq '.'
{
  "all_nodes": [
    "couchdb@node1.dev",
    "couchdb@node2.dev"
  ],
  "cluster_nodes": [
    "couchdb@node1.dev",
    "couchdb@node2.dev"
  ]
}

Create a database with some random docs

$ curl -q -K .curlrc -X PUT http://localhost:15984/koi
{"ok":true}

$ while read -r row; do \
        curl -q -K .curlrc -X POST http://localhost:15984/koi -d "$row"; \
    done <docs.json
{"ok":true,"id":"eaef2c7ca340d5c953c276c72e000200","rev":"1-cfcea61d826396faee370508b828f9d5"}
{"ok":true,"id":"eaef2c7ca340d5c953c276c72e000e85","rev":"1-02843978cc8c3bdefbc8b28197379f38"}
{"ok":true,"id":"eaef2c7ca340d5c953c276c72e001359","rev":"1-fe554019820a099ad31eb187779bec49"}
...
{"ok":true,"id":"eaef2c7ca340d5c953c276c72e0191c1","rev":"1-3f9e5b6bb8ca2282ea0bd0be47611be9"}

$ curl -q -K .curlrc -X GET http://localhost:15984/koi | jq '.'
{
  "db_name": "koi",
  "purge_seq": "0-g1AAAABXeJzLYWBgYMpgTmEQTM4vTc5ISXLIy09JNdJLSS3LAUnlsQBJhgYg9R8IshIZ8KhNZEiqhyjKAgA7jRtk",
  "update_seq": "50-g1AAAABXeJzLYWBgYMpgTmEQTM4vTc5ISXLIy09JNdJLSS3LAUnlsQBJhgYg9R8IshJl8KhNZEiqBysSywIAP_0blg",
  "sizes": {
    "file": 237986,
    "external": 10015,
    "active": 21382
  },
  "props": {},
  "doc_del_count": 0,
  "doc_count": 50,
  "disk_format_version": 8,
  "compact_running": false,
  "cluster": {
    "q": 2,
    "n": 2,
    "w": 2,
    "r": 2
  },
  "instance_start_time": "0"
}

An important bit in the meta data above is n: 2 in "cluster" block.

Add a new node to the cluster

Start three nods now and add third node to the cluster

$ docker-compose --profile full up -d
[+] Running 5/5
 ⠿ Network sandbox_default         Created              0.2s
 ⠿ Volume "sandbox_couchdb_data3"  Created              0.0s
 ⠿ Container sandbox_node2_1       Started              2.4s
 ⠿ Container sandbox_node3_1       Started              2.4s
 ⠿ Container sandbox_node1_1       Started              2.5s

$ curl -q -K .curlrc -X GET http://localhost:35984/_membership | jq '.'
{
  "all_nodes": [
    "couchdb@node3.dev"
  ],
  "cluster_nodes": [
    "couchdb@node3.dev"
  ]
}

$ curl -q -K .curlrc -X PUT http://localhost:15984/_node/_local/_nodes/couchdb@node3.dev -d {}
{"ok":true,"id":"couchdb@node3.dev","rev":"1-967a00dff5e02add41819138abb3284d"}

$ curl -q -K .curlrc -X GET http://localhost:35984/_membership | jq '.'
{
  "all_nodes": [
    "couchdb@node1.dev",
    "couchdb@node2.dev",
    "couchdb@node3.dev"
  ],
  "cluster_nodes": [
    "couchdb@node1.dev",
    "couchdb@node2.dev",
    "couchdb@node3.dev"
  ]
}

Here is the third node yet to know about our database.

It can proxy requests to the database if other nodes are available:

$ curl -q -K .curlrc -X GET http://localhost:35984/koi | jq '.'
{
  "db_name": "koi",
  "purge_seq": "0-g1AAAABXeJzLYWBgYMpgTmEQTM4vTc5ISXLIy09JNdRLSS3LAUnlsQBJhgYg9R8IshIZ8KhNZEiqhyjKAgA7Nxti",
  "update_seq": "50-g1AAAABXeJzLYWBgYMpgTmEQTM4vTc5ISXLIy09JNdRLSS3LAUnlsQBJhgYg9R8IshJl8KhNZEiqBysSywIAP6cblA",
  "sizes": {
    "file": 237986,
    "external": 10015,
    "active": 21382
  },
  "props": {},
  "doc_del_count": 0,
  "doc_count": 50,
  "disk_format_version": 8,
  "compact_running": false,
  "cluster": {
    "q": 2,
    "n": 2,
    "w": 2,
    "r": 2
  },
  "instance_start_time": "0"
}

But once they are down or in the maintanance mode the database can't be accessed anymore.

$ curl -q -K .curlrc -X PUT http://localhost:15984/_node/_local/_config/couchdb/maintenance_mode -d '"true"'
""
$ curl -q -K .curlrc -X PUT http://localhost:25984/_node/_local/_config/couchdb/maintenance_mode -d '"true"'
""

$ curl -q -K .curlrc -X GET http://localhost:35984/koi | jq '.'
{
  "error": "internal_server_error",
  "reason": "No DB shards could be opened.",
  "ref": 2745110390
}

Update db's meta and sync the shards

Now put two "original" nodes back from maintanance mode

$ curl -q -K .curlrc -X PUT http://localhost:15984/_node/_local/_config/couchdb/maintenance_mode -d '"false"'
"true"
$ curl -q -K .curlrc -X PUT http://localhost:25984/_node/_local/_config/couchdb/maintenance_mode -d '"false"'
"true"

Then read and update database metadata.

$ curl -q -K .curlrc -X GET http://localhost:15984/_node/_local/_dbs/koi | jq '.' | tee meta.json
{
  "_id": "koi",
  "_rev": "1-c1e21114c816b10cc1244b16099bc5dd",
  "shard_suffix": [46, 49, 54, 50, 57, 53, 49, 52, 50, 52, 51],
  "changelog": [
    [
      "add",
      "00000000-7fffffff",
      "couchdb@node1.dev"
    ],
    [
      "add",
      "00000000-7fffffff",
      "couchdb@node2.dev"
    ],
    [
      "add",
      "80000000-ffffffff",
      "couchdb@node1.dev"
    ],
    [
      "add",
      "80000000-ffffffff",
      "couchdb@node2.dev"
    ]
  ],
  "by_node": {
    "couchdb@node1.dev": [
      "00000000-7fffffff",
      "80000000-ffffffff"
    ],
    "couchdb@node2.dev": [
      "00000000-7fffffff",
      "80000000-ffffffff"
    ]
  },
  "by_range": {
    "00000000-7fffffff": [
      "couchdb@node1.dev",
      "couchdb@node2.dev"
    ],
    "80000000-ffffffff": [
      "couchdb@node1.dev",
      "couchdb@node2.dev"
    ]
  },
  "props": {}
}

Update the meta.json file

index 012f57a..0da42e6 100644
--- a/old_meta.json
+++ b/meta.json
@@ -34,6 +34,16 @@
       "add",
       "80000000-ffffffff",
       "couchdb@node2.dev"
+    ],
+    [
+      "add",
+      "00000000-7fffffff",
+      "couchdb@node3.dev"
+    ],
+    [
+      "add",
+      "80000000-ffffffff",
+      "couchdb@node3.dev"
     ]
   ],
   "by_node": {
@@ -44,16 +54,22 @@
     "couchdb@node2.dev": [
       "00000000-7fffffff",
       "80000000-ffffffff"
+    ],
+    "couchdb@node3.dev": [
+      "00000000-7fffffff",
+      "80000000-ffffffff"
     ]
   },
   "by_range": {
     "00000000-7fffffff": [
       "couchdb@node1.dev",
-      "couchdb@node2.dev"
+      "couchdb@node2.dev",
+      "couchdb@node3.dev"
     ],
     "80000000-ffffffff": [
       "couchdb@node1.dev",
-      "couchdb@node2.dev"
+      "couchdb@node2.dev",
+      "couchdb@node3.dev"
     ]
   },
   "props": {}

Update database's meta and sync shards

$ curl -q -K .curlrc -X PUT http://localhost:15984/_node/_local/_dbs/koi -d @meta.json
{"ok":true,"id":"koi","rev":"2-d81c894a4f93f19fe3b23cccf085a8ac"}

curl -q -K .curlrc -X POST http://localhost:15984/koi/_sync_shards
{"ok":true}

Now put two "original" nodes back into maintanance mode and confirm that our database is now available on the new node.

$ curl -q -K .curlrc -X PUT http://localhost:15984/_node/_local/_config/couchdb/maintenance_mode -d '"true"'
"false"
$ curl -q -K .curlrc -X PUT http://localhost:25984/_node/_local/_config/couchdb/maintenance_mode -d '"true"'
"false"

curl -q -K .curlrc -X GET http://localhost:35984/koi | jq '.'
{
  "db_name": "koi",
  "purge_seq": "0-g1AAAABXeJzLYWBgYMpgTmEQTM4vTc5ISXLIy09JNdZLSS3LAUnlsQBJhgYg9R8IshIZ8KhNZEiqhyjKAgA74xtm",
  "update_seq": "50-g1AAAABXeJzLYWBgYMpgTmEQTM4vTc5ISXLIy09JNdZLSS3LAUnlsQBJhgYg9R8IshJl8KhNZEiqBysSywIAQFMbmA",
  "sizes": {
    "file": 74160,
    "external": 10015,
    "active": 21453
  },
  "props": {},
  "doc_del_count": 0,
  "doc_count": 50,
  "disk_format_version": 8,
  "compact_running": false,
  "cluster": {
    "q": 2,
    "n": 3,
    "w": 2,
    "r": 2
  },
  "instance_start_time": "0"
}

An important bit in meta above that now in "cluster" block we have n: 3.

version: '3.8'
services:
node1:
image: apache/couchdb:3
hostname: node1.dev
environment:
- NODENAME=node1.dev
- ERL_FLAGS=-setcookie "oat"
- COUCHDB_SECRET=64c96c90c685ba879104159b440b3bc4
- COUCHDB_USER=admin
- COUCHDB_PASSWORD=god
volumes:
- couchdb_data1:/opt/couchdb/data
ports:
- 15984:5984
node2:
image: apache/couchdb:3
hostname: node2.dev
environment:
- NODENAME=node2.dev
- ERL_FLAGS=-setcookie "oat"
- COUCHDB_SECRET=64c96c90c685ba879104159b440b3bc4
- COUCHDB_USER=admin
- COUCHDB_PASSWORD=god
volumes:
- couchdb_data2:/opt/couchdb/data
ports:
- 25984:5984
node3:
image: apache/couchdb:3
hostname: node3.dev
profiles:
- full
environment:
- NODENAME=node3.dev
- ERL_FLAGS=-setcookie "oat"
- COUCHDB_SECRET=64c96c90c685ba879104159b440b3bc4
- COUCHDB_USER=admin
- COUCHDB_PASSWORD=god
volumes:
- couchdb_data3:/opt/couchdb/data
ports:
- 35984:5984
volumes:
couchdb_data1:
couchdb_data2:
couchdb_data3:
{"seq":1,"count":"0001","number":446,"string":"AqMbCL10dOn9YbpT","md5":"0ef3a60d5cc9a19d0f5b877fda4c8035","uuid":"b0274d42-ebba-4d85-b00b-367b7a5116ff","bool":false,"word":"unguileful","name":"Kimmo"}
{"seq":2,"count":"0002","number":141,"string":"82lIlJElave56Qtr","md5":"d6e05d3bb5abd42449e5c32b7c9a8fe7","uuid":"82bff321-9736-4d90-93b5-7ecf7768a0ca","bool":true,"word":"footganger","name":"Kee"}
{"seq":3,"count":"0003","number":597,"string":"tWXr4PvP025R2XX1","md5":"1395bf68eb19b962628f7f5ad417020d","uuid":"c1dc9d43-711e-4136-8296-07872817524a","bool":false,"word":"abjurer","name":"Lewis"}
{"seq":4,"count":"0004","number":252,"string":"1TcvorHkALCzODRG","md5":"3dce1b79222e8da13fd0d273441d0ee9","uuid":"8f0196e6-86bb-4c07-8836-0d84f992efdc","bool":false,"word":"jail","name":"Jwahar"}
{"seq":5,"count":"0005","number":767,"string":"a0KFjFp2jCZV1AIu","md5":"1f29392b9d2c19d19eaa9e416d1c3f53","uuid":"89cce4c2-edcd-4ad4-9f37-9603876226fc","bool":false,"word":"mysteriousness","name":"Olof"}
{"seq":6,"count":"0006","number":510,"string":"hyBCssWy83klAoZb","md5":"c088d62b35f7e3972f89392547ac0fef","uuid":"ba1c47fb-75dd-4de4-a980-866ddd86fb66","bool":true,"word":"reinfectious","name":"Morris"}
{"seq":7,"count":"0007","number":452,"string":"ZasTmkN6lCCRAIql","md5":"74376f851c3ee4af721ed14c03e4b7f7","uuid":"ae316967-bffa-4337-a6ad-4596d08814e1","bool":false,"word":"vernaculate","name":"Van"}
{"seq":8,"count":"0008","number":406,"string":"qxbxk6hGYAgaC9BV","md5":"984238fb9b149b638a31a1e50f5561e5","uuid":"63528345-c085-4be3-9b93-4c2c51f01d6e","bool":false,"word":"spermatoid","name":"Thierry"}
{"seq":9,"count":"0009","number":66,"string":"NQXIMYQO9T12eIkG","md5":"f0238d2deb80b1ca5bcba9acd349504b","uuid":"3987588a-e8b1-4cc2-9143-03436fbd8d6c","bool":true,"word":"denaturation","name":"Kurt"}
{"seq":10,"count":"0010","number":928,"string":"JFeuHWzqUDVx54Cw","md5":"2e43b1fe22c21adc66f596cdbe107f29","uuid":"b10317a3-b55b-4a41-bb7d-5e23136209a0","bool":false,"word":"protoepiphyte","name":"Hurf"}
{"seq":11,"count":"0011","number":244,"string":"GTnQsZsYBvLI3xEF","md5":"f8d0e00ac6507938b7da5590c6d44db2","uuid":"eda75302-8569-42e9-b0de-0b5a4e32eef3","bool":false,"word":"delphacid","name":"Ranjit"}
{"seq":12,"count":"0012","number":538,"string":"xrAzz0vbrdGPNvhg","md5":"669ca0f277c594644f97b68c3f642722","uuid":"f911e455-17d2-49fd-8579-ab9983d05b63","bool":true,"word":"tissued","name":"Maria"}
{"seq":13,"count":"0013","number":258,"string":"6nJoozYlPx3dLnCI","md5":"3a7e78ec6c6b948f864da0fdb32f731c","uuid":"4d5e6de9-ef20-42ba-94de-4198fb7429e5","bool":false,"word":"upbreak","name":"Prakash"}
{"seq":14,"count":"0014","number":994,"string":"ZbZ4pMMwelvykM3j","md5":"d17ed0ee27712c30242076dae4aa20ff","uuid":"aef59936-d1f3-4643-b64e-b25c0f67409d","bool":true,"word":"Bulgaric","name":"Alastair"}
{"seq":15,"count":"0015","number":580,"string":"TBruSbt5PwRF4L3x","md5":"a524c96ec6b91255efce2072b43c9843","uuid":"5e8cf829-f6b0-42c0-8d39-0b55fc2291c0","bool":true,"word":"cloglike","name":"Cristina"}
{"seq":16,"count":"0016","number":784,"string":"dheaRcRznJIWFEGC","md5":"340524df6877815fe8a281ca9fcd5211","uuid":"4caf606d-987c-448c-8b3d-d0da3b529466","bool":false,"word":"hidation","name":"Tharen"}
{"seq":17,"count":"0017","number":469,"string":"Ex6GcPPZ0gcNctGB","md5":"80cbc27361c0869c42ebaacc14d8c032","uuid":"337654a8-6bf5-423e-acc2-6c145386f1ce","bool":false,"word":"cranium","name":"Evan"}
{"seq":18,"count":"0018","number":120,"string":"GTW5vAwi1FatX9lr","md5":"d73989b3599f2c2eee1b7abb5136c646","uuid":"1af95009-bc13-4ff2-b7a2-56c4c7898e25","bool":false,"word":"drawback","name":"Janice"}
{"seq":19,"count":"0019","number":710,"string":"KlLabSs2CNdJ15nQ","md5":"59e563d0d15480aadbed49e6b34a0ad8","uuid":"5e27e7c8-786b-4550-ac74-9b0aecc7b01a","bool":false,"word":"alsinaceous","name":"Tollefsen"}
{"seq":20,"count":"0020","number":530,"string":"FXCipYPB1wfctiaf","md5":"b632024ffaccc2ec8f3503d71bbc84bc","uuid":"a3f53290-7004-46ae-865e-93955aaad48b","bool":true,"word":"decarbonize","name":"Nichael"}
{"seq":21,"count":"0021","number":815,"string":"Id28b9pGpntbuGXF","md5":"36af7ccd8da40e77d76e747b4bde936c","uuid":"7b26a6be-a320-47ad-86ab-bd369398d3de","bool":false,"word":"overpowerful","name":"Bradford"}
{"seq":22,"count":"0022","number":815,"string":"XxKwx9PS1W0vYcau","md5":"113d53e0d9d006821a3e230ba2c511f4","uuid":"b424bb42-4ee0-44f9-aab0-e916af92b3f7","bool":true,"word":"investigator","name":"Takayuki"}
{"seq":23,"count":"0023","number":418,"string":"52XxxX9YFyt1Zb81","md5":"9b125154b931b4497267a89fd1a550b8","uuid":"fa661957-a0da-40c6-945c-06d633440449","bool":true,"word":"Finn","name":"June"}
{"seq":24,"count":"0024","number":31,"string":"nFTnUMRSCoYMY7KB","md5":"0cc8b2cbe59d7d1634f93d1552d8d2fe","uuid":"4eb37d91-6272-40cb-80ff-7438b758f2de","bool":false,"word":"somatognostic","name":"Rick"}
{"seq":25,"count":"0025","number":393,"string":"mQihuiBwfI85taXo","md5":"6d61b1c08f588f93f5e3d33d46483025","uuid":"1d26e337-14cc-49ae-aab8-2fad27a8cf1f","bool":false,"word":"outlighten","name":"Donna"}
{"seq":26,"count":"0026","number":166,"string":"9uAsS1OQGPl2BApR","md5":"8287b4571b0c27985d7b957f2182bcd2","uuid":"3bb50124-7a94-4e09-8602-1cfa798f027b","bool":true,"word":"sentimenter","name":"Ross"}
{"seq":27,"count":"0027","number":549,"string":"ipkXFYF4HsNwhjdY","md5":"3ca66fdc79b89c97b8366466c3dc13ff","uuid":"69f98a2a-5027-416c-9ae0-d49ca34cd662","bool":true,"word":"supranatural","name":"Francois"}
{"seq":28,"count":"0028","number":222,"string":"NiCMzaXb9svrcXSP","md5":"1e45a46cbe8b57ca5ab12be6d3c0344c","uuid":"9aee6b54-b170-4560-8f5e-5f9bd3c59be9","bool":false,"word":"falcer","name":"Ning"}
{"seq":29,"count":"0029","number":529,"string":"K3SoXaWP85o9g7xq","md5":"05bd621aa0cfc8c48504b4db0a96448a","uuid":"5c28cf2b-bf0d-497b-9258-1fa8c4e1551a","bool":false,"word":"chiasmic","name":"Beckie"}
{"seq":30,"count":"0030","number":117,"string":"prfqnI4GkiBT8RU8","md5":"127602039ade6172cba4e9a1543b69f2","uuid":"767391fd-1c5e-45fb-97cc-d786db352d51","bool":false,"word":"polyandry","name":"Jan"}
{"seq":31,"count":"0031","number":856,"string":"kwkB2qx6JJHcSYH6","md5":"30b57ed34762e88ebedc5a822ba92d6c","uuid":"18c845df-9efb-4acf-8a88-5877a56b3e9f","bool":false,"word":"postclavicular","name":"Joanne"}
{"seq":32,"count":"0032","number":346,"string":"LaJHwnSpneYveGLH","md5":"bbc134c316ea2b71872c089573154639","uuid":"d9f11745-f4d5-481a-a8dc-76d5da00cd0b","bool":false,"word":"unshifty","name":"Amigo"}
{"seq":33,"count":"0033","number":210,"string":"DBlyzIuYl8EK0ogR","md5":"1b6c02147c97b4de4ade4dfc6804ae7a","uuid":"ab2b070f-1142-4184-8d3f-744f8c785ab4","bool":true,"word":"Ricardian","name":"Earnie"}
{"seq":34,"count":"0034","number":302,"string":"xPBqWF4KVPDlN5Gt","md5":"7b82770611562f18527dc1de1903824e","uuid":"43dfd852-8523-4e22-8e3a-dca91311dadc","bool":true,"word":"valvotomy","name":"Page"}
{"seq":35,"count":"0035","number":458,"string":"Jg65ZevwOZE2RrPL","md5":"85823c4eeb03450c5a89928b9b0fc7a0","uuid":"fb451bae-a383-4f2f-9c97-cc13401b2469","bool":false,"word":"deerlet","name":"Tarmi"}
{"seq":36,"count":"0036","number":47,"string":"1lzWX9I05D3D1ruZ","md5":"3ab2db8d0fb68521ed77e9647ca2d2e8","uuid":"b93cae95-d3a2-4cb7-ad32-24022763efbb","bool":true,"word":"bypath","name":"Blaine"}
{"seq":37,"count":"0037","number":745,"string":"fi3Ykr2aD0C5GrWl","md5":"17c4e8326f069f43271dac6ee5b18469","uuid":"f386ec28-5b2f-4c9d-b6f6-6e72b0cec4f8","bool":true,"word":"kitchenful","name":"Ranjit"}
{"seq":38,"count":"0038","number":361,"string":"HHp5X46WbinQO2oe","md5":"f4e770d0f3a50d8342282f62b8c061bd","uuid":"809e0ff7-4cac-42f8-a58e-3cd3b386f3ba","bool":true,"word":"conidiiferous","name":"Walter"}
{"seq":39,"count":"0039","number":957,"string":"iVXTA49i7BX9ov1s","md5":"e2d84fcbbb094cafea0a697cb43f5d5e","uuid":"6170fa74-fb95-4dd7-a530-c50d75ed06e1","bool":false,"word":"prototypographer","name":"Julia"}
{"seq":40,"count":"0040","number":662,"string":"2PzgQCJdmKUi3zHi","md5":"8df5b9c24a995affb570bf33f88729b5","uuid":"61cc12d4-3b52-4594-ac36-40376cb51a95","bool":true,"word":"maddle","name":"Jeanette"}
{"seq":41,"count":"0041","number":240,"string":"IJ6abU5UFJx0XNVO","md5":"3094de4b1290b71b62bb66cee4716ca6","uuid":"0efc2477-83d4-4bd3-a562-61a06d917e1d","bool":false,"word":"printline","name":"Dale"}
{"seq":42,"count":"0042","number":230,"string":"Qwxdm02ZVkV5je3J","md5":"3070db1c9825f8964a33f65db4d4f144","uuid":"b10148e9-dc22-43a2-af49-72e8b7ad8908","bool":true,"word":"cyclosporous","name":"Stacy"}
{"seq":43,"count":"0043","number":5,"string":"vlqaeAxWdjqQ11dV","md5":"7607f3e99e50e9c14ef0ef495358380a","uuid":"3cdbc0fd-b025-4e3e-babb-137d85f9de15","bool":false,"word":"cornigerous","name":"Elsa"}
{"seq":44,"count":"0044","number":279,"string":"eHYEAO7O9b2yP5SV","md5":"e4691ed7d8ff649560c237f5421a4e45","uuid":"2c5d731f-b45f-4a69-860f-4623fd7dd45f","bool":true,"word":"Singsing","name":"Brent"}
{"seq":45,"count":"0045","number":421,"string":"Rcw9bytS13BwCzu0","md5":"7710babffe381dc7c4dc32230430c423","uuid":"ec488e5c-9f1d-4910-a355-84943c5203f0","bool":false,"word":"kinswoman","name":"Patricia"}
{"seq":46,"count":"0046","number":178,"string":"Y1xlUvZdpvwpOCAH","md5":"64e3e879ad178af4356792c277a1b769","uuid":"aa455552-c279-4b22-ae3d-d422f9cdb5ac","bool":false,"word":"wick","name":"Vidhyanath"}
{"seq":47,"count":"0047","number":338,"string":"PdcYAeAMlgGW2k4U","md5":"dd9f0cb99907dee08b654803f235a4d2","uuid":"057abf94-d00f-4342-aacb-0377f708d5ec","bool":false,"word":"bitentaculate","name":"Sonny"}
{"seq":48,"count":"0048","number":991,"string":"nqiSUALNaRH5o6CL","md5":"b1a901a049bf271c4cad4141c6b9637d","uuid":"1107a1bd-82ae-42e8-9571-a92653cbbda1","bool":true,"word":"agamid","name":"Donne"}
{"seq":49,"count":"0049","number":608,"string":"112JLu9OJNTwOU04","md5":"ac4ab8b9b704a42fc58f1225253de05c","uuid":"945837e1-efd0-496e-97f7-b78c61544d51","bool":false,"word":"Brule","name":"Julian"}
{"seq":50,"count":"0050","number":450,"string":"lCfvWUYTYoxfiMrZ","md5":"c34abaf97c10c60c5efc7517ca03f87e","uuid":"d2c5d18e-688d-407b-a69c-642366856a79","bool":false,"word":"dowager","name":"Daniele"}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment