終極指南:企業(yè)級(jí)云原生 PaaS 平臺(tái)日志分析架構(gòu)全面解析
早些時(shí)分 Erda Show 針對(duì)微服務(wù)監(jiān)控、日志等內(nèi)容做了專場(chǎng)共享,許多同學(xué)聽(tīng)完后意猶未盡,想了解更多關(guān)于日志剖析的內(nèi)容。Erda 團(tuán)隊(duì)做日志剖析也有一段時(shí)刻了,所以這次計(jì)劃和咱們?cè)敿?xì)共享一下咱們?cè)谧龅囊恍┕ぷ?,期望?duì)咱們有所協(xié)助。
日志剖析途徑其實(shí)是 Erda 微服務(wù)管理子途徑下面的一個(gè)功用模塊,那么今天我將從三個(gè)方面來(lái)打開(kāi)共享:
- 日志剖析途徑出現(xiàn)的必要性;
- 日志剖析途徑架構(gòu)規(guī)劃;
- Erda 現(xiàn)在是怎么做的、做了哪些工作以及未來(lái)的發(fā)展方向。
日志剖析途徑的必要性
“微服務(wù)”這一概念大概在 2013 年出現(xiàn),從這一概念初期到現(xiàn)在,大部分應(yīng)用的事務(wù)場(chǎng)景皆是分布式、容器化的布置架構(gòu),或許至少是多服務(wù)架構(gòu),每個(gè)服務(wù)基本上對(duì)錯(cuò)單點(diǎn)的,并且會(huì)做單服務(wù)多實(shí)例的高可用布置。
在這種場(chǎng)景下,咱們需求重點(diǎn)處理關(guān)于日志的幾個(gè)問(wèn)題。
需求處理的問(wèn)題
1. 接口報(bào)錯(cuò)了,如安在應(yīng)用的多個(gè)容器中快速的找到詳細(xì)的反常日志?
第一個(gè)要處理的問(wèn)題是關(guān)于反常日志的定位功率問(wèn)題。比方,前端在請(qǐng)求某個(gè)頁(yè)面,接口報(bào)錯(cuò)了,隨后反饋給開(kāi)發(fā)人員,慣例的接口報(bào)錯(cuò)一般不會(huì)直接給用戶暴露特別詳細(xì)的反常信息,只會(huì)有一個(gè)狀態(tài)或是扼要的過(guò)錯(cuò)概述,這時(shí)需求開(kāi)發(fā)者經(jīng)過(guò)日志找到詳細(xì)的反常信息(比方倉(cāng)庫(kù)等)。
一般來(lái)說(shuō),經(jīng)過(guò)接口途徑咱們能夠定位是哪個(gè)服務(wù)的報(bào)錯(cuò),但進(jìn)一步講,咱們?cè)趺创_認(rèn)是這個(gè)服務(wù)下的哪個(gè)實(shí)例的報(bào)錯(cuò)呢?假設(shè)說(shuō)咱們選用這種比較原始的方法,或許需求開(kāi)發(fā)者分別檢查每個(gè)實(shí)例(容器)的日志,這樣會(huì)直接對(duì)開(kāi)發(fā)功率產(chǎn)生影響。
2. 怎么便利的檢查現(xiàn)已宕機(jī)的應(yīng)用容器的日志?
別的一個(gè)需求處理的問(wèn)題是日志存儲(chǔ)的耐久性問(wèn)題。比方說(shuō)在 K8s 途徑下,某個(gè)應(yīng)用服務(wù)的某個(gè) pod 掛掉了被重新調(diào)度到了其他節(jié)點(diǎn),或許本地存儲(chǔ)的容器日志由于時(shí)刻的翻滾而翻滾沒(méi)了,這時(shí)假設(shè)咱們想去回頭看一下之前的日志,在機(jī)器上現(xiàn)已不太簡(jiǎn)略找到了。
3. 怎么能及時(shí)的發(fā)現(xiàn)某個(gè)應(yīng)用容器產(chǎn)生了反常?
前兩個(gè)問(wèn)題歸于被動(dòng)型的需求,也便是說(shuō)前端事務(wù)上現(xiàn)已暴露出一些問(wèn)題,然后咱們?nèi)セ厮荨⒉檎乙恍┤罩镜脑敿?xì)記錄的需求。由于是用戶反饋,這個(gè)流程鏈上的毛病處理時(shí)刻是相對(duì)較長(zhǎng)的,那么應(yīng)該怎么縮短毛病處理時(shí)刻?
很天然咱們會(huì)想到主動(dòng)告警,在還沒(méi)有大面積前端接口被大量用戶發(fā)現(xiàn)前,后端出現(xiàn)反常時(shí),體系能夠更及時(shí)的進(jìn)行告警,并告訴相關(guān)人員及時(shí)處理,削減毛病時(shí)刻。這時(shí)咱們就非常需求一個(gè)別系能夠繼續(xù)監(jiān)聽(tīng)一切容器的日志,幫忙開(kāi)發(fā)者發(fā)現(xiàn)其間的反常并主動(dòng)告警。
假設(shè)說(shuō)沒(méi)有日志剖析途徑,其實(shí)以上三個(gè)問(wèn)題并不是不能處理,可是會(huì)極大程度的影響功率。那么假設(shè)有了這樣的日志剖析途徑,由它來(lái)供給集中式查詢、耐久化存儲(chǔ)以及主動(dòng)告警等功用,咱們能夠快速且高效的處理這三個(gè)問(wèn)題。
日志剖析途徑能供給什么
說(shuō)到日志剖析途徑的必要性,咱們務(wù)必要了解一下它能為咱們供給什么樣的服務(wù),下面咱們就來(lái)詳細(xì)看一下:
1. 集中式、一站式查詢
在查詢方面,日志剖析途徑應(yīng)該是集中式、一站式的查詢,不再需求登錄不同機(jī)器或許容器去低效地手動(dòng)檢查日志,而只需求在一個(gè)一致的頁(yè)面上輸入一些查詢語(yǔ)句,就能輕松查詢一切容器的日志了。
2. 耐久化,前史可追溯
在存儲(chǔ)方面,能夠給日志剖析途徑配備有預(yù)期的專門存儲(chǔ)配額,以便能夠更好地應(yīng)對(duì)宕機(jī)、升級(jí)、調(diào)度等導(dǎo)致日志跨節(jié)點(diǎn)的情況,保持查詢前史日志時(shí)的簡(jiǎn)略性。
3. 智能化,主動(dòng)發(fā)現(xiàn)問(wèn)題
智能化告警一般也是一個(gè)必要功用,這兒的智能化有兩層意思:
你能夠主動(dòng)裝備一些規(guī)矩,比方說(shuō)依據(jù)代碼或現(xiàn)已產(chǎn)生的一些反常日志,能夠知道特定反常是什么姿態(tài),隨后配一個(gè)規(guī)矩,體系就會(huì)繼續(xù)對(duì)輸入的日志做一些規(guī)矩檢測(cè),假設(shè)發(fā)現(xiàn)匹配項(xiàng),就會(huì)進(jìn)一步經(jīng)過(guò)你提前裝備的告警途徑,告訴到詳細(xì)的人;
主動(dòng)發(fā)現(xiàn)“反?!保鋵?shí)有點(diǎn)類似現(xiàn)在的機(jī)器學(xué)習(xí)、深度學(xué)習(xí),也便是說(shuō),即便你沒(méi)有裝備任何規(guī)矩,可是體系能夠經(jīng)過(guò)對(duì)日志流的監(jiān)聽(tīng)和學(xué)習(xí),去發(fā)現(xiàn)反常的日志,然后告訴你去關(guān)注,這是更智能化的一些東西。
日志剖析途徑架構(gòu)規(guī)劃
咱們現(xiàn)已知道,日志剖析途徑能夠給咱們帶來(lái)便利及功率的提升,那么假設(shè)咱們想完成這樣一個(gè)途徑,需求怎么進(jìn)行架構(gòu)規(guī)劃呢?
想要做架構(gòu)規(guī)劃,首要要了解事務(wù)場(chǎng)景和需求,然后結(jié)合被處理數(shù)據(jù)的特色,才能夠揣度途徑架構(gòu)規(guī)劃應(yīng)該具有哪些才能。之后咱們?cè)僖罁?jù)這些才能去尋覓、規(guī)劃相匹配的計(jì)劃,并在這些計(jì)劃中挑選真正可落地的去執(zhí)行。
數(shù)據(jù)特色
1. 時(shí)序數(shù)據(jù)
咱們知道日志歸于時(shí)序數(shù)據(jù),只新增、不刪去。它有幾個(gè)字段比較要害:timestamp,tags,fields
- timestamp:時(shí)刻字段對(duì)時(shí)序型數(shù)據(jù)是用來(lái)進(jìn)行比較和要害的字段;
- tags:tags 代表一組字段,一般關(guān)于時(shí)序數(shù)據(jù)來(lái)講,作為標(biāo)簽類型的字段一般都是能夠查找的,也便是這些字段需求建立索引,如:服務(wù)名、容器名、容器 IP 等;
- fields:fields 也代表一組字段,這些字段相關(guān)于 tags 的不同在于,fields 字段是一般存儲(chǔ)那些不需求查找的內(nèi)容,比方:假設(shè)關(guān)于詳細(xì)的日志內(nèi)容你不計(jì)劃去查找,就能夠用 fields 類型字段存儲(chǔ)。
日志時(shí)序數(shù)據(jù)的特色提示咱們,能夠考慮運(yùn)用時(shí)序數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)日志,比方 cassandra。
2. 時(shí)效性強(qiáng)
關(guān)于日志數(shù)據(jù)來(lái)講,咱們一般只關(guān)心一段時(shí)刻的數(shù)據(jù),關(guān)于很早之前的數(shù)據(jù),比方一個(gè)月、兩個(gè)月之前,乃至半年之前的數(shù)據(jù),咱們基本上是不會(huì)去關(guān)心的。由于一般有毛病的時(shí)分,咱們或許才需求去看一下詳細(xì)的日志信息,而出現(xiàn)毛病時(shí)不大或許會(huì)拖到很久之后才去處理和復(fù)盤這個(gè)問(wèn)題。
3. 數(shù)據(jù)量大
數(shù)據(jù)量大有兩個(gè)含義:一是說(shuō)數(shù)據(jù)的單條日志或許比較大,比方像 Java 應(yīng)用的一個(gè)反常倉(cāng)庫(kù),特別那種 Caused by 嵌套了好幾層的,或許單條日志就會(huì)有幾百行;別的一個(gè)是說(shuō),日志的條數(shù)多,跟著事務(wù)和應(yīng)用的增多,加上某些應(yīng)用還或許會(huì)開(kāi)啟 DEBUG 等級(jí)的日志,全體的日志量也會(huì)比較大,而且或許出現(xiàn)短時(shí)的峰值。
以上是日志數(shù)據(jù)的特色,然后咱們對(duì)從咱們?nèi)罩酒饰鐾緩竭@個(gè)角度來(lái)看看,咱們對(duì)體系有什么需求。
事務(wù)需求特色
1. 查詢速度快,秒級(jí)呼應(yīng)
首要,咱們期望它能夠快速查詢,輸入查詢要害字,就能夠秒級(jí)呼應(yīng)查詢結(jié)果。
2. 時(shí)刻段規(guī)模查詢
一般,查詢會(huì)依照一個(gè)清晰的時(shí)刻規(guī)模操作,這有一個(gè)優(yōu)點(diǎn):后端存儲(chǔ)的挑選會(huì)更多一些。
3. 高基數(shù)值點(diǎn)查詢
什么是高基數(shù)值呢?像用戶 IP、Trace ID 這類數(shù)據(jù),幾乎每個(gè)用戶請(qǐng)求的值都不一樣,這就歸于高基數(shù)。關(guān)于這類數(shù)據(jù)的查詢也是一個(gè)強(qiáng)需求,比方前端 web 接口報(bào)錯(cuò),而呼應(yīng)里加了 Trace ID 這樣的字段,此時(shí)就能夠經(jīng)過(guò) Trace ID 字段去檢查整個(gè)過(guò)程中記錄的反常日志或要害日志,這也是一個(gè)比較常見(jiàn)的需求。
4. 標(biāo)簽查詢
標(biāo)簽查詢一般能夠認(rèn)為是對(duì)服務(wù)名、容器 IP 這樣的字段查詢需求,這也歸于強(qiáng)需求之一。
5. 全文檢索查詢
全文檢索查詢是否歸于強(qiáng)需求之一,其實(shí)是個(gè)值得權(quán)衡的問(wèn)題。假設(shè)客戶端在收集端現(xiàn)已做了一些預(yù)處理,如:把整行的日志 content 在收集時(shí)拆分成了詳細(xì)的時(shí)刻等級(jí)、反常類型等單個(gè)要害字段,這樣來(lái)講,全文檢索查詢或許就不是一個(gè)強(qiáng)需求了,但一起,備選計(jì)劃的規(guī)?;蛟S會(huì)更大一些。這兒需求提醒的是,沒(méi)有全文檢索支撐,并不代表不能含糊檢索。憑借列存儲(chǔ)的高壓縮率和高 IO 功率,在內(nèi)存中進(jìn)行含糊過(guò)濾的作用也很贊!
6. 聚合計(jì)算
聚合計(jì)算中最簡(jiǎn)略的是 Count 計(jì)算,更雜亂一點(diǎn)的有依據(jù)更多字段維度的雜亂聚合圖表支撐,這些功用在一些產(chǎn)品中也有供給,但需依據(jù)個(gè)別詳細(xì)需求來(lái)判別該項(xiàng)是不是強(qiáng)需求。
7. 主動(dòng)告警
主動(dòng)告警意味著體系不只具備被動(dòng)查詢功用,一起也能夠及時(shí)發(fā)現(xiàn)問(wèn)題并告警,這樣才能削減毛病時(shí)刻。
介紹完事務(wù)需求方面的 7 個(gè)特色后,在規(guī)劃架構(gòu)時(shí),就能夠助力咱們敏捷 get 到需求考慮哪些方面了。
架構(gòu)要求
1. 軟硬本錢
當(dāng)然,本錢是一定要的,不管是做什么規(guī)劃,必定需求考慮本錢,這其間包含軟硬的本錢。
硬件本錢指的是咱們的機(jī)器數(shù)量:CPU、內(nèi)存、磁盤等這樣的資源。這兒面存在一個(gè)問(wèn)題,由于關(guān)于日志而言,咱們講數(shù)據(jù)量大,單條的體積或許也比較大,假設(shè)確認(rèn)不需求全文檢索,或只檢索其間很少的幾個(gè)要害字段,關(guān)于那些較長(zhǎng)的字段,僅僅只是想跟著查找條件把它展現(xiàn)出來(lái),這個(gè)時(shí)分咱們或許就會(huì)考慮,關(guān)于不需求索引的這些數(shù)據(jù),是不是能夠經(jīng)過(guò)一些更廉價(jià)的存儲(chǔ)方法(比方像 OSS)存下來(lái),這樣能夠節(jié)省全體的存儲(chǔ)本錢。
另一方面需求考慮軟件本錢,拿方才 OSS 存儲(chǔ)的例子,假設(shè)咱們想用很高效的存儲(chǔ)方法來(lái)存儲(chǔ)索引的數(shù)據(jù),而那些不需求查詢的字段用 OSS 存儲(chǔ),這時(shí)的架構(gòu)計(jì)劃或許會(huì)稍微雜亂一些,開(kāi)發(fā)雜亂度和難度,以及人力投入也會(huì)相對(duì)高一些,軟件的全體本錢也會(huì)相應(yīng)增加。
2. 存儲(chǔ)要有過(guò)期機(jī)制
數(shù)據(jù)的實(shí)效性對(duì)存儲(chǔ)機(jī)制也提出了要求,關(guān)于數(shù)據(jù)的過(guò)期機(jī)制,需求考慮,怎么確保和約束執(zhí)行數(shù)據(jù)過(guò)期刪去時(shí)的功用耗費(fèi)不會(huì)對(duì)整個(gè)別系的吞吐有過(guò)大影響。
3. 異步處理,吞吐要大,不能被事務(wù)流量打垮
在數(shù)據(jù)量大的場(chǎng)景下,要求日志體系在承受采極點(diǎn)數(shù)據(jù)的時(shí)分,需求考慮異步處理等手法,確保不能被事務(wù)流量打垮。假設(shè)說(shuō)事務(wù)體系有問(wèn)題了,日志體系也因此出現(xiàn)問(wèn)題,導(dǎo)致不能運(yùn)用日志體系來(lái)查詢、排查事務(wù)問(wèn)題,那這個(gè)途徑存在的含義就會(huì)受到挑戰(zhàn)。一般來(lái)說(shuō)咱們會(huì)用 MQ 這樣的中間件來(lái)做異步的削峰填谷處理。
4. 即席查詢才能(內(nèi)存、緩存、并行、高效過(guò)濾等機(jī)制)
依據(jù)對(duì)查詢速度的要求,能夠秒級(jí)呼應(yīng)的存儲(chǔ)計(jì)劃會(huì)被優(yōu)先挑選。
5. 存儲(chǔ)結(jié)構(gòu)對(duì)時(shí)刻規(guī)模查詢友好
依據(jù)時(shí)刻段的規(guī)模查詢是最高頻的場(chǎng)景之一,針對(duì)此類場(chǎng)景,咱們能夠考慮挑選時(shí)序數(shù)據(jù)庫(kù),因其自身對(duì)時(shí)刻序列查詢做了本錢上的優(yōu)化,一起也是功率較高的計(jì)劃。
6. 二級(jí)索引才能
高基數(shù)單點(diǎn)查詢對(duì)索引才能提出了要求,這將約束咱們關(guān)于時(shí)序數(shù)據(jù)庫(kù)的挑選。由于像 promethus 這樣的時(shí)序數(shù)據(jù)庫(kù)對(duì)高基數(shù)值的單點(diǎn)查詢是存在問(wèn)題的,這是由于它的存儲(chǔ)的特色決議的。一般來(lái)說(shuō),假設(shè)咱們想支撐高基數(shù)值的單點(diǎn)查詢,需求需求有一個(gè)二級(jí)特色才能的數(shù)據(jù)庫(kù)。
7. 全文檢索才能
怎么支撐含糊查詢,也是咱們要考量的一個(gè)要素。由于假設(shè)要做完好的全文檢索才能支撐,比方:分詞、相關(guān)性算分排序等,咱們的可選計(jì)劃會(huì)被進(jìn)一步約束。
8. 存儲(chǔ)結(jié)構(gòu)聚合操作友好(如列存儲(chǔ))
們知道關(guān)于聚合計(jì)算操作對(duì)話,列存儲(chǔ)的聚合功用是比較高的,由于它有很高對(duì)壓縮比,一次讀盤能夠讀到許多有效的數(shù)據(jù),全體對(duì) IO 功率會(huì)很高。
9. 告警模塊
最終一點(diǎn)便是架構(gòu)里必須規(guī)劃告警模塊怎么去做。
以上內(nèi)容針對(duì)數(shù)據(jù)特色、事務(wù)需求提出的一些架構(gòu)要求進(jìn)行介紹,能夠看出,核心取舍在于存儲(chǔ)。下面一張圖,展現(xiàn)了整個(gè)架構(gòu)的處理流程和要害組件,接下來(lái)的內(nèi)容將對(duì)存儲(chǔ)部分的選型進(jìn)行打開(kāi)介紹。
存儲(chǔ)計(jì)劃選型
上圖中關(guān)于存儲(chǔ)部分,有幾個(gè)開(kāi)源的可選存儲(chǔ)中間件:像 Cassandra、Hbase、ElasticSearch、ClickHouse、Grafana Loki等。下圖將會(huì)針對(duì)這些中間件的優(yōu)缺陷進(jìn)行對(duì)比剖析:
上圖的計(jì)劃選型圖表對(duì)各個(gè)計(jì)劃的描述現(xiàn)已相對(duì)比較詳細(xì),在此就不再贅述,接下來(lái)咱們看下在 Erda 中是怎么做的。
Erda 日志剖析途徑實(shí)踐
Erda 現(xiàn)在選用的其實(shí)是比較常見(jiàn)的完成計(jì)劃:運(yùn)用 Elasticsearch 作為底層存儲(chǔ)。當(dāng)然,其間也存在前史原因,Erda 的開(kāi)源時(shí)刻盡管并不是很長(zhǎng),可是其存在前史能夠算比較久了。在其時(shí)看來(lái),挑選 Elasticsearch 也是比較合理的挑選。當(dāng)然,現(xiàn)狀并不是終點(diǎn),咱們后邊仍會(huì)繼續(xù)探索在本錢、功率方面更優(yōu)的計(jì)劃。
假設(shè)說(shuō)挑選 ES 這樣的一個(gè)計(jì)劃的話,詳細(xì)應(yīng)該怎么做呢?
方才的計(jì)劃選型圖表中列出了運(yùn)用 Elasticsearch 的大致核心思路,接下來(lái)咱們?cè)敿?xì)深入看下怎么去做。
之前說(shuō)到,運(yùn)用 Elasticsearch 計(jì)劃的特色便是功用全和開(kāi)箱即用,上圖中列出了在 Erda 中所利用的一些要害才能來(lái)完成現(xiàn)在 Erda 想要供給的部分要害功用,如下圖所示。
總的來(lái)說(shuō),Erda 現(xiàn)在選用的其實(shí)仍是比較慣例的計(jì)劃,并在此基礎(chǔ)上有一些小的優(yōu)化,整個(gè)代碼結(jié)構(gòu)上也是做了一層籠統(tǒng),并沒(méi)有說(shuō)以后便是綁死在 Elasticsearch 上面,后續(xù)咱們還會(huì)考慮支撐一些其他可替換計(jì)劃。
Erda 日志剖析途徑未來(lái)的方向
對(duì) Erda 日志剖析途徑而言,未來(lái)咱們有幾個(gè)努力的方向:
1. 存儲(chǔ)更高效、可擴(kuò)展
首要是存儲(chǔ)方面,上文咱們也說(shuō)到,Erda 現(xiàn)在首要選用依據(jù) Elasticsearch 的存儲(chǔ)計(jì)劃,但運(yùn)用 Elasticsearch 有一個(gè)不行忽視的缺陷,那便是它的全體資源占用本錢相對(duì)較高,而像 Clickhouse、Grafana Loki 等,的確有各自的優(yōu)勢(shì)需求咱們?nèi)ソ梃b。所以說(shuō) Erda 作為一個(gè)開(kāi)源產(chǎn)品,后續(xù)或許會(huì)支撐更多的底層存儲(chǔ),用戶能夠在這些計(jì)劃之間依據(jù)自身的需求和本錢來(lái)進(jìn)行挑選。
別的,自研存儲(chǔ)也將會(huì)是咱們的一個(gè)投入方向,由于監(jiān)控范疇除了日志,還有指標(biāo)、Trace 數(shù)據(jù)。這些數(shù)據(jù)能否選用一個(gè)一致的存儲(chǔ)內(nèi)核來(lái)下降體系的雜亂度,一起能夠?qū)Σ煌瑪?shù)據(jù)類型做專項(xiàng)優(yōu)化來(lái)平衡本錢和功用,這些都是咱們考慮自研存儲(chǔ)的出發(fā)點(diǎn)。
2. 告警更快捷、更智能
現(xiàn)在在 Erda 途徑上,假設(shè)想從日志剖析出發(fā)去創(chuàng)建告警規(guī)矩,實(shí)際運(yùn)用的鏈路仍是有點(diǎn)長(zhǎng),所以后續(xù)咱們會(huì)優(yōu)化這條鏈路上的產(chǎn)品和功用體驗(yàn)。
別的的一個(gè)方向便是智能化,依據(jù)日志的主動(dòng)反常檢測(cè)。在上文中有簡(jiǎn)略說(shuō)到這點(diǎn),便是說(shuō)即便用戶沒(méi)有顯式的去裝備任何規(guī)矩,體系也能夠協(xié)助用戶去發(fā)現(xiàn)預(yù)期之外的一些反常。這兒的反常,不一定非得是事務(wù)應(yīng)用拋出的過(guò)錯(cuò)的倉(cāng)庫(kù),它是一個(gè)相關(guān)于“正常”的概念,即正常數(shù)據(jù)流中忽然出現(xiàn)了一個(gè)非常不同尋常的數(shù)據(jù),這或許會(huì)需求用到一些機(jī)器學(xué)習(xí)的模型來(lái)檢測(cè)。
以上便是本次想要和咱們共享的有關(guān)日志剖析架構(gòu)的一些內(nèi)容,后續(xù)咱們也將不忘初心,繼續(xù)優(yōu)化產(chǎn)品功用和用戶體驗(yàn),也非常等待有更多對(duì)此感興趣的開(kāi)發(fā)者參加進(jìn)來(lái)與咱們共建 Erda,每一條建議咱們都會(huì)認(rèn)真聆聽(tīng),等待更多的聲音協(xié)助咱們變得更好!