非常抱歉,今天上午的博客站點故障給大家?guī)砹撕艽蟮穆闊?,請大家諒解。這次故障是我們發(fā)布 .NET Core
版博客站點引起的,雖然我們進行了充分的準備,但還是低估了高并發(fā)下的復(fù)雜問題。
以下是故障背景與大致經(jīng)過:
在這個炎炎夏日,我們正熱火朝天地忙著整個 .NET Core 遷移工程的收官 —— 發(fā)布 .NET Core
版博客站點與博客后臺。我們的其他系統(tǒng)都早已遷移至 .NET Core 并已在線上工作一番時日,只剩下最難啃的硬骨頭 ——
博客系統(tǒng),到這個月這根鋼鐵般堅硬的硬骨頭也被啃得差不多了,它的發(fā)布上線將為我們整個 .NET Core 遷移工程畫上完美的句號,并順帶以此里程碑迎接 .NET
Core 3.0 正式版的發(fā)布。
所以,發(fā)布 .NET Core 版博客站點與博客后臺成為我們8月份最重要的工作。.NET Core
版博客站點7月份就已經(jīng)完成開發(fā),這段時間一邊進行更進一步的內(nèi)測,一邊進行灰度發(fā)布,接入一些生產(chǎn)流量以發(fā)現(xiàn)我們測試中未能發(fā)現(xiàn)的問題并進行修復(fù),在上個周末接入更多生產(chǎn)流量進行測試與修復(fù)后,我們已經(jīng)很有信心,評估后認為已具備正式發(fā)布條件,除了我們無法在測試環(huán)境中模擬的博客系統(tǒng)所處的復(fù)雜高并發(fā)場景。
于是一邊帶著信心,一邊帶著對高并發(fā)問題的擔(dān)心,我們決定在今天一大早進行發(fā)布。
發(fā)布時的部署場景是這樣的,博客系統(tǒng)基于 .NET Core 3.0 Preview 7 (EF Core 用的還是 3.0 Preview 5),7臺阿里云
centos 服務(wù)器組建了 docker swarm 集群,6臺4核8G服務(wù)器作為 worker 節(jié)點跑博客站點的應(yīng)用容器,1臺2核4G的服務(wù)器作為
manager 節(jié)點(不部署任何容器),每個 worker 節(jié)點都部署 1 個 nginx 與 .net core 博客應(yīng)用容器,所有請求都由阿里云均衡轉(zhuǎn)發(fā)到
nginx 容器,再由 nginx 容器轉(zhuǎn)發(fā)給 .net core 應(yīng)用容器,nginx 通過端口映射的方式監(jiān)聽 worker 節(jié)點服務(wù)器的 80 端口。
這樣的部署環(huán)境也是我們經(jīng)過長期驗證的,唯一沒有經(jīng)過驗證的就是博客系統(tǒng)這么高的并發(fā)。
頂著2個高并發(fā)問題的風(fēng)險(docker swarm 與 .net core ),我們在今天早上 5:30 左右進行了發(fā)布。
開始訪問量小,并發(fā)低,沒出現(xiàn)問題,但到 8:30 左右出現(xiàn)問題了,打開很多博客頁面要1秒多(正常情況是幾十毫秒),而在容器內(nèi)用 curl
命令請求都不到10毫秒。
$ docker exec -t $(docker ps -f name=blog_web -q) curl -H '
X-Forwarded-Proto:https' -w %{time_total} -o /dev/null -s localhost 0.002876
懷疑是 nginx 的問題,準備重新創(chuàng)建一個 docker 集群,不用? nginx 直接用 kestrel 監(jiān)聽 80 端口。
后來同事指出,不是 nginx 的問題,是 docker swarm 端口映射在高并發(fā)下的性能問題,只有將端口映射改為 host 網(wǎng)絡(luò)模式才能解決這個問題。
9:30 左右,隨著并發(fā)越來越高,nginx 容器開始報 500 錯誤,開始以為是集群中的服務(wù)器負載過高,于是向 docker swarm
集群中添加服務(wù)器,但于事無補,500 錯誤越來越多。
出現(xiàn) 500 錯誤時,有時刷新一次就會好,有時要刷新好幾次,懷疑是集群中某些服務(wù)器不穩(wěn)定,于是一臺一臺登錄集群中的服務(wù)器進入容器用 curl
命令進行測試,除了1臺服務(wù)器不穩(wěn)定,其他服務(wù)器 curl 命令測試時響應(yīng)速度都正常,將那臺不太穩(wěn)定的服務(wù)器下線,問題依舊,隨著并發(fā)量繼續(xù)增大,500
錯誤也繼續(xù)增多。
進一步分析后,懷疑 500 錯誤是因為高并發(fā)下 nginx 容器與 .net core 應(yīng)用容器之間的網(wǎng)絡(luò)通信出現(xiàn)問題,于是 10:30
左右決定放棄這次發(fā)布,回退至跑在 Windows 上的 .net framework 版本博客站點,恢復(fù)了正常。
熱門工具 換一換