基于docker的简单高可用web集群

基于docker的简单高可用web集群

Scroll Down

docker-swarm-ha-web

一个基于docker swarm的简单高可用web集群

一、简单高可用web集群搭建思路:

1、3个master节点,2个work节点,2个负载均衡节点,数据库集群(没有尝试搭建数据库集群)

2、如上结构,在manager1节点创建私人仓库registry,镜像持久化存储 manager1节点初始化集群,其他节点加入集群,将lnmp的镜像push到私人仓库,然后各个节点pull各种镜像,在master节点上创建某一种服务将会引导工作节点创建对应的容器,容器也会平均分配到每一个work节点。

3、集群工作节点的web服务自身就具有高可用性,访问不同节点的ip都能访问到相同的服务,副本数量可控,manager leader节点宕机会推选出新的leader,然后在添加2个keeplived + nginx 负载均衡实现VIP访问web服务,负载均衡调度其高可用,master节点宕机可平规过渡VIP.

二、几个重要的配置文件

1、目录结构
image.png

2、配置文件可以在github获取
github

三、集群搭建准备:

3.1 集群拓扑

image.png

3.2 二进制安装docker( 可使用yum 安装docker )

docker下载地址

3.2.1 manager1节点

① manager1解压二进制包
image.png

② 设置systemed管理
image.png

③ 启动并开机自启
image.png

3.2.2 manager2节点

① manager2解压安装包

image.png

② 设置systemed管理

image.png

③ 启动并开机自启

image.png

3.2.3 manager3节点

① manager3节点解压二进制包

image.png

② 设置systemd管理并开机自启

image.png

3.2.4 node1节点

① node1节点解压

image.png

② 设置systemd管理

image.png

3.3 搭建私有镜像仓库:

① docker pull registry拉取registry镜像仓库

image.png

② 启动镜像容器并挂载本地目录

默认情况下,会将仓库存放于容器内的/var/lib/registry目录下,这样如果容器被删除,则存放于容器中的镜像也会丢失,所以我们一般情况下会指定本地一个目录
image.png

3.4 集群初始化

① 获取worker节点加入的token
image.png

② 获取manager节点加入的token
image.png

③ manager节点加入
image.png

image.png

④ woker节点加入
image.png

image.png

⑤ 查看集群状态
image.png

3.5 自制镜像php、nginx

3.5.1 制作一个centos7基础镜像

① 编写Dockerfile文件
image.png

② 构建基础镜像
image.png

③ 查看镜像
image.png

3.5.2 创建nginx镜像并上传到私有仓库

① 查看目录结构
image.png

② 构建镜像
image.png

③ push镜像到私有仓库
image.png

3.5.3 创建php镜像并上传到私有仓库

需要的文件Dockerfile(php)、php-7.2.3.tar.gz、php-fpm、php.ini、www.conf、Dokerfile的FROM标签需要改为centos:v1,否则centos8编译会报错
① 构建php镜像
image.png

② push镜像到私有仓库
image.png

③ 查看私有仓库的镜像
image.png

3.6 创建一个overlay网络

① 查看创建的overlay网络
image.png

四、部署服务

4.1 创建mysql服务

① 创建mysql配置文件
image.png

配置文件
image.png

② 创建mysql服务
image.png

③ 查看mysql服务信息
image.png

④ 登入mysql查看配置信息( 物理机如果安装的有mysql,可以通过-h 容器IP登入mysql的容器,在配置文件中设置过 )
image.png

查看信息
image.png

⑤ 在manager1节点上查看持久化数据

image.png

4.2 节点pull镜像

manager1、manager2、manager3、node1、node2节点分别将私有仓库中的镜像pull下来以便创建服务

① manager2节点pull镜像
image.png

② manager3节点pull镜像
image.png

③ node1节点pull镜像
image.png

④ node2节点pull镜像
image.png

4.3 创建php服务

① 创建php服务
image.png

② 查看服务
image.png

4.4 创建nfs共享存储

① 创建目录、修改nfs配置
image.png

配置文件
image.png

② manager1节点启动nfs
image.png

③ 其他worker点安装nfs、启动、尝试挂载

manager2节点
image.png

manager3节点
image.png

node1节点
image.png

被挂载点添加文件
image.png

manager2挂载点测试
image.png

node1挂载点测试
image.png

node2挂载点测试
image.png

4.5 创建nginx服务

① 创建nginx服务
image.png

② 查看服务
image.png

③ 在nfs存储中添加一个nginx配置文件
image.png

④ 所有运行nginx节点的nginx容器需要reload

manager3节点
image.png

node1节点
image.png

node2节点
image.png

⑤ 访问测试

manager1节点测试
image.png

manager3节点测试
image.png

4.6 部署wordpress

① 查看wwwroot数据卷
image.png

② 下载WordPress压缩包,放置网站文件(所有节点操作),并将文件解压到wwwroot对应的文件夹中

manager1放置网站文件
image.png

manager3节点
image.png

4.7 wordpress部署

① 访问url
image.png

② 输入账户密码
image.png

4.8 高可用负载均衡调度器nginx + keepalived部署

① 安装nginx、keepalived软件包
image.png

image.png

② nginx配置文件(主备一样)
image.png

③ keepalived配置文件(Nginx Master)
image.png

④ keepalived配置文件(Nginx Backup)
image.png

⑤ nginx状态脚本(master)
image.png

# chmod + x /etc/keepalived/check_nginx.sh

⑥ nginx状态脚本(slave)
image.png

# chmod + x /etc/keepalived/check_nginx.sh

⑦ 分别启动软件并设置开机自启
image.png

image.png

⑧ 查看keepalived工作状态
image.png

⑨ VIP访问测试
image.png

五、集群高可用测试

5.1 节点的高可用测试

① 模拟leader manager节点的宕机
image.png

② 查看是否产生新的leader

manager2节点成为新的leader
image.png

5.2 service的高可用测试

① 杀掉mysql的一个副本
image.png

② 很快又生成一个新的mysql容器
image.png

③ 通过scale动态扩容副本数量
image.png

5.3 web高可用测试

① 所有节点都可访问web服务

manager1节点
image.png

manager2节点
image.png

manager3节点
image.png

node1节点
image.png

node2节点
image.png

5.3 负载调度器高可用测试

① 通过VIP可以正常访问服务
image.png

② 模拟master调度器宕机
image.png

③ 查看VIP平滑过渡到slave节点
image.png

④ 再次查看VIP是否仍然可访问

VIP仍然正常访问
image.png

参考来源:
https://www.cnblogs.com/bigberg/p/8855144.html
https://github.com/Bigberg/docker/tree/master/compose-lnmp
https://www.cnblogs.com/bigberg/p/8821872.html
https://www.cnblogs.com/kevingrace/p/9453987.html
https://www.jianshu.com/p/8df3145d9383
https://www.cnblogs.com/superlinux/p/12581725.html