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."
问题原因分析
JMX地址格式化逻辑缺陷:Cassandra 2.x的
nodetool在与JMX通信时,存在逻辑错误——错误地将IPv4地址用IPv6专属的方括号([])包裹,生成非法的RMI地址(如rmi://[192.168.2.228]:7199),触发URISyntaxException。该问题在Cassandra 2.x搭配JDK 8时极易出现。JMX核心配置缺失:脚本仅向
cassandra-env.sh追加了jamm agent的JVM参数,但未配置JMX绑定地址的关键参数(如java.rmi.server.hostname)。Cassandra依赖这些参数正确暴露JMX地址,缺失后会导致nodetool无法正确解析服务地址,进而触发错误格式化。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
相关产品推荐
相关产品推荐

