You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cassandra 2.x集群执行nodetool status报IPv6格式错误排查

Cassandra 2.x执行nodetool status报IPv6格式错误问题分析

错误信息

执行nodetool status时抛出如下错误:

root@cassandra-cluster-01:/home# nodetool -h 192.168.2.228 status
nodetool: Failed to connect to '192.168.2.228:7199' - URISyntaxException: 'Malformed IPv6 address at index 7: rmi://[192.168.2.228]:7199'.
root@cassandra-cluster-01:/home# nodetool status
nodetool: Failed to connect to '127.0.0.1:7199' - URISyntaxException: 'Malformed IPv6 address at index 7: rmi://[127.0.0.1]:7199'.

部署脚本

提供的Cassandra 2.x安装部署脚本:

#!/bin/bash

# Define variables
CASSANDRA_VERSION="2.2.19"   # Specific 2.x version to install
NODE_IP="192.168.2.228"      # IP address for the current VM and seed node

# Update package lists and install prerequisites
apt-get update -y
apt-get install -y wget gnupg2 lsb-release

# Install Zulu JDK 8
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys B1998361219BD9C9
echo "deb http://repos.azulsystems.com/debian stable main" | tee /etc/apt/sources.list.d/zulu.list
apt-get update -y
apt-get install -y zulu-8

# Verify Java installation
java -version

# Download and install Cassandra
wget https://archive.apache.org/dist/cassandra/$CASSANDRA_VERSION/apache-cassandra-$CASSANDRA_VERSION-bin.tar.gz
tar -xvf apache-cassandra-$CASSANDRA_VERSION-bin.tar.gz
mv apache-cassandra-$CASSANDRA_VERSION /opt/cassandra

# Create symbolic links
ln -s /opt/cassandra/bin/* /usr/local/bin/

# Download jamm-0.3.0.jar and place it in the lib directory
wget https://repo1.maven.org/maven2/com/github/stephenc/jamm/0.3.0/jamm-0.3.0.jar -P /opt/cassandra/lib/

# Set up environment variables for Cassandra
cat <<EOF > /etc/profile.d/cassandra.sh
export CASSANDRA_HOME=/opt/cassandra
export PATH=\$PATH:\$CASSANDRA_HOME/bin
EOF
source /etc/profile.d/cassandra.sh

# Ensure permissions are set correctly
chmod -R 755 /opt/cassandra

# Update JVM options to include the jamm agent
cat <<EOF >> /opt/cassandra/conf/cassandra-env.sh
JVM_OPTS="\$JVM_OPTS -javaagent:\$CASSANDRA_HOME/lib/jamm-0.3.0.jar"
EOF

# Create Cassandra service
cat <<EOF > /etc/systemd/system/cassandra.service
[Unit]
Description=Apache Cassandra
After=network.target

[Service]
Type=simple
ExecStart=/opt/cassandra/bin/cassandra -f
ExecStop=/bin/kill -9 \$(cat /opt/cassandra/cassandra.pid)
User=root
Restart=always

[Install]
WantedBy=multi-user.target
EOF

# Reload systemd to recognize the new service
systemctl daemon-reload

# Stop Cassandra to configure
systemctl stop cassandra

# Configure Cassandra
sed -i "s/^# broadcast_rpc_address: 1.2.3.4/broadcast_rpc_address: $NODE_IP/" /opt/cassandra/conf/cassandra.yaml
sed -i "s/^listen_address: localhost/listen_address: $NODE_IP/" /opt/cassandra/conf/cassandra.yaml
sed -i "s/^rpc_address: localhost/rpc_address: $NODE_IP/" /opt/cassandra/conf/cassandra.yaml
sed -i "s/^- seeds: \"127.0.0.1\"/- seeds: \"$NODE_IP\"/" /opt/cassandra/conf/cassandra.yaml

# Enable auto_bootstrap
echo "auto_bootstrap: true" | tee -a /opt/cassandra/conf/cassandra.yaml

# Start Cassandra service
systemctl start cassandra

# Enable Cassandra to start on boot
systemctl enable cassandra

# Verify Cassandra installation
nodetool status

# Provide information about the installation
echo "Cassandra installation and initial configuration completed. Please check the nodetool status above for cluster status."

问题原因分析

  1. JMX地址格式化逻辑缺陷:Cassandra 2.x的nodetool在与JMX通信时,存在逻辑错误——错误地将IPv4地址用IPv6专属的方括号([])包裹,生成非法的RMI地址(如rmi://[192.168.2.228]:7199),触发URISyntaxException。该问题在Cassandra 2.x搭配JDK 8时极易出现。

  2. JMX核心配置缺失:脚本仅向cassandra-env.sh追加了jamm agent的JVM参数,但未配置JMX绑定地址的关键参数(如java.rmi.server.hostname)。Cassandra依赖这些参数正确暴露JMX地址,缺失后会导致nodetool无法正确解析服务地址,进而触发错误格式化。

  3. root用户启动的副作用:脚本使用root用户启动Cassandra,JMX在root权限下的网络参数行为与普通用户不同,进一步加剧了地址解析的异常。

修复方案

1. 补充JMX地址配置

修改脚本中追加JVM参数的部分,添加JMX绑定地址配置:

# 在追加jamm agent参数后,添加以下配置
cat <<EOF >> /opt/cassandra/conf/cassandra-env.sh
JVM_OPTS="\$JVM_OPTS -Djava.rmi.server.hostname=$NODE_IP"
JVM_OPTS="\$JVM_OPTS -Dcom.sun.management.jmxremote.host=$NODE_IP"
EOF

2. 临时绕过方案(直接调用nodetool)

执行nodetool时显式指定正确的JMX URI格式,绕过自动格式化问题:

nodetool -u service:jmx:rmi:///jndi/rmi://192.168.2.228:7199/jmxrmi status

3. 使用普通用户启动Cassandra

创建专属的cassandra用户并修改服务配置,减少权限对JMX的影响:

# 创建cassandra系统用户
useradd -r -m -U -d /opt/cassandra -s /bin/false cassandra
chown -R cassandra:cassandra /opt/cassandra

# 修改service文件的运行用户
sed -i "s/User=root/User=cassandra/" /etc/systemd/system/cassandra.service

内容的提问来源于stack exchange,提问作者quarks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 06:56:07