運維相關環境與工具掃盲

我來烤烤你發表於2021-01-04

專案的釋出

開發環境 devel(DEV)

Development Environment

又稱軟體開發環境 (Software Development Environment,SDE)

是程式猿們專門用於開發的伺服器,配置可以比較隨意, 為了開發除錯方便,一般開啟全部錯誤報告。

指在基本硬體和數字軟體的基礎上,為支援系統軟體和應用軟體的工程化開發和維護而使用的一組軟體

  • 軟體工具: 用以支援軟體開發的相關過程、活動和任務
  • 環境整合機制 : 為工具整合和軟體的開發、維護及管理提供統一的支援
軟體開發環境的主要組成成分是軟體工具。
人機介面是軟體開發環境與使用者之間的一個統一的互動式對話系統,它是軟體開發環境的'重要質量標誌
儲存各種軟體工具加工所產生的軟體產品或半成品的軟體環境資料庫是軟體開發環境的'核心

==

測試環境 SIT

Testing environment

一般是克隆一份生產環境的配置

指測試執行其上的軟體和硬體環境的描述,以及任何其它與被測軟體互動的軟體,包括驅動和樁
測試環境是指為了完成軟體測試工作所必需的計算機硬體、軟體、網路裝置、歷史資料的總稱。

測試環境 = 軟體 + 硬體 + 網路 + 資料準備 + 測試工具

==

預發環境 Stage

  • 功能驗收環境 FAT:做整合測試,測試程式是否能跑起來
  • 使用者驗收環境 UAT:接收真實流量,測試隱藏問題

功能驗收環境 FAT

Feature Acceptance Test environment

功能驗收測試環境,用於軟體測試者測試使用

一種驗證活動:驗證我們是否把事情做對了、該軟體是否符合業務要求

使用者驗收環境 UAT

User Acceptance Test environment

使用者驗收測試環境,用於生產環境下的軟體測試者測試使用

相關的使用者或獨立測試人員根據測試計劃和結果對系統進行測試和接收。它讓系統使用者決定是否接收系統。它是一項確定產品是否能夠滿足合同或使用者所規定需求的測試。這是管理性和防禦性控制。

主要是要求使用者參與進測試流程,並得到使用者對軟體的認可,鼓勵使用者自己進行測試設計和進行破壞性測試,充分暴露系統的設計和功能問題

==

生產環境 PROD

Production environment

是指正式提供對外服務的,一般會關掉錯誤報告,開啟錯誤日誌。可以理解為包含所有的功能的環境,任何專案所使用的環境都以這個為基礎,然後根據客戶的個性化需求來做調整或者修改。


運維工具大全

程式碼管理(SCM)

GitHub、GitLab、BitBucket、SubVersion

# GitHub
	GitHub 是一個面向開源及私有軟體專案的'託管平臺',因為只支援 Git 作為唯一的版本庫格式進行託管,故名 GitHub。
	除了 Git 程式碼倉庫託管及基本的 Web 管理介面以外,還提供了訂閱、討論組、文字渲染、線上檔案編輯器、協作圖譜(報表)、程式碼片段分享(Gist)等功能。
	在GitHub,使用者可以十分輕易地找到海量的開原始碼。

# GitLab
	GitLab 是一個用於'倉庫管理系統'的開源專案,使用Git作為程式碼管理工具,並在此基礎上搭建起來的web服務。
	GitLab是由GitLabInc.開發,使用MIT許可證的基於網路的Git倉庫管理工具,且具有wiki和issue跟蹤功能。使用Git作為程式碼管理工具,並在此基礎上搭建起來的web服務。
	它使用Ruby語言寫成。 後來,一些部分用Go語言重寫

# BitBucket
BitBucket 是一家'原始碼託管網站',採用Mercurial和Git作為分散式版本控制系統,同時提供商業計劃和免費賬戶。

# SubVersion (SVN)
	Subversion是一個'自由開源的版本控制系統'。在Subversion管理下,檔案和目錄可以超越時空。
	Subversion將檔案存放在中心版本庫裡,這個版本庫很像一個普通的檔案伺服器,不同的是,它可以記錄每一次檔案和目錄的修改情況,這樣就可以藉此將資料恢復到以前的版本,並可以檢視資料的更改細節。
	Subversion(簡稱SVN)是近年來崛起的版本管理軟體系統,目前,絕大多數開源軟體都使用SVN作為程式碼版本管理軟體。
	Subversion的版本庫可以通過網路訪問,從而使使用者可以在不同的電腦上進行操作。從某種程度上來說,允許使用者在各自的空間裡修改和管理同一組資料可以促進團隊協作。

==

構建工具

maven、Ant、Gradle

# maven
	Maven是一個'專案管理工具',它包含了一個專案物件模型 (Project Object Model),一組標準集合,一個專案生命週期(Project Lifecycle),一個依賴管理系統(Dependency Management System),和用來執行定義在生命週期階段(phase)中外掛(plugin)目標(goal)的邏輯。
	當你使用Maven的時候,你用一個明確定義的專案物件模型來描述你的專案,然後Maven可以應用橫切的邏輯,這些邏輯來自一組共享的(或者自定義的)外掛。
	Maven專案物件模型(POM),可以通過一小段描述資訊來管理專案的構建,報告和文件的專案管理工具軟體
	由於 Maven 的預設構建規則有較高的可重用性,所以常常用兩三行 Maven 構建指令碼就可以構建簡單的專案。
	功能描述:一種標準化的方式構建專案,一個清晰的方式定義專案的組成,一個容易的方式釋出專案的資訊,以及一種簡單的方式在多個專案中共享JARs
	Maven 有一個生命週期,當你執行 mvn install 的時候被呼叫。這條命令告訴 Maven 執行一系列的有序的步驟,直到到達你指定的生命週期。遍歷生命週期旅途中的一個影響就是,Maven 執行了許多預設的外掛目標,這些目標完成了像編譯和建立一個 JAR 檔案這樣的工作。
	
