qileilove

blog已经转移至github,大家请访问 http://qaseven.github.io/

使用Java管理千台规模Linux服务器_入门

前东家是一家游戏公司,老板很好,当时工作也留下了很多自己原创的管理脚本。现在分享一下在办公环境使用Java、Jsch登录VPN管理Linux的脚本(此处实现JAVA调用Linux上备份Mysql的shell作为示例),希望对运维的朋友有帮助,尽快从繁杂的服务器管理工作中脱离出来。

  主要的实现思路:

  如果需要先登录VPN才能连接游戏服务器,需要将游戏服务器的ssh端口(一般是22)映射到本地办公电脑的端口上(如5555),然后ssh连接本地办公电脑的5555端口,这样就可以连接到游戏服务器,并可以管理游戏服务器了。

  当您学会通过VPN连接Linux服务器后,如果只在内网环境,不使用VPN,就更简单了,此外不再详述。Jsch的example里也有介绍。

  代码:使用Jsch透过VPN

  1. package com.daily.wednesday;  
  2. import java.io.IOException;  
  3. import java.io.InputStream;  
  4. import java.sql.Connection;  
  5. import java.sql.DriverManager;  
  6. import java.sql.ResultSet;  
  7. import java.sql.SQLException;  
  8. import java.sql.Statement;  
  9. import com.daily.util.DataBaseConnection;  
  10. import com.jcraft.jsch.Channel;  
  11. import com.jcraft.jsch.ChannelExec;  
  12. import com.jcraft.jsch.JSch;  
  13. import com.jcraft.jsch.JSchException;  
  14. import com.jcraft.jsch.Session;  
  15. public class BackUpMysql3 {  
  16.     public static void main(String args[]) {  
  17.         // 读取数据库配置 
  18.         DataBaseConnection dataBaseConnection = new DataBaseConnection();  
  19.         String dataBaseConfigForWrite[] = new String[3];  
  20.         dataBaseConfigForWrite = dataBaseConnection.loadDataConfig();  
  21.         Connection conn = null;// 数据库连接 
  22.         Statement stmt = null;// 数据库表达式 
  23.         ResultSet rs = null// 结果集 
  24.         int rowcount = 0;// 总记录数 
  25.         String sql = "select * from servers_maint_wednesday";  
  26.         try {  
  27.             conn = DriverManager.getConnection(dataBaseConfigForWrite[0],  
  28.                     dataBaseConfigForWrite[1], dataBaseConfigForWrite[2]);  
  29.             stmt = conn.createStatement();  
  30.             rs = stmt.executeQuery(sql);  
  31.             rs.last();  
  32.             rowcount = rs.getRow();// 总记录数 
  33.             rs = stmt.executeQuery(sql);  
  34.         } catch (SQLException e) {  
  35.             e.printStackTrace();  
  36.         }  
  37.         // 定义游戏服务器IP的数组,游戏服务器IP存在数据库中。 
  38.         String privateIpaddress[] = new String[rowcount];  
  39.         String remark[] = new String[rowcount];// 定义游戏区名称 
  40.         String programPath[] = new String[rowcount];// 定义程序路径 
  41.         String backMysqlShellPath[] = new String[rowcount];// 定义mysql备份脚本路径 
  42.         int j = 0;  
  43.         try {  
  44.             while (rs.next()) {  
  45.                 privateIpaddress[j] = rs.getString("privateipaddress");  
  46.                 remark[j] = rs.getString("remarks");  
  47.                 programPath[j] = rs.getString("programpath");  
  48.                 backMysqlShellPath[j] = rs.getString("backmysqlshellpath");  
  49.                 j++;  
  50.             }  
  51.         } catch (Exception e) {  
  52.             e.printStackTrace();  
  53.         } finally {  
  54.             try {  
  55.                 if (rs != null) {  
  56.                     rs.close();  
  57.                 }  
  58.                 if (stmt != null) {  
  59.                     stmt.close();  
  60.                 }  
  61.                 if (conn != null) {  
  62.                     conn.close();  
  63.                 }  
  64.             } catch (Exception e) {  
  65.                 e.printStackTrace();  
  66.             }  
  67.         }  
  68.         // 调用mysql备份方法 
  69.         for (int n = 0; n < privateIpaddress.length; n++) {  
  70.             try {  
  71.                 try {  
  72.                     backUpMysql(privateIpaddress[n], backMysqlShellPath[n],remark[n]);  
  73.                 } catch (IOException e) {  
  74.                     // TODO Auto-generated catch block 
  75.                     e.printStackTrace();  
  76.                 }  
  77.             } catch (JSchException e) {  
  78.                 // TODO Auto-generated catch block 
  79.                 e.printStackTrace();  
  80.             }  
  81.         }  
  82.     }  
  83.     /** 
  84.      * 备份mysql数据库的方法 
  85.      * @param privateip 
  86.      * @param backMysqlShellPath 
  87.      * @throws JSchException 
  88.      * @throws IOException 
  89.      */ 
  90.     public static void backUpMysql(String privateip, String backMysqlShellPath, String remark)  
  91.             throws JSchException, IOException {  
  92.         // 登录到服务器 
  93.         int rport;  
  94.         JSch jsch = new JSch();  
  95.         String host = "dl.dengdie.com"//此处为VPN服务器地址 
  96.         String user = "admin"//VPN用户名 
  97.         Session sessionForBack = jsch.getSession(user, host, 22);  
  98.         rport = 22;  
  99.         sessionForBack.setPassword("&*&&&&lalaflls"); //VPN密码 
  100.         java.util.Properties config = new java.util.Properties();  
  101.         config.put("StrictHostKeyChecking""no");  
  102.         sessionForBack.setConfig(config);  
  103.         sessionForBack.connect();//登录到VPN服务器 
  104.           
  105.         // 建立与游戏服务器的ssh转发连接:即将游戏服务器的22号ssh端口映射的本地办公电脑的53238端口。       
  106.         sessionForBack.setPortForwardingL(53238, privateip, rport);  
  107.         try {  
  108.             JSch jschToBack = new JSch();  
  109.             Session sessionToBack = jschToBack.getSession(user, "127.0.0.1",  
  110.                     53238); //连接本地办公电脑的53238端口,就相当于连接了游戏服务器的22号端口。 
  111.             sessionToBack.setPassword("&*&&&&lalaflls");  
  112.             sessionToBack.setConfig(config);  
  113.             sessionToBack.connect();  
  114.             //backMysqlShellPath实际上是游戏服务器上备份Mysql数据库的一个脚本,此脚本请您自行实现,网上很多实例。 
  115.             String command = backMysqlShellPath;  
  116.             //打开执行命令的隧道,并执行命令。 
  117.             Channel channel = sessionToBack.openChannel("exec");  
  118.             ((ChannelExec) channel).setCommand(command);  
  119.             channel.setInputStream(null);  
  120.             ((ChannelExec) channel).setErrStream(System.err);  
  121.             InputStream in = channel.getInputStream();  
  122.             channel.connect();  
  123.             byte[] tmp = new byte[1024];  
  124.             while (true) {  
  125.                 while (in.available() > 0) {  
  126.                     int i = in.read(tmp, 01024);  
  127.                     if (i < 0)  
  128.                         break;  
  129.                     System.out.print(new String(tmp, 0, i));  
  130.                 }  
  131.                 if (channel.isClosed()) {  
  132.                     System.out.println(remark + "Mysql备份完毕!");  
  133.                     System.out.println("exit-status: " 
  134.                             + channel.getExitStatus());  
  135.                     break;  
  136.                 }  
  137.                 try {  
  138.                     Thread.sleep(1000);  
  139.                 } catch (Exception ee) {  
  140.                 }  
  141.             }  
  142.             channel.disconnect();  
  143.             sessionToBack.disconnect();  
  144.             sessionForBack.disconnect();  
  145.         } catch (Exception e) {  
  146.             System.out.println(e);  
  147.         }  
  148.     }  
  149. }

posted on 2012-07-20 09:39 顺其自然EVO 阅读(242) 评论(0)  编辑  收藏 所属分类: 数据库


只有注册用户登录后才能发表评论。


网站导航:
 
<2012年7月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

导航

统计

常用链接

留言簿(55)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