開發

高校外包公司自動化部署生存指南

**菜你都做好了,如何端給用戶?**

## 前言

《外包公司,等你長大》這一篇預告很久了,一直沒有成筆,今天寫的可以算是其中一小點,只是聚焦于應用分發和交付的問題,為什么會寫這一篇,**這一切,都要從一只蝙蝠說起。。。**

因為疫情的緣故,高校最近密集上了包括健康打卡、不見面辦理、視頻會議和網絡教學等相關的應用。各個信息化部門也乘機在里面夾帶了各種私貨,包括推廣某些平時很難推動的平臺,對師生進行信息素養教育提高等等工作。每一次危機,其實都伴隨著機遇,就看你如何能夠及時把握。

這些應用都有高并發高流量的需求,而且時間緊,需求變化快。如何快速平穩交付是一個比較大的問題。

在這里,云平臺也冒出來了。高校原先是比較排斥云的,不知道什么緣故,大家總認為,物理上在學校內部,才是自主可控的。但是這次不同,師生都在校外,只有云和CDN才是最接近用戶的。

云存儲和CDN有毒,用了就停不下來。

然后在我最近跟他們交流中,我發現了一些應用交付上的問題。

大部分外包公司,都還是很原始的手工部署,而且部署人員的技術水平和安全意識在公司整體屬于比研發低一點。

如果從DevOps來說,這也有研發的鍋。研發開發完成,哪管你運維人員怎么部署。

外包公司總是向我們拿更多的CPU、更多的內存、更高的空間占用,拿硬件負載均衡,拿Oracle。因為這些在我們這邊是增加成本,但是對他們是節省成本,節省軟件框架優化的成本。外包公司還會向我們拿更多的系統維護停機時間,更長的小版本更新周期,更長的操作系統和基礎軟件更新周期。這些在我們這里是影響用戶體驗和系統安全的,讓信息化部門被用戶打低分的。對他們來說,還是節省成本。為了性能,CPU、內存等等我們也會愿意給,但是這要有一個度,因為一個應用,如果不從框架或代碼方面去做優化,給多少資源都是沒用的。甚至于,有些應用,我們想給更多的資源,但是他消耗不了。

所以我認為,如果可以,外包公司請盡快遷移到自動化部署上去吧。如果能直接二進制打包War、Docker給我們更好,因為現在存儲實在太便宜,我們不再需要為了解決空間占用而帶來的各種依賴共享、動態加載、各種不同版本化的庫。然而大的外包公司,歷史包袱重,轉身很難,如果一個老的CTO,只求穩不尋求技術更新,那新技術就很難推進。遷移肯定是有陣痛的,短期內成本是上升的,但是長期會以另外一種形式補貼你。對客戶來說,能給你提意見的才是優質客戶,批評越重,那都是真愛,希望你成長為101年的企業,畢竟你死了,大家都不好過。

## 自動化部署

> 我們維護400個學校的2000臺機器

這時候更需要自動化部署,自動化部署具有高效率和較快的部署能力,而且不容易出錯。不同學校不同的配置文件進入.gitignore隔離。當然,自動太自動了,腳本出錯影響面也很大。這是另外一個問題。

比如,自動化,也不推薦只用一臺主控機。我們一般自動化部署,會有Test機器列表,Staging機器列表,Production機器列表,通過不同腳本跑,假設你使用工作用機來當主控機,所以你所有機器列表要對主控機都開通SSH防火墻,然后有天你手抖了,正在Test上修改配置,然后跑了Production腳本,就悲劇了。所以一般都建議,主控機根據不同環境分隔開來。

## Test或者Staging環境

這些環境應當和Production環境一致,然后定期同步數據庫和共享文件。現在一般很少這么做,成本較高,或者Production環境部署10臺,但是Test環境才2臺,而且數據不一定同步。這些都會造成一些問題,比如壓力測試可能就做不了,查錯還是OK的。

多個環境一定要非常小心,特別是rsync,mysqldump,再困再累,也要對命令行左右路徑double check一下。

## 小版本升級、遷移正確的打開方式

如果完全按DevOps的理念,不可變服務器,每次升級,都重新構建一臺全新的服務器,然后扔掉舊服務器,這個很多學校還做不到。如果還遇到大版本升級,或者有架構方面大的升級,還需要更長的停機時間。

  • 提前一段時間通知用戶即將停機維護
  • 在進入停機模式,Nginx接管所有流量,給用戶一個維護模式頁面
  • 如果可以,應先在備用環境演練遷移時間,將所有時間壓縮到最低,比如數據庫可以使用binlog傳輸變化量就不需要整庫倒數據,文件傳輸rsync傳輸變化量等等。