# Ant
Ant是'Java的生成工具',是Apache的核心專案
Ant類似於Unix中的Make工具,都是用來編譯、生成
Ant是跨平臺的,而Make不能
Ant的主要目的就是把你想做的事情自動化,不用你手動一步一步做,因為裡面內建了javac、java、建立目錄、複製檔案等功能,所以可以直接點選Ant檔案,即可編譯生成你的專案

# Gradle
	Gradle是一個基於Apache Ant和Apache Maven概念的'專案自動化構建開源工具'。它使用一種基於Groovy的特定領域語言(DSL)來宣告專案設定,目前也增加了基於Kotlin語言的kotlin-based DSL,拋棄了基於XML的各種繁瑣配置。
	Gradle是'一個基於JVM的構建工具',是一款通用靈活的構建工具,支援maven, Ivy倉庫,支援傳遞性依賴管理,而不需要遠端倉庫或者是pom.xml和ivy.xml配置檔案,基於Groovy,build指令碼使用Groovy編寫。

==

自動部署(CD)

Capistrano、CodeDeploy

# Capistrano
	Capistrano是'一種在多臺伺服器上執行指令碼的開源工具',它主要用於部署web應用。它自動完成多臺伺服器上新版本的同步更新,包括資料庫的改變。
	Capistrano是一種通過ssh向多個伺服器部署web應用的一種框架和工具。它使用一種簡單的Domain Specific Language,這種語言是從工具rake中部分借用過來的,Rake的作用類似C語言中的make工具,允許你定義任務,這些任務也許用於某些特定角色的伺服器。同時它還允許你透過閘道器在防火牆和VPN之後執行任務。

補充:
# 亞馬遜AWS( Amazon Web Services )是亞馬遜提供的專業雲端計算服務,於2006年推出,以Web服務的形式向企業提供IT基礎設施服務,通常稱為雲端計算。

# Apollo:一個進行程式碼部署的自動化平臺

# CodeDeploy
	為了能夠讓廣大開發者和企業使用者使用到功能豐富且久經考驗的程式碼部署平臺,在Apollo的經驗基礎上,AWS釋出了'自動化部署服務——CodeDeploy
	AWS CodeDeploy旨在幫助使用者完成應用的快速部署,按照使用者指定的策略將程式碼部署在一組EC2伺服器上。使用者策略可以包括叢集部署速度、部署事件通知、警報處理策略等。 此外,CodeDeploy還可以和彈性負載均衡(Elastic Load Balancer)、自動擴充套件組(Auto Scaling Group)等服務結合,完成無縫升級和動態部署。
	為方便有效地組織部署任務,CodeDeploy設立了三個概念:應用(Application)、部署(Deployment),以及部署配置(Deployment Configuration)

==

持續整合(CI)

# Continuous Integration 簡稱CI
	持續整合:Continuous Integration,簡稱CI,意思是,在一個專案中,任何人對程式碼庫的任何改動,都會觸發CI伺服器自動對專案進行構建,自動執行測試,甚至自動部署到測試環境。這樣做的好處就是,隨時發現問題,隨時修復。因為修復問題的成本隨著時間的推移而增長,越早發現,修復成本越低。
	作為開源專案,由於專案開發人員少,沒有他人指手畫腳,所以程式碼質量相對商業專案更好。對開源專案實施CI,會更簡單

Jenkins、Travis

# Jenkins
	Jenkins是一個開源軟體專案,是基於Java開發的'一種持續整合工具,用於監控持續重複的工作',旨在提供一個開放易用的軟體平臺,使軟體的持續整合變成可能。
Jenkins功能包括:
	1、持續的軟體版本釋出/測試專案。
	2、監控外部呼叫執行的工作。

# 啟動環境:系統中已經安裝了jdk,最好是jdk1.5以上。
# 啟動方式1:
1.切換到jenkins.war存放的目錄
2.執行 `java -jar jenkins.war`
3.如果需要修改埠可以使用如下命令:
	`java -jar jenkins.jar--httpPort=8081`
4.然後在瀏覽器中輸入localhost:8081,localhost可以是本機的ip,也可以是計算機名。就可以開啟jenkins

# 啟動方式2:
1.用tomcat開啟
2.解壓tomcat到某個目錄,如/usr/local,進入tomcat下的/bin目錄,啟動tomcat
3.將jenkins.war檔案放入tomcat下的webapps目錄下,啟動tomcat時,會自動在webapps目錄下建立jenkins目錄,在位址列上需要輸入localhost:8080/jenkins。
# Travis
	Travis CI是線上託管的CI服務,用Travis來進行持續整合,不需要自己搭伺服器,在網頁上點幾下就好,用起來更方便。最重要的是,它對開源專案是免費的。
	Travis CI 是'線上託管的持續整合服務',繫結Github專案,抓取新的程式碼自動進行測試構建,甚至自動部署到測試環境。 使用這項服務,每次我們提交新的程式碼,都能及時發現問題並修復。

==

配置管理

Ansible、SaltStack、Chef、Puppet

# Ansible
	ansible是新出現的'自動化運維工具',基於Python開發,集合了眾多運維工具(puppet、cfengine、chef、func、fabric)的優點,實現了批量系統配置、批量程式部署、批量執行命令等功能。
	ansible是基於模組工作的,本身沒有批量部署的能力。真正具有批量部署的是ansible所執行的模組,ansible只是提供一種框架。主要包括:
(1)、連線外掛connection plugins:負責和被監控端實現通訊;
(2)、host inventory:指定操作的主機,是一個配置檔案裡面定義監控的主機;
(3)、各種模組核心模組、command模組、自定義模組;
(4)、藉助於外掛完成記錄日誌郵件等功能;
(5)、playbook:劇本執行多個任務時,非必需可以讓節點一次性執行多個任務。

# SaltStack
	SaltStack管理工具'允許管理員對多個作業系統建立一個一致的管理系統',包括VMware vSphere環境。
	除了執行遠端命令,SaltStack允許管理員使用“grain”。grain可以在SaltStack僕從執行遠端查詢,因此收集僕從的狀態資訊並允許管理員在一箇中央位置儲存資訊。
	SaltStack也可以幫助管理員定義目標系統上的期望狀態。這些狀態在應用時會用到.sls檔案,其中包含了如何在系統上獲得所需的狀態非常具體的要求。
	
