分布式环境搭建的过程记录
作者:彼岸~撷
来源:SegmentFault 思否社区
# 分布式实现的过程整理
1、反向代理
1.1 最初的需求
通过image.jt.com的网址访问自己的图片信息
虚拟地址:http://image.jt.com/
磁盘地址:D:JT-SOFTimages
//引入配置文件
@PropertySource("classpath:/properties/image.properties")
//拿到配置文件中的image.localDir的值并注入给localDir
@Value("${image.localDir}")
private String localDir; // = "D:/JT-SOFT/images"; //1.优化点一
2.2 什么是反向代理
业务分析:为了让所有的用户都可以访问到图片信息,准备虚拟地址,并实现虚拟地址和本地磁盘之间的映射关系,用反向代理实现
反向代理的说明:反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标浏览器,及用户直接访问反向代理服务器就可以获取目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无需在用户端做任何设定,反向代理服务器用于web加速,即使用反向代理服务器作为web服务器的前置机来降低网络和服务器的负载,提高访问效率。
代理服务器位于用户与目标服务器之间
用户并不知道要访问那个真是的服务器
用户并不知道真实的服务器资源是谁,保护了真实的服务器资源i信息
反向代理服务器一般都是服务器端代理,保护真实服务器信息
正向代理:用户知道访问的真实服务器是谁,只是将请求交给代理服务器来获取,正向代理保护了用户的信息,服务器并不知道访问的真实用户是谁,除非顺着网线一路查
2.3 Nginx
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
内存: 不到2M
并发能力强: 3-5万次/秒 理想环境下 /tomcat服务器 150-220/秒nginx官网下载
nginx安装
路径不要放到系统盘,路径不能有中文和空格
以超级管理员的权限启动,动态获取权限
在任务管理其中查看是否启动成功
浏览器访问:localhost:80/
安装中的常见问题:
端口被占用:nginx默认使用80端口,只要找到系统中占用80端口的进程,并杀掉就可以
# 找到占用80或含80字符串的所有进程,找到第一个,查看pid号
netstat -ano | findstr "80"
# 然后在任务管理器中找到pid,并结束进程即可
# 或者可以从控制台强制结束对应pid的进程
kill pid
2.4 nginx命令
关于nginx进程项的说明:nginx每次启动都会同时生成两个进程项,一个是主进程,一个是守护进程,主进程进行反向代理业务,守护进程防止主进程意外关闭
基本命令
要求在nginx的根目录中执行,在根目录栏中输入cmd,enter之后,进入dos窗口,输入以下命令:
# 启动nginx start nginx
# 重启nginx nginx -s reload
# 停止nginx nginx -s stop
输入http://localhost:80/跳转到目标nginx页面则安装成功
# 编辑nginx.conf
# 配置图片服务器
server{
listen 80;
server_name image.jt.com;
location / {
# 映射到本地的目录中
root C:/Users/tarena/Desktop/CGB-JT/images;
}
}
编辑hosts文件/利用switchhosts编辑(实现本地模拟网络访问)
127.0.0.1 image.jt.com
127.0.0.1 manager.jt.com
127.0.0.1 www.jt.com
127.0.0.1 sso.jt.com
注:利用host工具编辑失败则修改hosts文件的权限
2.5 实现域名代理
配置域名代理
# 配置域名代理
server {
//监听80端口上域名为manager.jt.com的请求
listen 80;
server_name manager.jt.com;
location / {
# 代理服务器的地址
proxy_pass http://localhost:8091;
}
}
启动项目之后,在浏览器中访问http://manager.jt.com,就能够实现访问http://localhost:8091
2.6 nginx负载均衡原理
若只有一台服务器,在高并发的情况下服务器会立刻崩溃,如果用多台服务器,那可以减轻一台服务器的压力,服务器集群可以解决高并发中的后端服务器问题
nginx集群的搭建
要求:启动三台服务器,运行项目,端口号分别是8081、8082、8083,通过getPort请求来获取当前服务器的端口号并字符串返回
动态获取端口号:
//每台服务器上都有这个方法,动态获取本项目所在的端口号@RestController
public class PortController {
//考点:动态复制操作
@Value("${server.port}")
private Integer port;
@RequestMapping("/getPort")
public String getPort(){
return "当前访问的端口号:"+port;
}
}
发布三台tomcat服务器,占用的端口分别是8081、8082、8083
项目打包:clean--build--install
项目发布:Java -jar 8081.jar
负载均衡的策略
轮询策略
# 商品管理服务器 监听的是用户 manager.jt.com:80 映射的是url地址
server {
listen 80;
server_name manager.jt.com;
#进行反向代理
location / {
#映射的url请求网址.
#proxy_pass http://localhost:8091;
proxy_pass http://jtWindows;
}
}
#配置集群 1.默认方式 轮询策略
upstream jtWindows {
server localhost:8081;
server localhost:8082;
server localhost:8083;
}
nginx将用户的请求轮流发送到三台服务器,轮询;但是如果公司中有一台新服务器和一台旧服务器来同时作为后端服务器,那么此时采用轮询策略就不合适了,新服务器的承载能力要高一些,轮询显然不能满足要求
权重策略
#配置集群 1.默认方式 轮询策略 2.权重策略
upstream jtWindows {
server localhost:8081 weight=6;
server localhost:8082 weight=3;
server localhost:8083 weight=1;
}
性能越高的服务器,则承担的压力也就越高,但一个用户在购物车中加入了一些商品,退出界面,再次访问的时候,轮询策略和权重策略会将请求发往可能与原先服务器不同的服务器处理,这个时候,缓存的数据全部都找不到了,为了解决这种问题,提出了IPUSHCELUE
ipush策略:将用户与服务器之间进行绑定,以后该用户再进行访问时就用原来访问的服务器做处理,采用ipush算法
#配置集群 1.默认方式 轮询策略 2.权重策略 3.IPhash策略
upstream jtWindows {
ip_hash;
server localhost:8081 weight=6;
server localhost:8082 weight=3;
server localhost:8083 weight=1;
}
弊端:用户与服务器绑定,当服务器宕机时可能影响用户的使用
由于访问是通过计算的结果,可能会导致严重的负载不均衡的现象
nginx高级属性
#配置集群 1.默认方式 轮询策略 2.权重策略 3.IPhash策略
upstream jtWindows {
#ip_hash; server localhost:8081 weight=6;
server localhost:8081 down;
server localhost:8082 down;
server localhost:8083 backup;//备用机
}
down属性:利用down属性来标识故障机,则nginx反向代理服务器暂时不会访问该服务器
备用机策略:正常情况下一般的服务器部署时需要准备几台服务器做备用,正常情况下该服务器不会参与工作,只有当主机忙或宕机的时候,该服务器才会工作
Nginx高可用配置
当服务器宕机的时候,可以通过配置超时时间和最大访问失败次数,来实现服务器的自动切换,无需人为干预
如果nginx访问某台服务器时,如果该服务器访问失败,失败的次数达到最大失败次数时.在60秒之内,nginx不会再次访问故障机.直到下一个周期
#配置集群 1.默认方式 轮询策略 2.权重策略 3.IPhash策略
upstream jtWindows {
#ip_hash; server localhost:8081 weight=6;
server localhost:8081 max_fails=1 fail_timeout=60s;
server localhost:8082 max_fails=1 fail_timeout=60s;
server localhost:8083 max_fails=1 fail_timeout=60s;
}
2、虚拟机
1.1 修改虚拟机网络空间地址
将net网络配置修改为192.168.126.0(在VMware Workstation Pro)中修改(net模式)
设置DHCP的租用时间,起始ip和结束ip
在windows中校验nat8的ip地址(在windows中 利用cmd命令 ipconfig 检查net8IP地址 是否为192.168.126.1 即可)
ipconfig
如果Linux系统开机之后输入ip addr,不能展现正常的ip地址,则重启网卡来实现ip的获取
systemctl stop NetworkManager
service network restart
1.2 远程连接工具的安装和使用
session
SSH
设置远程host
新建用户
通过用户来登录服务器
1.3 JDK的配置
定位工作目录:Linux的安装目录在/usr/local/src
cd /usr/local/src/
将JDK压缩文件传入该目录中
解压JDK
tar -xvf jdk-8u51-linux-x64.tar.gz
修改JDK的名称
mv jdk-8u51-linux-x64.tar.gz jdk1.8
修改环境变量配置文件
vim /etc/profile
配置JDK
# 设定JDK环境
export JAVA_HOME=/usr/local/src/jdk1.8
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib
重启环境变量
1.4 mariadb的安装
安装命令:yum install mariadb-server输入命令之后会直接去网上下载mariadb数据库
数据库的常规命令
启动数据库:systemctl start mariadb
重启数据库:systemctl restart mariadb
关闭数据库:systemctl stop mariadb
初始化数据库配置:刚开始没有设定用户名和密码,所以需要设定
命令:mysql_secure_installation第一次使用直接回车,然后一路yes,设定密码之后登陆mysql -uroot -proot,查看数据库中的表等信息
修改数据库权限
//查看
select host ,user from user where user=‘root’;
//设定哪些ip地址可以访问数据库%代表统配
update user set host='%' where host="localhost";
select host,user from user where user='root';
//刷新数据库权限
flush privileges;
操作结束后用exit或ctrl+c退出
1.5 Linux防火墙命令
防火墙是防火墙的全局变量,如果操作了全局的变量开关,则影响的是下一次的防火墙操作
永久关闭防火墙systemctl disable firewalld.service
永久开启防火墙systemctl enable firewall.service
现在关闭现有的防火墙systemctl stop firewalld.service
现在打开现有的防火墙systemctl start firewalld.service
检查防火墙的状态firewall-cmd --state
firewall-cmd --zone=public --add-port=3306/tcp --permanent
命令含义:
–zone #作用域
–add-port=80/tcp #添加端口,格式为:端口/通讯协议
–permanent #永久生效,没有此参数重启后失效
- 检查数据库连接是否正常
可视化界面来链接部署在某台主机上的数据库
![image](/img/bVbOJdb)
### 1.6 导入京淘数据库