## 能不能從Web小版本升級

用過WordPress的人都體驗過從Web安裝,從Web自動升級,能否引入這種機制,不要再從SSH跑命令升級了,讓升級更傻瓜一點。當然,要做到這步,考慮需要更多,比如安全性問題,腳本運行超時問題等等。

## VPN和堡壘機

> 我們維護的院校,60%是需要VPN的,30%是需要堡壘機的,光VPN軟件就幾十種。

>

> 當前維護一個學校,只能登錄1個學校的VPN,比如我在維護廈門大學的時候,就無法同時部署清華大學、北京大學

這里面存在2個誤解。

  • 有責任的外包公司,如果看到學校的服務器維護居然可以不用VPN,不用雙因素認證的堡壘機,應當不是竊喜而是告知學校,這樣子很不安全!
  • 是可以同時撥號10個學校VPN并通過路由指定網段走哪個VPN網關的。

當然,這有學校的問題,90%以上的高校的VPN設置手冊可能都是一大堆圖文并茂告訴用戶如何一步步設置VPN,很多管理員不知道其實可以直接打開PowerShell窗口(Windows8、Windows10以上)輸入以下命令一鍵配置,并且拷貝黏貼保證不會出錯:

“`powershell

Add-VpnConnection -Name “XmuIKEv2” 

-ServerAddress “mask.xmu.edu.cn” 

-TunnelType “IKEv2” 

-EncryptionLevel “Optional” 

-AuthenticationMethod Eap 

-RememberCredential

“`

注意后面一定不要有-PassThru,寧愿再跑一次Get-VpnConection,否則會污染rasphone.pbk文件。

針對以上外包公司來說,他只要加參數 -SplitTunneling $True 取消默認網關,然后就可以通過 Add-VpnConnectionRoute 。這個方案比route -p ADD好的地方在于,不會永久破壞你的路由表,只會在撥號VPN后生效。或者你也可以每次撥號VPN后手動route ADD。

查看你加了多少路由沒有Get-VpnConnectionRoute命令,通過以下查看:

“`powershell

$conn = Get-VpnConnection -Name “XmuIKEv2”

$conn.routes

“`

## SaaS、Semi-SaaS、On-Premises

如果能打包成容器部署更好,當然容器也在不停演進,安全性不是太樂觀,內核漏洞和容器漏洞都會導致容器逃逸。最新的有安全容器,在容器外面再套一層輕量級的虛擬化都是可以研究的。

因為交付很麻煩,有些外包公司直接給你提供SaaS服務。也有提供半SaaS服務,你多給點錢,他幫你在云平臺開虛擬機部署,甚至還可以給你機器密碼,純的SaaS你是拿不到數據庫權限,半SaaS可能可以拿到。但是這里就要注意到安全問題,半SaaS服務為了方便,他們可能直接SSH端口直接對外全部開放,不走堡壘機等等問題。

## 多臺Web

Web不是說想擴就擴的,Web要變多臺,你必須處理幾臺Web共享數據和狀態問題。而且Web擴完后日志也不是集中的。多臺Web升級代碼也是比較麻煩的。這里一般采用滾動升級或者使用負載均衡引流灰度升級。比如我部署的一個應用,前端一臺Nginx,后端10臺Web,我單獨劃出一臺給我自己在線調試查錯,就簡單通過Nginx判斷remote_addr是我的IP,直接引流到某臺Web。

整個應用對外也應當對CDN友好,最近上了CDN我才發現,CDN針對動態網頁、靜態資源、流媒體點播、云存儲等不同緩存的價格是不同的,所以有能力應當使用多個域名隔離這些資源,使得對CDN友好,節省學校的帶寬成本。

## 共享Session

編程語言一般都可以設置Session保存到一個集中的數據庫,比如關系型數據庫,甚至內存數據庫。當然,你如果保證可以ip_hash到同一臺Web,Session可以直接放在Web,但是這個不夠健壯。如果Web當了一臺,Session會丟失。

## 共享Cache

一些全局的Cache也可以考慮類似Session來處理。

## Cache

必須大量采用Cache。頁面必須解構,動態內容和靜態內容分開,緩存時間不同的分開,JavaScript、Image全部版本化,輸出Cache-Control。我最近在安裝Moodle,Moodle這方面做得非常完美。