# chef
'一個自動化伺服器配置管理工具
可實現以下功能:
	1.通過編寫程式碼而不是通過執行命令來管理伺服器
	2.與您的應用程式,資料庫,LDAP目錄等緊密整合
	3.輕鬆配置需要有關整個基礎結構知識的應用程式(比如:“哪些系統正在執行我的應用程式?”“當前的主資料庫伺服器是什麼?”)
	
# Puppet
	puppet是一種Linux、Unix、windows平臺的'集中配置管理系統',使用自有的puppet描述語言,可管理配置檔案、使用者、cron任務、軟體包、系統服務等。puppet把這些系統實體稱之為資源,'puppet的設計目標是簡化對這些資源的管理以及妥善處理資源間的依賴關係。
	puppet採用C/S星狀的結構,所有的客戶端和一個或幾個伺服器互動。每個客戶端週期的(預設半個小時)向伺服器傳送請求,獲得其最新的配置資訊,保證和該配置資訊同步。
	每個puppet客戶端每半小時(可以設定)連線一次伺服器端, 下載最新的配置檔案,並且嚴格按照配置檔案來配置客戶端. 配置完成以後,puppet客戶端可以反饋給伺服器端一個訊息. 如果出錯,也會給伺服器端反饋一個訊息。

==

容器

https://mp.weixin.qq.com/s?__biz=MzI3MTI2NzkxMA==&mid=2247488720&idx=1&sn=56a3f0c46d3272f103216cf8330cf6af&scene=21#wechat_redirect

# 什麼是 Linux 容器?
	Linux 容器是由 Linux 核心所提供的具有特定隔離功能的程式,Linux 容器技術能夠讓你對應用及其整個執行時環境(包括全部所需檔案)一起進行打包或隔離。從而讓你在不同環境(如開發、測試和生產等環境)之間輕鬆遷移應用的同時,還可保留應用的全部功能。
	Linux 容器還有利於明確劃分職責範圍,減少開發和運維團隊間的衝突。這樣,開發人員可以全心投入應用開發,而運維團隊則可專注於基礎架構維護。由於 Linux 容器基於開源技術構建,還將便於你在未來輕鬆採用各類更新、更強的技術產品。包括 CRI-O、Kubernetes 和 Docker 在內的容器技術,可幫助你的團隊有效簡化、加速和編排應用的開發與部署。

Docker、Podman、LXC、第三方廠商如AWS

# Docker
	Docker 是一個'開源的應用容器引擎',讓開發者可以打包他們的應用以及依賴包到一個可移植的映象中,然後釋出到任何流行的 Linux或Windows 機器上,也可以實現虛擬化。
	Docker 是一個開源的應用容器引擎,屬於 Linux 容器的一種封裝,Docker 提供簡單易用的容器使用介面,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的 Linux 機器上。容器是完全使用沙箱機制,相互之間不會有任何介面。
	
# 一個完整的Docker有以下幾個部分組成:
	1.Docker Client    客戶端
	2.Docker Daemon    守護程式
	3.Docker Image     映象
	4.Docker Container 容器

# 相關概念
	docker設想是交付執行環境如同海運,OS如同一個貨輪,每一個在OS基礎上的軟體都如同一個集裝箱,使用者可以通過標準化手段自由組裝執行環境,同時集裝箱的內容可以由使用者自定義,也可以由專業人員製造。這樣,交付一個軟體,就是一系列標準化元件的集合的交付,如同樂高積木,使用者只需要選擇合適的積木組合,並且在最頂端署上自己的名字(最後一個標準化元件是使用者的app)。這也就是基於docker的PaaS產品的原型。
	Docker 使用客戶端-伺服器 (C/S) 架構模式,使用遠端API來管理和建立Docker容器。Docker 容器通過 Docker 映象來建立。容器與映象的關係類似於物件導向程式設計中的物件與類。
	Docker採用 C/S架構 Docker daemon 作為服務端接受來自客戶的請求,並處理這些請求(建立、執行、分發容器)。 客戶端和服務端既可以執行在一個機器上,也可通過 socket 或者RESTful API 來進行通訊。
	Docker daemon 一般在宿主主機後臺執行,等待接收來自客戶端的訊息。 Docker 客戶端則為使用者提供一系列可執行命令,使用者用這些命令實現跟 Docker daemon 互動。

# Podman產生背景
	Docker 是目前最流行的 Linux 容器解決方案,即使 Docker 是目前管理 Linux 容器的一個非常方便的工具,但它也有兩個缺點:
	1.Docker 需要在你的系統上執行一個守護程式。
	2.Docker 是以 root 身份在你的系統上執行該守護程式。
# 這些缺點的存在可能有一定的安全隱患,為了解決這些問題,下一代容器化工具 Podman 出現了

	Podman 是'一個開源的容器執行時專案',可在大多數 Linux 平臺上使用。Podman 提供與 Docker 非常相似的功能。正如前面提到的那樣,它不需要在你的系統上執行任何守護程式,並且它也可以在沒有 root 許可權的情況下執行。
	Podman 可以管理和執行任何符合 OCI(Open Container Initiative)規範的容器和容器映象。Podman 提供了一個與 Docker 相容的命令列前端來管理 Docker 映象。
	Podman 官網地址:https://podman.io/
	Podman 專案地址:https://github.com/containers/libpod

