Nginx负载均衡之后的文件上传同步

使用nginx进行负载均衡后(使用ip_hash;策略),存在一个问题,有A、B两台服务器,使用相同的数据库,用户访问被分配到了A服务器,成功上传一张照片,刷新后在A服务器可以看到;但是连接B服务器的用户刷新页面后只看到了一条记录,照片却丢失显示不了;网上有比较多的解决办法,但是都集中在使用WADI等配置文件同步策略,看过后觉得有点复杂(WADI本身配置比较简单),想简单点实现,思路如下:预先在配置文件中写好参与负载均衡的服务器列表,用户在A上提交照片后,就检测系统中配置的集群服务器的列表,排除A后通过linux的scp命令在不同的服务器之间实现文件同步,就一个简单的Java类就可以实现了,实现linux同步是采用的ganymed-ssh2库包提供的ssh的功能:

Java代码   收藏代码
  1. package zkyg.util;  
  2.   
  3. import ch.ethz.ssh2.Connection;  
  4. import ch.ethz.ssh2.SCPClient;  
  5.   
  6. import java.io.IOException;  
  7. import java.net.InetAddress;  
  8. import java.net.UnknownHostException;  
  9. import java.util.ArrayList;  
  10. import java.util.ResourceBundle;  
  11.   
  12. import zkyg.util.Log;  
  13. /** 
  14.  * 解决负载均衡情况下的文件上传不一致的情况:一旦用户上传照片到A服务器,上传完毕后调用Linux的scp命令来实现不同的服务器之间的文件同步操作: 
  15.  * @author wangyq 
  16.  * 
  17.  */  
  18. public class ClusterFilesSync extends Thread{  
  19.     private static String remoteUser = "root";  
  20.     private static String remotePass = "randompsw@123";  
  21.     private String absFileName = "";  
  22.       
  23.     public ClusterFilesSync(String absFileName) {  
  24.         this.absFileName = absFileName;  
  25.     }  
  26.       
  27.     @Override  
  28.     public void run() {  
  29.         try {  
  30.             ArrayList<String> al = getHosts();  
  31.             for(String s:al){  
  32.                        //循环同步每台服务器上的文件  
  33.               sync(s,22,absFileName);  
  34.             }  
  35.         } catch (Exception e) {  
  36.             e.printStackTrace();  
  37.         }  
  38.   
  39.     }  
  40.       
  41.     /** 
  42.      * 获取需要同步的服务器列表 
  43.      * @return 
  44.      */  
  45.     public static ArrayList<String> getHosts(){  
  46.         //在com.firm.config目录下有system.properties文件记录了集群服务器列表  
  47.         ResourceBundle bd = ResourceBundle.getBundle("com.firm.config.system");  
  48.         String clusters = bd.getString("clusters");  
  49.         String[] ips = clusters.split(",");  
  50.         ArrayList<String> al = new ArrayList<String>();  
  51.         for(String s:ips){  
  52.           al.add(s);  
  53.         }  
  54.         String localIp = "";  
  55.         try {  
  56.          //获取当前操作的服务器的IP地址,linux的etc/hosts中要配置好网络地址,不然只会得到127.0.0.1  
  57.          localIp = InetAddress.getLocalHost().getHostAddress();  
  58.          System.out.println("本机IP地址为:"+localIp);  
  59.         } catch (UnknownHostException e) {  
  60.             e.printStackTrace();  
  61.         }  
  62.         al.remove(localIp);  
  63.         return al;  
  64.     }  
  65.       
  66.     /** 
  67.      * 简单的文件同步 
  68.      * @return 
  69.      */  
  70.     public static void sync(String ip,int port,String absFileName){  
  71.         String path = "/var/www/html/jetty/webapps/userphotos/";  
  72.         Connection con = new Connection(ip, port);  
  73.         //连接  
  74.         try {  
  75.             con.connect();  
  76.           //远程服务器的用户名密码  
  77.             boolean isAuthed = con.authenticateWithPassword(remoteUser,remotePass);  
  78.           //建立SCP客户端  
  79.             if(isAuthed){  
  80.                 SCPClient scpClient = con.createSCPClient();  
  81.                 //将文件同步到指定的path目录下面  
  82.                 scpClient.put(absFileName, path);  
  83.                 Log.console("文件同步成功");  
  84.             }else{  
  85.                 Log.console("文件同步失败");  
  86.             }  
  87.             con.close();  
  88.         } catch (IOException e) {  
  89.             e.printStackTrace();  
  90.         }  
  91.     }  
  92.       
  93. }  

 

然后在用户图片上传成功后进行调用:

Java代码   收藏代码
  1. if(SystemConfigsInitHelper.getSpecifiedConfig("iscluster")!=null&&SystemConfigsInitHelper.getSpecifiedConfig("iscluster").equals("true")){  
  2.  //集群模式下进行数据同步  
  3.  new zkyg.util.ClusterFilesSync(fileName).start();  
  4.  }  

 

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值