Kafka单机到集群- 自动化- SSL以及全部配置文件 作者精选

综述

本文实现kafka集群的配置和启动过程。并将脚本自动化,使得通用性、独立性更强。

用途

  1. 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文件目录及其脚本

注意⚠️

  • 检查路径变量值、密码值。后续输入密码尽可能与变量相同。

集群预注意事项

  1. 变量在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

注意⚠️

检查路径变量值、密码值。

执行流程

  1. 执行ca.sh
  1. 执行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个导入

  1. 验证文件 共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]# 
    
  2. 验证密钥库和信任库

    共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

注意⚠️

  1. 检查路径变量值、密码值。
  2. 配置文件已被备份

执行流程

  # 备份原配置文件
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​项脚本。

  1. 方案一:添加负载均衡IP和port(kafka建议)
  2. 方案二:简单均衡

    server_idplain_portssl_port
    5290929093
    5390949095
    5490969097
  3. # 改造内容
        # 开启 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

​​​​​​​

文章生成过程

最先是pdf笔记,然后是集群的SSL配置比较复杂,整理成子文件SSL思路,后总结升级为实践文档,并开源笔记。

  • 44
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值