# LXC
	Linux Container 容器是'一種核心虛擬化技術',可以提供輕量級的虛擬化,以便隔離程式和資源。
	LXC為Linux Container的簡寫。可以提供輕量級的虛擬化,以便隔離程式和資源,而且不需要提供指令解釋機制以及全虛擬化的其他複雜性。相當於C++中的NameSpace。
	容器有效地將由單個作業系統管理的資源劃分到孤立的組中,以更好地在孤立的組之間平衡有衝突的資源使用需求。'與傳統虛擬化技術相比,它的優勢在於:
	(1)與宿主機使用同一個核心,效能損耗小;
	(2)不需要指令級模擬;
	(3)不需要即時(Just-in-time)編譯;
	(4)容器可以在CPU核心的本地執行指令,不需要任何專門的解釋機制;
	(5)避免了準虛擬化和系統呼叫替換中的複雜性;
	(6)輕量級隔離,在隔離的同時還提供共享機制,以實現容器與宿主機的資源共享。
	
	Linux Container提供了在單一可控主機節點上支援多個相互隔離的server container同時執行的機制。Linux Container有點像chroot,提供了一個擁有自己程式和網路空間的虛擬環境,但又有別於虛擬機器,因為lxc是一種作業系統層次上的資源的虛擬化。

==

編排

Kubernetes、Apache Mesos

http://www.dockone.io/article/932(Kubernetes)

# Kubernetes
	kubernetes,簡稱K8s,是用8代替8個字元“ubernete”而成的縮寫。'是一個開源的,用於管理雲平臺中多個主機上的容器化的應用',Kubernetes的目標是讓部署容器化的應用簡單並且高效(powerful),Kubernetes提供了應用部署,規劃,更新,維護的一種機制。
	Kubernetes是Google開源的一個'容器編排引擎',它支援自動化部署、大規模可伸縮、應用容器化管理。在生產環境中部署一個應用程式時,通常要部署該應用的多個例項以便對應用請求進行負載均衡。
	在Kubernetes中,我們可以建立多個容器,每個容器裡面執行一個應用例項,然後通過內建的負載均衡策略,實現對這一組應用例項的管理、發現、訪問,而這些細節都不需要運維人員去進行復雜的手工配置和處理。

# Kubernetes 特點
可移植: 支援公有云,私有云,混合雲,多重雲(multi-cloud)
可擴充套件: 模組化,外掛化,可掛載,可組合
自動化: 自動部署,自動重啟,自動複製,自動伸縮/擴充套件

	
# 容器
	傳統的應用部署方式是通過外掛或指令碼來安裝應用。這樣做的缺點是應用的執行、配置、管理、所有生存週期將與當前作業系統繫結,這樣做並不利於應用的升級更新/回滾等操作,當然也可以通過建立虛擬機器的方式來實現某些功能,但是虛擬機器非常重,並不利於可移植性。
	新的方式是通過部署容器方式實現,每個容器之間互相隔離,每個容器有自己的檔案系統 ,容器之間程式不會相互影響,能區分計算資源。相對於虛擬機器,容器能快速部署,由於容器與底層設施、機器檔案系統解耦的,所以它能在不同雲、不同版本作業系統間進行遷移。
	容器佔用資源少、部署快,每個應用可以被打包成一個容器映象,每個應用與容器間成一對一關係也使容器有更大優勢,使用容器可以在build或release 的階段,為應用建立容器映象,因為每個應用不需要與其餘的應用堆疊組合,也不依賴於生產環境基礎結構,這使得從研發到測試、生產能提供一致環境。類似地,容器比虛擬機器輕量、更“透明”,這更便於監控和管理。

# Apache Mesos
	Apache Mesos是一個'叢集管理器',提供了有效的、跨分散式應用或框架的資源隔離和共享,可以執行Hadoop、MPI、Hypertable、Spark。

==

服務註冊與發現

Zookeeper、etcd、Consul

# Zookeeper
	ZooKeeper是一個分散式的,開放原始碼的分散式應用程式協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重要元件。
	它是一個為分散式應用提供一致性服務的軟體,提供的功能包括:配置維護、域名服務、分散式同步、組服務等。
	ZooKeeper的目標就是封裝好複雜易出錯的關鍵服務,將簡單易用的介面和效能高效、功能穩定的系統提供給使用者。
# ZooKeeper的基本運轉流程:
1、選舉Leader。
2、同步資料。
3、選舉Leader過程中演算法有很多,但要達到的選舉標準是一致的。
4、Leader要具有最高的執行ID,類似root許可權。
5、叢集中大多數的機器得到響應並接受選出的Leader。

# etcd
etcd 是一個分散式、可靠 key-value 儲存的'分散式系統'。當然,它不僅僅用於儲存,還提供共享配置及服務發現。

	etcd 比較多的應用場景是用於服務發現,服務發現 (Service Discovery) 要解決的是分散式系統中最常見的問題之一,即在同一個分散式叢集中的程式或服務如何才能找到對方並建立連線。
# 和 Zookeeper 類似,etcd 有很多使用場景,包括:
配置管理
服務註冊發現
選主
應用排程
分散式佇列
分散式鎖

# 工作原理
	etcd 使用 raft 協議來維護叢集內各個節點狀態的一致性。簡單說,etcd 叢集是一個分散式系統,由多個節點相互通訊構成整體對外服務,每個節點都儲存了完整的資料,並且通過 Raft 協議保證每個節點維護的資料是一致的。
	每個 etcd 節點都維護了一個狀態機,並且,任意時刻至多存在一個有效的主節點。主節點處理所有來自客戶端寫操作,通過 Raft 協議保證寫操作對狀態機的改動會可靠的同步到其他節點。

# Consul
	Consul是一個服務管理軟體。支援多資料中心下,分散式高可用的,服務發現和配置共享。採用 Raft 演算法,用來保證服務的高可用。
	
官方:https://www.consul.io/docs/index.html
網文:https://www.jianshu.com/p/ce7c7b9dcf14

==

指令碼語言

python、ruby、shell

# python
	Python是一種跨平臺的計算機程式設計語言。 是一個高層次的結合瞭解釋性、編譯性、互動性和麵向物件的指令碼語言。最初被設計用於編寫自動化指令碼(shell),隨著版本的不斷更新和語言新功能的新增,越多被用於獨立的、大型專案的開發。
	
# ruby
	Ruby,一種簡單快捷的物件導向(物件導向程式設計)指令碼語言,在20世紀90年代由日本人松本行弘(Yukihiro Matsumoto)開發,遵守GPL協議和Ruby License。
	
