keepalived+nginx+tomcat+redis实现负载均衡和session共享

注:以下内容均在虚拟机上完成,属测试环境。

欢迎大家留言交流!

架构:

两台服务器,两个实体IP,一个虚拟IP。
如下图所示,服务器正常运行时,keepalived主保证Nginx的HA,Nginx主负责两台Tomcat服务器负载均衡,Redis主负责Tomcat1和2的Session共享。
当主节点的一个或者多个服务无法正常运行,甚至节点宕机时,备节点能立即接续主节点来执行业务。从而实现业务的不中断或短暂中断。
优势:适合硬件有限的小规模集群,且能保证服务器的稳定、高可用运行。可持续发展来看,集群规模可升级——麻雀虽小五脏俱全。
劣势:对业务的处理能力有限,毕竟服务器仅两台。

image.png

环境:
节点名 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

纯手动码字...谢谢浏览。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容