1.背景
良いソフトウェアは、特性を持っている必要があります:
1:ソフトウェアのユーザビリティ
例のOAシステムのために、ソフトウェアの誕生は大きな結合度、後のメンテナンスアップデートは、コスト、困難に従事したときにそれはMVCフレームワークから生まれているので、そのような今人気のMVCフレームワークではなく、MVCの早期開発などの特定の問題を、解決することです会社の問題解決と組み合わせることで、QQ、マイクロチャネル、リアルタイムのチャットは、リモート通信の人々の問題を解決するためなど。
2:ソフトウェアの安定性
ユーティリティ・ソフトウェア・ソリューションの質問の後、問題を解決するため緊急の必要性は、ソフトウェアの安定性です。ビジネスが正しく実行できるかどうかの一般的なオンラインシステムは、ビジネス、企業、システムの安定性に直接影響を運ぶでしょう。
3:コードの仕様
兵士の鉄の兵舎は、ちょうど良いソフトウェアの機能よりも多く実現しています。全体的なアーキテクチャ、機能ブロック、コードのコメント、スケーラビリティやその他の問題も考慮する必要があり、すべての後に、ソフトウェアのライフサイクルで、また、60の対象をあまりにも多く、創造的なスタッフを関与。したがって、それは立派な規範的なコードです。
4:上位互換性を維持するためにアップグレード
優れたソフトウェアは、通常使用されるが、アップグレードにも優れたソフトウェアを得るために、ますますアモルファス、または大幅にアップグレードした後の安定性を低減している場合。
5:基本マニュアル
ドキュメント、マニュアルのシンプルかつ効果的な使用は、プログラムの王です。ユーザーは、その上の機能、アーキテクチャ、デザインのアイデア、コード、およびをクリアすることができます。
2、分析を必要とします:
同社のビジネスの発展に伴い、凹部会社の通常業務への順に、より多くの今、これらのシステムの動作を監視するために緊急の必要性をビジネスシステムの様々なサポート、見つかった問題があっても、最大にすることビジネスへの影響を減らします。
現在の分類システムは、次のとおりです。
1)TomcatのベースのWebアプリケーションがあります。
2)独立したJavaアプリケーションアプリケーション
3)Linuxではスクリプトを実行しています
4)大規模なクラスタリング・フレームワークが存在する(飼育係、Hadoopの、嵐、SRP .....)
5)のログを実行しているオペレーティングシステム(トップ)
主な機能要件が分けられる:特定の規則に従って、コンテンツ監視システムログ濾過し、我々は、SMS、電子メールを介して、アラーム後の問題を発見しました。
3、機能解析:
データ入力:
ログデータ:使用水路クライアントは、各システムのデータを取得し、
ルールデータ:ページによって、ユーザー入力システム名/ CEOの出発ルール。
データストレージ:
カフカクラスタに収集され、保存された水路データを使用します
データの計算:
ログ上の使用の嵐のプログラミングは、データベースに保存された電子メールやSMSアラートにより、フィルタリングルールの情報を満たしています。
データショー:
ルールを設定した情報を表示するには、管理ページ。システムは、人、連絡先情報、トリガー情報やその他の詳細に責任があります
4、全体的なアーキテクチャの設計
メインのアプリケーションアーキテクチャ:水路+カフカ+嵐+ MySQLの+ Javaのウェブデータフローは次のとおりです。
1:アプリケーションログを生成するのlog4jを使用しています
2:展開は、生成された水路、クライアント監視アプリケーションのログを記録し、カフカのクラスタに送信されました
3:嵐はカフカ消費データ、あるフィルタリングルールずつ各ログのために決定され、警告メッセージのルールラインのログを引っ張る噴出しました。
4:保存、管理対象となるMySQLデータベースへの最後の警告メッセージ。
水路の設計
水路は、集計、ログデータの伝送を収集するために、安全な、利用可能なサービス、配布されています。
それは簡単で柔軟なデータフローアーキテクチャに基づいています。それは堅牢です。フォールトトレランス、フェイルオーバー、回復メカニズム。これは、オンライン解析プログラムを可能にする、シンプルでスケーラブルなデータベースモデルを提供しています
a1.sources = r1
a1.channels = c1
a1.sinks = k1
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /export/data/flume_source/click_log/info.log
a1.sources.r1.channels = c1
a1.sources.r1.interceptors = i1
a1.sources.r1.interceptors.i1.type = cn.itcast.flume.AppInterceptor$AppInterceptorBuilder
# 用来标识 日志所属系统
a1.sources.r1.interceptors.i1.appId = 1
a1.channels.c1.type=memory
a1.channels.c1.capacity=10000
a1.channels.c1.transactionCapacity=100
a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
a1.sinks.k1.topic = log_monitor
a1.sinks.k1.brokerList = HADOOP01:9092
a1.sinks.k1.requiredAcks = 1
a1.sinks.k1.batchSize = 20
a1.sinks.k1.channel = c1
迎撃機
package cn.itcast.flume;
import org.apache.commons.lang.StringUtils;
import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.interceptor.Interceptor;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
/**
* 1、实现一个InterceptorBuilder接口
* 2、InterceptorBuilder中有个configuref方法,通过configure获取配置文件中的相应key。
* 3、InterceptorBuilder中有个builder方法,通过builder创建一个自定义的MyAppInterceptor
* 4、AppInterceptor中有两个方法,一个是批处理,一个单条处理,将批处理的逻辑转换为单条处理
* 5、需要在单条数据中添加 appid,由于appid是变量。需要在AppInterceptor的构造器中传入一些参数。
* 6、为自定义的AppInterceptor创建有参构造器,将需要的参数传入进来。
*/
public class AppInterceptor implements Interceptor {
//4、定义成员变量appId,用来接收从配置文件中读取的信息
private String appId;
public AppInterceptor(String appId) {
this.appId = appId;
}
/**
* 单条数据进行处理
* @param event
* @return
*/
public Event intercept(Event event) {
String message = null;
try {
message = new String(event.getBody(), "utf-8");
} catch (UnsupportedEncodingException e) {
message = new String(event.getBody());
}
//处理逻辑
if (StringUtils.isNotBlank(message)) {
message = "aid:"+appId+"||msg:" +message;
event.setBody(message.getBytes());
//正常逻辑应该执行到这里
return event;
}
//如果执行以下代码,表示拦截失效了。
return event;
}
/**
* 批量数据数据进行处理
* @param list
* @return
*/
public List<Event> intercept(List<Event> list) {
List<Event> resultList = new ArrayList<Event>();
for (Event event : list) {
Event r = intercept(event);
if (r != null) {
resultList.add(r);
}
}
return resultList;
}
public void close() {
}
public void initialize() {
}
public static class AppInterceptorBuilder implements Interceptor.Builder{
//1、获取配置文件的appId
private String appId;
public Interceptor build() {
//3、构造拦截器
return new AppInterceptor(appId);
}
public void configure(Context context) {
//2、当出现default之后,就是点击流告警系统
this.appId = context.getString("appId","default");
System.out.println("appId:"+appId);
}
}
}
Kakfaデザイン
生産者、消費者機能:カフカは、分散メッセージキューです
フラグメントおよびコピー数が定義されています。
1)トピックall_app_logを作成
2)データスライスを指定し、そこ3T実際の対数スケール)を仮定コピー(指定された数は、10個の断片の3つのコピーを必要とします
3Tログデータ
秒あたりのデータの平均量:3T / 24H = 0.125T = 125G / 60 M = 20G / 60S = 20000M / 60S = 333M
データのピーク量:333M * 3
考えてみましょ活動のピーク:333M * 3 * 3
結論:3Gに必要な第2のプロセスデータ、理論量のカフカ値データが600メートル/ S、実際の翻訳300M / Sであります
3G / 300M = 10個のフラグメント
3)コピーの数を計算する方法
10よりブローカ番号より大きい、コピーの数だけである2
ブローカ数10未満、必要なコピー数は3
4)168時間データ格納部3 * 3Tのために記憶さカフカポリシーデータ* 7D = 63T
kafka-topics.sh --create --zookeeper hadoop01:2181 --replication-factor 3 --partitions 10 --topic all_app_log