Účtovanie za sieťové služby na základe ich využitia
Task ID | Status | Start Date | Due Date | Task |
LK.1 | Resolved | 01.03.2007 | 07.03.2007 | Preštudovať diplomovú prácu M. Potockého. |
LK.2 | Resolved | 07.03.2007 | 13.03.2007 | Dohodnuť sa s vedúcimi a kolegami na jednotnej forme TODO tabuľky. |
LK.3 | Resolved | 07.03.2007 | 11.03.2007 | Stretnúť sa s Mišom Kaščákom a rozdiskutovať problémy, na ktorých teraz pracuje. |
LK.4 | In Progress | 07.03.2007 | | Pokračovať v zorientovaní sa v problematike. |
LK.6 | Pending | 10.03.2007 | | Navrhnúť postup ako odfiltrovať nepodstatné záznamy o tokoch. |
LK.7 | Resolved | 10.03.2007 | 15.03.2007 | Získať zdrojové kódy plus prístup na QoS server |
LK.8 | Resolved | 19.03.2007 | | Nainštalovať PostgreSQL na qos-dev a vytvoriť databázu pre ukladanie záznamov |
Návrh databázy pre uskladnenie záznamov o tokoch
Úvod do problematiky
Nástroj
BasicMeter odchytáva rôzne parametre sieťovej prevádzky, formuje záznamy a tieto záznamy pre ďalšie spracovanie aj uchováva. Uchovávanie záznamov a hlavne spôsob ich uchovávania je jedným z kľúčových problémov celého nástroja.
Je potrebné navrhnúť taký konceptuálny dátový model,pre ktorý platí:
- dôsledne pojme všetky druhy informácií, ktoré sa môžu odchytiť.
- rýchlosť operácie vkladania musí byť uprednostnená pred ostatnými operáciami - záznamy o tokoch sa môžu exportovať veľmi rýchlo a preto databáza môže spomaľovať beh celého meracieho procesu
- rýchlosť vyhľadávania v záznamoch databázy sa musí minimalizovať - analyzér dát musí byť rýchly
Existuje veľa dátových modelov, ktoré sa dajú na daný problém aplikovať. Každý z týchto modelov však poskytuje iné výkonostné parametre.
Aktuálne riešenie problému
Daný problém je momentálne riešený
rozdelením ukladania jednotlivých typov informačných elementov do viacerých tabuliek.
Podľa
informačného modelu IPFIX sa informačné elementy rozdeľujú do skupín podľa ich významu a aplikovateľnosti. Súčasné rozdelenie pozostáva z 12 skupín:
- Identifiers
- Metering and Exporting Process Configuration
- Metering and Exporting Process Statistics
- IP Header Fields
- Transport Header Fields
- Sub-IP Header Fields
- Derived Packet Properties
- Min/Max Flow Properties
- Flow Time Stamps
- Per-Flow Counters
- Miscellaneous Flow Properties
- Padding
Každá z týchto skupín pozostáva z nasledujúcich informačných elementov:
1. Identifiers
+-----+---------------------------+-----+---------------------------+
| ID | Name | ID | Name |
+-----+---------------------------+-----+---------------------------+
| 141 | lineCardId | 148 | flowId |
| 142 | portId | 145 | templateId |
| 10 | ingressInterface | 149 | observationDomainId |
| 14 | egressInterface | 138 | observationPointId |
| 143 | meteringProcessId | 137 | commonPropertiesId |
| 144 | exportingProcessId | | |
+-----+---------------------------+-----+---------------------------+
2. Metering and Exporting Process Configuration
+-----+--------------------------+-----+----------------------------+
| ID | Name | ID | Name |
+-----+--------------------------+-----+----------------------------+
| 130 | exporterIPv4Address | 213 | collectorInterface |
| 131 | exporterIPv6Address | 214 | collectorProtocolVersion |
| 217 | exporterTransportPort | 215 | collectorTransportProtocol |
| 211 | collectorIPv4Address | 216 | collectorTransportPort |
| 212 | collectorIPv6Address | 173 | flowKeyIndicator |
+-----+--------------------------+-----+----------------------------+
3. Metering and Exporting Process Statistics
+-----+-----------------------------+-----+-------------------------+
| ID | Name | ID | Name |
+-----+-----------------------------+-----+-------------------------+
| 41 | exportedMessageTotalCount | 165 | ignoredOctetTotalCount |
| 40 | exportedOctetTotalCount | 166 | notSentFlowTotalCount |
| 42 | exportedFlowRecordTotalCount| 167 | notSentPacketTotalCount |
| 163 | observedFlowTotalCount | 168 | notSentOctetTotalCount |
| 164 | ignoredPacketTotalCount | | |
+-----+-----------------------------+-----+-------------------------+
4. IP Header Fields
+-----+----------------------------+-----+--------------------------+
| ID | Name | ID | Name |
+-----+----------------------------+-----+--------------------------+
| 60 | ipVersion | 193 | nextHeaderIPv6 |
| 8 | sourceIPv4Address | 195 | ipDiffServCodePoint |
| 27 | sourceIPv6Address | 196 | ipPrecedence |
| 9 | sourceIPv4PrefixLength | 5 | ipClassOfService |
| 29 | sourceIPv6PrefixLength | 55 | postIpClassOfService |
| 44 | sourceIPv4Prefix | 31 | flowLabelIPv6 |
| 170 | sourceIPv6Prefix | 206 | isMulticast |
| 12 | destinationIPv4Address | 54 | fragmentIdentification |
| 28 | destinationIPv6Address | 88 | fragmentOffset |
| 13 | destinationIPv4PrefixLength| 197 | fragmentFlags |
| 30 | destinationIPv6PrefixLength| 189 | ipHeaderLength |
| 45 | destinationIPv4Prefix | 207 | ipv4IHL |
| 169 | destinationIPv6Prefix | 190 | totalLengthIPv4 |
| 192 | ipTTL | 224 | ipTotalLength |
| 4 | protocolIdentifier | 191 | payloadLengthIPv6 |
+-----+----------------------------+-----+--------------------------+
5. Transport Header Fields
+-----+---------------------------+-----+---------------------------+
| ID | Name | ID | Name |
+-----+---------------------------+-----+---------------------------+
| 7 | sourceTransportPort | 238 | tcpWindowScale |
| 11 | destinationTransportPort | 187 | tcpUrgentPointer |
| 180 | udpSourcePort | 188 | tcpHeaderLength |
| 181 | udpDestinationPort | 32 | icmpTypeCodeIPv4 |
| 205 | udpMessageLength | 176 | icmpTypeIPv4 |
| 182 | tcpSourcePort | 177 | icmpCodeIPv4 |
| 183 | tcpDestinationPort | 139 | icmpTypeCodeIPv6 |
| 184 | tcpSequenceNumber | 178 | icmpTypeIPv6 |
| 185 | tcpAcknowledgementNumber | 179 | icmpCodeIPv6 |
| 186 | tcpWindowSize | 33 | igmpType |
+-----+---------------------------+-----+---------------------------+
6. Sub-IP Header Fields
+-----+---------------------------+-----+---------------------------+
| ID | Name | ID | Name |
+-----+---------------------------+-----+---------------------------+
| 56 | sourceMacAddress | 201 | mplsLabelStackLength |
| 81 | postSourceMacAddress | 194 | mplsPayloadLength |
| 58 | vlanId | 70 | mplsTopLabelStackSection |
| 59 | postVlanId | 71 | mplsLabelStackSection2 |
| 80 | destinationMacAddress | 72 | mplsLabelStackSection3 |
| 57 | postDestinationMacAddress | 73 | mplsLabelStackSection4 |
| 146 | wlanChannelId | 74 | mplsLabelStackSection5 |
| 147 | wlanSSID | 75 | mplsLabelStackSection6 |
| 200 | mplsTopLabelTTL | 76 | mplsLabelStackSection7 |
| 203 | mplsTopLabelExp | 77 | mplsLabelStackSection8 |
| 237 | postMplsTopLabelExp | 78 | mplsLabelStackSection9 |
| 202 | mplsLabelStackDepth | 79 | mplsLabelStackSection10 |
+-----+---------------------------+-----+---------------------------+
7. Derived Packet Properties
+-----+---------------------------+-----+---------------------------+
| ID | Name | ID | Name |
+-----+---------------------------+-----+---------------------------+
| 204 | ipPayloadLength | 18 | bgpNextHopIPv4Address |
| 15 | ipNextHopIPv4Address | 63 | bgpNextHopIPv6Address |
| 62 | ipNextHopIPv6Address | 46 | mplsTopLabelType |
| 16 | bgpSourceAsNumber | 47 | mplsTopLabelIPv4Address |
| 17 | bgpDestinationAsNumber | 140 | mplsTopLabelIPv6Address |
| 128 | bgpNextAdjacentAsNumber | 90 | mplsVpnRouteDistinguisher |
| 129 | bgpPrevAdjacentAsNumber | | |
+-----+---------------------------+-----+---------------------------+
8. Min/Max Flow Properties
+-----+---------------------------+-----+---------------------------+
| ID | Name | ID | Name |
+-----+---------------------------+-----+---------------------------+
| 25 | minimumIpTotalLength | 208 | ipv4Options |
| 26 | maximumIpTotalLength | 64 | ipv6ExtensionHeaders |
| 52 | minimumTTL | 6 | tcpControlBits |
| 53 | maximumTTL | 209 | tcpOptions |
+-----+---------------------------+-----+---------------------------+
9. Flow Time Stamps
+-----+---------------------------+-----+---------------------------+
| ID | Name | ID | Name |
+-----+---------------------------+-----+---------------------------+
| 150 | flowStartSeconds | 156 | flowStartNanoseconds |
| 151 | flowEndSeconds | 157 | flowEndNanoseconds |
| 152 | flowStartMilliseconds | 158 | flowStartDeltaMicroseconds|
| 153 | flowEndMilliseconds | 159 | flowEndDeltaMicroseconds |
| 154 | flowStartMicroseconds | 160 | systemInitTimeMilliseconds|
| 155 | flowEndMicroseconds | 22 | flowStartSysUpTime |
| | | 21 | flowEndSysUpTime |
+-----+---------------------------+-----+---------------------------+
10. Per-Flow Counters
+-----+---------------------------+-----+---------------------------+
| ID | Name | ID | Name |
+-----+---------------------------+-----+---------------------------+
| 1 | octetDeltaCount | 134 | droppedOctetTotalCount |
| 23 | postOctetDeltaCount | 135 | droppedPacketTotalCount |
| 198 | octetDeltaSumOfSquares | 19 | postMCastPacketDeltaCount |
| 85 | octetTotalCount | 20 | postMCastOctetDeltaCount |
| 171 | postOctetTotalCount | 174 | postMCastPacketTotalCount |
| 199 | octetTotalSumOfSquares | 175 | postMCastOctetTotalCount |
| 2 | packetDeltaCount | 218 | tcpSynTotalCount |
| 24 | postPacketDeltaCount | 219 | tcpFinTotalCount |
| 86 | packetTotalCount | 220 | tcpRstTotalCount |
| 172 | postPacketTotalCount | 221 | tcpPshTotalCount |
| 132 | droppedOctetDeltaCount | 222 | tcpAckTotalCount |
| 133 | droppedPacketDeltaCount | 223 | tcpUrgTotalCount |
+-----+---------------------------+-----+---------------------------+
11. Miscellaneous Flow Properties
+-----+---------------------------+-----+---------------------------+
| ID | Name | ID | Name |
+-----+---------------------------+-----+---------------------------+
| 36 | flowActiveTimeout | 161 | flowDurationMilliseconds |
| 37 | flowIdleTimeout | 162 | flowDurationMicroseconds |
| 136 | flowEndReason | 61 | flowDirection |
+-----+---------------------------+-----+---------------------------+
12. Padding
+-----+---------------------------+-----+---------------------------+
| ID | Name | ID | Name |
+-----+---------------------------+-----+---------------------------+
| 210 | paddingOctets | | |
+-----+---------------------------+-----+---------------------------+
Ukladanie záznamu o toku je rozdelené do 12 tabuliek, kde každá tabuľka obsahuje všetky informačné elementy skupiny, ktorej prislúcha. Pri ukladaní záznamov s malým počtom informačných elementov sa tak nemusia použiť (a vo väčšine prípadov sa ani nepoužívajú) všetky tabuľky. Jednotlivé položky v tabuľkách obsahujú cudzí kľúč referujúci na rodičovskú tabuľku - čím je jednoznačne identifikovaný záznam o toku, ku ktorému patria.
V internetovom drafte, ktorý popisuje informačný model, sa uvádzajú informačné elementy (ich IPFIX dátový typ, význam .... ) vo forme
XML dokumentu, ktorý umožňuje zautomatizovať vytvorenie schémy databázy. SQL skript, ktorý vytvára všetky potrebné tabuľky, môže byť vytvorený parsovaním daného XML dokumentu. Za týmto účelom bol napísaný
jednoduchý PHP parser, ktorý načíta daný XML dokument a vytvorí SQL skript pre vytvorenie tabuliek záznamov. Tento parser umožňuje definovať mapovanie IPFIX dátových typov do dátových typov konkrétneho databázového systému:
Príklad mapovania pre PostGreSQL?:
$datatypes["unsigned8"] = "int2";
$datatypes["unsigned16"] = "int4";
$datatypes["unsigned32"] = "int8";
$datatypes["unsigned64"] = "numeric(22)";
$datatypes["signed8"] = "int";
$datatypes["signed16"] = "int2";
$datatypes["signed32"] = "int4";
$datatypes["signed64"] = "int8";
$datatypes["float32"] = "float4";
$datatypes["float64"] = "float8";
$datatypes["boolean"] = "boolean";
$datatypes["macAddress"] = "macaddr";
$datatypes["octetArray"] = "bit varying";
$datatypes["string"] = "text";
$datatypes["dateTimeSeconds"] = "numeric(22)";
$datatypes["dateTimeMilliseconds"] = "numeric(22)";
$datatypes["dateTimeMicroseconds"] = "numeric(22)";
$datatypes["dateTimeNanoseconds"] = "numeric(22)";
$datatypes["ipv4Address"] = "inet";
$datatypes["ipv6Address"] = "inet";
Toto mapovanie bolo vytvorené z dôvodu nekompatibility dátových typov v rôznych databázových systémoch.
Pre iné databázové systémy je potrebné zmeniť toto mapovanie na dátové typy SRBD, ktoré daný systém poskytuje.
Navrhnutý parser vyberá do hlavnej tabuľky určité informačné elementy, o ktorých sa predpokladá, že budú častou súčasťou záznamu o tokoch. Toto opatrenie zníži celkový počet záznamov v báze dát a urýchli vyhľadávanie v záznamoch, ktoré obsahujú len tieto základné ( poprípade malý počet iných ) informačné elementy.
Zoznam vybraných informačných elementov:
sourceIPv4Address , destinationIPv4Address , sourceTransportPort , destinationTransportPort , protocolIdentifier , octetTotalCount , packetTotalCount , octetDeltaCount , packetDeltaCount , flowStartSeconds , flowEndSeconds
SQL Skript vytvorený parserom pre PostGreSQL? DBMS
-- File: schema.sql
-- Generated: 16.04.2007 22:25:41
-- This file contains table definitions for the IPFIX reports.
-----------------------------------------------------------------------
CREATE TABLE records_main (
RID bigserial NOT NULL,
sourceIPv4Address inet,
destinationIPv4Address inet,
sourceTransportPort int4,
destinationTransportPort int4,
protocolIdentifier int2,
octetTotalCount numeric(22),
packetTotalCount numeric(22),
octetDeltaCount numeric(22),
packetDeltaCount numeric(22),
flowStartSeconds numeric(22),
flowEndSeconds numeric(22),
PRIMARY KEY(RID)
);
-----------------------------------------------------------------------
CREATE TABLE records_scope (
ID bigserial NOT NULL,
RID bigint REFERENCES records_main ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
lineCardId int8,
portId int8,
ingressInterface int8,
egressInterface int8,
meteringProcessId int8,
exportingProcessId int8,
flowId numeric(22),
templateId int4,
observationDomainId int8,
observationPointId int8,
commonPropertiesId numeric(22),
PRIMARY KEY(ID)
);
-----------------------------------------------------------------------
CREATE TABLE records_config (
ID bigserial NOT NULL,
RID bigint REFERENCES records_main ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
exporterIPv4Address inet,
exporterIPv6Address inet,
exporterTransportPort int4,
collectorIPv4Address inet,
collectorIPv6Address inet,
collectorInterface int8,
collectorProtocolVersion int2,
collectorTransportProtocol int2,
collectorTransportPort int4,
flowKeyIndicator numeric(22),
PRIMARY KEY(ID)
);
-----------------------------------------------------------------------
CREATE TABLE records_processCounter (
ID bigserial NOT NULL,
RID bigint REFERENCES records_main ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
exportedMessageTotalCount numeric(22),
exportedOctetTotalCount numeric(22),
exportedFlowRecordTotalCount numeric(22),
observedFlowTotalCount numeric(22),
ignoredPacketTotalCount numeric(22),
ignoredOctetTotalCount numeric(22),
notSentFlowTotalCount numeric(22),
notSentPacketTotalCount numeric(22),
notSentOctetTotalCount numeric(22),
PRIMARY KEY(ID)
);
-----------------------------------------------------------------------
CREATE TABLE records_ipHeader (
ID bigserial NOT NULL,
RID bigint REFERENCES records_main ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
ipVersion int2,
sourceIPv6Address inet,
sourceIPv4PrefixLength int2,
sourceIPv6PrefixLength int2,
sourceIPv4Prefix inet,
sourceIPv6Prefix inet,
destinationIPv6Address inet,
destinationIPv4PrefixLength int2,
destinationIPv6PrefixLength int2,
destinationIPv4Prefix inet,
destinationIPv6Prefix inet,
ipTTL int2,
nextHeaderIPv6 int2,
ipDiffServCodePoint int2,
ipPrecedence int2,
ipClassOfService int2,
postIpClassOfService int2,
flowLabelIPv6 int8,
isMulticast int2,
fragmentIdentification int8,
fragmentOffset int4,
fragmentFlags int2,
ipHeaderLength int2,
ipv4IHL int2,
totalLengthIPv4 int4,
ipTotalLength numeric(22),
payloadLengthIPv6 int4,
PRIMARY KEY(ID)
);
-----------------------------------------------------------------------
CREATE TABLE records_transportHeader (
ID bigserial NOT NULL,
RID bigint REFERENCES records_main ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
udpSourcePort int4,
udpDestinationPort int4,
udpMessageLength int4,
tcpSourcePort int4,
tcpDestinationPort int4,
tcpSequenceNumber int8,
tcpAcknowledgementNumber int8,
tcpWindowSize int4,
tcpWindowScale int4,
tcpUrgentPointer int4,
tcpHeaderLength int2,
icmpTypeCodeIPv4 int4,
icmpTypeIPv4 int2,
icmpCodeIPv4 int2,
icmpTypeCodeIPv6 int4,
icmpTypeIPv6 int2,
icmpCodeIPv6 int2,
igmpType int2,
PRIMARY KEY(ID)
);
-----------------------------------------------------------------------
CREATE TABLE records_subIpHeader (
ID bigserial NOT NULL,
RID bigint REFERENCES records_main ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
sourceMacAddress macaddr,
postSourceMacAddress macaddr,
vlanId int4,
postVlanId int4,
destinationMacAddress macaddr,
postDestinationMacAddress macaddr,
wlanChannelId int2,
wlanSSID text,
mplsTopLabelTTL int2,
mplsTopLabelExp int2,
postMplsTopLabelExp int2,
mplsLabelStackDepth int8,
mplsLabelStackLength int8,
mplsPayloadLength int8,
mplsTopLabelStackSection bit varying,
mplsLabelStackSection2 bit varying,
mplsLabelStackSection3 bit varying,
mplsLabelStackSection4 bit varying,
mplsLabelStackSection5 bit varying,
mplsLabelStackSection6 bit varying,
mplsLabelStackSection7 bit varying,
mplsLabelStackSection8 bit varying,
mplsLabelStackSection9 bit varying,
mplsLabelStackSection10 bit varying,
PRIMARY KEY(ID)
);
-----------------------------------------------------------------------
CREATE TABLE records_derived (
ID bigserial NOT NULL,
RID bigint REFERENCES records_main ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
ipPayloadLength int8,
ipNextHopIPv4Address inet,
ipNextHopIPv6Address inet,
bgpSourceAsNumber int8,
bgpDestinationAsNumber int8,
bgpNextAdjacentAsNumber int8,
bgpPrevAdjacentAsNumber int8,
bgpNextHopIPv4Address inet,
bgpNextHopIPv6Address inet,
mplsTopLabelType int2,
mplsTopLabelIPv4Address inet,
mplsTopLabelIPv6Address inet,
mplsVpnRouteDistinguisher bit varying,
PRIMARY KEY(ID)
);
-----------------------------------------------------------------------
CREATE TABLE records_minMax (
ID bigserial NOT NULL,
RID bigint REFERENCES records_main ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
minimumIpTotalLength numeric(22),
maximumIpTotalLength numeric(22),
minimumTTL int2,
maximumTTL int2,
ipv4Options int8,
ipv6ExtensionHeaders int8,
tcpControlBits int2,
tcpOptions numeric(22),
PRIMARY KEY(ID)
);
-----------------------------------------------------------------------
CREATE TABLE records_timestamp (
ID bigserial NOT NULL,
RID bigint REFERENCES records_main ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
flowStartMilliseconds numeric(22),
flowEndMilliseconds numeric(22),
flowStartMicroseconds numeric(22),
flowEndMicroseconds numeric(22),
flowStartNanoseconds numeric(22),
flowEndNanoseconds numeric(22),
flowStartDeltaMicroseconds int8,
flowEndDeltaMicroseconds int8,
systemInitTimeMilliseconds numeric(22),
flowStartSysUpTime int8,
flowEndSysUpTime int8,
PRIMARY KEY(ID)
);
-----------------------------------------------------------------------
CREATE TABLE records_flowCounter (
ID bigserial NOT NULL,
RID bigint REFERENCES records_main ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
postOctetDeltaCount numeric(22),
octetDeltaSumOfSquares numeric(22),
postOctetTotalCount numeric(22),
octetTotalSumOfSquares numeric(22),
postPacketDeltaCount numeric(22),
postPacketTotalCount numeric(22),
droppedOctetDeltaCount numeric(22),
droppedPacketDeltaCount numeric(22),
droppedOctetTotalCount numeric(22),
droppedPacketTotalCount numeric(22),
postMCastPacketDeltaCount numeric(22),
postMCastOctetDeltaCount numeric(22),
postMCastPacketTotalCount numeric(22),
postMCastOctetTotalCount numeric(22),
tcpSynTotalCount numeric(22),
tcpFinTotalCount numeric(22),
tcpRstTotalCount numeric(22),
tcpPshTotalCount numeric(22),
tcpAckTotalCount numeric(22),
tcpUrgTotalCount numeric(22),
PRIMARY KEY(ID)
);
-----------------------------------------------------------------------
CREATE TABLE records_misc (
ID bigserial NOT NULL,
RID bigint REFERENCES records_main ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
flowActiveTimeout int4,
flowIdleTimeout int4,
flowEndReason int2,
flowDurationMilliseconds int8,
flowDurationMicroseconds int8,
flowDirection int2,
PRIMARY KEY(ID)
);
-----------------------------------------------------------------------
CREATE TABLE records_padding (
ID bigserial NOT NULL,
RID bigint REFERENCES records_main ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
paddingOctets bit varying,
PRIMARY KEY(ID)
);
Tento dátový model nebol testovaný natoľko aby sa dalo povedať, že je najefektívnejším modelom pre ukladanie tochto typu údajov. Preto by bolo lepšie navrhnúť systém, ktorý by takýto model dokázal sám v čase vytvoriť.
Návrh dynamickejšieho riešenia do budúcnosti
Existuje viacej typov dátových modelov schopných poňať tento druh informácie. Jeden z nich môže byť napríklad nasledujúci:
XML
Je možné vytvoriť tabuľku pre uchovávanie záznamov tak, že informačné elementy budú uložené v XML formáte, ktorý bude uložený priamo v databáze. Jeden z možných formátov môže vyzerať napríklad takto:
<elements>
<element ID="number1">
value1
</element>
<element ID="number2">
value2
</element>
.
.
.
</elements>
Takto vytvorený XML dokument nám umožňuje pridávať aj nové typy informačných elementov bez potreby modifikovania štruktúry databázy. Problém pri uskladňovaní údajov vo forme XML spočíva vo väčšej zložitosti výberu konkrétnej informácie z takéhoto dokumentu ( SELECT priamo na stĺpec v tabuľke je určite jednoduchší a rýchlejší ako výber pomocou Xpath z XML ). Jedným z kompromisov by bolo vytvorenie takej tabuľky, ktorá určité informačné elementy (tie , ktoré sa používajú najčastejšie) uchováva v samostatných stĺpcoch v tabuľke a ostatné uchováva v XML podobe. Takto navrhnutá tabuľka dokáže uchovať aj nové informačné elementy a zároveň umožní rýchlejší výber informácii z nej.
Príklad tabuľky záznamov
CREATE TABLE records_XML (
ID temporaryDataType0 NOT NULL,
importantInfElement1 temporaryDataTypeX,
importantInfElement2 temporaryDataTypeX,
importantInfElement3 temporaryDataTypeX,
importantInfElement4 temporaryDataTypeX,
importantInfElement5 temporaryDataTypeX,
importantInfElement6 temporaryDataTypeX,
importantInfElement7 temporaryDataTypeX,
importantInfElement8 temporaryDataTypeX,
otherInformationElements xmlDataType -- i.e. text in PSQL
PRIMARY KEY('ID')
);
Uvedený dátový model vykazuje iné vlastnosti ako model aktuálne použitý pre uchovávanie záznamov. Tieto vlastnosti nevieme presne odhadnúť. Preto by bolo vhodné vytvoriť medzivrstvu medzi bázou dát a kolektorom, ktorý do tejto bázy dát ukladá záznamy. Záznamy by boli medzi kolektorom a touto vrstvou posielané v jednotnom formáte ( Bol by určený protokol pre prenos medzi nimi ).
Táto nová vrstva by zabezpečovala:
- Príjem záznamov o tokoch od kolektora ( resp. iného procesu, ktorý bude implementovať daný protokol )
- Odosielanie záznamov pre analyzer (resp. iný proces)
- Ukladanie záznamov do ľubovoľnej databázy, resp. viacerých databáz
- Súčasné ukladanie záznamov podľa viacerých konceptuálnych dátových modelov
- Meranie výkonnosti určitého dátového modelu
- Ľahká implementácia nového dátového modelu
- Určovanie efektívnejšieho dátového modelu
- Poprípade uchovávanie dát v rôznych dátových modeloch pre zápis a čítanie ( Proces replikácie, resp. zmeny štruktúry dát zo štruktúry vhodnej na zápis do štruktúry vhodnej pre čítanie by sa mohol vykonávať v čase slabej záťaže databázového systému )
Ďalšie príspevky
Príloha
- IPFIX_InformationElements.xml: Tento súbor obsahuje popis IPFIX informačných elementov vo forme XML dokumentu
- SQLExporter.php.txt: Jednoduchý PHP parser, ktorý vytvorí SQL skript na základe XML dokumentu s existujúcimi typmi informačných elementov
--
LukasKostial - 23 May 2007