htools - Cluster allocation and placement tools for Ganeti
cluster balancer
cluster checker
cluster capacity computation
IAllocator plugin
saves cluster state for later reuse
cluster information printer
cluster rolling maintenance scheduler
htools
is a suite of tools designed to help with allocation/movement of instances and balancing of Ganeti clusters. htools
is also the generic binary that must be symlinked or hardlinked under each tool's name in order to perform the different functions. Alternatively, the environment variable HTOOLS can be used to set the desired role.
Installed as hbal
, it computes and optionally executes a suite of instance moves in order to balance the cluster.
Installed as hcheck
, it preforms cluster checks and optionally simulates rebalancing with all the hbal
options available.
Installed as hspace
, it computes how many additional instances can be fit on a cluster, while maintaining N+1 status. It can run on models of existing clusters or of simulated clusters.
Installed as hail
, it acts as an IAllocator plugin, i.e. it is used by Ganeti to compute new instance allocations and instance moves.
Installed as hscan
, it scans the local or remote cluster state and saves it to files which can later be reused by the other roles.
Installed as hinfo
, it prints information about the current cluster state.
Installed as hroller
, it helps scheduling maintenances that require node reboots on a cluster.
Options behave the same in all program modes, but not all program modes support all options. Some common options are:
Prints the node status, in a format designed to allow the user to understand the node's most important parameters. If the command in question makes a cluster transition (e.g. balancing or allocation), then usually both the initial and final node status is printed.
It is possible to customise the listed information by passing a comma-separated list of field names to this option (the field list is currently undocumented), or to extend the default field list by prefixing the additional field list with a plus sign. By default, the node list will contain the following information:
a character denoting the status of the node, with '-' meaning an offline node, '*' meaning N+1 failure and blank meaning a good node
the node name
the total node memory
the memory used by the node itself
the memory used by instances
amount memory which seems to be in use but cannot be determined why or by which instance; usually this means that the hypervisor has some overhead or that there are other reporting errors
the free node memory
the reserved node memory, which is the amount of free memory needed for N+1 compliance
total disk
free disk
the number of physical cpus on the node
the number of virtual cpus allocated to primary instances
number of primary instances
number of secondary instances
percent of free memory
percent of free disk
ratio of virtual to physical cpus
the dynamic CPU load (if the information is available)
the dynamic memory load (if the information is available)
the dynamic disk load (if the information is available)
the dynamic net load (if the information is available)
Backend specification: the name of the file holding node and instance information (if not collecting via RAPI or LUXI). This or one of the other backends must be selected. The option is described in the man page htools(1).
The file should contain text data, line-based, with single empty lines separating sections. In particular, an empty section is described by the empty string followed by the separating empty line, thus yielding two consecutive empty lines. So the number of empty lines does matter and cannot be changed arbitrarily. The lines themselves are column-based, with the pipe symbol (|
) acting as separator.
The first section contains group data, with the following columns:
The second sections contains node data, with the following columns:
Y
for offline nodes, N
for online non-master nodes, and M
for the master node which is always online)Y
if active, N
otherwise)standard node
in the node group the node belongs toThe third section contains instance data, with the fields:
running
or ERROR_down
)auto_balance
flag (see man page gnt-instance(8))plain
or drbd
)-
when exclusive storage is not active)The fourth section contains the cluster tags, with one tag per line (no columns/no column processing).
The fifth section contains the ipolicies of the cluster and the node groups, in the following format (separated by |
):
If given the program will query all MonDs to fetch data from the supported data collectors over the network.
The name of the file holding the data provided by MonD, to override querying MonDs over the network. This is mostly used for debugging. The file must be in JSON format and present an array of JSON objects , one for every node, with two members. The first member named node
is the name of the node and the second member named reports
is an array of report objects. The report objects must be in the same format as produced by the monitoring agent.
If given, all dynamic utilisation information will be ignored by assuming it to be 0. This option will take precedence over any data passed by the -U
option (available with hbal) or by the MonDs with the --mond
and the --mond-data
option.
Backend specification: collect data directly from the cluster given as an argument via RAPI. If the argument doesn't contain a colon (:), then it is converted into a fully-built URL via prepending https://
and appending the default RAPI port, otherwise it is considered a fully-specified URL and used as-is.
Backend specification: collect data directly from the master daemon, which is to be contacted via LUXI (an internal Ganeti protocol). An optional path argument is interpreted as the path to the unix socket on which the master daemon listens; otherwise, the default path used by Ganeti (configured at build time) is used.
Backend specification: load data directly from an iallocator request (as produced by Ganeti when doing an iallocator call). The iallocator request is read from specified path.
Backend specification: instead of using actual data, build an empty cluster given a node description. The description parameter must be a comma-separated list of five elements, describing in order:
An example description would be preferred,20,100G,16g,4,2 describing a 20-node cluster where each node has 100GB of disk space, 16GiB of memory, 4 CPU cores and 2 disk spindles. Note that all nodes must have the same specs currently.
This option can be given multiple times, and each new use defines a new node group. Hence different node groups can have different allocation policies and node count/specifications.
Increase the output verbosity. Each usage of this option will increase the verbosity (currently more than 5 doesn't make sense) from the default of one.
Decrease the output verbosity. Each usage of this option will decrease the verbosity (less than zero doesn't make sense) from the default of one.
Just show the program version and exit.
Some options accept not simply numerical values, but numerical values together with a unit. By default, such unit-accepting options use mebibytes. Using the lower-case letters of m, g and t (or their longer equivalents of mib, gib, tib, for which case doesn't matter) explicit binary units can be selected. Units in the SI system can be selected using the upper-case letters of M, G and T (or their longer equivalents of MB, GB, TB, for which case doesn't matter).
More details about the difference between the SI and binary systems can be read in the units(7) man page.
The environment variable HTOOLS
can be used instead of renaming/symlinking the programs; simply set it to the desired role and then the name of the program is no longer used.
Report bugs to the project's issue tracker or contact the developers using the Ganeti mailing list.
Ganeti overview and specifications: ganeti(7) (general overview), ganeti-os-interface(7) (guest OS definitions), ganeti-extstorage-interface(7) (external storage providers).
Ganeti commands: gnt-cluster(8) (cluster-wide commands), gnt-job(8) (job-related commands), gnt-node(8) (node-related commands), gnt-instance(8) (instance commands), gnt-os(8) (guest OS commands), gnt-storage(8) (storage commands), gnt-group(8) (node group commands), gnt-backup(8) (instance import/export commands), gnt-debug(8) (debug commands).
Ganeti daemons: ganeti-watcher(8) (automatic instance restarter), ganeti-cleaner(8) (job queue cleaner), ganeti-noded(8) (node daemon), ganeti-rapi(8) (remote API daemon).
Ganeti htools: htools(1) (generic binary), hbal(1) (cluster balancer), hspace(1) (capacity calculation), hail(1) (IAllocator plugin), hscan(1) (data gatherer from remote clusters), hinfo(1) (cluster information printer), mon-collector(7) (data collectors interface).
Copyright (C) 2006-2015 Google Inc. All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.