PostgreSQL體繫結構小結

來源:互聯網
上載者:User

標籤:

?????????

參考:http://book.51cto.com/art/201201/313175.htm

體系架構

  PostgreSQL資料庫由串連管理系統(系統控制器)、編譯執行系統、儲存管理系統、事務系統、系統資料表五大部分組成,其組成結構和關係2-1所示。

  串連管理系統接受外部操作對系統的請求,對操作請求進行預先處理和分發,起系統邏輯控製作用;

  編譯執行系統由查詢編譯器、查詢執行器組成,完成操作請求在資料庫中的分析處理和轉化工作,最終實現實體儲存體介質中資料的操作;

  儲存管理系統由索引管理器、記憶體管理器、外存管理器組成,負責儲存和管理物理資料,提供對編譯查詢系統的支援;

  事務系統由交易管理員、日誌管理器、並發控制、鎖管理器組成,日誌管理器和交易管理員完成對操作請求處理的事務一致性支援,鎖管理器和並發控制提供對並發訪問資料的一致性支援;

  系統資料表是PostgreSQL資料庫的元資訊管理中心,包括資料庫物件資訊和資料庫管理控制資訊。系統資料表管理中繼資料資訊,將PostgreSQL資料庫的各個模組有機地串連在一起,形成一個高效的資料管理系統。




資料庫初始化(initdb)過程

 ????   執行initdb程式時,將從initdb.c檔案中的main函數開始執行,main函數的執行流程2-3所示。initdb執行時將按照順序執行下列工作:

    1)根據使用者輸入的命令列參數擷取輸入的命令名。

    2)設定系統編碼為LC_ALL,尋找執行命令的絕對路徑並設定該路徑。

    3)設定環境變數(pg_data等),擷取系統設定檔的源檔案路徑(postgres.bki、postgresql.conf.sample等檔案),並檢查該路徑下各檔案的可用性。

    4)設定中斷訊號處理函數,對終端命令列SIGHUP、程式中斷SIGINT、程式退出SIGQUIT、軟體中斷SIGTERM和管道中斷SIGPIPE等訊號進行屏蔽,保證初始化工作順利進行。

    5)建立資料目錄,以及該目錄下一些必要的子目錄,如base、global、base/1等。

    6)測試當前伺服器系統效能,由測試結果建立設定檔postgresql.conf、pg_hba.conf、pg_ident.conf,並對其中定義的參數做一些設定。

    7)在bootstrap模式下建立資料庫template1,儲存在資料目錄的子目錄base/1/中。

    8)建立系統檢視表、系統資料表TOAST表等,複製template1來建立template0和postgres,這些操作都用普通的SQL命令來完成。

    9)列印操作成功等相關資訊,退出。

  initdb是PostgreSQL中一個獨立的程式,它的主要工作就是對資料集簇進行初始化,建立模板資料庫和系統資料表,並向系統資料表中插入初始元組。在這以後,使用者建立各種資料庫、表、視圖、索引等資料庫物件和進行其他動作時,都是在模板資料庫和系統資料表的基礎上進行的。????

資料庫集簇

  PostgreSQL安裝完成後,在做任何其他事情之前,必須先使用initdb程式初始化磁碟上的資料存放區區,即資料集簇,由PostgreSQL管理的使用者資料庫以及系統資料庫總稱為資料集簇。在PostgreSQL的實現中,資料庫就是磁碟上一些檔案的集合,只不過這些檔案有特定的檔案名稱、儲存位置等,並且有些檔案之間會相互關聯。預設情況下,PostgreSQL的所有資料都儲存在其資料目錄裡,這個資料目錄通常會用環境變數PGDATA來引用,後文中將會用PGDATA來指代資料目錄。

  在PostgreSQL中,物件識別碼(OID)用來在整個資料集簇中唯一地標識一個資料庫物件,這個對象可以是資料庫、表、索引、視圖、元組、類型等。PostgreSQL提供了Oid資料類型來表示OID,它實際上是一個不帶正負號的整數。

  OID——物件識別碼

  OID通常是從1開始分配,但在初始化資料集簇時,會先將一部分OID分配給系統資料表、系統資料表元組、系統資料表上的索引等資料庫物件,這一部分OID可以在系統資料表所對應的標頭檔中找到。同時,為了給後續版本留下擴充的餘地,初始化資料集簇時還會預留一部分OID資源。這樣,在系統運行時可分配的OID資源實際是從16384開始的。在PostgreSQL原始碼src/include/catalog子目錄下有一個shell指令碼unused_oids用來輸出目前的版本中預分配和預留的OID的使用方式。


