1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
|
<section xml:id="hooks-host-cache">
<title>host_cache: Caching Host Reservations</title>
<para>Some of the 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 responses from other
hosts. This includes negative caching, i.e. the ability to remember
that there is no client information in the database.</para>
<para>
</para>
<para>
The RADIUS Host cache is a library that has to be loaded by either
DHCPv4 or DHCPv6 Kea servers. In principle it can be used with any
backend that may introduce performance degradation (MySQL,
PostgreSQL, Cassandra, RADIUS). Host Cache is required to be
loaded for the RADIUS accounting mechanism to work.
</para>
<para>
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/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 makes available a number
of new commands. Those commands can be used either over control
channel (see <xref linkend="ctrl-channel-client"/>) or 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="cache-flush-cmd">
<title>cache-flush command</title>
<para>This command allows removal of 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 always the oldest entries are removed.
</para>
</section>
<section id="cache-clear-cmd">
<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
certain number of cached hosts, please use cache-flush instead.
</para>
</section>
<section id="cache-write-cmd">
<title>cache-write command</title>
<para>In general case the cache content is considered a run-time
state and the server can be shutdown or restarted as usual. The
cache will then be repopulated after restart. However, there are
some cases when it is useful to store contents of the cache. One
such case is RADIUS (where the cached hosts also retain
additional cached RADIUS attributes and there is no easy way to
obtain this information again, because renewing clients send their
packet to the DHCP server directly. As a result, packets never go
through relay which doesn't insert relay options, which in turn
are in some deployment to query the RADIUS server). 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 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 command will store the contents to /tmp/kea-host-cache.json file.
That file can then be loaded with cache-load command or processed by
any other tool that is able to understand JSON format.
</para>
</section>
<section id="cache-load-cmd">
<title>cache-load command</title>
<para>See previous section for a discussion regarding use cases
where it may be useful to write and load contents of the host
cache to disk.</para>
<para>This command allows load the contents of a file on disk 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 /tmp/kea-host-cache.json file.
That file can then be loaded with cache-load command or processed by
any other tool that is able to understand JSON format.
</para>
</section>
<section id="cache-get-cmd">
<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 load the contents of a file on disk 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 the response
may be large.
</para>
</section>
<section id="cache-insert-cmd">
<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 the 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 a 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 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="cache-remove-cmd">
<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 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 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. Cache-remove command can
solve this problem by removing cached entry after administrative
changes.</para>
<para>
The cache-remove command works similarly to reservation-get
command. It allows querying by two parameters. One of them is
either subnet-id4 or subnet-id6 and the other one is one of:
ip-address (may be 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 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 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>
|