集羣(Cluster):多個計算機組成,爲了解決某個問題的集合,一般是爲了提升系統的性能;
集羣分爲:負載均衡集羣(LB)、高可用集羣(HA)、高性能集羣(HP); ------------這裏只介紹LB和HA,以及HA中的keepalived前端
1、負載均衡集羣(LB Cluster):
基於硬件實現:、F5 Big_IP、Citrix Netscaler、A10公司的A10
基於軟件實現:lvs、httpd、nginx、haproxy、ats、perlbal(基於Perl語言)、pound、...
基於工做的網絡協議分層實現負載均衡:傳輸層(四層交換技術(OSI);lvs、nginx基於stream實現、haproxy基於TCP model實現)和應用層(七層交換技術;http/https、fastcgi、mysql協議)mysql
lvs:Linux Virtual Server(調度器接收用戶請求,而後將請求轉發給後臺real server來響應客戶端請求)
lvs的軟件組成:
ipvsadm/ipvs
ipvsadm:用戶空間中的命令行工具,管理集羣服務規則及後端real server的管理;
ipvs:工做於內核空間中的netfilter框架中的hook_input()鉤子上的一個框架;能夠接受來自ipvsadm的管理命令;ipvs能夠管理諸如:TCP、UDP、SCTP、AH、ESP、AH_ESP等協議,並能夠對此類協議的數據報文進行調度轉發;linux
lvs集羣服務中的經常使用術語:
vs:Virtual Server
rs:Real Server(lvs中術語),Upstream Server(nginx中的語法術語),Backend Server
地址標識術語:
CIP:Client IP客戶端IP地址,即:請求發送方的IP地址,通常是公有地址;
VIP:Virtual IP,虛擬服務器的虛擬IP地址,客戶端訪問的目的地址;
DIP:Director IP,調度器IP地址,向後端的Real Server轉發客戶端請求時使用的IP地址;
RIP:Real Server IP,後端真實服務器的IP地址;nginx
lvs的調度算法(scheduler):
根據lvs在調度時是否考慮各RS的當前負載狀態,能夠將調度算法分爲兩類:靜態算法和動態算法
1.靜態算法:根據算法自己的特色進行調度;注重起點公平;
RR:RoundRobin,輪詢算法;
WRR:Weighted RR,帶有權重的輪詢算法;加權輪詢;
SH:Source Hashing,源地址哈希;未來自於同一個IP地址的請求始終發日後端第一次被挑選出來的RS,從而能夠實現會話粘性;
DH:Destination Hashing,目標地址哈希;將發往同一目標地址的請求,始終發送至後端第一次挑選出來的RS;通常用於正向代理服務器集羣的調度;
2.動態算法:根據每一個RS當前的負載狀態進行調度,注重結果公平; //後端的RS的負載狀態,一般使用Overhead表示,不一樣的算法中Overhead的計算公式不同;
1)LC:least connections,最小鏈接數;
鏈接狀態有兩種:一種是active connections(活動鏈接),另外一種是inactive connections(非活動鏈接)
Overhead計算公式:Overhead=active connections 256 + inactive connections
注意:第一次調度時,由於後端的RS上並無任何的active或inactive鏈接,因此按照配置順序自上而下進行調度分配;屬於輪詢開始;
2)WLC:Weighted LC,加權的最小鏈接算法;默認算法;
Overhead計算公式:Overhead=(active connections 256 + inactive connections)/weight
注意:第一次調度時,由於後端的RS上並無任何的active或inactive鏈接,因此按照配置順序自上而下進行調度分配;屬於輪詢開始;權重值在第一次調度時不發揮任何做用;
3)SED:Shortest Expection Deley,最短時間望延遲;
Overhead計算公式:Overhead=(active connections + 1)*256/Weight
注意:SED算法能夠解決起點不公平問題,可是權重差距比較大,可能會致使不公平結果;
4)NQ:Never Queue,永無隊列;改進版的SED算法;首次調度時,根據後端RS的權重依次爲每一個RS分配一個鏈接,而後再按照SED算法進行調度;必然會保證後端每臺RS至少有一個active connection;
5)LBLC:Locality-Based Lease Connections,基於本地的最少鏈接;動態的DH算法;
6)LBLCR:LBLC with Replication,帶有複製功能的LBLC算法;web
lvs的集羣類型:
標準集羣類型:lvs-nat、lvs-dr(最爲經常使用且效率最高的模型)、lvs-tunnel:
非標準集羣類型:lvs-fullnat算法
**(一)lvs-nat類型**:只作目標地址轉換,至關於多目標IP地址的DNAT; 經過將請求報文中的目標IP地址和目標端口號修改成某個利用特定調度算法挑選出來的後端的RS的RIP即對應端口號的地址轉換的集羣服務類型; 注意事項: 1.RIP和DIP必須在同一邏輯網段中,而且應該都是私有IP地址,同時要求RS的網關指向調度器的DIP; 2.客戶端發送的請求報文和RS響應的報文都必須通過Director轉發,Director容易稱爲整個集羣服務系統的性能平均且容易引起單獨故障; 3.在Director上,真正的執行DNAT,所以其還能夠實現端口重定向;客戶端所請求的服務器端服務端口和後端RS提供的服務端口能夠不一樣; 4.VS必須是Linux系統,RS能夠安裝任意操做系統; **(二)lvs-dr類型**:Direct Routing,直接路由; 經過爲請求報文從新封裝一個數據鏈路層首部(MAC地址)進行報文轉發;從新封裝以後的數據報文的源MAC地址是Director的DIP所在網絡接口的MAC地址,目的MAC地址爲利用某種調度算法挑選出來的後端Real Server的RIP所在的接口的MAC地址;在整個過程當中,源IP地址、目的IP地址、源端口號及目的端口號等協議封裝屬性均保持不變 注意事項: 1.確保前端路由器可以將目標IP地址爲VIP的報文成功發往Director; 1) 在前端路由器上靜態綁定VIP和MAC地址的映射關係; 2) 在全部的RS上使用arptables,進而能夠過濾不指望的ARP請求和ARP應答; 3) 在全部的RS上修改特定的內核參數以限制ARP的通告和對ARP請求的應答方式: arp_ignore - INTEGER (定義怎麼樣去發送應答消息) arp_ignore的INTEGER屬性: 0:默認值,響應任意網卡上接收到的對本機IP地址的ARP請求,不考慮該目的IP地址是否在接收ARP報文的網卡上; 1:只響應目的IP地址爲接收網卡上的本地地址的ARP請求; 2:只響應目的IP地址爲接收網卡上的本地地址,而且ARP請求的源IP地址必須與接收網絡在同一網段的ARP請求; 3:若是ARP請求數據包所請求的IP地址對應的本地地址其做用範圍爲主機範圍,不響應ARP請求;若是做用範圍是全局或鏈路,就響應ARP請求; 4-7:保留,未使用; 8:不迴應任何ARP請求; arp_announce - INTEGER (定義怎麼樣去發送arp的通告報文) arp_announce參數的經常使用取值爲0,1,2; 0:默認值,容許使用任意網卡上的IP地址做爲ARP請求的源IP地址,向全部的網卡發出通告; 1:儘可能避免使用不屬於該發送網卡所在子網的本地地址做爲發送ARP請求的源IP地址; 2:忽略IP數據包的源IP地址,選擇該發送網卡上最合適的本地地址做爲ARP請求的源IP地址; 2.RS的RIP能夠是私有IP地址,能夠是公有IP地址;RIP和DIP應該在同一邏輯網段;RIP和VIP並不要求必須在同一網段; 3.全部的請求報文都必須通過Director,可是全部的響應報文都無需經過調度器轉發,而是直接經過路由器轉發至客戶端便可; 4.不支持DNAT及端口重定向; 5.RS必須安裝Linux操做系統; 6.IP地址的配置: 1) 在調度器上,物理網卡的主接口上配置DIP,接口的label上配置VIP;這樣的配置可使VIP滾動; 2) 在RS上,必須配置RIP和VIP,其中RIP配置在物理網卡的主接口上,而VIP配置在環回接口的label上; **(三)lvs-tunnel**:隧道;不對客戶端的請求報文的IP首部作修改,即:源IP爲CIP,目的IP爲VIP,而是在原IP報文的封裝格式以外再次封裝一個IP首部(源IP爲DIP,目的IP爲RIP),將從新封裝過的報文發往通過特定調度算法挑選出來的後端RS上; 注意事項: 1.CIP、VIP、DIP、RIP都應該是公有IP地址; 2.全部的請求報文都必須通過Director,可是響應報文會直接從RS發往Client,而再也不通過Director; 3.不支持DNAT和端口重定向; 4.要求Director和RS都必須支持隧道協議;IPsec 5.在RS上必須同時配置RIP和VIP; **(四)lvs-fullnat**:經過同時修改請求報文的源IP地址和目的IP地址實現報文轉發; 注意事項: 1.CIP和VIP是公有地址,DIP和RIP是私有地址,而且DIP和RIP能夠屬於不一樣的邏輯網段; 2.RS對收到的請求報文的響應報文,必須以DIP做爲目的IP地址進行封裝,全部這次通訊的請求報文和響應報文都必須通過Director; 3.支持SNAT、DNAT及端口重定向; 4.此類型默認不受內核支持;
負載均衡集羣的實現(LB Cluster):
(一)基本環境配置:
使用ipvsadm/ipvs來實現LVS:
ipvs:工做於netfilter框架中的INPUT鏈上,內核中的TCP/IP協議棧上的框架組件;
ipvsadm:用戶空間中用於編寫ipvs集羣服務的應用程序;sql
1.安裝ipvsadm:
首先須要查看是否支持ipvsadm:
~]# grep -i -C 10 "ipvs" /boot/config-3.10.0-327.el7.x86_64
檢查是否安裝ipvsadm應用程序:在光盤的鏡像中;
rpm -q ipvsadm
yum -y install ipvsadm
2.掌握ipvsadm命令:
1)管理集羣服務:增、刪、改
(1)增長lvs集羣服務:
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags]
--tcp-service -t service-address :基於TCP協議的集羣服務;
service-address :與VIP綁定的套接字,即:VIP:PORT
--udp-service -u service-address :基於UDP協議的集羣服務;
service-address :與VIP綁定的套接字,即:VIP:PORT
--fwmark-service -f fwmark :基於防火牆標記(FWM)的集羣服務
service-address :經過iptables工具在mangle表上對數據設置的標記;
--scheduler -s scheduler :指定lvs集羣服務挑選後端RS的調度算法;默認是lsc算法;
--persistent -p [timeout] :是否開啓持久鏈接,並定義持久鏈接的超時時間,若是省略超時時間,默認值爲360s;
(2)修改lvs集羣服務中的屬性:
ipvsadm -E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags]
--edit-service -E :編輯、修改集羣服務;
(3)刪除集羣服務:
ipvsadm -D -t|u|f service-address
--delete-service -D :刪除指定的集羣服務;
(4)清除lvs集羣服務:
ipvsadm -C
--clear -C : 清除全部集羣服務; //不推薦使用此方式清除集羣服務,若是必需要刪除,能夠是-D代替指定刪除;後端
2)管理集羣中的Real Server:增、刪、改 (1)在指定的集羣服務中添加Real Server: ipvsadm -a -t|u|f service-address -r server-address [options] --add-service -A :向集羣中添加RS; --real-server -r server-address :指定計劃要添加至服務器集羣中的後端RS的IP地址及端口號;只有在使用NAT類型的lvs集羣時,才能指定端口號; options: --gatewaying -g :指定lvs集羣的類型爲DR,默認類型; --ipip -i :指定lvs集羣的類型爲TUN; --masquerading -m :指定lvs集羣的類型爲NAT; --weight -w weight :爲後端的RS指定權重值(通常是整數); (2)修改集羣中的RS屬性: ipvsadm -e -t|u|f service-address -r server-address [options] --edit-server -e :編輯、修改集羣中的RS屬性; (3)從集羣中刪除RS: ipvsadm -d -t|u|f service-address -r server-address --delete-server -d :從指定的集羣服務中,刪除指定的Real Server; 3)查看集羣服務和RS的屬性及統計信息; ipvsadm -L|l [options] --list -L|-l:列表顯示指定的集羣服務或RS屬性; options注意包括: --numeric -n:以數字格式顯示IP和PORT等信息; --exact:顯示精確值; --connection -c:輸出當前ipvs的各鏈接的狀態; --stats:輸出lvs集羣的詳細的統計信息; --rate:輸出lvs集羣中與傳輸速率相關的信息; --timeout:輸出TCP、TCP的FIN標誌位及UDP會話的超時時長; ipvs的規則的保存和重載: --save -S:用於保存ipvs規則; ipvsadm -S [-n] > /PATH/TO/IPVS_RULL_FILE ipvsadm-save > /PATH/TO/IPVS_RULL_FILE --restore -R:用於重載ipvs規則; ipvsadm -R < /PATH/TO/IPVS_RULL_FILE ipvsadm-restore < /PATH/TO/IPVS_RULL_FILE 使已經被保存的規則於開機時自動載入: CentOS 6之前的發行版本: # chkconfig ipvsadm on CentOS 7之後的發行版本: # systemctl enable ipvsadm.service
(二)lvs-nat的實現:
1個Director + 2個Real Server:安全
都是在Director上的配置: 一、建立集羣服務: ipvsadm -A -t 172.16.72.3:80 -s rr 二、向集羣中添加RS: ipvsadm -a -t 172.16.72.3:80 -r 192.168.100.100:80 -m -w 1 ipvsadm -a -t 172.16.72.3:80 -r 192.168.100.200:8000 -m -w 2 注意:後端的RS的網關必須指向Director的DIP;
(三)lvs-dr的實現:
1個Director + 2個Real Server:服務器
在lvs-dr類型的集羣中,各個主機(包括Director和各RS)都須要配置VIP;爲了解決IP地址衝突的問題,一般有如下幾種方法: 1.在前端路由器上靜態綁定VIP和MAC地址的對應關係; 2.在各個RS中使用arptables對ARP報文進行過濾; 3.在各個RS中修改對應的內核參數,以此來限制ARP報文的通告和應答級別; arp_ignore 0:默認值; 1: 2: arp_announce 0:默認值; 1: 2: 經常使用的內核參數設定值的選擇: arp_ignore = 1 arp_announce =2 配置lvs-dr類型: 在Director上的配置: 1.主網絡接口上配置DIP; 2.在網絡接口的標籤接口上配置VIP; ~]# ifconfig eno16777736:0 172.16.72.254 netmask 255.255.255.255 broadcast 172.16.72.254 up 3.建立集羣服務:應該在RS均正確配置以後再執行; ipvsadm -A -t 172.16.72.254:80 -s rr 4.向集羣服務中添加RS: ipvsadm -a -t 172.16.72.254:80 -r 172.16.72.5 -g -w 1 ipvsadm -a -t 172.16.72.254:80 -r 172.16.72.6 -g -w 2 在RS上的配置: 1.主網絡接口上配置RIP: 2.在lo的標籤接口上配置VIP; ~]# ifconfig lo:0 172.16.72.254 netmask 255.255.255.255 broadcast 172.16.72.254 up 3.調整ARP相關的內核參數: echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce 4.爲了可以使響應報文從lo:0標籤接口向外封裝發送數據,須要指定一條特殊的靜態路由: route add -host 172.16.72.254 dev lo:0
2、高可用集羣(HA Cluster):(lvs自己並、不支持高可用)
高可用主要是指:服務高可用和資源高可用
在lvs集羣中,可能有兩種故障:
1.Director故障不可用;
keepalived:原生的lvs的Director高可用解決方案;
heartbeat
corosync/pacemaker:通用的高可用解決方案;
2.後端RS故障不可用; lvs的Director不考慮後端RS的可用與否,只是按照調度算法進行客戶端請求調度; 完整的實現:週期性的對各個RS進行健康狀態檢測; 檢測失敗:應該從lvs集羣服務中將對應的RS移除; 檢測成功:將對應RS從新加入lvs集羣服務中;從新建立lvs集羣服務; 全部的RS檢測均失敗:臨時刪除lvs集羣服務,並使調度器本地的web服務可以響應一個相對比較友好的錯誤頁面,sorry_server; 檢測後臺服務器RS的方式: 網絡層檢測;ping 傳輸層檢測:端口探測,nmap 應用層檢測:文件資源的存在性檢測;文件訪問權限檢測;文件內容有效性檢測; **HA Cluster實現方案:** 基於VRRP協議的實現:(keepalived主要用來後端RS的健康狀態檢測) keepalived,專用於高可用lvs的Director; 基於AIS的實現:完備的HA集羣; heartbeat corosync + pacemaker **VRRP協議**:Virtual Redundancy Router Protocol,虛擬路由器冗餘協議; VRRP技術術語: 虛擬路由器:虛擬的路由器的接口; VRID:虛擬路由器標識符,描述路由器的分組;而且能夠肯定虛擬路由器的虛擬MAC地址,取值範圍爲:0-255(00-ff); MASTER:虛擬IP地址的擁有者,能夠利用虛擬IP地址接收用戶請求,而且可以完成數據轉發功能; BACKUP:不參與數據轉發,僅檢測MASTER的健康狀態; 虛擬IP地址:VIP,虛擬路由器接口的IP地址; 虛擬MAC地址:VMAC,00-00-5e-00-01-{VRID} 優先級:選舉成爲MASTER的主要的參考標準,取值範圍爲:0-255; 0:放棄MASTER選舉; 255:虛擬IP地址和某個路由器接口的IP地址相同,則該路由器會自動得到255的優先級,從而直接成爲MASTER; 1-254:越大越有可能成爲MASTER; 非搶佔式:若是MASTER故障致使狀態發生變化,則全部的BACKUP會從新選舉產生新的MASTER;此時,若是原來的MASTER從故障中恢復,則直接成爲BACKUP狀態,直到當前的MASTER故障以後,全部的BACKUP從新選舉MASTER時,其才能從新稱爲新的MASTER; 搶佔式:若是MASTER故障致使狀態發生變化,則全部的BACKUP會從新選舉產生新的MASTER;此時,若是原來的MASTER從故障中恢復,則當即通告本身的優先級並啓動新一輪選舉,以後從新成爲MASTER; VRRP的認證方式:無認證、簡單字符串認證、MD5 VRRP的工做模式: 單個實例:MASTER/BACKUP 多個實例:MASTER/BACKUP, MASTER/MASTER ** keepalived:** VRRP協議在linux系統中的應用實現,爲了高可用ipvs調度器;也稱爲"ka"; keepalived經過調用內核中的系統調用接口完成ipvs的規則編寫,從而能夠用於管理lvs集羣服務;全部的規則,都定義在其配置文件中; keepalived還能夠對VIP地址進行浮動設置; keepalived還能夠爲後端各RS提供健康狀態檢測,能夠基於傳輸層及應用層實現; keepalived還能夠基於外部腳本調用接口完成腳本中定義的功能,甚至能夠高可用其餘的非lvs服務; keepalived在RHEL 6.4+或CentOS 6.4+的發行版本的操做系統中,被收錄到官方系統光盤鏡像之中,直接基於本地Base源使用yum命令完成安裝便可; keepalived的組件: 1.控制面板:配置文件分析器; 2.內存管理組件; 3.IO複用器組件; 4.核心組件: VRRP Stack:實現VRRP協議功能的組件; Checkers:後端RS作健康狀態檢測的組件; SMTP:調用SMTP協議,將路由器狀態轉換的消息以郵件的形式發送到指定管理員郵箱; Watch Dog:監控Checkers和VRRP Stack的工做狀態;若是異常,負責從新啓動keepalived進程; ipvs wrapper:向內核中的ipvs框架傳輸ipvs規則,用於構建、管理、移除lvs集羣服務及集羣中的RS的組件; netlink reflactor:管理虛擬路由器接口; 配置HA Cluster的前期準備: 1.各個節點主機之間時間必須同步,可使用時間服務器,如ntp或chrony; 2.確保iptables和SELinux的規則不會阻礙各個節點以前的數據通訊; 3.各個節點主機之間須要經過主機名互相通訊(對ka並不是必須); 4.出於安全考量,各個節點主機之間能夠以root用戶的身份,基於密鑰認證的方式進行ssh通訊(對於ka非必須); keepalived安裝: 在CentOS 7.2中,直接使用光盤鏡像yum倉庫,使用yum install keepalived安裝便可; 程序環境: 主配置文件:/etc/keepalived/keepalived.conf 主程序文件:/usr/sbin/keepalived Unit File:/usr/lib/systemd/system/keepalived.service 主配置文件的結構: GLOBAL CONFIGURATION Global definitions global_defs { notification_email { root@localhost //配置接收郵件通知的郵箱地址; } notification_email_from keepalived@localhost smtp_server 127.0.0.1 //設定用於發送電子郵件的郵件服務器; smtp_connect_timeout 30 # integer, seconds router_id my_hostname //設置路由器ID,僅僅爲了區分不一樣的設備而已;若是不修改,也不會影響keepalived服務自己; vrrp_mcast_group4 224.0.0.18 //設置發送VRRP協議經過的目標組播通訊地址;必須保證全部參數選舉的路由器都必須有相同的組播通訊地址; } VRRPD CONFIGURATION vrrp_instance inside_network { //定義VRRP的實例及實例名稱; state MASTER //指定當前設備的初始狀態; interface eno16777736 //指定被VRRP協議綁定的網絡接口,即發送VRRP經過信息的網絡接口; virtual_router_id 51 //指定虛擬路由器標識,用於肯定VRRP備份組; priority 100 //指定當前節點的優先級,指定的範圍爲:1-254; advert_int 1 //發送VRRP經過的時間間隔,單位是秒; authentication { auth_type PASS //設置VRRP協議各節點之間的認證方式,PASS表示簡單密碼 auth_pass MTUwPBjd //設置認證密碼,不超過8個字符; } virtual_ipaddress { <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL> } //設置虛擬IP地址的專用上下文 nopreempt //設置當前節點爲非搶佔模式,默認爲搶佔模式; preempt_delay 300 //搶佔模式開始前的延遲時間; notify_master <STRING>|<QUOTED-STRING> notify_backup <STRING>|<QUOTED-STRING> notify_fault <STRING>|<QUOTED-STRING> //設置噹噹前服務器狀態發生變化時,所觸發的腳本文件的路徑及相關參數; track_script { SCRIPT_NAME } } LVS CONFIGURATION virtual server vip vport | fwmark <INT> { delay_loop <INT> //服務輪詢的時間間隔設定; lb_algo rr|wrr|lc|wlc|lblc|sh|dh //指定負載均衡調度算法; lb_kind NAT|DR|TUN //指定負載均衡集羣的類型; persistence_timeout <INT> //啓用持久鏈接並設置超時時間; protocol TCP //負載均衡服務支持的協議;目前僅支持TCP; sorry_server <IPADDR> <PORT> //若是後端RS所有不可用,則須要臨時刪除lvs集羣服務,並設置本地的http服務爲sorry-server,提供友好的錯誤頁面; real_server <IPADDR> <PORT> { weight <INT> //指定當前RS的權重; notify_up <STRING>|<QUOTED-STRING> notify_down <STRING>|<QUOTED-STRING> //當RS的狀態轉爲UP或DOWN時,發送通知所使用的腳本路徑及參數設定; HTTP_GET|SSL_GET { url { path <STRING> //指定進行後端RS健康狀態檢測的URL地址; digest <STRING> //比較被檢測資源的md5值是否發生變化; status_code <INT> //根據響應報文的狀態碼進行後端RS的健康狀態檢測; } nb_get_retry <INT> //指定對後端RS進行健康狀態檢測重試的次數上限; delay_before_retry <INT> //每次重試以前的延遲時間; connect_ip <IP ADDRESS> connect_port <PORT> //向後端RS的哪一個IP地址和哪一個端口發出健康狀態檢測請求; bindto <IP ADDRESS> bind_port <PORT> //向後端RS發出健康狀態檢測請求的源IP地址和源端口號; connect_timeout <INTEGER> //鏈接超時時間; } TCP_CHECK { connect_ip <IP ADDRESS> connect_port <PORT> //向後端RS的哪一個IP地址和哪一個端口發出健康狀態檢測請求; bindto <IP ADDRESS> bind_port <PORT> //向後端RS發出健康狀態檢測請求的源IP地址和源端口號; connect_timeout <INTEGER> //鏈接超時時間; } } }