亚洲综合伊人,成人欧美一区二区三区视频不卡,欧美日韩在线高清,日韩国产午夜一区二区三区,大胆美女艺术,一级毛片毛片**毛片毛片,你瞅啥图片

您當(dāng)前的位置是:  首頁 > 資訊 > 國內(nèi) >
 首頁 > 資訊 > 國內(nèi) >

環(huán)信大學(xué) | 構(gòu)建一套適合微服務(wù)的高可用架構(gòu)

2021-03-02 14:24:14   作者:   來源:CTI論壇   評論:0  點(diǎn)擊:


  隨著近幾年微服務(wù)與云計(jì)算的飛速發(fā)展,機(jī)器由物理機(jī)逐步變?yōu)榱颂摂M機(jī),應(yīng)用服務(wù)由龐大的單體應(yīng)用逐漸變?yōu)榱巳舾蓚(gè)微服務(wù)聯(lián)合組成的應(yīng)用集群,更新迭代的速度成倍上漲,傳統(tǒng)的部署模式已無法滿足開發(fā)日常更新需求,需要一套適合微服務(wù)的管理架構(gòu)。
  技術(shù)棧及文檔
  資源調(diào)度框架MESOS
  應(yīng)用編排平臺Marathon
  nginx動態(tài)修改upstream dyups
  nginx動態(tài)修改upstream upsync
  使用Mesos進(jìn)行機(jī)器資源管理
  首先,是機(jī)器資源的管理。在微服務(wù)的架構(gòu)中,原有的單體服務(wù)被拆分成了一個(gè)個(gè)獨(dú)立單元的應(yīng)用程序,這些服務(wù)體量較小,可以獨(dú)立運(yùn)行在配置較小的機(jī)器上。為了故障隔離,我們會盡可能的把這些服務(wù)部署在不同的虛擬機(jī)上,這樣機(jī)器的數(shù)量會成倍增加。對于運(yùn)維來說,每個(gè)新服務(wù)部署時(shí),需要先查看現(xiàn)有機(jī)器的剩余資源是否滿足新服務(wù)的需求,有時(shí)可能因?yàn)樵u估不準(zhǔn)確造成來回?cái)U(kuò)容、遷移,或者資源浪費(fèi)。
  開始時(shí),我們的架構(gòu)可能時(shí)這樣的
  為了解決上面的問題,可以使用MESOS(布式資源管理框架),它可以讓我們像用一臺電腦(一個(gè)資源池)一樣使用整個(gè)數(shù)據(jù)中心。
  mesos部署時(shí)分為master和agent兩個(gè)角色,當(dāng)然,你可以在同一臺機(jī)器啟動它們。
  安裝Mesos前需要安裝zookeeper,mesos使用zk實(shí)現(xiàn)高可用和選舉,包括一個(gè)masterleader和幾個(gè)備份master避免宕機(jī)。
  Mesos master負(fù)責(zé)管理各個(gè)Framework和Slave,并將Slave上的資源非配給各個(gè)Framework。
  Mesos agent負(fù)責(zé)管理本節(jié)點(diǎn)上的各個(gè)MesosTask,為各個(gè)Executor分配資源(低版本為mesos-slave)。
 
  1. $ cat > /tmp/bintray-mesos-el.repo <<EOF
  2. #bintray-mesos-el - packages by mesos from Bintray
  3. [bintray-mesos-el]
  4. name=bintray-mesos-el
  5. baseurl=https://dl.bintray.com/apache/mesos/el7/x86_64
  6. gpgcheck=0
  7. repo_gpgcheck=0
  8. enabled=1
  9. EOF
  10.  
  11. $ sudo mv /tmp/bintray-mesos-el.repo /etc/yum.repos.d/bintray-mesos-el.repo
  12.  
  13. $ sudo yum update
  14.  
  15. $ sudo yum install mesos
  16.  
  17. $ tree /etc/mesos-master
  18. /etc/mesos-master/
  19. |-- hostname
  20. |-- ip
  21. |-- log_dir
  22. |-- quorum   # quorum > (number of masters)/2
  23. `-- work_dir
  24.  
  25. $ tree /etc/mesos-agent
  26. /etc/mesos-agent/
  27. |-- containerizers  # 容器類型,默認(rèn) mesos,可以添加 docker,如: mesos,docker
  28. |-- hostname
  29. |-- ip
  30. |-- log_dir
  31. |-- master           # master 地址,格式為 host:port 或 
  32. zk://host1:port1,host2:port2,.../path 或 file:///path/to/file
  33. |-- resources       # 設(shè)置總資源大小,可以設(shè)置小些來預(yù)留更多機(jī)器資源
  34. `-- work_dir
  35.  
  36. $ cat /etc/mesos/zk  # 設(shè)置 mesos 在zk 中的存儲目錄
  37. zk://192.168.100.9:2181,192.168.100.110:2181,192.168.100.234:2181/mesos
  38.  
  39. $ systemctl start mesos-master
  40. $ systemctl start mesos-slave
  當(dāng)mesos服務(wù)啟動后,agent會向master節(jié)點(diǎn)匯報(bào)機(jī)器資源,包括CPU、內(nèi)存、磁盤等。當(dāng)我們要發(fā)布一個(gè)服務(wù)時(shí),只需要設(shè)置這個(gè)服務(wù)的CPU、內(nèi)存、磁盤參數(shù),mesosmaster會自動幫我們選擇有足夠資源的機(jī)器去運(yùn)行,如下圖
  我們將微服務(wù)的啟動都交給Mesos管理,這樣我們只需要關(guān)注整體資源即可。MESOS提供了UI界面,可以直接訪問mesosmaster的5050端口,查看集群資源使用情況?傮w使用情況及Agent節(jié)點(diǎn)使用情況

  完成以上后,我們的架構(gòu)變成了這樣
  使用Marathon進(jìn)行微服務(wù)管理
  Marathon是建立在Mesos上的私有PaaS平臺。它能自動處理硬件或者軟件故障,并確保每個(gè)應(yīng)用程序都“永遠(yuǎn)在線”。我們使用Marathon管理微服務(wù)有以下優(yōu)勢
  支持容器和非容器,不受限于服務(wù)啟動類型,操作系統(tǒng)版本等
  漂亮而強(qiáng)大的用戶界面,可以在UI上進(jìn)行快捷方便的應(yīng)用程序配置
  支持約束條件,例如允許一個(gè)mesos agent節(jié)點(diǎn)只運(yùn)行一個(gè)應(yīng)用程序
  支持健康檢查?梢耘渲胔ttp、https、tcp、command類型的監(jiān)控檢查
  完整的RESTAPI,易于集成和編寫腳本。這個(gè)對于后期集成來說至關(guān)重要
 
  1. # Add the repository
  2. $ sudo rpm -Uvh http://repos.mesosphere.com/el/7/noarch/RPMS/mesosphere-el-repo-7-2.noarch.rpm
  3.  
  4. # Install packages
  5. $ sudo yum -y install mesos marathon
  6.  
  7. # marathon  and mesos zk path
  8. $ cat /etc/default/marathon 
  9. MARATHON_MESOS_USER="root"
  10. MARATHON_MASTER="zk://192.168.100.9:2181,192.168.100.110:2181,192.168.100.234:2181/mesos"
  11. MARATHON_ZK="zk://192.168.200.9:1181,192.168.100.110:2181,192.168.100.234:2181/marathon"
  12.  
  13. systemctl start marathon
  啟動后,直接訪問marathon的8080端口,就能看到一個(gè)漂亮強(qiáng)大的UI界面。
 
  我們以springboot應(yīng)用為例,在marathon上創(chuàng)建一個(gè)應(yīng)用程序



  當(dāng)我們更新應(yīng)用程序時(shí),marathon會新建相同實(shí)例數(shù)量的應(yīng)用程序,待healthcheck通過之后替換老節(jié)點(diǎn),所以不需要擔(dān)心新的服務(wù)沒有啟動期間老的服務(wù)停掉造成線上事故。到這里為止,我們已經(jīng)可以在marathon上方便快捷的進(jìn)行日常應(yīng)用的創(chuàng)建、升級、擴(kuò)容、縮容。當(dāng)服務(wù)健康檢查失敗或者機(jī)器宕機(jī)后,marathon會自動在其它節(jié)點(diǎn)上啟動掛掉的應(yīng)用程序,大大提升了高可用性。
  使用nginx upsync/dyups模塊進(jìn)行平滑變更
  當(dāng)我們的微服務(wù)可以隨機(jī)分配在不同機(jī)器上時(shí),便產(chǎn)生了一個(gè)新的令人頭疼的問題。nginx并不知道后端節(jié)點(diǎn)的變更,也不可能每次都去手動修改upstream節(jié)點(diǎn),reloadnginx,這樣成本就太高了。我們的解決思路是和微服務(wù)的注冊中心打通,當(dāng)服務(wù)注冊、注銷時(shí),都會對注冊中心進(jìn)行更新,利用nginx upsync/dyups模塊可以動態(tài)修改upstream節(jié)點(diǎn)的能力進(jìn)行同步,做到平滑變更。如果使用的注冊中心為consul,建議使用upsync模塊,這樣無需開發(fā),只需要簡單的nginx配置,就可以實(shí)現(xiàn)我們想要的效果,支持consulkv,consul_services,consul_health,同時(shí)upsync也支持etcd。建議使用consul_health接口。upsync模塊不是nginx內(nèi)置模塊,使用時(shí)需要重新編譯添加此模塊。
 
  1. wget 'http://nginx.org/download/nginx-1.8.0.tar.gz'
  2. tar -xzvf nginx-1.8.0.tar.gz
  3. cd nginx-1.8.0/
  4.  
  5.  
  6. ./configure --add-module=/path/to/nginx-upsync-module
  7. make
  8. make install
  配置文件示例
 
  1. http {
  2.     upstream test {
  3.         upsync 127.0.0.1:8500/v1/health/service/test upsync_timeout=6m upsync_interval=500ms upsync_type=consul_health strong_dependency=off;
  4.         upsync_dump_path /usr/local/nginx/conf/servers/servers_test.conf;
  5.  
  6.         include /usr/local/nginx/conf/servers/servers_test.conf;
  7.     }
  8.  
  9.     upstream bar {
  10.         server 127.0.0.1:8090 weight=1 fail_timeout=10 max_fails=3;
  11.     }
  12.  
  13.     server {
  14.         listen 8080;
  15.  
  16.         location = /proxy_test {
  17.             proxy_pass http://test;
  18.         }
  19.  
  20.         location = /bar {
  21.             proxy_pass http://bar;
  22.         }
  23.  
  24.         location = /upstream_show {
  25.             upstream_show;
  26.         }
  27.  
  28.     }
  29. }
  當(dāng)upsync無法滿足我們的需求或者注冊中心不是consul、etcd時(shí),我們可以考慮使用nginxdyups模塊。dyups僅對外提供upstream的增刪查改接口,和注冊中心對比、修改的工作需要我們通過腳本的方式完成。雖然這種方式麻煩一些,但是可定制化程度高,支持http,C,luaAPI,基本上可以滿足大部分的場景需求。
  dyups模塊也需要nginx編譯時(shí)添加
  1. $ git clone git://github.com/yzprofile/ngx_http_dyups_module.git
  2.  
  3.  
  4. # to compile as a static module
  5. $ ./configure --add-module=./ngx_http_dyups_module
  6.  
  7.  
  8. # to compile as a dynamic module
  9. $ ./configure --add-dynamic-module=./ngx_http_dyups_module
  示例配置

  1. http {
  2.  
  3.     include conf/upstream.conf;
  4.  
  5.     server {
  6.         listen   8080;
  7.  
  8.         location / {
  9.             # The upstream here must be a nginx variable
  10.             proxy_pass http://$dyups_host;
  11.         }
  12.     }
  13.  
  14.     server {
  15.         listen 8088;
  16.         location / {
  17.             return 200 "8088";
  18.         }
  19.     }
  20.  
  21.     server {
  22.         listen 8089;
  23.         location / {
  24.             return 200 "8089";
  25.         }
  26.     }
  27.  
  28.     server {
  29.         listen 8081;
  30.         location / {
  31.             dyups_interface;
  32.         }
  33.     }
  34. }
  特別注意,使用dyups時(shí),proxy_pass時(shí)的upstream必須是nginx變量,否則不生效,切記。
  整體回顧
  經(jīng)過以上調(diào)整,我們得到了以下優(yōu)化
  服務(wù)器資源自動分配,合理利用
  提升微服務(wù)的高可用性
  減低OPS人工成本,更加便于管理和維護(hù)
【免責(zé)聲明】本文僅代表作者本人觀點(diǎn),與CTI論壇無關(guān)。CTI論壇對文中陳述、觀點(diǎn)判斷保持中立,不對所包含內(nèi)容的準(zhǔn)確性、可靠性或完整性提供任何明示或暗示的保證。請讀者僅作參考,并請自行承擔(dān)全部責(zé)任。

專題

CTI論壇會員企業(yè)

宜春市| 桂东县| 方山县| 昭平县| 太保市| 永吉县| 萨迦县| 东兴市| 淮阳县| 望奎县| 宜兰市| 南京市| 略阳县| 灵石县| 彭山县| 福安市| 义马市| 临潭县| 会昌县| 安龙县| 舞阳县| 承德市| 黄石市| 朝阳区| 阿克陶县| 玉山县| 德江县| 丹阳市| 绥化市| 仙桃市| 那坡县| 明星| 沛县| 皋兰县| 玛纳斯县| 夏邑县| 绥棱县| 营山县| 扎赉特旗| 桐乡市| 波密县|