【linux相識相知】獨立硬碟冗餘陣列-RAID

来源:http://www.cnblogs.com/liubinsh/archive/2017/07/29/7257810.html
-Advertisement-
Play Games

詳細的介紹了獨立硬碟冗餘陣列,並演示了Linux下的軟RAID的實現過程。 ...


獨立硬碟冗餘陣列(RAID,Redundant Array of Independant Disks),舊稱為廉價磁碟冗餘陣列(Redundant Array of Inexpensive Disks)。1987年美國加州伯克利分校的一篇名為《A Case for Redundant Arrays of Inexpensive Disk(RAID)》論文誕生,這標志著RAID技術的開始。

那麼什麼是RAID呢?簡單的來講就是把多個硬碟組合起來,成為一個硬碟陣列組,操作系統會把它當做是一個硬碟,其性能能夠達到甚至超過單個昂貴容量大的硬碟。RAID提供了多種硬碟組合的方式,相比單個硬碟來說,提高了硬碟得I/O能力。多個磁碟之間相互冗餘,提高了耐用性。 RAID的硬碟組合方式有:RAID-0,RAID-1,RAID-2,RAID-3,RAID-4,RAID-5,RAID-6,RAID-7,RAID10,RAID-01,RAID-50,RAID-53,RAID-60,JBOD。  

RAID的實現模式

Software RAID:

軟體磁碟陣列,由CPU處理和協調一個RAID裡面各個硬碟的作業,這樣就會給CPU帶來較多的運算壓力,分為3種:

1)基於主板的的磁碟陣列:通常上是由主板上的晶元組提供RAID功能。

2)硬體輔助磁碟陣列:需要RAID卡和相關廠商提供的驅動程式,RAID功能是由驅動程式和CPU運算來提供

3)操作系統的RAID功能:Linux、windows Server等操作系統內置的RAID功能

雖然軟RAID實現的有多種,但是在生產環境還是不建議使用的。

Hardware RAID:
硬體磁碟陣列,在RAID卡上內置了CPU處理器,這樣就不占用伺服器的CPU了。一般硬體磁碟陣列都會有備份的電源模塊和NVRAM(非易失性記憶體),當系統斷掉後,備份電源開始供電,將硬碟讀寫的日誌保存在記憶體中,當系統恢復,備份電源關閉供電,再在NVRAM讀取日誌數據,繼續完成上次斷電前沒有完成的作業。

 

常用RAID介紹

常用的RAID有:RAID0,RAID-1,RAID-5,RAID6,RAID-10,RAID50。

 

RAID0

RAID0,也稱條帶捲(striping)。在RAID0中,數據會被切成片,按一定順序會被寫到所有的磁碟裡面,如下圖:

若一片數據被切割成了A1-A8,將存儲在一個由2塊Disk組成的RAID0,那麼第一段數據塊A1會被存儲在Disk0中,第二段數據塊A2會被存儲在Disk1中,第三段數據塊會被存儲在Disk0中,以此類推,這一片數據會被均分到2塊磁碟上。

RAID0的優缺點:

1)速度快,寫和讀的能力得到了提高;

2)RAID0沒有冗餘的能力,一旦一塊磁碟出現了故障,則所有的數據都將不會恢復;

3)RAID0需要N塊磁碟才能實現(N>=2);

4)能夠存儲數據的大小為N*min(S1,S2,S3,S4....)

在RAID0中有兩個重要的參數:

條帶寬度:stripe width,它指的是可以被並行寫入的數據塊的個數,也就是實現RAID0中磁碟的個數;

條帶大小:stripe size,它指的是每次寫入磁碟的數據塊的大小,大小一般為2KB或者512KB甚至更大,size越小,數據被分割的次數就越多。stripe size對性能是有一定的影響的,在生產環境中,需要調整好。

 

 RAID1

RAID1,鏡像化,在RAID1中,數據會被覆製成多份,存儲在多個磁碟上,如下圖:

若一片數據將要被存儲,數據會被覆製成多份(取決RAID1的磁碟個數),然後存儲到每一個磁碟上。

 

 RAID1的優缺點:

1)冗餘性和數據的可靠性最高,只要不是磁碟同時損壞了,一般都不會帶來數據丟失的問題;

