DRBD 數據鏡像軟體

来源:http://www.cnblogs.com/xiaocheche/archive/2017/10/16/7679338.html
-Advertisement-
Play Games

1》DRBD介紹 1>數據鏡像軟體DRBD介紹 分散式塊設備複製(Distributed Relicated Block Deivce,DRBD),是一種基於軟體、基於網路的塊複製存儲解決方案,主要用於對伺服器之間的磁碟分 區、邏輯捲等進行數據鏡像,當用戶將數據寫入本地磁碟時,還會將數據發送到網路中 ...


1》DRBD介紹

    1>數據鏡像軟體DRBD介紹

                  分散式塊設備複製(Distributed Relicated Block Deivce,DRBD),是一種基於軟體、基於網路的塊複製存儲解決方案,主要用於對伺服器之間的磁碟分                       區、邏輯捲等進行數據鏡像,當用戶將數據寫入本地磁碟時,還會將數據發送到網路中另一臺主機的磁碟上,這樣的本地主機(主節點)與遠程主機(備節點)                    的數據就可以保證實時同步,當本地主機出現問題,遠程主機上還保留著一份相同的數據,可以繼續使用,保證了數據的安全;

    2>DRBD的基本功能                               

        DRBD的核心功能就是數據的鏡像,其實現方式是通過網路來鏡像整個磁碟設備或者磁碟分區,將一個節點的數據通過網路實時地傳送到另外一個遠                        程節點,保證兩個節點間數據的一致性,這有點類似於一個網路RAID1的功能,對於DRBD數據鏡像來說,它具有如下特點:

      實時性: 當應用對磁碟數據有修改操作時,數據複製立即發生;

      透明性: 應用程式的數據存儲在鏡像設備上是透明和獨立的,數據可以存儲在基於網路不同伺服器上;

      同步鏡像: 當本地應用申請寫操作時,同時也在遠程主機上開始進行寫操作;

      非同步鏡像: 當本地寫操作已經完成時,才開始對遠程主機上進行寫操作;

    3>DBRD的構成                           

      DRBD是Linux內核存儲層中的一個分散式存儲系統,具體來說兩部分構成,

      (1)  一部分:內核模板,主要用於虛擬一個塊設備;

      (2)  一部分:是用戶控制項管理程式,主要用於和DRBD內核模塊通信,以管理DRBD資源,

           在DRBD中,資源主要包含DRBD設備,磁碟配置,網路配置等;

          一個DRBD系統有兩個以上的節點構成,分為主節點和備節點兩個角色,在主節點上,可以對DRBD設備進行不受限制的讀寫操作,可以用初始化、創                     建、掛在文件系統,在備節點上,DRBD設備無法掛載,只能用來接收主節點發送過來的數據,也就是說備節點不能用於讀寫訪問,這樣的目的是保證數據                  緩衝區的一致性;

          主用節點和備用節點不是一成不變的。可以通過手工的方式改變節點的角色,備用節點可以升級為主節點,主節點也降級為備節點;

          DRBD設備在整個DRBD系統中位於物理塊設備上,文件系統之下,在文件系統和物理磁碟之間形成了一個中間層,當用戶在主節點的文件系統中寫入                    數據時,數據被正式寫入磁碟前會被DRBD系統截獲,同時,DRBD在捕捉到有磁碟寫入的操作時,就會通知用戶控制項管理程式把這些數據複製一份。寫入                    遠程主機的DRBD鏡像,然後存入DRBD鏡像所有映射的遠程主機磁碟;

                                    

                    DRBD負責接收數據,把數據寫到本地磁碟,然後發送給另一臺主機,另一臺主機再將數據存到自己的磁碟中,目前,DRBD每次只允許對一個節點                     進行讀寫訪問,這對於通常的故障切換高可用性集群來講已經足夠用了;

      4>DRBD與集群的關係

                             DRBD由兩個或者兩個以上節點構成,與HA集群類似,也有主節點和備節點之分,因而經常用於高可用集群和負載集群系統中作,由於DRBD系                     統是在IP網路運行,所以,在集群中使用DRBD作為共用存儲設備,不需要任何硬體投資,可以節約很多成本,因為在價格上IP網路要比專用的存儲網路更加                 經濟。另外DRBD也可以用於數據備份、數據容災等方面;

     5>DRBD的主要特性                        

      DRBD系統在實現數據鏡像方面有很多有用的特性,我們可以根據自己的需求和應用環境,選擇合適自己的功能特性。下麵介紹DRBD幾個非常重要的特                   性:

    (1)單主模式:

        這是使用最頻繁的一種模式,主要用於在高可用集群的數據存儲方面,解決集中數據共用的問題,在這種模式下,集群中只有一個主節點可以對數據                      進行讀寫操作,可以用在這種模式下的文件系統有EXT3 EXT4 XFS等;

    (2)雙主模式:

        這種模式只能在DRBD8.0以後的版本使用,主要用於負載均衡集中,解決數據共用和一致性問題,在這種模式下,集群中存在兩個主節點,由於兩個                    主節點都有可能對數據進行併發操作的讀寫操作,因此單一的文件系統就無法滿足需求了,因此需要共用的集群文件系統來解決併發讀寫問題,常用在這                      種模式下的文件系統有GFS,OCFS2等,通過集群文件系統的分散式鎖機制就可以解決集群中兩個主節點同時操作數據的問題;

    (3)複製模式

      DRBD提供了三種不同的複製方式,分別是;

      協議A: 只要本地磁碟寫入已經完成,數據包已經在發送隊列中,則認為一個寫操作過程已經完成,這種方式在遠程節點故障或者網路故障時,可能造成                                   數據丟失,因為要寫入到遠程節點的數據可能還在發送隊列中;

      協議B:只要本地磁碟寫入已經完成,並且數據包已經到達遠程節點,則認為一個寫操作過程已經完成,這種方式在遠程節點發生故障時,肯能造成數據丟                                   失;

      協議C: 只有本地和遠程節點的磁碟已經都確認了寫操作完成,則認為一個寫操作過程已經完成,這種方式沒有任何數據丟失,就目前而已應用最多,最廣                                  泛的就是協議C,旦在此方式下磁碟的I/O的吞吐量依賴於網路帶寬,建議在網路帶寬比較好的情況下使用這種方式。

          protocol C; #使用drbd的同步協議

 

    (4)傳輸的完整性校驗

           這個特性在DRBD8.20及以後版本中可以使用,DRBD使用MD5、SHA-1,或者CRC 32C等加密演算法對信息進行終端到終端的完整性驗證,利用這個特                    性,DRBD對每一個複製到遠程節點數據都生成信息摘要,同時,遠程節點也採用同樣的方式對複製的數據塊進行完整性驗證,如果驗證信息不對,就請求                    主節點重新發送,通過這種方式保證鏡像數據的完整性和一致性;

    (5)腦裂通知和自動修複。

          由於集群節點之間的網路連接臨時故障、集群軟體管理干預或者人為錯誤,導致DRBD兩個節點都切換為主節點而斷開連接,這就是DRBD的腦裂問                        題,發生腦裂意味著數據不能同步從主節點複製到備用節點,這樣導致DRBD兩個節點的數據不一致,並且無法合併,  在DRBD8.0以及更高的版本,實現了                    腦裂自動修複功能,在DRBD8.2.1之後。又實現了腦裂通知特性,在出現腦裂後,一般建議通過手工方式修複腦裂問題;

 2》DRBD安裝

    1>環境描述                     

      系統版本:redhat6.4 x64(內核2.6.32)

      DRBD版本:    DRBD-8.4.3

      node1:  10.0.0.201(主機名:master)

      node2:  10.0.0.202 (主機名:slave)

      (node1)為僅主節點配置 Primary

      (node2)為僅從節點配置Secondary

      (node1,node2)為主從節點共同配置

     2>伺服器時間同步以及關閉防火牆Selinux                          

      #/etc/init.d/iptables stop  關閉防火牆

      #setenforce 0        關閉Selinux

      # cat /etc/selinux/config

        SELINUX=disabled

      #ntpdate -u asia.pool.ntp.org  真實環境這樣同步

      # date –s “2014-09-24 15:55:33” 測試時間。臨時可以這樣同步,兩台機器都迅速執行此命令

    3>修改主機名       

      #:vim /etc/sysconfig/network   主節點 201

        HOSTNAME=master

       #:vim /etc/sysconfig/network   從節點202

        HOSTNAME=slave

      如果使用虛擬機器做測試,還沒有增加硬碟的的話,請關閉虛擬機器,開始增加一塊硬碟,如果原有的虛擬機硬碟還有空間的話。拿出一塊空間,做一個分                      區也行;

    4>所有節點增加硬碟            

      在主節點201 和從節點202上。劃分增加的/dev/sdb 硬碟。進行分區

      # fdisk /dev/sdb

       分一個叫做/dev/sdb1分區出來就可以,註意千萬不要格式化它,劃分出來就行了,不需要格式化;

    5>所有的節點安裝       

      在主節點201和從節點202上同時安裝

      # wget http://oss.linbit.com/drbd/8.4/drbd-8.4.3.tar.gz

      # tar zxvf drbd-8.4.3.tar.gz

      # cd drbd-8.4.3

      # ./configure --prefix=/usr/local/drbd --with-km --with-heartbeat  km代表開啟內核模塊

      ./configure命令中添加--with-heartbeat,安裝完成後會在/usr/local/drbd/etc/ha.d /resource.d生成drbddisk和drbdupper文件,把這兩個文件複製                                        到/usr/local/heartbeat/etc/ha.d /resource.d目錄,命令cp -R /usr/local/drbd/etc/ha.d/resource.d/* /etc/ha.d/resource.d;

      # make KDIR=/usr/src/kernels/2.6.32-279.el6.x86_64/

      # make install

      # mkdir -p /usr/local/drbd/var/run/drbd

      # cp /usr/local/drbd/etc/rc.d/init.d/drbd /etc/rc.d/init.d

      # chkconfig --add drbd

      # chkconfig drbd on

       載入DRBD模塊:

      # modprobe drbd

      查看DRBD模塊是否載入到內核:

      # lsmod |grep drbd

    6>所有節點配置文件               

      在主節點201和從節點202 配置文件保持一致。

      # /usr/local/drbd/etc/drbd.conf

        drbd.conf 包含了2個類型的文件。為了方便起見全局配置和資源配置分開了。global_common.conf為固定全局配置文件,*.res 可以包含多個,跟                               Nginx虛擬機器一樣*.res 帶包含了所有的資源文件;

              

            

      (1)  修改全局配置文件:

        global {

                usage-count yes; #是否參加drbd的使用者統計,預設此選項為yes

                # minor-count dialog-refresh disable-ip-verification

        }

 

      common {

                protocol C; #使用drbd的同步協議

              handlers {

                        # These are EXAMPLE handlers only.

                        # They may have severe implications,

                        # like hard resetting the node under certain circumstances.

                        # Be careful when chosing your poison.

 

                     pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f"; #預設                                是註釋的開啟來

                     pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f"; #預設是                                  註釋的開啟來

                     local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f";  #預設是註釋的開                                  啟來

                    # fence-peer "/usr/lib/drbd/crm-fence-peer.sh";

                    # split-brain "/usr/lib/drbd/notify-split-brain.sh root";

                    # out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";

                    # before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k";

                    # after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;

           }

 

            startup {

                      # wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb

            }

 

            options {

                      # cpu-mask on-no-data-accessible

            }

 

            disk {

                    on-io-error detach;  #配置I/O錯誤處理策略為分離

                    # size max-bio-bvecs on-io-error fencing disk-barrier disk-flushes

                    # disk-drain md-flushes resync-rate resync-after al-extents

                    # c-plan-ahead c-delay-target c-fill-target c-max-rate

                    # c-min-rate disk-timeout

              }

 

            net {

                    # protocol timeout max-epoch-size max-buffers unplug-watermark

                    # connect-int ping-int sndbuf-size rcvbuf-size ko-count

                    # allow-two-primaries cram-hmac-alg shared-secret after-sb-0pri

                    # after-sb-1pri after-sb-2pri always-asbp rr-conflict

                    # ping-timeout data-integrity-alg tcp-cork on-congestion

                    # congestion-fill congestion-extents csums-alg verify-alg

                    # use-rle

            }

          syncer {

              rate 1024M; #設置主備節點同步時的網路速率

    }

  }

     

    (2)創建資源配置文件

      資源文件需要自己手工創建,目錄是在/usr/local/drbd/etc/drbd.d下麵

      #cd /usr/local/drbd/etc/drbd.d

      # vim  drbd.res

      resource  r1 {   #這個r1是定義資源的名字

      on  master{            #on開頭,後面是主機名稱

      device    /dev/drbd0; #drbd設備名稱

      disk      /dev/sdb1;   #drbd0使用的磁碟分區為sdb1

      address   10.0.0.201:7789; #設置drbd監聽地址與埠

      meta-disk  internal;

    }

    on  slave{           #on開頭,後面是主機名稱

    device    /dev/drbd0;  #drbd設備名稱

    disk      /dev/sdb1;   #drbd0使用的磁碟分區為sdb1

    address   10.0.0.202:7789; #設置drbd監聽地址與埠

    meta-disk  internal;

    }

    }

      7>激活節點啟動服務                

    在主節點201 從節點202 做同樣的操作

      (1)激活和創建設備塊

        # mknod /dev/drbd0 b 147 0

        # drbdadm create-md r1   資源名稱為r1

        等待片刻,顯示success表示drbd塊創建成功

        Writing meta data...

        initializing activity log

        NOT initializing bitmap

        New drbd meta data block successfully created.

      (2)如果卡主不動了。再次輸入該命令:

        # drbdadm create-md r1

         成功激活r0

        ----------------

        [need to type 'yes' to confirm] yes

        Writing meta data...

        initializing activity log

        NOT initializing bitmap

        New drbd meta data block successfully created.

      (3)準備啟動服務: 啟動DRBD服務:(node1,node2)

        註:需要主從共同啟動方能生效

        # service drbd start

      (4)查看狀態:(node1,node2)

        # cat /proc/drbd 或  # service drbd status 

          version: 8.4.3 (api:1/proto:86-101)

          GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by [email protected],

          2013-05-27 20:45:19

          0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----

          ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:1060184

          這裡ro:Secondary/Secondary表示兩台主機的狀態都是備機狀態,ds是磁碟狀態,顯示的狀態內容為“不一致”,這是因為DRBD無法判斷哪一方                                      為主機,應以哪一方的磁碟數據作為標準;

      (5)授權節點201為,主節點

        # drbdsetup /dev/drbd0 primary --force

      (6)分別查看主從DRBD狀態:            

          1)(主節點201 node1)

            # service drbd status

            --------------------

            drbd driver loaded OK; device status:

            version: 8.4.3 (api:1/proto:86-101)

            GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by [email protected],

            2017-10-16 20:45:19

            m:res  cs         ro                 ds                 p  mounted  fstype

            0:r0   Connected  Primary/Secondary  UpToDate/UpToDate  C

            ===============================================================================

          .2)(從節點202 node2)

            # service drbd status

            drbd driver loaded OK; device status:

            version: 8.4.3 (api:1/proto:86-101)

            GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by [email protected],

            2017-10-16 20:49:06

            m:res  cs         ro                 ds                 p  mounted  fstype

            0:r0   Connected  Secondary/Primary UpToDate/UpToDate  C

            ---------------------

            ro在主從伺服器上分別顯示 Primary/Secondary和Secondary/Primaryds顯示UpToDate/UpToDate表示主從配置成功。

       8>掛在drbd0設備(主節點201)                                

      從剛纔的狀態上看到mounted和fstype參數為空,所以我們這步開始掛載DRBD到系統目錄

      # mkdir /data

      # mkfs.ext4 /dev/drbd0

      # mount  /dev/drbd0 /data

        註:Secondary節點上不允許對DRBD設備進行任何操作,包括只讀,所有的讀寫操作只能在Primary節點上進行,只有當Primary節點掛掉時,                                 Secondary節點才能提升為Primary節點繼續工作

      9>模擬DRBD1 故障,DRBD2()接管並提升為Primary         

      1)(節點201 node1)  故障

        # cd /data

        # touch 1 2 3 4 5

        # cd ..

        # umount  /data

        # drbdsetup /dev/drbd0 secondary  故障後。降級為從

          註:這裡實際生產環境若DRBD1宕機,在DRBD2狀態信息中ro的值會顯示為Secondary/Unknown,只需要進行DRBD提權操作即可。

        # service drbd status

        (節點202 node2 提權為主)

        # drbdsetup /dev/drbd0 primary   提權為主
        #  mount  /dev/drbd0 /data

        # cd /data 
        # touch 6 7 8 9 10 
        # ls

          1  10  2  3  4  5  6  7  8  9  lost+found

        # service drbd status

        不過如何保證DRBD主從結構的智能切換,實現高可用,這裡就需要Heartbeat來實現了,Heartbeat會在DRBD主端掛掉的情況下,自動切換從端為主                              端並自動掛載/data分區;

      總結: 這裡是DRBD官方推薦的手動恢復方案:

        假設你把Primary的eth0宕掉,然後直接在Secondary上進行主Primary主機的提升,並且mount上,你可能會發現在 Primary上測試考入的文件確實同             步過來了,之後把Primary的eth0恢復後,看看有沒有自動恢復 主從關係。經過查看,發現DRBD檢測出了Split-Brain的狀況,也就是兩個節點都處於standalone             狀態,故障描述如下:Split- Brain detected,dropping connection! 這就是傳說中的“腦裂” ;

      (node2)

      # drbdadm secondary r0

      # drbdadm disconnect all

      # drbdadm --discard-my-data connect r0

      (node1)

      # drbdadm disconnect all

      # drbdadm connect r0

      # drbdsetup /dev/drbd0 primary

 


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

-Advertisement-
Play Games
更多相關文章
  • 獨立索引: 獨立索引是指索引列不能是表達式的一部分,也不能是函數的參數 例1: SELECT actor_id FROM actor WHERE actor_id+1=5 --這種寫法,就算在actor_id上建立了索引,也不起效 例2: SELECT .... WHERE TO_DAYS(CURR ...
  • mysql允許在相同列上創建多個索引,無論是有意還是無意,mysql需要單獨維護重覆的索引,並且優化器在優化查詢的時候也需要逐個地進行考慮,這會影響性能。 重覆索引是指的在相同的列上按照相同的順序創建的相同類型的索引,應該避免這樣創建重覆索引,發現以後也應該立即刪除。但,在相同的列上創建不同類型的索 ...
  • 聚類 在瞭解譜聚類之前,首先需要知道聚類,聚類通俗的講就是將一大堆沒有標簽的數據根據相似度分為很多簇(就是一坨坨的),將相似的聚成一坨,不相似的再聚成其他很多坨。一般的聚類演算法存在的問題是k值的選擇(就是簇的數量事先不知道),相似性的度量(如何判斷兩個樣本點是否相似),如何不陷入局部最優等問題,流行 ...
  • 序列:是oracle提供的,用於產生唯一數值的對象,主要配合表的單一主鍵使用。 創建序列: create sequence seq_NAME//命名 start with 1//初始值 increment by 1//遞增值 minvalue 1//最小值,可預設,採用系統預設值 maxvalue ...
  • 索引(Index):幫助Mysql高效獲取數據的一種數據結構。用於提高查找效率,可以比作字典。可以簡單理解為排好序的快速查找的數據結構。 索引的作用:便於查詢和排序(所以添加索引會影響where 語句與 order by 排序語句)。 在數據之外,資料庫還維護著滿足特定查找演算法的數據結構,這些數據結... ...
  • 用戶提交 MapReduce 作業後,JobClient 會調用 InputFormat 的 getSplit方法 生成 InputSplit 的信息。 一個 MapReduce 任務可以有多個 Split,其用於分割用戶的數據源,根據用戶設定的切割大小把數據源切割成 InputSplit元數據和 ...
  • ...
  • 1.創建分區 先查看下是否有磁碟沒有分區 fdisk -l 其中第一個框和第二個框,是已經分好區的不同磁碟。 開始分區 輸入m,可以查看有哪些操作 輸入p 查看當前硬碟分區,目前有一個分區。 輸入n新建一個分區,輸入p 建立分區,輸入分區編號2代表建立第二個分區 然後會讓你設置開始扇區,直接進行回車 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...