系統資料庫

    在建立資料集簇之後,該集簇中預設包含三個系統資料庫template1、template0和postgres。其中template0和postgres都是在初始化過程中從template1拷貝而來的。

  template1和template0資料庫用於建立資料庫。PostgreSQL中採用從模板資料庫複寫的方式來建立新的資料庫,在建立資料庫的命令中可以用“-T”選項來指定以哪個資料庫為模板來建立新資料庫。

  template1資料庫是建立資料庫命令預設的模板,也就是說通過不帶“-T”選項的命令建立的使用者資料庫是和template1一模一樣的。template1是可以修改的,如果對template1進行了修改,那麼在修改之後建立的使用者資料庫中也能體現出這些修改的結果。template1的存在允許使用者可以製作一個自訂的模板資料庫,在其中使用者可以建立一些應用需要的表、資料、索引等,在日後需要多次建立相同內容的資料庫時,都可以用template1作為模板產生。

  由於template1的內容有可能被使用者修改,因此為了滿足使用者建立一個“乾淨”資料庫的需求,PostgreSQL提供了template0資料庫作為最初始的備份資料,當需要時可以用template0作為模板產生“乾淨”的資料庫。

  而第三個初始資料庫postgres用於給初始使用者提供一個可串連的資料庫,就像Linux系統中一個使用者的主目錄一樣。

  上述系統資料庫都是可以刪除的,但是兩個模板資料庫在刪除之前必須將其在pg_database中元組的datistemplate屬性改為FALSE,否則刪除時會提示“不能刪除一個模板資料庫”。


系統資料表、視圖

   在關聯式資料庫中,為了實現資料庫系統的控制,必須提供資料字典的功能。資料字典不僅儲存各種對象的描述資訊,而且儲存系統管理所需的各種對象的細節資訊。從內容來看,資料字典包含資料庫系統中所有對象及其屬性的描述資訊、對象之間關係的描述資訊、對象屬性的自然語言含義以及資料字典變化的曆史(即資料庫的狀態資訊)。資料字典是關聯式資料庫系統管理控制資訊的核心,在PostgreSQL資料庫系統中,系統資料表扮演著資料字典的角色

  系統資料表是PostgreSQL資料庫存放結構中繼資料的地方,它在PostgreSQL中表現為存放有系統資訊的普通表或者視圖。使用者可以刪除然後重建這些表、增加列、插入和更新數值,然而由使用者去修改系統會導致系統資訊的不一致性,進而導致系統控制紊亂。正常情況下不應該由使用者手工修改系統資料表,而是由SQL命令關聯的系統資料表操作自動維護系統資料表資訊。比如,建立資料庫語句(CREATE DATABASE)會向pg_database系統資料表插入一行,並且在磁碟上建立該資料庫。

 PostgreSQL的每一個資料庫中都有自己的一套系統資料表,其中大多數系統資料表都是在資料庫建立時從模板資料庫中拷貝過來的,因此這些系統資料表裡的資料都是與所屬資料庫相關的。只有少數系統資料表是所有資料庫共用的(比如pg_database),這些系統資料表裡的資料是關於所有資料庫的。

  由於系統資料表儲存了資料庫的所有中繼資料,所以系統運行時對系統資料表的訪問是非常頻繁的。為了提高系統效能,在記憶體中建立了共用的系統資料表CACHE,使用Hash函數和Hash表提高查詢效率,這些內容將在第3章詳細介紹。


進程結構

  PostgreSQL系統的主要功能都集中於Postgres程式,其中的各個進程都是通過載入Postgres程式而形成的進程,只是在運行時所處的分支不同而已。PostgreSQL使用一種專用伺服器處理序體繫結構,主要進程有: 

   Postgres程式的入口就是main模組的main函數。

守護進程postmaster(單一使用者模式下的Postgres進程):

 完成資料集簇初始化後,使用者可以啟動一個資料庫執行個體來運行資料庫管理系統,多使用者模式下一個資料庫執行個體由資料庫伺服器守護進程Postmaster來管理。主要功能:

 1.它是一個運行在伺服器上的總控進程,負責整個系統的啟動和關閉,並且在服務進程出現錯誤時完成系統的恢複。

 2.它管理資料庫檔案、監聽並接受來自用戶端(psql,jdbc等)的串連請求,並且為用戶端串連請求fork一個Postgres服務進程,來代表用戶端在資料庫上執行各種命令。

 3.同時Postmaster還管理與資料庫運行相關的輔助進程。使用者可以使用postmaster、postgres或者pg_ctl命令啟動Postmaster。

  PostgreSQL採用C/S模式,系統為每個用戶端分配一個服務進程。Postmaster就像一個處理用戶端請求的調度中心。前端應用欲訪問某一資料庫時,就調用介面庫(比如ODBC、libpq)把使用者的請求通過網路發給守護進程Postmaster。Postmaster將啟動一個新的服務進程Postgres為使用者服務,此後前端進程和服務進程不再通過Postmaster而是直接進行通訊。

服務進程Postgres:

 服務進程Postgres接受並執行用戶端(比如psql,或使用者應用程式通過JDBC等介面)發送的命令(互動式SQL查詢)。它在底層模組(如儲存、交易管理、索引等)之上調用各個主要的功能模組(如編譯器、最佳化器、執行器等),完成用戶端的各種資料庫操作,並返回執行結果。

    用戶端每建立一個資料庫連接,postmaster產生一個postgres伺服器處理序,直接接受使用者的命令進行編譯執行,並將結果返回給使用者。如此迴圈,直到使用者中斷連線。 伺服器處理序通過訊號量和共用記憶體來相互連信。  

輔助進程(分別為實現不同功能):

    系統日誌進程SysLogger :

    後台寫進程bgWriter:

    預寫式日誌寫進程WalWriter:

    預寫式日誌歸檔進程pg_archive:

    系統自動清理進程AutoVacuum:將自動定時整理(清理)外存中的資料空間。

    統計資料收集進程pg_state:將自動統計系統運行中的一些動態資訊。 

????????

PostgreSQL體繫結構小結

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.