2)RAID1的容量取決容量最小的那個磁碟,寫入速度也是取決於最小的那個磁碟,較大的磁碟的剩餘空間可       以分區使用,不會造成浪費;

3)RAID1的讀取速度理論上來說是磁碟個數的倍數;

4)RAID1需要N塊磁碟才能實現(N>=2)

5)能夠存儲數據的大小為min(S1,S2,S3...)

 

 RAID3

RAID3,數據類似於RAID0,被條帶化的存儲在多個磁碟中,數據以位元組為單位,與RAID0不同的是,RAID3單獨使用了一塊獨立的磁碟用來存儲數據的奇偶校驗值,如下圖所示:

數據被切片存儲在Disk0-2上,同時計算處奇偶校驗值存儲在Disk3上,這樣即使Disk0-2中損壞一塊磁碟,也能根據奇偶校驗值得到損壞磁碟的數據。

 

RAID3的優缺點:
1.較高的容錯能力;

2.不適合寫入操作較多的情景,會給校驗盤帶來一定的負載,適合讀取操作較多的應用環境;

3.RAID3需要N塊磁碟(N>=3);

4.能夠存儲數據的大小為(N-1)*min(S1,S2,S3,S4....)。

   RAID4

和RAID3類似,RAID4不是以位元組為存取單位,RAID4的數據以塊(一般為512位元組)為單位,如下圖:

以塊為單位帶來的好處就是,減少了奇偶檢驗的次數,比如,如果一段數據的大小為10個位元組,在RAID3上可能需要計算2次奇偶檢驗值了,但是在RAID4上,10個位元組都會被放在第一個磁碟上,並不需要計算。

 

 RAID4的優缺點:

1.較高的容錯能力;

2.提高了小量數據的I/O能力;

3.RAID4需要N塊磁碟(N>=3);

4.能夠存儲數據的大小為(N-1)*min(S1,S2,S3,S4....)。

  RAID5

RAID5可以理解成是RAID0和RAID1的折中方案,把數據條帶化後存儲,並且將數據奇偶檢驗值存儲在所有的硬碟上,如下圖:

數據被條帶化存儲到了磁碟上,並且每個磁碟上都能夠存儲奇偶檢驗值,其讀寫速度和RAID0差不多,可能寫的時候要慢一點,比較要計算奇偶檢驗,這樣,即使壞掉一塊磁碟,只需要更換上好的磁碟,RAID會利用剩下奇偶檢驗去重建磁碟上的數據。

 

 RAID5的優缺點:

1)較高的容錯能力;

2)讀寫速度快;

3)RAID4需要N塊磁碟(N>=3);

4)能夠存儲數據的大小為(N-1)*min(S1,S2,S3,S4....)。

 

 RAID6

與RAID5類似,只是增加了第二個獨立的奇偶檢驗信息塊,使用了兩種不同的奇偶檢驗演算法,如下圖所示:

數據仍然是被條帶化得存儲在磁碟上,但是會計算出兩個獨立的奇偶檢驗值,相對於RAID5來說有更多的I/O操作和計算量,所以RAID6通常不會以軟體來實現,一般會使用硬體實現,RAID6也是最常見的磁碟陣列。

 

 RAID6的優缺點:

1)較高的容錯能力

2)同一RAID6中最多運行同時損壞2塊磁碟,更換磁碟後,數據將被重新計算寫入;

3)RAID6需要N個磁碟(N>=4);

4)RAID容量為(N-2)*min(s1,s2,s3,...)

   RAID 01

RAID 01是一種混合的磁碟陣列,即是RAID0和RAID1的混合,先做條帶,再做鏡像:

RAID01中,同組RAID0只要出現一個磁碟損壞,那麼這個RAID 0就不能你使用了,值剩下其他組的磁碟運作,可靠性較低。

 

 RAID01的優缺點:

1)數據可靠性低

2)RAID01需要N個磁碟(N>=4)

   RAID 10

和RAID 01相反,RAID10是先做RAID1,再做RAID0,如下圖所示:

RAID10和RAID01在讀寫速度上沒有什麼太大的差別,但是RAID10的數據安全性比較高,若下圖左邊那組RAID1中磁碟損壞了一個,另外一個也能用,右邊那組RAID1再損壞一個數據也是恢復的,除非一組RAID1中的磁碟都壞掉了。

 

 RAID 10的優缺點:

1)較高的容錯能力

