{"id":13564481,"url":"https://github.com/doyoubi/undermoon","last_synced_at":"2026-03-12T12:04:22.278Z","repository":{"id":34423435,"uuid":"149862390","full_name":"doyoubi/undermoon","owner":"doyoubi","description":"Mordern Redis Cluster solution for easy operation.","archived":false,"fork":false,"pushed_at":"2023-03-31T14:35:18.000Z","size":2459,"stargazers_count":698,"open_issues_count":22,"forks_count":36,"subscribers_count":17,"default_branch":"master","last_synced_at":"2024-11-04T17:47:35.675Z","etag":null,"topics":["cloud","failover","k8s","kubernetes","migration","proxy","redis","redis-cloud","redis-cluster","redis-cluster-protocol","redis-clusters","redis-instances","redis-protocol","redis-proxy","rust","scale","slot"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/doyoubi.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}},"created_at":"2018-09-22T09:19:54.000Z","updated_at":"2024-11-01T07:14:59.000Z","dependencies_parsed_at":"2024-01-14T03:48:17.255Z","dependency_job_id":"3ebaaa60-f0fe-47a0-ad03-d2cd224f6c36","html_url":"https://github.com/doyoubi/undermoon","commit_stats":null,"previous_names":[],"tags_count":31,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/doyoubi%2Fundermoon","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/doyoubi%2Fundermoon/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/doyoubi%2Fundermoon/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/doyoubi%2Fundermoon/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/doyoubi","download_url":"https://codeload.github.com/doyoubi/undermoon/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247083035,"owners_count":20880763,"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":["cloud","failover","k8s","kubernetes","migration","proxy","redis","redis-cloud","redis-cluster","redis-cluster-protocol","redis-clusters","redis-instances","redis-protocol","redis-proxy","rust","scale","slot"],"created_at":"2024-08-01T13:01:32.019Z","updated_at":"2025-12-15T22:22:49.673Z","avatar_url":"https://github.com/doyoubi.png","language":"Rust","funding_links":[],"categories":["Rust"],"sub_categories":[],"readme":"![undermoon logo](docs/undermoon-logo.svg)\n\n# Undermoon ![Continuous Integration](https://github.com/doyoubi/undermoon/workflows/Continuous%20Integration/badge.svg?event=push)\n`Undermoon` is a self-managed Redis clustering system based on **Redis Cluster Protocol** supporting:\n\n- Horizontal scalability and high availability\n- Cluster management through HTTP API\n- Automatic failover for both master and replica\n- Fast scaling\n\nAny storage system implementing redis protocol could also somehow work with undermoon,\nsuch as [KeyDB](https://github.com/JohnSully/KeyDB).\n\nFor more in-depth explanation of Redis Cluster Protocol and how Undermoon implement it,\nplease refer to [Redis Cluster Protocol](./docs/redis_cluster_protocol.md).\n\n## Architecture\n![architecture](docs/architecture.svg)\n##### Metadata Storage\nMetadata storage stores all the metadata of the whole `undermoon` cluster,\nincluding existing Redis instances, proxies, and exposed Redis clusters.\nNow it's an in-memory storage server called `Memory Broker`.\nWhen using [undermoon-operator](https://github.com/doyoubi/undermoon-operator),\nthis `Memory Broker` will change to use `ConfigMap` to store the data.\n\n##### Coordinator\nCoordinator will synchronize the metadata between broker and server proxy.\nIt also actively checks the liveness of server proxy and initiates failover.\n\n##### Storage Cluster\nThe storage cluster consists of server proxies and Redis instances.\nIt serves just like the official Redis Cluster to the applications.\nA Redis Cluster Proxy could be added between it and applications\nso that applications don't need to upgrade their Redis clients to smart clients.\n\n###### Chunk\nChunk is the smallest building block of every single exposed Redis Cluster.\nEach chunk consists of 4 Redis instances and 2 server proxies evenly distributed in two different physical machines.\nSo the node number of each Redis cluster will be the multiples of 4 with half masters and half replicas.\n\nThe design of chunk makes it very easy to build a cluster with a good topology for **workload balancing**.\n\n## Getting Started\n### Run Undermoon in Kubernetes\nUsing [undermoon-operator](https://github.com/doyoubi/undermoon-operator)\nis the easiest way to create Redis clusters if you have Kubernetes.\n\n```\nhelm install my-undermoon-operator undermoon-operator-\u003cx.x.x\u003e.tgz\n\nhelm install \\\n    --set 'cluster.clusterName=my-cluster-name' \\\n    --set 'cluster.chunkNumber=2' \\\n    --set 'cluster.maxMemory=2048' \\\n    --set 'cluster.port=5299' \\\n    my-cluster \\\n    -n my-namespace \\\n    undermoon-cluster-\u003cx.x.x\u003e.tgz\n```\n\nSee the `README.md` of [undermoon-operator](https://github.com/doyoubi/undermoon-operator)\nfor how to use it.\n\n### Run Undermoon Using Docker Compose\nSee [docker compose example](./docs/docker_compose_example.md).\n\n### Setup Undermoon Manually\nOr you can set them up without docker following this docs: [setting up undermoon manually](docs/set_up_manually.md).\n\n## Development\n`undermoon` tries to avoid `unsafe` and some calls that could crash like `unwrap`.\n\nRun the following commands before committing your codes:\n```\n$ make lint\n$ make test\n```\n\nSee more in the [development guide](./docs/development.md).\n\n## Documentation\n- [Redis Cluster Protocol and Server Proxy](./docs/redis_cluster_protocol.md)\n- [Chunk](./docs/chunk.md)\n- [Slot Migration](./docs/slots_migration.md)\n- [Memory Broker Replica](./docs/mem_broker_replica.md)\n- [Configure to support non-cluster-mode clients](./docs/active_redirection.md)\n- [Command Table](./docs/command_table.md)\n- [Performance](./docs/performance.md)\n- [Best Practice](./docs/best_practice.md)\n- [Broker External Storage](./docs/broker_external_storage.md)\n\n## API\n- [Proxy UMCTL command](./docs/meta_command.md)\n- [HTTP Broker API](./docs/broker_http_api.md)\n- [Memory Broker API](./docs/memory_broker_api.md)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdoyoubi%2Fundermoon","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdoyoubi%2Fundermoon","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdoyoubi%2Fundermoon/lists"}