前言
技術架構
單機架構
應用數據分離架構
應用服務集群架構
讀寫分離/主從分離架構
寫入主的時候,要同步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
通過以上步驟,你應該能夠解決因掛載點被占用而無法刪除目錄的問題。