mirror of
https://gitlab.isc.org/isc-projects/kea
synced 2025-08-22 18:08:16 +00:00
301 lines
9.8 KiB
XML
301 lines
9.8 KiB
XML
<section xml:id="hooks-host-cache">
|
|
<title>host_cache: Caching Host Reservations</title>
|
|
<para>Some database backends, such as RADIUS, are considered
|
|
slow and may take a long time to respond. Since Kea in general is
|
|
synchronous, the backend performance directly affects the DHCP
|
|
performance. To minimize the impact and improve performance, the
|
|
Host Cache library provides a way to cache information from the database locally.
|
|
This includes negative caching, i.e. the ability to remember
|
|
that there is no client information in the database.</para>
|
|
|
|
|
|
<para>
|
|
|
|
</para>
|
|
|
|
<para>
|
|
<note>
|
|
<para>This library may only be loaded by the <command>kea-dhcp4</command>
|
|
or the <command>kea-dhcp6</command> process.
|
|
</para>
|
|
</note>
|
|
|
|
In principle, this hook library can be used with any backend that may introduce
|
|
performance degradation (MySQL, PostgreSQL, Cassandra, RADIUS).
|
|
Host Cache must be loaded for the RADIUS accounting
|
|
mechanism to work.
|
|
</para>
|
|
|
|
<para>
|
|
The Host Cache hook library is currently very simple. It takes only
|
|
one optional parameter ("maximum") that defines the maximum number
|
|
of hosts to be cached. If not specified, the default value of 0 is
|
|
used, which means there is no limit. The hook library can be
|
|
loaded the same way as any other hook library; for example, this
|
|
configuration could be used:
|
|
|
|
<screen>
|
|
"Dhcp4": {
|
|
|
|
// Your regular DHCPv4 configuration parameters here.
|
|
|
|
"hooks-libraries": [
|
|
{
|
|
"library": "/usr/local/lib/kea/hooks/libdhc_host_cache.so",
|
|
"parameters": {
|
|
|
|
// Tells Kea to never cache more than 1000 hosts.
|
|
"maximum": 1000
|
|
|
|
}
|
|
} ]</screen>
|
|
</para>
|
|
|
|
<para>
|
|
Once loaded, the Host Cache hook library provides a number
|
|
of new commands which can be used either over the control
|
|
channel (see <xref linkend="ctrl-channel-client"/>) or the REST API
|
|
(see <xref linkend="agent-overview"/>). An example REST API client
|
|
is described in <xref linkend="shell-overview"/>. The following
|
|
sections describe the commands available.
|
|
</para>
|
|
|
|
<section id="command-cache-flush">
|
|
<title>cache-flush Command</title>
|
|
<para>This command allows removal of a specified number of cached
|
|
host entries. It takes one parameter, which defines the number of
|
|
hosts to be removed. An example usage looks as follows:
|
|
<screen>
|
|
{
|
|
"command": "cache-flush",
|
|
"arguments": 1000
|
|
}</screen>
|
|
This command will remove 1000 hosts. If you want to delete all
|
|
cached hosts, please use cache-clear instead. The hosts are stored
|
|
in FIFO order, so the oldest entries are always removed.
|
|
</para>
|
|
</section>
|
|
|
|
<section id="command-cache-clear">
|
|
<title>cache-clear Command</title>
|
|
<para>This command allows removal of all cached
|
|
host entries. An example usage looks as follows:
|
|
<screen>
|
|
{
|
|
"command": "cache-clear"
|
|
}</screen>
|
|
This command will remove all hosts. If you want to delete only a
|
|
certain number of cached hosts, please use cache-flush instead.
|
|
</para>
|
|
</section>
|
|
|
|
<section id="command-cache-size">
|
|
<title>cache-size Command</title>
|
|
<para>This command returns the number of host entries.
|
|
An example usage looks as follows:
|
|
<screen>
|
|
{
|
|
"command": "cache-size"
|
|
}</screen>
|
|
</para>
|
|
</section>
|
|
|
|
<section id="command-cache-write">
|
|
<title>cache-write Command</title>
|
|
<para>In general, the cache content is considered a runtime
|
|
state and the server can be shut down or restarted as usual; the
|
|
cache will then be repopulated after restart. However, there are
|
|
some cases when it is useful to store the contents of the cache. One
|
|
such case is RADIUS, where the cached hosts also retain
|
|
additional cached RADIUS attributes; there is no easy way to
|
|
obtain this information again, because renewing clients send their
|
|
packet to the DHCP server directly. Another use
|
|
case is when you want to restart the server and for performance
|
|
reasons you want it to start with a hot (populated) cache.
|
|
</para>
|
|
|
|
<para>This command allows writing the contents of the in-memory cache
|
|
to a file on disk. It takes one parameter, which defines the
|
|
filename. An example usage looks as follows:
|
|
<screen>
|
|
{
|
|
"command": "cache-write",
|
|
"arguments": "/tmp/kea-host-cache.json"
|
|
}</screen>
|
|
This causes the contents to be stored in the /tmp/kea-host-cache.json file.
|
|
That file can then be loaded with the cache-load command or processed by
|
|
any other tool that is able to understand JSON format.
|
|
</para>
|
|
|
|
|
|
</section>
|
|
|
|
<section id="command-cache-load">
|
|
<title>cache-load Command</title>
|
|
<para>See the previous section for a discussion of use cases
|
|
where it may be useful to write and load contents of the host
|
|
cache to disk.</para>
|
|
|
|
<para>This command allows the contents of a file on disk to be loaded into
|
|
an in-memory cache. It takes one parameter, which defines the
|
|
filename. An example usage looks as follows:
|
|
<screen>
|
|
{
|
|
"command": "cache-load",
|
|
"arguments": "/tmp/kea-host-cache.json"
|
|
}</screen>
|
|
This command will store the contents to the /tmp/kea-host-cache.json file.
|
|
That file can then be loaded with the cache-load command or processed by
|
|
any other tool that is able to understand JSON format.
|
|
</para>
|
|
|
|
</section>
|
|
|
|
<section id="command-cache-get">
|
|
<title>cache-get Command</title>
|
|
<para>This command is similar to cache-write, but instead of
|
|
writing the cache contents to disk, it returns the contents to
|
|
whoever sent the command.</para>
|
|
<para>This command allows the contents of a file on disk to be loaded into
|
|
an in-memory cache. It takes one parameter, which defines the
|
|
filename. An example usage looks as follows:
|
|
<screen>
|
|
{
|
|
"command": "cache-get"
|
|
}</screen>
|
|
This command will return all the cached hosts. Note that the response
|
|
may be large.
|
|
</para>
|
|
</section>
|
|
|
|
<section id="command-cache-get-by-id">
|
|
<title>cache-get-by-id Command</title>
|
|
<para>This command is similar to cache-get, but instead of
|
|
returning the whole content it returns only the entries matching
|
|
the given identifier.</para>
|
|
<para>It takes one parameter, which defines the identifier of
|
|
wanted cached host reservations. An example usage looks as follows:
|
|
<screen>
|
|
{
|
|
"command": "cache-get-by-id",
|
|
"arguments": {
|
|
"hw-address": "01:02:03:04:05:06"
|
|
}
|
|
}</screen>
|
|
This command will return all the cached hosts with the given hardware address.
|
|
</para>
|
|
</section>
|
|
|
|
<section id="command-cache-insert">
|
|
<title>cache-insert Command</title>
|
|
<para>This command may be used to manually insert a host into the
|
|
cache; there are very few use cases when this command could be
|
|
useful. This command expects its arguments to follow the usual
|
|
syntax for specifying host reservations (see <xref
|
|
linkend="host-reservation-v4"/> or <xref
|
|
linkend="host-reservation-v6"/>), with one difference: the
|
|
subnet-id value must be specified explicitly.</para>
|
|
|
|
<para>
|
|
An example command that will insert an IPv4 host into the host
|
|
cache looks as follows:
|
|
<screen>
|
|
{
|
|
"command": "cache-insert",
|
|
"arguments": {
|
|
"hw-address": "01:02:03:04:05:06",
|
|
"subnet-id4": 4,
|
|
"subnet-id6": 0,
|
|
"ip-address": "192.0.2.100",
|
|
"hostname": "somehost.example.org",
|
|
"client-classes4": [ ],
|
|
"client-classes6": [ ],
|
|
"option-data4": [ ],
|
|
"option-data6": [ ],
|
|
"next-server": "192.0.0.2",
|
|
"server-hostname": "server-hostname.example.org",
|
|
"boot-file-name": "bootfile.efi",
|
|
"host-id": 0
|
|
}
|
|
}</screen>
|
|
|
|
</para>
|
|
|
|
<para>
|
|
An example command that will insert an IPv6 host into the host
|
|
cache looks as follows:
|
|
<screen>
|
|
{
|
|
"command": "cache-insert",
|
|
"arguments": {
|
|
"hw-address": "01:02:03:04:05:06",
|
|
"subnet-id4": 0,
|
|
"subnet-id6": 6,
|
|
"ip-addresses": [ "2001:db8::cafe:babe" ],
|
|
"prefixes": [ "2001:db8:dead:beef::/64" ],
|
|
"hostname": "",
|
|
"client-classes4": [ ],
|
|
"client-classes6": [ ],
|
|
"option-data4": [ ],
|
|
"option-data6": [ ],
|
|
"next-server": "0.0.0.0",
|
|
"server-hostname": "",
|
|
"boot-file-name": "",
|
|
"host-id": 0
|
|
}
|
|
}</screen>
|
|
</para>
|
|
</section>
|
|
|
|
<section id="command-cache-remove">
|
|
<title>cache-remove Command</title>
|
|
<para>Sometimes it is useful to remove a single entry from the
|
|
host cache. A good use case is a situation where the device is up,
|
|
Kea has already provided configuration, and the host entry is in
|
|
cache. As a result of administrative action (e.g. customer hasn't
|
|
paid their bills or has perhaps been upgraded to better service), the
|
|
information in the backend (e.g. MySQL or RADIUS) is being
|
|
updated. However, since cache is in use, Kea does not notice the
|
|
change as the cached values are used. The cache-remove command can
|
|
solve this problem by removing a cached entry after administrative
|
|
changes.</para>
|
|
|
|
<para>
|
|
The cache-remove command works similarly to the reservation-get
|
|
command. It allows querying by two parameters:
|
|
either subnet-id4 or subnet-id6; or
|
|
ip-address (may be an IPv4 or IPv6 address), hw-address (specifies
|
|
hardware/MAC address), duid, circuit-id, client-id, or flex-id.
|
|
</para>
|
|
|
|
<para>
|
|
An example command to remove an IPv4 host with reserved address
|
|
192.0.2.1 from a subnet with a subnet-id 123 looks as follows:
|
|
<screen>
|
|
{
|
|
"command": "cache-remove",
|
|
"arguments": {
|
|
"ip-address": "192.0.2.1",
|
|
"subnet-id": 123
|
|
}
|
|
}</screen>
|
|
</para>
|
|
<para>
|
|
Another example that removes an IPv6 host identifier by DUID and
|
|
specific subnet-id is:
|
|
<screen>
|
|
{
|
|
"command": "cache-remove",
|
|
"arguments": {
|
|
"duid": "00:01:ab:cd:f0:a1:c2:d3:e4",
|
|
"subnet-id": 123
|
|
}
|
|
}</screen>
|
|
</para>
|
|
|
|
</section>
|
|
|
|
|
|
|
|
</section>
|