2)RAID10需要N個磁碟(N>=4)

 

 RAID 50

RAID 50是RAID5和RAID0的組合,先做RAID5,再做RAID0,RAID 5至少需要3顆硬碟,因此要以多組RAID 5構成RAID 50,至少需要6顆硬碟,如下圖。

在底層的任意一組或者多組的RAID5中出現了一個磁碟的損壞是可以接受的,但是若出現了2個或者以上的磁碟損壞,整個RAID50就會損壞。

 

RAID50的優缺點:

1)較高的容錯能力

2)RAID10需要N個磁碟(N>=6)

  JBOD

Just a Bunch of Disks,能夠將多塊磁碟的空間合併起來的一個連續的空間,可靠性較低。

 

在Linux系統上實現Software RAID

 在centos中,使用模塊化得工具mdadm,如果沒有可以使用:

yum -y install mdadm
 基本用法如下:
命令的語法格式:mdadm [mode] <raiddevice> [options] <component-devices>
-C:創建模式
    -n #: 使用#個塊設備來創建此RAID;
    -l #:指明要創建的RAID的級別;
    -a {yes|no}:自動創建目標RAID設備的設備文件;
    -c CHUNK_SIZE: 指明塊大小;
    -x #: 指明空閑盤的個數;
-D:顯示raid的詳細信息
    mdadm -D  /dev/md#
管理模式:
    -f:標記指定磁碟為損壞
    -a:添加磁碟
    -r:移除磁碟
停止md設備:
    mdadm -S /dev/md#

舉例:創建一個可用空間為10G的RAID1設備,文件系統為ext4,有一個空閑盤,開機可自動掛載至/backup目錄。

先來分析一下:RAID1為鏡像磁碟陣列,最少需要2個磁碟,可用空間為10G,即磁碟最小大小為10G即可,我們這裡就使用1塊硬碟的不同分區來模擬各個磁碟,每個10G:

[root@localhost ~]# fdisk -l /dev/sdb
Disk /dev/sdb: 128.8 GB, 128849018880 bytes
255 heads, 63 sectors/track, 15665 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xf9b59c0f
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        1306    10490413+  83  Linux
/dev/sdb2            1307        2612    10490445   83  Linux
/dev/sdb3            2613        3918    10490445   83  Linux

 使用以下命令創建RAID1系統,-C為創建模式,/dev/md0設備文件名,-n 2:使用2個塊設備創建此RAID,-x 1:指定1個空閑盤的,-l:指定硬碟RAID等級,-a yes:自動創建RAID的設備文件,/dev/adb{1,2,3}:指定磁碟位置

[root@localhost ~]# mdadm -C /dev/md0 -n 2 -x 1 -l 1 -c 128 -a yes /dev/sdb{1,2,3}
mdadm: Note: this array has metadata at the start and
    may not be suitable as a boot device.  If you plan to
    store '/boot' on this device please ensure that
    your boot-loader understands md/v1.x metadata, or use
    --metadata=0.90
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

 使用 cat /proc/mdstat 查看RAID構建的進度和預期完成的時間:

unused devices: <none>
[root@localhost ~]# cat /proc/mdstat 
Personalities : [raid1] 
md0 : active raid1 sdb3[2](S) sdb2[1] sdb1[0]
      10482176 blocks super 1.2 [2/2] [UU]
      [=============>.......]  resync = 68.6% (7200128/10482176) finish=0.2min speed=200001K/sec
      
unused devices: <none>
[root@localhost ~]# cat /proc/mdstat 
Personalities : [raid1] 
md0 : active raid1 sdb3[2](S) sdb2[1] sdb1[0]
      10482176 blocks super 1.2 [2/2] [UU]
      
unused devices: <none>
 查看RAID1的詳情:
[root@localhost ~]# mdadm -D /dev/md0 
/dev/md0:
        Version : 1.2
  Creation Time : Sun Jul 30 05:16:32 2017
     Raid Level : raid1
     Array Size : 10482176 (10.00 GiB 10.73 GB)
  Used Dev Size : 10482176 (10.00 GiB 10.73 GB)
   Raid Devices : 2
  Total Devices : 3
    Persistence : Superblock is persistent
    Update Time : Sun Jul 30 05:17:25 2017
          State : clean 
 Active Devices : 2
