实战JavaEE项目的集群部署和负载均衡(3):实现集群和负载均衡

191 阅读4分钟

项目架构图

在这里插入图片描述

项目文件和数据下载:github.com/ouyangsuo/C…

部署MySQL数据服务器

  • 通过Xftp等工具或scp命令将crm_test.sql文件上传到数据库服务器特定位置(例如/data/crm_test.sql)
  • 登录MySQL服务器,创建crm_test数据库,从crm_test.sql导入数据
create database crm_test charset=utf8;
use crm_test;
source /data/crm_test.sql;
  • 修改防火墙规则,永久开放3306端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-ports

上述步骤也可以通过iptables实现,参考上一节内容

部署业务服务器

  • 将项目文件上传到2号机的tomcat下的webapps/ROOT目录下
  • 修改webapps/ROOT/WEB-INF/classes/db.properties文件,配置数据库服务器的IP和访问密码,此处我的配置为:

jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://192.168.142:3306/crm_test jdbc.username=root jdbc.password=123456

  • 检查和开放8080、8443、443三个端口 其中8080和8443为正常的http请求和转发端口,443为https协议转发端口
iptables -I INPUT -p tcp --dport 8080 -j ACCEPT
iptables -I INPUT -p tcp --dport 8443 -j ACCEPT
iptables -I INPUT -p tcp --dport 443 -j ACCEPT
  • 执行bin目录下的startup.sh,以启动tomcat

  • 外部通过浏览器访问 http://<tomcat服务器ip>:8080,执行效果 在这里插入图片描述

  • 在另一台tomcat服务器上执行相同的操作并验证结果 在这里插入图片描述

  • PS:在执行一些调试时,需要不断通过shutdown.sh和startup.sh重启服务

Nginx配置反向代理

  • 先将nginx服务器默认的启动配置文件进行备份
cd /usr/local/nginx/conf/
cp ./nginx.conf ./nginx.conf.bak
  • 修改默认的启动配置文件
vim ./nginx.conf
# 声明通过root用户执行可以省去很多不必要的麻烦
user root;

#1个工作进程,最大1024个连接,这些是默认配置
worker_processes  1;
events {
    worker_connections  1024;
}

http {
	# 这里是一些默认配置
    #include       mime.types;
    #default_type  application/octet-stream;
    #sendfile        on;

    #声明将要代理的服务器,crmserver为自定义的服务名称
    upstream crmserver{
        server 192.168.0.178:8080;
    }
    
    server {
        # 监听在本机的80端口
        listen       80;

        # 将请求 http://<ip>:80/ 转发到上面定义的crmserver上
        location / {
           proxy_pass http://crmserver;
        }
    }

}

上面的配置实现了通过访问nginx的80端口实现对业务机8080端口的访问(由upstream xxx定义),即所谓的反向代理

  • 启动nginx
/usr/local/nginx/sbin/nginx
  • 通过外部浏览器访问 http://<nginx服务器ip>:80,实际效果等同于访问上面的 http://<tomcat服务器ip>:8080 在这里插入图片描述

Nginx实现负载均衡

  • 修改上一步中的配置文件如下
# 声明通过root用户执行可以省去很多不必要的麻烦
user root;

#1个工作进程,最大1024个连接,这些是默认配置
worker_processes  1;
events {
    worker_connections  1024;
}

http {
	# 这里是一些默认配置
    #include       mime.types;
    #default_type  application/octet-stream;
    #sendfile        on;

    #声明将要代理的服务器,crmserver为自定义的服务名称
    #crmserver服务由两台服务器实现负载均衡,权重分别为5
    #权重为自定义整数,数值越高,则负载的请求越多
    upstream crmserver{
        server 192.168.0.178:8080 weight=5;
        server 192.168.0.186:8080 weight=5;
        
        #负载均衡策略配置,默认为按权重轮询
        #fair;
    }
    
    server {
        # 监听在本机的80端口
        listen       80;

        # 将请求 http://<ip>:80/ 转发到上面定义的多台crmserver上进行负载均衡
        location / {
           proxy_pass http://crmserver;
        }
    }

}
  • 再次启动nginx并访问 http://<nginx服务器ip>:80,发现请求已自动负载均衡到两台业务机上了 在这里插入图片描述

Nginx负载均衡策略

nginx的upstream目前支持的5种方式的分配

  • 1、依次轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
	upstream backserver { 
		server 192.168.0.14; 
		server 192.168.0.15; 
	} 
  • 2、权重轮询 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
	upstream backserver { 
		server 192.168.0.14 weight=8; 
		server 192.168.0.15 weight=10; 
	} 
  • 3、客户端IP绑定 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
	upstream backserver { 
		ip_hash; 
		server 192.168.0.14:88; 
		server 192.168.0.15:80; 
	} 
  • 4、fair(公平竞争:能者多劳/快者多劳) 按后端服务器的响应时间来分配请求,响应时间短的优先分配。
	upstream backserver { 
		server server1; 
		server server2; 
		fair; 
	} 
  • 5、URL请求IP绑定 按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
	upstream backserver { 
		server squid1:3128; 
		server squid2:3128; 
		hash $request_uri; 
		hash_method crc32; 
	} 
  • down和backup,“”退赛选手”和“备胎选手”
	upstream backserver{ 
		ip_hash; 
		server 127.0.0.1:8080 weight=2; 
		server 127.0.0.1:6060; 
		
		# down 表示当前的server暂时不参与负载(退赛)
		server 127.0.0.1:9090 down; 		
		
		# 其它所有的非backup机器down或者忙的时候,请求backup机器(备胎)
		server 127.0.0.1:7070 backup;  
	}