日誌存儲方式
❶ 如何實現日誌的集中化存儲
在我們的企業中有多種不同的設備,伺服器、交換機、防火牆以及路由器等等設備,而這些設備會產生大量的日誌。如果網路中出現故障時,如果一台一台的去查詢日誌,那工作量就太大了,而且不容易查詢。所以最好的辦法就是日誌集中收集存儲。
Windows系統有自帶的WMI服務,通過該服服務就可以遠程收集windows系統的日誌。網路設備的日誌通常是基於syslog日誌的轉發。通過這種技術將日誌統一的發送集中到一台伺服器上。在這台伺服器上使用工具接收發送過來的數據,將其保存為文本文件,集中的保存日誌。
卓豪EventLog Analyzer就是一個專門針對日誌管理的工具,可以對企業中各種設備日誌的統一收集存儲並分析。
❷ QT存儲日誌用資料庫還是txt文本
QT存儲日誌用資料庫還是txt文本是需要具體問題具體分析的,因為如果小量的寫資料庫沒事。如果是大量的,肯定寫文件好。匯總後寫程序導入資料庫。還有一種方法是寫redis等內存資料庫,並累積數量後觸發合並寫入資料庫操作。
並且如果這個日誌是需要定期分析的,寫在資料庫里更方便處理;反之只是留檔,就存文件里 但2種方式都要注意寫操作的頻率。
絕對不能產生一行寫一行,中間加一個內存隊列來過渡,比如memcache,有新日誌就加入隊列,然後做個定時器去批量寫入文件並清空隊列,同時也規避文件沖突了。
QT存儲中大端模式和小端模式是:
對於long long a 和 struct{ char a;short b;int c;}二者同樣占據了8個位元組的空間,在存儲上,後者則是先存儲一個char,空一個位元組,然後按照大端/小端模式存儲short,最後按照大端/小端模式存儲int。
在我們日常使用的x86架構的計算機中(其他類別的可能會採用大端模式或可配置模式,可以通過查閱資料或者用下文的代碼進行測試),都是使用的小端模式,而網路位元組序是大端模式的。
這就使得在網路通信時進行位元組序的轉換變得極為重要。比方說,通信雙方規定了了通信頭為一個4位元組的魔數(Magic Number),而一方按著大端序的模式發送。
一方按著小端序的模式解讀,那麼兩方的通信就會失敗。如果沒有這個魔數,而在內部的數據中出現這樣的問題則會更加的麻煩。
❸ Oracle的日誌文件存儲在什麼位置
1、通過sqlplus命令連接資料庫,查看伺服器是否已經開啟歸檔。
❹ 日誌文件的寫志數據如何存儲
日誌記錄方式可以提供我們足夠多定位問題的依據。對於一些復雜系統,例如資料庫,日誌可以承擔數據備份、同步作用,很多分布式資料庫都採用「write-ahead」方案,在節點數據同步時通過日誌文件恢復數據。
日誌文件是不推薦和資料庫存儲在同一個硬碟的,因為一旦硬碟壞了就會一起死掉。當然,如果已經使用了帶容錯的RAID,甚至是盤櫃之類的設備,那麼可以放在一起沒有太大問題。
如果先寫資料庫,後寫日誌,但是在剛好寫了資料庫而未寫日誌的時候崩潰了,那麼根據日誌恢復出來的資料庫就少了一條記錄
❺ 深入理解kafka(五)日誌存儲
5.1文件目錄布局
根目錄下有以下5個checkpoint文件: cleaner-offset-checkpoint, log-start-offset-checkpoint, meta.properties, recovery-point-offset-checkpoint, replication-offset-checkpoint
分區目錄下有以下目錄: 0000xxx.index(偏移量為64位長整形,長度固定為20位), 0000xxx.log, 0000xxx.timeindex.
還有可能包含.deleted .cleaned .swap等臨時文件, 以及可能的.snapshot .txnindex leader-epoch-checkpoint
5.2日誌格式演變
5.2.1 v0版本
kafka0.10.0之前
RECORD_OVERHEAD包括offset(8B)和message size(4B)
RECORD包括:
crc32(4B):crc32校驗值
magic(1B):消息版本號0
attributes(1B):消息屬性。低3位表示壓縮類型:0-NONE 1-GZIP 2-SNAPPY 3-LZ4(0.9.x引入)
key length(4B):表示消息的key的長度。-1代表null
key: 可選
value length(4B):實際消息體的長度。-1代表null
value: 消息體。可以為空,如墓碑消息
5.2.2 v1版本
kafka0.10.0-0.11.0
比v0多了timestamp(8B)欄位,表示消息的時間戳
attributes的第4位也被利用起來,0表示timestamp的類型為CreateTime,1表示timestamp的類型為LogAppendTime
timestamp類型由broker端參數log.message.timestamp.type來配置,默認為CreateTime,即採用生產者創建的時間戳
5.2.3 消息壓縮
保證端到端的壓縮,服務端配置compression.type,默認為"procer",表示保留生產者使用的壓縮方式,還可以配置為"gzip","snappy","lz4"
多條消息壓縮至value欄位,以提高壓縮率
5.2.4 變長欄位
變長整形(Varints):每一個位元組都有一個位於最高位的msb位(most significant bit),除了最後一個位元組為1,其餘都為0,位元組倒序排列
為了使編碼更加高效,Varints使用ZigZag編碼:sint32對應 (n<<1)^(n>>31) sint64對應 (n<<1)^(n>>63)
5.2.5 v2版本
Record Batch
first offset:
length:
partition leader epoch:
magic:固定為2
attributes:兩個位元組。低3位表示壓縮格式,第4位表示時間戳類型,第5位表示事務(0-非事務1-事務),第6位控制消息(0-非控制1控制)
first timestamp:
max timestamp:
procer id:
procer epoch:
first sequence:
records count:
v2版本的消息去掉了crc欄位,另外增加了length(消息總長度)、timestamp delta(時間戳增量)、offset delta(位移增量)和headers信息,並且棄用了attributes
Record
length:
attributes:棄用,但仍占據1B
timestamp delta:
offset delta:
headers:
5.3日誌索引
稀疏索引(sparse index):每當寫入一定量(broker端參數log.index.interval.bytes指定,默認為4096B),偏移量索引文件和時間索引文件分別對應一個索引項
日誌段切分策略:
1.大小超過broker端參數log.segment.bytes配置的值,默認為1073741824(1GB)
2.當前日誌段消息的最大時間戳與當前系統的時間戳差值大於log.roll.ms或者log.roll.hours,ms優先順序高,默認log.roll.hours=168(7天)
3.索引文件或者時間戳索引文件的大小大於log.index.size.max.bytes配置的值,默認為10485760(10MB)
4.偏移量差值(offset-baseOffset)>Integer.MAX_VALUE
5.3.1 偏移量索引
每個索引項佔用8個位元組,分為兩個部分:1.relativeOffset相對偏移量(4B) 2.position物理地址(4B)
使用kafka-mp-log.sh腳本來解析.index文件(包括.timeindex、.snapshot、.txnindex等文件),如下:
bin/kafka-mp-log.sh --files /tmp/kafka-logs/topicId-0/00……00.index
如果broker端參數log.index.size.max.bytes不是8的倍數,內部會自動轉換為8的倍數
5.3.2 時間戳索引
每個索引項佔用12個位元組,分為兩個部分:1.timestamp當前日誌分段的最大時間戳(12B) 2.relativeOffset時間戳對應的相對偏移量(4B)
如果broker端參數log.index.size.max.bytes不是12的倍數,內部會自動轉換為12的倍數
5.4日誌清理
日誌清理策略可以控制到主題級別
5.4.1 日誌刪除
broker端參數log.cleanup.policy設置為delete(默認為delete)
檢測周期broker端參數log.retention.check.interval.ms=300000(默認5分鍾)
1.基於時間
broker端參數log.retention.hours,log.retention.minutes,log.retention.ms,優先順序ms>minutes>hours
刪除時先增加.delete後綴,延遲刪除根據file.delete.delay.ms(默認60000)配置
2.基於日誌大小
日誌總大小為broker端參數log.retention.bytes(默認為-1,表示無窮大)
日誌段大小為broker端參數log.segment.bytes(默認為1073741824,1GB)
3.基於日誌起始偏移量
DeleteRecordRequest請求
1.KafkaAdminClient的deleteRecord()
2.kafka-delete-record.sh腳本
5.4.2 日誌壓縮
broker端參數log.cleanup.policy設置為compact,且log.cleaner.enable設置為true(默認為true)
5.5磁碟存儲
相關測試:一個由6塊7200r/min的RAID-5陣列組成的磁碟簇的線性寫入600MB/s,隨機寫入100KB/s,隨機內存寫入400MB/s,線性內存3.6GB/s
5.5.1 頁緩存
linux操作系統的vm.dirty_background_ratio參數用來指定臟頁數量達到系統的百分比之後就觸發pdflush/flush/kdmflush,一般小於10,不建議為0
vm.dirty_ratio表示臟頁百分比之後刷盤,但是阻塞新IO請求
kafka同樣提供同步刷盤及間斷性強制刷盤(fsync)功能,可以通過log.flush.interval.messages、log.flush.interval.ms等參數來控制
kafka不建議使用swap分區,vm.swappiness參數上限為100,下限為0,建議設置為1
5.5.2 磁碟I/O流程
一般磁碟IO的場景有以下4種:
1.用戶調用標准C庫進行IO操作,數據流為:應用程序Buffer->C庫標准IOBuffer->文件系統也緩存->通過具體文件系統到磁碟
2.用戶調用文件IO,數據流為:應用程序Buffer->文件系統也緩存->通過具體文件系統到磁碟
3.用戶打開文件時使用O_DIRECT,繞過頁緩存直接讀寫磁碟
4.用戶使用類似dd工具,並使用direct參數,繞過系統cache與文件系統直接讀寫磁碟
Linux系統中IO調度策略有4種:
1.NOOP:no operation
2.CFQ
3.DEADLINE
4.ANTICIPATORY
5.5.3 零拷貝
指數據直接從磁碟文件復制到網卡設備中,不需要經應用程序
對linux而言依賴於底層的sendfile()
對java而言,FileChannal.transferTo()的底層實現就是sendfile()