到分布式的完整指南)
企業(yè)級(jí)項(xiàng)目管理系統(tǒng)的部署向來是個(gè)細(xì)致活尤其是把 Primavera P6 EPPM 這套重型應(yīng)用架在 RHEL 上中間涉及的中間件、數(shù)據(jù)庫、權(quán)限、服務(wù)編排環(huán)環(huán)相扣任何一個(gè)環(huán)節(jié)沒對(duì)齊后面就是無窮無盡的排查。我前后在幾套不同規(guī)模的 RHEL 環(huán)境里落地過 P6 EPPM從單機(jī)測(cè)試到多節(jié)點(diǎn)集群都趟過一遍踩的坑足夠?qū)懸槐拘?cè)子。這篇就把整套安裝思路、關(guān)鍵參數(shù)、實(shí)操步驟和那些文檔里不會(huì)寫的經(jīng)驗(yàn)一次性攤開講清楚。P6 EPPM 是工程項(xiàng)目管理領(lǐng)域的核心平臺(tái)負(fù)責(zé)進(jìn)度計(jì)劃、資源調(diào)配、成本跟蹤和報(bào)表分析典型用戶是工程、能源、基建類企業(yè)的計(jì)劃控制團(tuán)隊(duì)。它不是一個(gè)單體應(yīng)用而是由數(shù)據(jù)庫、應(yīng)用服務(wù)器、Web 前端、報(bào)表服務(wù)、作業(yè)服務(wù)等多個(gè)組件拼起來的分布式系統(tǒng)。把它裝到 RHEL 上本質(zhì)上是做一次企業(yè)級(jí) Java 應(yīng)用的完整部署準(zhǔn)備操作系統(tǒng)、裝數(shù)據(jù)庫、配應(yīng)用服務(wù)器、部署應(yīng)用包、調(diào)通服務(wù)、驗(yàn)證功能。適合誰來參考負(fù)責(zé)企業(yè)應(yīng)用運(yùn)維的工程師、需要獨(dú)立搭建測(cè)試環(huán)境的實(shí)施顧問以及想搞清楚這套系統(tǒng)底層結(jié)構(gòu)的技術(shù)負(fù)責(zé)人。下面按我實(shí)際操作的順序展開每一步都說明為什么這么做。1. 部署前的整體設(shè)計(jì)與方案取舍動(dòng)手之前先把架構(gòu)想清楚比裝到一半推倒重來省事得多。P6 EPPM 的部署形態(tài)直接決定了后面所有配置的復(fù)雜度這一步的決策成本最高。1.1 單機(jī)部署與分布式部署怎么選P6 EPPM 官方支持多種拓?fù)渎涞綄?shí)際項(xiàng)目里無非兩類單機(jī)全棧和分布式拆分。單機(jī)就是把數(shù)據(jù)庫、應(yīng)用服務(wù)器、報(bào)表服務(wù)全塞在一臺(tái)機(jī)器上分布式則是數(shù)據(jù)庫獨(dú)立、應(yīng)用服務(wù)器獨(dú)立、報(bào)表服務(wù)再獨(dú)立。我見過不少團(tuán)隊(duì)一上來就追求分布式結(jié)果測(cè)試環(huán)境資源不夠各組件搶內(nèi)存反而比單機(jī)還不穩(wěn)定。選擇邏輯其實(shí)很簡單看兩個(gè)維度并發(fā)用戶數(shù)和環(huán)境用途。測(cè)試、演示、小團(tuán)隊(duì)內(nèi)部使用并發(fā)在五十人以內(nèi)單機(jī)完全夠用一臺(tái) 16 核 32G 的機(jī)器就能跑得很順。生產(chǎn)環(huán)境、并發(fā)上百、有報(bào)表密集查詢需求的才需要考慮把數(shù)據(jù)庫單獨(dú)拆出去應(yīng)用服務(wù)器和報(bào)表服務(wù)視負(fù)載再?zèng)Q定是否分離。我個(gè)人的建議是第一次部署一定從單機(jī)開始。原因很實(shí)在單機(jī)能讓你在最短時(shí)間內(nèi)把整套鏈路跑通理解各組件之間的依賴關(guān)系。等你對(duì)每個(gè)服務(wù)的啟動(dòng)順序、端口占用、日志位置都心里有數(shù)了再拆分布式就是水到渠成的事。反過來一上來就搞分布式出問題時(shí)你連是哪個(gè)組件的問題都定位不了。1.2 組件構(gòu)成與依賴關(guān)系梳理把 P6 EPPM 拆開看核心組件有這么幾塊理解它們的關(guān)系是后續(xù)配置的基礎(chǔ)組件作用依賴數(shù)據(jù)庫存儲(chǔ)所有項(xiàng)目數(shù)據(jù)、配置、用戶信息無最底層應(yīng)用服務(wù)器承載 P6 Web 應(yīng)用處理業(yè)務(wù)邏輯數(shù)據(jù)庫報(bào)表服務(wù)生成各類分析報(bào)表數(shù)據(jù)庫、應(yīng)用服務(wù)器作業(yè)服務(wù)執(zhí)行后臺(tái)定時(shí)任務(wù)、批量計(jì)算數(shù)據(jù)庫Web 前端用戶訪問入口應(yīng)用服務(wù)器這個(gè)依賴鏈條決定了一切安裝順序數(shù)據(jù)庫必須先就位應(yīng)用服務(wù)器其次報(bào)表和作業(yè)服務(wù)最后。很多新手栽在順序上先裝了應(yīng)用服務(wù)器發(fā)現(xiàn)連不上庫又回頭折騰數(shù)據(jù)庫前面的配置全白費(fèi)。提示安裝前把這張依賴表打印出來貼在顯示器邊上每完成一個(gè)組件打個(gè)勾能避免絕大多數(shù)順序性錯(cuò)誤。1.3 操作系統(tǒng)層面的前置規(guī)劃RHEL 這邊要提前定幾件事主機(jī)名、IP 規(guī)劃、磁盤分區(qū)、SELinux 策略、防火墻規(guī)則。主機(jī)名一旦在安裝數(shù)據(jù)庫時(shí)寫入后面改起來極其麻煩所以第一步就定死。磁盤分區(qū)上數(shù)據(jù)庫的數(shù)據(jù)目錄和歸檔目錄建議單獨(dú)掛載避免日志寫滿根分區(qū)導(dǎo)致系統(tǒng)卡死這個(gè)坑我見過太多次。SELinux 和防火墻是另一個(gè)高頻雷區(qū)。P6 各組件之間通過固定端口通信SELinux 的默認(rèn)策略會(huì)攔截不少非常規(guī)端口訪問。測(cè)試環(huán)境我通常直接把 SELinux 設(shè)為 permissive 模式生產(chǎn)環(huán)境則根據(jù)實(shí)際端口逐條放行而不是簡單粗暴地關(guān)掉。防火墻同理需要放行的端口包括數(shù)據(jù)庫監(jiān)聽端口、應(yīng)用服務(wù)器 HTTP/HTTPS 端口、報(bào)表服務(wù)端口等具體端口號(hào)在安裝各組件時(shí)確認(rèn)后統(tǒng)一配置。2. 操作系統(tǒng)與數(shù)據(jù)庫的實(shí)操落地這一層是整個(gè)系統(tǒng)的地基地基不穩(wěn)后面全是隱患。RHEL 的準(zhǔn)備工作看似瑣碎但每一項(xiàng)都有明確的意圖。2.1 RHEL 基礎(chǔ)環(huán)境配置清單拿到一臺(tái)干凈的 RHEL 機(jī)器我按這個(gè)順序過一遍基本不會(huì)漏確認(rèn)系統(tǒng)版本與內(nèi)核cat /etc/redhat-release和uname -rP6 EPPM 對(duì) RHEL 大版本有明確支持矩陣裝之前對(duì)照官方兼容性列表確認(rèn)別用太新的小版本中間件兼容性容易出問題。設(shè)置主機(jī)名hostnamectl set-hostname p6app01同時(shí)更新/etc/hosts加入本機(jī) IP 與主機(jī)名映射這一步不做后面數(shù)據(jù)庫監(jiān)聽和應(yīng)用連接都會(huì)出詭異問題。關(guān)閉不必要的服務(wù)把 NetworkManager 之外的非必要服務(wù)停掉減少端口和資源爭(zhēng)搶。調(diào)整內(nèi)核參數(shù)數(shù)據(jù)庫和應(yīng)用服務(wù)器對(duì)文件句柄數(shù)、共享內(nèi)存、網(wǎng)絡(luò)連接數(shù)有要求在/etc/security/limits.conf里給對(duì)應(yīng)用戶調(diào)高nofile和nproc在/etc/sysctl.conf里調(diào)整kernel.shmmax、kernel.shmall、net.core.somaxconn等參數(shù)。創(chuàng)建專用用戶和用戶組數(shù)據(jù)庫、應(yīng)用服務(wù)器各用獨(dú)立系統(tǒng)用戶不要用 root 跑任何應(yīng)用進(jìn)程這是安全底線。內(nèi)核參數(shù)這塊補(bǔ)充一下計(jì)算邏輯。kernel.shmmax建議設(shè)為物理內(nèi)存的一半或更大單位是字節(jié)比如 32G 內(nèi)存的機(jī)器設(shè)為 17179869184。kernel.shmall是共享內(nèi)存頁數(shù)等于 shmmax 除以頁大小通常 4096 字節(jié)。這些值不是拍腦袋定的數(shù)據(jù)庫啟動(dòng)時(shí)如果共享內(nèi)存不夠會(huì)直接報(bào)錯(cuò)起不來。2.2 數(shù)據(jù)庫安裝的關(guān)鍵決策與步驟P6 EPPM 支持多種數(shù)據(jù)庫實(shí)際項(xiàng)目里最常見的是 Oracle 和 SQL ServerRHEL 環(huán)境下自然是 Oracle 為主。數(shù)據(jù)庫版本要嚴(yán)格對(duì)照 P6 的支持矩陣差一個(gè)小版本都可能遇到驅(qū)動(dòng)不兼容。安裝 Oracle 的流程本身有大量成熟資料這里只講和 P6 相關(guān)的關(guān)鍵點(diǎn)。第一字符集必須選 AL32UTF8P6 的多語言支持依賴這個(gè)裝錯(cuò)了后面中文亂碼、特殊字符丟失改字符集幾乎等于重建庫。第二創(chuàng)建 P6 專用表空間時(shí)給足初始大小我一般數(shù)據(jù)表空間起步 10G、索引表空間 5G自動(dòng)擴(kuò)展打開但設(shè)上限避免磁盤被悄悄吃滿。第三監(jiān)聽配置要確認(rèn)local_listener和remote_listener正確應(yīng)用服務(wù)器連不上庫十有八九是監(jiān)聽或網(wǎng)絡(luò)訪問控制的問題。數(shù)據(jù)庫裝完后用 P6 安裝介質(zhì)里提供的建庫腳本創(chuàng)建 schema。這一步要注意腳本執(zhí)行用戶的權(quán)限以及腳本里表空間名稱、數(shù)據(jù)文件路徑要和實(shí)際環(huán)境一致。執(zhí)行完檢查有沒有報(bào)錯(cuò)有些腳本報(bào)錯(cuò)不中斷但會(huì)留下殘缺的對(duì)象后面應(yīng)用啟動(dòng)時(shí)才暴露排查成本極高。注意建庫腳本執(zhí)行前先做一次數(shù)據(jù)庫全備腳本中途失敗需要回滾重來時(shí)有備份能省下大量時(shí)間。2.3 數(shù)據(jù)庫連接與網(wǎng)絡(luò)訪問驗(yàn)證數(shù)據(jù)庫就位后別急著裝應(yīng)用先在數(shù)據(jù)庫服務(wù)器上用tnsping驗(yàn)證監(jiān)聽可達(dá)再從應(yīng)用服務(wù)器上用客戶端工具測(cè)試連接。我習(xí)慣在應(yīng)用服務(wù)器上裝一個(gè)輕量客戶端用sqlplus連一次確認(rèn)網(wǎng)絡(luò)、監(jiān)聽、賬號(hào)密碼、服務(wù)名全部正確。這一步花五分鐘能省掉后面應(yīng)用部署時(shí)半小時(shí)的瞎猜。連接測(cè)試通過后記錄下完整的連接串信息主機(jī)、端口、服務(wù)名、schema 用戶名。后面應(yīng)用服務(wù)器配置數(shù)據(jù)源時(shí)要一字不差地填進(jìn)去大小寫、下劃線都不能錯(cuò)。3. 應(yīng)用服務(wù)器與 P6 組件的部署實(shí)現(xiàn)應(yīng)用服務(wù)器是 P6 EPPM 的核心承載層配置項(xiàng)最多也最容易出問題。這一層的思路是先把中間件裝好調(diào)通再部署應(yīng)用包。3.1 應(yīng)用服務(wù)器中間件的安裝與調(diào)優(yōu)P6 EPPM 主流跑在 WebLogic 上部分版本也支持其他中間件。WebLogic 的安裝分兩步先裝基礎(chǔ)中間件再建域。建域時(shí)選擇 P6 提供的模板能自動(dòng)帶出大部分必要配置比手工建域省事且不易漏項(xiàng)。WebLogic 的調(diào)優(yōu)重點(diǎn)在 JVM 參數(shù)。默認(rèn)堆內(nèi)存往往偏小P6 應(yīng)用啟動(dòng)后加載大量類和緩存堆不夠會(huì)頻繁 Full GC表現(xiàn)為頁面響應(yīng)越來越慢。我一般把初始堆和最大堆設(shè)為相同值比如-Xms4g -Xmx4g避免運(yùn)行期堆伸縮帶來的抖動(dòng)元空間設(shè)-XX:MetaspaceSize512m -XX:MaxMetaspaceSize1g垃圾回收器根據(jù) JDK 版本選擇較新版本用 G1 表現(xiàn)更穩(wěn)。域建好后先啟動(dòng)一次管理服務(wù)器確認(rèn)能正常進(jìn)入控制臺(tái)再考慮部署應(yīng)用。這一步是驗(yàn)證中間件本身沒問題把中間件問題和應(yīng)用問題隔離開排查時(shí)思路清晰得多。3.2 P6 應(yīng)用包的部署與數(shù)據(jù)源配置應(yīng)用包部署通過 WebLogic 控制臺(tái)完成把 P6 的 ear 包上傳部署部署時(shí)指定為生產(chǎn)模式還是開發(fā)模式要按環(huán)境用途選。部署過程中最關(guān)鍵的是數(shù)據(jù)源配置需要填數(shù)據(jù)庫連接信息并測(cè)試連接。這里有個(gè)細(xì)節(jié)數(shù)據(jù)源的初始連接數(shù)和最大連接數(shù)要匹配預(yù)期并發(fā)設(shè)太小高并發(fā)時(shí)連接等待設(shè)太大又浪費(fèi)數(shù)據(jù)庫資源我一般初始 10、最大 50 起步壓測(cè)后再調(diào)。部署完成后不要立刻啟動(dòng)先檢查部署描述符里的上下文根、端口配置是否和規(guī)劃一致。有些版本的默認(rèn)上下文根和實(shí)際訪問路徑不同不確認(rèn)清楚會(huì)出現(xiàn)部署成功但訪問 404 的情況。3.3 報(bào)表服務(wù)與作業(yè)服務(wù)的配置要點(diǎn)報(bào)表服務(wù)和作業(yè)服務(wù)是容易被忽視但缺一不可的組件。報(bào)表服務(wù)負(fù)責(zé)生成各類分析報(bào)表配置時(shí)要指定報(bào)表服務(wù)器地址、數(shù)據(jù)庫連接和輸出目錄。輸出目錄的磁盤空間要留足報(bào)表文件積累起來很占地方我見過因?yàn)閳?bào)表目錄寫滿導(dǎo)致整個(gè)報(bào)表功能癱瘓的案例。作業(yè)服務(wù)負(fù)責(zé)后臺(tái)定時(shí)任務(wù)比如進(jìn)度計(jì)算、數(shù)據(jù)同步。配置時(shí)注意作業(yè)的執(zhí)行頻率和超時(shí)時(shí)間頻率設(shè)太密會(huì)給數(shù)據(jù)庫帶來持續(xù)壓力超時(shí)設(shè)太短則大項(xiàng)目計(jì)算容易中斷。這兩個(gè)參數(shù)沒有標(biāo)準(zhǔn)答案要根據(jù)實(shí)際項(xiàng)目規(guī)模和服務(wù)器性能調(diào)我的經(jīng)驗(yàn)是先按默認(rèn)值跑一周觀察作業(yè)日志里的執(zhí)行時(shí)長再針對(duì)性調(diào)整。4. 服務(wù)啟動(dòng)、驗(yàn)證與常見問題排查所有組件裝完真正的考驗(yàn)才開始。啟動(dòng)順序、日志觀察、功能驗(yàn)證每一步都有講究。4.1 正確的啟動(dòng)順序與健康檢查啟動(dòng)順序嚴(yán)格遵循依賴關(guān)系數(shù)據(jù)庫 → 應(yīng)用服務(wù)器管理節(jié)點(diǎn) → 應(yīng)用服務(wù)器受管節(jié)點(diǎn) → 報(bào)表服務(wù) → 作業(yè)服務(wù)。每啟動(dòng)一個(gè)組件等它完全就緒再啟動(dòng)下一個(gè)不要圖快一次性全拉起來否則出問題時(shí)根本分不清是誰的鍋。健康檢查我按這個(gè)清單過數(shù)據(jù)庫監(jiān)聽狀態(tài)、應(yīng)用服務(wù)器控制臺(tái)可訪問、P6 Web 登錄頁能打開、用測(cè)試賬號(hào)能登錄、能創(chuàng)建并保存一個(gè)測(cè)試項(xiàng)目、報(bào)表能正常生成、作業(yè)服務(wù)日志無報(bào)錯(cuò)。全部通過才算部署完成任何一項(xiàng)不過都要停下來排查。4.2 高頻問題速查與排查思路下面這張表是我這些年遇到最多的問題及處理方向按出現(xiàn)頻率排序問題現(xiàn)象可能原因排查方向應(yīng)用啟動(dòng)報(bào)數(shù)據(jù)庫連接失敗連接串錯(cuò)誤、監(jiān)聽未起、網(wǎng)絡(luò)不通先用客戶端工具測(cè)試連接登錄頁能開但登錄報(bào)錯(cuò)數(shù)據(jù)源配置錯(cuò)誤、schema 不完整檢查數(shù)據(jù)源測(cè)試連接、核對(duì)建庫腳本頁面響應(yīng)極慢JVM 堆不足、Full GC 頻繁看 GC 日志、調(diào)大堆內(nèi)存報(bào)表生成失敗報(bào)表服務(wù)未啟動(dòng)、輸出目錄無權(quán)限查報(bào)表服務(wù)日志、檢查目錄權(quán)限作業(yè)不執(zhí)行作業(yè)服務(wù)未啟動(dòng)、調(diào)度配置錯(cuò)誤查作業(yè)服務(wù)日志、核對(duì)調(diào)度時(shí)間中文顯示亂碼數(shù)據(jù)庫字符集非 UTF8確認(rèn)字符集必要時(shí)重建庫排查的核心方法是看日志而且要按組件分層看。應(yīng)用服務(wù)器日志看部署和啟動(dòng)問題應(yīng)用自身日志看業(yè)務(wù)邏輯問題數(shù)據(jù)庫日志看連接和 SQL 問題。養(yǎng)成先看日志再動(dòng)手的習(xí)慣比憑經(jīng)驗(yàn)瞎猜高效得多。4.3 實(shí)操心得與避坑清單最后分享幾條文檔里不會(huì)寫但實(shí)際很管用的經(jīng)驗(yàn)。第一所有配置文件改動(dòng)前先備份改壞了能秒回滾這個(gè)習(xí)慣救過我無數(shù)次。第二安裝過程中每一步的截圖和命令記錄保存好重裝或遷移時(shí)就是現(xiàn)成的操作手冊(cè)。第三測(cè)試環(huán)境驗(yàn)證通過的配置遷移到生產(chǎn)前逐項(xiàng)核對(duì)環(huán)境差異往往是事故源頭。第四磁盤空間監(jiān)控一定要做數(shù)據(jù)庫歸檔、應(yīng)用日志、報(bào)表文件都是空間消耗大戶提前設(shè)告警比事后救火強(qiáng)。這套部署流程我在不同規(guī)模的環(huán)境里反復(fù)驗(yàn)證過單機(jī)測(cè)試環(huán)境從零到可用大約半天分布式生產(chǎn)環(huán)境視復(fù)雜度一到三天。真正耗時(shí)的從來不是安裝本身而是配置調(diào)優(yōu)和問題排查把上面這些細(xì)節(jié)吃透能少走很多彎路。后續(xù)如果要做高可用或性能擴(kuò)展也是在這套基礎(chǔ)上疊加地基打牢了往上加?xùn)|西才踏實(shí)。