# shell
	一種程式設計語言。作為命令語言,它互動式解釋和執行使用者輸入的命令或者自動地解釋和執行預先設定好的一連串的命令;作為程式設計語言,它定義了各種變數和引數,並提供了許多在高階語言中才具有的控制結構,包括迴圈和分支。
	
	圖形介面shell(Graphical User Interface shell 即 GUI shell)
	命令列式shell(Command Line Interface shell ,即CLI shell)
	
	shell基本上是一個命令直譯器,類似於DOS下的command。它接收使用者命令(如ls等),然後呼叫相應的應用程式。較為通用的shell有標準的Bourne shell (bash)和C shell (csh)

==

日誌管理

ELK、Logentries

# 為什麼用到ELK
	一般我們需要進行日誌分析場景:直接在日誌檔案中 grep、 awk 就可以獲得自己想要的資訊。但在規模較大的場景中,此方法效率低下,面臨問題包括日誌量太大如何歸檔、文字搜尋太慢怎麼辦、如何多維度查詢。需要集中化的日誌管理,所有伺服器上的日誌收集彙總。
	常見解決思路是建立集中式日誌收集系統,將所有節點上的日誌統一收集,管理,訪問。
	一般大型系統是一個分散式部署的架構,不同的服務模組部署在不同的伺服器上,問題出現時,大部分情況需要根據問題暴露的關鍵資訊,定位到具體的伺服器和服務模組,構建一套集中式日誌系統,可以提高定位問題的效率。
	ELK提供了一整套解決方案,並且都是開源軟體,之間互相配合使用,完美銜接,高效的滿足了很多場合的應用。目前主流的一種日誌系統。
	
# 簡介
	ELK是三個開源軟體的縮寫,分別表示:Elasticsearch , Logstabash, Kibana , 它們都是開源軟體。新增了一個FileBeat,它是一個輕量級的日誌收集處理工具(Agent),Filebeat佔用資源少,適合於在各個伺服器上搜集日誌後傳輸給Logstabash,官方也推薦此工具。
	1.Elasticsearch是個開源分散式搜尋引擎,提供蒐集、分析、儲存資料三大功能。它的特點有:分散式,零配置,自動發現,索引自動分片,索引副本機制,restful風格介面,多資料來源,自動搜尋負載等。
	2.Logstabash 主要是用來日誌的蒐集、分析、過濾日誌的工具,支援大量的資料獲取方式。一般工作方式為c/s架構,c端安裝在需要收集日誌的主機上,s端負責將收到的各節點日誌進行過濾、修改等操作在一併發往elasticsearch上去。
	3.Kibana 也是一個開源和免費的工具,Kibana可以為 Logstabash 和 ElasticSearch 提供的日誌分析友好的 Web 介面,可以幫助彙總、分析和搜尋重要資料日誌。
# 參考:https://www.cnblogs.com/aresxin/p/8035137.html

# Logentries
	Logentries 是一個'日誌管理平臺',提供各種語言的客戶端開發包,可以在雲端對應用日誌進行分析統計。該平臺的伺服器端是不開源的,但其各種客戶端 API 都是開源的,原始碼地址:https://github.com/logentries

# Splunk
Splunk 是一款頂級的日誌分析軟體,能處理常規的日誌格式,比如 apache、squid、系統日誌、mail.log 這些

對所有日誌先進行 index,然後可以交叉查詢,支援複雜的查詢語句。然後通過直觀的方式表現出來。日誌可以通過檔案方式傳倒 Splunk 伺服器,也可以通過網路實時傳輸過去。或者是分散式的日誌收集。

==

系統監控

Prometheus、Zabbix、Datadog、Graphite、Ganglia、Nagios

# Prometheus
	Prometheus是由SoundCloud開發的'開源監控報警系統和時序列資料庫'。Prometheus使用Go語言開發,是Google BorgMon監控系統的開源版本。
# 官網地址:https://prometheus.io/
	
# Prometheus的特點
多維度資料模型。
靈活的查詢語言。
不依賴分散式儲存,單個伺服器節點是自主的。
通過基於HTTP的pull方式採集時序資料。
可以通過中間閘道器進行時序列資料推送。
通過服務發現或者靜態配置來發現目標服務物件。
支援多種多樣的圖表和介面展示,比如Grafana等。

# 基本原理
	Prometheus的基本原理是通過HTTP協議週期性抓取被監控元件的狀態,任意元件只要提供對應的HTTP介面就可以接入監控。不需要任何SDK或者其他的整合過程。  這樣做非常適合做虛擬化環境監控系統,比如VM、Docker、Kubernetes等。輸出被監控元件資訊的HTTP介面被叫做exporter 。
	目前網際網路公司常用的元件大部分都有exporter可以直接使用,比如Varnibash、Haproxy、Nginx、MySQL、Linux系統資訊(包括磁碟、記憶體、CPU、網路等等)# 三大套件
Server 主要負責資料採集和儲存,提供PromQL查詢語言的支援。
Alertmanager 警告管理器,用來進行報警。
Pubash Gateway 支援臨時性Job主動推送指標的中間閘道器。

# 參考:https://www.cnblogs.com/chenqionghe/p/10494868.html

# Zabbix
	zabbix 是一個基於WEB介面的提供分散式系統監視以及網路監視功能的企業級的開源解決方案。
	zabbix能監視各種網路引數,保證伺服器系統的安全運營;並提供靈活的通知機制以讓系統管理員快速定位/解決存在的各種問題。
	zabbix由2部分構成,zabbix server與可選元件zabbix agent。
	zabbix server可以通過SNMP,zabbix agent,ping,埠監視等方法提供對遠端伺服器/網路狀態的監視,資料收集等功能,它可以執行在Linux,Solaris,HP-UX,AIX,Free BSD,Open BSD,OS X等平臺上。
	
	zabbix agent需要安裝在被監視的目標伺服器上,它主要完成對硬體資訊或與作業系統有關的記憶體,CPU等資訊的收集。
	zabbix server可以單獨監視遠端伺服器的服務狀態;同時也可以與zabbix agent配合,可以輪詢zabbix agent主動接收監視資料(agent方式),同時還可被動接收zabbix agent傳送的資料(trapping方式)。
	
