高可用方案其实很多,而且有很多本钱是非常低和简单的。比如你如果有1个网站,高可用最简单的就是nds+nginx+两台机器。
我们由因而客户的1个项目,dns申请是非常麻烦的,所以才斟酌用keepalived+nginx做高可用方案。
从网上整理了HA经常使用组合。
heartbeat v2+crm
heartbeat v3+pacemaker
corosync+pacemaker
cman + rgmanager
keepalived+lvs。
这里我们没有用lvs,而是直接用了nginx,感觉就两台机器,所以也没有必要弄的太复杂。而且也能满足要求。
安装前的计划,这个我认为还是比较重要的,我们就是之前没有好好计划,现在感觉比较乱,而且客户升级也很麻烦。1堆的流程。
我们系统是java开发的,所以用了tomcat进行后台的解析。
首先是目录计划,比如tomcat放在甚么地方,静态文件放在甚么地方。1般来讲有nginx后静态文件由nginx去解析,可以分担tomcat的很多压力。
nginx安装前准备,由于nginx安装还是比较简单的,但是有个问题就是nginx有很多插件,这些插件是不是需要安装需要研究1下。由于nginx对回话处理不是太好,所以我们这边需要添加1个会话保持的插件,其他插件建议不要安装太多,毕竟稳定和效力是第1的,非官方的插件就怕有问题,到时候找都不好找。
依赖yum -y install gcc pcre-devel kernel-devel
yum install openssl-* -y 剩下的就看提示,没有就安装1下。
下面就是安装:
tar -zxvf nginx⑴.7.9.tar.gz
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module --add-module=../nginx-stick
make
make install
这里里面用了1个stick回话保持的插件,下载地址为,这个有时候不太好找,基本上都是google服务器上的,没有办法下载。
https://github.com/ezbake/nginx-sticky-module
安装keepalived:
tar -zxvf keepalived⑴.1.20.tar.gz
ln -s /usr/src/kernels/2.6.9⑺8.EL-i686/usr/src//linux
./configure make make install
cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
mkdir /etc/keepalived
cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/sbin/keepalived /usr/sbin/
设置为服务,开机启动
vi /etc/rc.local
/etc/init.d/keepalived start
两个软件启动和停止。
service keepalived start/stop
./nginx -s stop
./nginx -c /usr/local/nginx/conf/nginx.conf
keepalived配置:
global_defs {
router_id LVS_DEVEL //负载均衡器标识,同1网段内,可以相同
}
vrrp_instance VI_1 { //定义vrrp实例
state MASTER //主LVS是MASTER,从的BACKUP
interface eth0 //LVS监控的网络接口
virtual_router_id 51 //同1实例下virtual_router_id必须相同
priority 100 //定义优先级,数字越大,优先级越高
advert_int 5 //MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
authentication { //验证类型和密码
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { //虚拟IP
192.168.1.8
}
}
我认为其他的东西主要和负载均衡lvs相干,由于nginx已代替了lvs的作用所以都去掉了。
nginx主要配置以下:
#user nobody;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format secisland '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
sendfile on;
keepalive_timeout 65;
gzip on;
gzip_min_length 1000;
gzip_types text/plain text/css application/x-javascript;
upstream tomcat{
sticky;
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
server {
listen 80;
server_name localhost;
access_log logs/secisland.log secisland;
location /nginx_status {
stub_status on;
access_log off;
}
location ~ .(htm|html|gif|jpg|jpeg|png|ico|rar|css|js|zip|txt|flv|swf|doc|ppt|xls|pdf)$ {
root /opt/tomcat1/webapps/ROOT;
access_log off;
expires 24h;
}
location / {
proxy_pass http://tomcat;
#root /root/html;
index index.html index.htm index.jsp;
}
基本上就完成了keepalived+nginx+tomcat的负载配置,在第1台机器可以配置ngix到第2台tomcat的转发,这个就利用nginx的能力进行了负载均衡的处理,当第1台机器挂了keepalived会把动态ip切换到第2台机器上,实现了双机高可用。
这里有个问题就是当nginx挂了的时候,keepalived其实不知道服务不可用,所以还回继续提供服务,但这个时候已不起作用了。
所以需要添加1个守护进程,当nginx挂的时候把keepalived也观杀掉,当进程启动的时候也启动keepalived。
可以在crontab里面设置30秒检测1次,也就是当nginx挂的时候最长时间会延迟310秒切换。
*:30 * * * * /opt/nginx_pid.sh
#!/bin/bash
# varsion 1.0
A=`ps -C nginx --no-header |wc -l`
B=`ps -C keepalived --no-header |wc -l`
if [ $A -eq 0 ];then
# /usr/local/nginx/sbin/nginx
sleep 1
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
elif [ $B -eq 0 ];then
/etc/rc.d/init.d/keepalived start
fi
最后别忘了脚本要加上可履行的权限,不然不会履行。