Kerberos 启用多进程KDC
背景
KDC默认是单进程单线程的,它只能够串行的处理请求。通常来说性能足够,但是应对一些负载较重的场景可能不满足需求。为了解决这个问题,社区提供了多进程KDC方式,即原来的KDC进程作为主supervisor进程,fork出来多个子worker进程,从而将处理请求的负载分散在多个worker进程中,提高了KDC请求处理的吞吐量。
krb5kdc命令的使用帮助中给出了配置worker进程数量的方法:
usage: krb5kdc [-x db_args]* [-d dbpathname] [-r dbrealmname]
[-R replaycachename] [-m] [-k masterenctype]
[-M masterkeyname] [-p port] [-P pid_file]
[-n] [-w numworkers] [/]
where,
[-x db_args]* - Any number of database specific arguments.
Look at each database module documentation for supported arguments
我们可以使用-w参数指定worker进程数。
环境要求
- CentOS
- Kerberos 1.9及以上版本。
配置方式
下面以配置kdc 3个worker子进程为例,说明配置方法。
在查阅相关资料之前,首先想到的是由于kdc服务是通过systemctl启动的,我们可以从它的服务配置文件入手。
执行systemctl status krb5kdc得到类似如下输出:
[root@manager ~]# systemctl status krb5kdc
● krb5kdc.service - Kerberos 5 KDC
Loaded: loaded (/usr/lib/systemd/system/krb5kdc.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2023-09-19 02:06:59 CST; 2 weeks 5 days ago
Process: 1236 ExecStart=/usr/sbin/krb5kdc -P /var/kerberos/run/krb5kdc.pid $KRB5KDC_ARGS (code=exited, status=0/SUCCESS)
Main PID: 1811 (krb5kdc)
CGroup: /system.slice/krb5kdc.service
└─1811 /usr/sbin/krb5kdc -P /var/kerberos/run/krb5kdc.pid
找到krb5kdc service配置文件/usr/lib/systemd/system/krb5kdc.service。编辑它:
[Unit]
Description=Kerberos 5 KDC
After=syslog.target network.target
[Service]
User=kerberos
Type=forking
PIDFile=/var/kerberos/run/krb5kdc.pid
EnvironmentFile=-/etc/sysconfig/krb5kdc
ExecStart=/usr/sbin/krb5kdc -P /var/kerberos/run/krb5kdc.pid $KRB5KDC_ARGS
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
修改其中的:
ExecStart=/usr/sbin/krb5kdc -P /var/kerberos/run/krb5kdc.pid $KRB5KDC_ARGS
为:
ExecStart=/usr/sbin/krb5kdc -w 3 -P /var/kerberos/run/krb5kdc.pid $KRB5KDC_ARGS
然后执行:
systemctl daemon-reload
systemctl restart krb5kdc
worker进程数已修改生效。
我们注意到$KEB5KDC_ARGS这个变量。查阅资料后可知/etc/sysconfig/krb5kdc配置文件可配置$KEB5KDC_ARGS变量。下面介绍一种更为简单的配置方式(无需再按照前面介绍的方式修改)。
修改/etc/sysconfig/krb5kdc配置文件为:
KRB5KDC_ARGS='-w 3'
然后执行systemctl restart krb5kdc即可生效。
正常启动之后,使用ps -ef | grep kerberos命令,查看kdc有几个进程。观察到类似如下输出:
kerberos 25405 1 0 23:42 ? 00:00:00 /usr/sbin/krb5kdc -w 3 -P /var/kerberos/run/krb5kdc.pid
kerberos 25408 25405 0 23:42 ? 00:00:00 /usr/sbin/krb5kdc -w 3 -P /var/kerberos/run/krb5kdc.pid
kerberos 25411 25405 0 23:42 ? 00:00:00 /usr/sbin/krb5kdc -w 3 -P /var/kerberos/run/krb5kdc.pid
kerberos 25413 25405 0 23:42 ? 00:00:00 /usr/sbin/krb5kdc -w 3 -P /var/kerberos/run/krb5kdc.pid
或者使用systemctl status krb5kdc查看:
[root@manager ~]# systemctl status krb5kdc
● krb5kdc.service - Kerberos 5 KDC
Loaded: loaded (/usr/lib/systemd/system/krb5kdc.service; enabled; vendor preset: disabled)
Active: active (running) since Sun 2023-10-08 23:42:12 CST; 22min ago
Process: 25403 ExecStart=/usr/sbin/krb5kdc -w 3 -P /var/kerberos/run/krb5kdc.pid $KRB5KDC_ARGS (code=exited, status=0/SUCCESS)
Main PID: 25405 (krb5kdc)
CGroup: /system.slice/krb5kdc.service
├─25405 /usr/sbin/krb5kdc -w 3 -P /var/kerberos/run/krb5kdc.pid
├─25408 /usr/sbin/krb5kdc -w 3 -P /var/kerberos/run/krb5kdc.pid
├─25411 /usr/sbin/krb5kdc -w 3 -P /var/kerberos/run/krb5kdc.pid
└─25413 /usr/sbin/krb5kdc -w 3 -P /var/kerberos/run/krb5kdc.pid
可以看到kdc有一个主进程和3个子进程。修改成功。
参考文献
KDC worker processes feature · krb5/krb5@62c814a (github.com)
Projects/Parallel KDC - K5Wiki (kerberos.org)
7.4. 调整 krb5kdc 进程的数量 Red Hat Enterprise Linux 9 | Red Hat Customer Portal