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

2 篇文章 0 订阅
1 篇文章 0 订阅

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的运行日志,来检测错误。
在这里插入图片描述

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值