综述
本文实现kafka集群的配置和启动过程。并将脚本自动化,使得通用性、独立性更强。
用途
-
1⃣️实现kafka集群从配置到启动 # 可顺序执行ca.sh、ca2.sh、congfig.sh完成kafka的SSL&&配置文件更新。 核心内容 常见问题和解决方案(含快捷命令)、配置文件内容的填充、常量化配置到变量化实现。 主要文件 1. ca.sh 准备本地所需文件 2. ca2.sh 同步集群所需文件 3. config.sh 自动配置kafka文件 2⃣️脚本通用、独立。可复用 or 二次开发 实现SSL配置或中间件全局配置文件生成。
参考资料
kafka官方文档:包含安装部署、配置项、api使用等详细信息
附件:
Kafka并不难学!:入门、进阶、商业实战 (邓杰):包含kafka入门和linux快捷操作等系统化认识的内容。
SSL基本概念 & 目的效果
名词 | 文件名 | 备注 |
---|---|---|
证书 | ca-cert | 含公钥,为便于理解,以下称证书为公钥 |
密钥 | ca-key | 用于生成客户端的公钥签名 |
公钥签名 | cert-signed | 公钥+密钥获得 |
信任库 | server.truststore.jks client.truststore.jks |
验证服务器证书的合法性。 客户端在SSL握手过程中使用。 |
密钥库 | server.keystore.jks | 服务器会从密钥库中提取自己的证书发送给客户端,以证明服务器的身份。 |
单节点
服务器
密钥库server.keystore.jks
- 公钥ca-cert
客户端
信任库client.truststore.jks
- 公钥ca-cert
密钥库server.keystore.jks
- 公钥ca-cert
- 公钥签名cert-signed
三节点 & 目的效果🚩
服务器52
server.keystore.jks
- 公钥ca-cert_52
客户端52
信任库client.truststore.jks
- 公钥ca-cert_52
- 公钥ca-cert_53
- 公钥ca-cert_54
密钥库server.keystore.jks
- 公钥ca-cert_52
- 公钥签名cert-signed_52
- 公钥ca-cert_53
- 公钥签名cert-signed_54
- 公钥ca-cert_54
- 公钥签名cert-signed_54
其中,公钥ca-cert_52写了2次,实际只需导入一次
执行脚本
注意:变量server_id使用自动获取本机第一个IP尾号,小概率会造成server_id冲突
单节点 ca.sh
创建ssl文件目录及其脚本
注意⚠️
- 检查路径变量值、密码值。后续输入密码尽可能与变量相同。
集群预注意事项
- 变量在3个文件中重复定义,修改需要全修改
执行流程
ca_path="/data/ddos/ca"
cd $ca_path && vi ca.sh
#! /bin/bash
# 变量
server_id=$(hostname -I | cut -d ' ' -f 1 | awk -F '.' '{print $NF}')
passwd="123456"
a_name=kafkaserver$server_id.transfar.com
kafka_config_path=/data/ddos2/kafka/config/server.properties
config_line="ssl.endpoint.identification.algorithm="
search_result=$(grep "^${config_line}" $kafka_config_path)
# 1、启用HTTPS协议
source ~/.bash_profile
echo "***********************启用HTTPS协议***********************"
if [ -z "$search_result" ]; then
# 如果配置行不存在,则添加配置并注释启用HTTPS协议
echo "Adding HTTPS configuration to $kafka_config_path"
echo "# 启用HTTPS协议" >> $kafka_config_path
echo "${config_line}HTTPS" >> $kafka_config_path
elif [ "$search_result" == "${config_line}HTTPS" ]; then
echo "HTTPS configuration is already set. Skipping..."
else
echo "请检查https协议配置,路径:$kafka_config_path"
exit 1
fi
# 2、创建所需文件
# 创建密钥库、公钥、私钥
echo "***********************创建密钥库、公钥、私钥***********************"
keytool -keystore server.keystore.jks -alias $a_name -validity 3650 -genkey -keyalg RSA -ext SAN=DNS:transfar.com,DNS:dn1,DNS:dn2,DNS:dn3
openssl req -new -x509 -keyout ca-key_$server_id -out ca-cert_$server_id -days 3650
# 生成公钥签名文件
echo "***********************生成公钥签名***********************"
keytool -keystore server.keystore.jks -alias $a_name -certreq -file cert-file_$server_id
openssl x509 -req -CA ca-cert_$server_id -CAkey ca-key_$server_id -in cert-file_$server_id -out cert-signed_$server_id -days 3650 \
-CAcreateserial -passin pass:$passwd
# 3、导入所需文件 如果是集群部署需要注释该步骤,以便ca2.sh批量执行。。
# 导入信任库
echo "***********************导入信任库***********************"
keytool -keystore client.truststore.jks -alias CAROOT_$server_id -import -file ca-cert_$server_id
keytool -keystore server.truststore.jks -alias CAROOT_$server_id -import -file ca-cert_$server_id
# 导入密钥库
echo "***********************导入密钥库***********************"
keytool -keystore server.keystore.jks -alias CAROOT_$server_id -import -file ca-cert_$server_id
keytool -keystore server.keystore.jks -alias $a_name -import -file cert-signed_$server_id
sh ca.sh
执行过程的操作有:2次密码、6次回车、y、回车、2次密码、7次回车、密码
验证结果
-
集群版:7个文件
[root@localhost ca]# ll 总用量 28 -rw-r--r--. 1 root root 1220 3月 22 21:42 ca-cert_52 -rw-r--r--. 1 root root 17 3月 22 21:42 ca-cert_52.srl -rw-r--r--. 1 root root 1834 3月 22 21:42 ca-key_52 -rw-r--r--. 1 root root 2328 3月 22 21:40 ca.sh -rw-r--r--. 1 root root 1097 3月 22 21:42 cert-file_52 -rw-r--r--. 1 root root 1159 3月 22 21:42 cert-signed_52 -rw-r--r--. 1 root root 2298 3月 22 21:42 server.keystore.jks [root@localhost ca]#
-
单机版:7 + client.truststore.jks
集群 ca2.sh
注意⚠️
检查路径变量值、密码值。
执行流程
- 执行ca.sh
-
执行ca2.sh
ca_path="/data/ddos/ca" cd $ca_path && vi ca2.sh
#! /bin/bash # 变量 passwd="123456" ca_path="/data/ddos/ca" # 1、同步公共文件 echo "***********************同步集群客户端文件***********************" for i in dn1 dn2 dn3; do rsync -avz $ca_path/ca-cert_* $ca_path/cert-signed_* "root@$i:$ca_path/" done # 2、导入所需文件 # 导入ca-cert_* for cert_file in $(find . -name 'ca-cert_*' ! -name '*.srl'); do cert_file_base=$(basename "$cert_file") alias="CAROOT_${cert_file_base#ca-cert_}" keytool -keystore client.truststore.jks -alias $alias -import -file "$cert_file" -noprompt -storepass $passwd keytool -keystore server.keystore.jks -alias CAROOT_${cert_file_base#ca-cert_} -import -file ./ca-cert_53 -noprompt -storepass $passwd done # 导入ca-signed_* for signed_file in $(find . -name 'cert-signed_*'); do signed_base=$(basename "$signed_file") alias="ddos-server_${signed_base#cert-signed_}.transfar.com" keytool -keystore server.keystore.jks -alias $alias -import -file $signed_base -noprompt -storepass $passwd done
sh ca2.sh
验证结果
15个文件 + 10个导入
-
验证文件 共16个文件
sent 194 bytes received 12 bytes 9.16 bytes/sec total size is 7,188 speedup is 34.89 keytool 错误: java.lang.Exception: 证书未导入, 别名 <CAROOT_54> 已经存在 keytool 错误: java.lang.Exception: 证书未导入, 别名 <CAROOT_54> 已经存在 证书已添加到密钥库中 证书已添加到密钥库中 证书已添加到密钥库中 证书已添加到密钥库中 证书已添加到密钥库中 证书已添加到密钥库中 证书已添加到密钥库中 [root@test ca]# ll 总用量 72 -rw-r--r--. 1 root root 1060 3月 23 16:08 ca2.sh -rw-r--r--. 1 root root 1220 3月 23 16:04 ca-cert_52 -rw-r--r--. 1 root root 17 3月 23 16:04 ca-cert_52.srl -rw-r--r--. 1 root root 1220 3月 23 16:04 ca-cert_53 -rw-r--r--. 1 root root 17 3月 23 16:04 ca-cert_53.srl -rw-r--r--. 1 root root 1220 3月 23 16:04 ca-cert_54 -rw-r--r--. 1 root root 17 3月 23 16:04 ca-cert_54.srl -rw-r--r--. 1 root root 1834 3月 23 16:04 ca-key_54 -rw-r--r--. 1 root root 2290 3月 23 15:59 ca.sh -rw-r--r--. 1 root root 1091 3月 23 16:04 cert-file_54 -rw-r--r--. 1 root root 1159 3月 23 16:04 cert-signed_52 -rw-r--r--. 1 root root 1159 3月 23 16:04 cert-signed_53 -rw-r--r--. 1 root root 1159 3月 23 16:04 cert-signed_54 -rw-r--r--. 1 root root 2711 3月 23 16:08 client.truststore.jks -rw-r--r--. 1 root root 8328 3月 23 16:08 server.keystore.jks [root@test ca]#
-
验证密钥库和信任库
共3+7个条目
passwd=123456 # 3个条目 keytool -list -v -keystore client.truststore.jks -noprompt -storepass $passwd # 7个条目:3个签名,4个证书 keytool -list -v -keystore server.keystore.jks -noprompt -storepass $passwd
自动配置 & 启动kakfa
config_kafka.sh
注意⚠️
- 检查路径变量值、密码值。
- 配置文件已被备份
执行流程
# 备份原配置文件
config_file="/data/ddos2/kafka/config/server.properties"
cp $config_file ${config_file}.back
# 编辑config_kafka.sh脚本
cd /data/ddos2/kafka
vi config_kafka.sh
#!/bin/bash
# 变量定义
server_ip=$(hostname -I| cut -d ' ' -f 1)
server_id=$(hostname -I | cut -d ' ' -f 1 | awk -F '.' '{print $NF}')
config_file="/data/ddos2/kafka/config/server.properties"
log_dirs="/data/ddos2/kafka/logs"
keystore_path="/data/ddos/ca"
dn1=dn1
dn2=dn2
dn3=dn3
passwd="123456"
# advertised.listeners端口的变量
plain_port=$((9092 + server_id))
ssl_port=$((9192 + server_id))
# 检查配置文件是否存在
if [ ! -f "$config_file" ]; then
echo "######### server.properties配置文件不存在,请检查变量是否正确。 #########"
exit 1
fi
# 覆盖配置文件
cat > $config_file <<EOF
############################# Kafka 基本配置 #############################
# 唯一id
broker.id=$server_id
# 设置磁盘 IO 请求线程数
num.io.threads=20
# 设置 Zookeeper 的连接地址
zookeeper.connect=$dn1:2181,$dn2:2181,$dn3:2181
# 设置 Zookeeper 连接超时时间
zookeeper.connection.timeout.ms=60000
############################# Topic 配置 #############################
# topic数据路径
log.dirs=$log_dirs
# 默认分区数
num.partitions=10
# 设置 Kafka 的副本数
default.replication.factor=3
# 设置 Kafka 的日志段大小
log.segment.bytes=1073741824
# 允许删除主题
delete.topic.enable=true
# 允许自动创建 Topic
auto.create.topics.enable=true
# 设置主题保留时间
log.retention.hours=168
# 不允许 Unclean Leader 选举。
unclean.leader.election.enable=false
# 不允许定期进行 Leader 选举。
auto.leader.rebalance.enable=false
# 当生产者将 acks 设置为 "all"(或"-1")时,此配置指定必须确认写入的副本的最小数量,才能认为写入成功
min.insync.replicas=1
############################# 网络 配置 #############################
# 设置网络请求处理线程数
num.network.threads=10
# 设置发送 buffer 字节数
socket.send.buffer.bytes=1024000
# 设置收到 buffer 字节数
socket.receive.buffer.bytes=1024000
# 设置最大请求字节数
socket.request.max.bytes=1048576000
############################# SSL 配置 #############################
# 开启 SSL
ssl.endpoint.identification.algorithm=
# 客户端连接的方式和客户端地址 :9092指任意ip的9092端口
listeners=PLAINTEXT://:$plain_port,SSL://:$ssl_port
# 外网 IP 或域名 ,建议设置为负载均衡器的公共IP地址和端口,并且 IP不能为空,而listeners配置则对应于Kafka实例的内部网络接口。
# advertised.listeners=PLAINTEXT://$dn3:9092,SSL://$dn2:9093
advertised.listeners=PLAINTEXT://$server_ip:$plain_port,SSL://$server_ip:$ssl_port
# 密钥库文件路径
ssl.keystore.location=$keystore_path/server.keystore.jks
# 密钥库密码
ssl.keystore.password=$passwd
# 信任库文件路径
ssl.truststore.location=$keystore_path/server.truststore.jks
# 密钥库密码
ssl.truststore.password=$passwd
# 密钥密码
ssl.key.password=$passwd
# 客户端也需要开启认证
ssl.client.auth=required
EOF
echo "修改成功
查看配置: cat config/server.properties
启动kafaka:source ~/.bash_profile
kafka-server-start.sh $KAFKA_HOME/config/server.properties &"
启动验证
sh config_kafka.sh
source ~/.bash_profile
kafka-server-start.sh $KAFKA_HOME/config/server.properties &
常见问题 & 解决方案
1 linux环境变量和DNS解析问题
-
问题
无法解析主机名dn1
找不到命令kafka-server-start.sh
参考pdf,属于安装部署Kafka && linux技巧提升的内容。本文不再赘述。
2 👍Debug思路
debug:遇到报错,看所在语句。
🔧工具补充
剪贴板📋
常用命令的粘贴工具
Windows:win+v
mac:paste(很好用)
如果是没用命令,可以yum install -y < tool_name >一下,不再赘述。
3 🥳🥳🥳SSL核心配置
故障现象
52号机器弹窗太快
# 只能kill
kill -9 $(jps | grep Kafka | awk '{print $1}')
解决方案
advertised.listeners配置项宣布对外(外网和其他客户端)端口,需要使用负载均衡或简单均衡。这里仅简单均衡并配置自动化书修改advertised.listeners项脚本。
- 方案一:添加负载均衡IP和port(kafka建议)
-
方案二:简单均衡
server_id plain_port ssl_port 52 9092 9093 53 9094 9095 54 9096 9097 -
# 改造内容 # 开启 SSL ssl.endpoint.identification.algorithm= # 客户端连接的方式和客户端地址 :9092指任意ip的9092端口 listeners=PLAINTEXT://:$plain_port,SSL://:$ssl_port advertised.listeners=PLAINTEXT://$server_ip:$plain_port,SSL://$server_ip:$ssl_port
文章生成过程文章来源:https://www.toymoban.com/news/detail-850354.html
最先是pdf笔记,然后是集群的SSL配置比较复杂,整理成子文件SSL思路,后总结升级为实践文档,并开源笔记。文章来源地址https://www.toymoban.com/news/detail-850354.html
到了这里,关于Kafka单机到集群- 自动化- SSL以及全部配置文件 作者精选的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!