RAID與其在Linux上的實現

来源:https://www.cnblogs.com/alongdidi/archive/2019/04/03/raid_and_linux.html
-Advertisement-
Play Games

參考資料: RAID data striping spanned volume 從raid0到raid7,raid陣列各級別介紹 本文所使用的圖片來源於互聯網,若有侵權,煩請聯繫,謝謝。 簡介 RAID出現的目的是為了數據的冗餘,或者性能的提升,或者兩者兼顧。早期想實現這樣的功能,可能需要購買一些基 ...


參考資料:

RAID

data striping

spanned volume

從raid0到raid7,raid陣列各級別介紹

本文所使用的圖片來源於互聯網,若有侵權,煩請聯繫,謝謝。

簡介

RAID出現的目的是為了數據的冗餘,或者性能的提升,或者兩者兼顧。早期想實現這樣的功能,可能需要購買一些基於大型機(mainframe)的設備,但是價格過於昂貴,後來就有些人發明瞭RAID技術將多塊廉價的磁碟組合在了一起,實現了和大型機設備同等的功能。

RAID,早期的全稱是冗餘廉價磁碟陣列(Redundant Array of Inexpensive Disks),主要是相比於以往的昂貴的SLED(Single Large Expensive Disk),後改名為冗餘獨立磁碟陣列(Redundant Array of Independent Disks),畢竟現在的RAID控制卡也已經不便宜了。

基於不同級別的冗餘和性能要求,RAID有不同的級別(level)。不同的級別也決定了可靠性(reliability)、可用性(availability)、性能(performance)和容量(capacity)的不同。

許多RAID級別採用了一種錯誤保護機制,叫做奇偶校驗(parity)。大部分情況使用的是異或運算(XOR),不過RAID 6則使用了兩種獨立的奇偶校驗方法。

不同的RAID級別,使用不同的數字來表示,例如RAID 0、RAID 1等等。

RAID級別按照種類劃分有標準(standard)級別、嵌套/混合(nested/hybrid)級別和非標準(non-standard)級別。RAID級別是由SINA(Storage Networking Industry Association)組織所定義的。

接下來我們就來一一介紹這幾種RAID。

 

標準級別

RAID 0

基於striping方式(data striping是一種切割邏輯上連續數據的技術,例如切割文件,使得連續的片段可以被存儲在不同的物理存儲設備上。)來組織數據,不具備鏡像(mirror,即數據冗餘)和校驗的功能。如圖所示。

一個文件會被切割成多個block,假設有8個,有A1~A8表示,那麼會依次存入陣列中的每個磁碟當中。

優點:

  1. 讀寫性能提升,理論上有n塊磁碟,就可以帶來n倍的性能提升,因為讀寫是並行的。
  2. 存儲容量提升,陣列總容量為n塊磁碟之和。如果磁碟的容量不是相等的,則總容量為n倍的最小磁碟容量。其他RAID級別遇到磁碟容量不同的時候,也是以最小磁碟容量為準。接下來我們假設所有RAID的磁碟容量都是相同的,一般在生產環境中,陣列中的磁碟的容量、型號等也都會是一模一樣的。

缺點:

  1. 沒有數據冗餘能力,1塊硬碟損壞則整個RAID無法使用,數據全部丟失。並且隨著陣列中磁碟數量的增加,發生損壞的概率就越大。
  2. 沒有校驗能力,無法基於校驗碼進行數據恢復。

其他:

  1. 至少需要2塊硬碟。

RAID 1

基於鏡像(mirroring)的方式,當寫入數據的時候,會同時寫入每個磁碟設備。

優點:

  1. 具備數據冗餘能力,只要陣列中還有一塊硬碟處於工作狀態,那麼整個陣列就依然可用。
  2. 讀性能提升,如果RAID控制器足夠強大,則讀性能可接近於RAID 0,不過實際實現中,應該無法達到。

缺點:

  1. 寫性能下降。由於同一個block的數據需要被寫入陣列中的每一個磁碟中,因此寫性能下降。磁碟數越多,寫性能下降越多。最慢的磁碟會限制整個陣列的寫性能。
  2. 沒有校驗能力,無法基於校驗碼進行數據恢復。

其他:

  1. 存儲容量保持不變。總容量為單塊磁碟容量。
  2. 至少需要2塊磁碟。

RAID 2

數據的組織方式類似RAID 0,通過striping技術以位(bit)為單位將數據切割至多塊磁碟上。使用漢明碼(hamming-code)作為校驗碼,具備數據恢復能力,但是需要多塊磁碟作為校驗盤。所有磁碟的主軸旋轉是同步的。

目前已被棄用!!!

RAID 3

類似RAID 2。區別在於RAID 3是基於位元組(byte)級別,使用非漢明碼的校驗碼,所以校驗碼只需存儲在一塊磁碟中。

目前已被棄用!!!

RAID 4

類似於RAID 2和3。區別在於RAID 4是基於塊(block)級別,校驗碼存儲在一塊磁碟上。RAID 4相對於2和3的最大優點在於I/O並行性(parallelism):在2和3中,一次簡單的讀操作會從陣列中的所有磁碟讀取數據,而4則不需要。

由於只有一塊校驗盤,每次寫入數據的時候需要計算校驗碼,隨著磁碟數的增加,校驗盤的性能會成為整個陣列的瓶頸。

目前RAID 4的實現大部分已被私有技術RAID DP所取代,RAID DP使用了兩塊校驗盤。

註意:圖片可能有點錯誤,DISK 2中存儲的應該是BLOCK A3、B3、C3和D3的數據。

優點:

  1. 讀寫性能提升,讀性能理論為n倍的數據盤,寫性能理論小於n倍的數據盤且隨著數據盤的增加,寫性能越來越受制於校驗盤。
  2. 具有數據恢復能力。
  3. 存儲容量提升,為磁碟總容量減去校驗盤容量(n-1)。

缺點:

  1. 無鏡像能力,雖然存在數據恢復能力,但是數據盤損壞後,基於校驗碼恢複數據會有額外的計算開銷。
  2. 校驗盤瓶頸問題。

其他:

  1. 至少需要3塊磁碟。

RAID 5

類似於RAID 4,RAID 5基於塊(block)級別切割數據至多個磁碟,同樣具備校驗碼。但是,最大的區別在於RAID 5的校驗碼不是存放在專門的磁碟上,而是分散式地存儲在陣列中的每個磁碟中,這就解決了RAID 4的寫性能受制於校驗盤的問題了。截止目前,涉及校驗的RAID,它們的校驗碼都是只計算一次並保留一份,這也叫做“單校驗概念”(single-parity concept)。像這類單校驗的設計,當陣列越來越龐大的時候,容易受到系統故障的影響,這裡的系統故障指的是磁碟損壞陣列重建(rebuild)時間以及重建期二次磁碟損壞幾率。詳見:Increasing rebuild time and failure probability

優點:

  1. 讀寫性能提升,理論為n倍的磁碟,解決了RAID 4中的校驗盤瓶頸問題。
  2. 具有數據恢復能力。
  3. 存儲容量提升,為磁碟總容量減去校驗碼占用容量(n-1),校驗碼占用的容量約為一個磁碟容量。

缺點:

  1. 無鏡像能力,雖然存在數據恢復能力,但是數據盤損壞後,基於校驗碼恢複數據會有額外的計算開銷。
  2. 單校驗問題,此前的所有具備校驗能力的RAID亦均有此問題。

其他:

  1. 至少需要3塊磁碟。

RAID 6

類似於RAID 5,RAID 6基於塊(block)級別切割數據至多個磁碟,具備分散式校驗碼。只不過是使用了雙校驗碼(double-parity)機制。雙校驗支持損壞至多2塊磁碟。這使得更大的RAID陣列更加實用,尤其對於高可用系統,因為大容量的陣列需要更長的時間重建。至少需要4塊磁碟。和RAID 5一樣,單塊磁碟故障會降低整體陣列性能,直到故障盤被替換。如果磁碟的容量和陣列的容量越大的話,那麼越應該考慮使用RAID 6來替代RAID 5。RAID 10同樣也最小化了這些問題。

優點:

  1. 讀寫性能提升,寫性能可能稍微遜色於RAID 5,因為要計算2種校驗碼。
  2. 具備數據恢復能力,允許損壞至多2塊磁碟。
  3. 存儲容量提升,n-1。
  4. 新增雙校驗機制,解決單校驗的問題,此類設計更適合支持大容量陣列並提高其可用性。

缺點:

  1. 必須犧牲2塊磁碟的容量存放校驗碼。
  2. 無鏡像能力,雖然存在數據恢復能力,但是數據盤損壞後,基於校驗碼恢複數據會有額外的計算開銷。不過雙校驗應該可以加快數據恢復的時間。

其他:

  1. 至少需要4塊磁碟。

 

嵌套級別

RAID中的每個元素(組成成分),可以是獨立磁碟,也可以是一個RAID陣列。對於後者,我們稱之為RAID嵌套。

RAID 01

也叫作RAID 0+1或者RAID 0&1,先將磁碟製作成RAID 0,再將每個RAID 0組合成RAID 1。如圖所示。

任何一塊磁碟損壞都會導致其中一個stripe(基於striping技術的RAID 0,也可叫stripe)不可用,此時整個RAID 01陣列實際上就降級為RAID 0陣列了。該陣列相比RAID 10在重建期會遭遇更高的風險,因為它需要讀取剩下的stripe中的所有磁碟的所有數據而不是其中一塊盤上的所有數據,增加了URE(Unrecoverable Rear Error)的概率並且明顯擴大了重建視窗。

至少需要4塊磁碟。可以採用更多的磁碟,但是這意味著磁碟故障率也會隨之增加,如果陣列只有2個stripe,並且剛好每個stripe各損壞1塊磁碟,那麼整個陣列就完了。

按照此圖示的存儲容量為n/2。

因此,RAID 01是不好的,不建議使用。建議使用RAID 10來替代它!!!

RAID 10

也叫作RAID 1+0或者RAID 1&0,先將磁碟製作成RAID 1,再將每個RAID 1組合成RAID 0。如圖所示。

這種陣列相對RAID 01可以承受更多的設備損壞,特別是在單個鏡像捲中的磁碟數量較多的情況下。

按照此圖示的存儲容量為n/2。

 

非RAID架構

關於RAID的常用級別基本已經說明完畢,除了以上幾個RAID級別,還有一些並不是基於RAID技術但是也可以將磁碟數據集合起來的技術,這些技術通常只是簡單地將磁碟堆疊起來使用而已,並不一定具備像RAID一樣的數據冗餘和性能提升的功能。

  • JBOD:Just a Bunch Of Disks。
  • SPAN or BIG:字面意義,非縮略詞。
  • MAID:Massive Array of Idle Drives。

詳見:Non-RAID drive architectures

 

實現

RAID的實現主要有兩種,一種是基於硬體俗稱硬RAID,另一種是基於軟體俗稱軟RAID。

硬RAID需要硬體(RAID卡,即RAID控制器)支持,一般是在OS啟動之前,在BIOS中進行RAID的相關配置,並且在OS啟動之後,會有對應RAID卡廠商的私有軟體工具可以進行配置。因為本人沒有相關硬RAID配置經驗以及這隻是實驗環境,因此沒有硬RAID相關實現的介紹。

軟RAID的實現方式也有很多種,一般是基於操作系統的某些特性,例如基於Linux內核的md(Multiple Device)或者OpenBSD的softraid。

本文主要闡述如何基於Linux操作系統實現軟RAID。

mdadm

基於Linux的md實現的命令是mdadm,它所支持的RAID級別:LINEAR(類似JBOD)、RAID 0、RAID 1、RAID 4、RAID 5、RAID 6和RAID 10。

OS:CentOS 7.5

mdadm:v4.0

我們的目標是,使用4塊1GB的磁碟,創建RAID 5陣列,其中3塊作為有效(active)盤,1塊作為備用(spare)盤。

創建4塊磁碟,分區,文件系統類型為Linux的RAID(ID:fd)。

[root@C7 ~]# fdisk -l | grep -i "raid"
/dev/sdb1            2048     2097151     1047552   fd  Linux raid autodetect
/dev/sdc1            2048     2097151     1047552   fd  Linux raid autodetect
/dev/sde1            2048     2097151     1047552   fd  Linux raid autodetect
/dev/sdd1            2048     2097151     1047552   fd  Linux raid autodetect

查看內核識別到的分區信息,確保我們剛纔所創建的四個磁碟的分區已經被內核識別。

[root@C7 ~]# cat /proc/partitions 
major minor  #blocks  name

   8        0   20971520 sda
   8        1    1048576 sda1
   8        2   19921920 sda2
   8       16    1048576 sdb
   8       17    1047552 sdb1
   8       32    1048576 sdc
   8       33    1047552 sdc1
  11        0    4365312 sr0
   8       64    1048576 sde
   8       65    1047552 sde1
   8       48    1048576 sdd
   8       49    1047552 sdd1
 253        0   17821696 dm-0
 253        1    2097152 dm-1

如果未識別到,則使用partprobe告知內核。警告信息可以忽略。

[root@C7 ~]# partprobe 
Warning: Unable to open /dev/sr0 read-write (Read-only file system).  /dev/sr0 has been opened read-only.

創建磁碟陣列。

