Toto je vyrovnávacia pamäť Google pre http://wiki.cnl.tuke.sk/QoSProjekt/UsageBasedAccounting. Je to snímka stránky, ako sa zobrazila dňa 13. mar. 2009 05:09:23 GMT. Aktuálna stránka sa odvtedy mohla zmeniť. Viac informácií

Len textová verzia
 
UsageBasedAccounting < QoSProjekt < TWiki
r7 - 23 May 2007 - 12:48:51 - LukasKostialYou are here: TWiki >  QoSProjekt Web  > UsageBasedAccounting

Úč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:

  1. Identifiers
  2. Metering and Exporting Process Configuration
  3. Metering and Exporting Process Statistics
  4. IP Header Fields
  5. Transport Header Fields
  6. Sub-IP Header Fields
  7. Derived Packet Properties
  8. Min/Max Flow Properties
  9. Flow Time Stamps
  10. Per-Flow Counters
  11. Miscellaneous Flow Properties
  12. 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 )

middletier.jpg

Ď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

toggleopenShow attachmentstogglecloseHide attachments
Topic attachments
I Attachment Action Size Date Who Comment
xmlxml IPFIX_InformationElements.xml manage 121.6 K 20 Mar 2007 - 08:36 LukasKostial Tento súbor obsahuje popis IPFIX informačných elementov vo forme XML dokumentu
jpgjpg middletier.jpg manage 49.3 K 23 May 2007 - 12:23 LukasKostial Vrstva medzi kolektorom a databázou
txttxt SQLExporter.php.txt.txt manage 4.4 K 23 May 2007 - 12:47 LukasKostial Jednoduchý PHP parser, ktorý vytvorí SQL skript na základe XML dokumentu s existujúcimi typmi informačných elementov
Edit | WYSIWYG | Attach | Printable | Raw View | Backlinks: Web, All Webs | History: r7 < r6 < r5 < r4 < r3 | More topic actions
 
Powered by TWiki
This site is powered by the TWiki collaboration platformCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback