目录
1、Swarm中使用Volume和NFS服务
1.1、为什么需要nfs服务器?nfs是什么?nfs解决了什么问题?
2、布置一台nfs服务器
2.1、客户机上能否有写的权限要看两种权限
2.2、sync(同步)和async(异步)
2.3、如果我们在启动了NFS之后又修改了/etc/exports,是不是还要重新启动nfs呢?
2.4、实现开机自动挂载
2.5、Create a service which creates an NFS volume(创建NFS卷的服务)
Share data among machines(在机器之间数据共享)
3、负载均衡(load balancing)
3.1、为什么需要负载均衡?
3.2、安装负载均衡
3.2.1、利用脚本编译安装
3.2.2、配置nginx里的负载均衡功能
3.3、负载均衡的方法
注意:本文中使用的机器都是上个文章中提到的
1、Swarm中使用Volume和NFS服务
目的:随便访问任何一台节点服务器上的web服务,看到的页面都是一样的,即满足volume被swarm里的service使用。所有的节点服务器都到同一台文件服务器上拿网页数据就可以了。
这台文件服务器就是nfs服务,另外这台机器里也需要安装docker
1.1、为什么需要nfs服务器?nfs是什么?nfs解决了什么问题?
廉价的解决方法:nfs;有钱的解决方法:san。
1.2、san
1.2.1、san和nfs比较
nfs配置:
- 随便一台linux机器,安装nfs服务,就可以进行共享;对磁盘啊、cpu、内存等要求极低
- 使用的是传统的tcp/ip网络
- 磁盘的性能不是特别的好,没有定制,也没有raid(磁盘阵列),所以磁盘坏了整个服务就G了
现在企业中都不适用nfs,因为nfs很网络不稳定容易丢失数据。
san配置:
- 通过光纤存储网络,速度快,一次性写入的数据多,容量大
- 专业的存储服务器
- HBA卡插到业务服务器上
1.2.2、为什么要使用nfs?不用其他的东西
用nfs主要是为了模拟企业里,所有的服务器到一台集中存放数据的服务器拿数据。nfs是最简单而且廉价的解决方案。不是不想用别的比如san,但是负担不起。
1.3、NAS
NAS(Network Attached Storage)网络存储基于标准网络协议实现数据传输,为网络中的Windows / Linux / Mac OS 等各种不同操作系统的计算机提供文件共享和数据备份。
介于nfs和san之间的设备
- 需要专业的存储设备
- 使用传统的tcp/ip网络
- 其他的电脑/手机/pad等设备都是可以使用的
1.4、若是不用nfs,你还可以使用那些方法
- 可以使用云存储
- 可以使用第三方插件 Use Docker Engine plugins | Docker Documentation
2、布置一台nfs服务器
IP:192.168.29.30 主机名:nfs-server 担任角色:nfs server
IP:192.168.29.137 主机名:manager或者nginx-kafka01 担任角色:swarm manager
IP:192.168.29.139 主机名:woker138 担任角色:swarm node1
IP:192.168.29.140 主机名:woker140 担任角色:swarm node2
IP:192.168.29.99 主机名:load-balancer 担任角色:负载均衡
第一步:安装nfs的相关软件
[root@nfs-service ~]# yum install nfs-utils -y # 这个步骤在所有需要用nfs服务的机器都要安装,但是下面的操作只需要在作为nfs服务的机器上操作就行
第二步:启动nfs-servcer服务
[root@nfs-service ~]# service nfs-server start
Redirecting to /bin/systemctl start nfs-server.service
[root@nfs-service ~]# ps aux|grep nfs
root 2980 0.0 0.0 0 0 ? S< 17:12 0:00 [nfsd4_callbacks]
root 2986 0.0 0.0 0 0 ? S 17:12 0:00 [nfsd]
root 2987 0.0 0.0 0 0 ? S 17:12 0:00 [nfsd]
root 2988 0.0 0.0 0 0 ? S 17:12 0:00 [nfsd]
root 2989 0.0 0.0 0 0 ? S 17:12 0:00 [nfsd]
root 2990 0.0 0.0 0 0 ? S 17:12 0:00 [nfsd]
root 2991 0.0 0.0 0 0 ? S 17:12 0:00 [nfsd]
root 2992 0.0 0.0 0 0 ? S 17:12 0:00 [nfsd]
root 2993 0.0 0.0 0 0 ? S 17:12 0:00 [nfsd]
root 3005 0.0 0.0 112824 988 pts/0 S+ 17:13 0:00 grep --color=auto nfs
第三步:编辑/etc/exports文件
# 限制挂载文件的权限
[root@nfs-service web]# cat /etc/exports
/web 192.168.29.0/24(ro,all_squash,sync)
/download 192.168.29.137/24(rw,all_squash,sync)
[root@nfs-service ~]# mkdir /web
[root@nfs-service web]# ls
fan.gif index.html myself.jpg study.html
# 往index.html输入东西能让你觉得这个网页改变了就行
2.1、客户机上能否有写的权限要看两种权限
- 共享权限。如/etc/exports文件里的权限,例如ro、rw
- 文件系统里的权限。/web在linux里的权限。远程客户端连接nsf服务器是通过nfsnobody这个用户连接过来的,所以需要给/web授予相应的权限以及将文件改为nfsnobody所属。
第三步:修改/web和/download文件的权限
[root@nfs-service ~]# ll -d /web /download/
drwxr-xr-x. 3 nfsnobody nfsnobody 37 4月 30 16:59 /download/
drwxr-xr-x. 2 nfsnobody nfsnobody 75 5月 1 17:47 /web
[root@nfs-service web]# exportfs -rv # 刷新输出文件的列表,并输出详细信息
2.2、sync(同步)和async(异步)
sync:当容器往宿主机里文件写东西,会同时往另一台机器的内存和硬盘中写入。这样保证了数据的不丢失。
async:当容器往宿主机里文件写东西,要等到宿主机里的cache缓存满了之后,才会往另一台机器的内存和硬盘中写入。
第四步:建议关闭防火墙和selinux
[root@nfs-server download]# service firewalld stop
Redirecting to /bin/systemctl stop firewalld.service
[root@nfs-server download]# systemctl disable firewalld
[root@nfs-server download]# getenforce
Disabled
第五步: 在客户机上挂载nfs服务共享的/web和/download目录,manger和woker都要挂载
# 安装nfs-tils软件,方便客户机上挂载,具有了相关命令,例如:showmount
[root@worker138 ~]# yum install nfs-utils -y
# 查看nfs服务器上共享输出了哪些文件夹
[root@worker138 ~]# showmount -e 192.168.29.30
Export list for 192.168.29.30:
/download 192.168.29.140/24
/web 192.168.29.0/24
[挂载nfs服务器上的目录到本机上]
注意:因为是copy出来的服务器,所以文件内容都是一样的,我们要把除了nfs服务的机器以外的里的/web和/download清空。但是想要本机的/web或者/download文件夹必须存在,或者你用其他的文件夹接收挂载的文件也行。
[root@worker140 web]# mount 192.168.29.30:/web /web
[root@worker140 web]# mount 192.168.29.30:/download /download
[root@worker140 web]# df -Th |grep nfs4
192.168.29.30:/web nfs4 17G 8.1G 9.0G 48% /web
192.168.29.30:/download nfs4 17G 8.1G 9.0G 48% /download
# 若是在/web文件中挂载之后,要退出再进入之后才会显示挂载的内容
[root@worker140 web]# cd ..
[root@worker140 /]# cd -
/web
[root@worker140 web]# ls
fan.gif index.html myself.jpg study.html
注意:所有的docker宿主机都要挂载nfs服务器的/web和/download
[取消挂载]
取消挂载要在不是那个文件夹中取消。例如,我们现在要取消挂载/web
[root@worker138 /]# df -Th|grep web
192.168.29.30:/web nfs4 17G 8.1G 9.0G 48% /web
[root@worker138 web]# cd / # 可以是除了/web的任何文件
[root@worker138 /]# umount /web
[root@worker138 /]# df -Th|grep web
2.3、如果我们在启动了NFS之后又修改了/etc/exports,是不是还要重新启动nfs呢?
这个时候我们就可以用exportfs 命令来使改动立刻生效,该命令格式如下:
# exportfs [-aruv]
-a 全部挂载或卸载 /etc/exports中的内容
-r 重新读取/etc/exports 中的信息 ,并同步更新/etc/exports、/var/lib/nfs/xtab
-u 卸载单一目录(和-a一起使用为卸载所有/etc/exports文件中的目录)
-v 在export的时候,将详细的信息输出到屏幕上。
具体例子:
# exportfs -au 卸载所有共享目录
# exportfs -rv 重新共享所有目录并输出详细信息
[root@worker140 web]# mkdir ww # 这是因为挂载的时候,对/etc/exports里的文件做出权限的限制
mkdir: 无法创建目录"ww": 只读文件系统
[root@worker140 download]# mkdir hello
[root@worker140 download]# ls
hello
2.4、实现开机自动挂载
第一种方法:修改/etc/rc.local文件
在文件中加入"mount 192.168.29.30:/web /web"
第二种方法:修改/etc/fstab文件
/etc/fstab是linux系统开机会自动根据这个文件里的内容挂载磁盘分区
加入"192.168.29.30:/web /web nfs defaults 0 0"这行代码
192.168.29.30:/web 是挂载的分区,nfs的文件系统;后边这个/web是本地的挂载点;defaults,是挂载选项,使用默认;0,是否支持dump命令进行备份;0,是否开机的时候进行分区的文件系统的检查,分区的文件系统是否有问题
推荐使用第二种方法
2.5、Create a service which creates an NFS volume(创建NFS卷的服务)
NFSv3型
$ docker service create -d \
--name nfs-service \
--mount 'type=volume,source=nfsvolume,target=/app,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/var/docker-nfs,volume-opt=o=addr=10.0.0.10' \
nginx:latest
NFSv4型
# 这个命令要在manager里边执行,-d,放在后台执行,建议不要放在后台执行
$ docker service create -d \
--name nfs-service \
--mount 'type=volume,source=nfsvolume,target=/app,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/var/docker-nfs,"volume-opt=o=addr=10.0.0.10,rw,nfsvers=4,async"' \
--replicas 10 -p 8089:80 nginx:latest
"""
--name,指定名字
source=nfsvolume docker宿主机上的卷的名字,若是没有可以自己创建,按自己的修改。另外这个卷名字只能使用一次
/app 容器里存放网页的目录,按自己的修改
volume-driver=local 访问本地的某个目录
volume-opt=type=nfs volume对nfs的支持选项
volume-opt=device=:/var/docker-nfs 是nfs服务器共享的目录
volume-opt=o=addr=10.0.0.10,rw,nfsvers=4,async 挂载具体的nfs服务器的IP地址和选项
--replicas 10 副本数量
-p 8089:90 映射端口
"""
# 我执行的代码
[root@manager _data]# docker service create --name fan-service --mount 'type=volume,source=nfsvolume,target=/usr/share/nginx/html,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/web,"volume-opt=o=addr=192.168.29.30,rw,nfsvers=4,async"' --replicas 10 -p 8089:80 nginx:latest
udx5rhb9uy89n1j3vibj9x4j8
[root@manager _data]# docker volume inspect nfsvolume
[
{
"CreatedAt": "2022-05-01T17:43:06+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/nfsvolume/_data",
"Name": "nfsvolume",
"Options": {
"device": ":/web",
"o": "addr=192.168.29.30,rw,nfsvers=4,async",
"type": "nfs"
},
"Scope": "local"
}
]
[root@manager ~]# cd /var/lib/docker/volumes/nfsvolume/_data
[root@manager _data]# ls
fan.gif index.html myself.jpg study.html
[查看在运行的容器]
[root@manager ~]# docker service ps fan-service
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
vvb9sgkpz1wy fan-service.1 nginx:latest nfs-service Running Running 26 seconds ago
5woz1nvox22l fan-service.2 nginx:latest worker138 Running Running 24 seconds ago
q8mdxskerc30 fan-service.3 nginx:latest manager Running Running 27 seconds ago
5exfmv4lndfl fan-service.4 nginx:latest worker138 Running Running 24 seconds ago
u930lx73v6g1 fan-service.5 nginx:latest nfs-service Running Running 26 seconds ago
9w4o6xqi1rry fan-service.6 nginx:latest manager Running Running 27 seconds ago
nex07xqefokt fan-service.7 nginx:latest nfs-service Running Running 26 seconds ago
y74k2dr0n6t2 fan-service.8 nginx:latest worker138 Running Running 24 seconds ago
zi74iqx5zrfp fan-service.9 nginx:latest manager Running Running 27 seconds ago
r1o4b32cx46a fan-service.10 nginx:latest worker138 Running Running 24 seconds ago
[查看挂载是否成功]
我们在manager和这些node中使用以下命令
[root@worker140 ~]# docker volume inspect nfsvolume1
[
{
"CreatedAt": "2022-07-14T21:24:03+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/nfsvolume1/_data",
"Name": "nfsvolume1",
"Options": {
"device": ":/web",
"o": "addr=192.168.29.30,rw,nfsvers=4,async",
"type": "nfs"
},
"Scope": "local"
}
]
Share data among machines(在机器之间数据共享)
参考官方文献: Use volumes | Docker Documentation
3、NFS的使用方法
IP:192.168.29.30 主机名:nfs-server 担任角色:nfs server
IP:192.168.29.137 主机名:manager或者nginx-kafka01 担任角色:swarm manager
IP:192.168.29.139 主机名:woker138 担任角色:swarm node1
IP:192.168.29.140 主机名:woker140 担任角色:swarm node2
IP:192.168.29.99 主机名:load-balancer 担任角色:负载均衡
3.1、方法一:使用nfs-server
步骤一到五和第2节点的一致,
6、使用通过nfs服务共享的文件
命令:docker service create --name fan-service --mount 'type=volume,source=nfsvolume,target=/usr/share/nginx/html,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/web,"volume-opt=o=addr=192.168.29.30,rw,nfsvers=4,async"' --replicas 10 -p 8089:80 nginx:latest
source=nfsvolume --> docker宿主机上的卷的名字
/usr/share/nginx/html -->容器里存放网页的目录
volume-driver=local --> 访问本地的某个目录的
volume-opt=type=nfs --> volume对nfs的支持选项
volume-opt=device=:/web --> 是nfs服务器共享目录
volume-opt=o=addr=192.168.29.30,rw,nfsvers=4,async 挂载具体的nfs服务器的ip地址和选项
--replicas 10 副本的数量
nfsvers=4 --> nfs版本
async --> 异步
[root@ngingx-kafka01 ~]# docker service ps fan-service1
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
uh3vxlsj33pa fan-service1.1 nginx:latest ngingx-kafka01 Running Running 2 minutes ago
4rmusskjajju fan-service1.2 nginx:latest ngingx-kafka01 Running Running 2 minutes ago
ly9iuhmhpeyr fan-service1.3 nginx:latest worker138 Running Running 2 minutes ago
6yhr443w7ivz fan-service1.4 nginx:latest worker140 Running Running 2 minutes ago
m6njajnw2hn0 fan-service1.5 nginx:latest ngingx-kafka01 Running Running 2 minutes ago
jr44r7bv2oki fan-service1.6 nginx:latest worker140 Running Running 2 minutes ago
satc1bctpaws fan-service1.7 nginx:latest worker138 Running Running 2 minutes ago
vrlnftc82kl9 fan-service1.8 nginx:latest worker140 Running Running 2 minutes ago
c1lekcy6kunf fan-service1.9 nginx:latest worker138 Running Running 2 minutes ago
kgox1h6hcniy fan-service1.10 nginx:latest worker138 Running Running 2 minutes ago
3.2、方法二:使用sshfg共享文件
步骤一到五和第2节点的一致,
6、客户机安装sshfs
yum install sshfs -y
7、挂载nfs-server共享文件
mkdir /download
sshfs root@192.168.29.30:/download /download
mkdir /web
sshfs root@192.168.29.30:/web /web