[root@C7 ~]# mdadm -C /dev/md0 -l 5 -n 3 -x 1 /dev/sd{b,c,d,e}1
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

查看陣列狀態信息

方法一

[root@C7 ~]# cat /proc/mdstat 
Personalities : [raid6] [raid5] [raid4] 
md0 : active raid5 sdd1[4] sde1[3](S) sdc1[1] sdb1[0]
      2091008 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]

陣列創建的過程需要時間,例如寫入RAID元數據之類的,想動態查看的話,可以通過watch命令

[root@C7 ~]# watch -n 1 cat /proc/mdstat

方法二

[root@C7 ~]# mdadm -D /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Wed Apr  3 14:15:55 2019
        Raid Level : raid5    # RAID級別
        Array Size : 2091008 (2042.00 MiB 2141.19 MB)    # 4塊磁碟,各1GB,1塊備用盤,還有1塊盤的容量為校驗碼,因此陣列可用容量為2GB。
     Used Dev Size : 1045504 (1021.00 MiB 1070.60 MB)
      Raid Devices : 3
     Total Devices : 4
       Persistence : Superblock is persistent

       Update Time : Wed Apr  3 14:16:00 2019
             State : clean    # 陣列的狀態,clean表示乾凈狀態,即陣列處於健康工作狀態
    Active Devices : 3
   Working Devices : 4
    Failed Devices : 0
     Spare Devices : 1

            Layout : left-symmetric
        Chunk Size : 512K

Consistency Policy : resync

              Name : C7:0  (local to host C7)
              UUID : ebf794e8:8f01958a:f004744b:7be7a8cf    # 系統重啟後,陣列的設備名稱可能不再是/dev/md0,因此可使用UUID來代替設備名稱寫入/etc/fstab。
            Events : 18

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       1       8       33        1      active sync   /dev/sdc1
       4       8       49        2      active sync   /dev/sdd1

       3       8       65        -      spare   /dev/sde1

格式化RAID設備並掛載使用

[root@C7 ~]# mkfs -t xfs /dev/md0
meta-data=/dev/md0               isize=512    agcount=8, agsize=65408 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=522752, imaxpct=25
         =                       sunit=128    swidth=256 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=8 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@C7 ~]# mkdir /raid_data
[root@C7 ~]# mount /dev/md0 /raid_data

創建一個測試的文本文件,輸入一些信息。在下文標記陣列中磁碟為faulty狀態時,我們可以通過測試此文件是否內容可讀取來判斷RAID是否可用。

[root@C7 ~]# cat /raid_data/raid.txt
this is a test file for RAID 5 !!!

手動標記陣列中的一塊有效磁碟為faulty狀態,並觀察備用盤是否自動頂替。

[root@C7 ~]# mdadm /dev/md0 -f /dev/sdd1
mdadm: set /dev/sdd1 faulty in /dev/md0

再次查看狀態會發現一些變化。

[root@C7 ~]# mdadm -D /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Wed Apr  3 14:15:55 2019
        Raid Level : raid5
        Array Size : 2091008 (2042.00 MiB 2141.19 MB)
     Used Dev Size : 1045504 (1021.00 MiB 1070.60 MB)
      Raid Devices : 3
     Total Devices : 4
       Persistence : Superblock is persistent

       Update Time : Wed Apr  3 14:45:28 2019
             State : clean, degraded, recovering    # 由於磁碟損壞了1塊,且存在備用盤。備用盤自動頂替,陣列進入重建期,在重建完成前,陣列處於降級模式工作。重建完畢後,狀態又會變回clean了。
    Active Devices : 2
   Working Devices : 3
    Failed Devices : 1
     Spare Devices : 1

            Layout : left-symmetric
        Chunk Size : 512K

Consistency Policy : resync

    Rebuild Status : 65% complete    # 數據重建進度。

              Name : C7:0  (local to host C7)
              UUID : ebf794e8:8f01958a:f004744b:7be7a8cf
            Events : 30

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       1       8       33        1      active sync   /dev/sdc1
       3       8       65        2      spare rebuilding   /dev/sde1

       4       8       49        -      faulty   /dev/sdd1

待陣列重建完畢,再標記一塊磁碟為faulty狀態。

[root@C7 ~]# mdadm /dev/md0 -f /dev/sdc1
mdadm: set /dev/sdc1 faulty in /dev/md0

此時我們的陣列,就只能工作於降級模式而無法恢復clean了。

