搭建Prometheus+Grafana的云平臺監控系統

1.1? Prometheus和Grafana概述

1.1.1? Prometheus概述

Prometheus(普羅米修斯)是一套開源的監控&報警&時間序列數據庫的組合,起始是由SoundCloud公司開發的?,F在最常見的Docker、Mesos、Kubernetes容器管理系統中,通常會搭配Prometheus進行監控。 Prometheus [pr??miθju:s] 普羅米修斯

Prometheus基本原理是通過HTTP協議周期性抓取被監控組件的狀態,這樣做的好處是任意組件只要提供HTTP接口就可以接入監控系統,不需要任何SDK或者其他的集成過程。這樣做非常適合虛擬化環境比如VM或者Docker 。

輸出被監控組件信息的HTTP接口被叫做exporter。目前互聯網公司常用的組件大部分都有exporter可以直接使用,比如Varnish、Haproxy、Nginx、MySQL、Linux 系統信息 (包括磁盤、內存、CPU、網絡等等),具體支持的源看:https://github.com/prometheus。 exporter ([ek?sp?:t?(r)] 出口商)

對比主流的監控工具的操作界面:

nagios監控界面:

zabbix監控界面

Grafana+Prometheus監控界面:

通過上面的界面,我們可以看出來Grafana+Prometheus展示界面更美觀

1.1.2 Prometheus 架構圖解

普羅米修斯(Prometheus)及其一些生態系統組件的整體架構:

retrieval? [r??tri?vl]? 數據檢索

Prometheus各組件運行流程如下:

1、Prometheus Server:Prometheus Sever是Prometheus組件中的核心部分,負責實現對監控數據的獲取,存儲及查詢。Prometheus Server可以通過靜態配置管理監控目標,也可以配合使用Service Discovery(服務發現)的方式動態管理監控目標,并從這些監控目標中獲取數據。其次Prometheus Sever需要對采集到的數據進行存儲,Prometheus Server本身就是一個實時數據庫,將采集到的監控數據按照時間序列的方式存儲在本地磁盤當中。Prometheus Server對外提供了自定義的PromQL,實現對數據的查詢以及分析。另外Prometheus Server的聯邦集群能力可以使其從其他的Prometheus Server實例中獲取數據。

2、Exporters:Exporter將監控數據采集的端點通過HTTP服務的形式暴露給Prometheus Server,Prometheus Server通過訪問該Exporter提供的Endpoint端點,即可以獲取到需要采集的監控數據??梢詫xporter分為2類:

(1)、直接采集:這一類Exporter直接內置了對Prometheus監控的支持,比如cAdvisor,Kubernetes,Etcd,Gokit等,都直接內置了用于向Prometheus暴露監控數據的端點。

(2)、間接采集:原有監控目標并不直接支持Prometheus,因此需要通過Prometheus提供的Client Library編寫該監控目標的監控采集程序。例如:Mysql Exporter,JMX Exporter,Consul Exporter等。

3、AlertManager:在Prometheus Server中支持基于Prom QL創建告警規則,如果滿足Prom QL定義的規則,則會產生一條告警。常見的接收方式有:電子郵件,webhook 等。

4、PushGateway:Prometheus數據采集基于Prometheus Server從Exporter pull數據,因此當網絡環境不允許Prometheus Server和Exporter進行通信時,可以使用PushGateway來進行中轉。

Prometheus的工作流:

1.Prometheus server定期從配置好的jobs和exporters中拉取metrics,或者接收來自Pushgateway發送過來的metrics,或者從其它的Prometheus server中拉metrics。

metrics? [?metr?ks]? 衡量指標

2.Prometheus server在本地存儲收集到的metrics,并運行定義好的alerts.rules,記錄新的時間序列或者向Alert manager推送警報。

3.Alertmanager根據配置文件,對接收到的警報進行處理,發出告警。

4.在圖形界面中,可視化采集數據。

實驗拓撲圖:

搭建Prometheus+Grafana的云平臺監控系統工作流程:

1、安裝exporter(出口)采集數據

2、美化采集到的數據

3、在web界面查看

懂:1不懂:2

1.2? 安裝配置Prometheus監控服務

1、安裝go語言環境