# 搭建Zabbix監控環境
	要想搭建一個Zabbix的工作環境,需要從伺服器入手。與伺服器通訊,管理員需要使用一個Zabbix前端介面,與Zabbix伺服器和資料庫進行通訊。三個關鍵(介面、伺服器和資料庫)可以安裝在同一臺伺服器上,但是如果你擁有一個更大更復雜的環境,將它們安裝在不同的主機上也是一個選項。Zabbix伺服器能夠直接監控到同一網路中的裝置,如果其他網路的裝置也需要被監控,那還需要一臺Zabbix代理伺服器。

# Datadog
	Datadog的工作方式是在每一臺需要監控的伺服器上執行它的Agent。Agent不但會收集這臺伺服器的各類基礎效能資料,如CPU使有率,剩餘記憶體空間,剩餘磁碟空間,網路流量等,也可以收集使用者自定義的效能資料,靈活性很好。
	Datadog另一個好用的地方在於它與眾多的雲服務和開源專案有整合
	Datadog也可以對各種監控的效能指標設定閾值,當指標超出閾值範圍時,發出警報。我們可以利用它與Slack的整合,直接將警報推送到Slack上。

# Graphite
	Graphite是一個開源實時的、顯示時間序列度量資料的圖形系統。Graphite並不收集度量資料本身,而是像一個資料庫,通過其後端接收度量資料,然後以實時方式查詢、轉換、組合這些度量資料。Graphite支援內建的Web介面,它允許使用者瀏覽度量資料和圖。

Graphite有三個主要元件組成:
1)Graphite-Web
這是一個基於Django的Web應用,可以呈現圖形和儀表板
2)Carbon
這是一個度量處理守護程式
3)Whisper
這是一個基於時序資料庫的庫

# Ganglia
	Ganglia是UC Berkeley發起的一個開源叢集監視專案,設計用於測量數以千計的節點。Ganglia的核心包含gmond、gmetad以及一個Web前端。主要是用來監控系統效能,如:cpu 、mem、硬碟利用率, I/O負載、網路流量情況等,通過曲線很容易見到每個節點的工作狀態,對合理調整、分配系統資源,提高系統整體效能起到重要作用。
	Ganglia是一個跨平臺可擴充套件的,高 效能計算系統下的分散式監控系統,如叢集和網格。它是基於分層設計,它使用廣泛的技術,如XML資料代表,便攜資料傳輸,RRDtool用於資料儲存和可 視化。它利用精心設計的資料結構和演算法實現每節點間併發非常低的。

# Nagios
	Nagios是一個監視系統執行狀態和網路資訊的監視系統。Nagios能監視所指定的本地或遠端主機以及服務,同時提供異常通知功能等。
	Nagios可執行在Linux/Unix平臺之上,同時提供一個可選的基於瀏覽器的WEB介面以方便系統管理人員檢視網路狀態,各種系統問題,以及日誌等等。

==

效能監控

AppDynamics、New Relic

# AppDynamics
Appdynamics 是一種服務效能監控/管理工具,主要包含兩種功能:
1.終端使用者效能體驗監控
2.計算資源監控

# New Relic
	New Relic 是一個很強大的伺服器效能監控工具,New Relic目前'專注於SaaS和App效能管理業務',它支援支援agent和API傳送資料,能夠對部署在本地或在雲中的web應用程式進行監控、故障修復、診斷、執行緒分析以及容量計劃。
	
端對端事務跟蹤:跟蹤一個關鍵事務的效能,這個事務貫穿在整個面向服務應用程式環境。
程式碼級的可見性:深入洞察特定程式碼段和SQL語句對效能的影響。
關鍵事務:標記你的最關鍵的事務,當響應時間、呼叫、錯誤率等這些表現不佳的時候可以迅速的發現。
X光會話:通過展示事務跟蹤長期分析的結果,來獲得對一個關鍵事務效能更深入的瞭解

==

壓力測試

JMeter、Blaze Meter、loader.io

# JMeter
	Apache JMeter是Apache組織開發的基於Java的壓力測試工具。用於對軟體做壓力測試
	Apache jmeter 可以用於對靜態的和動態的資源(檔案,Servlet,Perl指令碼,java 物件,資料庫和查詢,FTP伺服器等等)的效能進行測試。它可以用於對伺服器、網路或物件模擬繁重的負載來測試它們的強度或分析不同壓力型別下的整體效能。你可以使用它做效能的圖形分析或在大併發負載測試你的伺服器/指令碼/物件。
	
# Blaze Meter
Blaze Meter是一款可以記錄所有HTTP流量並在10分鐘內建立一個負載測試並且與Apache JMeter相容的chrome外掛
目前普通的使用方法就是一種指令碼錄製工具可以輔助Jmeter完成指令碼的建立。

BlazeMeter擴充套件提供了兩種測試模式:
1.一種是FollowMe模式,在這種模式下不需要設定和指令碼。 只需瀏覽您的網站,一群虛擬使用者就會按照您的操作 - 模擬即時測試的負載。 檢視實時報告並即時調整您的測試,一鍵即可進行動態測試
2.另一種模式是為您為您建立JMeter指令碼,記錄所有瀏覽活動以建立JMeter指令碼並自動將其上傳到BlazeMeter。 單擊執行或將其匯出為JMeter .jmx檔案。

# loader.io
loader.io最大支援1萬個連線數測試,其提供了測試結果報表也很詳細,自由定製Header頭部、支援PUT 、POST、PATCH等方式,功能強大,測試結果準確。

==

應用伺服器

Tomcat、JBoss、IIS

IIS# Tomcat
Tomcat 伺服器是一個免費的開放原始碼的Web 應用伺服器,屬於輕量級應用伺服器,是開發和除錯 JSP程式的首選
# 解析
	當在一臺機器上配置好Apache 伺服器,可利用它響應HTML(標準通用標記語言下的一個應用)頁面的訪問請求。實際上Tomcat是Apache 伺服器的擴充套件,但執行時它是獨立執行的,所以當你執行tomcat 時,它實際上作為一個與Apache 獨立的程式單獨執行的。
	'當配置正確時,Apache 為HTML頁面服務,而Tomcat 實際上執行JSP 頁面和Servlet
	
