Keepalived介绍:
Keepalived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有heartbeat、corosync、pacemaker。但是它一般不会单独出现,而是与其它负载均衡技术(如lvs、haproxy、nginx)一起工作来达到集群的高可用。
准备工作:
1.环境两台CentOS7版本的系统
查看系统版本:
cat /etc/redhat-release,这种方法只适合Redhat系的Linux
2.安装docker和docker-compose
注意版本,我这个版本是可以的
centos7离线安装docker,docker-compose
3.服务ip
两台服务器ip为:
10.10.11.79,10.10.11.81
keepalived的虚拟ip为10.10.11.77,10.10.11.78
下面开始部署:
宿主机上建立文件目录:
目录结构:
- node_1
- docker-compose.yml
- Dockerfile
- keepalived.conf
- nginx.conf
- node_2 同上
分别用于部署在两台不同的服务器上
每一个节点都需要四个文件,下面详细配置一下四个文件。
1.nginx.conf
配置master nginx.conf:
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/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 /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
gzip on;
server
{
listen 80;
default_type text/plain;
# client_body_in_single_buffer on;
return 200 'im master.......\n';
}
}
从节点nginx.conf配置:
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/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 /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
gzip on;
server
{
listen 80;
default_type text/plain;
# client_body_in_single_buffer on;
return 200 'im slave.......\n';
}
}
如果已经up 起来的容器后续修改了nginx的conf文件,主从都要重新docker-compose up一下,不然会不生效。
2.Dockerfile
制作keepalived docker镜像,两个节点的配置文件内容相同。
这里需要注意一下:
如果keepalived.conf,你修改了,那么之前生成的镜像要删掉重新制作。
FROM osixia/keepalived
MAINTAINER nanlist
ADD ./keepalived.conf /container/service/keepalived/assets/keepalived.conf
3.docker-compose.yml
两个节点的配置文件内容相同。
这里有两个地方需要注意一下:
1.启动之前要查看一下nginx 的端口是否被占用了,两个节点要用相同的端口。
2.提前在宿主机上建立好挂载目录/etc/cluster/nginx.conf,并把步骤1的nginx.conf文件放进去。
version: '2'
services:
keepalived:
build: ./
depends_on:
- nginx
network_mode: "host"
cap_drop:
- NET_ADMIN
privileged: true
restart: on-failure:3
nginx:
image: nanlist/nginx1.23.1:v1.0
ports:
- "82:80"
volumes:
- "/etc/cluster/nginx.conf:/etc/nginx/nginx.conf"
restart: on-failure:3
4.keepalived.conf
默认使用双BACKUP,nopreempt非抢占模式,根据自己服务器的实际情况进行修改:
- interface # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
- auth_pass # 指定认证方式。PASS简单密码认证(推荐),AH:IPSEC认证(不推荐)
- unicast_peer # 另外一台的服务器ip
- virtual_ipaddress # 定义虚拟ip(VIP),可多设,每行一个
这个文件 两个节点的配置是不一样的,
node1:
global_defs {
}
vrrp_instance VI_1 {
state BACKUP
interface ens192 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
virtual_router_id 51 # 虚拟路由编号,主从要一至
priority 150 # 优先级,数值越大,获取处理请求的优先级越高 master要大于slave
nopreempt
authentication {
auth_type PASS # 指定认证方式。PASS简单密码认证(推荐),AH:IPSEC认证(不推荐)
auth_pass 1111 # 指定认证所使用的密码。最多8位
}
unicast_peer { # 另外一台的服务器ip,如果是多台就配多个ip
10.10.11.81
}
virtual_ipaddress { # 指定VIP地址
10.10.11.77
}
notify "/container/service/keepalived/assets/notify.sh"
}
vrrp_instance VI_2 {
state BACKUP
interface ens192 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
virtual_router_id 52 # 虚拟路由编号,主从要一至
priority 99 # 优先级,数值越大,获取处理请求的优先级越高 master要大于slave
nopreempt
authentication {
auth_type PASS # 指定认证方式。PASS简单密码认证(推荐),AH:IPSEC认证(不推荐)
auth_pass 1111 # 指定认证所使用的密码。最多8位
}
unicast_peer { # 另外一台的服务器ip,如果是多台就配多个ip
10.10.11.81
}
virtual_ipaddress { # 指定VIP地址
10.10.11.78
}
notify "/container/service/keepalived/assets/notify.sh"
}
node2:
global_defs {
}
vrrp_instance VI_1 {
state BACKUP
interface ens192 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
virtual_router_id 51 # 虚拟路由编号,主从要一至
priority 99 # 优先级,数值越大,获取处理请求的优先级越高 master要大于slave
nopreempt
authentication {
auth_type PASS # 指定认证方式。PASS简单密码认证(推荐),AH:IPSEC认证(不推荐)
auth_pass 1111 # 指定认证所使用的密码。最多8位
}
unicast_peer { # 另外一台的服务器ip,如果是多台就配多个ip
10.10.11.79
}
virtual_ipaddress { # 指定VIP地址
10.10.11.77
}
notify "/container/service/keepalived/assets/notify.sh"
}
vrrp_instance VI_2 {
state BACKUP
interface ens192 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
virtual_router_id 52 # 虚拟路由编号,主从要一至
priority 150 # 优先级,数值越大,获取处理请求的优先级越高 master要大于slave
nopreempt
authentication {
auth_type PASS # 指定认证方式。PASS简单密码认证(推荐),AH:IPSEC认证(不推荐)
auth_pass 1111 # 指定认证所使用的密码。最多8位
}
unicast_peer { # 另外一台的服务器ip,如果是多台就配多个ip
10.10.11.79
}
virtual_ipaddress { # 指定VIP地址
10.10.11.78
}
notify "/container/service/keepalived/assets/notify.sh"
}
每个节点这个四个文件都配置好以后,可以启动了。
执行
启动:
docker-compose -f docker-compose.yml up -d
停止:
docker-compose down
查看日志:
docker-compose logs
验证
如果有一台Nginx服务器挂了,Keepalived会自动在备Nginx服务器上选一台当主服务器.
1.可以把其中一台宿主机中的nginx的容器停掉,然后访问两个虚拟ip,发现是可以漂移的。而且等待两秒钟,nginx容器会自动重启。
2.直接把其中一台服务器的nginx容器和keepalived容器全部停掉模拟服务器宕机的场景,访问两个虚拟ip发现也是可以切换的。但是这种情况 容器不会自动重启,只能手动重启。