方法1:使用tar包安裝go語言環境

上傳到go1.13.3.linux-amd64.tar.gz到linux服務器上

或在線下載:

[root@xuegod63 ~]# wget? -c https://storage.googleapis.com/golang/go1.13.3.linux-amd64.tar.gz

[root@xuegod63 ~]# tar -zxvf go1.13.3.linux-amd64.tar.gz -C /usr/local

[root@xuegod63 ~]# echo "export PATH=$PATH:/usr/local/go/bin" > /etc/profile.d/go.sh

[root@xuegod63 ~]# source /etc/profile.d/go.sh

[root@xuegod63 ~]# go

方法2:使用yum安裝go語言環境

[root@xuegod63 ~]# yum install -y epel-release

[root@xuegod63 ~]# yum install go -y

[root@xuegod63 ~]# go version

擴展:

Go(又稱Golang)是Google開發的一種靜態強類型、編譯型、并發型,并具有垃圾回收功能的編程語言。

下載安裝Prometheus(https://prometheus.io/download/)

[root@xuegod63 ~]#wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz

[root@xuegod63 ~]# tar zxvf prometheus-2.27.1.linux-amd64.tar.gz -C /usr/local/

[root@xuegod63 ~]# cd /usr/local/prometheus-2.27.1.linux-amd64/

修改prometheus配置文件,配置監控linux主機和mysql數據庫,配置文件為yml語法,注意縮進對齊

[root@xuegod63 prometheus-2.7.1.linux-amd64]# vim prometheus.yml #在文檔的最后插入以下內容

? - job_name: system-status

? ? static_configs:

? ? ? - targets: ['192.168.1.64:9100']

? ? ? ? labels:

? ? ? ? ? instance: xuegod64

? - job_name: mysql-status

? ? static_configs:

? ? ? - targets: ['192.168.1.64:9104']

? ? ? ? labels:

? ? ? ? ? instance: xuegod64-mysql

插入時,要和文件之前的job_name保持對齊,如下圖:

注釋:

? - job_name: system-status #每一個job_name都是一個監控項,這里代表監控操作系統狀態

? ? static_configs:

? ? ? - targets: ['192.168.1.64:9100'] #被監控主機IP地址和端口

? ? ? ? labels:

? ? ? ? ? instance: xuegod64 #實例名稱,在grafana中表示對應的主機。

? - job_name: mysql-status #監控mysql數據庫狀態

? ? static_configs:

? ? ? - targets: ['192.168.1.64:9104'] #目標主機IP地址和端口

? ? ? ? labels:

? ? ? ? ? instance: xuegod64-mysql #實例名稱,在grafana中表示對應的主機。

[root@xuegod63prometheus-2.7.1.linux-amd64]# ./prometheus --config.file=prometheus.yml

出現以下信息吧表示啟動成功。

或直接后臺運行:

[root@xuegod63prometheus-2.7.1.linux-amd64]# nohup ./prometheus --config.file=prometheus.yml &

[root@xuegod63 ~]# systemctl stop firewalld && systemctl disable firewalld #關閉防火墻

瀏覽器輸入http://192.168.1.63:9090

注:因為我們還沒有開始配置xuegod64了,所以現在還獲取不到xuegod64的信息

1.3 啟動用于采集linux系統和mysql服務狀態的exporter服務

prometheus常見的exporter及作用:

(1)、node_exporter用于監控操作系統的性能和運行狀態

(2)、mysqld_exporter用于監控mysql服務

(3)、snmp_exporter用于監控網絡設備

更多exporter可在官網下載:https://prometheus.io/download/#node_exporter

1、配置 node_exporter監控xuegod64運行狀態

[root@xuegod64 ~]# systemctl stop firewalld && systemctl disable firewalld #關閉防火墻

上傳node_exporter-1.1.2.linux-amd64.tar.gz到linux上。

[root@xuegod64 ~]# tar zxvf /root/node_exporter-1.1.2.linux-amd64.tar.gz -C /usr/local/

[root@xuegod64 ~]# nohup /usr/local/node_exporter-1.1.2.linux-amd64/node_exporter &

2、配置mysqld_exporter用于監控xuegod64上的mysql服務

(1)、安裝數據庫服務

[root@xuegod64 ~]# yum install mariadb-server mariadb -y

[root@xuegod64 ~]# systemctl start mariadb

[root@xuegod64 ~]# mysql #直接登錄mysql

mysql> GRANT REPLICATION CLIENT,PROCESS ON *.* TO 'mysql_monitor'@'localhost' identified by '123456';

mysql> GRANT SELECT ON *.* TO 'mysql_monitor'@'localhost';

MariaDB [(none)]> exit;

注:mysql 用戶權限說明:

(1)、replication client權限? #擁有此權限可以查詢master server、slave server狀態。

(2)、PROCESS權限? #通過這個權限,用戶可以執行SHOW PROCESSLIST和KILL命令。默認情況下,每個用戶都可以執行SHOW PROCESSLIST命令,但是只能查詢本用戶的進程。如:

mysql> show processlist;

另外,管理權限 process不能夠指定某個數據庫,on后面必須跟*.*

(3)、select權限? #必須有select的權限,才可以使用select * from table 查看數據

(2)、安裝mysqld_exporter

上傳mysqld_exporter到linux系統上

[root@xuegod64 ~]# tar xf mysqld_exporter-0.13.0-rc.0.linux-amd64.tar.gz -C /usr/local/

創建隱藏配置文件.my.cnf,用于mysqld_exporter連接mysql采集數據。

[root@xuegod64 ~]# vim /usr/local/mysqld_exporter-0.13.0-rc.0.linux-amd64/.my.cnf

[client]

user=mysql_monitor

password= 123456

[root@xuegod64 ~]# nohup /usr/local/mysqld_exporter-0.13.0-rc.0.linux-amd64/mysqld_exporter --config.my-cnf="/usr/local/mysqld_exporter-0.13.0-rc.0.linux-amd64/.my.cnf" &

在web界面,再次查看監控信息已經成功添加linux 和mysql節點,已經up了

瀏覽器輸入http://192.168.1.63:9090

查看網絡端口:

[root@xuegod64 ~]# netstat? -antup | grep 91

tcp6? ? ? 0? ? ? 0 :::9100? ? ? ? :::*? ? ? ? ? ? LISTEN? ? ? 2158/node_exporter?

tcp6? ? ? 0? ? ? 0 :::9104? ? ? ? :::*? ? ? ? ? ? LISTEN? ? ? 41308/mysqld_export

總結prometheus使用方法:

1、想監控操作系統,只需要一步:

在被監控系統上安裝node_exporter并啟動,就ok了

2、想監控操mysql數據庫,只需要兩步:

(1)、創建一個mysql用戶

(2)、安裝mysqld_exporter并啟動

1.4? 實戰-使用Grafana可視化工具美化監控數據顯示效果

1.4.1? 配置grafana

1、上傳grafana到linux系統/root/下

[root@xuegod63 ~]# yum install -y ./grafana-7.5.7-1.x86_64.rpm

或在線下載:

[root@xuegod64 ~]# wget https://mirrors.tuna.tsinghua.edu.cn/grafana/yum/rpm/grafana-7.5.7-1.x86_64.rpm

2、安裝圖形餅狀圖插件,方便顯示餅狀圖

方法1:離線安裝

下載:https://grafana.com/api/plugins/grafana-piechart-panel/versions/1.6.1/download

然后上傳grafana-piechart-panel-1.6.1.zip到linux系統上

[root@xuegod63 ~]# mkdir /var/lib/grafana/plugins? #創建存儲插件的路徑

[root@xuegod63 ~]# unzip grafana-piechart-panel-1.6.1.zip?

[root@xuegod63 ~]# mv grafana-piechart-panel /var/lib/grafana/plugins/grafana-piechart-panel

[root@xuegod63 ~]# systemctl restart grafana-server

方法2:在線安裝

[root@xuegod63 ~]# grafana-cli plugins install grafana-piechart-panel

[root@xuegod63 ~]# systemctl restart grafana-server #安裝完插件,需要重啟服務

3、訪問:http://192.168.1.63:3000/login 用戶名:admin密碼admin

第一次登陸會提示修改密碼,咱們改成123456?

配置數據源

url地址:http://192.168.1.63:9090

在頁面最下面,點:Save & Test

Scrape? [skre?p] 刮擦 ;? interval? [??nt?vl]? 間隔;Scrape interval 抓取數據間隔

彈出下面信息,說明成功了

1.4.2? 將監控Linux系統和mysql服務運行狀態的web儀表盤插件導入grafana

1、查找可以美化Linux系統監控數據的儀表盤插件

打開官方網站:https://grafana.com/grafana/dashboards

在頁面中找到這個:

https://grafana.com/grafana/dashboards?search=node

輸入關鍵字node,進行查詢,查看自已想要的展示看板:

我使用們這個ID:8919

打開這個鏈接:https://grafana.com/grafana/dashboards/8919

也可以直接下載JSON文件,然后后期,直接導入這個離線文件:

ID號是: 8919。 注: 如果在線導入的看板,看不到數據,可以換一個ID號,再試試。

開始導入:

點load,

刷新瀏覽器界面:

注:也可以導入之前下載的node-exporter-for-prometheus-dashboard-cn-v20201010_rev24.json離線文件上傳。

2、查出mysql的 Web儀表盤插件的ID號

打開此鏈接可直接搜索到與課程對應版本的儀表盤

https://grafana.com/grafana/dashboards?search=mysql%20overview&utm_source=grafana_search

然后選擇這個由nasskach開發的界面

打開鏈接:https://grafana.com/grafana/dashboards/7362 復制7362 的ID

來到grafana主界面,導入dashboard:

下拉選擇Prometheus

1.5? 實戰-Grafana配置郵件告警

1.5.1? 配置SMTP發送郵件

配置163郵箱smtp服務

點擊開啟SMTP服務,點擊開啟后會提示我們下載手機APP,我們點繼續開啟不需要下載APP。

根據提示發送手機驗證碼即可開啟成功

EMXCERHXVHVDXKJF

開啟成功后會新增授權密碼管理的選項,如果你之前已經開啟過,直接點擊新增授權密碼即可。

Grafana配置SMTP賬戶

[root@xuegod63 ~]# vim /etc/grafana/grafana.ini

第522行修改smtp配置

注:所有修改配置前 ; 注釋符號需要取消,將對應行,改為以下內容:

[smtp]

enabled = true? ? ? ? ? ? ? ? #啟用smtp

host = smtp.163.com:465? ? ? ? #163 smtp服務地址

user = jianmingbasic@163.com? #163郵箱用戶名

# If the password contains # or ; you have to wrap it with triple quotes. Ex """#password;"""

password = EMXCERHXVHVDXKJF? ? ? #授權密碼

; cert_file =

; key_file =

; skip_verify = false

from_address = jianmingbasic@163.com #郵件From地址,和登錄用戶一致即可。

;from_name = Grafana

; ehlo_identity =

修改完郵件配置后修改domain信息,郵件內容中包含Grafana的訪問地址,默認地址為localhost。

改:

41 ;domain = localhost

為:

41 domain = 192.168.1.63

1.5.2? 配置圖片渲染功能

配置插件地址

改:

813 ;server_url =

為:

813 server_url = http://192.168.1.63:8081/render

配置callback_url,該地址為Grafana地址。

改:

815 ;callback_url =

815 callback_url = http://192.168.1.63:3000/

修改默認語言,默認配置渲染圖片時不支持中文。

改:

840 ;rendering_language =

為:

840 rendering_language = zh

安裝圖片渲染插件(經測試僅docker方式搭建的插件支持中文渲染)

安裝docker環境

[root@xuegod63 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2

配置國內docker的yum源(阿里云)

[root@xuegod63 ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安裝docker-ce

[root@xuegod63 ~]# yum makecache fast

[root@xuegod63 ~]# yum install docker-ce docker-ce-cli containerd.io -y

[root@xuegod63 ~]# systemctl start docker && systemctl enable docker.service

[root@xuegod63 ~]#tee /etc/docker/daemon.json << 'EOF'

{

"registry-mirrors":["https://rsbud4vc.mirror.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com","http://qtid6917.mirror.aliyuncs.com","https://rncxm540.mirror.aliyuncs.com","https://e9yneuy4.mirror.aliyuncs.com"]

}

EOF

[root@xuegod63 ~]# systemctl daemon-reload

[root@xuegod63 ~]# systemctl restart docker

運行docker版本的圖片渲染插件

上傳課程資料中的grafana-image-renderer.tar.gz

[root@xuegod63 ~]# docker load -i grafana-image-renderer.tar.gz

[root@xuegod63 ~]# docker run -d -p 8081:8081 --restart=always index.docker.io/grafana/grafana-image-renderer:latest

重啟Grafana使配置生效

[root@xuegod63 ~]# systemctl restart grafana-server

檢查郵件服務是否配置成功,添加告警頻道。

取任意名稱,選擇Email發送,填寫收件人地址即可發送測試郵件。Include image需要手動勾選,這樣發送郵件時才會附帶監控圖表信息。新版本中默認不勾選,因為需要安裝插件。

測試成功后點擊保存即可。

收到Grafana郵件

內容是測試信息

1.5.3? 自定義監控項與告警規則

配置告警,回到儀表盤進行操作。

添加panel

修改一個新的標題

Panel title: xuegod64-CPU使用率

修改監控項配置。刪除監控項。保留user配置即可。因為我們手工測試只能測試到User監控項。刪除AFDC保留B

metrics? [?metr?ks]? 衡量指標

Metrics: (1 - avg(rate(node_cpu_seconds_total{instance=~"xuegod64",mode="idle"}[30s])) by (instance)) * 100

Legend: CPU使用率

注:idle表示總負載,system表示系統使用率,user表示用戶使用率。

只留這個監控項參數

添加告警

配置告警規則。

xuegod64-cpu使用率報警

隨便輸出點告警描述信息:xuegod64-CPU > 50% (test)

注:query查詢的時間默認是5分鐘的平均數據,如果想快速觸發報警可以時間縮短至1m。0.5=50%

保存配置,點擊按鈕

點擊save保存即可

可以看到這里有這個標識:

應用一下:

1.5.4? 壓力測試觸發告警

安裝壓力測試工具

[root@xuegod64 ~]# yum install -y epel-release

[root@xuegod64 ~]# yum install -y stress

對CPU進行壓力測試。注:教學環境中xuegod64分配了8核心CPU,我們的監控指標配置的是超過50%告警,則需要將超過半數的CPU資源耗盡,所以-c參數大于虛擬機中CPU核心數量的一半即可,同學們根據自己學習環境進行調整。

[root@xuegod64 ~]# stress -c 6

新建終端窗口使用top命令查看系統負載

[root@xuegod64 ~]# top

已經創建了6個占用CPU100%的進程。

查看狀態信息,可以看到pending和發送郵件間隔了1分鐘。

查看郵箱

郵件中可以看到監控指標數據

Ctrl+C關閉壓力測試工具

等待平均負載指標下來后就會收到恢復郵件。

總結:

1.1? Prometheus和Grafana概述

1.2? 安裝配置Prometheus監控服務

1.3? 啟動用于采集linux系統和mysql服務狀態的exporter服務

1.4? 實戰-使用Grafana可視化工具美化監控數據顯示效果

1.5? 實戰-Grafana配置郵件告警

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容

  • 公司目前也有一套監控系統,但由于監控系統的性能問題及功能擴展性問題等等導致監控系統后端急需進行一次大的重構;采用的...
    Legendary閱讀 6,387評論 0 2
  • Prometheus對比Zabbix 和Zabbix類似,Prometheus也是一個近年比較火的開源監控框架,和...
    Cloudox_閱讀 43,851評論 0 49
  • 文章目的: 1、向沒聽過或者剛聽過但是還對這個監控系統沒有任何概念的開發者介紹Prometheus的應用場景。2、...
    whaike閱讀 39,669評論 15 59
  • 表情是什么,我認為表情就是表現出來的情緒。表情可以傳達很多信息。高興了當然就笑了,難過就哭了。兩者是相互影響密不可...
    Persistenc_6aea閱讀 125,537評論 2 7
  • 16宿命:用概率思維提高你的勝算 以前的我是風險厭惡者,不喜歡去冒險,但是人生放棄了冒險,也就放棄了無數的可能。 ...
    yichen大刀閱讀 6,076評論 0 4