# JBoss
JBoss是一個基於J2EE的開放原始碼的應用伺服器
JBoss是一個管理EJB的容器和伺服器,支援EJB 1.1、EJB 2.0和EJB3的規範。但JBoss核心服務不包括支援servlet/JSP的WEB容器,一般與Tomcat或Jetty繫結使用。

優點:
1、JBoss是免費的,開放原始碼J2EE的實現,通過LGPL許可證進行釋出。
2、JBoss需要的記憶體和硬碟空間比較小。
3、安裝便捷:解壓後,只需配置一些環境變數即可。
4、JBoss支援"熱部署",部署BEAN時,只拷貝BEAN的JAR檔案到部署路徑下即可自動載入;如果有改動,也會自動更新
5、JBoss與Web伺服器在同一個Java虛擬機器中執行,Servlet呼叫EJB不經過網路,從而大大提高執行效率,提升安全效能
6、使用者可以直接實施J2EE-EAR,而不是以前分別實施EJB-JAR和Web-WAR,非常方便。
7、Jboss支援叢集。
'因此,高度模組化的和鬆耦合。JBoss應用伺服器是健壯的、高質量的,而且還具有良好的效能。'

# IIS
網際網路資訊服務(Internet Information Services,簡稱IIS),是由微軟公司提供的基於執行Microsoft Windows的網際網路基本服務。

==

Web伺服器

Apache、Nginx

# Apache
	Apache HTTP Server(簡稱Apache)是Apache軟體基金會的一個開放原始碼的網頁伺服器,可以在大多數計算機作業系統中執行,由於其多平臺和安全性被廣泛使用,是最流行的Web伺服器端軟體之一。它快速、可靠並且可通過簡單的API擴充套件,將Perl/Python等直譯器編譯到伺服器中。
	Apache HTTP伺服器是一個模組化的伺服器,源於NCSAhttpd伺服器
	'Apache的特點是簡單、速度快、效能穩定,並可做代理伺服器來使用。
	Apache有多種產品,可以支援SSL技術,支援多個虛擬主機。Apache是以程式為基礎的結構,程式要比執行緒消耗更多的系統開支,不太適合於多處理器環境,因此,在一個Apache Web站點擴容時,通常是增加伺服器或擴充群集節點而不是增加處理器。
	
# Nginx
Nginx (engine x) 是一個高效能的HTTP和反向代理web伺服器,同時也提供了IMAP/POP3/SMTP服務。
'因它的穩定性、豐富的功能集、示例配置檔案和低系統資源的消耗而聞名
Nginx是一款輕量級的Web 伺服器/反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器,在BSD-like 協議下發行。
'其特點是佔有記憶體少,併發能力強

	Nginx 是一個安裝非常的簡單、配置檔案非常簡潔(還能夠支援perl語法)、Bug非常少的服務。Nginx 啟動特別容易,並且幾乎可以做到7*24不間斷執行,即使執行數個月也不需要重新啟動。你還能夠不間斷服務的情況下進行軟體版本的升級。

# 作為伺服器的優點:
1.Nginx作為負載均衡服務:Nginx 既可以在內部直接支援 Rails 和 PHP 程式對外進行服務,也可以支援作為 HTTP代理服務對外進行服務。Nginx採用C進行編寫,不論是系統資源開銷還是CPU使用效率都比 Perlbal 要好很多。
2.處理靜態檔案,索引檔案以及自動索引;開啟檔案描述符緩衝。
3.無快取的反向代理加速,簡單的負載均衡和容錯。
4.FastCGI,簡單的負載均衡和容錯。
5.模組化的結構。包括 gzipping, byte ranges, chunked responses,以及 SSI-filter 等 filter。如果由 FastCG或其它代理伺服器處理單頁中存在的多個 SSI,則這項處理可以並行執行,而不需要相互等待。
6.支援 SSL 和 TLSSNI。

==

資料庫

關係型資料庫

MySQL、Oracle、PostgreSQL

# MySQL
	MySQL是一種關係型資料庫管理系統,關聯式資料庫將資料儲存在不同的表中,而不是將所有資料放在一個大倉庫內,這樣就增加了速度並提高了靈活性
	MySQL 是最流行的關係型資料庫管理系統之一,在 WEB 應用方面,MySQL是最好的 RDBMS (Relational Database Management System,關聯式資料庫管理系統) 應用軟體之一
	MySQL所使用的 SQL 語言是用於訪問資料庫的最常用標準化語言。MySQL 軟體採用了雙授權政策,分為社群版和商業版,由於其體積小、速度快、總體擁有成本低,尤其是開放原始碼這一特點,一般中小型網站的開發都選擇 MySQL 作為網站資料庫。
	
# 特性
1.MySQL使用 C和 C++編寫,並使用了多種編譯器進行測試,保證了原始碼的可移植性。
2.支援 AIX、FreeBSD、HP-UX、Linux、Mac OS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris、Windows等多種作業系統。
3.為多種程式語言提供了 API。這些程式語言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby,.NET和 Tcl 等。
4.支援多執行緒,充分利用 CPU 資源。
5.優化的 SQL查詢演算法,有效地提高查詢速度。
6.既能夠作為一個單獨的應用程式應用在客戶端伺服器網路環境中,也能夠作為一個庫而嵌入到其他的軟體中。
7.提供多語言支援,常見的編碼如中文的 GB 2312、BIG5,日文的 bashift_JIS等都可以用作資料表名和資料列名。
8.提供 TCP/IP、ODBC 和 JDBC等多種資料庫連線途徑。
9.提供用於管理、檢查、優化資料庫操作的管理工具。
10.支援大型的資料庫。可以處理擁有上千萬條記錄的大型資料庫。
11.支援多種儲存引擎。
12.MySQL 是開源的,所以你不需要支付額外的費用。
13.MySQL 使用標準的 SQL資料語言形式。
14.MySQL 對 PHP 有很好的支援,PHP是比較流行的 Web 開發語言。
15.MySQL是可以定製的,採用了 GPL協議,你可以修改原始碼來開發自己的 MySQL 系統。
16.線上 DDL/更改功能,資料架構支援動態應用程式和開發人員靈活性(5.6新增)
17.複製全域性事務標識,可支援自我修復式叢集(5.6新增)
18.複製無崩潰從機,可提高可用性(5.6新增)
19.複製多執行緒從機,可提高效能(5.6新增)
20.3倍更快的效能(5.7新增)
21.新的優化器(5.7新增)
22.原生JSON支援(5.7新增)
23.多源複製(5.7新增)
24.GIS的空間擴充套件