## 共享存儲

NFS已經進化到v4了,但是因為有網絡參與,速度還是不容樂觀,考慮用戶傳一個1G的文件到NFS,他需要先經過CDN->Nginx->Web->NFS,至少Web和NFS會有兩次落盤讀寫,時間會被延長20%。所以這個需要權衡。當然,如果有異步機制,這個時間可以省下來,后端多臺Web再和NFS進行rsync同步。或者直接上分布式文件存儲,云存儲,并且跟CDN做好對接,應當可以緩存有權限判斷的文件。

## 數據庫

不要一上來就拿Oracle,是否可以采用MySQL,分庫分表?讀寫分離?

## 版本化

版本化一切,包括源代碼和數據庫。如果用過開源軟件,或者類似Django的Database Migrate機制就會很清楚。數據庫有自己的版本,一個版本字符串寫在表結構內。Web來訪問必須匹配版本號,否則無法運行,提示升級。這樣子可以防止,假如你有10臺Web,但是運維沒睡好,只升級了其中9臺,漏了一臺,也不會影響數據庫的安全。這10%的用戶就會收到一個提示,也可以更快發現錯誤。如果你可以把學校代碼也寫入源代碼和數據庫,就不會出現清華大學的代碼誤傳到廈門大學并跑起來了。

> 定制呢?改首頁呢?

這個我們也遇到過,明明一個錯誤已經修正了,怎么又跑出來?原來是運維升級錯版本了,覆蓋客制化內容了。升級好了,首頁怎么亂了?客制化忘記修正了。所以這里一定要做好各個不同學校的內容的隔離,使用配置文件。git flow要認認真真去學習,如何做個主master倉庫,如何develop,hotfix,feature,release,不同學校的release版本。

當然對于學校來說,盡量減少定制,即使要定制,也要爭取定制內容進入公司產品主倉庫。定制是惡魔。

## 壓力測試

一般公司會說我們在哪個學校試過壓力測試,可以達到多少并發等等。但是這個不準,各個學校硬件環境和數據庫內容差異很大,沒有可比性,如果可以的話,盡量應當在本地直接壓力測試。

因為壓力測試錄制腳本很麻煩,還需要處理登錄問題,如果可能,應當有專門的代碼,直接從數據庫生成JMeter腳本,對登錄做Hack,直接通過某種機制繞過登錄,在跟生產環境基本一致的服務器上做壓力測試。也就是,壓力測試也是要自動化,想要跑就可以跑的。

## 監控和日志

在我以前說過,如果請外包公司做運維,應當將監控和日志向運維公司開放。因為你一旦將Web拓展到多臺以后,查找Log是非常麻煩的,你很難知道自己被ip_hash到哪臺Web了,所以必須中心化日志。并且要定期查看500錯誤,不要等用戶來報。

很多外包公司認為這個是學校的事情,確實,監控和日志是安全合規的事情,學校一般也會已經建立,但是是否可以分權限給你查看這個得看學校買的日志集中化產品的支持,甚至得看你能否進入學校安全核心網段。所以如果有能力,應當自己采用開源軟件也建立一套簡單的日志采集工具,只給自己定位錯誤使用。

## 備份

備份友好也要考慮。比如你將文件都寫入數據庫很省心,會造成數據庫很大,很難備份。或者文件寫的路徑盡量按上傳時間分離而不是某個奇怪的hash算法。當然備份學校也會有一套自己的規則,可以不用考慮太多。知悉學校的備份策略,也為自己運維人員操作留下后路。

我還沒有學會寫個人說明!

實戰 | 某小公司項目環境部署演變之路

上一篇

華為智慧園區疫情防控解決方案,讓復工安全無憂

下一篇

你也可能喜歡

高校外包公司自動化部署生存指南

長按儲存圖像,分享給朋友

ITPUB 每周精要將以郵件的形式發放至您的郵箱


微信掃一掃

微信掃一掃
重庆时时后一8码方法 内蒙古十一选五技巧 七乐彩号码基本走势图 手机吉林快3官网最新版 深圳风采35选7开奖结果 网友最爱的av女优排行榜 澳洲幸运5全国开奖吗 湖北11选5走式图 麻将棋牌可以提现的游戏有哪些 重庆幸运农场开奖现场 东京热全集qvod 甘肃十一选五开奖查 贵州快乐麻将下载 查一下3d开奖结果 活塞vs小牛 江苏十一选五一定一 安装辽宁十一选五体彩