概述
準(zhǔn)備在虛擬機(jī)的centos7上搭建搭建docker+Nginx+LVS+keepalived搭建分布式雙機(jī)主從熱備,其架構(gòu)圖如下
安裝docker(如已經(jīng)安裝,請忽略)
yum install docker #該命令安裝過程中的提示一律填 y 再回車即可
安裝好docker后設(shè)置docker開機(jī)啟動(dòng)
systemctl start docker.service
systemctl enable docker.service
docker 里面安裝Nginx
直接拿最新的nginx鏡像
docker pull nginx
鏡像是否成功下載使用下面命令查看是否存在nginx鏡像
docker images
切換到當(dāng)前用戶跟目錄,然后建立一個(gè)nginx目錄,并在nginx目錄下新建nginx_master和nginx_backup; 然后分別在這兩個(gè)文件夾下建立conf, logs, html 三個(gè)文件夾(這里之所以要建立nginx_backup是因?yàn)榉奖愕綍r(shí)候虛擬機(jī)克隆,也可以不建立nginx_backup) 先建立啟動(dòng)一個(gè)nginx容器
docker run -d --name nginx nginx
切換目錄到nginx_master目錄下,然后將docker下的nginx 容器的nginx.conf和conf.d文件copy到nginx_master nginx_backup的conf下
docker cp nginx:/etc/nginx/nginx.conf $PWD/conf
docker cp nginx:/etc/nginx/conf.d $PWD/conf
復(fù)制完成后刪除剛才啟動(dòng)nginx容器
docker stop nginx
docker rm nginx
docker ps -a
復(fù)制完成后在nginx_master目錄下查看復(fù)制完成后的目錄結(jié)構(gòu)
ll $PWD/*
在nginx_master/html目錄下新建一個(gè)index.html文件,隨便輸入文字 關(guān)閉防火墻
systemctl stop firewalld.service
禁止防火墻開機(jī)啟動(dòng)
systemctl disable firewalld.service
確保文件創(chuàng)建好后,就可以按照下面命令創(chuàng)建nginx容器
docker run -d -p 80:80 -p 443:443 --name nginx_master --restart=always --privileged=true -v /root/nginx/nginx_master/html:/usr/share/nginx/html -v /root/nginx/nginx_master/conf/nginx.conf:/etc/nginx/nginx.conf -v /root/nginx/nginx_master/conf/conf.d:/etc/nginx/conf.d -v /root/nginx/nginx_master/logs:/var/log/nginx nginx
# 以上是命令,下面是命令的解析
-d # 表示在一直在后臺(tái)運(yùn)行容器
-p 80:80 # 對端口進(jìn)行映射,將本地80端口映射到容器內(nèi)部的80端口
--name # 設(shè)置創(chuàng)建的容器名稱
-v # 將本地目錄(文件)掛載到容器指定目錄;
--restart=always是重啟策略,當(dāng)docker服務(wù)重啟后,容器也會(huì)自動(dòng)啟動(dòng)(必須,否則后面啟動(dòng)虛擬機(jī),需要手動(dòng)啟動(dòng)nginx)
--privileged=true 使創(chuàng)建的容器擁有root權(quán)限(必須,沒有的話,啟動(dòng)nginx報(bào)錯(cuò),說沒有權(quán)限)
如果啟動(dòng)的時(shí)候不帶上 –privileged=true,會(huì)出現(xiàn) nginx: [alert] could not open error log file: open() “/var/log/nginx/error.log” failed (13: Permission denied) 啟動(dòng)完查看容器的啟動(dòng)狀態(tài)是否正常
docker ps -a
啟動(dòng)完,訪問nginx_master的nginx,看看是否能訪問到index.html的內(nèi)容
安裝keepalived
安裝命令
yum install keepalived -y
查看是否安裝成功,使用如下命令能看到版本號(hào),表示成功
rpm -q -a keepalived
使用yum命令安裝keepalived成功后,在/etc/keepalived目錄下有keepalived.conf配置文件,高可用配置就是主要配置該文件 主機(jī)的keepalived.conf的配置內(nèi)容如下
! Configuration File for keepalived
global_defs {
notification_email {
xuad@xuad.com
}
notification_email_from root@xuad.com
smtp_server mail.xuad.com
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_nginx {
script '/root/keepalived/nginx_check.sh' # 檢查nginx狀態(tài)的腳本
interval 2
weight 3
}
vrrp_instance VI_1 {
state MASTER #備份服務(wù)器上將MASTER改為BACKUP
interface ens33 #這個(gè)需要根據(jù)你服務(wù)器的網(wǎng)卡進(jìn)行選擇,我這里是ens33
virtual_router_id 51 #這個(gè)id必須與備機(jī)的id一樣
priority 100 #備份服務(wù)上將100改為小于100,可配置成90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.247.120 #這個(gè)IP前三位最后與服務(wù)器的IP前三位相同,有多個(gè)vip可在下面繼續(xù)增加
}
track_script {
chk_nginx
}
}
切換到當(dāng)前用戶目錄空間,建立一個(gè)keepalived目錄,這個(gè)目錄存放的是nginx是否正常啟動(dòng)的檢測腳本 進(jìn)入keepalived目錄,創(chuàng)建nginx_check.sh文件,文件內(nèi)容如下
#!/bin/bash
#version 0.0.1
#
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
systemctl restart docker
sleep 3
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
systemctl stop keepalived
fi
fi
# 腳本說明:當(dāng)nginx進(jìn)程不存在時(shí),會(huì)自動(dòng)重啟docker服務(wù),docker服務(wù)啟動(dòng)時(shí)會(huì)自動(dòng)啟動(dòng)nginx容器;再次檢查nginx進(jìn)程,如果不存在,就停止keepalived服務(wù),然后NGINX_BACKUP主機(jī)會(huì)自動(dòng)接替NGINX_MASTER的工作。
腳本創(chuàng)建完成后,必須給腳本賦予可以執(zhí)行的權(quán)限,這里為了方便直接給所有權(quán)限
chmod 777 nginx_check.sh
啟動(dòng)keepalived并查看其狀態(tài)
systemctl start keepalived
systemctl status keepalived
克隆主機(jī)成為備機(jī)
關(guān)閉虛擬機(jī),對主機(jī)進(jìn)行克隆 克隆完成后,選擇克隆出來的備機(jī)需要改變下MAC地址 重要 開啟備機(jī)服務(wù)器,然后修改備機(jī)的hostname,將備機(jī)的hostname改成salve或者backup都可以,修改完成重啟備機(jī)
hostnamectl set-hostname salve
由于是從主機(jī)克隆來的,所以主機(jī)的docker和keepalived、Nginx都已經(jīng)有了,主要對 /etc/keepalived/keepalived.conf 文件進(jìn)行進(jìn)行一定修改就好;另外的nginx容器也可以重新建立一個(gè),命名為:nginx_salve;最后啟動(dòng)主機(jī)和備機(jī)兩臺(tái)服務(wù)機(jī),分別查看keepalived的狀態(tài)是否都啟動(dòng)了,沒有啟動(dòng)就啟動(dòng)
systemctl status keepalived
當(dāng)master節(jié)點(diǎn)沒有宕機(jī)的情況,訪問的是master節(jié)點(diǎn)下的nginx,當(dāng)出現(xiàn)宕機(jī)的情況下訪問的是backup節(jié)點(diǎn)下的nginx 將主機(jī)關(guān)機(jī),造成主機(jī)宕機(jī)現(xiàn)象,就訪問了備機(jī)的nginx
至此使用docker搭建的雙機(jī)主從熱備環(huán)境就搭建好了,如有問題,評論區(qū)留言
|