# 儲存引擎
【MyISAM】  MySQL 5.0 之前的預設資料庫引擎,最為常用。擁有較高的插入,查詢速度,但不支援事務
【InnoDB】 事務型資料庫的首選引擎,支援ACID事務,支援行級鎖定, MySQL 5.5 起成為預設資料庫引擎

# Oracle
	Oracle是一個面向Internet計算環境的資料庫。它是在資料庫領域一直處於領先地位的Oracle(即甲骨文公司)的產品。可以說Oracle 關聯式資料庫系統是目前世界上流行的關聯式資料庫管理系統,系統可移植性好、使用方便、功能強,適用於各類大、中、小、微機環境。它是一種高效率、可靠性好的 適應高吞吐量的資料庫解決方案

# PostgreSQL
PostgreSQL是一個功能非常強大的、原始碼開放的客戶/伺服器關係型資料庫管理系統(RDBMS)
PostgreSQL是一個非常健壯的軟體包,有很多在大型商業RDBMS中所具有的特性,包括事務、子選擇、觸發器、檢視、外來鍵引用完整性和複雜鎖定功能。另一方面,PostgreSQL也缺少商業資料庫中某些可用的特性,如使用者定義的型別、繼承性和規則。從使用者的角度來講,'PostgreSQL惟一不具備的主要特性就是外部連線,在今後的版本中會將其加入。

NoSQL資料庫

mongoDB、redis

# mongoDB
1.MongoDB是一個基於分散式檔案儲存的資料庫。由C++語言編寫。旨在為WEB應用提供可擴充套件的高效能資料儲存解決方案。
2.MongoDB是一個介於關聯式資料庫和非關聯式資料庫之間的產品,是非關聯式資料庫當中功能最豐富,最像關聯式資料庫的。它支援的資料結構非常鬆散,是類似json的bson格式,因此可以儲存比較複雜的資料型別。
3.Mongo最大的特點是'它支援的查詢語言非常強大,其語法有點類似於物件導向的查詢語言,幾乎可以實現類似關聯式資料庫單表查詢的絕大部分功能,而且還支援對資料建立索引。

# Redis
	Redis(Remote Dictionary Server ),即遠端字典服務,是一個開源的使用ANSI C語言編寫、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。
	redis是一個key-value儲存系統。和Memcached類似,它支援儲存的value型別相對更多,包括string(字串)、list(連結串列)、set(集合)、zset(sorted set --有序集合)和habash(雜湊型別)。。這些資料型別都支援pubash/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是【原子性】的。
	Redis支援【主從同步】。'資料可以從主伺服器向任意數量的從伺服器上同步,從伺服器可以是關聯其他從伺服器的主伺服器。這使得Redis可執行單層樹複製 ' 存檔可以有意無意的對資料進行寫操作 由於完全實現了釋出/訂閱機制,使得從資料庫在任何地方同步樹時,可訂閱一個頻道並接收主伺服器完整的訊息釋出記錄。同步對讀取操作的可擴充套件性和資料冗餘很有幫助。

==

專案管理(PM)

Jira、AsaNa、Taiga、Trello、Basecamp、Pivotal Tracker

# Jira
JIRA 是目前比較流行的基於Java架構的管理系統。
主要功能:
1.問題追蹤和管理:用它管理專案,跟蹤任務、bug、需求,通過jira的郵件通知功能進行協作通知,在實際工作中使工作效率提高很多
2.問題跟進情況的分析報告:可以隨時瞭解問題和專案的進展情況
3.專案類別管理功能:可以將相關的專案分組管理
4.元件/模組負責人功能:可以將專案的不同元件/模組指派相應的負責人,來處理所負責的元件的Issues
5.專案email地址功能:每個專案可以有不同的email(該專案的通知郵件從該地址發出)
6.無限制的工作流:可以建立多個工作流為不同的專案使用

# AsaNa
AsaNa,團隊任務管理平臺,是一個集郵件、辦公、文件、溝通於一體的任務管理平臺,它注重使用鍵盤的快捷方式,可以幫你節省不少工作的時間。在Asana 收取郵件都是以實時資訊的方式展現,也就是說使用者收取的郵件都是自動展示,而不用專門去點開“未讀郵件”了。而使用者在讀完郵件後,可以通過標記的方式讓郵件自動歸檔。

# Taiga
Taiga 是一個免費開源,而且功能非常強大的專案管理平臺,用於初創企業和敏捷開發團隊。提供一個簡單漂亮的專案管理工具。
Taiga 採用 Python Django 框架開發,前端基於 AngularJS 實現。

# Trello
Trello 是一種簡便、免費、靈活的視覺化方式,可以管理你的專案並組織各種事務, 得到世界各地數百萬人的信任。Trello看板、列表和卡片使你能夠以一種有趣、靈活和有益的方式,組織你的專案並劃分它們的優先順序。

# Basecamp
Basecamp是37signals公司旗下的一款非常流行的'基於雲服務的專案管理軟體 
Basecamp提供了訊息板,待辦事宜,簡單排程,協同寫作,檔案共享。而不是甘特圖,炫麗的曲線圖,和繁重的電子表格。

# Pivotal Tracker(樞紐跟蹤器)
Pivotal Tracker是一款【敏捷開發】和專案管理的軟體

相關文章