{"id":23462551,"url":"https://github.com/danielrs/botellier","last_synced_at":"2025-06-29T05:33:47.718Z","repository":{"id":149788356,"uuid":"88327994","full_name":"danielrs/botellier","owner":"danielrs","description":"A distributed key-value data store.","archived":false,"fork":false,"pushed_at":"2017-12-30T06:36:48.000Z","size":485,"stargazers_count":11,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-14T06:55:06.296Z","etag":null,"topics":["db","distributed-systems","in-memory","in-memory-database","nosql"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/danielrs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2017-04-15T06:12:20.000Z","updated_at":"2023-09-30T10:42:13.000Z","dependencies_parsed_at":null,"dependency_job_id":"85e8e55d-c83b-4745-be0f-fdce6742302b","html_url":"https://github.com/danielrs/botellier","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/danielrs/botellier","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielrs%2Fbotellier","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielrs%2Fbotellier/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielrs%2Fbotellier/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielrs%2Fbotellier/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/danielrs","download_url":"https://codeload.github.com/danielrs/botellier/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielrs%2Fbotellier/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262543862,"owners_count":23326626,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["db","distributed-systems","in-memory","in-memory-database","nosql"],"created_at":"2024-12-24T08:17:47.407Z","updated_at":"2025-06-29T05:33:47.708Z","avatar_url":"https://github.com/danielrs.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"[zookeeper]: https://github.com/apache/zookeeper\n\n[![Build Status](https://travis-ci.org/danielrs/botellier.svg?branch=replication)](https://travis-ci.org/danielrs/botellier)\n\n## Botellier\n\nA distributed key-value data store. It aims to be a simple Redis clone for the JVM.\n\n### Replication Scheme\n\nTo keep things simple, Botellier uses single-leader replication. Each replica is a whole copy of the leader, and no sharding/partitioning is used.\n\nAll the nodes that form the quorum can be either three types: `leader`, `synced replica` or `replica`. All writes request go through the leader, who waits for the synced replica to proccess the same requests before returning to the client. All other replicas process the requests asynchronously.\n\n#### Election process\n\nInitially, all nodes are of type `replica` which then try to become the `synced replica`, usually the most up-to-date node is the one to do it. After that, the only node that can become a `leader` is a synced replica; so in the event that the leader dies, the synced replica automatically becomes the leader, and the next most up-to-date common replica takes its place.\n\nHere's a flowchart that shows the process:\n\n![Flowchart](https://raw.githubusercontent.com/danielrs/botellier/replication/doc/leader_election_flowchart.png)\n\nCoordination between proccesses is done using [Zookeper][zookeeper].\n\n### Command support\n\nAs of now, most commonly used commands are supported, such as connection, strings, lists and general ones like delete,\nrename, etc. For a complete list of supported commands check [here](https://github.com/danielrs/botellier/blob/master/src/main/kotlin/org/botellier/command/commands.kt).\n\n### Testing\n\nThe project includes an entry point that starts a server on the default port (6679) with the\npassword set to 'password'. After starting the server try [corkscrew](https://github.com/danielrs/corkscrew) for\nconnecting to it and executing commands. Here's an example:\n\n[![asciicast](https://asciinema.org/a/b5yhrwnsu8v4rkna08yoa3wre.png)](https://asciinema.org/a/b5yhrwnsu8v4rkna08yoa3wre)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdanielrs%2Fbotellier","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdanielrs%2Fbotellier","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdanielrs%2Fbotellier/lists"}