kibana源碼
『壹』 大數據方面核心技術有哪些
大數據技術的體系龐大且復雜,基礎的技術包含數據的採集、數據預處理、分布式存儲、資料庫、數據倉庫、機器學習、並行計算、可視化等。
1、數據採集與預處理:
Flume NG實時日誌收集系統,支持在日誌系統中定製各類數據發送方,用於收集數據;
Zookeeper是一個分布式的,開放源碼的分布式應用程序協調服務,提供數據同步服務。
2、數據存儲:
Hadoop作為一個開源的框架,專為離線和大規模數據分析而設計,HDFS作為其核心的存儲引擎,已被廣泛用於數據存儲。
HBase,是一個分布式的、面向列的開源資料庫,可以認為是hdfs的封裝,本質是數據存儲、NoSQL資料庫。
3、數據清洗:MapRece作為Hadoop的查詢引擎,用於大規模數據集的並行計算
4、數據查詢分析:
Hive的核心工作就是把SQL語句翻譯成MR程序,可以將結構化的數據映射為一張資料庫表,並提供 HQL(Hive SQL)查詢功能。
Spark 啟用了內存分布數據集,除了能夠提供互動式查詢外,它還可以優化迭代工作負載。
5、數據可視化:對接一些BI平台,將分析得到的數據進行可視化,用於指導決策服務。
『貳』 安全開發你必須使用的28個DevSecOps工具
將安全融入開發過程,更早捕獲並修復應用漏洞,你需要這五類共28款DevSecOps工具。
DevSecOps 是將安全集成到整個應用開發周期的過程,是從內到外強化應用,使其能夠抵禦各種潛在威脅的理想方式。因為很多公司企業不斷開發應用以滿足客戶和商業合作夥伴的需求,DevSecOps的吸引力也與日俱增。
敏捷開發方法與DevOps操作幫助公司企業達成持續開發的目標。雲原生應用架構也成芹尺為了DevSecOps運動的有力貢獻者,推動採用公共雲提供商、容器技術和容器平台為應用提供計算能力。DevSecOps將安全過程與工具集成進工作流並加以自動化,擺脫了傳統方法按時間點進行的潛在干擾,是個無縫且持續的過程。
咨詢公司 Data Bridge Market Research 稱,鑒於網路安全威脅數量與危害性的持續上升,全球DevSecOps市場預計將從2018年的14.7億美元增長至2026年的136.3億美元。
市場繁榮之下,DevSecOps工具必將呈現百花齊放百家爭鳴的局面。下面就按核心門類為您呈上多款優秀DevSecOps工具。
開發應用的時候很容易忽略掉安全漏洞。下面的工具為開發人員提供了潛在安全異常及缺陷的警報功能,可供開發人員及時調查並修復這些漏洞,不至於走得太遠回不了頭。有些工具專用於警報功能,比如開源的Alerta 。其他工具則兼具測試等別的功能,比如 Contrast Assess。
1. Alerta
(https://alerta.io/)
該開源工具可將多個來源的信息整合去重,提供快速可視化功能。Alerta與Prometheus、Riemann、Nagios、Cloudwatch及其他監視/管理服務集成,開發人員可通過API按需定製Alerta。
2. Contrast Assess
(https://www.contrastsecurity.com/interactive-application-security-testing-iast)
作為一款互動應用安全測試(IAST)工具,Contrast Assess 與用戶應用集成,在後台持續監視代碼,並在發現安全漏洞時發出警報。據稱即便是非安全開發人員也可使用 Contrast Assess 自行識別並修復漏洞。
3. Contrast Protect
(https://www.contrastsecurity.com/runtime-application-self-protection-rasp)
該運行時應用自保護(RASP)工具採用了 Contrast Assess 同款嵌入式代理。Contrast Protect 在生產環境中查找漏洞利用程序和未知威脅,並將結果提交給安全信息及事件管理(SIEM)控制台、防火牆或其他安全工具。
4. ElastAlert
(https://elastalert.readthedocs.io/en/latest/)
ElastAlert提供近實時接收警報的框架,可接收來自Elasticsearch數據的安全異常、流量激增及其他模式。ElastAlert查詢Elasticsearch並根據一系列規則比較這些數據。一旦出現匹配,ElastAlert便發出警報並隨附建議動作。
大多數DevSecOps工具都提供一定程度的自動化。此類工具自動掃描、發現並修復安全缺陷,只是搜首飢自動化程度各有不同,從條件式事件驅動的自動化到運用深度學習技術的自動化都有。
1. CodeAI
(http://www.qbitlogic.com/codeai/)
旨世返在通過深度學習技術自動查找並修復源代碼中的安全漏洞,號稱可為開發人員提供可供參考的解決方案列表,而不僅僅是安全問題列表。其供應商QbitLogic宣稱,已為CodeAI饋送了數百萬個現實世界漏洞修復樣本供訓練。
2. Parasoft tool suite
(https://www.parasoft.com/)
Parasoft提供包括應用開發安全測試在內的多種自動化工具:
1)Parasoft C/C++test
(https://www.parasoft.com/procts/ctest)
用於開發過程早期缺陷識別;
2)Parasoft Insure++
(https://www.parasoft.com/procts/insure)
3)Parasoft Jtest
(https://www.parasoft.com/procts/jtest)
用於java軟體開發測試;
4) Parasoft dotTEST
(https://www.parasoft.com/procts/jtest)
以深度靜態分析和高級覆蓋作為 Visual Studio 工具的補充。
3. Red Hat Ansible Automation
(https://www.redhat.com/en/technologies/management/ansible)
該工具包含三個模塊——Ansible Tower、Ansible Engine 和 Red Hat Ansible Network Automation,可作為無代理IT自動化技術單獨或聯合使用。盡管不是專門的安全工具,Ansible Automation 卻可供用戶定義規則以確定自身軟體開發項目中哪些部分是安全的。
4. StackStorm
(https://stackstorm.com)
該開源工具號稱「可進行條件式運營」,其事件驅動的自動化能在檢測到安全漏洞時提供腳本化的修復與響應,並附有持續部署、ChatOps優化等功能。
5. Veracode
(https://www.veracode.com/devsecops)
該公司提供DevSecOps環境中廣泛使用的一系列自動化安全工具,包括在代碼編寫時即時自動掃描的Greenlight;在沙箱中掃描代碼漏洞的 Developer Sandbox;識別漏洞組件的 Software Composition Analysis (SCA);以及識別應用缺陷的 Static Analysis。
專用DevSecOps儀錶板工具可使用戶在同一圖形界面中查看並共享從開發伊始到運營過程中的安全信息。有些DevSecOps應用,比如ThreatModeler和Parasoft已自帶儀錶板。
1. Grafana
(https://grafana.com/)
該開源分析平台允許用戶創建自定義儀錶板,聚合所有相關數據以可視化及查詢安全數據。如果不想自行構建,還可以在其網站上選用社區構建的儀錶板。
2. Kibana
(https://www.elastic.co/procts/kibana)
如果你使用Elasticsearch,該開源工具可在統一圖形界面中集成成千上萬的日誌條目,包括運營數據、時間序列分析、應用監視等等。
威脅建模DevSecOps工具用以在復雜的攻擊界面中識別、預測並定義威脅,以便用戶可以做出主動安全決策。有些工具可根據用戶提供的系統及應用信息自動構建威脅模型,並提供可視化界面以幫助安全及非安全人員 探索 威脅及其潛在影響。
1. IriusRisk
(https://continuumsecurity.net/threat-modeling-tool/)
出自 Continuum Security 的解決方案,既可雲部署,也可現場部署,能以基於問卷的界面自動化風險及需求分析,並設計出威脅模型和技術性安全要求。IriusRisk還可幫助用戶管理代碼構建及安全測試階段。
2. ThreatModeler
(https://threatmodeler.com/)
該自動化威脅建模系統有兩個版本:AppSec版和雲版。在提供了用戶應用或系統的功能性信息後,ThreatModeler會基於更新的威脅情報自動就整個攻擊界面進行數據分析和潛在威脅識別。
3. OWASP Threat Dragon
(https://www.owasp.org/index.php/OWASP_Threat_Dragon)
一款基於Web的開源工具,提供系統圖解和用於自動化威脅建模與緩解的規則引擎。Threat Dragon 承諾可與其他軟體開發生命周期(SDLC)工具無縫集成,且界面易於使用。
在開發過程中測試應用以找出潛在漏洞是DevSecOps的關鍵部分,能夠事先發現安全漏洞,避免漏洞被黑客利用。盡管其他工具往往包含了測試功能,比如Parasoft出品的那些,下列工具仍然在應用安全測試上表現強勁。
1. BDD-Security
(https://continuumsecurity.net/bdd-security/)
該出自 Continuum Security 的開源框架可使安全人員在敏捷開發過程中測試行為驅動開發(BDD)語言編寫的功能及非功能性安全場景。此BDD框架旨在使安全功能獨立於應用特定的導航邏輯,讓同樣的安全要求能夠更容易地應用到多個應用程序上。
2. Checkmarx CxSAST
(https://www.checkmarx.com/procts/static-application-security-testing/)
可對25種編程及腳本語言進行未編譯/未構建源代碼掃描的靜態應用安全測試(SAST)工具,能在SDLC早期發現成百上千種安全漏洞。CxSAST兼容所有集成開發環境(IDE),是Checkmarx軟體暴露平台的一部分——該平台可在DevOps所有階段植入安全。Checkmarx的互動式應用安全測試(IAST)工具可檢測運行中應用的安全漏洞。
3. Chef InSpec
(https://github.com/inspec/inspec)
整個開發過程中的每一階段都可以運用該開源工具自動化安全測試以確保針對傳統伺服器及容器和雲API的合規、安全及其他政策要求。
4. Fortify
(https://www.microfocus.com/en-us/solutions/application-security)
Micro Focus 出品,提供端到端應用安全,可供進行覆蓋整個軟體開發生命周期的現場及按需測試。Fortify on Demand 是 Micro Focus 的應用安全即服務產品,提供靜態、動態和移動應用安全測試,以及生產環境中Web應用的持續監視。
5. Gauntlt
(http://gauntlt.org/)
流行測試框架,旨在推動易操作的安全測試及安全、開發和運營團隊間的溝通。GauntIt便於產生攻擊測試用例,且能方便地鉤入現有工具及進程。
6. Synopsys suite
(https://www.synopsys.com/)
Synopsys提供多個應用安全測試工具,包括:
1)SAST工具Coverity
(https://www.synopsys.com/software-integrity/security-testing/static-analysis-sast.html)
自動化測試且融入持續集成/持續交付(CI/CD)管道;
2)SCA工具 Black Duck
(https://www.synopsys.com/software-integrity/security-testing/software-composition-analysis.html)
採用容器及應用中的開源和第三方代碼檢測並管理安全;
3)SeekerIAST
(https://www.synopsys.com/software-integrity/security-testing/interactive-application-security-testing.html)
識別可暴露敏感數據的運行時安全漏洞;
以及一系列用於應用安全測試的託管服務。
以下DevSecOps工具同樣含有上述工具提供的功能,但或多或少略有不同。
1. Aqua Security
(https://www.aquasec.com/)
在整個CI/CD管道和運行時環境中管理端到端安全,可用於所有平台和雲環境的容器及雲原生應用。
2. Dome9 Arc
(https://www.checkpoint.com/solutions/devops-security/)
被 Check Point 收購,提供自動化測試及安全實施,使開發人員能夠將安全及合規融入公共雲應用的構建、部署及運營。
3. GitLab
(https://about.gitlab.com/)
該工具可將DevSecOps架構融入CI/CD過程,在提交時測試每一塊代碼,使開發人員能夠在編程期間緩解安全漏洞,並提供涵蓋所有漏洞的儀錶板。
4. Red Hat OpenShift
(https://www.redhat.com/en/technologies/cloud-computing/openshift)
為基於容器的應用提供內置安全,比如基於角色的訪問控制、以安全增強的Linux(SELinux)實現隔離,以及貫穿整個容器構建過程的核查。
5. RedLock
(https://www.paloaltonetworks.com/procts/secure-the-cloud/redlock/cloud-security-governance)(前身為Evident.io)
Palo Alto Networks 出品,適用於部署階段,幫助開發人員快速發現並緩解資源配置、網路架構及用戶活動中的安全威脅,尤其是在亞馬遜S3存儲桶和彈性塊存儲(EBS)卷上。
6. SD Elements
(https://www.securitycompass.com/sdelements/)
出品自 Security Compass 的自動化平台,旨在收集客戶軟體信息,發現威脅及對策,突出相關安全控制措施以幫助公司企業實現其安全和合規目標。
7. WhiteHat Sentinel 應用安全平台
(https://www.whitehatsec.com/procts/solutions/devsecops/)
該解決方案提供貫穿整個SDLC的應用安全,適用於需將安全集成進工具中的敏捷開發團隊,以及需持續測試以保證生產環境應用安全的安全團隊。
8. WhiteSource
(https://www.whitesourcesoftware.com/)
用於解決開源漏洞,可集成進用戶的生成過程,無論用戶採用什麼編程語言、生成工具或開發環境。WhiteSource使用經常更新的開源代碼資料庫持續檢查開源組件的安全及授權。
『叄』 GitHub上面有哪些經典的java框架源碼
Bazel:來自Google的構建工具,可以快速、可靠地構建代碼。官網
Gradle:使用Groovy(非XML)進行增量構建,可以很好地與Maven依賴管理配合工作。官網
Buck:Facebook構建工具。官網
ASM:通用底層位元組碼操作和分析開發庫。官網
Byte Buddy:使用流式API進一步簡化位元組碼生成。官網
Byteman:在運行時通過DSL(規則)操作位元組碼進行測試和故障排除。官網
Javassist:一個簡化位元組碼編輯嘗試。官網
Apache Aurora:Apache Aurora是一個Mesos框架,用於長時間運行服務和定時任務(cron job)。官網
Singularity:Singularity是一個Mesos框架,方便部署和操作。它支持Web Service、後台運行、調度作業和一次性任務。官網
Checkstyle:代碼編寫規范和標准靜態分析工具。官網
Error Prone:將常見編程錯誤作為運行時錯誤報告。官網
FindBugs:通過位元組碼靜態分析查找隱藏bug。官網
jQAssistant:使用基於Neo4J查詢語言進行代碼靜態分析。官網
PMD:對源代碼分析查找不良的編程習慣。官網
SonarQube:通過插件集成其它分析組件,對過去一段時間內的數據進行統計。官網
ANTLR:復雜的全功能自頂向下解析框架。官網
JavaCC:JavaCC是更加專門的輕量級工具,易於上手且支持語法超前預測。官網
config:針對JVM語言的配置庫。官網
owner:減少冗餘配置屬性。官網
Choco:可直接使用的約束滿足問題求解程序,使用了約束規劃技術。官網
JaCoP:為FlatZinc語言提供了一個介面,可以執行MiniZinc模型。官網
OptaPlanner:企業規劃與資源調度優化求解程序。官網
Sat4J:邏輯代數與優化問題最先進的求解程序。官網
Bamboo:Atlassian解決方案,可以很好地集成Atlassian的其他產品。可以選擇開源許可,也可以購買商業版。官網
CircleCI:提供託管服務,可以免費試用。官網
Codeship:提供託管服務,提供有限的免費模式。官網
fabric8:容器集成平台。官網
Go:ThoughtWork開源解決方案。官網
Jenkins:支持基於伺服器的部署服務。官網
TeamCity:JetBrain的持續集成解決方案,有免費版。官網
Travis:通常用作開源項目的託管服務。官網
Buildkite: 持續集成工具,用簡單的腳本就能設置pipeline,而且能快速構建,可以免費試用。官網
uniVocity-parsers:速度最快功能最全的CSV開發庫之一,同時支持TSV與固定寬度記錄的讀寫。官網
Apache Phoenix:HBase針對低延時應用程序的高性能關系資料庫層。官網
Crate:實現了數據同步、分片、縮放、復制的分布式數據存儲。除此之外還可以使用基於SQL的語法跨集群查詢。官網
Flyway:簡單的資料庫遷移工具。官網
H2:小型SQL資料庫,以可以作為內存資料庫使用著稱。官網
HikariCP:高性能JDBC連接工具。官網
JDBI:便捷的JDBC抽象。官網
Protobuf:Google數據交換格式。官網
SBE:簡單二進制編碼,是最快速的消息格式之一。官網
Wire:整潔輕量級協議緩存。官網
Apache DeltaSpike:CDI擴展框架。官網
Dagger2:編譯時注入框架,不需要使用反射。官網
Guice:可以匹敵Dagger的輕量級注入框架。官網
HK2:輕量級動態依賴注入框架。官網
ADT4J:針對代數數據類型的JSR-269代碼生成器。官網
AspectJ:面向切面編程(AOP)的無縫擴展。官網
Auto:源代碼生成器集合。官網
DCEVM:通過修改JVM在運行時支持對已載入的類進行無限次重定義。官網
HotswapAgent:支持無限次重定義運行時類與資源。官網
Immutables:類似Scala的條件類。官網
JHipster:基於Spring Boot與AngularJS應用程序的Yeoman源代碼生成器。官網
JRebel:無需重新部署,可以即時重新載入代碼與配置的商業軟體。官網
Lombok:減少冗餘的代碼生成器。官網
Spring Loaded:類重載代理。官網
vert.x:多語言事件驅動應用框架。官網
Akka:用來編寫分布式容錯並發事件驅動應用程序的工具和運行時。官網
Apache Storm:實時計算系統。官網
Apache ZooKeeper:針對大型分布式系統的協調服務,支持分布式配置、同步和名稱注冊。官網
Hazelcast:高可擴展內存數據網格。官網
Hystrix:提供延遲和容錯。官網
JGroups:提供可靠的消息傳遞和集群創建的工具。官網
Orbit:支持虛擬角色(Actor),在傳統角色的基礎上增加了另外一層抽象。官網
Quasar:為JVM提供輕量級線程和角色。官網
Apache Cassandra:列式資料庫,可用性高且沒有單點故障。官網
Apache HBase:針對大數據的Hadoop資料庫。官網
Druid:實時和歷史OLAP數據存儲,在聚集查詢和近似查詢方面表現不俗。官網
Infinispan:針對緩存的高並發鍵值對數據存儲。官網
Bintray:發布二進制文件版本控制工具。可以於Maven或Gradle一起配合使用。提供開源免費版本和幾種商業收費版本。官網
Central Repository:最大的二進制組件倉庫,面向開源社區提供免費服務。Apache Maven默認使用Central官網Repository,也可以在所有其他構建工具中使用。
IzPack:為跨平台部署建立創作工具(Authoring Tool)。官網
JitPack:打包GitHub倉庫的便捷工具。可根據需要構建Maven、Gradle項目,發布可立即使用的組件。官網
Launch4j:將JAR包裝為輕量級本機Windows可執行程序。官網
Nexus:支持代理和緩存功能的二進制管理工具。官網
packr:將JAR、資源和JVM打包成Windows、Linux和Mac OS X本地發布文件。官網
Apache POI:支持OOXML規范(XLSX、DOCX、PPTX)以及OLE2規范(XLS、DOC、PPT)。官網
documents4j:使用第三方轉換器進行文檔格式轉換,轉成類似MS Word這樣的格式。官網
jOpenDocument:處理OpenDocument格式(由Sun公司提出基於XML的文檔格式)。官網
Cyclops:支持一元(Monad)操作和流操作工具類、comprehension(List語法)、模式匹配、trampoline等特性。官網
Fugue:Guava的函數式編程擴展。官網
Functional Java:實現了多種基礎和高級編程抽象,用來輔助面向組合開發(composition-oriented development)。官網
Javaslang:一個函數式組件庫,提供持久化數據類型和函數式控制結構。官網
jOOλ:旨在填補Java 8 lambda差距的擴展,提供了眾多缺失的類型和一組豐富的順序流API。官網
jMonkeyEngine:現代3D游戲開發引擎。官網
libGDX:全面的跨平台高級框架。官網
LWJGL:對OpenGL/CL/AL等技術進行抽象的健壯框架。官網
JavaFX:Swing的後繼者。官網
Scene Builder:開發JavaFX應用的可視化布局工具。官網
Agrona:高性能應用中常見的數據結構和工具方法。官網
Disruptor:線程間消息傳遞開發庫。官網
fastutil:快速緊湊的特定類型集合(Collection)。官網
GS Collections:受Smalltalk啟發的集合框架。官網
HPPC:基礎類型集合。官網
Javolution:實時和嵌入式系統的開發庫。官網
JCTools:JDK中缺失的並發工具。官網
Koloboke:Hash set和hash map。官網
Trove:基礎類型集合。官網
High-scale-bli:Cliff Click 個人開發的高性能並發庫官網
Eclipse:老牌開源項目,支持多種插件和編程語言。官網
IntelliJ IDEA:支持眾多JVM語言,是安卓開發者好的選擇。商業版主要針對企業客戶。官網
NetBeans:為多種技術提供集成化支持,包括Java SE、Java EE、資料庫訪問、HTML5
Imgscalr:純Java 2D實現,簡單、高效、支持硬體加速的圖像縮放開發庫。官網
Picasso:安卓圖片下載和圖片緩存開發庫。官網
Thumbnailator:Thumbnailator是一個高質量Java縮略圖開發庫。官網
ZXing:支持多種格式的一維、二維條形碼圖片處理開發庫。官網
im4java: 基於ImageMagick或GraphicsMagick命令行的圖片處理開發庫,基本上ImageMagick能夠支持的圖片格式和處理方式都能夠處理。官網
Apache Batik:在Java應用中程序以SVG格式顯示、生成及處理圖像的工具集,包括SVG解析器、SVG生成器、SVG DOM等模塊,可以集成使用也可以單獨使用,還可以擴展自定義的SVG標簽。官網
Genson:強大且易於使用的Java到JSON轉換開發庫。官網
Gson:谷歌官方推出的JSON處理庫,支持在對象與JSON之間雙向序列化,性能良好且可以實時調用。官網
Jackson:與GSON類似,在頻繁使用時性能更佳。官網
LoganSquare:基於Jackson流式API,提供對JSON解析和序列化。比GSON與Jackson組合方式效果更好。官網
Fastjson:一個Java語言編寫的高性能功能完善的JSON庫。官網
Kyro:快速、高效、自動化的Java對象序列化和克隆庫。官網
JDK 9:JDK 9的早期訪問版本。官網
OpenJDK:JDK開源實現。官網
Scala:融合了面向對象和函數式編程思想的靜態類型編程語言。官網
Groovy:類型可選(Optionally typed)的動態語言,支持靜態類型和靜態編譯。目前是一個Apache孵化器項目。官網
Clojure:可看做現代版Lisp的動態類型語言。官網
Ceylon:RedHat開發的面向對象靜態類型編程語言。官網
Kotlin:JetBrain針對JVM、安卓和瀏覽器提供的靜態類型編程語言。官網
Xtend:一種靜態編程語言,能夠將其代碼轉換為簡潔高效的Java代碼,並基於JVM運行。官網
Apache Log4j 2:使用強大的插件和配置架構進行完全重寫。官網
kibana:分析及可視化日誌文件。官網
Logback:強健的日期開發庫,通過Groovy提供很多有趣的選項。官網
logstash:日誌文件管理工具。官網
Metrics:通過JMX或HTTP發布參數,並且支持存儲到資料庫。官網
SLF4J:日誌抽象層,需要與具體的實現配合使用。官網
Apache Flink:快速、可靠的大規模數據處理引擎。官網
Apache Hadoop:在商用硬體集群上用來進行大規模數據存儲的開源軟體框架。官網
Apache Mahout:專注協同過濾、聚類和分類的可擴展演算法。官網
Apache Spark:開源數據分析集群計算框架。官網
DeepDive:從非結構化數據建立結構化信息並集成到已有資料庫的工具。官網
Deeplearning4j:分布式多線程深度學習開發庫。官網
H2O:用作大數據統計的分析引擎。官網
Weka:用作數據挖掘的演算法集合,包括從預處理到可視化的各個層次。官網
QuickML:高效機器學習庫。官網、GitHub
Aeron:高效可擴展的單播、多播消息傳遞工具。官網
Apache ActiveMQ:實現JMS的開源消息代理(broker),可將同步通訊轉為非同步通訊。官網
Apache Camel:通過企業級整合模式(Enterprise Integration Pattern EIP)將不同的消息傳輸API整合在一起。官網
Apache Kafka:高吞吐量分布式消息系統。官網
Hermes:快速、可靠的消息代理(Broker),基於Kafka構建。官網
JBoss HornetQ:清晰、准確、模塊化,可以方便嵌入的消息工具。官網
JeroMQ:ZeroMQ的純Java實現。官網
Smack:跨平台XMPP客戶端函數庫。官網
Openfire:是開源的、基於XMPP、採用Java編程語言開發的實時協作伺服器。 Openfire安裝和使用都非常簡單,並可利用Web界面進行管理。官網GitHub
Spark:是一個開源,跨平台IM客戶端。它的特性支持集組聊天,電話集成和強大安全性能。如果企業內部部署IM使用Openfire+Spark是最佳的組合。官網GitHub
Tigase: 是一個輕量級的可伸縮的 Jabber/XMPP 伺服器。無需其他第三方庫支持,可以處理非常高的復雜和大量的用戶數,可以根據需要進行水平擴展。官網
Design Patterns:實現並解釋了最常見的設計模式。官網
Jimfs:內存文件系統。官網
Lanterna:類似curses的簡單console文本GUI函數庫。官網
LightAdmin:可插入式CRUD UI函數庫,可用來快速應用開發。官網
OpenRefine:用來處理混亂數據的工具,包括清理、轉換、使用Web Service進行擴展並將其關聯到資料庫。官網
RoboVM:Java編寫原生iOS應用。官網
Quartz:強大的任務調度庫.官網
AppDynamics:性能監測商業工具。官網
JavaMelody:性能監測和分析工具。官網
Kamon:Kamon用來監測在JVM上運行的應用程序。官網
New Relic:性能監測商業工具。官網
SPM:支持對JVM應用程序進行分布式事務追蹤的性能監測商業工具。官網
Takipi:產品運行時錯誤監測及調試商業工具。官網
JNA:不使用JNI就可以使用原生開發庫。此外,還為常見系統函數提供了介面。官網
Apache OpenNLP:處理類似分詞等常見任務的工具。官網
CoreNLP:斯坦佛CoreNLP提供了一組基礎工具,可以處理類似標簽、實體名識別和情感分析這樣的任務。官網
LingPipe:一組可以處理各種任務的工具集,支持POS標簽、情感分析等。官網
Mallet:統計學自然語言處理、文檔分類、聚類、主題建模等。官網
Async Http Client:非同步HTTP和WebSocket客戶端函數庫。官網
Grizzly:NIO框架,在Glassfish中作為網路層使用。官網
Netty:構建高性能網路應用程序開發框架。官網
OkHttp:一個Android和Java應用的HTTP+SPDY客戶端。官網
Undertow:基於NIO實現了阻塞和非阻塞API的Web伺服器,在WildFly中作為網路層使用。官網
Ebean:支持快速數據訪問和編碼的ORM框架。官網
EclipseLink:支持許多持久化標准,JPA、JAXB、JCA和SDO。官網
Hibernate:廣泛使用、強健的持久化框架。Hibernate的技術社區非常活躍。官網
MyBatis:帶有存儲過程或者SQL語句的耦合對象(Couples object)。官網
OrmLite:輕量級開發包,免除了其它ORM產品中的復雜性和開銷。官網
Nutz:另一個SSH。官網,Github
JFinal:JAVA WEB + ORM框架。官網,Github
Apache FOP:從XSL-FO創建PDF。官網
Apache PDFBox:用來創建和操作PDF的工具集。官網
DynamicReports:JasperReports的精簡版。官網
flyingsaucer:XML/XHTML和CSS 2.1渲染器。官網
iText:一個易於使用的PDF函數庫,用來編程創建PDF文件。注意,用於商業用途時需要許可證。官網
JasperReports:一個復雜的報表引擎。官網
jHiccup:提供平台中JVM暫停的日誌和記錄。官網
JMH:JVM基準測試工具。官網
JProfiler:商業分析器。官網
LatencyUtils:測量和報告延遲的工具。官網
VisualVM:對運行中的應用程序信息提供了可視化界面。官網
YourKit Java Profiler:商業分析器。官網
Reactive Streams:非同步流處理標准,支持非阻塞式反向壓力(backpressure)。官網
Reactor:構建響應式快速數據(fast-data)應用程序的開發庫。官網
RxJava:通過JVM可觀察序列(observable sequence)構建非同步和基於事件的程序。官網
Dropwizard:偏向於自己使用的Web框架。用來構建Web應用程序,使用了Jetty、Jackson、Jersey和Metrics。官網
Feign:受Retrofit、JAXRS-2.0和WebSocket啟發的HTTP客戶端連接器(binder)。官網
Jersey:JAX-RS參考實現。官網
RESTEasy:經過JAX-RS規范完全認證的可移植實現。官網
RestExpress:一個Java類型安全的REST客戶端。官網
RestX:基於註解處理和編譯時源碼生成的框架。官網
Retrofit:類型安全的REST客戶端。官網
Spark:受到Sinatra啟發的Java REST框架。官網
Swagger:Swagger是一個規范且完整的框架,提供描述、生產、消費和可視化RESTful Web Service。官網
Blade:國人開發的一個輕量級的MVC框架. 它擁有簡潔的代碼,優雅的設計。官網
DataMelt:用於科學計算、數據分析及數據可視化的開發環境。官網
JGraphT:支持數學圖論對象和演算法的圖形庫。官網
JScience:用來進行科學測量和單位的一組類。官網
Apache Solr:一個完全的企業搜索引擎。為高吞吐量通信進行了優化。官網
Elasticsearch:一個分布式、支持多租戶(multitenant)全文本搜索引擎。提供了RESTful Web介面和無schema的JSON文檔。官網
Apache Lucene:是一個開放源代碼的全文檢索引擎工具包,是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文本分析引擎。官網
Apache Shiro:執行認證、授權、加密和會話管理。官網
Bouncy Castle,涵蓋了從基礎的幫助函數到PGP/SMIME操作。官網:多途加密開發庫。支持JCA提供者(JCA provider)
Cryptomator:在雲上進行客戶端跨平台透明加密。官網
Keycloak:為瀏覽器應用和RESTful Web Service集成SSO和IDM。目前還處於beta版本,但是看起來非常有前途。官網
PicketLink:PicketLink是一個針對Java應用進行安全和身份認證管理的大型項目(Umbrella Project)。官網
FlatBuffers:高效利用內存的序列化函數庫,無需解包和解析即可高效訪問序列化數據。官網
Kryo:快速、高效的對象圖形序列化框架。官網
FST:提供兼容JDK的高性能對象圖形序列化。官網
MessagePack:一種高效的二進制序列化格式。官網
Apache Tomcat:針對Servlet和JSP的應用伺服器,健壯性好且適用性強。官網
Apache TomEE:Tomcat加Java EE。官網
Jetty:輕量級、小巧的應用伺服器,通常會嵌入到項目中。官網
WebSphere Liberty:輕量級、模塊化應用伺服器,由IBM開發。官網
WildFly:之前被稱作JBoss,由Red Hat開發。支持很多Java EE功能。官網
Apache Velocity:提供HTML頁面模板、email模板和通用開源代碼生成器模板。官網
FreeMarker:通用模板引擎,不需要任何重量級或自己使用的依賴關系。官網
Handlebars.java:使用Java編寫的模板引擎,邏輯簡單,支持語義擴展(semantic Mustache)。官網
Thymeleaf:旨在替換JSP,支持XML文件的工具。官網
Apache JMeter:功能性測試和性能評測。官網
Arquillian:集成測試和功能行測試平台,集成Java EE容器。官網
AssertJ:支持流式斷言提高測試的可讀性。官網
Awaitility:用來同步非同步操作的DSL。官網
Cucumber:BDD測試框架。官網
Gatling:設計為易於使用、可維護的和高性能負載測試工具。官網
Hamcrest:可用來靈活創建意圖(intent)表達式的匹配器。官網
JMockit:用來模擬靜態、final方法等。官網
JUnit:通用測試框架。官網
Mockito:在自動化單元測試中創建測試對象,為TDD或BDD提供支持。官網
PowerMock: 支持模擬靜態方法、構造函數、final類和方法、私有方法以及移除靜態初始化器的模擬工具。官網
REST Assured:為REST/HTTP服務提供方便測試的Java DSL。官網
Selenide:為Selenium提供精準的周邊API,用來編寫穩定且可讀的UI測試。官網
Selenium:為Web應用程序提供可移植軟體測試框架。官網
Spock:JUnit-compatible framework featuring an expressive Groovy-derived specification language.官網兼容JUnit框架,支持衍生的Groovy范的語言。
TestNG:測試框架。官網
Truth:Google的斷言和命題(proposition)框架。官網
Unitils:模塊化測試函數庫,支持單元測試和集成測試。官網
WireMock:Web Service測試樁(Stub)和模擬函數。官網
Apache Commons:提供各種用途的函數,比如配置、驗證、集合、文件上傳或XML處理等。官網
args4j:命令行參數解析器。官網
CRaSH:為運行進行提供CLI。官網
Gephi:可視化跨平台網路圖形化操作程序。官網
Guava:集合、緩存、支持基本類型、並發函數庫、通用註解、字元串處理、I/O等。官網
JADE:構建、調試多租戶系統的框架和環境。官網
javatuples:正如名字表示的那樣,提供tuple支持。盡管目前tuple的概念還有留有爭議。官網
JCommander:命令行參數解析器。官網
Protégé:提供存在論(ontology)編輯器以及構建知識系統的框架。官網
Apache Nutch:可用於生產環境的高度可擴展、可伸縮的網路爬蟲。官網
Crawler4j:簡單的輕量級網路爬蟲。官網
JSoup:刮取、解析、操作和清理HTML。官網
Apache Tapestry:基於組件的框架,使用Java創建動態、強健的、高度可擴展的Web應用程序。官網
Apache Wicket:基於組件的Web應用框架,與Tapestry類似帶有狀態顯示GUI。官網
Google Web Toolkit:一組Web開發工具集,包含在客戶端將Java代碼轉為JavaScript的編譯器、XML解析器、RCP官網API、JUnit集成、國際化支持和GUI控制項。
Grails:Groovy框架,旨在提供一個高效開發環境,使用約定而非配置、沒有XML並支持混入(mixin)。官網
Ninja:Java全棧Web開發框架。非常穩固、快速和高效。官網
Pippo:小型、高度模塊化的類Sinatra框架。官網
Play:使用約定而非配置,支持代碼熱載入並在瀏覽器中顯示錯誤。官網
PrimeFaces:JSF框架,提供免費和帶支持的商業版本。包括若干前端組件。官網
Ratpack:一組Java開發函數庫,用於構建快速、高效、可擴展且測試完備的HTTP應用程序。官網
Spring Boot:微框架,簡化了Spring新程序的開發過程。官網
Spring:旨在簡化Java EE的開發過程,提供依賴注入相關組件並支持面向切面編程。官網
Vaadin:基於GWT構建的事件驅動框架。使用服務端架構,客戶端使用Ajax。官網
Blade:國人開發的一個輕量級的MVC框架. 它擁有簡潔的代碼,優雅的設計。官網
jBPM:非常靈活的業務流程管理框架,致力於構建開發與業務分析人員之間的橋梁。官網
Activity:輕量級工作流和業務流程管理框架。官網github
位元組碼操作
編程方式操作位元組碼的開發庫。
集群管理
在集群內動態管理應用程序的框架。
代碼分析
測量代碼指標和質量工具。
編譯器生成工具
用來創建解析器、解釋器或編譯器的框架。
外部配置工具
支持外部配置的開發庫。
約束滿足問題求解程序
幫助解決約束滿足問題的開發庫。
持續集成
CSV解析
簡化CSV數據讀寫的框架與開發庫
資料庫
簡化資料庫交互的相關工具。
幫實現依賴翻轉範式的開發庫。官網
開發流程增強工具
從最基本的層面增強開發流程。
分布式應用
用來編寫分布式容錯應用的開發庫和框架。
分布式資料庫
對應用程序而言,在分布式系統中的資料庫看起來就像是只有一個數據源。
發布
以本機格式發布應用程序的工具。
文檔處理工具
處理Office文檔的開發庫。
函數式編程
函數式編程支持庫。
游戲開發
游戲開發框架。
GUI
現代圖形化用戶界面開發庫。
高性能計算
涵蓋了從集合到特定開發庫的高性能計算相關工具。
IDE
簡化開發的集成開發環境。
JSON
簡化JSON處理的開發庫。
JVM與JDK
目前的JVM和JDK實現。
基於JVM的語言
除Java外,可以用來編寫JVM應用程序的編程語言。
日誌
記錄應用程序行為日誌的開發庫。
機器學習
提供具體統計演算法的工具。其演算法可從數據中學習。
消息傳遞
在客戶端之間進行消息傳遞,確保協議獨立性的工具。
雜項
未分類其它資源。
應用監控工具
監控生產環境中應用程序的工具。
原生開發庫
用來進行特定平台開發的原生開發庫。
自然語言處理
用來專門處理文本的函數庫。
網路
網路編程函數庫。
ORM
處理對象持久化的API。
用來幫助創建PDF文件的資源。
性能分析
性能分析、性能剖析及基準測試工具。
響應式開發庫
用來開發響應式應用程序的開發庫。
REST框架
用來創建RESTful 服務的框架。
科學計算與分析
用於科學計算和分析的函數庫。
搜索引擎
文檔索引引擎,用於搜索和分析。
安全
用於處理安全、認證、授權或會話管理的函數庫。
序列化
用來高效處理序列化的函數庫。
應用伺服器
用來部署應用程序的伺服器。
模板引擎
在模板中替換表達式的工具。
測試
測試內容從對象到介面,涵蓋性能測試和基準測試工具。
通用工具庫
通用工具類函數庫。
網路爬蟲
用於分析網站內容的函數庫。
Web框架
用於處理Web應用程序不同層次間通訊的框架。
業務流程管理套件
流程驅動的軟體系統構建。
資源
社區
『肆』 如何使用python爬取知乎數據並做簡單分析
一、使用的技術棧:
爬蟲:python27 +requests+json+bs4+time
分析工具: ELK套件
開發工具:pycharm
數據成果簡單的可視化分析
1.性別分布
0 綠色代表的是男性 ^ . ^
1 代表的是女性
-1 性別不確定
可見知乎的用戶男性頗多。
二、粉絲最多的top30
粉絲最多的前三十名:依次是張佳瑋、李開復、黃繼新等等,去知乎上查這些人,也差不多這個排名,說明爬取的數據具有一定的說服力。
三、寫文章最多的top30
四、爬蟲架構
爬蟲架構圖如下:
說明:
選擇一個活躍的用戶(比如李開復)的url作為入口url.並將已爬取的url存在set中。
抓取內容,並解析該用戶的關注的用戶的列表url,添加這些url到另一個set中,並用已爬取的url作為過濾。
解析該用戶的個人信息,並存取到本地磁碟。
logstash取實時的獲取本地磁碟的用戶數據,並給elsticsearchkibana和elasticsearch配合,將數據轉換成用戶友好的可視化圖形。
五、編碼
爬取一個url:
解析內容:
存本地文件:
代碼說明:
* 需要修改獲取requests請求頭的authorization。
* 需要修改你的文件存儲路徑。
源碼下載:點擊這里,記得star哦!https : // github . com/forezp/ZhihuSpiderMan六、如何獲取authorization
打開chorme,打開https : // www. hu .com/,
登陸,首頁隨便找個用戶,進入他的個人主頁,F12(或滑鼠右鍵,點檢查)七、可改進的地方
可增加線程池,提高爬蟲效率
存儲url的時候我才用的set(),並且採用緩存策略,最多隻存2000個url,防止內存不夠,其實可以存在redis中。
存儲爬取後的用戶我說採取的是本地文件的方式,更好的方式應該是存在mongodb中。
對爬取的用戶應該有一個信息的過濾,比如用戶的粉絲數需要大與100或者參與話題數大於10等才存儲。防止抓取了過多的僵屍用戶。
八、關於ELK套件
關於elk的套件安裝就不討論了,具體見官網就行了。網站:https : // www . elastic . co/另外logstash的配置文件如下:
從爬取的用戶數據可分析的地方很多,比如地域、學歷、年齡等等,我就不一一列舉了。另外,我覺得爬蟲是一件非常有意思的事情,在這個內容消費升級的年代,如何在廣闊的互聯網的數據海洋中挖掘有價值的數據,是一件值得思考和需不斷踐行的事情。
『伍』 PB級大規模Elasticsearch集群運維與調優實踐
某中型互聯網公司的游戲業務,使用了騰訊雲的Elasticsearch產品,採用ELK架構存儲業務日誌。因為游戲業務本身的日誌數據量非常大(寫入峰值在100w qps),在服務客戶的幾個月中,踩了不少坑,經過數次優化與調整,把客戶的ES集群調整的比較穩定,避免了在業務高峰時客戶集群的讀寫異常,並且降低了客戶的資金成本和使用成本。下面把服務客戶過程中遇到的典型問題進行梳理,總結經驗,避免再次踩坑。
解決方案架構師A: bellen, XX要上線一款新游戲沖卜,日誌存儲決定用ELK架構,他們決定在XX雲和我們之間二選一,我們首先去他們公司和他們交流一下,爭取拿下!
bellen: 好,隨時有空!
。。。
和架構師一起前往該公司,跟負責底層組件的運維部門的負責人進行溝通。
XX公司運維老大:不要講你們的PPT了,先告訴我你們能給我們帶來什麼!
bellen: 。。。呃,我們有很多優勢。。。比如靈活地擴容縮容集群,還可以一鍵平滑升級集群版本,並且提供有跨機房容災的集群從而實現高可用。。
XX公司運維老大:你說的這些別的廠商也有,我就問一個問題,我們現在要存儲一年的游戲日誌,不能刪除數據,每天就按10TB的數據量算,一年也得有個3PB多的數據,這么大的數量,都放在SSD雲盤上,我們的成本太高了,你們有什麼方案既能夠滿足我們存儲這么大數據量的需求,同時能夠降低我們的成本嗎?
bellen: 我們本身提供的有冷熱模式的集群,熱節點採用SSD雲硬碟,冷節點採用SATA盤,採用ES自帶的ILM索引生命周期管理功能定期把較老的索引從熱節點遷移到冷節點上,這樣從整體上可以降低成本。另外一方面,也可以定期把更老的索引通過snapshot快照備份到COS對象存儲野模中,然後刪除索引,這樣成本就更低了。
XX公司運維老大:存儲到COS就是冷存儲唄,我們需要查詢COS里的數據時,還得再把數據恢復到ES里?這樣不行,速度太慢了,業務等不了那麼長時間,我們的數據不能刪除,只能放在ES里!你們能不能給我們提供一個API, 讓老的索引數據雖然存儲在COS里,但是通過這個API依然可以查詢到數據,而不是先恢復到ES, 再進行查詢?
bellen: 。。。呃,這個可以做,但是需要時間。是否可以採用hadoop on COS的架構,把存量的老的索引數據通過工具導入到COS,通過hive去查詢,這樣成本會非常低,數據依然是隨時可查的。
XX公司運維老大:那不行,我們只想用成熟的ELK架構來做,再增加hadoop那一套東西,我們沒那頌判緩么多人力搞這個事!
bellen: 好吧,那可以先搞一個集群測試起來,看看性能怎麼樣。關於存量數據放在COS里但是也需要查詢的問題,我們可以先制定方案,盡快實施起來。
XX公司運維老大:行吧,我們現在按每天10TB數據量預估,先購買一個集群,能撐3個月的數據量就行,能給一個集群配置的建議嗎?
bellen: 目前支持單節點磁碟最大6TB, cpu和內存的話可以放到8核32G單節點,單節點跑2w qps寫入沒有問題,後面也可以進行縱向擴容和橫向擴容。
XX公司運維老大:好,我們先測試一下。
N 天後,架構師A直接在微信群里反饋:"bellen, 客戶反饋這邊的ES集群性能不行啊,使用logstash消費kafka中的日誌數據,跑了快一天了數據還沒追平,這是線上的集群,麻煩緊急看一下吧。。"
我一看,一臉懵, 什麼時候已經上線了啊,不是還在測試中嗎?
XX公司運維小B: 我們購買了8核32G*10節點的集群,單節點磁碟6TB, 索引設置的10分片1副本,現在使用logstash消費kafka中的數據,一直沒有追平,kafka中還有很多數據積壓,感覺是ES的寫入性能有問題。
隨後我立即查看了集群的監控數據,發現cpu和load都很高,jvm堆內存使用率平均都到了90%,節點jvm gc非常頻繁了,部分節點因為響應緩慢,不停的離線又上線。。
經過溝通,發現用戶的使用姿勢是filebeat+kafka+logstash+elasticsearch, 當前已經在kafka中存儲了有10天的日誌數據,啟動了20台logstash進行消費,logstash的batch size也調到了5000,性能瓶頸是在ES這一側。客戶8核32G*10節點的集群,理論上跑10w qps沒有問題,但是logstash消費積壓的數據往ES寫入的qps遠不止10w,所以是ES扛不住寫入壓力了,所以只能對ES集群進行擴容,為了加快存量數據的消費速度,先縱向擴容單節點的配置到32核64GB,之後再橫向增加節點,以保證ES集群能夠最大支持100w qps的寫入(這里需要注意的是,增加節點後索引的分片數量也需要調整)。
所以一般新客戶接入使用ES時,必須要事先評估好節點配置和集群規模,可以從以下幾個方面進行評估:
上述場景2遇到的問題是業務上線前沒有對集群配置和規模進行合理的評估,導致上線後ES集群負載就很高,通過合理的擴容處理,集群最終抗住了寫入壓力。但是又有新的問題出現了。
因為kafka積壓的數據比較多,客戶使用logstash消費kafka數據時,反饋有兩個問題:
經過分析客戶logstash的配置文件,發現問題出現的原因主要是:
分析後,對kafka和logstash進行了如下優化:
通過上述優化,最終使得logstash機器資源都被充分利用上,很快消費完堆積的kafka數據,待消費速度追平生成速度後,logstash消費kafka一直穩定運行,沒有出現積壓。
另外,客戶一開始使用的是5.6.4版本的logstash,版本較老,使用過程中出現因為單個消息體過長導致logstash拋異常後直接退出的問題:
通過把logstash升級至高版本6.8避免了這個問題(6.x版本的logstash修復了這個問題,避免了crash)。
客戶的游戲上線有一個月了,原先預估每天最多有10TB的數據量,實際則是在運營活動期間每天產生20TB的數據,原先6TB*60=360TB總量的數據盤使用率也達到了80%。針對這種情況,我們建議客戶使用冷熱分離的集群架構,在原先60個熱節點的基礎上,增加一批warm節點存儲冷數據,利用ILM(索引生命周期管理)功能定期遷移熱節點上的索引到warm節點上。
通過增加warm節點的方式,客戶的集群磁碟總量達到了780TB, 可以滿足最多三個月的存儲需求。但是客戶的需求還沒有滿足:
XX公司運維老大:給我們一個能存放一年數據的方案吧,總是通過加節點擴容磁碟的方式不是長久之計,我們得天天盯著這個集群,運維成本很高!並且一直加節點,ES會扛不住吧?
bellen: 可以嘗試使用我們新上線的支持本地盤的機型,熱節點最大支持7.2TB的本地SSD盤,warm節點最大支持48TB的本地SATA盤。一方面熱節點的性能相比雲盤提高了,另外warm節點可以支持更大的磁碟容量。單節點可以支持的磁碟容量增大了,節點數量就不用太多了,可以避免踩到因為節點數量太多而觸發的坑。
XX公司運維老大:現在用的是雲盤,能替換成本地盤嗎,怎麼替換?
bellen: 不能直接替換,需要在集群中新加入帶本地盤的節點,把數據從老的雲盤節點遷移到新的節點上,遷移完成後再剔除掉舊的節點,這樣可以保證服務不會中斷,讀寫都可以正常進行。
XX公司運維老大:好,可以實施,盡快搞起來!
雲盤切換為本地盤,是通過調用雲服務後台的API自動實施的。在實施之後,觸發了數據從舊節點遷移到新節點的流程,但是大約半個小時候,問題又出現了:
XX公司運維小B: bellen, 快看一下,ES的寫入快掉0了。
bellen: 。。。
通過查看集群監控,發現寫入qps直接由50w降到1w,寫入拒絕率猛增,通過查看集群日誌,發現是因為當前小時的索引沒有創建成功導致寫入失敗。
緊急情況下,執行了以下操作定位到了原因:
經過了這次擴容操作,總結了如下經驗:
在穩定運行了一陣後,集群又出問題了。。
XX公司運維小B: bellen, 昨晚凌晨1點鍾之後,集群就沒有寫入了,現在kafka里有大量的數據堆積,麻煩盡快看一下?
bellen: 。。。
通過cerebro查看集群,發現集群處於yellow狀態,然後發現集群有大量的錯誤日誌:
然後再進一步查看集群日誌,發現有"master not discovered yet..."之類的錯誤日誌,檢查三個master節點,發現有兩個master掛掉,只剩一個了,集群無法選主。
登陸到掛了了master節點機器上,發現保活程序無法啟動es進程,第一直覺是es進程oom了;此時也發現master節點磁碟使用率100%, 檢查了JVM堆內存快照文件目錄,發現有大量的快照文件,於是刪除了一部分文件,重啟es進程,進程正常啟動了;但是問題是堆內存使用率太高,gc非常頻繁,master節點響應非常慢,大量的創建索引的任務都超時,阻塞在任務隊列中,集群還是無法恢復正常。
看到集群master節點的配置是16核32GB內存,JVM實際只分配了16GB內存,此時只好通過對master節點原地增加內存到64GB(虛擬機,使用的騰訊雲CVM, 可以調整機器規格,需要重啟),master節點機器重啟之後,修改了es目錄jvm.options文件,調整了堆內存大小,重新啟動了es進程。
3個master節點都恢復正常了,但是分片還需要進行恢復,通過GET _cluster/health看到集群當前有超過10w個分片,而這些分片恢復還需要一段時間,通過調大"cluster.routing.allocation.node_concurrent_recoveries", 增大分片恢復的並發數量。實際上5w個主分片恢復的是比較快的了,但是副本分片的恢復就相對慢很多,因為部分副本分片需要從主分片上同步數據才能恢復。此時可以採取的方式是把部分舊的索引副本數量調為0, 讓大量副本分片恢復的任務盡快結束,保證新索引能夠正常創建,從而使得集群能夠正常寫入。
總結這次故障的根本原因是集群的索引和分片數量太多,集群元數據佔用了大量的堆內存,而master節點本身的JVM內存只有16GB(數據節點有32GB), master節點頻繁full gc導致master節點異常,從而最終導致整個集群異常。所以要解決這個問題,還是得從根本上解決集群的分片數量過多的問題。
目前日誌索引是按照小時創建,60分片1副本,每天有24*60*2=2880個分片,每個月就產生86400個分片,這么多的分片可能會帶來嚴重的問題。有以下幾種方式解決分片數量過多的問題:
和客戶溝通過後,客戶表示可以接受方式1和方式2,但是方式3和4不能接受,因為考慮到存在磁碟故障的可能性,必須保留一個副本來保證數據的可靠性;另外還必須保證所有數據都是隨時可查詢的,不能關閉。
在場景5中,雖然通過臨時給master節點增加內存,抗住了10w分片,但是不能從根本上解決問題。客戶的數據是計劃保留一年的,如果不進行優化,集群必然扛不住數十萬個分片。所以接下來需要著重解決集群整體分片數量過多的問題,在場景5的最後提到了,用戶可以接受開啟shrink以及降低索引創建粒度(經過調整後,每兩個小時創建一個索引),這在一定程度上減少了分片的數量,能夠使集群暫時穩定一陣。
輔助客戶在kibana上配置了如下的ILM策略:
在warm phase, 把創建時間超過360小時的索引從hot節點遷移到warm節點上,保持索引的副本數量為1,之所以使用360小時作為條件,而不是15天作為條件,是因為客戶的索引是按小時創建的,如果以15天作為遷移條件,則在每天凌晨都會同時觸發15天前的24個索引一共24*120=2880個分片同時開始遷移索引,容易引發場景4中介紹的由於遷移分片數量過多導致創建索引被阻塞的問題,所以以360小時作為條件,則在每個小時只會執行一個索引的遷移,這樣把24個索引的遷移任務打平,避免其它任務被阻塞的情況發生。
同時,也在warm phase階段,設置索引shrink,把索引的分片數縮成5個,因為老的索引已經不執行寫入了,所以也可以執行force merge, 強制把segment文件合並為1個,可以獲得更好的查詢性能。
另外,設置了ILM策略後,可以在索引模板里增加index.lifecycle.name配置,使得所有新創建的索引都可以和新添加的ILM策略關聯,從而使得ILM能夠正常運行。
客戶使用的ES版本是6.8.2, 在運行ILM的過程中, 也發現一些問題:
這是因為shrink操作需要新把索引完整的一份數據都遷移到一個節點上,然後在內存中構建新的分片元數據,把新的分片通過軟鏈接指向到幾個老的分片的數據,在ILM中執行shrink時,ILM會對索引進行如下配置:
問題是索引包含副本,而主分片和副本分片又不能在同一個節點上,所以會出現部分分片無法分配的情況(不是全部,只有一部分),這里應該是觸發了6.8版本的ILM的bug,需要查看源碼才能定位解決這個bug,目前還在研究中。當前的workaround是通過腳本定期掃描出現unassigned shards的索引,修改其settings:
優先保證分片先從hot節點遷移到warm節點,這樣後續的shrink才能順利執行(也可能執行失敗,因為60個分片都在一個節點上,可能會觸發rebalance, 導致分片遷移走,shrink的前置條件又不滿足,導致執行失敗)。要完全規避這個問題,還得在ILM策略中設置,滿足創建時間超過360個小時的索引,副本直接調整為0,但是客戶又不接受,沒辦法。
在場景5和6中,介紹了10w個分片會給集群帶來的影響和通過開啟shrink來降低分片數量,但是仍然有兩個需要重點解決的問題:
可以估算一下,按小時建索引,60分片1副本,一年的分片數為24*120*365=1051200個分片,執行shrink後分片數量24*10*350 + 24*120*15 = 127200(15天內的新索引為了保障寫入性能和數據可靠性,仍然保持60分片1副本,舊的索引shrink為5分片1副本), 仍然有超過10w個分片。結合集群一年總的存儲量和單個分片可以支持的數據量大小進行評估,我們期望集群總體的分片數量可以穩定為6w~8w,怎麼優化?
可以想到的方案是執行數據冷備份,把比較老的索引都冷備到其它的存儲介質上比如HDFS,S3,騰訊雲的COS對象存儲等,但是問題是這些冷備的數據如果也要查詢,需要先恢復到ES中才可查,恢復速度比較慢,客戶無法接受。由此也產生了新的想法,目前老的索引仍然是1副本,可以把老索引先進行冷備份,再把副本調為0,這樣做有以下幾點好處:
經過和客戶溝通,客戶接受了上述方案,計劃把老索引冷備到騰訊雲的對象存儲COS中,實施步驟為:
其中步驟1的實施可以通過腳本實現,本案例中採用騰訊雲SCF雲函數進行實施,方便快捷可監控。實施要點有:
在實施完步驟1之後,就可以批量把對索引進行過備份的索引副本數都調為0, 這樣一次性釋放了很多磁碟空間,並且顯著降低了集群整體的分片數量。
接下來實施步驟2,需要每天執行一次快照,多創建時間較久的索引進行備份,實施比較簡單,可以通過crontab定時執行腳本或者使用騰訊雲SCF執行。
步驟2實施之後,就可以修改ILM策略,開啟cold phase, 修改索引副本數量為0:
此處的timing是創建時間20天後,需要保證步驟2中對過去老索引數據備份先執行完成才可以進入到cold phase.
通過老索引數據冷備並且降低索引副本,我們可以把集群整體的分片數量維持在一個較低的水位,但是還有另外一個問題待解決,也即shrink失敗的問題。剛好,我們可以利用對老索引數據冷備並且降低索引副本的方案,來徹底解決shrink失敗的問題。
在場景5中有提到,shrink失敗歸根接地是因為索引的副本數量為1, 現在我們可以吧數據備份和降低副本提前,讓老索引進入到ILM的warm phase中時已經是0副本,之後再執行shrink操作就不會有問題了;同時,因為副本降低了,索引從hot節點遷移到warm節點遷移的數據量也減少了一半,從而降低了集群負載,一舉兩得。
因此,我們需要修改ILM策略,在warm phase就把索引的副本數量調整為0, 然後去除cold phase。
另外一個可選的優化項是,對老的索引進行凍結,凍結索引是指把索引常駐內存的一些數據從內存中清理掉(比如FST, 元數據等), 從而降低內存使用量,而在查詢已經凍結的索引時,會重新構建出臨時的索引數據結構存放在內存中,查詢完畢再清理掉;需要注意的是,默認情況下是無法查詢已經凍結的索引的,需要在查詢時顯式的增加"ignore_throttled=false"參數。
經過上述優化,我們最終解決了集群整體分片數量過多和shrink失敗的問題。在實施過程中引入了額外的定時任務腳本實施自動化快照,實際上在7.4版本的ES中,已經有這個功能了,特性名稱為 SLM (快照生命周期管理),並且可以結合ILM使用,在ILM中增加了"wait_for_snapshot"的ACTION, 但是卻只能在delete phase中使用,不滿足我們的場景。
在上述的場景4-7中,我們花費大量的精力去解決問題和優化使用方式,保證ES集群能夠穩定運行,支持PB級別的存儲。溯本回原,如果我們能有一個方案使得客戶只需要把熱數據放在SSD盤上,然後冷數據存儲到COS/S3上,但同時又使冷數據能夠支持按需隨時可查,那我們前面碰到的所有問題都迎刃而解了。可以想像得到的好處有:
而這正是目前es開源社區正在開發中的Searchable Snapshots功能,從 Searchable Snapshots API 的官方文檔上可以看到,我們可以創建一個索引,將其掛載到一個指定的快照中,這個新的索引是可查詢的,雖然查詢時間可能會慢點,但是在日誌場景中,對一些較老的索引進行查詢時,延遲大點一般都是可以接受的。
所以我認為,Searchable Snapshots解決了很多痛點,將會給ES帶了新的繁榮!
經歷過上述運維和優化ES集群的實踐,我們總結到的經驗有:
從一開始和客戶進行接觸,了解客戶訴求,逐步解決ES集群的問題,最終使得ES集群能夠保持穩定,這中間的經歷讓我真真正正的領悟到"實踐出真知",只有不斷實踐,才能對異常情況迅速做出反應,以及對客戶提的優化需求迅速反饋。