Working Devices : 3
 Failed Devices : 0
  Spare Devices : 1
           Name : localhost.localdomain:0  (local to host localhost.localdomain)
           UUID : a46c7642:a46e274a:05923aeb:4c1ae0e9
         Events : 17
    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       1       8       18        1      active sync   /dev/sdb2
       2       8       19        -      spare   /dev/sdb3

 格式化RAID1為ext4文件系統:

[root@localhost ~]# mkfs.ext4 /dev/md0 
mke2fs 1.41.12 (17-May-2010)
文件系統標簽=
操作系統:Linux
塊大小=4096 (log=2)
分塊大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
655360 inodes, 2620544 blocks
131027 blocks (5.00%) reserved for the super user
第一個數據塊=0
Maximum filesystem blocks=2684354560
80 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
正在寫入inode表: 完成                            
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
This filesystem will be automatically checked every 35 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
 將/dev/md0掛載到/backup目錄下:
[root@localhost ~]# mount /dev/md0 /backup/
[root@localhost ~]# 
[root@localhost ~]# df
Filesystem                   1K-blocks    Used Available Use% Mounted on
/dev/mapper/VolGroup-lv_root  51606140 1122252  47862448   3% /
tmpfs                           953276       0    953276   0% /dev/shm
/dev/sda1                       495844   33466    436778   8% /boot
/dev/mapper/VolGroup-lv_home  67708512  184084  64085020   1% /home
/dev/md0                      10317624  154100   9639416   2% /backup

 可以使用 -f 將其中的某個磁碟模擬為壞的故障硬碟

[root@localhost backup]# mdadm /dev/md0 -f /dev/sdb1
mdadm: set /dev/sdb1 faulty in /dev/md0
 再來看一下RAID1的詳細信息,/dev/sdb3狀態變為active
[root@localhost backup]# mdadm -D /dev/md0 
/dev/md0:
        Version : 1.2
  Creation Time : Sun Jul 30 05:16:32 2017
     Raid Level : raid1
     Array Size : 10482176 (10.00 GiB 10.73 GB)
  Used Dev Size : 10482176 (10.00 GiB 10.73 GB)
   Raid Devices : 2
  Total Devices : 3
    Persistence : Superblock is persistent
    Update Time : Sun Jul 30 05:37:02 2017
          State : clean 
 Active Devices : 2
Working Devices : 2
 Failed Devices : 1
  Spare Devices : 0
           Name : localhost.localdomain:0  (local to host localhost.localdomain)
           UUID : a46c7642:a46e274a:05923aeb:4c1ae0e9
         Events : 38
    Number   Major   Minor   RaidDevice State
       2       8       19        0      active sync   /dev/sdb3
       1       8       18        1      active sync   /dev/sdb2
       0       8       17        -      faulty   /dev/sdb1

 使用 -r 選項能夠移除壞的硬碟

[root@localhost backup]# mdadm /dev/md0 -r /dev/sdb1
mdadm: hot removed /dev/sdb1 from /dev/md0
 好的,我們再來添加一塊分區當做磁碟
[root@localhost backup]# fdisk /dev/sdb
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Selected partition 4
First cylinder (3919-15665, default 3919): 
Using default value 3919
Last cylinder, +cylinders or +size{K,M,G} (3919-15665, default 15665): +10G
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: 設備或資源忙.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)

 咦,有告警!因為當前的磁碟已經有分區被掛載當根文件系統的目錄上了,內核沒有識別,我們來查看/proc/parttions,果真沒有識別

[root@localhost backup]# cat /proc/partitions 
major minor  #blocks  name
   8       16  125829120 sdb
   8       17   10490413 sdb1
   8       18   10490445 sdb2
   8       19   10490445 sdb3
   8        0  125829120 sda
   8        1     512000 sda1
   8        2  125316096 sda2
 253        0   52428800 dm-0
 253        1    4096000 dm-1
 253        2   68788224 dm-2
   9        0   10482176 md0
 使用以下命令通知內核強制重讀以下磁碟分區表
[root@localhost backup]# partx -a  /dev/sdb

 添加/dev/sdb4到RAID1

[root@localhost backup]# mdadm /dev/md0 -a /dev/sdb4
mdadm: added /dev/sdb4
 查看RAID1的詳細信息,/dev/sdb4成功被加入
