注:以下内容均在虚拟机上完成,属测试环境。
欢迎大家留言交流!
架构:
两台服务器,两个实体IP,一个虚拟IP。
如下图所示,服务器正常运行时,keepalived主保证Nginx的HA,Nginx主负责两台Tomcat服务器负载均衡,Redis主负责Tomcat1和2的Session共享。
当主节点的一个或者多个服务无法正常运行,甚至节点宕机时,备节点能立即接续主节点来执行业务。从而实现业务的不中断或短暂中断。
优势:适合硬件有限的小规模集群,且能保证服务器的稳定、高可用运行。可持续发展来看,集群规模可升级——麻雀虽小五脏俱全。
劣势:对业务的处理能力有限,毕竟服务器仅两台。
环境:
节点名 | IP | 配置 | 端口开放 | VIP |
---|---|---|---|---|
web1 | 172.16.69.120 | 6G内存、256Gb磁盘 | 8080、8888、11211 | 172.16.69.180 |
web2 | 172.16.69.121 | 6G内存、256Gb磁盘 | 8080、8888、11211 | 172.16.69.180 |
CentOS6.7 64位
JDK 1.7.0_80
Keepalived v1.2.13
Nginx 1.10.2
Tomcat 7.0.75
Redis 4.0.2
所需jar包:
commons-pool2-2.4.1.jar
jedis-2.6.2.jar
tomcat-redis-session-manager1.2.jar
集群:
一、安装前准备(双节点都需要实施)
1、下载所需的包,网址:链接:https://pan.baidu.com/s/1aMMQQx5Pjd7GfHx6Z6kfzA 密码:ys93
下载好以后,通过winSCP、Xftp等工具将包上传到/home/soft目录下(mkdir /home/soft)
并赋予该目录下所有文件/文件夹可执行权限(chmod -R 755 *)
2、测试环境,先关闭防火墙。
CentOS6.7默认用的是iptables防火墙
#service iptables stop --关闭iptables
#chkconfig iptables off --禁止iptables开机启动
二、配置本地yum源(双节点都需要安装)
1、先将ios文件上传到media目录下
2、挂载:
#mkidr /mnt/rom --创建挂载的目录
#mount -o loop -t iso9660 /media/CentOS-6.7-x86_64-bin-DVD1.iso /mnt/rom ——挂载
3、修改yum配置
#mkdir /home/yum.repos.d_bak --创建备份目录
#cd /etc/yum.repos.d
#mv * /home/yum.repos.d_bak --将配置文件移走,以作备份
#vi myself.repo --新建配置文件
[myself]
name=CentOS-6.7
baseurl=file:///mnt/rom --iso挂载目录
\gpgcheck=0 --不启用包检查
enabled=1 --启用这个仓库
gpgkey=file:///mnt/rom/RPM-GPG-KEY-CentOS-6
输入yum list若不报错即配置成功。
三、安装JDK(双节点都需要安装)
在安装JDK前,最好检测下是否安装了openjdk,若有,最好卸载。(rpm -qa | grep jdk)
1、安装JDK:
#cd /home/soft
#rpm -ivh jdk-7u80-linux-x64.rpm
2、检测:
#java -version
返回值若如下所示,说明安装成功
image.png
四、安装Nginx(双节点都需要安装)
1、安装依赖环境
#yum -y install gcc pcre-devel zlib-devel openssl-devel
2、安装nginx
#cd /home/soft
#tar -xvf nginx-1.10.2.tar.gz
#cd nginx-1.10.2
#./configure
#make
#make install
检查nginx是否安装成功
#cd /usr/local/nginx/sbin
#./nginx -t
若出现以下内容则表示安装成功
image.png
3、配置nginx以实现负载均衡分发
#cd /usr/local/nginx/conf
#mv nginx.conf nginx.conf.bak --备份配置文件
#vi nginx.conf
主从节点配置文件一样
#Nginx所用用户和组
user root;
#工作的子进程数量(通常等于CPU数量或者2倍于CPU)
worker_processes 2;
#错误日志存放路径
#error_log logs/error.log;
#error_log logs/error.log notice;
error_log logs/error.log info;
#指定pid存放文件
pid logs/nginx.pid;
events {
#使用网络IO模型Linux建议epoll,FreeBSD建议采用kqueue
use epoll;
#允许最大连接数,这个与Linux系统进程最大打开文件数限制有关
#可用 ulimit -n 1024进行设置
worker_connections 1024;
}
http {
# 主模块指令,默认采用此即可
include mime.types;
default_type application/octet-stream;
#定义日志格式
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
#'$status $body_bytes_sent "$http_referer" '
#'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log;
client_header_timeout 3m;
client_body_timeout 3m;
send_timeout 3m;
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
#keepalive_timeout 0;
#keepalive_timeout 65;
# 负载均衡器配置,名称为172.16.69.180
# 这个名称和后面对应即可
upstream 172.16.69.180{
# 这里我部署了两台tocmat
# weight均为5,表示两台tomcat负载平均分配
server 172.16.69.120:8080 weight=5;
server 172.16.69.121:8080 weight=5;
}
server {
#nginx服务端口设置为8888
listen 8888;
# 对应上面upstream的名称
server_name 172.16.69.180;
#charset koi8-r;
#access_log logs/host.access.log main;
# 动态资源处理
location / {
proxy_set_header Host $host:8888;
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
proxy_pass http://172.16.69.180;
}
# 静态资源处理
location ~ .*\.(js|css|ico|gif|jpg|jpeg|png|bmp|swf)$ {
root /usr/local/source/;
}
}
}
五、安装keepalived(双节点都需要安装)
1、安装Keepalived(两种安装方式)
第一种(推荐):
#yum -y install keepalived
第二种:
#cd /home/soft
#tar -xvf keepalived-1.2.13.tar.gz
#cd keepalived-1.2.13
#./configure
#make
#make install
2、Keepalived主从节点配置
声明:以下两个配置文件中我标记了interface eth1这个参数,不同的节点用到的网络接口名会不同,具体请使用ifconfig查看当前IP对应的接口名。
主节点配置文件:
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_nginx {
#该脚本检测ngnix的运行状态,并在nginx进程不存在时尝
#试重新启动ngnix,如果启动失败则停止keepalived,准备让其它机器接管。
script "/home/ha/shell/check_nginx.sh"
#每1s检测一次
interval 1
# 检测失败(脚本返回非0则优先级2)
weight 2
}
vrrp_instance VI_1 {
#指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器
state MASTER
# 指定HA监测的网络接口
interface eth1
# 虚拟路由标识,要求主从节点一致
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地址,每行一个
172.16.69.180
}
track_script {
# 引用VRRP脚本,即在 vrrp_script 部分指定的名字。
#定期运行它们来改变优先级,并最终引发主备切换。
chk_nginx
}
}
备节点配置文件:
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_nginx {
#该脚本检测ngnix的运行状态,并在nginx进程不存在时尝
#试重新启动ngnix,如果启动失败则停止keepalived,准备让其它机器接管。
script "/home/ha/shell/check_nginx.sh"
#每1s检测一次
interval 1
# 检测失败(脚本返回非0则优先级2)
weight 2
}
vrrp_instance VI_1 {
#指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器
state BACKUP
# 指定HA监测的网络接口
interface eth1
# 虚拟路由标识,要求主从节点一致
virtual_router_id 55
# 优先级,在同一vrrp_instance下要求主节点的优先级高于从节点
priority 50
# 设定主从节点之间同步检查的时间间隔,单位是秒
advert_int 1
authentication {
# 设置验证类型,主要有PASS和AH两种
auth_type PASS
# 设置验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信
auth_pass 1111
}
virtual_ipaddress {
# 设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
172.16.69.180
}
track_script {
# 引用VRRP脚本,即在 vrrp_script 部分指定的名字。
#定期运行它们来改变优先级,并最终引发主备切换。
chk_nginx
}
}
3、创建检测脚本(双节点都需要创建,可使用scp传输)
#mkdir -p /home/ha/shell
#touch /home/ha/shell/check_nginx.sh
#
#vi /home/ha/shell/check_nginx.sh
---------------------------------------------------------------------------
#!/bin/sh
echo "1" >> /var/tmp/keepalived.log
Count1=`netstat -antp |grep -v grep |grep nginx |wc -l`
if [ $Count1 -eq 0 ]; then
#/usr/local/nginx/sbin/nginx
#sleep 2
echo "2" >> /var/tmp/keepalived.log
Count2=`netstat -antp |grep -v grep |grep nginx |wc -l`
if [ $Count2 -eq 0 ]; then
echo "nginx pid not found" >> /etc/keepalived/keepalived.log
killall keepalived
else
echo "jinbulai" >> /var/tmp/keepalived.log
exit 0
fi
else
echo "4" >> /var/tmp/keepalived.log
exit 0
fi
赋予脚本可执行权限:
#chmod 755 /usr/sbin/check_nginx.sh
六、部署Tomcat(双节点都需要操作)
1、创建用户tomcat
#useradd -d /home/tomcat -m tomcat
#passwd tomcat
根据提示设置tomcat用户密码即可,我这里设置成tomcat@123
2、部署Tomcat
#tar -xvf apache-tomcat-7.0.75.tar.gz -C /home/tomcat --将soft下的tomcat解压到tomcat用户目录下
#cd /home/tomcat
#chmod -R 755 * --赋予tomcat用户目录下文件/文件夹可执行权限
#chown -R tomcat:tomcat * --将tomcat用户目录下文件/文件夹的用户和组改为tomcat
3、修改tomcat的内存分配
#cd /home/tomcat/apache-tomcat-7.0.75/bin
#vi .catalina.sh --添加以下内容
JAVA_OPTS="-Xms2048m -Xmx4096m -XX:PermSize=1024m -XX:MaxNewSize= 2048m -XX:MaxPermSize=2048m"
4、修改tomcat的配置信息
#cd /home/tomcat/apache-tomcat-7.0.75/conf
#vi server.xml
添加jvmRoute信息,且主从节点不一致(例:主——tomcat1、从——tomcat2)
image.png
5、添加测试文件(双节点添加)
#cd /home/tomcat/apache-tomcat-7.0.75/webapps/
#mkdir test
#vi index.jsp
主机如下配置,从机需要将This is Tomcat Server 1改成This is Tomcat Server 2
--------------------------------------------------------------------------
<%--
Created by IntelliJ IDEA.
User: ccdk
Date: 2018/4/27
Time: 下午7:01
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>测试页面</title>
</head>
<body>
SessionID:<%=session.getId()%> <BR>
SessionIP:<%=request.getServerName()%> <BR>
SessionPort:<%=request.getServerPort()%>
<%out.println("This is Tomcat Server 1");%>
</body>
</html>
添加完以后要修改文件所属用户、组
七、安装Redis(双节点都需要安装配置)
1、安装Redis
#tar -xvf redis-4.0.2.tar.gz
#cd redis-4.0.2
#make PREFIX=/usr/local/redis install
#cp /home/soft/redis-4.0.2/redis.conf /usr/local/redis/ --将配置文件拷贝到/usr/local/redis目录下,方便启动
2、配置redis
#cd /usr/local/redis/
#vi redis.conf
主节点配置:
--------------------------------------------------------------------------
# bind 127.0.0.0 --把监听本地注释掉
port 6000 #设定监听端口
protected-mode no
pidfile "/var/run/redis_6000.pid"
从节点配置:
--------------------------------------------------------------------------
# bind 127.0.0.0
port 6000
protected-mode no
pidfile "/var/run/redis_6000.pid"
slaveof 172.16.69.120 6000
3、配置Tomcat连接Redis
这里需要先将jar包传到/home/tomcat/apache-tomcat-7.0.75/lib/
commons-pool2-2.4.1.jar
jedis-2.6.2.jar
tomcat-redis-session-manager1.2.jar
接下来修改context.xml(主备机一样):
#vi /home/tomcat/apache-tomcat-7.0.75/conf/context.xml
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve"/>
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="172.16.69.120"
port="6000"
maxInactiveInterval="180"/>
4、启动Redis,检测是否正常
#cd /usr/local/redis
#./bin/redis-server ./redis.conf & --启动
主机启动成功示例:
image.png
从机启动成功示例:
image.png
5、配置Sentinel
#cd /usr/local/redis/
#vi sentinel.conf
主从节点一致:
--------------------------------------------------------------------------
#守护进程
daemonize yes
protected-mode no
#端口
port 23456
#运行日志
logfile "/usr/local/redis/redis/sentinel.log"
pidfile "/var/run/sentinel.pid"
#配置监控主服务器,mymaster:定义主服务器名,172.16.69.120:主服务ip 6000:主服务端口 2:设置当有1个sentinel判断master故障后才真正认为master无法继续提供服务,即开始容灾措施
sentinel monitor mymaster 172.16.69.120 6000 1
#指定sentinel认定一个服务器断线的毫秒数,即一个sentinel认定服务SDOWN,在这个配置时间内需要获得指定个数的Sentinel判定ODWON,才开始failover
sentinel down-after-milliseconds mymaster 2000
#从节点数量为几后面就写几,我这里只有一个从节点,所以写1
sentinel parallel-syncs mymaster 1
6、启动Sentinel
#cd /usr/local/redis
#./bin/redis-sentinel ./sentinel.conf & --启动
7、检验
#./bin/redis-cli -h 172.16.69.120 -p 6000 # -h:ip地址,-p:访问端口
主节点:
image.png从节点:
image.png
sentinel使用./bin/redis-cli -h 172.16.69.120 -p 23456访问
八、基础指令
1、启动顺序
Nginx -> Tomcat -> Keepalived -> Redis
2、指令
#cd /usr/local/nginx/sbin
#./nginx --启动nginx
#./nginx -s stop --关闭nginx
#./nginx -s reload --重启nginx
#su tomcat --切换成tomcat用户
#cd /home/tomcat/apache-tomcat-7.0.75/bin
#./startup.sh --启动tomcat
#./shutdown.sh --关闭tomcat
#service keepalived start --启动keepalived
#service keepalived stop --关闭keepalived
#service keepalived restart --重启keepalived
#cd /usr/local/redis
#./bin/redis-server ./redis.conf & --启动redis
#./bin/redis-cli -p 6000 shutdown --关闭redis
#./bin/redis-sentinel ./sentinel.conf & --启动sentinel
#./bin/redis-cli -p 23456 shutdown --关闭sentinel
注:redis有两种启动方式。
前台启动:./bin/redis-server ./redis.conf
后台启动:./bin/redis-server ./redis.conf &
还有种后台启动的方式是改redis.conf配置文件,将daemonize改为yes,这样直接使用./bin/redis-server ./redis.conf也是后台启动。
九、结果检测
当所有服务都启动好以后,进行负载均衡和session共享的检测
若出现如下效果,说明已经实现了负载均衡和session共享。
2018-05-21 at 下午7.59.gif
纯手动码字...谢谢浏览。
网友评论