架构:
两台服务器,两个实体IP,一个虚拟IP。
如下图所示,服务器正常运行时,KEEPALIVED主保证的Nginx的HA,Nginx的主负责两台的Tomcat服务器负载均衡,Redis的主负责Tomcat1和2的会话共享,MySql主主同步保证了数据的安全及稳定性。
当主节点的一个或者多个服务无法正常运行,甚至节点宕机时,备节点能立即接续主节点来执行业务从而实现业务的不中断或短暂中断。
优势:适合硬件有限的小规模集群,且能保证服务器的稳定,高可用运行可持续发展来看,集群规模可升级-麻雀虽小五脏俱全。
劣势:对业务的处理能力有限,毕竟服务器仅两台。
一,环境:
Centos:7.4
Java:jdk1.8.0_192
Tomcat:apache-tomcat-9.0.13
Nginx:nginx-1.15.8
Keepalived :Keepalivedv1.3.5
Redis:redis-5.0.3
Mysql:mysql-5.7.25 编译安装
Cmak:cmake-3.13.4
Boost:boost_1_59_0
1,需要Jar:
commons-pool2-2.4.2.jar
jedis-2.9.0.jar
tomcat-redis-session-manager.jar
2,依赖环境:
yum -y install gcc pcre-devel zlib-devel openssl-devel make gcc gcc-c++ ncurses-devel bison openssl-devel
3,服务器配置:
节点名称 | IP | 端口开放 | VIP |
---|---|---|---|
Master | 10.200.36.166 | 80,1777,6000,3306 | 10.200.36.168 |
Backup | 10.200.36.167 | 80,1777,6000,3306 | 10.200.36.168 |
二,部署前准备:
1,上传数据包(双节点都需要实施)
下载所需的包,网址:https://download.youkuaiyun.com/download/clownwl/11006534
因为优快云上传大小限制,只能上传200M文件所以上个链接缺少了JDK,JDK:https://download.youkuaiyun.com/download/clownwl/11006810 也可去官网下载。
下载好以后,通过winSCP、Xftp等工具将包上传到/opt/soft目录下(opt /soft)
并赋予该目录下所有文件/文件夹可执行权限(chmod -R 755 *)
2,测试环境,先关闭防火墙和SELinux
关闭SELinux
#setenforce 0
#sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/g’ /etc/selinux/config --CentOS7.4默认用的是firewalld防火墙
#systemctl stop firewalld.service --关闭firewalld
3,配置163yum源或者阿里yum源(双节点都需要安装)
去http://mirrors.163.com/.help/CentOS7-Base-163.repo 下载centos7的yum源。
备份原有yum源:
#mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
更新生成新的缓存:
#yum clean all
#yum makecache
提前安装依赖包:
#yum -y install gcc pcre-devel zlib-devel openssl-devel make gcc gcc-c++ ncurses-devel bison openssl-devel
三,安装JDK(双节点都需要安装)
在安装JDK前,最好检测下是否安装了openjdk,若有,最好卸载。(rpm -qa | grep jdk)
1,安装JDK:
#cd /opt/soft
#tar -zxvf jdk-8u192-linux-x64.tar.gz -C /opt/
#vim /etc/profile.d/jdk.sh
输入以下内容:
export JAVA_HOME=/opt/jdk1.8.0_192
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
检测:
#java -version
java version "1.8.0_192"
Java(TM) SE Runtime Environment (build 1.8.0_192-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.192-b12, mixed mode)
返回值若如上所示,说明安装成功
四,安装Nginx(双节点都需要安装)
1,安装nginx
#cd /opt/soft
#tar -xvf nginx-1.15.8.tar.gz
#cd nginx-1.15.8
#./configure
#make
#make install
#cd /usr/local/nginx/sbin
#./nginx -t 检查nginx是否安装成功 若出现以下内容则表示安装成功
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
2,配置nginx以实现负载均衡分发
#cd /usr/local/nginx/conf
#mv nginx.conf nginx.conf.bak --备份配置文件
#vim nginx.conf
主从节点配置文件一样:
user root;
worker_processes 2;
error_log /usr/local/nginx/logs/error.log info;
#指定pid存放文件
pid logs/nginx.pid;
events
{
use epoll; #epoll是多路复用IO(I/OMultiplexing)中的一种方式,但是仅用于linux2.6以上>内核,可以大大提高nginx的性能
worker_connections 1024; #单个后台worker process进程的最大并发链接数
}
http
{
upstream tomcat_pool
{
#server tomcat地址:端口号 weight表示权值,权值越大,被分配的几率越大;
server 10.200.36.166:8080 weight=4 max_fails=2 fail_timeout=30s;
server 10.200.36.167:8080 weight=4 max_fails=2 fail_timeout=30s;
}
server {
listen 80;
#charset utf-8
server_name 10.200.36.168;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://tomcat_pool;
client_max_body_size 1000m;
proxy_cookie_path /scientific /;
proxy_set_header Cookie $http_cookie;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
}
五,安装keepalived(双节点都需要安装)
1,安装Keepalived(两种安装方式)
第一种(推荐):
#yum -y install keepalived
第二种:
#cd /opt/soft
#tar -zxvf keepalived-1.3.5.tar.gz
#cd keepalived-1.3.5
#./configure
#make
#make install
2,Keepalived主从节点配置
声明:以下两个配置文件中interface ens192这个参数,不同的节点用到的网络接口名会不同,具体请使用ifconfig查看当前IP对应的接口名。
#cd /etc/keepalived/
#vim /keepalived.conf
主节点配置文件:
! Configuration File for keepalived
global_defs {
notification_email {
xxx@xxx.cn
}
notification_email_from xxx@xxx.cn
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_nginx {
#该脚本检测ngnix的运行状态,并在nginx进程不存在时尝
#试重新启动ngnix,如果启动失败则停止keepalived,准备让其它机器接管。
script "/opt/ha/check_nginx.sh"
#每1s检测一次
interval 1
# 检测失败(脚本返回非0则优先级2)
weight 2
}
vrrp_script chk_tomcat {
#该脚本检测ngnix的运行状态,并在nginx进程不存在时尝
#试重新启动ngnix,如果启动失败则停止keepalived,准备让其它机器接管。
script "/opt/ha/check_tomcat.sh"
#每1s检测一次
interval 1
# 检测失败(脚本返回非0则优先级2)
weight 2
}
#vrrp_script check_gateway {
# script "/opt/ha/check_gateway.sh"
# interval 5
# fall 4
# rise 4
# weight 3
#}
vrrp_instance VI_1 {
#指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器
state MASTER
# 指定HA监测的网络接口
interface ens192
# 虚拟路由标识,要求主从节点一致
virtual_router_id 55
# 优先级,在同一vrrp_instance下要求主节点的优先级高于从节点
priority 100
# 设定主从节点之间同步检查的时间间隔,单位是秒
advert_int 1
authentication {
# 设置验证类型,主要有PASS和AH两种
auth_type PASS
# 设置验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信
auth_pass 1111
}
virtual_ipaddress {
# 设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
10.200.36.168
}
track_script {
# 引用VRRP脚本,即在 vrrp_script 部分指定的名字。
# 定期运行它们来改变优先级,并最终引发主备切换。
chk_nginx
chk_tomcat
#chk_gateway
}
}
#virtual_server 10.200.36.168 3306 {
# delay_loop 6
# lb_algo wrr #lvs调度算法rr|wrr|lc|wlc|lblc|sh|dh
# lb_kind DR #负载均衡转发规则NAT|DR|RUN
# persistence_timeout 50
# protocol TCP
#
# real_server 10.200.36.