由于Cassandra没有控制集群所有节点的工具,如果服务器比较多的话会比较麻烦,所以抽空写了一个Cassandra启停工具。
此实现是使用JSCH。JCSH实现打成jar后,脚本调用jar包,通过ssh给配置的cassandra服务器发送命令,达到启停Cassandra的目的。基本步骤如下:
1、JSCH代码实现发送命令。
/**
* Cassandra control tool
*
*/
public class CassCtrl {
private static JSch jsch;
private static Session session;
private static void connect(String host, int port, String user,
String passwd) throws JSchException {
jsch = new JSch();
session = jsch.getSession(user, host, port);
session.setPassword(passwd);
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
}
public static boolean execCmd(String host, int port, String user,
String passwd, String command) throws JSchException, IOException {
BufferedReader reader = null;
BufferedReader result = null;
ChannelShell exec = null;
command += "\n";
try {
connect(host, port, user, passwd);
exec = (ChannelShell) session.openChannel("shell");
exec.setInputStream(new ByteArrayInputStream(command.getBytes()));
exec.connect();
/*----------------打印执行结果---------------------*/
InputStream is = exec.getInputStream();
result = new BufferedReader(new InputStreamReader(is));
String result_str = null;
while ((result_str = result.readLine()) != null) {
// System.out.println(result_str);
}
return true;
} finally {
try {
if (reader != null) {
reader.close();
}
if (result != null) {
result.close();
}
} catch (IOException e) {
e.printStackTrace();
}
if (exec != null) {
exec.disconnect();
}
if (session != null) {
session.disconnect();
}
}
}
/**
* @param args
*/
public static void main(String[] args) {
StringBuffer buffer = new StringBuffer();
if (args.length != 5) {
for (String str : args) {
buffer.append(str).append(",");
}
System.out.println("your args is ["
+ ((buffer.length() > 0) ? buffer.deleteCharAt(buffer
.length() - 1) : "") + "]");
System.err.println("Usage: host port user password command");
} else {
boolean flag = false;
try {
flag = execCmd(args[0], Integer.valueOf(args[1]), args[2],
args[3], args[4]);
} catch (Throwable e) {
e.printStackTrace();
}
buffer.append(flag ? "success" : "failed");
System.out.println("host[" + args[0] + "] exec command[" + args[4]
+ "] " + buffer.toString());
}
}
}
2、配置CASS_HOME
最好在每台Cassandra服务器上都配置一下CASS_HOME,如下:
JAVA_HOME=/home/jdk1.6.0_30
JRE_HOME=/home/jdk1.6.0_30/jre
CASS_HOME=/home/cass/apache-cassandra-1.2.0
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$CASS_HOME/bin
PATH=$PATH:$HOME/bin
export JAVA_HOME JRE_HOME CASS_HOME PATH CLASSPATH
3、stop-server配置
将$CASS_HOME/bin/stop-server文件最后两行的注释去掉,可以直接执行这个脚本停止Cassandra. user=whoami pgrep -u $user -f cassandra | xargs kill -9
4、jar包
可以将第1部分代码用eclipse(或其他工具)export成Runable jar file(将引用的jar也打到这个jar),如文件名为CassControl.jar。
5、cassandra服务器配置信息(node.properties)和执行脚本(ctrl-cass.sh)
cassandra服务器配置信息(node.properties)以#host port user password的方式存储。如:
192.168.0.141 22 cass 123456
192.168.0.142 22 cass 123456
192.168.0.143 22 cass 123456
192.168.0.144 22 cass 123456
执行脚本(ctrl-cass.sh)如下:
#!/bin/sh
if [ -n "$JAVA_HOME" ]; then
JAVA="$JAVA_HOME/bin/java"
else
JAVA=java
fi
if [ -z "$CASS_HOME" ]; then
echo "You must set the CASS_HOME" >&2
exit 1
fi
execute(){
cat node.properties | (while read line;
do
HOST=`echo $line | cut -d ' ' -f 1`;
PORT=`echo $line | cut -d ' ' -f 2`;
USER=`echo $line | cut -d ' ' -f 3`;
PASSWORD=`echo $line | cut -d ' ' -f 4`;
$JAVA -jar CassControl.jar $HOST $PORT $USER $PASSWORD $CASS_HOME/bin/$1
#echo $HOST $PORT $USER $PASSWORD;
done)
}
case "$1" in
'start-all')
execute 'cassandra;exit;'
;;
'stop-all')
execute 'stop-server;exit;'
;;
*)
echo "Usage: $0 { start-all | stop-all }"
exit 1
esac
exit 0
6、上传脚本到服务器
将jar包、服务器配置信息(node.properties)和脚本(ctrl-cass.sh)上传到linux服务器(需在同级目录)。
7、执行说明
执行ctrl-cass.sh脚本要带1个参数,可以为start-all或者stop-all。
./ctrl-cass.sh start-all
./ctrl-cass.sh stop-all
你也可以在Github上查看相关代码。