使用nginx进行负载均衡后(使用ip_hash;策略),存在一个问题,有A、B两台服务器,使用相同的数据库,用户访问被分配到了A服务器,成功上传一张照片,刷新后在A服务器可以看到;但是连接B服务器的用户刷新页面后只看到了一条记录,照片却丢失显示不了;网上有比较多的解决办法,但是都集中在使用WADI等配置文件同步策略,看过后觉得有点复杂(WADI本身配置比较简单),想简单点实现,思路如下:预先在配置文件中写好参与负载均衡的服务器列表,用户在A上提交照片后,就检测系统中配置的集群服务器的列表,排除A后通过linux的scp命令在不同的服务器之间实现文件同步,就一个简单的Java类就可以实现了,实现linux同步是采用的ganymed-ssh2库包提供的ssh的功能:
package zkyg.util; import ch.ethz.ssh2.Connection; import ch.ethz.ssh2.SCPClient; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.ResourceBundle; import zkyg.util.Log; /** * 解决负载均衡情况下的文件上传不一致的情况:一旦用户上传照片到A服务器,上传完毕后调用Linux的scp命令来实现不同的服务器之间的文件同步操作: * @author wangyq * */ public class ClusterFilesSync extends Thread{ private static String remoteUser = "root"; private static String remotePass = "randompsw@123"; private String absFileName = ""; public ClusterFilesSync(String absFileName) { this.absFileName = absFileName; } @Override public void run() { try { ArrayList<String> al = getHosts(); for(String s:al){ //循环同步每台服务器上的文件 sync(s,22,absFileName); } } catch (Exception e) { e.printStackTrace(); } } /** * 获取需要同步的服务器列表 * @return */ public static ArrayList<String> getHosts(){ //在com.firm.config目录下有system.properties文件记录了集群服务器列表 ResourceBundle bd = ResourceBundle.getBundle("com.firm.config.system"); String clusters = bd.getString("clusters"); String[] ips = clusters.split(","); ArrayList<String> al = new ArrayList<String>(); for(String s:ips){ al.add(s); } String localIp = ""; try { //获取当前操作的服务器的IP地址,linux的etc/hosts中要配置好网络地址,不然只会得到127.0.0.1 localIp = InetAddress.getLocalHost().getHostAddress(); System.out.println("本机IP地址为:"+localIp); } catch (UnknownHostException e) { e.printStackTrace(); } al.remove(localIp); return al; } /** * 简单的文件同步 * @return */ public static void sync(String ip,int port,String absFileName){ String path = "/var/www/html/jetty/webapps/userphotos/"; Connection con = new Connection(ip, port); //连接 try { con.connect(); //远程服务器的用户名密码 boolean isAuthed = con.authenticateWithPassword(remoteUser,remotePass); //建立SCP客户端 if(isAuthed){ SCPClient scpClient = con.createSCPClient(); //将文件同步到指定的path目录下面 scpClient.put(absFileName, path); Log.console("文件同步成功"); }else{ Log.console("文件同步失败"); } con.close(); } catch (IOException e) { e.printStackTrace(); } } }
然后在用户图片上传成功后进行调用:
if(SystemConfigsInitHelper.getSpecifiedConfig("iscluster")!=null&&SystemConfigsInitHelper.getSpecifiedConfig("iscluster").equals("true")){ //集群模式下进行数据同步 new zkyg.util.ClusterFilesSync(fileName).start(); }
相关推荐
nginx负载均衡配置文件实例:基本配置说明文档和一个配置好的nginx.conf文件实例
Tomcat在高并发环境下处理动态请求时性能很低,而在处理静态页面更加脆弱。是通过Nginx来处理静态页面要比通过Tomcat处理在性能方面好很多。本例为nginx负载均衡配置方法
lvs+nginx负载均衡,lvs+nginx负载均衡,lvs+nginx负载均衡,lvs+nginx负载均衡
基于lua的nginx自定义负载均衡基于lua的nginx自定义负载均衡
linux下安装Nginx并做到负载均衡,配置详细在文档有介绍!
nginx经常用到的负载均衡的5种策略,注意细节,部分属性不能一起使用。
Nginx实现负载均衡 web均衡负载 webservice负载均衡 Nginx实现负载均衡配制全说明 为了多台后台的web、webservice服务能均衡负载,可以使用nginx进行处理 1)配置文件全配制ok 2)有两个完整的web服务做例子,可以...
nginx 完成服务器之间集群的搭建 能够解决服务器调用负载均衡
nginx 负载均衡与缓存服务器标准配置文件
基于nginx负载均衡的集群聊天系统,其中技术点有网络方面、数据库方面、线程安全方面;功能点有添加好友、单人聊天、群组聊天等 基于nginx负载均衡的集群聊天系统,其中技术点有网络方面、数据库方面、线程安全方面...
主要介绍了nginx负载均衡配置,宕机自动切换方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
nginx 负载均衡 反向代理 nginx 负载均衡 反向代理 nginx 负载均衡 反向代理
在一台服务器的操作系统上,安装一个附加软件来实现负载均衡,如Nginx负载均衡(我们管理系统平台使用的也是这款均衡器)。它的优点是基于特定环境、配置简单、使用灵活、成本低廉,可以满足大部分
阿里云服务器搭建nginx负载均衡
Nginx的负载均衡配置文件
该文档以Nginx为基础,详细梳理了负载均衡的原理,以及优化方式,和实现步骤,无论新手还是大虾都可以从中得到深入体会。
Nginx的负载均衡入门 Nginx的负载均衡入门 Nginx的负载均衡入门
linux下的nginx搭建的负载均衡,nginx.conf文件修改成自己对应的地址即可直接使用,将配置复制进windows版本的nginx下应该也可用,这个没有测试,有问题,请联系哦
Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器... Nginx 支持简单的负载均衡和容错; 支持作为基本 HTTP 服务器的功能,例如日志、压缩、Byte ranges、Chunked responses、SSL、虚拟主机等等,应有尽有
Nginx的特点是: ... 2、Nginx对网络的依赖比较小; 3、Nginx安装和配置比较简单,测试起来比较方便; 4、也可以承担高的负载压力且稳定,一般能支撑超过1万... 另外默认的只有Round-robin和IP-hash两种负载均衡算法。