rocketmq踩坑挂载外网域名内网可以访问外网无法访问

问题描述

服务器部署的mq服务之前一直是内网开发,再挂载域名到外网的时候,发现内网网络可以访问,但是外网却不行,端口映射又是成功的,
首先是启动broker

启动mq的broleker注册到mq的注册中心

 sudo nohup /usr/local/rocketmq/bin/mqbroker -n 内网:9876 -c /usr/local/rocketmq/conf/broker.conf autoCreateTopicEnable=true &

注意
外网域名 :外网端口9888 但是由于我这里的broker和注册中心nameserer都是同一个集群网络环境 所以第一次启动注册用的内网,如果是nameserver再外网就是外网

最开始内网开发的集群配置

brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH

后来觉百度查询需要配置在指定注册中心nameserver和当前broker的ip
于是

brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
brokerIP1=域名
namesrvAddr=域名:外网端口
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH

于是出现了内网连接,外网无法连接的情况
于是我把这个域名换成解析的ip

brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
brokerIP1=x.x.x.x
namesrvAddr=x.x.x.x:9876

deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH

此时外网也可以访问mq了
但是由于服务器dns解析的ip是动态的

所以我想了一下使用shell脚本来定时解析域名进行设置

#!/bin/bash


DOMAIN="域名"         # RocketMQ 对应的域名
LOG_FILE="/var/log/rocketmq_ip_change.log" # 日志文件路径
CONFIG_FILE="/usr/local/rocketmq/conf/broker.conf" # RocketMQ 配置文件路径
BROKER_IP_KEY="brokerIP1"             # 配置文件中代表 Broker IP 的字段
NAMESRV_ADDR_KEY="namesrvAddr"        # 配置文件中代表 NameServer 地址的字段
PORT="9876"                           # NameServer外网访问端口 端口
TMP_IP_FILE="/tmp/last_known_ip"      # 用于保存上次解析的 IP 地址

# 日志记录函数
log() {
    local message="$1"
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] $message" | tee -a "$LOG_FILE"
}

# 获取当前域名解析的 IP 地址
get_current_ip() {
    # 配置 DNS 服务器数组
    local dns_servers=("114.114.114.114" "8.8.8.8" "8.8.4.4"  "1.1.1.1") 
    local dns_server
    local ip
    
    # 随机选择一个 DNS 服务器
    dns_server=${dns_servers[$RANDOM % ${#dns_servers[@]}]}
    
    # 使用 dig 命令查询域名并获取 IP 地址
    ip=$(dig +short @"$dns_server" "$DOMAIN" | head -n 1 | tr -d '[:space:]')
    
    # 检查是否解析成功
    if [[ -z "$ip" ]]; then
        log "Error: 无法解析域名 $DOMAIN"
        exit 1
    fi
    
    echo "$ip"
}


# 检查 IP 是否发生变化
check_ip_change() {
    local current_ip stored_ip
    current_ip=$(get_current_ip)
    stored_ip=$(cat "$TMP_IP_FILE" 2>/dev/null || echo "")
    log "Stored IP: $stored_ip"
    log "解析ip:  $current_ip "
    if [ "$current_ip" != "$stored_ip" ]; then
        log "IP 改变由$stored_ip 转变为 $current_ip"
        sudo echo "$current_ip" > "$TMP_IP_FILE"
        return 0
    fi
    return 1
}

# 更新 RocketMQ 配置文件中的 IP
update_config() {
    local current_ip new_namesrv_addr
    current_ip=$(get_current_ip)
    new_namesrv_addr="${current_ip}:${PORT}"
    if sudo sed -i "s/^$BROKER_IP_KEY=.*$/$BROKER_IP_KEY=$current_ip/" "$CONFIG_FILE" && \
       sudo sed -i "s/^$NAMESRV_ADDR_KEY=.*$/$NAMESRV_ADDR_KEY=$new_namesrv_addr/" "$CONFIG_FILE"; then
        log "Configuration updated with IP: $current_ip"
    else
        log "Error: 更改配置文件失败."
        exit 1
    fi
}

# 停止并重启 RocketMQ 服务
# 停止并重启 RocketMQ 服务
restart_rocketmq() {
    echo "shcmu#2024" | sudo -S /usr/local/rocketmq/bin/mqshutdown broker
    echo "shcmu#2024" | sudo -S /usr/local/rocketmq/bin/mqshutdown namesrv
    sleep 10
    log "RocketMQ 服务停止."

    local current_ip
    current_ip=$(get_current_ip)
#无权限 /home/cykq/autoSetingRocketmq/update_mq_ip.sh: line 70: /tmp/mqnamesrv.log: Permission denied
#/home/cykq/autoSetingRocketmq/update_mq_ip.sh: line 71: /tmp/mqbroker.log: Permission denied
  nohup sudo /usr/local/rocketmq/bin/mqnamesrv -n 内网地址:9876 | sudo tee /tmp/mqnamesrv.log > /dev/null &
  nohup sudo /usr/local/rocketmq/bin/mqbroker -n 内网地址:9876 -c "$CONFIG_FILE" autoCreateTopicEnable=true | sudo tee /tmp/mqbroker.log > /dev/null &

    log "RocketMQ services 启动当前 IP: $current_ip"
}


# 主逻辑
if check_ip_change; then
    log '检测到 IP 改变,更新配置并重启服务'
    update_config
    restart_rocketmq
else
    log 'IP 没有变化,跳过配置更新'
fi

服务器添加定时任务执行脚本

crontab -e

填写

*/10 * * * * /home/cykq/autoSetingRocketmq/update_mq_ip.sh >> /var/log/rocketmq_ip_change.log 2>&1

但是这样指标不治本,于是第二天继续排查

既然配置写域名 无法让外网连接,但是写dns解析后的ip却可以
那么问题会不会是无法解析成Ip,于是去看了网卡配置

结果是服务器网卡没有配置解析dns的地址

network:
  ethernets:
    ens160:
      addresses:
      - 内网地址/24
      nameservers:
        addresses:
        - xxxx 解析dns服务器的地址
        search: []
      routes:
      - to: default
        via: 网关地址
  version: 2

所以问题就是在这里,由于没有配置服务器解析的dns的地址,mq没有办法通过系统解析,只有静态写ip

多mq环境使用一个域名的情况

当我司有一个域名(业务域名)映射了多个的mq服务,其中一个配置项依旧容易踩坑
域名:9876->server1:9876 域名9877->server2:9876
域名:10911->服务器1:10911 域名:10921->服务器1:10911

俩个的配置broker

brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
brokerIP1=域名
namesrvAddr=域名:9877
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH

除了nameAdd的端口不同其他的都一样对吧? 因为作为broker只需要告诉对应的注册中心自己的ip地址即可看起来没有问题
但是对多个mq使用一个域名的时候就容易踩坑了

发现 服务器2 9877报错无法连接域名解析的ip:10911
不对吧? 9877对应的broker 是10921 所以问题就出来了
在这里插入图片描述

由于俩个broker都跟注册中心申请注册的时候只填写了自己的公网ip,又因为都是挂在的同一个域名

所以俩个broker派发任务都会给 10921的这一个,所以需要10921挂载对应的配置文件申明监听端口是

listenPort=10921

并且域名映射也是改成-10921->10921 这样就不会因为域名解析的转发转到各个端口映射10911导致错误

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝胖子不是胖子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值