为解决单点故障,我们需要配置主从热备方案,服务器数量有限,故使用Docker模拟安装配置。
本次配置默认已经安装了Docker。
配置环境:Ubuntu20.04 64位
docker版本:Docker version 17.12.1-ce, build 7390fc6
1,拉取centos7镜像
sudo docker pull centos:7
2,创建容器
sudo docker run -it -d --name centos1 -d centos:7
3,进入容器centos1
sudo docker exec -it centos1 bash
4,安装常用工具
yum update
yum provides '*/applydeltarpm'
yum -y install deltarpm
yum install psmisc
yum install -y vim wget
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
yum install -y openssl openssl--devel
yum install -y popt-devel initscripts net-tools
yum install -y gcc-c++
======================================================
如果上述更新失败,那就是国外的源速度太慢了,需要替换成国内的源地址再重复上述操作,替换源看下面
1. 备份自带源
# 首先要确认你有 wget 命令, 并且连着网
# cd /etc/yum.repos.d/
# mkdir repo
# mv *.repo repo
2. 下载国内源文件
# cd /etc/yum.repos.d/
# 1). 下载 CentOS7 源文件地址
# wget http://mirrors.163.com/.help/CentOS7-Base-163.repo
# 2). 因为网易没有 epel 源 所以要从阿里下载
# wget http://mirrors.aliyun.com/repo/epel-7.repo
3. 清除并初始化源数据缓存
# 1). 清除源数据缓存
# yum clean all
# 2). 初始化源数据缓存
# yum makecache
5,将容器打包成新的镜像,以后直接以该镜像创建容器
sudo docker commit -a 'cfh' -m 'centos with common tools' centos1 centos_base
6,删除之前创建的centos1 容器,重新以基础镜像创建容器,安装keepalived+nginx
sudo docker rm -f centos1
#容器内需要使用systemctl服务,需要加上/usr/sbin/init
sudo docker run -it --name centos_temp -d --privileged centos_base /usr/sbin/init
sudo docker exec -it centos_temp bash
7,安装nginx
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
# 使用下面命令安装nginx
yum install -y nginx
#启动nginx
systemctl start nginx.service
#查看是否启动成功,出现nginx欢迎界面表示安装成功
curl 172.17.0.2
8,安装keepalived
1.下载keepalived
wget http://www.keepalived.org/software/keepalived-1.2.18.tar.gz
2.解压安装:
tar -zxvf keepalived-1.2.18.tar.gz -C /usr/local/
3.下载插件openssl
yum install -y openssl openssl-devel(需要安装一个软件包)
4.开始编译keepalived
cd /usr/local/keepalived-1.2.18/ && ./configure --prefix=/usr/local/keepalived
5.make一下
make && make install
9,将keepalived 安装成系统服务
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
然后复制keepalived脚本文件:
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/sbin/keepalived /usr/sbin/keepalived
可以设置开机启动:chkconfig keepalived on,到此我们安装完毕!
#若启动报错,则执行下面命令
cd /usr/sbin/
rm -f keepalived
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
#常用命令
systemctl daemon-reload 重新加载
systemctl enable keepalived.service 设置开机自动启动
systemctl disable keepalived.service 取消开机自动启动
systemctl start keepalived.service 启动
systemctl stop keepalived.service 停止
systemctl status keepalived.service 查看服务状态
10,修改/etc/keepalived/keepalived.conf文件
#备份配置文件
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.backup
cd /etc/keepalived/
rm -f keepalived.conf
vim keepalived.conf
#配置文件如下
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 121
mcast_src_ip 172.17.0.6
priority 100
nopreempt
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx
}
virtual_ipaddress {
172.17.0.100
}
}
11,添加心跳检测文件
vim nginx_check.sh
#以下是脚本内容
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
12,给脚本赋予执行权限,设置开机启动
chmod +x nginx_check.sh
systemctl enable keepalived.service
systemctl enable nginx.service
#开启keepalived
systemctl start keepalived.service
systemctl nginx keepalived.service
chkconfig keepalived on
chkconfig nginx on
13,检测虚拟IP是否成功,在宿主机里面执行下面命令,如果出现nginx欢迎界面表示成功
curl 172.17.0.100
14,将centos_temp 容器重新打包成镜像,然后利用这个新镜像再创建两个容器,实现热备效果
sudo docker commit -a 'cfh' -m 'centos with keepalived nginx' centos_temp centos_kn
15,删除所有容器
sudo docker rm -f centos_temp
16,用centos_kn 镜像创建主服务器容器
sudo docker run --privileged -tid --name centos_master --restart=always centos_kn /usr/sbin/init
sudo docker exec -it centos_master bash
17,修改centos_master里面nginx 欢迎页,
vim /usr/share/nginx/html/index.html
Title修改为Master nginx
18,创建从服务器容器
sudo docker run --privileged -tid --name centos_slave --restart=always centos_kn /usr/sbin/init
sudo docker exec -it centos_slave bash
#修改keepalived.conf 配置文件,主要是state和priority两个参数的调整,其中master节点的priority值一定要比slave大才行
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state SLAVE
interface eth0
virtual_router_id 121
mcast_src_ip 172.17.0.6
priority 80
nopreempt
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx
}
virtual_ipaddress {
172.17.0.100
}
}
19,修改完成之后重新加载
systemctl daemon-reload
systemctl restart keepalived.service
20,修改nginx欢迎页(若nginx没启动则执行 systemctl start nginx.service)
vim /usr/share/nginx/html/index.html
修改标题为Slave nginx
21,测试
A> 分别在宿主机,centos_master,centos_slave中进行一下命令测试,如果显示都为Master的欢迎页面,说明配置成功1/3
B> 此时停止centos_master容器( docker stop centos_master ),保留centos_slave容器,执行以下命令,若切换到Slave页面,则说明keepalived配置成功2/3
C> 重启centos_master 容器,此时执行以下命令,看是从Slave切换到了Master,如果切换成功,说明我们配置到此成功了。
说明,测试过程中,重启容器之后,nginx没有启动,需要进入容器启动一下,不然访问不到Master页面了,但是可以Ping通。
执行下面命令,配置nginx随机启动,这样不用每次重启容器还需要手动启动nginx
chkconfig nginx on