美文网首页分布式&高可用我爱编程c
keepalived+nginx+tomcat+redis实现负

keepalived+nginx+tomcat+redis实现负

作者: 三叉戟渔民 | 来源:发表于2018-05-21 19:02 被阅读122次
    注:以下内容均在虚拟机上完成,属测试环境。

    欢迎大家留言交流!

    架构:

    两台服务器,两个实体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

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

    相关文章

      网友评论

        本文标题:keepalived+nginx+tomcat+redis实现负

        本文链接:https://www.haomeiwen.com/subject/ijqfjftx.html