[root@localhost backup]# mdadm -D /dev/md0
/dev/md0:
        Version : 1.2
  Creation Time : Sun Jul 30 05:16:32 2017
     Raid Level : raid1
     Array Size : 10482176 (10.00 GiB 10.73 GB)
  Used Dev Size : 10482176 (10.00 GiB 10.73 GB)
   Raid Devices : 2
  Total Devices : 3
    Persistence : Superblock is persistent
    Update Time : Sun Jul 30 05:51:52 2017
          State : clean 
 Active Devices : 2
Working Devices : 3
 Failed Devices : 0
  Spare Devices : 1
           Name : localhost.localdomain:0  (local to host localhost.localdomain)
           UUID : a46c7642:a46e274a:05923aeb:4c1ae0e9
         Events : 40
    Number   Major   Minor   RaidDevice State
       2       8       19        0      active sync   /dev/sdb3
       1       8       18        1      active sync   /dev/sdb2
       3       8       20        -      spare   /dev/sdb4

 設置開機可以自動掛載只/backup目錄下,修改配置文件/etc/fstab即可

#
# /etc/fstab
# Created by anaconda on Fri Jul 28 06:34:35 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/VolGroup-lv_root /                       ext4    defaults        1 1
UUID=bc67ad74-46b3-4abc-b8a7-c4fb7cd6552a /boot                   ext4    defaults        1 2
/dev/mapper/VolGroup-lv_home /home                   ext4    defaults        1 2
/dev/mapper/VolGroup-lv_swap swap                    swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/md0                /backup                 ext4    defaults        0 0

 

小知識點: 在查看RAID創建過程的進度時候,可加上watch命令動態查看創建RAID的進度 watch  [options]  'COMMAND' 選項  -n# :指定刷新間隔,單位秒
watch -n1 'cat /proc/mdstat'

 

 

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

-Advertisement-
Play Games
更多相關文章
  • URI
    URI 一、介紹 ...
  • intent Filter 一、介紹 如果一個 Intent 請求在一片數據上執行一個動作, Android 如何知道哪個應用程式(和組件)能用來響應這個請求呢? Intent Filter就是 用來註冊 Activity 、 Service 和 Broadcast Receiver 具有能在某種數 ...
  • 有 App 源碼時,可以直接查看 AndroidManifest.xml 文件。 " xmlns:android="http://schemas.android.com/apk/res/android"> 只有 apk 安裝包時,可以通過 Android SDK 中的aapt(build-tools... ...
  • 隱式intent 一、隱式意圖介紹 顯式意圖我們前面已經提到,形如: Intent intent = new Intent(); intent.setClass(this,Other.class); //此句表示顯式意圖,因為明確設置激活對象為Other類 startActivity(intent) ...
  • 許可權是執行特殊SQL語句的權利。資料庫管理員 (DBA) 是一個具有授予用戶訪問資料庫及其對象的能力的高級用戶。用戶需要系統許可權來訪問資料庫,需要對象許可權來操縱資料庫中對象的內容。用戶也可以將被授予的許可權給其它用戶或者角色,角色是相關許可權的命名分組。方案是對象的集合,例如,視圖和序列的集合。方案被數 ...
  • oracle存儲過程開發相關知識彙總:此篇主要介紹和存儲過程有密切關係的Oracle JOB的方方面面,包括有它的初始化許可權、初始化參數job_queue_processes、dbms_job系統包內部參數及存儲過程的詳解分析和調用範例來增刪改查JOB、JOB涉及的表和視圖的分析、JOB的失敗重試以... ...
  • 參考其他文章列舉存儲過程的優劣,據此分析目前智慧電站總項目下,還有那些地方的資料庫操作,適合使用存儲過程進行優化。 存儲過程是什麼? 儲存程式 (Stored Procedure),又可稱預儲程式或者存儲過程,是一種在資料庫中存儲複雜程式,以便外部程式調用的一種資料庫對象,它可以視為資料庫中的一種函 ...
  • 為了保持對Linux的熟悉度,MacBookPro一般放在公司,家裡(每次用這個詞是我覺得最糾結的時候,我現在有家嗎?)用的是普通筆記本裝了深度Linux。 之所以安裝深度,主要的原因應該是支持國產吧。 可能是從Windows延續過來的習慣吧,文件管理器一直是我使用頻率最高的軟體。但深度一直以來的迭 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...