引言
? 大家拿到代碼后,要如何運行呢?導入IDEA,然后啟動?開發(fā)過程可定沒有問題,那生產(chǎn)環(huán)境呢?在現(xiàn)在互聯(lián)網(wǎng)大環(huán)境下,越來越要求開發(fā)運維一體化。如果對于企業(yè)級的項目管理方式不了解,那么開發(fā)工作將舉步維艱。這一節(jié)課主要帶大家快速理解一下電商項目的運維部署方式。電商項目經(jīng)過綜合考慮,即迎合互聯(lián)網(wǎng)大廠的DevOps一體化運維趨勢,又盡量降低運維的門檻,實現(xiàn)了一套簡化版的自動化部署體系。其目的,是為了讓大部分同學都能夠理解互聯(lián)網(wǎng)大廠的DevOps是怎么回事。當然,有基礎的同學也可以根據(jù)電商的部署方案拓展出虛擬化,云原生等更貼近現(xiàn)代化的部署方式。并且可以基于自己的開發(fā)經(jīng)驗,開始思考如何落地DevOps,來提高項目部署的效率。
? 今天本文關(guān)注點主要是以下幾個問題:
- 熟悉SpringBoot常見的Maven打包方式
- 基于Jenkins和GitLab部署基礎自動化運維體系
- CI\CD的優(yōu)化方案
- 基于FileBeat+Logstash+ES實現(xiàn)的典型分布式日志收集體系
一、大廠都在做的DevOps,CI\CD都是什么?
? 談到DevOps,只要你有實際項目的開發(fā)經(jīng)驗,那么對這個詞一定不會陌生。各大互聯(lián)網(wǎng)廠商都在不斷推出自己的DevOps實踐落地的理論、規(guī)則、產(chǎn)品。我們這個電商項目也不例外。代碼最終需要經(jīng)過DevOps的一系列操作才能部署到服務器上真實運行。那到底什么是DevOps呢?
1、開發(fā)與運維割裂的問題
? 當開發(fā)人員基于本地開發(fā)環(huán)境完成了代碼開發(fā)后,最終是需要部署到生產(chǎn)的服務器上執(zhí)行的。在傳統(tǒng)的運維體系下,開發(fā)和運維通常都是割裂的。很多大型項目中,開發(fā)人員不允許接觸生產(chǎn)環(huán)境的服務器,服務器只能由運維團隊進行操作。這樣可以極大的提高服務器的安全性。尤其對于像我們的電商這樣面向互聯(lián)網(wǎng)的項目,不經(jīng)保護的開放服務,就是給黑客提供攻擊的靶子。
? 因此,在現(xiàn)代化的大型軟件項目中,對于開發(fā)人員的要求也更為全面。雖然開發(fā)人員不要求像專業(yè)的運維人員一樣,掌握服務器的各種安全策略、參數(shù)調(diào)優(yōu)等。但是對于基礎的運行環(huán)境運維操作也必須要了解,這樣才能指導運維人員進行業(yè)務環(huán)境部署,也就是開發(fā)運維一體化。雖然現(xiàn)在有很多工具能夠幫助開發(fā)人員減少一些復雜的操作,但是開發(fā)人員還是需要更多的接觸運維的工作。
? 但是這種運維方式,同時也給項目開發(fā)過程中帶來了很多困難。
? 一方面,開發(fā)人員只能向運維人員描述具體的部署方式。但是由于開發(fā)人員無法接觸到生產(chǎn)服務器,所以文字描述的方式往往很難保證操作的準確性。經(jīng)常會出現(xiàn)開發(fā)人員在開發(fā)環(huán)境運行得很好的迭代包,升級到生產(chǎn)環(huán)境上之后無法保證升級的效果。對于現(xiàn)在流行的基于敏捷開發(fā)的大型項目來說,很多需求需要以代碼分支的方式進行并行開發(fā),然后再合并部署,這其中更是非常容易出現(xiàn)錯誤,造成生產(chǎn)環(huán)境不穩(wěn)定。
? 另一方面,當項目在線上運行出現(xiàn)故障時,開發(fā)人員也很難第一時間接觸到錯誤日志。如果線上出現(xiàn)問題,開發(fā)人員往往需要找運維部門協(xié)同,才能獲取到生產(chǎn)環(huán)境的服務日志。這會極大的延緩錯誤排查的及時性。
2、DevOps與CI\CD
? 以上那些問題的核心,其核心就是在傳統(tǒng)運維體系下,開發(fā)和運維之間是有天然的壁壘和鴻溝的。而DevOps則是試圖打破這些壁壘鴻溝的一種方法論。DevOps是Development(開發(fā))和Operation(運維)兩個單詞的組合,他是一種重視軟件開發(fā)人員和運維技術(shù)人員之間溝通合作的文化、運動或者慣例。通過自動化軟件交互和架構(gòu)變更的流程,使得構(gòu)建、測試、發(fā)布軟件時能夠更加快捷、頻繁和可靠。
? 總而言之,DevOps是一個標準,一種方法論或者說是一個目標,并不指一個特定的規(guī)則或者一系列特殊的工具。那要如何落地DevOps呢?通常,這就需要CI\CD出馬了。
? CI\CD中的CI指的是持續(xù)集成Continuous Integeration,他是開發(fā)人員的自動化過程。成功的CI意味著人員同的新代碼變更會定期構(gòu)建、測試并合并到共享存儲庫(比如Git或者SVN)。而CD指的是持續(xù)交付Continuous Delivery和持續(xù)部署Continuous Deployment。成功的CD意味著運維人員可以從共享存儲庫中持續(xù)獲取到最新的產(chǎn)品副本,并確保最新的產(chǎn)品副本可以正確更新到服務器上。
? 關(guān)于如何達成CI\CD,各大互聯(lián)網(wǎng)廠商提供了大量的方法論以及工具。下面就以電商項目為例,基于最為典型的GitLab和Jenkins搭建一套簡單的自動部署環(huán)境。
二、使用GitLab+Jenkins搭建CI\CD執(zhí)行環(huán)境
? 關(guān)于GitLab和Jenkins的安裝過程,這里只簡單介紹一下關(guān)鍵步驟。如果對安裝有問題的同學,可以自行到網(wǎng)上搜索一下安裝教程,網(wǎng)上的資料非常多。
1、GitLab安裝
? GitLab是企業(yè)中最為常用的私有代碼倉庫解決方案。你可以把他理解為一個企業(yè)自己搭建的GitHub或者Gitee(程序員交友平臺,不會沒用過把?)。企業(yè)通常會通過GitLab搭建自己的代碼倉庫,開發(fā)人員的應用代碼都通過GitLab進行協(xié)同開發(fā)。
? GitLab是一個開源項目,分為免費的ce社區(qū)版和收費的ee企業(yè)版。這里介紹ce社區(qū)版的安裝過程。
? 首先要檢查服務器配置。GitLab需要部署非常多的后臺服務,通常建議單機內(nèi)存不要低于4G。如果配置太低的話,會出現(xiàn)很多奇怪的問題。Linux服務器需要提前安裝幾個服務 yum install -y curl policycoreutils-python openssh-server 。如果已經(jīng)安裝了,這一步可以省略。
? 然后獲取GitLab安裝包。社區(qū)版的GitLab下載地址https://packages.gitlab.com/gitlab/gitlab-ce。
本項目中采用的Linux服務器,就可以選擇下載gitlab-ce-15.1.0-ce.0.el7.x86_64.rpm。
? 接下來就可以安裝GitLab了。 執(zhí)行rpm -Uvh gitlab-ce-15.1.0-ce.0.el7.x86_64.rpm 開始安裝。
? 安裝完成后,第一次運行GitLab前,需要執(zhí)行一次配置初始化操作。 gitlab-ctl reconfig。 這個過程耗時比較長。
? 接下來就可以使用gitlab-ctl指令來操作gitlab服務了。
- gitlab-ctl reconfigure 重新配置gitlab。
- gitlab-ctl start 啟動gitlab
- gitlab-ctl stop 停止gitlab
- gitlab-ctl restart 重啟gitlab
- gitlab-ctl status 查看gitlab服務狀態(tài)
- gitlab-ctl tail 查看gitlab服務日志。
? 服務啟動完成后,就可以訪問gitlab服務了。默認的服務端口就是80端口。默認的用戶名和密碼是root/123456(通常建議登錄后立即修改默認密碼)。
如果需要修改訪問的地址和端口,可以修改/etc/gitlab/gitlab.rb配置文件,修改其中的external_url屬性即可。
## GitLab URL ##! URL on which GitLab will be reachable. ##! For more details on configuring external_url see: ##! https://docs.gitlab.com/omnibus/settings/configuration.html#configuring-the-external-url-for-gitlab ##! ##! Note: During installation/upgrades, the value of the environment variable ##! EXTERNAL_URL will be used to populate/replace this value. ##! On AWS EC2 instances, we also attempt to fetch the public hostname/IP ##! address from AWS. For more details, see: ##! https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html external_url 'http://192.168.0.1'
? 接下來就可以登錄進入GitLab,維護基礎權(quán)限信息,并將項目代碼上傳到Git倉庫當中。這些基礎的操作跟GitHub或者Gitee基本上是一樣的。
2、Jenkins安裝
? Jenkins是企業(yè)最常用的一個自動化部署軟件。下載地址為https://www.jenkins.io/download/ 。建議下載LTS(長期支持)版本的war包部署。下載獲取jenkins.war文件。
? 首先,需要安裝JDK。 Jenkins運行需要JDK環(huán)境支持,目前Jenkins建議使用JDK11版本。
? 然后,就可以直接啟動Jenkins。 啟動指令 java -jar Jenkins.war。 當然,你也可以使用后臺執(zhí)行的方式。 nohup java -jar jenkins.war & 。這種方式不會占用當前命令行窗口,日志輸出到nohup.out下。
在啟動時,也可以指定端口。 java -jar Jenkins.war --httpPort=8080 。 端口默認就是8080端口。
? 在第一次啟動的過程中,Jenkins會在日志文件中打印默認的admin用戶密碼。這個需要留意一下。
*************************************************************
Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:
e3c2de8a2084429ea733ef30512a0523
This may also be found at: /root/.jenkins/secrets/initialAdminPassword
*************************************************************
? 啟動完成后,就可以訪問Jenkins的前臺管理頁面http://192.168.65.200:8080/。第一次訪問時,前端頁面會會引導進行一些初始化工作。例如,需要輸入admin用戶的默認密碼,這個密碼就在啟動日志當中。
后續(xù)還會引導設定admin用戶的用戶名。
? 然后會引導安裝一些插件。這一步比較自由。你可以按照默認方式安裝,也可以選擇一些你認識的常用插件安裝。關(guān)鍵插件漏了沒有關(guān)系,后續(xù)也可以再安裝插件。
? 引導步驟安裝完成后,就可以進入Jenkins的首頁了。
? 接下來需要安裝幾個核心的插件。選擇 Manage Jenkins-> Manage Plugins,進入插件管理頁面。
? 在這里需要安裝幾個核心的插件。包括Git 、Git client、NodeJS Plugin、Maven integration plugin。如果你希望Jenkins能夠更多的顯示中文,還可以安裝 Localization:Chinese(Simplified)插件。下載完成后有些插件需要重啟才能生效。Jenkins重啟的方式是直接在瀏覽器上訪問restart接口。
? 重啟完成后,還需要配置幾個基礎的組件。進入Mange Jenkins->Global ToolConfiguration頁面。在這里需要對Maven、Git和NodeJS組件進行配置。你可以選擇按照頁面提示,自動下載安裝對應的組件。 當前電商環(huán)境中是直接另外去安裝對應的組件。
? 例如對于git,只要服務器能夠支持git指令接口。如果沒有安裝的話,可以使用yum -install git 安裝git客戶端。
[root@192-168-65-200 ~]# git --version
git version 1.8.3.1
? 而Maven和NodeJS插件,可以去官網(wǎng)上下載對應的壓縮包,解壓后,將bin子目錄配置到環(huán)境變量當中。跟安裝JDK的方式差不多。
同樣只要服務器能夠直接支持mvn指令和node指令即可。
[root@192-168-65-200 ~]# mvn -versin
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /app/maven/apache-maven-3.6.3
Java version: 11.0.10, vendor: Oracle Corporation, runtime: /app/jdk/jdk-11.0.10
Default locale: zh_CN, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-1160.el7.x86_64", arch: "amd64", family: "unix"
[root@192-168-65-200 bin]# node -v
v14.15.0
? 到這里基礎環(huán)境就算搭建完成了。
3、基于GitLab+Jenkins快速實現(xiàn)CI\CD
? 接下來需要在Jenkins中配置一個構(gòu)建任務。下面就以電商項目的后端工程為例,演示配置過程。另外電商項目的兩個前端工程也可以以類似的方式進行配置。
1、創(chuàng)建一個maven項目
? 在Jenkins首頁選擇新建Item,然后選擇構(gòu)建一個maven項目
2、配置項目構(gòu)建及部署過程
? 接下來在Jenkins中配置項目的配置項還是挺多的,這里只列出幾個關(guān)鍵的配置。其他部分可以自行調(diào)整。
? 首先需要在源碼管理部分配置對應的git倉庫地址。
? 構(gòu)建觸發(fā)器部分,可以選擇配置Poll SCM選項。這個選項可以定時掃描Git代碼倉庫。當發(fā)現(xiàn)Git倉庫代碼有變化,即有代碼提交時,就會觸發(fā)一次構(gòu)建任務。當前電商項目采用手動控制發(fā)布的方式,就沒有選擇配置了。
這里面Poll SCM是一個比較常用的配置。通過這個配置,可以讓jenkins定期去檢查代碼庫。如果發(fā)現(xiàn)代碼庫有更新,則自動觸發(fā)當前任務,完成項目的構(gòu)建以及部署。當前電商項目編譯任務太重,提交也不太頻繁,所以就選擇不配置該屬性。
? 構(gòu)建環(huán)境部分建議選擇一下JDK版本,因為電商項目采用的是JDK8版本進行開發(fā)。
? 接下來的Build部分,就可以選擇需要執(zhí)行的編譯腳本。
這一步相當于指定使用 mvn package -Dmaven.test.skip=true指令對后端項目進行重新打包構(gòu)建。
如果是前端項目,就需要用Nodejs的npm run build指令來構(gòu)建。
? 構(gòu)建完成之后,就會在后端項目的各個模塊的target目錄下生成可執(zhí)行的包。這時,可以選擇用Jenkins將這些Jar包分發(fā)到遠程服務器上,并直接運行。
前端項目也可以用同樣的方式傳遞到遠端服務器上。遠端指令只需要執(zhí)行 nginx -s reload 更新一下即可。
? 這樣就完成了一個基礎項目的配置過程。接下來,保存之后,就可以選擇Jenkins首頁對應項目右側(cè)的三角指令發(fā)起一次構(gòu)建了。構(gòu)建過程中如果有問題,可以查看構(gòu)建日志,進行排查。
這里完成的是一個最簡單的Maven項目構(gòu)建。實際上,在企業(yè)中,還會構(gòu)建更復雜的任務。
例如集成Docker,進行虛擬化部署。
添加Blue Ocean插件做一些代碼質(zhì)量檢測,郵件通知等復雜的步驟。甚至使用Pepeline構(gòu)建更為復雜的任務流水。
或者搭建SonarQube服務,并通過jenkins集成。這樣就可以使用SonarQube服務來進行代碼質(zhì)量檢測。
三、后端項目打包及部署方式
? 從剛才的部署過程中可以看到,基于Jenkins的CI\CD配置方式就是執(zhí)行Maven對項目進行編譯,然后將Jar包傳到遠端服務器上執(zhí)行。這個過程跟我們手動進行任務部署是差不多的,只不過Jenkins將這些過程自動完成了。
? 但是這里其實有一個小問題。當前電商項目在編譯時,是在pom.xml中采用SpringBoot的Maven插件將整個項目打成了一個可執(zhí)行的Jar包。 這樣打出來的Jar包可以直接使用Java -jar指令執(zhí)行。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.2.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<!-- 解決運行包不能被其他包依賴的問題 -->
<configuration>
<classifier>exec</classifier>
</configuration>
</plugin>
</plugins>
</build>
? 但是,這種方式也有一個很大的問題,就是Jar包太大了。這么大的Jar包,編譯會很耗時,并且在網(wǎng)絡中傳輸是非常麻煩的。所以,對于一些大型項目,通常不會采用這種一體化的fat Jar的方式。而會選擇將依賴單獨打成小的Jar包。這樣后續(xù)每次更新只需要更新調(diào)整過的少量Jar包即可。那有哪些Maven打包方式可以幫助我們打出小的jar包呢?
? 其實Maven提供了很多的打包插件。例如將上面的plugin部分替換為maven-dependency-plugin,就可以將項目打成小包。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<!-- <version>2.10</version> -->
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>export</outputDirectory> <!-- 將依賴包放入export文件夾 -->
<excludeTransitive>false</excludeTransitive>
<stripVersion>true</stripVersion>
</configuration>
</execution>
</executions>
</plugin>
? 通過這種方式,就可以將所有依賴的jar包都放到export文件夾中,target目錄下的jar包只包含當前項目的源碼,文件大小就會小很多。
? 將export目錄下的所有jar包和target下的當前項目jar包上傳到服務器的同一個目錄當中,就可以直接運行了。這種方式就跟很多開源框架的運行方式相似了。至于要如何運行呢?當然就不能用java -jar指令簡單執(zhí)行了,需要通過java -cp指令指定依賴包和主啟動類執(zhí)行。至于如何使用這個指令,你之前學過的很多開源組件都可以提供幫助了。比如shardingproxy、RocketMQ等,都有這樣的腳本。
? 這里也給出一個簡單的Linux執(zhí)行腳本示例,供你參考。
more runapp.sh
#!/bin/sh
#執(zhí)行jar包
RUN_LIBS=""
#依賴jar包 自行制定目錄
SUPPORT_LIBS=""
RUN_LIB_PATH="/app/lib"
SUPPORT_LIB_PATH="/app/support"
#加載程序包
for i in ${RUN_LIB_PATH}/* ; do
RUN_LIBS=${RUN_LIBS}:$i
done
#加載依賴包
for i in ${SUPPORT_LIB_PATH}/* ; do
SUPPORT_LIBS=${SUPPORT_LIBS}:$i
done
#整合classpath
CLASSPATH=${RUN_LIBS}:${SUPPORT_LIBS}
export CLASSPATH
#調(diào)用java指令執(zhí)行。-D輸入?yún)?shù) java中可以用 System.getProperties讀取。同時指定執(zhí)行入口類 SpringBootApplication 這是一個典型的Springboot的執(zhí)行方式。
java -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,address=27899,suspend=n -cp $CLASSPATH -Dspring.profiles.active=prod com.tuling.TulingmallCartApplication -D
user.timezone=GMT+08 1>tulingmall-admin.out 2>tulingmall-admin.err &
echo Start App Success!
實際上這樣定制腳本對于提高運行效率是非常重要的,你學了很多次的JVM調(diào)優(yōu)就體現(xiàn)在腳本定制的過程中。在腳本最后的java指令中,可以添加哪些優(yōu)化參數(shù)?
另外,這種部署方式,你可以自己嘗試用jenkins配置自動部署嗎?
? 實際上,Maven還提供了非常多插件。比如對于很多復雜的項目,可能需要將不同的模塊輸出到多個不同的jar包當中,而不是所有代碼全都輸出一個jar包。下面就是使用maven-jar-plugin插件的一個可行的示例,將不同模塊的代碼分別整合到myapp.jar和myapp2.jar中。有興趣你可以自己嘗試下。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<configuration> <!-- manifest配置信息 主要是可以配置主執(zhí)行類。有主執(zhí)行類,可以用java-jar直接執(zhí)行。沒有的話就需要指定執(zhí)行類 -->
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>support/</classpathPrefix>
<mainClass>com.myapp.MyAppApplication</mainClass>
<!-- 可以按上面的方式自己配置,也可以指定MF文件打包。 -->
<manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>myapp1-jar</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<classifier>myapp</classifier>
<includes>
<include>com/myapp/**</include>
<include>mybatis/**</include>
<include>templates/**</include>
<include>*.properties</include>
<include>dubbo.xml</include>
</includes>
</configuration>
</execution>
<execution>
<id>myapp2-jar</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<classifier>myapp2</classifier>
<includes>
<include>com/myapp2/crawler/*</include>
<include>com/myapp2/crawler/*</include>
<include>com/myapp2/utils/**</include>
<include>log4j.properties</include>
</includes>
</configuration>
</execution>
</executions>
</plugin>
? 如果你對Maven感興趣,可以去Maven官網(wǎng)上看看Maven目前官方提供的插件。 https://maven.apache.org/plugins/index.html。 這上面能找到非常多有趣的插件,并且都有詳細的說明。比如changelog插件,可以打印出Maven倉庫中最近的提交記錄。checkstyle和pmd插件可以對代碼進行靜態(tài)檢查。javadoc插件可以打印出項目文檔,你還可以用pdf插件,打印出pdf版本的項目文檔。或者使用antrun插件去執(zhí)行一些ant腳本(老程序員應該對ant很熟悉)。 很多精彩等你發(fā)現(xiàn)。
四、使用FileBeat+Logstash+ES實現(xiàn)分布式日志收集。
? 這一章節(jié)是一個補充的內(nèi)容。在大型項目中,往往服務都是分布在非常多不同的機器上,每個機器都會打印自己的log日志。
? 但是,這樣分散的日志,本來就無法進行整體分析。再加上微服務的負載均衡體系,甚至連請求打到了哪個服務器上都無法確定。給問題排查帶來了很多的困難。因此就需要將分散的日志收集到一起,這樣才能整體進行分析。
? 在Java應用中,后續(xù)我們會介紹使用skywalking,基于微服務架構(gòu)進行整體鏈路追蹤。但是這種方式會顯得比較重。如果只是分析nginx這樣的中間件,skywalking顯然就無能為力了。因此,還需要一個比較簡單快捷,對應用無侵入的方式統(tǒng)一收集日志。通常,業(yè)界常用的還是通過ELK中間件來收集日志。整體的流程是這樣的。
? filebeat,logstash和es都是ELK組件中的標準處理組件。其中,ES是一個高度可擴展的全文搜索和分析引擎,能夠?qū)Υ笕萘康臄?shù)據(jù)進行接近實時的存儲、搜索和分析操作,通常會跟Kibana部署在一起,由Kibana提供圖形化的操作功能。LogStash是一個數(shù)據(jù)收集引擎,他可以動態(tài)的從各種數(shù)據(jù)源搜集數(shù)據(jù),并對數(shù)據(jù)進行過濾、分析和統(tǒng)一格式等簡單操作,并將輸出結(jié)果存儲到指定位置上。但是LogStash服務過重,如果在每個應用上都部署一個logStash,會給應用服務器增加很大的負擔。因此,通常會在應用服務器上,部署輕量級的filebeat組件。filebeat可以持續(xù)穩(wěn)定的收集簡單數(shù)據(jù),比如Log日志,統(tǒng)一發(fā)給logstash進行收集后,再經(jīng)過處理存到ES。
? 這一套流程是企業(yè)中最為基礎的分布式日志收集方案。這一節(jié)課就帶大家實際搭建一個filebeat和logstash服務,用來收集前端項目的nginx日志,然后將nginx日志經(jīng)過logstash保存到es中。
關(guān)于ES以及配到的Kibana,有VIP課程帶大家搭建使用,這里就不介紹如何搭建了。只是介紹一下filebeat和logstash的搭建過程。
? 首先,搭建LogStash
? 去官網(wǎng)下載與ES配套的LogStash 7.17.3版本發(fā)布包logstash-7.17.3-linux-x86_64.tar.gz。 下載地址:https://www.elastic.co/cn/downloads/past-releases#logstash 。
使用tar -zxvf logstash-7.17.3-linux-x86_64.tar.gz 將壓縮包解壓到es用戶根目錄。
? 解壓完成后需要配置Logstash需要的JDK。這個JDK不需要額外下載,在logstash的安裝目錄下有一個jdk目錄,里面有內(nèi)置的配套JDK。這時,需要配置一個環(huán)境變量LS_JAVA_HOME指向這個內(nèi)置的JDK即可。
? 接下來可以簡單啟動一下logstash進行測試。進入logstash的安裝目錄,啟動一個簡單的logstash任務。
bin/logstash -e 'input { stdin { } } output { stdout {} }'
? 這個任務啟動需要一定的時間。
? 啟動完成后,就可以從logstash的控制臺輸入信息,然后又重新輸出到控制臺中。使用ctrl_+D退出控制臺。
#控制臺輸入hello
hello
# 控制臺輸出logstash處理結(jié)果
{
"message" => "hello",
"@version" => "1",
"host" => "es-node3",
"@timestamp" => 2022-09-14T02:14:05.709Z
}
? 這樣一個簡單的logstash就安裝完成了。
? 接下來需要對logstash的輸入和輸出目錄進行配置。進入config目錄,在目錄下直接修改logstash-sample.conf文件即可。
配置文件名字可以隨便取,后續(xù)啟動時需要指定配置文件。
# Sample Logstash configuration for creating a simple
# Beats -> Logstash -> Elasticsearch pipeline.
input {
beats {
port => 5044
}
}
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}"}
}
}
output {
elasticsearch {
hosts => ["http://localhost:9200"]
#index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
index => nginxlog
user => "elastic"
password => "123456"
}
}
這個配置中:
input表示輸入,這里表示從filebeat輸入消息,接收的端口是5044。
output表示數(shù)據(jù)的輸出,這里表示將結(jié)果輸出到本機的elasticsearch中,索引是nginxlog。
filer表示對輸入的內(nèi)容進行格式化處理。這里指定的grok是logstash內(nèi)置提供的一個處理非結(jié)構(gòu)化數(shù)據(jù)的過濾器。他可以以一種類似于正則表達式的方式來解析文本。簡單的配置規(guī)則比如:%{NUMBER:duration} %{IP:client} 就是從文本中按空格,解析出一個數(shù)字型內(nèi)容,轉(zhuǎn)化成duration字段。然后解析出一個IP格式的文本,轉(zhuǎn)換成client字段。而示例中使用的COMBINEDAPACHELOG則是針對APACHE服務器提供的一種通用的解析格式,對于解析Nginx日志同樣適用。
一條nginx的日志大概是這樣:
83.149.9.216 - - [04/Jan/2015:05:13:42 +0000] "GET /presentations/logstash-monitorama-2013/images/kibana-search.png HTTP/1.1" 200 203023 "http://semicomplete.com/presentations/logstash-monitorama-2013/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36"
解析出來的是一個json格式的數(shù)據(jù),包含以下字段
Information Field Name IP Address clientip
User ID ident
User Authentication auth
timestamp timestamp
HTTP Verb verb
Request body request
HTTP Version httpversion
HTTP Status Code response
Bytes served bytes
Referrer URL referrer
User agent agent
? 配置好這個文件后,就可以直接啟動了。
nohup bin/logstash -f config/logstash-sample.conf --config.reload.automatic &
config.reload.automatic表示配置自動更新,也就是說以后只要改動了配置文件,就會及時生效,不需要重啟logstash
nohup指令只是表示不要占據(jù)當前控制臺,將控制臺日志打印到nohup.out文件中。
logstash更詳細的配置說明參見官方文檔:https://www.elastic.co/guide/en/logstash/7.17
? 然后,搭建filebeat
? 之前已經(jīng)啟動了logstash服務,通過5044端口監(jiān)聽filebeat服務。接下來就需要在各個應用服務器上部署filebeat,往logstash發(fā)送日志消息即可。
? filebeat的下載地址: https://www.elastic.co/cn/downloads/past-releases#filebeat 。同樣選擇配套的7.17.3版本filebeat-7.17.3-linux-x86_64.tar.gz。并使用tar -zxvf filebeat-7.17.3-linux-x86_64.tar.gz指令解壓。
? 在解壓目錄下已經(jīng)提供了一個模版配置文件filebeat.yml,我們只需要修改這個文件即可。 這個模板文件里面的示例非常清楚,從文件讀取日志,輸出到logstash的配置,文件當中都有。這里只列出修改的部分。
? 先修改文件輸入的部分配置
# ============================== Filebeat inputs ===============================
filebeat.inputs:
- type: filestream
# Change to true to enable this input configuration.
enabled: true
# Paths that should be crawled and fetched. Glob based paths.
paths:
- /www/wwwlogs/access.log
#- c:\programdata\elasticsearch\logs\*
? 然后修改輸出到logstash的部分配置
# ------------------------------ Logstash Output -------------------------------
output.logstash:
# The Logstash hosts
hosts: ["192.168.65.114:5044"]
默認打開的是output.elasticsearch,輸入到es,這部分配置要注釋掉。
? 這樣就完成了最簡單的filebeat配置。接下來啟動filebeat即可
nohup ./filebeat -e -c filebeat.yml -d "publish" &
? filebeat任務啟動后,就會讀取nginx的日志,一旦有新的日志記錄,就會將日志轉(zhuǎn)發(fā)到logstash,然后經(jīng)由logstash再轉(zhuǎn)發(fā)到ES中。并且filebeat對于讀取過的文件,都是有記錄的,即便文件改了名字也不會影響讀取的進度。比如對log日志,當前記錄的log文件,即便經(jīng)過日志輪換改成了其他的名字,讀取進度也不會有變化。而新生成的log日志也可以繼續(xù)從頭讀取內(nèi)容。如果需要清空filebeat的文件記錄,只需要刪除安裝目錄下的data/registry目錄即可。
更詳細的配置參見官方文檔: https://www.elastic.co/guide/en/beats/filebeat/7.17/logstash-output.html
? 接下來,進入ES查看數(shù)據(jù)是否生效
? 進入Kibana的前端頁面,即可查詢到nginxlog索引下的日志記錄
? 后續(xù)就可以針對這些nginx的日志信息,進行分析。nginx的日志基本上是所有大型項目進行日志收集必不可少的一個重要數(shù)據(jù)來源,從nginx的日志中可以分析出大量有用的結(jié)果。比如最常見的PV,UV,還有熱點功能等。文章來源:http://www.zghlxwxcb.cn/news/detail-488605.html
? 課上就只帶大家搭建最簡單的一組服務了。在搭建過程中可以看到,filebeat和logstash對于常見的輸入輸出源都已經(jīng)提供了實現(xiàn),大部分情況下,只需要簡單配置即可。在實際項目中,往往會以此為基礎構(gòu)建更復雜的分布式日志處理方案。 比如在logstash后增加一個Kafka,將LogStash收集的日志消息存入到kafka ,再經(jīng)過基于Kafka的流式計算,將PV,UV這類的統(tǒng)計結(jié)果存入ES。文章來源地址http://www.zghlxwxcb.cn/news/detail-488605.html
到了這里,關(guān)于GitLab+Jenkins搭建DevOps一體化運維平臺的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!