[root@C7 ~]# mdadm -D /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Wed Apr  3 14:15:55 2019
        Raid Level : raid5
        Array Size : 2091008 (2042.00 MiB 2141.19 MB)
     Used Dev Size : 1045504 (1021.00 MiB 1070.60 MB)
      Raid Devices : 3
     Total Devices : 4
       Persistence : Superblock is persistent

       Update Time : Wed Apr  3 14:47:55 2019
             State : clean, degraded 
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 2
     Spare Devices : 0

            Layout : left-symmetric
        Chunk Size : 512K

Consistency Policy : resync

              Name : C7:0  (local to host C7)
              UUID : ebf794e8:8f01958a:f004744b:7be7a8cf
            Events : 45

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       -       0        0        1      removed
       3       8       65        2      active sync   /dev/sde1

       1       8       33        -      faulty   /dev/sdc1
       4       8       49        -      faulty   /dev/sdd1

無論陣列處於重建期或者降級模式,測試文件都是可讀的。

如果該陣列不使用了,那麼我們應該先卸載陣列,再關閉它。

[root@C7 ~]# umount /dev/md0
[root@C7 ~]# mdadm -S /dev/md0
mdadm: stopped /dev/md0
[root@C7 ~]# mdadm -D /dev/md0
mdadm: cannot open /dev/md0: No such file or directory

關閉後,陣列設備文件消失。

 

總結

  1. 實際生產環境中,數據的完整性和性能是重要的,因此不應該使用軟RAID,而應該採用硬RAID。
  2. 不同的RAID卡廠商的配置方式不同,萬變不離其宗,瞭解RAID原理各級別特性比RAID實現更重要。
  3. 本文關於Linux上的軟RAID實現只是簡單闡述,切勿直接拿來在生產環境使用。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 壓縮(makecab): 其中: /f 指定的c;\list.txt(路徑自定義)是你要進行壓縮的文件的列表,不能包含文件夾,在根文件下的子文件夾中不能包含相同文件名的文件,因為cab壓縮後不保留文件結構,否則會報錯(ERROR: Duplicate file name)。 list.txt 可以使 ...
  • Linux常見系統故障 1.修複MBR扇區故障 2.修複GRUB引導故障 3./etc/inittab文件丟失 4.遺忘root用戶密碼 5.修複文件系統 6.磁碟資源耗盡故障 一、修複MBR扇區故障 1.關機添加一塊硬碟,開機查看硬碟設備分區列表,是否存在/dev/sdb設備信息 2.對新硬碟分區 ...
  • 使用Expand命令行可以在電腦沒有安裝Windows操作系統的情況下應用批處理文件和腳本: 雖然有多個基於Windows的工具可以壓縮和解壓縮文件(包括WinZip和WinRAR),但是必須有一個可以工作的Windows操作系統才能使用它們。 Expand工具用來壓縮的Wndows CAB文件中 ...
  • 我在使用SDL2的時候,遇到undefined reference to `SDL_Init'的問題,只要使用SDL2相關的函數,就會報函數未定義。後來百度到一篇文章https://blog.csdn.net/hank12580/article/details/45949995,經過測試可以使用,原 ...
  • 我在使用SDL2的時候遇到始終找不到頭文件的問題,到處百度然後我嘗試使用#include<SDL2/SDL.h>編譯通過了,那麼我很顯然我之前設置的環境變數應該是沒有生效的,後面在返回來研究下為啥沒有生效,linux的基礎知識太薄弱了,應該好好補習一下。 ...
  • 今天打算學習littlev GUI,使用Ubuntu來實現模擬,然後在安裝SDL2的時候,始終因為依賴關係導致安裝失敗,我嘗試手動去安裝那些有依賴關係的包發現根本不可行,然後我百度上也沒有找到合適的法子,但是看有的網友說是因為源的問題,我思考了下覺得這個說法有一定道理,然後我嘗試切換源,我測試了16 ...
  • 1. 檢查系統自帶的Mysql,並卸載自帶的版本 2. 卸載系統自帶的mysql及其依賴 3. 給CentOS添加rpm源,並且選擇較新的源 1)下載rpm包 2)安裝本地mysql源 3)驗證是否安裝成功 4)修改預設版本為5.7 註:如下是截取的老徐之前文章 -》原文 http://istest ...
  • HTTP/HTTPS抓包工具--Fiddler Fiddler[ˈfɪdlə(r)] 1. HTTP代理神器Fiddler Fiddler是一款強大Web調試工具,它能記錄所有客戶端和伺服器的HTTP請求。 Fiddler啟動的時候,預設IE的代理設為了127.0.0.1:8888,而其他瀏覽器是需 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...