This library builds a mesh from multiple tarantool instances. The mesh monitors itself, helps members discover everyone else and get notified about their status changes with low latency.
It is built upon the ideas from consul, or, more precisely, the SWIM algorithm.
Membership module works over UDP protocol and can operate
even before tarantool box.cfg was initialized.
A member is represented by the table with fields:
uristatusis a string:alive,suspect,deadorleftincarnationwhich is incremented every time the instance is being suspected or dead or updates its payloadpayloadis a table with auxiliary data, which can be used by various modules to do whatever they wanttimestampis a value offiber.time64()(in microseconds), corresponding to the last update of status or incarnation.timestampis always local and does not depent on other members' clock setting.clock_deltais a time drift between member's clock (remote) and the local one (in microseconds).
Example:
---
uri: "localhost:33001"
status: "alive"
incarnation: 1
payload:
uuid: "2d00c500-2570-4019-bfcc-ab25e5096b73"
timestamp: 1522427330993752
clock_delta: 27810
...Membership module supports hot-reload:
package.loaded['membership'] = nil
require('membership')You can change membership options directly by using:
require("membership.options")[opt_name] = opt_valueAvailable options:
-
Period of sending direct PINGs.
PROTOCOL_PERIOD_SECONDS, default: 1.0 -
Time to wait for ACK message after PING. If a member does not reply within this time, the indirect ping algorithm is invoked.
ACK_TIMEOUT_SECONDS, default: 0.2 -
Period to perform anti-entropy sync.
ANTI_ENTROPY_PERIOD_SECONDS, default: 10 -
Toggle producing
suspectrumors when ping fails. Even if disabled, it doesn't affect neither gossip dissemination nor other statuses generation (e.g.deadandnon-decryptable).SUSPICIOUSNESS, default: true -
Timeout to mark
suspectmembers asdead.SUSPECT_TIMEOUT_SECONDS, default: 3 -
Number of members to try indirectly pinging a
suspect. Denoted askin SWIM paper.NUM_FAILURE_DETECTION_SUBGROUPS, default: 3 -
Maximum size of UPD packets to send.
MAX_PACKET_SIZE, default: 1472 (Default-MTU (1500) - IP-Header (20) - UDP-Header (8))
You can add payload to any member by calling:
membership.set_payload(key, value)