Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork6
A node js library with a distributed leader/follower algorithm ready to be used
License
pioardi/ring-election
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
Is your dream to build a service like cassandra,kafka,zipkin,jaeger,redis,etc...? You are in the right place , join ring-election project !!!
Getting started ·Overview ·Use cases ·Config ·Config ·Monitoring ·High level design ·Contribute ·Versioning ·License
What the ring-election driver offers you ?
- A default partitioner that for an object returns the partition to which it is assigned.
- Mechanism of leader election
- Failure detection between nodes.
- Assignment and rebalancing of partitions between nodes
- Automatic re-election of the leader
- Listen for new assigned/revoked partitions
What problems can you solve with this driver ?
- Scalability
- High availability
- Concurrency between nodes in a cluster
- Automatic failover
npm i ring-election --save
ExampleYou do not need to choose a node as leader , just indicate all your nodes and start everyone as follower.
The first node to start will be the leader , the leader do not have assigned partitions so try to start 2 instances after your integration
How to integrate
constring=require('ring-election')letfollower=ring.followerconst{BECOME_LEADER,PARTITIONS_ASSIGNED,PARTITIONS_REVOKED}=ring.constants;follower.createClient()// if you want REST API as monitoring , invoke startMonitoringfollower.startMonitoring()// to get ring inforing.follower.ring()// to get assigned partitionsletassignedPartitions=ring.follower.partitions()// now let me assume that a follower will create some data// and you want to partition this dataletpartition=ring.follower.defaultPartitioner('KEY')// save your data including the partition on a storage// you will be the only one in the cluster working on the partitions assigned to you.// If you want to handle partitions assigned// ( use other constants to listen other events ) you can do in this way.ring.follower.eventListener.on(PARTITIONS_ASSIGNED,(newAssignedPartitions)=>{// DO STUFF})
Start your development cluster
You will find some helpful files into the dev folder , please see the following video
Check assigned partitions to local:9000/status or change the port to 9001/9002
Try to stop and restart processes and observe the behaviour.
Ring-election is a driver that implements a distributed algorithm that assigns to each node the partitions to work on .In a simple use case each node can obtain data that are part of the partitions of which it is owner and work on them.
The algorithm will assign to each node one or more partitions to work with.
A node will be removed if it does not send an heart beat for a while , this process is called heart check.
Each node in the ring will have an ID and a priority , if the leader node will die the node with lower priority will be elect as leader.
If a node is added or removed from the cluster, the allocated partitions will be rebalanced.
This section introduce you on what you can build on top of ring-election using it as driver/library.
Distributed Scheduler
Each Scheduler instance will work on the assigned partitions .
A real implementation of this use case is available herehttps://github.com/pioardi/hurricane-scheduler
Distributed lock
Distributed cache
Distributed computing
Try it out !
docker image build -t ring-election. docker-compose upTIME_TO_RECONNECT: The time to wait for a follower when he has to connect to a new leader in ms , default is 3000ms
HEART_BEAT_FREQUENCY: The frequency with which a heart beat is performed by a follower , default is 1000ms
HEART_BEAT_CHECK_FREQUENCY: The frequency with which an heart check is performed by a leader , default is 3000ms
LOG_LEVEL: Follow thishttps://www.npmjs.com/package/winston#logging-levels , default is info.
NUM_PARTITIONS: Number of partitions to distribute across the cluster , default is 10.
SEED_NODES : hostnames and ports of leader node comma separated, Ex . hostname1:port,hostname2:port
MONITORING_PORT : port to expose rest service for monitoring , default is 9000
To monitor your cluster contact any node on the path /status (HTTP verb : GET) or contact a follower node on /partitions (HTTP verb : GET).
Seewiki page.
See contributing guidelinesCONTRIBUTING
We use (http://semver.org/) for versioning.This project is licensed under the MIT License - see the [LICENSE](./LICENSE) file for detailsAbout
A node js library with a distributed leader/follower algorithm ready to be used
Topics
Resources
License
Code of conduct
Contributing
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Sponsor this project
Uh oh!
There was an error while loading.Please reload this page.
Packages0
Uh oh!
There was an error while loading.Please reload this page.
Contributors3
Uh oh!
There was an error while loading.Please reload this page.

