前言
技术架构
单机架构
应用数据分离架构
应用服务集群架构
读写分离/主从分离架构
写入主的时候,要同步Mysql从的数据才可以
冷热分离架构
写的时候要写入主和缓存数据库
读的时候先去缓存看有没有,没有的话就去从数据库读数据
主要就是看这个数据是冷门的还是热门的了
缓存数据库就是redis
这个热点的返回数据非常快
缺点就是万一一个表数据太多了,有千万级别,那么一个数据库存的数据就太多了
垂直分库架构
就是分库分表
可以用mycat,tddl来分库分表
我们可以直接用分布式数据库了
最下面的都是集群的东西
数据库都采用了集群化
缺点就是:我们改代码的时候就要停服,重新发布版本
微服务架构
容器编排架构
容器与容器之间不会冲突
如果没有k8s的话,就会布置很多微服务,要把jar包布置6份
有k8s,直接一键式布置这6个微服务,只需要一份,就可以一键式
不然就要慢慢布置了
实战架构
Docker使用
容器技术发展史
jail时代
云时代
云:分布式的
隔离已经用Linux实现了
资源隔离
解决海量数据处理
云原生时代:k8s,docker
虚拟化与容器化
笔记本电脑就是物理机
一台操作系统上装了很多操作系统就是虚拟化
虚拟化出来的叫做虚拟机
容器化:就是虚拟的软件层,操作系统的虚拟化,虚拟化的一种
docker是容器化的一种
虚拟化容器化优点:资源利用率高,因为划的很细
环境一致性
资源可以弹性收缩
物理机上可以装不同的操作系统,环境不同
容器比虚拟机启动更快
docker不需要虚拟内核,相当于不用开机了
而且很容易维护和扩展
应用程序执行环境分层
容器是虚拟化的操作系统
虚拟化常见类别
:虚拟机:伪造的硬件层
:JVM:伪造应用程序层和函数库层
常见虚拟化实现:
主机虚拟化实现:模拟了所有的硬件
容器虚拟化实现
这就是主机虚拟化
就是在物理服务器上安装了一个软件,一个虚拟化层,变成可视化的了
容器虚拟化实现
实现原理:操作系统层的虚拟化
容器是轻量级的
而且容器之间是不影响的
资源之间是隔离的
Namespace
可以只让A进程只看到A的资源,B进程只看到B的资源
这些就是隔离的内核资源
意思就是就算是两个进程运行在同一个主机上,但是可以有不同的主机名和域名
两个进程看到的都是80端口
但是却不是同一个端口
NameSpace实战基础知识
dd命令
if=文件名 ------》输入文件名
of=文件名 ------》输出文件名
sync:将每个输入块填充到ibs个字节,不足部分用空NUL字符补齐
生成镜像文件
我们这个是输入文件
dev/zero是系统的一个特殊的文件设备,它会连续不断地产生空白字符流
生成一个空白的镜像文件
bs就是指定大小
count就是产生文件数量
这样我们就产生了空白的文件
加上 -h 选项后,文件大小会以更直观的单位(如 KB、MB、GB 等)来展示
这样就生成了80M的文件
转换为大写
dd if=in.txt of=out.txt conv=ucase
dd就是完成一个读取转换输出的操作
mkfs
用于在设备上创建Linux文件系统,俗称格式化,比如我们使用 U盘的时候可以格式化。
语法
mkfs [-V] [-t fstype] [fs-options] filesys [blocks]
• 参数
-t fstype:指定要建立何种文件系统;如ext3,ext4 —》磁盘类型ext4 用的比较多
filesys :指定要创建的文件系统对应的设备文件名;
blocks:指定文件系统的磁盘块数。 -V : 详细显示模式
fs-options:传递给具体的文件系统的参数
-v 表示显示详情
• 实例
#将sda6 分区格式化为ext4格式
mkfs -t ext4 /dev/sda6
#格式化镜像文件为ext4
mkfs -t ext4 ./fdimage.img
把我们镜像的文件格式化为磁盘
mkfs -t ext4 ./test.img
这样就完成了
这个命令就是把硬盘u盘或者空白文件格式化
就是创建了一个指定的Linux文件系统
df
df 命令详解
Linux df(英文全拼:disk free) 命令用于显示目前在 Linux 系统上的文件系统磁盘使
用情况统计。
• 语法
df [OPTION]… [FILE]…----》看这个目录的文件占有情况
• 常见参数
○ -a, --all 包含所有的具有 0 Blocks 的文件系统
○ -h, --human-readable 使用人类可读的格式(预设值是不加这个选项的…)
○ -H, --si 很像 -h, 但是用 1000 为单位而不是用 1024
○ -t, --type=TYPE 限制列出文件系统的 TYPE
○ -T, --print-type 显示文件系统的形式
• 案例
#查看磁盘使用情况
df -h
#查看磁盘的系统类型
df -Th
指定要ext4类型的
打印了类型
df -T /data
这样就是指定目录下的文件系统的详细信息
H与h就是容量的单位变了
mount
mount 命令详解
mount 命令用于加载文件系统到指定的加载点(相当于查u盘的时候,添加了一个盘,windows是自动挂载上去的)。此命令的也常用于挂载光盘,使我们
可以访问光盘中的数据,因为你将光盘插入光驱中,Linux 并不会自动挂载,必须使用
Linux mount 命令来手动完成挂载。
Linux 系统下不同目录可以挂载不同分区和磁盘设备,它的目录和磁盘分区是分离的,
可以自由组合(通过挂载)
不同的目录数据可以跨越不同的磁盘分区或者不同的磁盘设备。
挂载的实质是为磁盘添加入口(挂载点)。
• mount 常见用法
mount [-l]
mount [-t vfstype] [-o options] device dir
• 常见参数
-l:显示已加载的文件系统列表;
-t: 加载文件系统类型支持常见系统类型的 ext3,ext4,iso9660,tmpfs,xfs 等,大部分情况
可以不指定,mount 可以自己识别
-o options 主要用来描述设备或档案的挂接方式。
loop:用来把一个文件当成硬盘分区挂接上系统
ro:采用只读方式挂接设备
rw:采用读写方式挂接设备
device: 要挂接(mount)的设备。就是u盘的文件系统,相当于u盘
dir: 挂载点的目录,挂在哪个目录下面,挂载u盘的地方
• 案例
#将 /dev/hda1 挂在 /mnt 之下。
mount /dev/hda1 /mnt
#将镜像挂载到/mnt/testext4 下面,需要确保挂载点也就是目录存在
mkdir -p /mnt/testext4
mount ./fdimage.img /mnt/testext4
挂载之前需要一个文件系统,就是磁盘
我们可以格式化一下test.img
这个问的是已经有了一个ext4的文件系统
这样就格式化成功了
这样就是一个空白的文件系统了
就可以挂载了
挂载到某个目录就要先创建这个目录
mount ./test.img /data/testmymount/
这个就是把./test.img挂载到/data/testmymount/
df -h就可以查看了
这样我们就把一个空白的镜像文件,挂载成了一个磁盘
然后这个磁盘可以正常的读写
unshare
unshare 命令详解
unshare 主要能力是使用与父程序不共享的名称空间运行程序。就是不共享Namespace
• 语法
unshare [options] program [arguments]
program 是具体的程序–》与父程序不共享命名空间
options是参数
• 常用参数
参数 含义
-i, --ipc 不共享 IPC 空间,进程间通信
-m, --mount 不共享 Mount 空间,文件系统
-n, --net 不共享 Net 空间,网络
-p, --pid 不共享 PID 空间,进程
-u, --uts 不共享 UTS 空间,主机名,网络名
-U, --user 不共享用户,用户信息
-V, --version 版本查看,
–fork 执行 unshare 的进程 fork 一个新的子进程,在子进
程里执行 unshare 传入的参数。启动一个新的子进程,而不是让现在这个进程作为父进程
–mount-proc 执行子进程前,将 proc 目录优先挂载过去
proc 目录下有很多进程,不写这个的话就会看到proc下的所有进程信息
• 案例
#hostname 隔离
root@139-159-150-152:~# unshare -u /bin/bash
root@139-159-150-152:~# hostname test1
root@139-159-150-152:~# hostname
test1
root@139-159-150-152:~# exit
exit
root@139-159-150-152:~# hostname
139-159-150-152
root@139-159-150-152:
我们用的主机隔离
unshare -u /bin/bash
bash是一个程序
现在已经进入了一个子进程的命令空间了
hostname test1
指定主机名
这个是查看主机名
我们在启动一个xshell
可以看到主机名不是新的
这里退出的是子进程
我们发现名字又变回去了
注意如果要显示ip的话
就是要写hostname -I
所以unshare就是做到了命名空间的隔离
PID隔离
- 在主机上执行 ps -ef,可以看到进程列表如下,其中启动进程 PID 1 为 init 进程
- 我们打开另外一个 shell ,执行下面命令创建一个 bash 进程,并且新建一个 PID
Namespace:
–fork 新建了一个 bash 进程,是因为如果不建新进程,新的 namespace 会用 unshare
的 PID 作为新的空间的父进程,而这个 unshare 进程并不在新的 namespace 中,所
以会报个错 Cannot allocate memory
–pid 表示我们的进程隔离的是 pid,而其他命名空间没有隔离
mount-proc 是因为 Linux 下的每个进程都有一个对应的 /proc/PID 目录,该目录包含
了大量的有关当前进程的信息。 对一个 PID namespace 而言,/proc 目录只包含当前
namespace 和它所有子孙后代 namespace 里的进程的信息。创建一个新的 PID
namespace 后,如果想让子进程中的 top、ps 等依赖 /proc 文件系统的命令工作,还
需要挂载 /proc 文件系统。而文件系统隔离是 mount namespace 管理的,所以 linux
特意提供了一个选项–mount-proc 来解决这个问题。如果不带这个我们看到的进程还
是系统的进程信息。
Shell
unshare --fork --pid --mount-proc /bin/bash - 执行 ps -ef 查看进程信息,我们可以看到此时进程空间内的内容已经变了,而且
启动进程也变成了我们的 bash 进程。说明我们已经看不到主机上的进程空间了,我们
的进程空间发生了隔离。
4.执行 exit 退出进程
这里报了一个错
因为我们这里的父进程是shell,它有PID
shell内部新启动的bash进程,看不见shell的信息,因为PID已经发生了隔离,因为是shell
所以bash启动的时候,没有自己的父进程,因为已经隔离了,就会报这个错
如果要正常运行的话,就要床加你一个全新的进程
加一个参数,让你和启动你的这个进程没有什么关系
先exit退出
unshare -p --fork /bin/bash
这样就完成了PID的隔离了
接下来我们来看我们启动的新进程和我们宿主机上的进程是否一样
启动的新进程就是bash
我们再打开另一个xshell
两个均执行ps-ef
我们可以发现进程是一样的说明进程并没有隔离
因为proc目录下有很多进程的PID
执行ps -ef的时候
全部都列了出来
这时候就要用–mount-proc这个了
这个就是执行子进程前,先把proc目录挂载在过去
挂载过去之后,我们的proc目录就没有这些现有的信息了
再次exit
unshare -p --fork --mount-proc /bin/bash
可以发现现在的proc目录下的进程id就很少了
原来的是很多的
现在在执行ps -ef
看的PID为一的就是我们自己指定的程序
这样就实现了PID的隔离
-p表示隔离pid
–fork表示我们要启动新的一个进程
Mount 隔离
- 打开第一个 shell 窗口 A,执行命令, df -h ,查看主机默认命名空间的磁盘挂载情
况 - 打开一个新的 shell 窗口 B,执行 Mount 隔离命令
- 在窗口 B 中添加新的磁盘挂载
- 在窗口 B 挂载的磁盘中添加文件
- 查看窗口 B 中的磁盘挂载信息
- 查看窗口 A 中的磁盘挂载信息
- 查看窗口 B 中的文件信息
- 查看窗口 A 中的文件信息,可以看到窗口 B 中新建的文件和磁盘挂载在主机的窗
口中并没有,说明我们实现了文件系统隔离。 - 窗口 B 执行 exit,退出
我们先创建一个mount隔离的进程
unshare --mount --fork /bin/bash
在进程里面创建一个空白文件
dd if=/dev/zero of=data2.img bs=8k count=10240
然后挂载为一个磁盘–》挂载点
先格式化
mkfs -t ext4 ./data2.img
然后就是挂载了
这是我们全部的挂载点
挂载之前我们还要先指定我们挂在点目录
mkdir -p /data/maxhou/data2mount
然后开始挂载
mount -t ext4 ./data2.img /data/maxhou/data2mount/
这样就挂载成功了
df -h
这样就说明了我们完成了data2mount的挂载点的创建了
然后我们在外面能不能看见这个挂载点
df -h
这个就说明了我们创建的挂载点在外面是看不到的,这就是mount隔离
我们在这个挂载点里面写文件
外面都看不见的
可以发现文件根本找不到,但是目录确实可以找到的
这个磁盘的挂载点也是看不见的
往里面放文件别人就看不见了
删除挂载点
使用 umount 命令
语法格式:umount [选项] 挂载点或umount [选项] 设备。例如要卸载/mnt/data这个挂载点,可以执行umount /mnt/data。如果知道挂载的设备,也可以使用umount /dev/sdb1来卸载,前提是/dev/sdb1对应的挂载点没有被其他进程占用。
常用选项
-l:lazy unmount,即延迟卸载。如果设备忙,它会将卸载操作推迟到设备不再忙的时候。
-f:强制卸载,一般在正常卸载失败时使用,但可能会导致数据丢失或文件系统损坏,需谨慎使用。
值得注意的就是,这个挂载点是从根目录开始设置的
与当前所在文件没有关系
当你在执行 rm -fr data 命令时遇到 rm: cannot remove ‘data/testmymount’: Device or resource busy 错误,这表明 data/testmymount 是一个挂载点,并且当前有进程正在使用该挂载点上的资源,所以无法直接删除它。你可以按照以下步骤解决这个问题:
- 确定挂载信息
使用 mount 命令查看系统的挂载信息,确认 data/testmymount 是否为挂载点以及挂载的设备。
mount | grep data/testmymount
这个命令会过滤出与 data/testmymount 相关的挂载信息,你可以从中了解到挂载的设备(例如 /dev/sdb1)等详细内容。 - 找出占用挂载点的进程
使用 lsof 命令找出正在使用该挂载点的进程:
lsof +D data/testmymount
该命令会列出所有正在访问 data/testmymount 目录及其子目录的进程。你会看到输出中包含进程的 PID(进程 ID)、进程名等信息。 - 终止占用挂载点的进程
根据上一步得到的 PID,使用 kill 命令终止这些进程。例如,如果 PID 为 1234 的进程正在占用挂载点,你可以执行:
kill 1234
如果该进程无法正常终止,可以使用强制终止的方式:
kill -9 1234
不过,使用 -9 选项强制终止进程可能会导致数据丢失或其他问题,所以要谨慎使用。 - 卸载挂载点
在终止所有占用挂载点的进程后,使用 umount 命令卸载挂载点:
umount data/testmymount
如果卸载时仍然提示设备忙,可以尝试使用 umount -l 进行延迟卸载:
umount -l data/testmymount
-l 选项会将卸载操作推迟到挂载点不再被使用时执行。
5. 删除目录
在成功卸载挂载点后,你就可以安全地删除 data 目录了:
rm -fr data
通过以上步骤,你应该能够解决因挂载点被占用而无法删除目录的问题。