npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

vippy

v0.0.11

Published

Virtual IP Management and Failover

Downloads

7

Readme

Vippy

Vippy will manage a set of (M) IP addresses over a set of (N) nodes. It uses IP multicast to chat amongst the nodes to decide who owns which interface.

Basic Config

{
  "chat": "224.1.1.1:5007",
  "chat_interface": "all",
  "secret": "knsdfkjnsdfkjnweroib0u3",
  "version": 5,
  "vips": [
    [ { "interface": "e1000g0", "ip": "10.8.3.195/24" } ],
    [ 'node2', { "interface": "e1000g0", "ip": "10.8.99.147/24" } ],
    [ { "interface": "e1000g0", "ip": "10.8.99.149/24" }, 
      { "interface": "e1000g0", "ip": "10.8.3.196/24" } ]
  ],
  "nodes": [
    "node1", "node2"
  ],
  "interval": 0.5,
  "mature": 5,
  "stale": 5,
  "arp-cache": "90",
  "notify": [
    "arp-cache",
    { "interface": "e1000g0", "ip": "10.8.99.149/24" },
    { "interface": "e1000g0", "ip": "10.8.3.1/29" }
  ],
  "management": "/var/run/vippy.socket",
  "logging": {
    "driver": "console",
    "facility": "local7",
    "mask": { "emerg": true, "alert": true, "crit": true, "err": true,
              "warning": false, "notice": true, "info": false, "debug": false }
  }
}

It is critical that different vippy nodes agree on their configuration. The vips and nodes must all match on all nodes (sans the interface attribute). They must contain all the same preferences, ips and nodes all in the same order or "bad things" will happen. The node with the highest "version" will domninate the cluster's configuration (all other nodes will adopt their revised config).

chat

This is the IP multicast address/port on which vippy will communicate. It will broadcast updates to this address and listen for updates on this address.

secret

This must be the same on all nodes. It is used to create a secure hash of the announcement message so that other parties on the network cannot interfere.

version

The version of the config (this applies to the vips and nodes, specifically. As these are changed, the version needs to be incremented. This allows peers to "graduate" to a new config automatically on change.

vips

This is an array of Virtual Interface Groups that vippy is responsible for managing. Each group is a list of Virtual Interfaces (w/ netmask) on a specific system network interface (e.g. { "interface": "eth0", "10.1.2.3/24" }. If multiple Virtual Interfaces are specified, they are still treated as an inseparable group (they move together).

The first item in a Virtual Interface Group list may be a string representing the name of a node (from the nodes list) that prefers this group. If a group is preferred, the group will be assigned to to the preferred node if the node is up and active.

nodes

The list of hosts participating in the configuration.

interval

The interval (in seconds) between announcements.

mature

How long (in seconds) a vippy node must be up before it is considered "ready to play."

stale

How old (in seconds) the latest announcement can be before we consider a node unavailable.

arp-cache

How often (in seconds) to rescan the local arp-cache for sharing.

notify

A list of of whom to notify (via gratuitous ARPing) when an interface is added to the local machine. This is specified in the same syntax as Virtual Interfaces, but the ip considers the whole network (as determined by the CIDR mask (e.g. /24). The special token "arp-cache* tells vippy to notify everyone in the cluster's collective ARP tables.

management

The socket on which to listen for management control (via vippyctl).

logging

Designed around syslog, this tells vippy what and where to log. vippy ships with a driver called "console" that may be used if "posix" is unavailable.

Operation

Vippy must know the node that it is. By default it will use the os.hostname(), but if that does not match a named host in the nodes list, a different node name may be specified with the -n command line option.

/path/to/vippyd -c /etc/vippy.conf -n node1

Operation

Vippy must know the node that it is. By default it will use the os.hostname(), but if that does not match a named host in the nodes list, a different node name may be specified with the -n command line option.

/path/to/vippyd -c /etc/vippy.conf -n node1

Sending a 'HUP' signal to vippyd will cause it to reread the configuration file and adapt to the newly specified configuration. You can add or remove nodes and change the vips section; just make sure you bump the version number.

Plugins

Vippy can load plugins, which are just normal node.js programs. These programs have three important global variables in their context: config, manager, and network which represent the VippyConfig, VippyManager and VippyNetwork instances that are driving the system.

A plugin must listen for the 'stop' message on config and shutdown any activity such that Node.js can exit.

config.on('stop', function() {
    // stop listeners
    // clearIntervals
    // clearTimeouts
    // etc.
});

Plugins can be used to implement periodic local health-checks:

var job = setInterval(function() { var state = doSomething(); // true or false config.active(state, "doSomething"); }, 5000);

Plugins can also respond to the plumbing and unplumbing of Virtual Interaces by listening to the 'up' and'down' events from either manager (representing intention) or network (representing virtual network changes).

vippyctl

vippyctl allows you perform basic administrative functions. If you are not using the default management socket: "/var/run/vippy.socket", then you may specific a -s /path/to/socket on the command line.

status

/path/to/vippyctl status

Will display the current status of the cluster from the local node's perspective.