您的位置:首页 > 运维架构 > Docker

Docker实现keepalived+tomcat+redis+other的高可用(一)

2020-01-13 16:13 183 查看

Linux系统的keepalived+tomcat+redis+other的高可用实现

  • 二、使用keepalived + Tomcat测试keepalived是否正常运行
  • 三、使用docker安装redis镜像
  • 四、配置redis的主从同步(主从复制)
  • 五、配置整体:keepalived + redis + tomcat
  • 其他
  • keepalived介绍

    keepalived是什么?
    keepalived主要通过VRRP协议实现高可用,VRRP出现的目的就是为了解决静态路由的单点故障问题的,它能保证当个别节点宕机时,整个网络可以不间断地运行。通俗点说,就是主服务器宕机了,可以瞬间(>=1s)切换到备用服务器上。
    keepalived官网
    keepalived原理及配置描述

    思路流程

    首先我们先理清使用keepalived实现tomcat+redis高可用的流程:
    第一步:配置keepalived
    第二步:配置tomcat并测试keepalived是否可正常切换
    第三步:配置redis实现切换
    第四步:实现redis的主从复制
    第五步:实现整体的配置

    一、配置keepalived

    linux系统:CentOS 7系统,两个(一台主机,一台备用机)

    1.主机和备机都安装keepalived

    yum install keepalived

    2.修改keepalived.conf配置文件

    安装好以后,keepalived默认配置文件就在/etc/keepalived路径下:

    vrrp_instance VI_1 {         ## vrrp实例部分定义
    state MASTER             ##指定 keepalived 的角色,必须大写 可选值:MASTER|BACKUP
    interface eth0           ##网卡设置
    virtual_router_id 51     ##虚拟路由标识,同一个vrrp 实例使用唯一的标识
    advert_int 1             ##设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒
    authentication {         ##设置验证类型和密码,两个节点必须一致
    auth_type PASS
    auth_pass 123456
    }
    virtual_ipaddress {
    192.168.50.222/24    ##keepalived的虚拟ip,可以设置多个,每行一个
    }
    priority 100             ##主服务100 备服务90只要小于100就可以
    }

    注意: 主机和备机的配置文件只有priority属性不一样,主为100,备为90。
    这里有个坑:配置文件的文本格式尤其重要,特别是代码块的名字和大括号之间必须有个空格,不然会识别不到该代码块:

    vrrp_instance VI_1这里必须有个空格{
    }
    vrrp_instance VI_1空格{
    }
    vrrp_instance VI_1 {
    }

    这里列举几个配置文件中值得注意的几个属性:

    virtual_router_id 51     ##如果一个配置文件要写多个VRRP实例,那么每个实例一个id
    192.168.50.222/24        ##keepalived的虚拟ip/端口,运行keepalived时就使用该虚拟ip
    priority 100             ##主服务100,备服务90,主机 - weight权重 < 备机

    3.将keepalived加入到开机自启动

    主机和备机分别顺序执行下面两条命令,将keepalived都加入到开机自启:
    keeplived开启服务:

    service keepalived start

    keepalived开机自启

    chkconfig keepalived on

    4.主机和备机安装nmap软件

    nmap是Linux下的网络扫描和嗅探工具包,这里主要用它扫描端口是否存在。

    yum install nmap

    5.设置脚本检测

    进入/etc/keepalived文件夹下配置check_port.sh脚本,如果没有该文件,自己创建一个,脚本内容为:

    #!/bin/bash
    count=`nmap 127.0.0.1|grep 8080/tcp|wc -l`if [ $count != 0 ]then
    exit 0
    else
    exit 1
    fi

    这里解释一下这段脚本的意思:

    count=`nmap 127.0.0.1|grep 8080/tcp|wc -l`

    这行代码指的是:使用nmap命令,如果8080端口存在,返回1,不存在,返回0.
    更深入的讲,是因为8080是常用端口,可使用

    nmap 127.0.0.1
    命令查看端口号开启还是关闭,使用grep筛选 8080/tcp端口,如果开启为1,如果关闭为0.

    if [ $count != 0 ]

    如果count!=0,那么,该端口是开启的,返回0,如果count==0,该端口是不开启的,返回1.
    这里也有个坑 :要打开脚本文件的所有权限,可以使用

    ls -l
    命令查看权限。使用
    chmod 777 文件名
    修改文件权限。

    主机备机该脚本一致,然后在keepalived.conf中引入该脚本:

    vrrp_script chk_http_port {
    script "/etc/keepalived/check_port.sh" ##脚本地址
    interval 1  ##运行脚本的间隔,1s
    weight -20  ##权重,减的就是priority的优先级属性
    }

    所以,完整的keepalived.conf文件为:

    vrrp_script chk_http_port {
    script "/etc/keepalived/check_port.sh"
    interval 1
    weight -20
    }
    vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    advert_int 1
    authentication {
    auth_type PASS
    auth_pass 123456
    }
    virtual_ipaddress {
    192.168.50.222/24
    }
    track_script {
    chk_http_port
    }
    priority 100  ##主服务100 备服务90
    }

    同样,主机和备机的区别仍然是priority属性。此时,keepalived就配置好了。
    先开启主机的keepalived,再开启备机的keepalived:

    service keepalived start/restart/stop  [开启/重启/关闭]

    虽然此时keepalived配置好了,但我们怎么知道我们配的没有差错呢?
    那就是使用tomcat+keepalived测试。

    二、使用keepalived + Tomcat测试keepalived是否正常运行

    1.主机备机都安装jdk,tomcat

    linux安装jdk

    yum install tomcat

    tomcat默认安装路径为/usr/share/tomcat

    2.部署web项目

    准备两份java web项目,打成war包,放在tomcat的webapps文件夹下

    注意,这两份java web的测试项目,建议只写一个简单的index.jsp即可,除了该jsp页面内容有区别,其他必须一致,尤其是访问路径必须一致。

    3.启动tomcat

    service tomcat start

    war包将自动解压
    .

    ctrl + c
    可关闭正在运行的服务

    4.使用浏览器访问该地址

    linux的ip:8080/项目名/index.jsp

    此时,tomcat就部署好了。

    5.keepalived + tomcat测试

    主备机分别启动keepalived和tomcat,为避免不必要的麻烦,建议使用restart启动,因为有时keepalived就是开着的,使用start可能不会造成重启。
    同时为了不必要的麻烦,启动顺序为:

    1. 主机keepalived
    2. 备机keepalived
    3. 主机服务
    4. 备机服务
    service keepalived restart
    service tomcat restart

    使用浏览器访问keepalived的虚拟ip地址:

    keepalived虚拟ip:8080/项目名/地址

    正常情况下就会显示主机中项目的页面,然后将主机的tomcat关闭,刷新页面,就会显示备机中项目的页面。然后重启主机的tomcat,刷新页面,就会显示主机的项目页面。
    至此,keepalived正常部署。

    三、使用docker安装redis镜像

    docker、docker-compose介绍和常用命令

    1.安装docker

    yum install docker

    2.使用镜像安装redis:

    docker run -p 6379:6379 hub.c.163.com/library/redis

    这里需要把容器中的端口通过

    -p 6379:6379
    映射出来,否则nmap不会检索到该端口号。这是因为nmap不能检索到容器中的端口号,只能检索到容器外的。

    3.查看正在运行的容器,查看是否有redis:

    docker ps

    4.其他docker常用命令

    查看所有容器及其id

    docker ps -a

    删除容器

    docker rm 容器id

    启动/重启/停止容器

    docker start/restart/stop 容器id

    5.修改keepalived.conf的check_port.sh脚本文件

    #!/bin/bash
    count=`nmap -p 6379 127.0.0.1|grep open|wc -l`if [ $count != 0 ]then
    exit 0
    else
    exit 1
    fi
    

    发现,其实改掉的也就是

    count=`nmap -p 6379 127.0.0.1|grep open|wc -l`

    这一行代码而已。
    这是因为6379不是常用端口,需要使用-p命令强制查找,然后筛选的指令变为open。

    6.下载redis数据库的可视化界面treesoft

    6.1下载treesoft: treesoft下载地址
    6.2 解压缩后访问bin目录下的startup.bat文件:

    6.3 浏览器访问http://127.0.0.1:8086/treenms该地址,
    输入用户:admin,密码:treesoft

    7.连接redis

    点击右上角数据库配置,连接linux上的redis数据库【需要主从,以及keepalived的虚拟ip连接的总共三个数据库(本质还是两个)】


    不需要填写密码:

    8.在主从redis中分别存入不同的数据

    9.测试

    分别开启主从keepalived,使用docker分别启动主从redis容器,

    docker restart 容器id

    容器id是固定的,可以使用docker ps -a查找

    10.测试结果

    正常时keepalived显示主redis的数据,把主redis关闭,keepalived显示从redis的数据,重启主redis,keepalived又会显示主redis的数据。

    四、配置redis的主从同步(主从复制)

    1.习惯性的在/data文件夹下创建redis文件夹,创建redis.conf文件。
    2.在主的redis.conf中写

    appendonly yes
    开启数据持久化。
    3.在从的redis.conf中写
    slaveof 主redis的ip 主redis的端口
    配置主从复制。
    例如:
    slaveof 192.168.50.34 6379

    4.使用以下命令运行镜像,创建容器

    docker run -d -p 6379:6379 -v /data/redis:/data hub.c.163.com/library/redis redis-server /data/redis.conf

    详解:
    -d 后台启动,即没有多余的日志
    -p 6379:6379 挂载端口 本地端口:容器端口
    -v /data/redis:/data 挂载配置文件夹 本地文件夹:容器文件夹
    hub.c.163.com/library/redis 镜像地址
    redis-server /data/redis.conf 启动容器内部的配置文件
    5.至此,配置完毕,在主redis中写入数据,看从redis中是否同步。从redis为只读,不可写入数据。

    五、配置整体:keepalived + redis + tomcat

    1.主备机都在/etc/keepalived中写入脚本和配置文件:

    (1)check_tomcat_port.sh脚本
    #!/bin/bash
    count=`nmap 127.0.0.1|grep 8080/tcp|wc -l`if [ $count != 0 ]then
    exit 0
    else
    exit 1
    fi
    (2)check_redis_port.sh脚本
    #!/bin/bash
    count=`nmap -p 6379 127.0.0.1|grep open|wc -l`if [ $count != 0 ]then
    exit 0
    else
    exit 1
    fi
    
    (3)keepalived.conf配置文件
    vrrp_script chk_http1_port {
    script "/etc/keepalived/check_redis_port.sh"
    interval 1
    weight -20
    }
    vrrp_script chk_http2_port {
    script "/etc/keepalived/check_tomcat_port.sh"
    interval 1
    weight -20
    }
    vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51 ##vrrp_instance的唯一标识id,两个必须不一样
    advert_int 1
    authentication {   ##主备机一致
    auth_type PASS
    auth_pass 123456
    }
    virtual_ipaddress {
    192.168.50.222/24 ##虚拟ip
    }
    track_script {
    chk_http1_port  ##引用脚本
    }
    priority 100  ##主服务100 备服务90只要小于100就可以
    }
    vrrp_instance VI_2 {
    state MASTER
    interface eth0
    virtual_router_id 52
    advert_int 1
    authentication {
    auth_type PASS
    auth_pass 123456
    }
    virtual_ipaddress {
    192.168.50.223/24
    }
    track_script {
    chk_http2_port
    }
    priority 100  ##主服务100 备服务90只要小于100就可以
    }

    主备机依然只有priority属性不一致。
    测试:
    测试之前把备机的redis.conf文件中的salveof配置行用#注释掉,是为了去掉主从复制,更直观的看见主备机切换。
    分别启动keepalived,tomcat,redis,然后停止tomcat的主服务,浏览器页面切换至备用机页面,而redis数据库还是主机数据。重启tomcat主服务,停止redis主服务,会发现浏览器页面为主机页面,redis数据库为备机数据。
    正常情况

    正常情况 主机 备机
    keepalived 启动 启动
    tomcat 启动 启动
    redis 启动 启动

    停止主机tomcat

    异常1 主机 备机
    keepalived 启动 启动
    tomcat 关闭 启动
    redis 启动 启动

    那么redis依然显示主机,tomcat显示从机页面。
    停止主机redis

    异常2 主机 备机
    keepalived 启动 启动
    tomcat 启动 启动
    redis 关闭 启动

    结果是redis显示从机数据,tomcat显示主机页面。

    其他

    如果你严格按照这篇帖子所描述,最后却没有得到想要的结果。
    那么第一件事是去/etc/keepalived文件夹下,使用

    ls -l
    命令查看脚本文件的权限。如下图所示:

    -rw-表示管理员没有执行权限,只有读写权限。使用命令
    chmod 777 文件名
    可以更改该文件夹权限,更改为-rwx,既有读取,又有执行权限。
    第二件事,是查看你的keepalived.conf文件的格式是否正确,空格是都存在并正确。
    如果这两件事做完之后还是无法正常运行,那么去
    /var/log
    文件夹下去看
    messages
    文件。倒序查找keepalived,去查看keepalived的运行日志,来检测错误。

    • 点赞
    • 收藏
    • 分享
    • 文章举报
    昨夜冻成狗 发布了12 篇原创文章 · 获赞 10 · 访问量 1322 私信 关注
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: