Subject: Shrinking SVG (Again)

From: Jürgen Purtz <[email-masked]>
Date: Sun, 17 Nov 2019 10:28:09 +0100

Our current policy says that we use the two tools Graphviz (drawing 
Graphs) and Ditaa (drawing ascii art) to generate SVG. The two tools are 
highly specialized and bound to their original purpose. I strongly 
believe that we will not be able to visualize more complex situations 
like this 
http://1.bp.blogspot.com/--CG_kXBFWzw/UgW5JROpbDI/AAAAAAAAAHc/9V8iwO1qluQ/s1600/arch.bmp 
or that: 
https://severalnines.com/sites/default/files/blog/node_5266/image5.jpg 
without using other tools, which are more flexible.

In the past, we had many discussions on this topic and didn't come to a 
final decision in favor on one single or a few number of such tools. 
However, we came to the important and very helpful conclusion to store 
two files per graphic: the original tool-specific (simple to read, 
diff-able) and the generated SVG version.

Out in the wild there is the open source tool SVGO 
https://github.com/svg/svgo. Its purpose is the generation of a small, 
easy to read SVG file out of any other SVG file by removing all the 
clutter, tools typically generate. In my opinion it's not perfect, but 
it has some strong advantages: the generated files are really small and 
nearly free of unnecessary information; it is flexible because a lot of 
parameters control the degree of optimization; it is extensible: missing 
features may be added by ourselves.

The SVGO tool is a node.js application. At Ubuntu you can install it:
   sudo apt install npm nodejs
   sudo npm install -g svgo
run it, e.g.:
   svgo test1_ink.svg --pretty --indent=2 --precision=2 --multipass 
--disable=removeComments  \
                      --output test1_svgo.svg
Please test it with your own examples.

In contrast to our previous policy the generated file is the diff-able, 
whereas the original one is hard to read.

Jürgen Purtz

---

From: Jürgen Purtz <[email-masked]>
Date: Wed, 15 Jan 2020 14:56:43 +0100

I plan to deliver 3 more graphics, see attachment. When creating their 
textual description in the SGML files I faced a problems: The patch of 
GSoD 
https://www.postgresql.org/message-id/flat/CAEkD-mBFQb61gHNWR0cN5K4G4q-i1PRwNn_OKVkKSaaJa5_LbA%40mail.gmail.com#67104a6097e63371c527b14ff43ddafb 
is not yet committed. But this chapter is a good place for the graphics. 
Will the GSoD patch become part of the documentation?

Furthermore in the last weeks we have seen some initiatives to uniform 
the wording of our documentation. I appreciate such activities and will 
deliver a glossary of terms which are used in the description of the 
graphics. This glossary will focus on PG-specific terms. Well known 
terms like SQL key words are left out.

Any comments? Errors in the graphics? Suggestions? What's about the GSoD 
patch?

Jürgen Purtz

---

From: Laurenz Albe <[email-masked]>
Date: Wed, 15 Jan 2020 23:25:00 +0100

> Will the GSoD patch become part of the documentation?

Both Tom and me showed interest, and the feedback was that some things
could be improved.  I have not heard back from the author since;
I hope she didn't get discouraged.

There were definitely some things there that shouldn't go to waste.

> Any comments? Errors in the graphics? Suggestions? What's about the GSoD 

I particularly like the first image with the memory and process architecture.

Some mistakes:

- wal_buffers is shared memory, but it is not a part of shared_buffers

- The process that performs most of the writes to the data files is
  the checkpointer.  Sometimes backends also have to write to data
  files.

Minor quibbles:

- The "server process" is traditionally called "backend process"

- "Special purpose memory" is strange.
  I thing "private memory" would be better.
  I don't know how it could be depicted that each of the backends
  has his own.

I liked the "cluster / database / schema" image less.

Some problems:

- No user data should be stored in the "postgres" database.

- "template0" has *no* other schemas or tables.
  It must be absolutely empty.

- I am missing the global objects like roles and tablespaces
  "outside" the databases.

I am fine with the directory layout image, but I wonder what
"fluctuating states" may be.

Yours,
Laurenz Albe

---

From: Jürgen Purtz <[email-masked]>
Date: Tue, 4 Feb 2020 06:41:21 +0100

This patch deals with two different topics. First, it creates a glossary 
with basic PG-terms and second, it supplies new figures with explanations.

a) In our documentation we name some objects inconsistently (e.g.: WAL, 
WAL file, WAL log, log segment file, WAL segment file, segment file - 
whereas a 'file segment' is a very different thing) and often without a 
definition of its meaning. For experienced users this is not a problem, 
but novice users can get confused easily. In the last months we have 
seen some more initiatives to clarify the situation. My attempt to 
introduce such a glossary is focused on fundamental PG-related terms 
such as CLUSTER or POSTMASTER. Terms with a consistent usage in the 
database community, such as SELECT, are not part of it.

b) The figures and their explanations are summed up in a new chapter, 
which is intended as an introduction to the PG architecture directly 
after the 'Getting Started' chapter. The text makes heavy use of the 
glossary. Therefore the glossary must be applied before or together with 
the figures.

The source of the figures do not completely comply to our guidelines and 
the opinion of the community, which says, that we should use tools 
(actually ditaa and graphviz) to create SVG files. However, this figures 
are too complex for the two tools. I provide each figure in 3 variants 
using a certain name convention: xxx-raw.svg (created in a text- or 
XML-editor), xxx-ink.svg (created with Inkscape by reading xxx-raw.svg), 
and xxx-ink-svgo.svg (created out of xxx-ink.svg with the tool SVGO). 
The 3 variants render to the same output. My personal favorite is 'raw'. 
If the community prefers 'ink' or 'ink-svgo' it's ok for me. 'ink-svgo' 
has the advantage over 'ink' that it does not contain Inkscape specific 
namespaces, elements, or attributes; other elements are reduced in their 
size (measured in characters). 'ink-svgo' is notable smaller that the 
original Inkscape file - especially in such situations, where files are 
really created with the use of Inkscape. The size reduction acts very 
efficient. Generate the reduced file with:

# disable 'mergePaths' is necessary (bug); 'config' is helpful for readability
svgo xxx-ink.svg --output=xxx-ink-svgo.svg  \
      --pretty --indent=2 --precision=2 --multipass  \
      --disable=removeTitle,mergePaths,convertColors,removeViewBox   \
      --config '{ "plugins": [ { "cleanupIDs": { "force": true, "minify": false} }] }'

The describing sgml files use two different 'role' attributes for 
'imageobject' elements. This is necessary in order to keep rendering of 
font sizes of HTML-text and text inside SVG in correlation when you 
choose different screen resolutions in the browser.

J. Purtz

diff --git a/doc/src/sgml/advanced.sgml b/doc/src/sgml/advanced.sgml
index ae5f3fac75..965eb751c0 100644
--- a/doc/src/sgml/advanced.sgml
+++ b/doc/src/sgml/advanced.sgml
@@ -1,7 +1,7 @@
 <!-- doc/src/sgml/advanced.sgml -->
 
  <chapter id="tutorial-advanced">
-  <title>Advanced Features</title>
+  <title>Advanced SQL Features</title>
 
   <sect1 id="tutorial-advanced-intro">
    <title>Introduction</title>
diff --git a/doc/src/sgml/architecture.sgml b/doc/src/sgml/architecture.sgml
new file mode 100644
index 0000000000..30b06b7eaf
--- /dev/null
+++ b/doc/src/sgml/architecture.sgml
@@ -0,0 +1,442 @@
+<!-- doc/src/sgml/architecture.sgml -->
+
+ <chapter id="tutorial-architecture">
+  <title>The Architecture</title>
+
+  <para>
+   Every DBMS implements basic strategies to achieve a fast and
+   robust system. This chapter provides an overview of what
+   techniques <productname>PostgreSQL</productname> uses to
+   reach this aim.
+  </para>
+
+  <sect1 id="tutorial-ram-proc-file">
+   <title>Collabortion of Processes, RAM, and Files</title>
+   <para>
+    As is a matter of course, in a client/server architecture
+    clients do not have direct access to the database. Instead,
+    at the server side there is a group of processes, which
+    receive all requests comming from client applications,
+    handle them, and send resulting information back to
+    the clients.
+    These server-side processes work in close cooperation to
+    each other. Together with their common
+    <xref linkend="glossary-shared-memory"/> they are called an
+    <link linkend="glossary-instance">Instance</link>.
+   </para>
+
+   <para>
+    The instance is initiated by the
+    <xref linkend="glossary-postmaster"/> process.
+    He loads the configuration files, allocates the
+    <firstterm>Shared Memory</firstterm>
+    and starts the comprehensive network of processes:
+    <xref linkend="glossary-background-writer"/>,
+    <xref linkend="glossary-checkpointer"/>,
+    <xref linkend="glossary-wal-writer"/>,
+    <xref linkend="glossary-archiver"/>,
+    <xref linkend="glossary-auto-vacuum"/>,
+    <xref linkend="glossary-stats-collector"/>,
+    <xref linkend="glossary-log-writer"/>, and more.
+    <xref linkend="tutorial-architecture-figure"/> visualizes
+    main aspects of their collaboration.
+   </para>
+
+   <para>
+    Whenever a client application tries to connect to a
+    <xref linkend="glossary-database"/>, this request is handled
+    in a first step by the <firstterm>Postmaster
+    process</firstterm>. He checks the authorization, starts a
+    new <xref linkend="glossary-backend-process"/>,
+    and instructs the client application to connect to this
+    new <firstterm>Backend process</firstterm>. All further
+    client requests go to this process and are handled
+    by him. Thus - after the initial phase - each client
+    application communicates with exactly
+    one <firstterm>Backend process</firstterm>.
+   </para>
+
+   <figure id="tutorial-architecture-figure">
+    <title>Architecture</title>
+    <mediaobject>
+     <imageobject role="html">
+      <!-- attribute 'width=..px' is necessary to keep font-size of SVG text
+           in correlation with font-size of surrounding HTML  -->
+      <imagedata fileref="images/ram-proc-file-raw.svg" format="SVG" width="900px" />
+     </imageobject>
+     <imageobject role="fo">
+      <!-- For PDF attribute 'width=100%' is necessary to keep complete SVG visible
+           on the page, which has a fixed width. Font sizes will be adopted.  -->
+      <imagedata fileref="images/ram-proc-file-raw.svg" format="SVG" width="100%" />
+     </imageobject>
+    </mediaobject>
+   </figure>
+
+   <para>
+    Client requests (SELECT, UPDATE, ...) usually leads to the
+    necessity to read or write some data. In an first attempt
+    the client's <firstterm>Backend process</firstterm> tries
+    to get the information out of <firstterm>Shared
+    Memory</firstterm>. This <firstterm>Shared
+    Memory</firstterm> is a mirror of parts of the
+    <xref linkend="glossary-heap"/> and
+    <xref linkend="glossary-index"/> files. Because files are
+    much huger than memory, it is easily possible that
+    the desired information is not (completely) available
+    in the RAM. In this case the <firstterm>Backend process
+    </firstterm> must transfer additional file pages to
+    <firstterm>Shared Memory</firstterm>. Files are physically
+    organized in pages. Every transfer between files and
+    RAM is performed in units of complete pages while retaining
+    their size and layout.
+   </para>
+
+   <para>
+    Reading file pages is notedly slower than reading
+    RAM. This is the main motivation for the existence of
+    <firstterm>Shared Memory</firstterm>. As soon as one
+    of the <firstterm>Backend processes</firstterm> has done
+    the job, this pages are available for all other
+    <firstterm>Backend processes</firstterm> for direct
+    access in RAM.
+   </para>
+
+   <para>
+    <firstterm>Shared Memory</firstterm> is limited in size.
+    Sooner or later it is necessary to overwrite old RAM
+    pages. As long as the content of such pages hasn't
+    changed, this is not a problem. But in
+    <firstterm>Shared Memory</firstterm> also write
+    actions take place
+    - performed by any of the <firstterm>Backend
+    processes</firstterm> (or the
+    <xref linkend="glossary-auto-vacuum"/> or other
+    processes).
+    Such modified pages are called
+    <firstterm>dirty pages</firstterm>.
+    Before <firstterm>dirty pages</firstterm> can be overwritten,
+    they must be saved to disk. This is a two-step process.
+   </para>
+
+   <para>
+    First, whenever the content of a page changes, a
+    <xref linkend="glossary-wal-record"/> is created out
+    of the delta-information (difference between old and
+    new content) and stored in another area of the
+    <firstterm>Shared Memory</firstterm>. These
+    <firstterm>WAL records</firstterm> are read by the
+    <xref linkend="glossary-wal-writer"/> process,
+    who runs in parallel to the <firstterm>Backend
+    processes</firstterm> and all other processes of
+    the <firstterm>instance</firstterm>. He writes
+    the continuously arising <firstterm>WAL
+    records</firstterm> to
+    the end of the current <firstterm>WAL
+    file</firstterm>. Because of the sequential
+    nature of this writing, it is much faster than
+    the more or less random access
+    to data files with <firstterm>heap</firstterm>
+    and <firstterm>index</firstterm> information.
+    As mentioned, this WAL-writing happens
+    in an independent process. Nevertheless all
+    <firstterm>WAL records</firstterm> created out of one
+    <firstterm>dirty page</firstterm> must be transfered
+    to disk before the <firstterm>dirty page</firstterm>
+    itself can be transfered to disk (???).
+   </para>
+
+   <para>
+    Second, the transfer of <firstterm>dirty pages</firstterm>
+    from <firstterm>Shared Memory</firstterm> to files must
+    take place. This is the primarily duty of the
+    <firstterm>Background Writer</firstterm> process. Because
+    huge I/O activities can block other processes significantly,
+    he starts periodically and acts only for a short period.
+    Doing so, his expensive I/O activities are spread over
+    time avoiding huge I/O peaks. Also the <firstterm>
+    Checkpointer</firstterm> process transfers
+    <firstterm>dirty pages</firstterm> to files, see next
+    paragraph.
+   </para>
+
+   <para>
+    The <firstterm>Checkpointer</firstterm> has a special
+    duty. As its name suggests, he has to create
+    <firstterm>Checkpoints</firstterm>. Such a
+    <xref linkend="glossary-checkpoint"/> is a point in time
+    when all older <firstterm>dirty pages</firstterm>,
+    all older <firstterm>WAL records</firstterm>, and
+    lastly a special <firstterm>Checkpoint record
+    </firstterm> have been written and flushed to disk.
+    In consequence, after a <firstterm>Checkpoint</firstterm>
+    data files and <firstterm>WAL files</firstterm> are in sync.
+    In case of a recovery (after a crash of the instance)
+    it is known, that the information of all
+    <firstterm>WAL records</firstterm> preceding
+    the last <firstterm>Checkpoint record</firstterm>
+    is already integrated into the data files. This
+    speeds up a possibly occurring recovery.
+   </para>
+
+   <para>
+    In correlation with data changes,
+    <firstterm>WAL records</firstterm> arise and are writen
+    to <firstterm>WAL files</firstterm>.
+    Those <firstterm>WAL files</firstterm> - in combination with
+    a previously taken <firstterm>Base Backup</firstterm> -
+    are necessary to restore a database after a crash of the
+    disk, where data files have been stored. Therefore it is
+    recommended to transfer a copy of the <firstterm>
+    WAL files</firstterm>
+    to a second, independent place. The purpose of the
+    <xref linkend="glossary-archiver"/> process is to perform
+    this copy action.
+   </para>
+
+   <para>
+    The <xref linkend="glossary-stats-collector"/> collects
+    counter about accesses to <firstterm>SQL
+    objects</firstterm> like tables, rows, indexes, pages,
+    and others. He stores the obtained information in system
+    tables.
+   </para>
+
+   <para>
+    The <xref linkend="glossary-log-writer"/> writes
+    readable text lines about serious and non-serious events,
+    which can happen during database access, e.g.: wrong password,
+    no permission, long-running query, ... .
+   </para>
+
+  </sect1>
+
+  <sect1 id="tutorial-cluster-db-schema">
+   <title>Cluster, Database, Schema</title>
+
+   <para>
+    <xref linkend="glossary-sql-object"/>
+    implicitly have a certain, strict hierarchy.
+    On a <xref linkend="glossary-server"/>
+    exists one or more <firstterm>clusters</firstterm>,
+    a <firstterm>cluster</firstterm> contains three or more
+    <firstterm>databases</firstterm>, a <firstterm>
+    database</firstterm> contains many <firstterm>schemas</firstterm>,
+    a <firstterm>schema</firstterm> contains <firstterm>tables,
+    views</firstterm>, and a lot of other objects.
+    Each <firstterm>table</firstterm> or <firstterm>view</firstterm>
+    belongs to a certain <firstterm>schema</firstterm>, it cannot
+    belong to another <firstterm>schema</firstterm>. The same is
+    true for the schema/database and database/cluster relation.
+    <xref linkend="tutorial-cluster-db-schema-figure"/> visualizes
+    this hierarchy.
+
+   </para>
+
+   <figure id="tutorial-cluster-db-schema-figure">
+    <title>Cluster, Database, Schema</title>
+    <mediaobject>
+     <imageobject role="html">
+      <!-- attribute 'width=..px' is necessary to keep font-size of SVG text
+           in correlation with font-size of surrounding HTML  -->
+      <imagedata fileref="images/cluster-db-schema-raw.svg" format="SVG" width="900px" />
+     </imageobject>
+     <imageobject role="fo">
+      <!-- For PDF attribute 'width=100%' is necessary to keep complete SVG visible
+           on the page, which has a fixed width. Font sizes will be adopted.  -->
+      <imagedata fileref="images/cluster-db-schema-raw.svg" format="SVG" width="100%" />
+     </imageobject>
+    </mediaobject>
+   </figure>
+
+   <para>
+    A <xref linkend="glossary-cluster"/> is the outer frame for a
+    collection of databases. Clusters are created by the command
+    <xref linkend="app-initdb"/>.
+   </para>
+
+   <para>
+    <literal>template0</literal> is the very first
+    <xref linkend="glossary-database"/> of a any <firstterm>
+    cluster</firstterm>. <literal>template0</literal>
+    is created by C-routines during the initialization phase
+    of the <firstterm>cluster</firstterm>.
+    In a second step <literal>template1</literal> is generated
+    as a copy of <literal>template0</literal> and finally
+    <literal>postgres</literal> as a copy of
+    <literal>template1</literal>. All other
+    <link linkend="app-createdb">new databases</link>
+    of this <firstterm>cluster</firstterm>,
+    such as <literal>my_db</literal>, are also copied from
+    <literal>template1</literal>. Due to the special
+    role of <literal>template0</literal> as the origin
+    of all other <firstterm>databases</firstterm>, no client
+    can connect to it.
+   </para>
+
+   <para>
+    Every database contains <link linkend="glossary-schema">
+    schemas</link>, and
+    <firstterm>schemas</firstterm> contain the other
+    <xref linkend="glossary-sql-object"/>s. <firstterm>
+    Schemas</firstterm> are namespaces for
+    their <firstterm>SQL objects</firstterm> and ensure that
+    within their scope names are used only once across all types
+    of <firstterm>SQL objects</firstterm>. E.g.: it is not possible
+    to have a table <literal>employee</literal> and a view
+    <literal>employee</literal> within the same
+    <firstterm>schema</firstterm>. But it is possible to have
+    two tables <literal>employee</literal> in different
+    <firstterm>schemas</firstterm>. In this case the two tables
+    are different objects and absolutely independent from each
+    other.
+   </para>
+
+   <para>
+    Some <firstterm>schemas</firstterm> are predefined.
+    <literal>public</literal> acts as the default
+    <firstterm>schema</firstterm> and contains all such
+    <firstterm>SQL objects</firstterm>, which are created
+    within <literal>public</literal> or without using any schema
+    name. <literal>public</literal> shall not contain user defined
+    <firstterm>SQL objects</firstterm>. It is recommended to
+    create a separate <firstterm>schema</firstterm> which
+    holds individual objects like application-specific tables or
+    views. <literal>pg_catalog</literal> is a schema for all tables
+    and views of the <xref linkend="glossary-system-catalog"/>.
+    <literal>information_schema</literal> is a schema for several
+    tables and views of the <firstterm>System Catalog</firstterm>
+    in a way, which conforms to the SQL standard.
+   </para>
+
+   <para>
+    There are a lot of different <firstterm>SQL object</firstterm>
+    types: <firstterm>database, schema, table, view, materialized
+    view, index, constraint, sequence, function, procedure,
+    trigger, role, data type, operator, tablespace, extension,
+    foreign data wrapper</firstterm>, and more. With the
+    exception of <firstterm>database, tablespace</firstterm>,
+    and <firstterm>role</firstterm> (see next paragraph) all
+    instantiations of such
+    types belong to exactly one <firstterm>schema</firstterm>.
+   </para>
+
+   <para>
+    Despite the initially noted hierarchical relation amongst
+    <firstterm>SQL objects</firstterm>, there is a small
+    number of exceptions concerning
+    <xref linkend="glossary-global-sql-object"/>s.
+    All database names, all tablespace names, and all role names
+    are automatically known and available throughout the
+    complete <firstterm>cluster</firstterm>, independent from
+    the database or schema in which they where originally
+    defined.
+   </para>
+
+  </sect1>
+
+  <sect1 id="tutorial-directories">
+   <title>Directory Structure</title>
+
+   <para>
+    <productname>PostgreSQL</productname> organizes long lasting
+    data as well as temporary state information about transactions
+    or replication actions in the file system. Every
+    <xref linkend="glossary-cluster"/> has its own root directory
+    anywhere in the file system. In many cases, the environment
+    variable <literal>PGDATA</literal> points to this directory.
+    The example of the following survey, which is shown in
+    <xref linkend="tutorial-directories-figure"/>, uses
+    <literal>data</literal> as the name of this root directory.
+   </para>
+
+   <figure id="tutorial-directories-figure">
+    <title>Directory Structure</title>
+    <mediaobject>
+     <imageobject role="html">
+      <!-- attribute 'width=..px' is necessary to keep font-size of SVG text
+           in correlation with font-size of surrounding HTML  -->
+      <imagedata fileref="images/directories-raw.svg" format="SVG" width="900px" />
+     </imageobject>
+     <imageobject role="fo">
+      <!-- For PDF attribute 'width=100%' is necessary to keep complete SVG visible
+           on the page, which has a fixed width. Font sizes will be adopted.  -->
+      <imagedata fileref="images/directories-raw.svg" format="SVG" width="100%" />
+     </imageobject>
+    </mediaobject>
+   </figure>
+
+   <para>
+    <literal>data</literal> contains many subdirectories and
+    some files, all of which are necessary to store long lasting
+    as well as temporary data. The following paragraphs
+    describe the files and subdirectories in
+    <literal>data</literal>.
+   </para>
+
+   <para>
+    <literal>base</literal> is a subdirectory in which one
+    subdirectory per <firstterm>database</firstterm> exists.
+    The names of those sudirectories consists of numbers.
+    These are the internal
+    <firstterm>Object Identifiers (OID)</firstterm>, which are
+    numbers to identify the database definition in the internal
+    <xref linkend="glossary-system-catalog"/>.
+   </para>
+
+   <para>
+    Within the <firstterm>database</firstterm>-specific
+    subdirectories there are many files. Primarily they contain
+    the <firstterm>heap</firstterm> and <firstterm>
+    index</firstterm>. But there are also optimization information
+    like <link linkend="storage-fsm">Free Space Maps</link> or
+    <link linkend="storage-vm">Visibility Maps</link>.
+   </para>
+
+   <para>
+    Another important subdirectory is <literal>global</literal>.
+    In analogy to the <firstterm>database</firstterm>-specific
+    subdirectories, there are files containing information about
+    <xref linkend="glossary-global-sql-object"/>s. One type
+    of such <firstterm>Global Objects</firstterm> are
+    <firstterm>tablespaces</firstterm>. In
+    <literal>global</literal> there are information about
+    the <firstterm>tablespaces</firstterm>, not the
+    <firstterm>tablespaces</firstterm> itself.
+   </para>
+
+   <para>
+    The subdirectory <literal>pg_wal</literal> contains the
+    <link linkend="glossary-wal-file">WAL files</link>.
+    They arise and grow parallel to data changes in the
+    <firstterm>cluster</firstterm> and remain alive as long as
+    they are required for recovery, archiving, or replication.
+   </para>
+
+   <para>
+    The subdirectory <literal>pg_xact</literal> contains
+    information about the status of each transaction
+    (IN_PROGRESS, COMMITTED, ABORTED, or SUB_COMMITTED).
+   </para>
+
+   <para>
+    In <literal>pg_tblspc</literal> there are symbolic links
+    that point to directories containing such<firstterm>
+    SQL objects</firstterm> that are created within
+    <firstterm>tablespaces</firstterm>.
+   </para>
+
+   <para>
+    In the directory <literal>data</literal>
+    there are also some files.
+    In many cases, the configuration
+    files of this <firstterm>cluster</firstterm>
+    are stored here. As long as the <firstterm>
+    cluster</firstterm> is up and running, the file
+    <literal>postmaster.pid</literal> exists here
+    and contains the ID of the
+    <firstterm>Postmaster</firstterm> process.
+   </para>
+
+  </sect1>
+
+ </chapter>
diff --git a/doc/src/sgml/filelist.sgml b/doc/src/sgml/filelist.sgml
index 3da2365ea9..022c2efda3 100644
--- a/doc/src/sgml/filelist.sgml
+++ b/doc/src/sgml/filelist.sgml
@@ -8,9 +8,10 @@
 <!ENTITY problems   SYSTEM "problems.sgml">
 
 <!-- tutorial -->
-<!ENTITY advanced   SYSTEM "advanced.sgml">
-<!ENTITY query      SYSTEM "query.sgml">
-<!ENTITY start      SYSTEM "start.sgml">
+<!ENTITY start         SYSTEM "start.sgml">
+<!ENTITY architecture  SYSTEM "architecture.sgml">
+<!ENTITY query         SYSTEM "query.sgml">
+<!ENTITY advanced      SYSTEM "advanced.sgml">
 
 <!-- user's guide -->
 <!ENTITY array      SYSTEM "array.sgml">
@@ -169,6 +170,7 @@
 <!ENTITY release-13     SYSTEM "release-13.sgml">
 
 <!ENTITY limits     SYSTEM "limits.sgml">
+<!ENTITY glossary   SYSTEM "glossary.sgml">
 <!ENTITY acronyms   SYSTEM "acronyms.sgml">
 
 <!ENTITY features-supported   SYSTEM "features-supported.sgml">
diff --git a/doc/src/sgml/glossary.sgml b/doc/src/sgml/glossary.sgml
new file mode 100644
index 0000000000..772d3fcabc
--- /dev/null
+++ b/doc/src/sgml/glossary.sgml
@@ -0,0 +1,492 @@
+<!-- doc/src/sgml/glossary.sgml -->
+
+<appendix id="glossary">
+ <title>Glossary</title>
+
+ <para>
+  The glossary contains a collection of
+  <productname>PostgreSQL</productname> related terms.
+  In order to keep such terms together, which are related
+  to each other or can be easily confused, they are not
+  ordered alphabetically.
+ </para>
+ <para>
+  In some cases terms are extended by an alternative wording
+  in parenthesize, e.g.: '(or: Database Server)'. Such deviant
+  formulations are sometimes used at various points in the
+  documentation, but will be replaced by the preferred term
+  in a future release.
+ </para>
+
+ <glosslist>
+
+  <glossentry id="glossary-server">
+   <glossterm>Server (or: Host)</glossterm>
+   <glossdef>
+    <para>
+     The term <firstterm>server</firstterm> denotes real hardware,
+     a container, or a Virtual Machine.
+    </para>
+   </glossdef>
+  </glossentry>
+
+  <glossentry id="glossary-instance">
+   <glossterm>Instance (or: Database Server, or: Backend Server)</glossterm>
+   <glossdef>
+    <para>
+     An <link linkend="app-postgres">instance</link> is a group
+     of processes plus their common
+     <firstterm>Shared Memory</firstterm> running on a single
+     <firstterm>server</firstterm>. The instance handles all key
+     features of a DBMS: read and write access to files and
+     <firstterm>Shared Memory</firstterm>, assurance of the
+     <firstterm>ACID paradigm</firstterm>, <firstterm>MVCC</firstterm>,
+     <firstterm>connections</firstterm> to client programms,
+     <firstterm>backup</firstterm>, <firstterm>recovery</firstterm>,
+     <firstterm>replication</firstterm>, <firstterm>privileges</firstterm>, … .
+    </para>
+    <para>
+     An instance manages exactly one <firstterm>cluster</firstterm>.
+    </para>
+    <para>
+     Many <firstterm>instances</firstterm> can run on the same
+     <firstterm>server</firstterm> – as
+     long as they use different IP ports and manage different
+     <firstterm>clusters</firstterm>. Different
+     <firstterm>instances</firstterm> on a
+     <firstterm>server</firstterm> may use the same or different
+     versions of PostgreSQL.
+    </para>
+   </glossdef>
+  </glossentry>
+
+  <glossentry id="glossary-cluster">
+   <glossterm>Cluster (or: Database Cluster)</glossterm>
+   <glossdef>
+    <para>
+     A <link linkend="app-initdb">cluster</link> is a
+     group of 3 or more databases (<literal>template0</literal>,
+     <literal>template1</literal>, <literal>postgres</literal>,
+     ...) plus their <link linkend="glossary-global-sql-object">
+     global SQL objects</link> (database names, tablespace names,
+     role names). The cluster is managed by exactly one
+     <firstterm>instance</firstterm>.
+    </para>
+   </glossdef>
+  </glossentry>
+
+  <glossentry id="glossary-database">
+   <glossterm>Database</glossterm>
+   <glossdef>
+    <para>
+     A <link linkend="manage-ag-overview">database</link> is
+     a named collection of <firstterm>SQL objects</firstterm>.
+     The database is stored in files of a single directory plus
+     – optionally - in additional tablespaces.
+    </para>
+   </glossdef>
+  </glossentry>
+
+  <glossentry id="glossary-schema">
+   <glossterm>Schema</glossterm>
+   <glossdef>
+    <para>
+     A <link linkend="ddl-schemas">schema</link> is a
+     namespace for <firstterm>SQL objects</firstterm>, which
+     reside in the same <firstterm>database</firstterm>. The
+     names of such objects are unique - even across different
+     types of objects. Same object names can only
+     be used in different schemas.
+    </para>
+    <para>
+     There are some predefined schemas:
+    </para>
+    <para>
+     Schema <literal>public</literal>: A schema for objects, which
+     were created within this schema or outside of any schema.
+     It is recommended that users do not store their new
+     objects in <literal>public</literal>. Instead, they shall
+     create their own schema, e.g. <literal>my_schema</literal> and
+     store everything over there.
+    </para>
+    <para>
+     Schema <literal>pg_catalog</literal>: A schema for all tables and
+     views of the <literal>System Catalog</literal>.
+    </para>
+    <para>
+     Schema <literal>information_schema</literal>: A schema for several
+     tables and views of the <literal>System Catalog</literal> in a way,
+     which conforms to the SQL standard.
+    </para>
+   </glossdef>
+  </glossentry>
+
+  <glossentry id="glossary-system-catalog">
+   <glossterm>System Catalog</glossterm>
+   <glossdef>
+    <para>
+     The <link linkend="ddl-schemas-catalog">
+     System Catalog</link> is a collection of tables and views,
+     whose content describes the structure of all
+     <firstterm>SQL objects</firstterm> of this <firstterm>database</firstterm>
+     (a few of them describes <firstterm>global SQL objects</firstterm>).
+     The System Catalog is created in the schema <literal>pg_catalog</literal>.
+     Main parts are repeated as views in the schema
+     <literal>information_schema</literal>.
+    </para>
+   </glossdef>
+  </glossentry>
+
+  <glossentry id="glossary-catalog">
+   <glossterm>Catalog</glossterm>
+   <glossdef>
+    <para>
+     The SQL standard uses the standalone term
+     <link linkend=" manage-ag-overview">Catalog</link>
+     for what is called a <firstterm>database</firstterm> in
+     PostgreSQL's terminology.
+    </para>
+   </glossdef>
+  </glossentry>
+
+  <glossentry id="glossary-sql-object">
+   <glossterm>SQL Object</glossterm>
+   <glossdef>
+    <para>
+     An <link linkend="manage-ag-overview">SQL object</link>
+     is a <firstterm>database, schema, table, view, materialized
+     view, index, constraint, sequence, function, procedure,
+     trigger, role, data type, operator, tablespace, extension,
+     foreign data wrapper</firstterm>, … . With the exception of
+     <link linkend="glossary-global-sql-object">
+     Global SQL objects</link>, every SQL object belongs
+     to exactly one <firstterm>schema</firstterm>. Within the
+     <firstterm>schema</firstterm> their names are unique.
+    </para>
+   </glossdef>
+  </glossentry>
+
+  <glossentry id="glossary-global-sql-object">
+   <glossterm>Global SQL Object</glossterm>
+   <glossdef>
+    <para>
+     <firstterm>SQL objects</firstterm> of type
+     <firstterm>database</firstterm>,
+     <firstterm>role</firstterm> (= user or group),
+     and <firstterm>tablespace</firstterm>
+     are automatically known cluster-wide.
+     Therefore they are called Global SQL objects.
+    </para>
+   </glossdef>
+  </glossentry>
+
+  <glossentry id="glossary-shared-memory">
+   <glossterm>Shared Memory</glossterm>
+   <glossdef>
+    <para>
+     <link linkend="runtime-config-resource-memory">
+     Shared Memory</link> is RAM which is used by the processes
+     of an <firstterm>instance</firstterm> in common. It
+     mirrors parts of database files, provides an area for
+     <firstterm>WAL records</firstterm>, and stores some more
+     common information. Please notice, that Shared Memory
+     belongs to the complete <firstterm>instance</firstterm>,
+     not to a single <firstterm>database</firstterm>.
+    </para>
+    <para>
+     Shared Memory is organized in <firstterm>pages</firstterm>.
+     If such a page gets modified, she is called a
+     <firstterm>dirty page</firstterm> until she is written
+     back to the file system.
+    </para>
+   </glossdef>
+  </glossentry>
+
+  <glossentry id="glossary-postmaster">
+   <glossterm>Postmaster</glossterm>
+   <glossdef>
+    <para>
+     <link linkend="server-start">Postmaster</link> is the
+     name for the very first process of an
+     <firstterm>instance</firstterm>. He starts
+     the other processes and creates <firstterm>
+     backend processes</firstterm> on demand.
+    </para>
+   </glossdef>
+  </glossentry>
+
+  <glossentry id="glossary-backend-process">
+   <glossterm>Backend Process</glossterm>
+   <glossdef>
+    <para>
+     <link linkend="guc-max-connections">
+     Backend processes</link> are such processes of an
+     <firstterm>instance</firstterm>, which act
+     on behalf of client <firstterm>connections</firstterm>
+     and process their requests.
+    </para>
+    <para>
+     (Don't confuse the term with the similar terms
+     <firstterm>Background Writer</firstterm> or
+     <firstterm>Background Worker</firstterm>).
+    </para>
+   </glossdef>
+  </glossentry>
+
+  <glossentry id="glossary-connection">
+   <glossterm>Connection</glossterm>
+   <glossdef>
+    <para>
+     A connection is a <firstterm>TCP/IP</firstterm> or
+     <firstterm>socket</firstterm> line for inter-process
+     communication. If the two involved processes reside on
+     different servers, TCP/IP must be used. Otherwise both
+     techniques are possible.
+    </para>
+   </glossdef>
+  </glossentry>
+
+  <glossentry id="glossary-background-writer">
+   <glossterm>Background Writer</glossterm>
+   <glossdef>
+    <para>
+     The <link linkend="runtime-config-resource-background-writer">
+     Background Writer</link> process writes continuously dirty
+     pages from <firstterm>Shared Memory</firstterm> to the
+     file system. He starts periodically. But he works only for a
+     short period in order to distribute his expensive I/O activity
+     over time instead of generating few and huge I/O peaks, which
+     could block other processes.
+    </para>
+   </glossdef>
+  </glossentry>
+
+  <glossentry id="glossary-background-worker">
+   <glossterm>Background Worker</glossterm>
+   <glossdef>
+    <para>
+     <link linkend="bgworker">Background Workers</link> are
+     individual processes within an
+     <firstterm>instance</firstterm>, which run system- or
+     user-supplied code. A typically use case are processes
+     which handle parts of an SQL query to take advantage of parallel
+     execution on <firstterm>servers</firstterm> with multiple CPUs.
+    </para>
+   </glossdef>
+  </glossentry>
+
+  <glossentry id="glossary-wal-writer">
+   <glossterm>WAL Writer</glossterm>
+   <glossdef>
+    <para>
+     The <link linkend="runtime-config-wal">WAL writer</link>
+     process writes <firstterm>WAL records</firstterm>
+     from the <firstterm>Shared Memory</firstterm> to
+     <firstterm>WAL files</firstterm>.
+    </para>
+   </glossdef>
+  </glossentry>
+
+  <glossentry id="glossary-wal-record">
+   <glossterm>WAL Record (or: Log Record)</glossterm>
+   <glossdef>
+    <para>
+     A <link linkend="wal-internals">WAL record</link>
+     contains either new or changed heap or index
+     data or COMMIT, ROLLBACK, SAVEPOINT, or CHECKPOINT
+     information in binary format.
+    </para>
+   </glossdef>
+  </glossentry>
+
+  <glossentry id="glossary-wal-file">
+   <glossterm>WAL File (or: WAL Segment, or WAL Segment File or: WAL Log)</glossterm>
+   <glossdef>
+    <para>
+     <firstterm>WAL records</firstterm> are continously
+     written to the end of the current
+     <link linkend="wal-internals">WAL file</link>. Please notice,
+     that WAL files as well as <firstterm>WAL records</firstterm>
+     belong to the complete <firstterm>cluster</firstterm>,
+     not to a single <firstterm>database</firstterm>.
+     After a WAL file is full
+     (default: 16 MB), a new WAL file is created or
+     - under certain conditions - one of the previous WAL
+     files is renamed and reused.
+    </para>
+    <para>
+     The sequence of <firstterm>WAL records</firstterm>
+     in combination with the sequence of WAL files
+     represents the sequence of changes that have
+     taken place in the <firstterm>cluster</firstterm>
+     over time (???).
+    </para>
+   </glossdef>
+  </glossentry>
+
+  <glossentry id="glossary-segment">
+   <glossterm>File Segment (or: Segment)</glossterm>
+   <glossdef>
+    <para>
+      If a database file grows in size, he may be split into
+      multiple physical files. Those files are called
+      <link linkend="storage-file-layout">file segments</link>.
+    </para>
+    <para>
+     (Don't confuse the term with the similar term
+     <firstterm>WAL segment</firstterm>).
+    </para>
+   </glossdef>
+  </glossentry>
+
+  <glossentry id="glossary-archiver">
+   <glossterm>Archiver</glossterm>
+   <glossdef>
+    <para>
+     The <link linkend="backup-archiving-wal">archiver</link>
+     process copies <firstterm>WAL files</firstterm> to a
+     different place in the file system.
+    </para>
+   </glossdef>
+  </glossentry>
+
+  <glossentry id="glossary-checkpointer">
+   <glossterm>Checkpointer</glossterm>
+   <glossdef>
+    <para>
+     When reaching certain time- or volume-depending criterias
+     or when an SQL CHECKPOINT command is issued, the
+     <link linkend="runtime-config-wal">checkpointer</link>
+     process creates a <link linkend="sql-checkpoint">
+     Checkpoint</link>. He writes <firstterm>dirty
+     pages</firstterm> and <firstterm>WAL records</firstterm>
+     to the file system, and generates a special
+     <firstterm>Checkpoint record</firstterm>.
+    </para>
+   </glossdef>
+  </glossentry>
+
+  <glossentry id="glossary-checkpoint">
+   <glossterm>Checkpoint</glossterm>
+   <glossdef>
+    <para>
+     A <link linkend="sql-checkpoint">
+     Checkpoint</link>
+     is a point in time when all older dirty
+     pages of the <firstterm>Shared Memory</firstterm>,
+     all older <firstterm>WAL records</firstterm>, and a
+     special <firstterm>Checkpoint record</firstterm>
+     have been written and flushed to disk.
+    </para>
+   </glossdef>
+  </glossentry>
+
+  <glossentry id="glossary-savepoint">
+   <glossterm>Savepoint</glossterm>
+   <glossdef>
+    <para>
+     A <link linkend="sql-savepoint">savepoint</link>
+     is a special mark (like a timestamp) inside
+     a transaction. Data modifications after this point in time
+     may be rolled back to the time of the savepoint.
+    </para>
+   </glossdef>
+  </glossentry>
+
+  <glossentry id="glossary-data-directory">
+   <glossterm>Data Directory (or: Data Area)</glossterm>
+   <glossdef>
+    <para>
+     A <link linkend="creating-cluster">data directory</link>
+     is the root directory of a
+     <firstterm>cluster</firstterm> (see also:
+     <link linkend="app-postgres">PGDATA</link>).
+    </para>
+   </glossdef>
+  </glossentry>
+
+  <!-- no helpfull reference found  -->
+  <glossentry id="glossary-heap">
+   <glossterm>Heap</glossterm>
+   <glossdef>
+    <para>
+     A heap contains the original values of row attributes,
+     i.e. the data. The heap is realized within database files
+     and mirrored in <firstterm>Shared Memory</firstterm>.
+    </para>
+   </glossdef>
+  </glossentry>
+
+  <!-- no helpfull reference found  -->
+  <glossentry id="glossary-index">
+   <glossterm>Index</glossterm>
+   <glossdef>
+    <para>
+     An index consists of keys, which are copies of original
+     row attributes, and pointers to the location of this original
+     rows. Such key/value pairs are organized as a tree or a hash (???).
+     The index is realized within database files and mirrored in
+     <firstterm>Shared Memory</firstterm>.
+    </para>
+   </glossdef>
+  </glossentry>
+
+  <glossentry id="glossary-log-writer">
+   <glossterm>Log Writer</glossterm>
+   <glossdef>
+    <para>
+     If activated and parameterized, the
+     <link linkend="runtime-config-logging">Log Writer</link>
+     process writes information about database events into the
+     current <firstterm>Log file</firstterm>. When reaching
+     certain time- or volume-dependent criterias, he creates
+     a new <firstterm>Log file</firstterm>.
+    </para>
+   </glossdef>
+  </glossentry>
+
+  <glossentry id="glossary-log-file">
+   <glossterm>Log File</glossterm>
+   <glossdef>
+    <para>
+     <link linkend="logfile-maintenance">LOG files</link>
+     contain readable text lines about serious
+     and non-serious events, e.g.: use of
+     wrong password, long-running queries, ... .
+    </para>
+   </glossdef>
+  </glossentry>
+
+  <glossentry id="glossary-auto-vacuum">
+   <glossterm>AutoVacuum</glossterm>
+   <glossdef>
+    <para>
+     The <link linkend="routine-vacuuming">AutoVacuum</link>
+     processes remove outdated
+     MVCC records of the <firstterm>heap</firstterm>
+     and <firstterm>index</firstterm>.
+    </para>
+   </glossdef>
+  </glossentry>
+
+  <glossentry id="glossary-stats-collector">
+   <glossterm>Stats Collector</glossterm>
+   <glossdef>
+    <para>
+     The <link linkend="monitoring-stats">
+     Stats Collector</link> process collects
+     statistical information about the
+     <firstterm>cluster</firstterm> activities.
+    </para>
+   </glossdef>
+  </glossentry>
+
+<!-- ToDo:
+      WAL (LSN, logical decoding, ... )
+      MVCC
+      backup and recovery
+      replication
+-->
+
+ </glosslist>
+</appendix>
diff --git a/doc/src/sgml/images/cluster-db-schema-ink-svgo.svg b/doc/src/sgml/images/cluster-db-schema-ink-svgo.svg
new file mode 100644
index 0000000000..87bc87fd41
--- /dev/null
+++ b/doc/src/sgml/images/cluster-db-schema-ink-svgo.svg
@@ -0,0 +1,163 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="900" height="685" viewBox="0 0 900 685">
+  <title>
+    Server (Hardware, Container, or VM)
+  </title>
+  <style>
+    .text_normal,.text_small{font-style:normal;font-weight:400;font-family:&quot;Open Sans&quot;,sans-serif;fill:#000}.text_small{font-size:12px}.text_normal{font-size:16px}
+  </style>
+  <defs>
+    <symbol id="rectangles_special_0">
+      <rect width="225" height="155" rx="10" stroke="blue" fill="none"/>
+      <rect x="15" y="40" width="195" height="50" rx="10" stroke="blue" fill="none" stroke-dasharray="4 2"/>
+      <text class="text_normal" x="20" y="60">
+        schema &apos;public&apos;
+      </text>
+      <text class="text_small" x="20" y="80">
+        tables, views, ...
+      </text>
+      <rect x="15" y="105" width="195" height="30" rx="10" stroke="blue" fill="none" stroke-dasharray="4 2"/>
+      <text class="text_small" x="20" y="125">
+        (some more system schemas)
+      </text>
+    </symbol>
+    <symbol id="rectangles_special_1">
+      <rect width="245" height="225" rx="10" stroke="blue" fill="none"/>
+      <rect x="15" y="40" width="205" height="50" rx="10" stroke="blue" fill="none" stroke-dasharray="4 2"/>
+      <text class="text_normal" x="20" y="60">
+        schema &apos;public&apos;
+      </text>
+      <text class="text_small" x="20" y="80">
+        tables, views, ...
+      </text>
+      <rect x="15" y="105" width="205" height="50" rx="10" stroke="blue" fill="none" stroke-dasharray="4 2"/>
+      <text class="text_normal" x="20" y="125">
+        &apos;my_schema&apos; (optional)
+      </text>
+      <text class="text_small" x="20" y="145">
+        tables, views, ...
+      </text>
+      <rect x="15" y="170" width="205" height="30" rx="10" stroke="blue" fill="none" stroke-dasharray="4 2"/>
+      <text class="text_small" x="20" y="190">
+        (some more system schemas)
+      </text>
+    </symbol>
+    <symbol id="note" stroke="black" fill="lightyellow">
+      <title>
+        UML Note
+      </title>
+      <path d="M450 10v230H0V0h440v10h10L440 0"/>
+    </symbol>
+    <marker id="arrowhead_end" markerWidth="10" markerHeight="10" refX="6" refY="3" orient="auto">
+      <path d="M0 0l6 3-6 3" stroke="black" fill="none"/>
+    </marker>
+  </defs>
+  <rect x="1" y="1" rx="5" width="99%" height="99%" stroke="black" fill="none"/>
+  <text x="270" y="40" font-weight="400" font-size="24" font-family="&quot;Open Sans&quot;,sans-serif">
+    Server (Hardware, Container, or VM)
+  </text>
+  <path stroke="blue" stroke-width="2" fill="none" d="M20 110h790v555H20z"/>
+  <text class="text_normal" x="180" y="25" transform="translate(20 110)">
+    cluster &apos;data&apos; (default, managed by one instance)
+  </text>
+  <path d="M50 110V80h790v555h-30" stroke="blue" stroke-width="2" fill="none"/>
+  <text class="text_normal" x="190" y="-10" transform="translate(45 110)">
+    cluster &apos;cluster_2&apos; (optional, managed by a different instance)
+  </text>
+  <g transform="translate(40 155)">
+    <use xlink:href="#rectangles_special_0"/>
+    <text class="text_normal" x="10" y="25">
+      database &apos;template0&apos;
+    </text>
+  </g>
+  <g transform="translate(290 155)">
+    <use xlink:href="#rectangles_special_0"/>
+    <text class="text_normal" x="10" y="25">
+      database &apos;template1&apos;
+    </text>
+  </g>
+  <g transform="translate(540 155)">
+    <use xlink:href="#rectangles_special_1"/>
+    <text class="text_normal" x="10" y="25">
+      database &apos;postgres&apos;
+    </text>
+  </g>
+  <g transform="translate(40 350)">
+    <use xlink:href="#rectangles_special_1"/>
+    <text class="text_normal" x="10" y="25">
+      database &apos;my_db&apos; (optional)
+    </text>
+  </g>
+  <g transform="translate(320 330)">
+    <rect width="180" height="45" rx="10" stroke="blue" fill="none" stroke-dasharray="10 4 4 4"/>
+    <text class="text_normal" x="10" y="20">
+      Global SQL objects:
+    </text>
+    <text class="text_small" x="10" y="35">
+      databases,tablespaces, roles
+    </text>
+    <path d="M0 5l-65-35" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+    <path d="M80 0v-30" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+    <path d="M180 40h50" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+    <path d="M0 40l-45 20" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+  </g>
+  <g transform="translate(335 405)">
+    <use xlink:href="#note"/>
+    <text class="text_small" x="10" y="20">
+      1)
+    </text>
+    <text class="text_small" x="30" y="20">
+      By default, you work in the cluster &apos;data&apos;, database &apos;postgres&apos;,
+    </text>
+    <text class="text_small" x="30" y="35">
+      schema &apos;public&apos;.
+    </text>
+    <text class="text_small" x="10" y="55">
+      2)
+    </text>
+    <text class="text_small" x="30" y="55">
+      More system schemas: pg_catalog, information_schema,
+    </text>
+    <text class="text_small" x="30" y="70">
+      pg_temp, pg_toast.
+    </text>
+    <text class="text_small" x="10" y="90">
+      3)
+    </text>
+    <text class="text_small" x="30" y="90">
+      Global SQL objects: information about databases, tablespaces,
+    </text>
+    <text class="text_small" x="30" y="105">
+      and roles are automatically known cluster-wide.
+    </text>
+    <text class="text_small" x="10" y="125">
+      4)
+    </text>
+    <text class="text_small" x="30" y="125">
+      The command &apos;initdb&apos; creates a new cluster with the three
+    </text>
+    <text class="text_small" x="30" y="140">
+      databases &apos;template0&apos;, &apos;template1&apos;, and &apos;postgres&apos;. The command
+    </text>
+    <text class="text_small" x="30" y="155">
+      &apos;createdb&apos; creates a new database.
+    </text>
+    <text class="text_small" x="10" y="175">
+      5)
+    </text>
+    <text class="text_small" x="30" y="175">
+      If multiple clusters are active on one server at the same time,
+    </text>
+    <text class="text_small" x="30" y="190">
+      each one is managed by an individual instance. Each such instance
+    </text>
+    <text class="text_small" x="30" y="205">
+      uses a different port.
+    </text>
+    <text class="text_small" x="10" y="225">
+      6)
+    </text>
+    <text class="text_small" x="30" y="225">
+      No client application is allowed to connect to &apos;template0&apos;.
+    </text>
+  </g>
+</svg>
diff --git a/doc/src/sgml/images/cluster-db-schema-ink.svg b/doc/src/sgml/images/cluster-db-schema-ink.svg
new file mode 100644
index 0000000000..a0b153c144
--- /dev/null
+++ b/doc/src/sgml/images/cluster-db-schema-ink.svg
@@ -0,0 +1,487 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   width="900px"
+   height="685px"
+   viewBox="0 0 900 685"
+   id="svg149"
+   sodipodi:docname="cluster-db-schema-ink.svg"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)">
+  <metadata
+     id="metadata153">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title>Server (Hardware, Container, or VM)</dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="659"
+     inkscape:window-height="480"
+     id="namedview151"
+     showgrid="false"
+     inkscape:zoom="0.34452555"
+     inkscape:cx="450"
+     inkscape:cy="342.5"
+     inkscape:window-x="61"
+     inkscape:window-y="27"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg149" />
+  <title
+     id="title2">Server (Hardware, Container, or VM)</title>
+  <!-- common text classes -->
+  <style
+     type="text/css"
+     id="style4">
+  .text_small   {font-style:normal;
+                 font-weight:normal;
+                 font-size:12px;
+                 font-family:&quot;Open Sans&quot;, sans-serif;
+                 fill:black;
+                }
+  .text_normal  {font-style:normal;
+                 font-weight:normal;
+                 font-size:16px;
+                 font-family:&quot;Open Sans&quot;, sans-serif;
+                 fill:black;
+                }
+  .text_big     {font-style:normal;
+                 font-weight:normal;
+                 font-size:24px;
+                 font-family:&quot;Open Sans&quot;, sans-serif;
+                 fill:black;
+                }
+  </style>
+  <defs
+     id="defs49">
+    <!--  a rectangle with rounded corners and inner definitions for schemas  -->
+    <symbol
+       id="rectangles_special_0">
+      <!--  the database  -->
+      <rect
+         width="225"
+         height="155"
+         rx="10"
+         stroke="blue"
+         fill="none"
+         id="rect6" />
+      <!--  schemas  -->
+      <rect
+         x="15"
+         y="40"
+         width="195"
+         height="50"
+         rx="10"
+         stroke="blue"
+         fill="none"
+         stroke-dasharray="4 2"
+         id="rect8" />
+      <text
+         class="text_normal"
+         x="20"
+         y="60"
+         id="text10">schema 'public'</text>
+      <text
+         class="text_small"
+         x="20"
+         y="80"
+         id="text12">tables, views, ...</text>
+      <rect
+         x="15"
+         y="105"
+         width="195"
+         height="30"
+         rx="10"
+         stroke="blue"
+         fill="none"
+         stroke-dasharray="4 2"
+         id="rect14" />
+      <text
+         class="text_small"
+         x="20"
+         y="125"
+         id="text16">(some more system schemas)</text>
+    </symbol>
+    <!--  same as before, but one more schema  -->
+    <symbol
+       id="rectangles_special_1">
+      <!--  the database  -->
+      <rect
+         width="245"
+         height="225"
+         rx="10"
+         stroke="blue"
+         fill="none"
+         id="rect19" />
+      <!--  schemas  -->
+      <rect
+         x="15"
+         y="40"
+         width="205"
+         height="50"
+         rx="10"
+         stroke="blue"
+         fill="none"
+         stroke-dasharray="4 2"
+         id="rect21" />
+      <text
+         class="text_normal"
+         x="20"
+         y="60"
+         id="text23">schema 'public'</text>
+      <text
+         class="text_small"
+         x="20"
+         y="80"
+         id="text25">tables, views, ...</text>
+      <rect
+         x="15"
+         y="105"
+         width="205"
+         height="50"
+         rx="10"
+         stroke="blue"
+         fill="none"
+         stroke-dasharray="4 2"
+         id="rect27" />
+      <text
+         class="text_normal"
+         x="20"
+         y="125"
+         id="text29">'my_schema' (optional)</text>
+      <text
+         class="text_small"
+         x="20"
+         y="145"
+         id="text31">tables, views, ...</text>
+      <rect
+         x="15"
+         y="170"
+         width="205"
+         height="30"
+         rx="10"
+         stroke="blue"
+         fill="none"
+         stroke-dasharray="4 2"
+         id="rect33" />
+      <text
+         class="text_small"
+         x="20"
+         y="190"
+         id="text35">(some more system schemas)</text>
+    </symbol>
+    <symbol
+       id="note"
+       stroke="black"
+       fill="lightyellow">
+      <title
+         id="title38">UML Note</title>
+      <path
+         d="M 450,10 v 230 h -450 v -240 h 440 v 10 h 10 l -10,-10"
+         id="path40" />
+    </symbol>
+    <!--  marker start/end -->
+    <marker
+       id="arrowhead_start"
+       markerWidth="10"
+       markerHeight="10"
+       refX="0"
+       refY="3"
+       orient="auto">
+      <path
+         d="M 6,0 l -6,3 l 6,3"
+         stroke="black"
+         fill="none"
+         id="path43" />
+    </marker>
+    <marker
+       id="arrowhead_end"
+       markerWidth="10"
+       markerHeight="10"
+       refX="6"
+       refY="3"
+       orient="auto">
+      <path
+         d="M 0,0 l 6,3 l -6,3"
+         stroke="black"
+         fill="none"
+         id="path46" />
+    </marker>
+  </defs>
+  <!--  start of rendering area  -->
+  <!--  enclosing rectangle  -->
+  <rect
+     x="1"
+     y="1"
+     rx="5"
+     width="99%"
+     height="99%"
+     stroke="black"
+     fill="none"
+     id="rect51" />
+  <text
+     class="text_big"
+     x="270"
+     y="40"
+     id="text53">Server (Hardware, Container, or VM)</text>
+  <!--  two clusters  -->
+  <g
+     transform="translate(20 110)"
+     id="g59">
+    <rect
+       x="0"
+       y="0"
+       width="790"
+       height="555"
+       stroke="blue"
+       stroke-width="2px"
+       fill="none"
+       id="rect55" />
+    <text
+       class="text_normal"
+       x="180"
+       y="25"
+       id="text57">cluster 'data' (default, managed by one instance)</text>
+  </g>
+  <g
+     transform="translate(45 110)"
+     id="g65">
+    <path
+       d="M 5,0 v -30 h 790 v 555 h -30"
+       stroke="blue"
+       stroke-width="2px"
+       fill="none"
+       id="path61" />
+    <text
+       class="text_normal"
+       x="190"
+       y="-10"
+       id="text63">cluster 'cluster_2' (optional, managed by a different instance)</text>
+  </g>
+  <!--  database template 0  -->
+  <g
+     transform="translate(40 155)"
+     id="g71">
+    <use
+       xlink:href="#rectangles_special_0"
+       id="use67" />
+    <text
+       class="text_normal"
+       x="10"
+       y="25"
+       id="text69">database 'template0'</text>
+  </g>
+  <!--  database template 1  -->
+  <g
+     transform="translate(290 155)"
+     id="g77">
+    <use
+       xlink:href="#rectangles_special_0"
+       id="use73" />
+    <text
+       class="text_normal"
+       x="10"
+       y="25"
+       id="text75">database 'template1'</text>
+  </g>
+  <!--  database postgres  -->
+  <g
+     transform="translate(540 155)"
+     id="g83">
+    <use
+       xlink:href="#rectangles_special_1"
+       id="use79" />
+    <text
+       class="text_normal"
+       x="10"
+       y="25"
+       id="text81">database 'postgres'</text>
+  </g>
+  <!--  database my_db  -->
+  <g
+     transform="translate(40 350)"
+     id="g89">
+    <use
+       xlink:href="#rectangles_special_1"
+       id="use85" />
+    <text
+       class="text_normal"
+       x="10"
+       y="25"
+       id="text87">database 'my_db' (optional)</text>
+  </g>
+  <!--  global objects  -->
+  <g
+     transform="translate(320 330)"
+     id="g105">
+    <rect
+       x="0"
+       y="0"
+       width="180"
+       height="45"
+       rx="10"
+       stroke="blue"
+       fill="none"
+       stroke-dasharray="10 4 4 4"
+       id="rect91" />
+    <text
+       class="text_normal"
+       x="10"
+       y="20"
+       id="text93">Global SQL objects:</text>
+    <text
+       class="text_small"
+       x="10"
+       y="35"
+       id="text95">databases,tablespaces, roles</text>
+    <path
+       d="M 0,5 l-65,-35"
+       stroke="black"
+       fill="none"
+       marker-end="url(#arrowhead_end)"
+       id="path97" />
+    <path
+       d="M 80,0 v-30"
+       stroke="black"
+       fill="none"
+       marker-end="url(#arrowhead_end)"
+       id="path99" />
+    <path
+       d="M 180,40 h50"
+       stroke="black"
+       fill="none"
+       marker-end="url(#arrowhead_end)"
+       id="path101" />
+    <path
+       d="M 0,40 l-45,20"
+       stroke="black"
+       fill="none"
+       marker-end="url(#arrowhead_end)"
+       id="path103" />
+  </g>
+  <!--  Some comments  -->
+  <g
+     transform="translate(335 405)"
+     id="g147">
+    <use
+       xlink:href="#note"
+       x="0"
+       y="0"
+       id="use107" />
+    <text
+       class="text_small"
+       x="10"
+       y="20"
+       id="text109">1)</text>
+    <text
+       class="text_small"
+       x="30"
+       y="20"
+       id="text111">By default, you work in the cluster 'data', database 'postgres',</text>
+    <text
+       class="text_small"
+       x="30"
+       y="35"
+       id="text113">schema 'public'.</text>
+    <text
+       class="text_small"
+       x="10"
+       y="55"
+       id="text115">2)</text>
+    <text
+       class="text_small"
+       x="30"
+       y="55"
+       id="text117">More system schemas: pg_catalog, information_schema,</text>
+    <text
+       class="text_small"
+       x="30"
+       y="70"
+       id="text119">pg_temp, pg_toast.</text>
+    <text
+       class="text_small"
+       x="10"
+       y="90"
+       id="text121">3)</text>
+    <text
+       class="text_small"
+       x="30"
+       y="90"
+       id="text123">Global SQL objects: information about databases, tablespaces,</text>
+    <text
+       class="text_small"
+       x="30"
+       y="105"
+       id="text125">and roles are automatically known cluster-wide.</text>
+    <text
+       class="text_small"
+       x="10"
+       y="125"
+       id="text127">4)</text>
+    <text
+       class="text_small"
+       x="30"
+       y="125"
+       id="text129">The command 'initdb' creates a new cluster with the three</text>
+    <text
+       class="text_small"
+       x="30"
+       y="140"
+       id="text131">databases 'template0', 'template1', and 'postgres'. The command</text>
+    <text
+       class="text_small"
+       x="30"
+       y="155"
+       id="text133">'createdb' creates a new database.</text>
+    <text
+       class="text_small"
+       x="10"
+       y="175"
+       id="text135">5)</text>
+    <text
+       class="text_small"
+       x="30"
+       y="175"
+       id="text137">If multiple clusters are active on one server at the same time,</text>
+    <text
+       class="text_small"
+       x="30"
+       y="190"
+       id="text139">each one is managed by an individual instance. Each such instance</text>
+    <text
+       class="text_small"
+       x="30"
+       y="205"
+       id="text141">uses a different port.</text>
+    <text
+       class="text_small"
+       x="10"
+       y="225"
+       id="text143">6)</text>
+    <text
+       class="text_small"
+       x="30"
+       y="225"
+       id="text145">No client application is allowed to connect to 'template0'.</text>
+  </g>
+</svg>
diff --git a/doc/src/sgml/images/cluster-db-schema-raw.svg b/doc/src/sgml/images/cluster-db-schema-raw.svg
new file mode 100644
index 0000000000..5be10717eb
--- /dev/null
+++ b/doc/src/sgml/images/cluster-db-schema-raw.svg
@@ -0,0 +1,174 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     version="1.1"
+     width="900px" height="685px"
+     viewBox="0 0 900 685" >
+
+  <title>Server (Hardware, Container, or VM)</title>
+
+  <!-- common text classes -->
+  <style type="text/css">
+  .text_small   {font-style:normal;
+                 font-weight:normal;
+                 font-size:12px;
+                 font-family:"Open Sans", sans-serif;
+                 fill:black;
+                }
+  .text_normal  {font-style:normal;
+                 font-weight:normal;
+                 font-size:16px;
+                 font-family:"Open Sans", sans-serif;
+                 fill:black;
+                }
+  .text_big     {font-style:normal;
+                 font-weight:normal;
+                 font-size:24px;
+                 font-family:"Open Sans", sans-serif;
+                 fill:black;
+                }
+  </style>
+
+  <defs>
+    <!--  a rectangle with rounded corners and inner definitions for schemas  -->
+    <symbol id="rectangles_special_0">
+
+      <!--  the database  -->
+      <rect width="225" height="155" rx="10" stroke="blue" fill="none"/>
+
+      <!--  schemas  -->
+      <rect x="15" y="40" width="195" height="50" rx="10" stroke="blue" fill="none" stroke-dasharray="4 2" />
+      <text class="text_normal" x="20" y="60">schema 'public'</text>
+      <text class="text_small"  x="20" y="80">tables, views, ...</text>
+
+      <rect x="15" y="105" width="195" height="30" rx="10" stroke="blue" fill="none" stroke-dasharray="4 2" />
+      <text class="text_small"  x="20" y="125">(some more system schemas)</text>
+    </symbol>
+
+    <!--  same as before, but one more schema  -->
+    <symbol id="rectangles_special_1">
+      <!--  the database  -->
+      <rect width="245" height="225" rx="10" stroke="blue" fill="none"/>
+
+      <!--  schemas  -->
+      <rect x="15" y="40" width="205" height="50" rx="10" stroke="blue" fill="none" stroke-dasharray="4 2" />
+      <text class="text_normal" x="20" y="60">schema 'public'</text>
+      <text class="text_small"  x="20" y="80">tables, views, ...</text>
+
+      <rect x="15" y="105" width="205" height="50" rx="10" stroke="blue" fill="none" stroke-dasharray="4 2" />
+      <text class="text_normal" x="20" y="125">'my_schema' (optional)</text>
+      <text class="text_small"  x="20" y="145">tables, views, ...</text>
+
+      <rect x="15" y="170" width="205" height="30" rx="10" stroke="blue" fill="none" stroke-dasharray="4 2" />
+      <text class="text_small"  x="20" y="190">(some more system schemas)</text>
+    </symbol>
+
+    <symbol id="note" stroke="black" fill="lightyellow">
+      <title>UML Note</title>
+      <path d="M 450,10 v 230 h -450 v -240 h 440 v 10 h 10 l -10,-10" />
+    </symbol>
+
+    <!--  marker start/end -->
+    <marker id="arrowhead_start"
+            markerWidth="10"
+            markerHeight="10"
+            refX="0"
+            refY="3"
+            orient="auto">
+      <path d="M 6,0 l -6,3 l 6,3" stroke="black" fill="none" />
+    </marker>
+    <marker id="arrowhead_end"
+            markerWidth="10"
+            markerHeight="10"
+            refX="6"
+            refY="3"
+            orient="auto">
+      <path d="M 0,0 l 6,3 l -6,3" stroke="black" fill="none" />
+    </marker>
+
+  </defs>
+
+
+  <!--  start of rendering area  -->
+  <!--  enclosing rectangle  -->
+  <rect x="1" y="1" rx="5" width="99%" height="99%" stroke="black" fill="none" />
+  <text class="text_big" x="270" y="40">Server (Hardware, Container, or VM)</text>
+
+  <!--  two clusters  -->
+  <g transform="translate(20 110)">
+    <rect  x="0" y="0" width="790" height="555" stroke="blue" stroke-width="2px" fill="none" />
+    <text class="text_normal" x="180" y="25">cluster 'data' (default, managed by one instance)</text>
+  </g>
+  <g transform="translate(45 110)">
+    <path d="M 5,0 v -30 h 790 v 555 h -30" stroke="blue" stroke-width="2px" fill="none" />
+    <text class="text_normal" x="190" y="-10">cluster 'cluster_2' (optional, managed by a different instance)</text>
+  </g>
+
+
+  <!--  database template 0  -->
+  <g transform="translate(40 155)">
+    <use xlink:href="#rectangles_special_0" />
+    <text class="text_normal" x="10" y="25">database 'template0'</text>
+  </g>
+
+  <!--  database template 1  -->
+  <g transform="translate(290 155)">
+    <use xlink:href="#rectangles_special_0" />
+    <text class="text_normal" x="10" y="25">database 'template1'</text>
+  </g>
+
+  <!--  database postgres  -->
+  <g transform="translate(540 155)">
+    <use xlink:href="#rectangles_special_1" />
+    <text class="text_normal" x="10" y="25">database 'postgres'</text>
+  </g>
+
+  <!--  database my_db  -->
+  <g transform="translate(40 350)">
+    <use xlink:href="#rectangles_special_1" />
+    <text class="text_normal" x="10" y="25">database 'my_db' (optional)</text>
+  </g>
+
+  <!--  global objects  -->
+  <g transform="translate(320 330)">
+    <rect x="0" y="0" width="180" height="45" rx="10" stroke="blue" fill="none" stroke-dasharray="10 4 4 4" />
+    <text class="text_normal" x="10" y="20">Global SQL objects:</text>
+    <text class="text_small"  x="10" y="35">databases,tablespaces, roles</text>
+    <path d="M 0,5 l-65,-35" stroke="black" fill="none" marker-end="url(#arrowhead_end)" />
+    <path d="M 80,0 v-30" stroke="black" fill="none" marker-end="url(#arrowhead_end)" />
+    <path d="M 180,40 h50" stroke="black" fill="none" marker-end="url(#arrowhead_end)" />
+    <path d="M 0,40 l-45,20" stroke="black" fill="none" marker-end="url(#arrowhead_end)" />
+  </g>
+
+  <!--  Some comments  -->
+  <g transform="translate(335 405)">
+    <use xlink:href="#note" x="0" y="0" />
+
+    <text class="text_small" x="10" y="20">1)</text>
+    <text class="text_small" x="30" y="20">By default, you work in the cluster 'data', database 'postgres',</text>
+    <text class="text_small" x="30" y="35">schema 'public'.</text>
+
+    <text class="text_small" x="10" y="55">2)</text>
+    <text class="text_small" x="30" y="55">More system schemas: pg_catalog, information_schema,</text>
+    <text class="text_small" x="30" y="70">pg_temp, pg_toast.</text>
+
+    <text class="text_small" x="10" y="90">3)</text>
+    <text class="text_small" x="30" y="90">Global SQL objects: information about databases, tablespaces,</text>
+    <text class="text_small" x="30" y="105">and roles are automatically known cluster-wide.</text>
+
+    <text class="text_small" x="10" y="125">4)</text>
+    <text class="text_small" x="30" y="125">The command 'initdb' creates a new cluster with the three</text>
+    <text class="text_small" x="30" y="140">databases 'template0', 'template1', and 'postgres'. The command</text>
+    <text class="text_small" x="30" y="155">'createdb' creates a new database.</text>
+
+    <text class="text_small" x="10" y="175">5)</text>
+    <text class="text_small" x="30" y="175">If multiple clusters are active on one server at the same time,</text>
+    <text class="text_small" x="30" y="190">each one is managed by an individual instance. Each such instance</text>
+    <text class="text_small" x="30" y="205">uses a different port.</text>
+
+    <text class="text_small" x="10" y="225">6)</text>
+    <text class="text_small" x="30" y="225">No client application is allowed to connect to 'template0'.</text>
+
+  </g>
+
+</svg>
diff --git a/doc/src/sgml/images/directories-ink-svgo.svg b/doc/src/sgml/images/directories-ink-svgo.svg
new file mode 100644
index 0000000000..eb5a78e3a0
--- /dev/null
+++ b/doc/src/sgml/images/directories-ink-svgo.svg
@@ -0,0 +1,164 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="900" height="640" viewBox="0 0 900 640">
+  <title>
+    Directory structure of a cluster
+  </title>
+  <style>
+    .text_normal{font-style:normal;font-weight:400;font-size:16px;font-family:&quot;Open Sans&quot;,sans-serif;fill:#000}
+  </style>
+  <defs>
+    <symbol id="directory" stroke="blue" stroke-width=".3" fill="aqua">
+      <title>
+        Directory
+      </title>
+      <path d="M0 10h110v20H0z"/>
+      <path d="M0 10V8l3-3h35l3 3v2"/>
+    </symbol>
+    <symbol id="file" stroke="black" fill="none">
+      <title>
+        File
+      </title>
+      <path stroke="blue" d="M0 0h40v50H0z"/>
+      <path d="M5 10h20" stroke-dasharray="4 2"/>
+      <path d="M5 17h15" stroke-dasharray="6 2"/>
+      <path d="M5 24h25" stroke-dasharray="4 2"/>
+      <path d="M5 31h20" stroke-dasharray="5 2"/>
+    </symbol>
+  </defs>
+  <rect x="1" y="1" rx="5" width="99%" height="99%" stroke="black" fill="none"/>
+  <text x="50" y="50" font-weight="400" font-size="24" font-family="&quot;Open Sans&quot;,sans-serif">
+    Directory structure for storing durable and fluctuating information
+  </text>
+  <g transform="translate(20 100)">
+    <use xlink:href="#directory"/>
+    <text x="10" y="26" class="text_normal">
+      ... /pg/
+    </text>
+    <text x="300" y="26" class="text_normal">
+      An arbitrary directory
+    </text>
+  </g>
+  <g transform="translate(70 130)">
+    <use xlink:href="#directory"/>
+    <text x="10" y="26" class="text_normal">
+      data/
+    </text>
+    <text x="250" y="26" class="text_normal">
+      Root of cluster &apos;data&apos; (see: PGDATA)
+    </text>
+  </g>
+  <g transform="translate(120 160)">
+    <use xlink:href="#directory"/>
+    <text x="10" y="26" class="text_normal">
+      base/
+    </text>
+    <text x="200" y="26" class="text_normal">
+      Subdirectory containing per-database subdirectories
+    </text>
+  </g>
+  <g transform="translate(170 190)">
+    <use xlink:href="#directory"/>
+    <text x="10" y="26" class="text_normal">
+      1/
+    </text>
+    <text x="150" y="26" class="text_normal">
+      Subdirectory for data of first database &apos;template0&apos;
+    </text>
+  </g>
+  <g transform="translate(170 220)">
+    <use xlink:href="#directory"/>
+    <text x="10" y="26" class="text_normal">
+      12992/
+    </text>
+    <text x="150" y="26" class="text_normal">
+      Subdirectory for data of second database &apos;template1&apos;
+    </text>
+  </g>
+  <g transform="translate(170 250)">
+    <use xlink:href="#directory"/>
+    <text x="10" y="26" class="text_normal">
+      12999/
+    </text>
+    <text x="150" y="26" class="text_normal">
+      Subdirectory for data of third database &apos;postgres&apos;
+    </text>
+  </g>
+  <g transform="translate(170 280)">
+    <use xlink:href="#directory"/>
+    <text x="10" y="26" class="text_normal">
+      nnnnn/
+    </text>
+    <text x="150" y="26" class="text_normal">
+      Optional: more subdirectories for databases, e.g. &apos;my_db&apos;
+    </text>
+  </g>
+  <g transform="translate(120 310)">
+    <use xlink:href="#directory"/>
+    <text x="10" y="26" class="text_normal">
+      global/
+    </text>
+    <text x="200" y="26" class="text_normal">
+      Subdirectory for Global SQL Objects (database, tablespace, role)
+    </text>
+  </g>
+  <g transform="translate(120 340)">
+    <use xlink:href="#directory"/>
+    <text x="10" y="26" class="text_normal">
+      pg_wal/
+    </text>
+    <text x="200" y="26" class="text_normal">
+      Subdirectory for Write Ahead Log files (&apos;pg_xlog&apos; before version 10)
+    </text>
+  </g>
+  <g transform="translate(120 370)">
+    <use xlink:href="#directory"/>
+    <text x="10" y="26" class="text_normal">
+      pg_xact/
+    </text>
+    <text x="200" y="26" class="text_normal">
+      Subdirectory for transaction commit status (&apos;pg_clog&apos; before version 10)
+    </text>
+  </g>
+  <g transform="translate(120 400)">
+    <use xlink:href="#directory"/>
+    <text x="10" y="26" class="text_normal">
+      pg_tblspc/
+    </text>
+    <text x="200" y="26" class="text_normal">
+      Subdirectory containing symbolic links to tablespaces
+    </text>
+  </g>
+  <g transform="translate(120 430)">
+    <use xlink:href="#directory"/>
+    <text x="10" y="26" class="text_normal">
+      pg_... /
+    </text>
+    <text x="200" y="26" class="text_normal">
+      Some more subdirectories
+    </text>
+  </g>
+  <g transform="translate(120 465)">
+    <use xlink:href="#file"/>
+    <use xlink:href="#file" x="50"/>
+    <text x="200" y="26" class="text_normal">
+      &apos;postmaster.pid&apos; and other files with cluster-wide relevance
+    </text>
+  </g>
+  <g transform="translate(20 540)">
+    <use xlink:href="#directory"/>
+    <text x="10" y="26" class="text_normal">
+      ... /xyz/
+    </text>
+    <text x="300" y="26" class="text_normal">
+      Same or another arbitrary directory
+    </text>
+  </g>
+  <g transform="translate(70 570)">
+    <use xlink:href="#directory"/>
+    <text x="10" y="26" class="text_normal">
+      cluster_2/
+    </text>
+    <text x="250" y="26" class="text_normal">
+      Root of another cluster &apos;cluster_2&apos;
+    </text>
+  </g>
+</svg>
diff --git a/doc/src/sgml/images/directories-ink.svg b/doc/src/sgml/images/directories-ink.svg
new file mode 100644
index 0000000000..889b0413f1
--- /dev/null
+++ b/doc/src/sgml/images/directories-ink.svg
@@ -0,0 +1,397 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   width="900px"
+   height="640px"
+   viewBox="0 0 900 640"
+   id="svg152"
+   sodipodi:docname="directories-ink.svg"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)">
+  <metadata
+     id="metadata156">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title>Directory structure of a cluster</dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="659"
+     inkscape:window-height="480"
+     id="namedview154"
+     showgrid="false"
+     inkscape:zoom="0.36875"
+     inkscape:cx="450"
+     inkscape:cy="320"
+     inkscape:window-x="61"
+     inkscape:window-y="27"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg152" />
+  <title
+     id="title2">Directory structure of a cluster</title>
+  <style
+     type="text/css"
+     id="style4">
+  .text_normal  {font-style:normal;
+                 font-weight:normal;
+                 font-size:16px;
+                 font-family:&quot;Open Sans&quot;, sans-serif;
+                 fill:black;
+                }
+  .text_big     {font-style:normal;
+                 font-weight:normal;
+                 font-size:24px;
+                 font-family:&quot;Open Sans&quot;, sans-serif;
+                 fill:black;
+                }
+  </style>
+  <defs
+     id="defs26">
+    <!--  Directory  -->
+    <symbol
+       id="directory"
+       stroke="blue"
+       stroke-width="0.3px"
+       fill="aqua">
+      <title
+         id="title6">Directory</title>
+      <rect
+         x="0"
+         y="10"
+         width="110"
+         height="20"
+         id="rect8" />
+      <path
+         d="M 0,10 l 0,-2 3,-3 35,0, 3,3  0,2"
+         id="path10" />
+    </symbol>
+    <!--  File  -->
+    <symbol
+       id="file"
+       stroke="black"
+       fill="none">
+      <title
+         id="title13">File</title>
+      <rect
+         x="0"
+         y="0"
+         width="40"
+         height="50"
+         stroke="blue"
+         id="rect15" />
+      <path
+         d="M 5,10 h 20"
+         stroke-dasharray="4 2"
+         id="path17" />
+      <path
+         d="M 5,17 h 15"
+         stroke-dasharray="6 2"
+         id="path19" />
+      <path
+         d="M 5,24 h 25"
+         stroke-dasharray="4 2"
+         id="path21" />
+      <path
+         d="M 5,31 h 20"
+         stroke-dasharray="5 2"
+         id="path23" />
+    </symbol>
+  </defs>
+  <!--  start of rendering area  -->
+  <!--  enclosing rectangle  -->
+  <rect
+     x="1"
+     y="1"
+     rx="5"
+     width="99%"
+     height="99%"
+     stroke="black"
+     fill="none"
+     id="rect28" />
+  <!--  caption  -->
+  <text
+     x="50"
+     y="50"
+     class="text_big"
+     id="text30">Directory structure for storing durable and fluctuating information</text>
+  <!--  the directories  -->
+  <g
+     transform="translate(20, 100)"
+     id="g38">
+    <use
+       xlink:href="#directory"
+       id="use32" />
+    <text
+       x="10"
+       y="26"
+       class="text_normal"
+       id="text34">... /pg/</text>
+    <text
+       x="300"
+       y="26"
+       class="text_normal"
+       id="text36">An arbitrary directory</text>
+  </g>
+  <g
+     transform="translate(70, 130)"
+     id="g46">
+    <use
+       xlink:href="#directory"
+       id="use40" />
+    <text
+       x="10"
+       y="26"
+       class="text_normal"
+       id="text42">data/</text>
+    <text
+       x="250"
+       y="26"
+       class="text_normal"
+       id="text44">Root of cluster 'data' (see: PGDATA)</text>
+  </g>
+  <g
+     transform="translate(120, 160)"
+     id="g54">
+    <use
+       xlink:href="#directory"
+       id="use48" />
+    <text
+       x="10"
+       y="26"
+       class="text_normal"
+       id="text50">base/</text>
+    <text
+       x="200"
+       y="26"
+       class="text_normal"
+       id="text52">Subdirectory containing per-database subdirectories</text>
+  </g>
+  <!--  -->
+  <g
+     transform="translate(170, 190)"
+     id="g62">
+    <use
+       xlink:href="#directory"
+       id="use56" />
+    <text
+       x="10"
+       y="26"
+       class="text_normal"
+       id="text58">1/</text>
+    <text
+       x="150"
+       y="26"
+       class="text_normal"
+       id="text60">Subdirectory for data of first database 'template0'</text>
+  </g>
+  <g
+     transform="translate(170, 220)"
+     id="g70">
+    <use
+       xlink:href="#directory"
+       id="use64" />
+    <text
+       x="10"
+       y="26"
+       class="text_normal"
+       id="text66">12992/</text>
+    <text
+       x="150"
+       y="26"
+       class="text_normal"
+       id="text68">Subdirectory for data of second database 'template1'</text>
+  </g>
+  <g
+     transform="translate(170, 250)"
+     id="g78">
+    <use
+       xlink:href="#directory"
+       id="use72" />
+    <text
+       x="10"
+       y="26"
+       class="text_normal"
+       id="text74">12999/</text>
+    <text
+       x="150"
+       y="26"
+       class="text_normal"
+       id="text76">Subdirectory for data of third database 'postgres'</text>
+  </g>
+  <g
+     transform="translate(170, 280)"
+     id="g86">
+    <use
+       xlink:href="#directory"
+       id="use80" />
+    <text
+       x="10"
+       y="26"
+       class="text_normal"
+       id="text82">nnnnn/</text>
+    <text
+       x="150"
+       y="26"
+       class="text_normal"
+       id="text84">Optional: more subdirectories for databases, e.g. 'my_db'</text>
+  </g>
+  <g
+     transform="translate(120, 310)"
+     id="g94">
+    <use
+       xlink:href="#directory"
+       id="use88" />
+    <text
+       x="10"
+       y="26"
+       class="text_normal"
+       id="text90">global/</text>
+    <text
+       x="200"
+       y="26"
+       class="text_normal"
+       id="text92">Subdirectory for Global SQL Objects (database, tablespace, role)</text>
+  </g>
+  <g
+     transform="translate(120, 340)"
+     id="g102">
+    <use
+       xlink:href="#directory"
+       id="use96" />
+    <text
+       x="10"
+       y="26"
+       class="text_normal"
+       id="text98">pg_wal/</text>
+    <text
+       x="200"
+       y="26"
+       class="text_normal"
+       id="text100">Subdirectory for Write Ahead Log files ('pg_xlog' before version 10)</text>
+  </g>
+  <g
+     transform="translate(120, 370)"
+     id="g110">
+    <use
+       xlink:href="#directory"
+       id="use104" />
+    <text
+       x="10"
+       y="26"
+       class="text_normal"
+       id="text106">pg_xact/</text>
+    <text
+       x="200"
+       y="26"
+       class="text_normal"
+       id="text108">Subdirectory for transaction commit status ('pg_clog' before version 10)</text>
+  </g>
+  <g
+     transform="translate(120, 400)"
+     id="g118">
+    <use
+       xlink:href="#directory"
+       id="use112" />
+    <text
+       x="10"
+       y="26"
+       class="text_normal"
+       id="text114">pg_tblspc/</text>
+    <text
+       x="200"
+       y="26"
+       class="text_normal"
+       id="text116">Subdirectory containing symbolic links to tablespaces</text>
+  </g>
+  <g
+     transform="translate(120, 430)"
+     id="g126">
+    <use
+       xlink:href="#directory"
+       id="use120" />
+    <text
+       x="10"
+       y="26"
+       class="text_normal"
+       id="text122">pg_... /</text>
+    <text
+       x="200"
+       y="26"
+       class="text_normal"
+       id="text124">Some more subdirectories</text>
+  </g>
+  <g
+     transform="translate(120, 465)"
+     id="g134">
+    <use
+       xlink:href="#file"
+       x="0"
+       y="0"
+       id="use128" />
+    <use
+       xlink:href="#file"
+       x="50"
+       y="0"
+       id="use130" />
+    <text
+       x="200"
+       y="26"
+       class="text_normal"
+       id="text132">'postmaster.pid' and other files with cluster-wide relevance</text>
+  </g>
+  <!--  next cluster  -->
+  <g
+     transform="translate(20, 540)"
+     id="g142">
+    <use
+       xlink:href="#directory"
+       id="use136" />
+    <text
+       x="10"
+       y="26"
+       class="text_normal"
+       id="text138">... /xyz/</text>
+    <text
+       x="300"
+       y="26"
+       class="text_normal"
+       id="text140">Same or another arbitrary directory</text>
+  </g>
+  <g
+     transform="translate(70, 570)"
+     id="g150">
+    <use
+       xlink:href="#directory"
+       id="use144" />
+    <text
+       x="10"
+       y="26"
+       class="text_normal"
+       id="text146">cluster_2/</text>
+    <text
+       x="250"
+       y="26"
+       class="text_normal"
+       id="text148">Root of another cluster 'cluster_2'</text>
+  </g>
+</svg>
diff --git a/doc/src/sgml/images/directories-raw.svg b/doc/src/sgml/images/directories-raw.svg
new file mode 100644
index 0000000000..d304fd75fd
--- /dev/null
+++ b/doc/src/sgml/images/directories-raw.svg
@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     version="1.1"
+     width="900px" height="640px"
+     viewBox="0 0 900 640">
+
+  <title>Directory structure of a cluster</title>
+
+  <style type="text/css">
+  .text_normal  {font-style:normal;
+                 font-weight:normal;
+                 font-size:16px;
+                 font-family:"Open Sans", sans-serif;
+                 fill:black;
+                }
+  .text_big     {font-style:normal;
+                 font-weight:normal;
+                 font-size:24px;
+                 font-family:"Open Sans", sans-serif;
+                 fill:black;
+                }
+  </style>
+
+  <defs>
+
+    <!--  Directory  -->
+    <symbol id="directory" stroke="blue" stroke-width="0.3px" fill="aqua">
+      <title>Directory</title>
+      <rect x="0" y="10" width="110" height="20" />
+      <path d="M 0,10 l 0,-2 3,-3 35,0, 3,3  0,2" />
+    </symbol>
+
+    <!--  File  -->
+    <symbol id="file" stroke="black" fill="none" >
+      <title>File</title>
+      <rect x="0" y="0" width="40" height="50" stroke="blue" />
+      <path d="M 5,10 h 20" stroke-dasharray="4 2" />
+      <path d="M 5,17 h 15" stroke-dasharray="6 2" />
+      <path d="M 5,24 h 25" stroke-dasharray="4 2" />
+      <path d="M 5,31 h 20" stroke-dasharray="5 2" />
+    </symbol>
+
+  </defs>
+
+
+  <!--  start of rendering area  -->
+  <!--  enclosing rectangle  -->
+  <rect x="1" y="1" rx="5" width="99%" height="99%" stroke="black" fill="none" />
+
+  <!--  caption  -->
+  <text x="50" y="50"  class="text_big">Directory structure for storing durable and fluctuating information</text>
+
+  <!--  the directories  -->
+  <g transform="translate(20, 100)">
+    <use xlink:href="#directory" />
+    <text x="10"  y="26" class="text_normal">... /pg/</text>
+    <text x="300" y="26" class="text_normal">An arbitrary directory</text>
+  </g>
+
+  <g transform="translate(70, 130)">
+    <use xlink:href="#directory" />
+    <text x="10"  y="26" class="text_normal">data/</text>
+    <text x="250" y="26" class="text_normal">Root of cluster 'data' (see: PGDATA)</text>
+  </g>
+
+  <g transform="translate(120, 160)">
+    <use xlink:href="#directory" />
+    <text x="10"  y="26" class="text_normal">base/</text>
+    <text x="200" y="26" class="text_normal">Subdirectory containing per-database subdirectories</text>
+  </g>
+
+  <!--  -->
+  <g transform="translate(170, 190)">
+    <use xlink:href="#directory" />
+    <text x="10"  y="26" class="text_normal">1/</text>
+    <text x="150" y="26" class="text_normal">Subdirectory for data of first database 'template0'</text>
+  </g>
+  <g transform="translate(170, 220)">
+    <use xlink:href="#directory" />
+    <text x="10"  y="26" class="text_normal">12992/</text>
+    <text x="150" y="26" class="text_normal">Subdirectory for data of second database 'template1'</text>
+  </g>
+  <g transform="translate(170, 250)">
+    <use xlink:href="#directory" />
+    <text x="10"  y="26" class="text_normal">12999/</text>
+    <text x="150" y="26" class="text_normal">Subdirectory for data of third database 'postgres'</text>
+  </g>
+  <g transform="translate(170, 280)">
+    <use xlink:href="#directory" />
+    <text x="10"  y="26" class="text_normal">nnnnn/</text>
+    <text x="150" y="26" class="text_normal">Optional: more subdirectories for databases, e.g. 'my_db'</text>
+  </g>
+
+  <g transform="translate(120, 310)">
+    <use xlink:href="#directory" />
+    <text x="10"  y="26" class="text_normal">global/</text>
+    <text x="200" y="26" class="text_normal">Subdirectory for Global SQL Objects (database, tablespace, role)</text>
+  </g>
+
+  <g transform="translate(120, 340)">
+    <use xlink:href="#directory" />
+    <text x="10"  y="26" class="text_normal">pg_wal/</text>
+    <text x="200" y="26" class="text_normal">Subdirectory for Write Ahead Log files ('pg_xlog' before version 10)</text>
+  </g>
+
+  <g transform="translate(120, 370)">
+    <use xlink:href="#directory" />
+    <text x="10"  y="26" class="text_normal">pg_xact/</text>
+    <text x="200" y="26" class="text_normal">Subdirectory for transaction commit status ('pg_clog' before version 10)</text>
+  </g>
+
+  <g transform="translate(120, 400)">
+    <use xlink:href="#directory" />
+    <text x="10"  y="26" class="text_normal">pg_tblspc/</text>
+    <text x="200" y="26" class="text_normal">Subdirectory containing symbolic links to tablespaces</text>
+  </g>
+
+  <g transform="translate(120, 430)">
+    <use xlink:href="#directory" />
+    <text x="10"  y="26" class="text_normal">pg_... /</text>
+    <text x="200" y="26" class="text_normal">Some more subdirectories</text>
+  </g>
+
+  <g transform="translate(120, 465)">
+    <use xlink:href="#file" x="0"   y="0"  />
+    <use xlink:href="#file" x="50"  y="0"  />
+    <text x="200" y="26" class="text_normal">'postmaster.pid' and other files with cluster-wide relevance</text>
+  </g>
+
+  <!--  next cluster  -->
+  <g transform="translate(20, 540)">
+    <use xlink:href="#directory" />
+    <text x="10"  y="26" class="text_normal">... /xyz/</text>
+    <text x="300" y="26" class="text_normal">Same or another arbitrary directory</text>
+  </g>
+
+  <g transform="translate(70, 570)">
+    <use xlink:href="#directory" />
+    <text x="10"  y="26" class="text_normal">cluster_2/</text>
+    <text x="250" y="26" class="text_normal">Root of another cluster 'cluster_2'</text>
+  </g>
+
+</svg>
diff --git a/doc/src/sgml/images/ram-proc-file-ink-svgo.svg b/doc/src/sgml/images/ram-proc-file-ink-svgo.svg
new file mode 100644
index 0000000000..ed026fc04a
--- /dev/null
+++ b/doc/src/sgml/images/ram-proc-file-ink-svgo.svg
@@ -0,0 +1,288 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="900" height="600" viewBox="0 0 900 600">
+  <title>
+    PG Overall Server Architecture
+  </title>
+  <style>
+    .text_big{font-style:normal}.text_big,.text_comment,.text_normal,.text_small{font-weight:400;font-family:&quot;Open Sans&quot;,sans-serif;fill:#000}.text_normal,.text_small{font-style:normal}.text_small{font-size:12px}.text_normal{font-size:16px}.text_big{font-size:24px}.text_comment{font-style:italic;font-size:16px}
+  </style>
+  <defs>
+    <symbol id="note_200x20" stroke="black" fill="lightyellow">
+      <title>
+        UML Note (200 x 20 px)
+      </title>
+      <path d="M200 10v10H0V0h190v10h10L190 0"/>
+    </symbol>
+    <symbol id="note_250x20" stroke="black" fill="lightyellow">
+      <title>
+        UML Note (250 x 20 px)
+      </title>
+      <path d="M250 10v10H0V0h240v10h10L240 0"/>
+    </symbol>
+    <symbol id="note_100x35" stroke="black" fill="lightyellow">
+      <title>
+        UML Note (100 x 35 px)
+      </title>
+      <path d="M100 10v25H0V0h90v10h10L90 0"/>
+    </symbol>
+    <symbol id="note_170x50" stroke="black" fill="lightyellow">
+      <title>
+        UML Note (170 x 50 px)
+      </title>
+      <path d="M170 10v40H0V0h160v10h10L160 0"/>
+    </symbol>
+    <symbol id="state_300x120">
+      <title>
+        UML State, big
+      </title>
+      <rect width="300" height="120" rx="10" stroke="blue" fill="none"/>
+    </symbol>
+    <symbol id="state_350x120">
+      <title>
+        UML State, big
+      </title>
+      <rect width="350" height="120" rx="10" stroke="blue" fill="none"/>
+    </symbol>
+    <symbol id="disc" stroke="blue" fill="none">
+      <title>
+        Disc
+      </title>
+      <ellipse cx="51" cy="13" rx="50" ry="12"/>
+      <path d="M1 13v60"/>
+      <path d="M101 13v60"/>
+      <path d="M1 73a50 12 0 00100 0"/>
+    </symbol>
+    <symbol id="laptop" stroke="black" fill="none">
+      <title>
+        Laptop
+      </title>
+      <path d="M20 40V0h54v40l15 15H5l15-15h54"/>
+      <path d="M23 3h48v34H23z"/>
+      <path d="M30 10h20"/>
+      <path d="M30 15h25"/>
+      <path d="M30 20h10"/>
+      <path d="M30 30h20"/>
+      <path d="M25 50h45l2 2H22z"/>
+    </symbol>
+    <marker id="arrowhead_start" markerWidth="10" markerHeight="10" refX="0" refY="3" orient="auto">
+      <path d="M6 0L0 3l6 3" stroke="black" fill="none"/>
+    </marker>
+    <marker id="arrowhead_end" markerWidth="10" markerHeight="10" refX="6" refY="3" orient="auto">
+      <path d="M0 0l6 3-6 3" stroke="black" fill="none"/>
+    </marker>
+  </defs>
+  <rect x="1" y="1" rx="5" width="99%" height="99%" stroke="black" fill="none"/>
+  <text x="15" y="40" class="text_big">
+    Client
+  </text>
+  <text x="140" y="40" class="text_big">
+    Server
+  </text>
+  <use xlink:href="#laptop" x="5" y="210"/>
+  <g transform="translate(130 70)">
+    <use xlink:href="#state_350x120"/>
+    <text x="10" y="20" class="text_normal">
+      maintenance_work_mem (per connection)
+    </text>
+    <text x="10" y="40" class="text_normal">
+      work_mem (per query operation)
+    </text>
+    <text x="10" y="60" class="text_normal">
+      autovacuum_work_mem (per worker
+    </text>
+    <text x="230" y="75" class="text_normal">
+      process)
+    </text>
+    <text x="10" y="95" class="text_normal">
+      temp_buffer (per connection)
+    </text>
+    <text x="10" y="110" class="text_normal">
+      ...
+    </text>
+    <use xlink:href="#note_200x20" x="140" y="-15"/>
+    <text x="150" class="text_comment">
+      Individual Memory
+    </text>
+  </g>
+  <g transform="translate(520 70)">
+    <use xlink:href="#state_300x120"/>
+    <text x="10" y="30" class="text_normal">
+      shared_buffers (heap and index)
+    </text>
+    <text x="10" y="70" class="text_normal">
+      wal_buffers (WAL records)
+    </text>
+    <text x="10" y="100" class="text_normal">
+      ...
+    </text>
+    <use xlink:href="#note_250x20" x="40" y="-15"/>
+    <text x="50" class="text_comment">
+      Shared Memory (per Cluster)
+    </text>
+  </g>
+  <path stroke="blue" fill="none" d="M190 215h200v30H190z"/>
+  <text x="10" y="20" class="text_normal" transform="translate(190 215)">
+    Postmaster process
+  </text>
+  <path d="M90 230h85" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+  <g transform="translate(140 230)">
+    <circle r="8" stroke="black" fill="lightyellow"/>
+    <text x="-4" y="4" class="text_small">
+      1
+    </text>
+  </g>
+  <path stroke="blue" fill="none" d="M150 315h370v30H150z"/>
+  <text x="10" y="20" class="text_normal" transform="translate(150 315)">
+    Backend processes (one per connection)
+  </text>
+  <path d="M155 315v-5h370v30h-5" stroke="blue" fill="none"/>
+  <path d="M160 310v-5h370v30h-5" stroke="blue" fill="none"/>
+  <path d="M90 240l63 63" stroke="black" fill="none" marker-start="url(#arrowhead_start)" marker-end="url(#arrowhead_end)"/>
+  <g transform="translate(140 290)">
+    <circle r="8" stroke="black" fill="lightyellow"/>
+    <text x="-4" y="4" class="text_small">
+      3
+    </text>
+  </g>
+  <path d="M360 250v50" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+  <g transform="translate(190 255)">
+    <use xlink:href="#note_250x20"/>
+    <text x="10" y="15" class="text_comment">
+      Creates backend processes
+    </text>
+  </g>
+  <g transform="translate(360 281)">
+    <circle r="8" stroke="black" fill="lightyellow"/>
+    <text x="-4" y="4" class="text_small">
+      2
+    </text>
+  </g>
+  <path d="M460 300V200" stroke="black" fill="none" marker-start="url(#arrowhead_start)" marker-end="url(#arrowhead_end)"/>
+  <path d="M498 300V95h30" stroke="black" fill="none" marker-start="url(#arrowhead_start)" marker-end="url(#arrowhead_end)"/>
+  <path d="M508 300V135h20" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+  <path stroke="blue" fill="none" d="M550 220h120v30H550z"/>
+  <text x="10" y="20" class="text_normal" transform="translate(550 220)">
+    WAL Writer
+  </text>
+  <path d="M590 150v65" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+  <path d="M590 255v230" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+  <path stroke="blue" fill="none" d="M610 340h140v30H610z"/>
+  <text x="10" y="20" class="text_normal" transform="translate(610 340)">
+    Checkpointer
+  </text>
+  <path d="M740 110v220" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+  <path d="M605 355H475v130" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+  <path d="M700 330V150" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+  <g transform="translate(570 330)">
+    <use xlink:href="#note_100x35" x="50" y="-50"/>
+    <text x="60" y="-35" class="text_comment">
+      Checkpoint
+    </text>
+    <text x="60" y="-20" class="text_comment">
+      Record
+    </text>
+  </g>
+  <path stroke="blue" fill="none" d="M610 380h180v30H610z"/>
+  <text x="10" y="20" class="text_normal" transform="translate(610 380)">
+    Background Writer
+  </text>
+  <path d="M770 110v260" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+  <path d="M605 395H485v90" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+  <path stroke="blue" fill="none" d="M610 420h180v30H610z"/>
+  <text x="50" y="20" class="text_normal" transform="translate(610 420)">
+    Archiver
+  </text>
+  <path d="M620 485l30-30" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+  <path d="M740 455v30" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+  <path stroke="blue" fill="none" d="M135 380h120v30H135z"/>
+  <text x="10" y="20" class="text_normal" transform="translate(135 380)">
+    AutoVacuum
+  </text>
+  <path d="M140 380v-5h120v30h-5" stroke="blue" fill="none"/>
+  <path d="M145 375v-5h120v30h-5" stroke="blue" fill="none"/>
+  <path stroke="blue" fill="none" d="M135 430h120v30H135z"/>
+  <text x="10" y="20" class="text_normal" transform="translate(135 430)">
+    Log Writer
+  </text>
+  <path stroke="blue" fill="none" d="M290 370h140v30H290z"/>
+  <text x="10" y="20" class="text_normal" transform="translate(290 370)">
+    Stats Collector
+  </text>
+  <g transform="translate(145 490)">
+    <use xlink:href="#disc"/>
+    <text x="35" y="45" class="text_normal">
+      Log
+    </text>
+    <text x="15" y="60" class="text_small">
+      (text lines,
+    </text>
+    <text x="20" y="75" class="text_small">
+      sequential)
+    </text>
+  </g>
+  <path d="M195 465v20" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+  <g transform="translate(410 490)">
+    <use xlink:href="#disc"/>
+    <text x="10" y="40" class="text_normal">
+      Heap and
+    </text>
+    <text x="25" y="55" class="text_normal">
+      Index
+    </text>
+    <text x="10" y="70" class="text_small">
+      (binary blocks,
+    </text>
+    <text x="30" y="80" class="text_small">
+      random)
+    </text>
+  </g>
+  <path d="M450 485V350" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+  <g transform="translate(295 420)">
+    <use xlink:href="#note_170x50"/>
+    <text x="5" y="15" class="text_comment">
+      Read heap and index
+    </text>
+    <text x="5" y="30" class="text_comment">
+      pages and transfer
+    </text>
+    <text x="5" y="45" class="text_comment">
+      them to shared_buffers
+    </text>
+  </g>
+  <g transform="translate(550 490)">
+    <use xlink:href="#disc"/>
+    <text x="30" y="45" class="text_normal">
+      WAL
+    </text>
+    <text x="5" y="60" class="text_small">
+      (binary records,
+    </text>
+    <text x="20" y="75" class="text_small">
+      sequential)
+    </text>
+  </g>
+  <g transform="translate(690 490)">
+    <use xlink:href="#disc"/>
+    <text x="16" y="40" class="text_normal">
+      Archived
+    </text>
+    <text x="36" y="55" class="text_normal">
+      WAL
+    </text>
+  </g>
+  <path d="M110 20v550" stroke="black" fill="none"/>
+  <g transform="rotate(90 -33.5 156.5)">
+    <use xlink:href="#note_200x20"/>
+    <text class="text_comment" x="10" y="15">
+      Via TCP/IP or socket
+    </text>
+  </g>
+  <text class="text_big" x="95" transform="rotate(90 425 425)">
+    RAM
+  </text>
+  <text class="text_big" x="250" transform="rotate(90 425 425)">
+    PROCESSES
+  </text>
+  <text class="text_big" x="500" transform="rotate(90 425 425)">
+    FILES
+  </text>
+</svg>
diff --git a/doc/src/sgml/images/ram-proc-file-ink.svg b/doc/src/sgml/images/ram-proc-file-ink.svg
new file mode 100644
index 0000000000..1cb634ab44
--- /dev/null
+++ b/doc/src/sgml/images/ram-proc-file-ink.svg
@@ -0,0 +1,846 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   width="900px"
+   height="600px"
+   viewBox="0 0 900 600"
+   id="svg308"
+   sodipodi:docname="ram-proc-file-ink.svg"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)">
+  <metadata
+     id="metadata312">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title>PG Overall Server Architecture</dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="910"
+     inkscape:window-height="719"
+     id="namedview310"
+     showgrid="false"
+     inkscape:zoom="0.55625733"
+     inkscape:cx="644.20299"
+     inkscape:cy="407.96803"
+     inkscape:window-x="521"
+     inkscape:window-y="224"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg308" />
+  <title
+     id="title2">PG Overall Server Architecture</title>
+  <style
+     type="text/css"
+     id="style4">
+  .text_small   {font-style:normal;
+                 font-weight:normal;
+                 font-size:12px;
+                 font-family:&quot;Open Sans&quot;, sans-serif;
+                 fill:black;
+                }
+  .text_normal  {font-style:normal;
+                 font-weight:normal;
+                 font-size:16px;
+                 font-family:&quot;Open Sans&quot;, sans-serif;
+                 fill:black;
+                }
+  .text_big     {font-style:normal;
+                 font-weight:normal;
+                 font-size:24px;
+                 font-family:&quot;Open Sans&quot;, sans-serif;
+                 fill:black;
+                }
+  .text_comment {font-style:italic;
+                 font-weight:normal;
+                 font-size:16px;
+                 font-family:&quot;Open Sans&quot;, sans-serif;
+                 fill:black;
+                }
+  </style>
+  <defs
+     id="defs70">
+    <!-- Some notes in different sizes  -->
+    <symbol
+       id="note_200x20"
+       stroke="black"
+       fill="lightyellow">
+      <title
+         id="title6">UML Note (200 x 20 px)</title>
+      <path
+         d="M 200,10 v 10 h -200 v -20 h 190 v 10 h 10 l -10,-10"
+         id="path8" />
+    </symbol>
+    <symbol
+       id="note_250x20"
+       stroke="black"
+       fill="lightyellow">
+      <title
+         id="title11">UML Note (250 x 20 px)</title>
+      <path
+         d="M 250,10 v 10 h -250 v -20 h 240 v 10 h 10 l -10,-10"
+         id="path13" />
+    </symbol>
+    <symbol
+       id="note_100x35"
+       stroke="black"
+       fill="lightyellow">
+      <title
+         id="title16">UML Note (100 x 35 px)</title>
+      <path
+         d="M 100,10 v 25 h -100 v -35 h 90 v 10 h 10 l -10,-10"
+         id="path18" />
+    </symbol>
+    <symbol
+       id="note_170x50"
+       stroke="black"
+       fill="lightyellow">
+      <title
+         id="title21">UML Note (170 x 50 px)</title>
+      <path
+         d="M 170,10 v 40 h -170 v -50 h 160 v 10 h 10 l -10,-10"
+         id="path23" />
+    </symbol>
+    <!--  UML states (used for buffers) -->
+    <symbol
+       id="state_300x120">
+      <title
+         id="title26">UML State, big</title>
+      <rect
+         x="0"
+         y="0"
+         width="300"
+         height="120"
+         rx="10"
+         stroke="blue"
+         fill="none"
+         id="rect28" />
+    </symbol>
+    <symbol
+       id="state_350x120">
+      <title
+         id="title31">UML State, big</title>
+      <rect
+         x="0"
+         y="0"
+         width="350"
+         height="120"
+         rx="10"
+         stroke="blue"
+         fill="none"
+         id="rect33" />
+    </symbol>
+    <!-- Discs  -->
+    <symbol
+       id="disc"
+       stroke="blue"
+       fill="none">
+      <title
+         id="title36">Disc</title>
+      <ellipse
+         cx="51"
+         cy="13"
+         rx="50"
+         ry="12"
+         id="ellipse38" />
+      <!-- top -->
+      <path
+         d="M 1,13 v 60"
+         id="path40" />
+      <!-- left -->
+      <path
+         d="M 101,13 v 60"
+         id="path42" />
+      <!-- right -->
+      <path
+         d="M 1,73 A 50, 12, 0, 0, 0, 101,73"
+         id="path44" />
+      <!-- bottom -->
+    </symbol>
+    <!--  Laptop  -->
+    <symbol
+       id="laptop"
+       stroke="black"
+       fill="none">
+      <title
+         id="title47">Laptop</title>
+      <path
+         d="M 20,40 v -40 h 54 v 40 l 15,15 h -84 l 15,-15 h 54"
+         id="path49" />
+      <rect
+         x="23"
+         y="3"
+         width="48"
+         height="34"
+         id="rect51" />
+      <!-- symbolize some lines -->
+      <path
+         d="M 30,10 h 20"
+         id="path53" />
+      <path
+         d="M 30,15 h 25"
+         id="path55" />
+      <path
+         d="M 30,20 h 10"
+         id="path57" />
+      <path
+         d="M 30,30 h 20"
+         id="path59" />
+      <!-- symbolize keyboard -->
+      <path
+         d="M 25,50 h 45 l 2,2 h -50 z "
+         id="path61" />
+    </symbol>
+    <!--  marker start/end -->
+    <marker
+       id="arrowhead_start"
+       markerWidth="10"
+       markerHeight="10"
+       refX="0"
+       refY="3"
+       orient="auto">
+      <path
+         d="M 6,0 l -6,3 l 6,3"
+         stroke="black"
+         fill="none"
+         id="path64" />
+    </marker>
+    <marker
+       id="arrowhead_end"
+       markerWidth="10"
+       markerHeight="10"
+       refX="6"
+       refY="3"
+       orient="auto">
+      <path
+         d="M 0,0 l 6,3 l -6,3"
+         stroke="black"
+         fill="none"
+         id="path67" />
+    </marker>
+  </defs>
+  <!--  start of rendering area  -->
+  <!--  enclosing rectangle  -->
+  <rect
+     x="1"
+     y="1"
+     rx="5"
+     width="99%"
+     height="99%"
+     stroke="black"
+     fill="none"
+     id="rect72" />
+  <!-- caption, client side -->
+  <text
+     x="15"
+     y="40"
+     class="text_big"
+     id="text74">Client</text>
+  <text
+     x="140"
+     y="40"
+     class="text_big"
+     id="text76">Server</text>
+  <use
+     xlink:href="#laptop"
+     x="5"
+     y="210"
+     id="use78" />
+  <!--  individual memory -->
+  <g
+     transform="translate(130, 70)"
+     id="g98">
+    <use
+       xlink:href="#state_350x120"
+       x="0"
+       y="0"
+       id="use80" />
+    <text
+       x="10"
+       y="20"
+       class="text_normal"
+       id="text82">maintenance_work_mem (per connection)</text>
+    <text
+       x="10"
+       y="40"
+       class="text_normal"
+       id="text84">work_mem (per query operation)</text>
+    <text
+       x="10"
+       y="60"
+       class="text_normal"
+       id="text86">autovacuum_work_mem (per worker</text>
+    <text
+       x="230"
+       y="75"
+       class="text_normal"
+       id="text88">process)</text>
+    <text
+       x="10"
+       y="95"
+       class="text_normal"
+       id="text90">temp_buffer (per connection)</text>
+    <text
+       x="10"
+       y="110"
+       class="text_normal"
+       id="text92">...</text>
+    <use
+       xlink:href="#note_200x20"
+       x="140"
+       y="-15"
+       id="use94" />
+    <text
+       x="150"
+       y="0"
+       class="text_comment"
+       id="text96">Individual Memory</text>
+  </g>
+  <!--  shared memory -->
+  <g
+     transform="translate(520, 70)"
+     id="g112">
+    <use
+       xlink:href="#state_300x120"
+       x="0"
+       y="0"
+       id="use100" />
+    <text
+       x="10"
+       y="30"
+       class="text_normal"
+       id="text102">shared_buffers (heap and index)</text>
+    <text
+       x="10"
+       y="70"
+       class="text_normal"
+       id="text104">wal_buffers (WAL records)</text>
+    <text
+       x="10"
+       y="100"
+       class="text_normal"
+       id="text106">...</text>
+    <use
+       xlink:href="#note_250x20"
+       x="40"
+       y="-15"
+       id="use108" />
+    <text
+       x="50"
+       y="0"
+       class="text_comment"
+       id="text110">Shared Memory (per Cluster)</text>
+  </g>
+  <!-- postmaster  -->
+  <g
+     transform="translate(190, 215)"
+     id="g118">
+    <rect
+       width="200"
+       height="30"
+       stroke="blue"
+       fill="none"
+       id="rect114" />
+    <text
+       x="10"
+       y="20"
+       class="text_normal"
+       id="text116">Postmaster process</text>
+  </g>
+  <path
+     d="M 90,230 h 85"
+     stroke="black"
+     fill="none"
+     marker-end="url(#arrowhead_end)"
+     id="path120" />
+  <g
+     transform="translate(140, 230)"
+     id="g126">
+    <circle
+       r="8"
+       stroke="black"
+       fill="lightyellow"
+       id="circle122" />
+    <text
+       x="-4"
+       y="4"
+       class="text_small"
+       id="text124">1</text>
+  </g>
+  <!-- backend processes -->
+  <g
+     transform="translate(150, 315)"
+     id="g136">
+    <rect
+       width="370"
+       height="30"
+       stroke="blue"
+       fill="none"
+       id="rect128" />
+    <text
+       x="10"
+       y="20"
+       class="text_normal"
+       id="text130">Backend processes (one per connection)</text>
+    <path
+       d="M 5,0 v -5 h 370 v 30 h -5"
+       stroke="blue"
+       fill="none"
+       id="path132" />
+    <path
+       d="M 10,-5 v -5 h 370 v 30 h -5"
+       stroke="blue"
+       fill="none"
+       id="path134" />
+  </g>
+  <path
+     d="M 90,240 153,303"
+     stroke="black"
+     fill="none"
+     marker-start="url(#arrowhead_start)"
+     marker-end="url(#arrowhead_end)"
+     id="path138" />
+  <g
+     transform="translate(140, 290)"
+     id="g144">
+    <circle
+       r="8"
+       stroke="black"
+       fill="lightyellow"
+       id="circle140" />
+    <text
+       x="-4"
+       y="4"
+       class="text_small"
+       id="text142">3</text>
+  </g>
+  <!-- connection between postmaster and backend processes  -->
+  <path
+     d="M 360,250 v 50"
+     stroke="black"
+     fill="none"
+     marker-end="url(#arrowhead_end)"
+     id="path146" />
+  <g
+     transform="translate(190, 255)"
+     id="g152">
+    <use
+       xlink:href="#note_250x20"
+       id="use148" />
+    <text
+       x="10"
+       y="15"
+       class="text_comment"
+       id="text150">Creates backend processes</text>
+  </g>
+  <g
+     transform="translate(360, 281)"
+     id="g158">
+    <circle
+       r="8"
+       stroke="black"
+       fill="lightyellow"
+       id="circle154" />
+    <text
+       x="-4"
+       y="4"
+       class="text_small"
+       id="text156">2</text>
+  </g>
+  <!-- backend process' access to individual memory -->
+  <path
+     d="M 460,300 v -100"
+     stroke="black"
+     fill="none"
+     marker-start="url(#arrowhead_start)"
+     marker-end="url(#arrowhead_end)"
+     id="path160" />
+  <!-- its access to shared buffers and WAL buffers -->
+  <path
+     d="M 498,300 v -205 h 30"
+     stroke="black"
+     fill="none"
+     marker-start="url(#arrowhead_start)"
+     marker-end="url(#arrowhead_end)"
+     id="path162" />
+  <path
+     d="M 508,300 v -165 h 20"
+     stroke="black"
+     fill="none"
+     marker-end="url(#arrowhead_end)"
+     id="path164" />
+  <!-- WAL writer  -->
+  <g
+     transform="translate(550, 220)"
+     id="g170">
+    <rect
+       width="120"
+       height="30"
+       stroke="blue"
+       fill="none"
+       id="rect166" />
+    <text
+       x="10"
+       y="20"
+       class="text_normal"
+       id="text168">WAL Writer</text>
+  </g>
+  <path
+     d="M 590,150 v 65"
+     stroke="black"
+     fill="none"
+     marker-end="url(#arrowhead_end)"
+     id="path172" />
+  <path
+     d="M 590,255 v 230"
+     stroke="black"
+     fill="none"
+     marker-end="url(#arrowhead_end)"
+     id="path174" />
+  <!-- Checkpoiner -->
+  <g
+     transform="translate(610, 340)"
+     id="g180">
+    <rect
+       width="140"
+       height="30"
+       stroke="blue"
+       fill="none"
+       id="rect176" />
+    <text
+       x="10"
+       y="20"
+       class="text_normal"
+       id="text178">Checkpointer</text>
+  </g>
+  <path
+     d="M 740,110 v 220"
+     stroke="black"
+     fill="none"
+     marker-end="url(#arrowhead_end)"
+     id="path182" />
+  <path
+     d="M 605,355 h -130 v 130"
+     stroke="black"
+     fill="none"
+     marker-end="url(#arrowhead_end)"
+     id="path184" />
+  <path
+     d="M 700,330 v -180"
+     stroke="black"
+     fill="none"
+     marker-end="url(#arrowhead_end)"
+     id="path186" />
+  <g
+     transform="translate(570, 330)"
+     id="g194">
+    <use
+       xlink:href="#note_100x35"
+       x="50"
+       y="-50"
+       id="use188" />
+    <text
+       x="60"
+       y="-35"
+       class="text_comment"
+       id="text190">Checkpoint</text>
+    <text
+       x="60"
+       y="-20"
+       class="text_comment"
+       id="text192">Record</text>
+  </g>
+  <!-- BG writer  -->
+  <g
+     transform="translate(610, 380)"
+     id="g200">
+    <rect
+       width="180"
+       height="30"
+       stroke="blue"
+       fill="none"
+       id="rect196" />
+    <text
+       x="10"
+       y="20"
+       class="text_normal"
+       id="text198">Background Writer</text>
+  </g>
+  <path
+     d="M 770,110 v 260"
+     stroke="black"
+     fill="none"
+     marker-end="url(#arrowhead_end)"
+     id="path202" />
+  <path
+     d="M 605,395 h -120 v 90"
+     stroke="black"
+     fill="none"
+     marker-end="url(#arrowhead_end)"
+     id="path204" />
+  <!-- Archiver  -->
+  <g
+     transform="translate(610, 420)"
+     id="g210">
+    <rect
+       width="180"
+       height="30"
+       stroke="blue"
+       fill="none"
+       id="rect206" />
+    <text
+       x="50"
+       y="20"
+       class="text_normal"
+       id="text208">Archiver</text>
+  </g>
+  <path
+     d="M 620,485 l 30,-30"
+     stroke="black"
+     fill="none"
+     marker-end="url(#arrowhead_end)"
+     id="path212" />
+  <path
+     d="M 740,455 v 30"
+     stroke="black"
+     fill="none"
+     marker-end="url(#arrowhead_end)"
+     id="path214" />
+  <!-- Vacuum  -->
+  <g
+     transform="translate(135, 380)"
+     id="g224">
+    <rect
+       width="120"
+       height="30"
+       stroke="blue"
+       fill="none"
+       id="rect216" />
+    <text
+       x="10"
+       y="20"
+       class="text_normal"
+       id="text218">AutoVacuum</text>
+    <path
+       d="M 5,0 v -5 h 120 v 30 h -5"
+       stroke="blue"
+       fill="none"
+       id="path220" />
+    <path
+       d="M 10,-5 v -5 h 120 v 30 h -5"
+       stroke="blue"
+       fill="none"
+       id="path222" />
+  </g>
+  <!-- Log Writer -->
+  <g
+     transform="translate(135, 430)"
+     id="g230">
+    <rect
+       width="120"
+       height="30"
+       stroke="blue"
+       fill="none"
+       id="rect226" />
+    <text
+       x="10"
+       y="20"
+       class="text_normal"
+       id="text228">Log Writer</text>
+  </g>
+  <!-- Stats Collector (135, 460) -->
+  <g
+     transform="translate(290, 370)"
+     id="g236">
+    <rect
+       width="140"
+       height="30"
+       stroke="blue"
+       fill="none"
+       id="rect232" />
+    <text
+       x="10"
+       y="20"
+       class="text_normal"
+       id="text234">Stats Collector</text>
+  </g>
+  <!--       -->
+  <!-- files -->
+  <!--       -->
+  <g
+     transform="translate(145, 490)"
+     id="g246">
+    <use
+       xlink:href="#disc"
+       id="use238" />
+    <text
+       x="35"
+       y="45"
+       class="text_normal"
+       id="text240">Log</text>
+    <text
+       x="15"
+       y="60"
+       class="text_small"
+       id="text242">(text lines,</text>
+    <text
+       x="20"
+       y="75"
+       class="text_small"
+       id="text244">sequential)</text>
+  </g>
+  <path
+     d="M 195,465 v 20"
+     stroke="black"
+     fill="none"
+     marker-end="url(#arrowhead_end)"
+     id="path248" />
+  <g
+     transform="translate(410, 490)"
+     id="g260">
+    <use
+       xlink:href="#disc"
+       id="use250" />
+    <text
+       x="10"
+       y="40"
+       class="text_normal"
+       id="text252">Heap and</text>
+    <text
+       x="25"
+       y="55"
+       class="text_normal"
+       id="text254">Index</text>
+    <text
+       x="10"
+       y="70"
+       class="text_small"
+       id="text256">(binary blocks,</text>
+    <text
+       x="30"
+       y="80"
+       class="text_small"
+       id="text258">random)</text>
+  </g>
+  <path
+     d="M 450,485 v -135"
+     stroke="black"
+     fill="none"
+     marker-end="url(#arrowhead_end)"
+     id="path262" />
+  <g
+     transform="translate(295, 420)"
+     id="g272">
+    <use
+       xlink:href="#note_170x50"
+       id="use264" />
+    <text
+       x="5"
+       y="15"
+       class="text_comment"
+       id="text266">Read heap and index</text>
+    <text
+       x="5"
+       y="30"
+       class="text_comment"
+       id="text268">pages and transfer</text>
+    <text
+       x="5"
+       y="45"
+       class="text_comment"
+       id="text270">them to shared_buffers</text>
+  </g>
+  <g
+     transform="translate(550, 490)"
+     id="g282">
+    <use
+       xlink:href="#disc"
+       id="use274" />
+    <text
+       x="30"
+       y="45"
+       class="text_normal"
+       id="text276">WAL</text>
+    <text
+       x="5"
+       y="60"
+       class="text_small"
+       id="text278">(binary records,</text>
+    <text
+       x="20"
+       y="75"
+       class="text_small"
+       id="text280">sequential)</text>
+  </g>
+  <g
+     transform="translate(690, 490)"
+     id="g290">
+    <use
+       xlink:href="#disc"
+       id="use284" />
+    <text
+       x="16"
+       y="40"
+       class="text_normal"
+       id="text286">Archived</text>
+    <text
+       x="36"
+       y="55"
+       class="text_normal"
+       id="text288">WAL</text>
+  </g>
+  <!-- boarder between client and server side -->
+  <path
+     d="M 110,20 v 550"
+     stroke="black"
+     fill="none"
+     id="path292" />
+  <g
+     transform="translate(123, 190) rotate(90)"
+     id="g298">
+    <use
+       xlink:href="#note_200x20"
+       id="use294" />
+    <text
+       class="text_comment"
+       x="10"
+       y="15"
+       id="text296">Via TCP/IP or socket</text>
+  </g>
+  <!-- right side -->
+  <g
+     transform="translate(850, 0) rotate(90)"
+     id="g306">
+    <text
+       class="text_big"
+       x="95"
+       id="text300">RAM</text>
+    <text
+       class="text_big"
+       x="250"
+       id="text302">PROCESSES</text>
+    <text
+       class="text_big"
+       x="500"
+       id="text304">FILES</text>
+  </g>
+</svg>
diff --git a/doc/src/sgml/images/ram-proc-file-raw.svg b/doc/src/sgml/images/ram-proc-file-raw.svg
new file mode 100644
index 0000000000..ddb9ec6cb6
--- /dev/null
+++ b/doc/src/sgml/images/ram-proc-file-raw.svg
@@ -0,0 +1,302 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     version="1.1"
+     width="900px" height="600px"
+     viewBox="0 0 900 600">
+
+  <title>PG Overall Server Architecture</title>
+
+  <style type="text/css">
+  .text_small   {font-style:normal;
+                 font-weight:normal;
+                 font-size:12px;
+                 font-family:"Open Sans", sans-serif;
+                 fill:black;
+                }
+  .text_normal  {font-style:normal;
+                 font-weight:normal;
+                 font-size:16px;
+                 font-family:"Open Sans", sans-serif;
+                 fill:black;
+                }
+  .text_big     {font-style:normal;
+                 font-weight:normal;
+                 font-size:24px;
+                 font-family:"Open Sans", sans-serif;
+                 fill:black;
+                }
+  .text_comment {font-style:italic;
+                 font-weight:normal;
+                 font-size:16px;
+                 font-family:"Open Sans", sans-serif;
+                 fill:black;
+                }
+  </style>
+
+  <defs>
+
+    <!-- Some notes in different sizes  -->
+    <symbol id="note_200x20" stroke="black" fill="lightyellow">
+      <title>UML Note (200 x 20 px)</title>
+      <path d="M 200,10 v 10 h -200 v -20 h 190 v 10 h 10 l -10,-10" />
+    </symbol>
+    <symbol id="note_250x20" stroke="black" fill="lightyellow">
+      <title>UML Note (250 x 20 px)</title>
+      <path d="M 250,10 v 10 h -250 v -20 h 240 v 10 h 10 l -10,-10" />
+    </symbol>
+    <symbol id="note_100x35" stroke="black" fill="lightyellow">
+      <title>UML Note (100 x 35 px)</title>
+      <path d="M 100,10 v 25 h -100 v -35 h 90 v 10 h 10 l -10,-10" />
+    </symbol>
+    <symbol id="note_170x50" stroke="black" fill="lightyellow">
+      <title>UML Note (170 x 50 px)</title>
+      <path d="M 170,10 v 40 h -170 v -50 h 160 v 10 h 10 l -10,-10" />
+    </symbol>
+
+    <!--  UML states (used for buffers) -->
+    <symbol id="state_300x120">
+      <title>UML State, big</title>
+      <rect x="0" y="0" width="300" height="120" rx="10" stroke="blue" fill="none"/>
+    </symbol>
+    <symbol id="state_350x120">
+      <title>UML State, big</title>
+      <rect x="0" y="0" width="350" height="120" rx="10" stroke="blue" fill="none"/>
+    </symbol>
+
+    <!-- Discs  -->
+    <symbol id="disc" stroke="blue" fill="none" >
+      <title>Disc</title>
+      <ellipse cx="51" cy="13" rx="50" ry="12" />      <!-- top -->
+      <path    d="M 1,13 v 60" />                      <!-- left -->
+      <path    d="M 101,13 v 60" />                    <!-- right -->
+      <path    d="M 1,73 A 50, 12, 0, 0, 0, 101,73" /> <!-- bottom -->
+    </symbol>
+
+    <!--  Laptop  -->
+    <symbol id="laptop" stroke="black" fill="none" >
+      <title>Laptop</title>
+      <path d="M 20,40 v -40 h 54 v 40 l 15,15 h -84 l 15,-15 h 54" />
+      <rect x="23" y="3" width="48" height="34" />
+      <!-- symbolize some lines -->
+      <path d="M 30,10 h 20" />
+      <path d="M 30,15 h 25" />
+      <path d="M 30,20 h 10" />
+      <path d="M 30,30 h 20" />
+      <!-- symbolize keyboard -->
+      <path d="M 25,50 h 45 l 2,2 h -50 z " />
+    </symbol>
+
+    <!--  marker start/end -->
+    <marker id="arrowhead_start"
+            markerWidth="10"
+            markerHeight="10"
+            refX="0"
+            refY="3"
+            orient="auto">
+      <path d="M 6,0 l -6,3 l 6,3" stroke="black" fill="none" />
+    </marker>
+    <marker id="arrowhead_end"
+            markerWidth="10"
+            markerHeight="10"
+            refX="6"
+            refY="3"
+            orient="auto">
+      <path d="M 0,0 l 6,3 l -6,3" stroke="black" fill="none" />
+    </marker>
+
+  </defs>
+
+
+  <!--  start of rendering area  -->
+  <!--  enclosing rectangle  -->
+  <rect x="1" y="1" rx="5" width="99%" height="99%" stroke="black" fill="none" />
+
+  <!-- caption, client side -->
+  <text x="15" y="40"  class="text_big">Client</text>
+  <text x="140" y="40" class="text_big">Server</text>
+  <use xlink:href="#laptop" x="5" y="210" />
+
+
+  <!--  individual memory -->
+  <g transform="translate(130, 70)">
+    <use xlink:href="#state_350x120" x="0" y="0" />
+    <text x="10" y="20"  class="text_normal">maintenance_work_mem (per connection)</text>
+    <text x="10" y="40"  class="text_normal">work_mem (per query operation)</text>
+    <text x="10" y="60"  class="text_normal">autovacuum_work_mem (per worker</text>
+    <text x="230" y="75"  class="text_normal">process)</text>
+    <text x="10" y="95" class="text_normal">temp_buffer (per connection)</text>
+    <text x="10" y="110" class="text_normal">...</text>
+    <use xlink:href="#note_200x20" x="140" y="-15" />
+    <text x="150" y="0"  class="text_comment">Individual Memory</text>
+  </g>
+
+  <!--  shared memory -->
+  <g transform="translate(520, 70)">
+    <use xlink:href="#state_300x120" x="0" y="0" />
+    <text x="10" y="30" class="text_normal">shared_buffers (heap and index)</text>
+    <text x="10" y="70" class="text_normal">wal_buffers (WAL records)</text>
+    <text x="10" y="100" class="text_normal">...</text>
+    <use xlink:href="#note_250x20" x="40" y="-15" />
+    <text x="50" y="0"  class="text_comment">Shared Memory (per Cluster)</text>
+  </g>
+
+  <!-- postmaster  -->
+  <g transform="translate(190, 215)">
+    <rect width="200" height="30" stroke="blue" fill="none" />
+    <text x="10" y="20" class="text_normal">Postmaster process</text>
+  </g>
+  <path d="M 90,230 h 85" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+  <g transform="translate(140, 230)">
+    <circle r="8" stroke="black" fill="lightyellow" />
+    <text x="-4" y="4" class="text_small">1</text>
+  </g>
+
+  <!-- backend processes -->
+  <g transform="translate(150, 315)">
+    <rect width="370" height="30" stroke="blue" fill="none" />
+    <text x="10" y="20" class="text_normal">Backend processes (one per connection)</text>
+    <path d="M 5,0 v -5 h 370 v 30 h -5" stroke="blue" fill="none" />
+    <path d="M 10,-5 v -5 h 370 v 30 h -5" stroke="blue" fill="none" />
+  </g>
+
+  <path d="M 90,240 153,303" stroke="black" fill="none"
+        marker-start="url(#arrowhead_start)" marker-end="url(#arrowhead_end)"/>
+  <g transform="translate(140, 290)">
+    <circle r="8" stroke="black" fill="lightyellow" />
+    <text x="-4" y="4" class="text_small">3</text>
+  </g>
+
+  <!-- connection between postmaster and backend processes  -->
+  <path d="M 360,250 v 50" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+  <g transform="translate(190, 255)">
+    <use xlink:href="#note_250x20" />
+    <text x="10" y="15" class="text_comment">Creates backend processes</text>
+  </g>
+  <g transform="translate(360, 281)">
+    <circle r="8" stroke="black" fill="lightyellow" />
+    <text x="-4" y="4" class="text_small">2</text>
+  </g>
+
+  <!-- backend process' access to individual memory -->
+  <path d="M 460,300 v -100" stroke="black" fill="none"
+        marker-start="url(#arrowhead_start)" marker-end="url(#arrowhead_end)"/>
+  <!-- its access to shared buffers and WAL buffers -->
+  <path d="M 498,300 v -205 h 30" stroke="black" fill="none"
+        marker-start="url(#arrowhead_start)" marker-end="url(#arrowhead_end)"/>
+  <path d="M 508,300 v -165 h 20" stroke="black" fill="none"
+        marker-end="url(#arrowhead_end)"/>
+
+  <!-- WAL writer  -->
+  <g transform="translate(550, 220)">
+    <rect width="120" height="30" stroke="blue" fill="none" />
+    <text x="10" y="20" class="text_normal">WAL Writer</text>
+  </g>
+  <path d="M 590,150 v 65" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+  <path d="M 590,255 v 230" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+
+  <!-- Checkpoiner -->
+  <g transform="translate(610, 340)">
+    <rect width="140" height="30" stroke="blue" fill="none" />
+    <text x="10" y="20" class="text_normal">Checkpointer</text>
+  </g>
+  <path d="M 740,110 v 220" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+  <path d="M 605,355 h -130 v 130" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+  <path d="M 700,330 v -180" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+  <g transform="translate(570, 330)">
+    <use xlink:href="#note_100x35" x="50" y="-50" />
+    <text x="60" y="-35"  class="text_comment">Checkpoint</text>
+    <text x="60" y="-20"  class="text_comment">Record</text>
+  </g>
+
+  <!-- BG writer  -->
+  <g transform="translate(610, 380)">
+    <rect width="180" height="30" stroke="blue" fill="none" />
+    <text x="10" y="20" class="text_normal">Background Writer</text>
+  </g>
+  <path d="M 770,110 v 260" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+  <path d="M 605,395 h -120 v 90" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+
+  <!-- Archiver  -->
+  <g transform="translate(610, 420)">
+    <rect width="180" height="30" stroke="blue" fill="none" />
+    <text x="50" y="20" class="text_normal">Archiver</text>
+  </g>
+  <path d="M 620,485 l 30,-30" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+  <path d="M 740,455 v 30" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+
+  <!-- Vacuum  -->
+  <g transform="translate(135, 380)">
+    <rect width="120" height="30" stroke="blue" fill="none" />
+    <text x="10" y="20" class="text_normal">AutoVacuum</text>
+    <path d="M 5,0 v -5 h 120 v 30 h -5" stroke="blue" fill="none" />
+    <path d="M 10,-5 v -5 h 120 v 30 h -5" stroke="blue" fill="none" />
+  </g>
+
+  <!-- Log Writer -->
+  <g transform="translate(135, 430)">
+    <rect width="120" height="30" stroke="blue" fill="none" />
+    <text x="10" y="20" class="text_normal">Log Writer</text>
+  </g>
+
+  <!-- Stats Collector (135, 460) -->
+  <g transform="translate(290, 370)">
+    <rect width="140" height="30" stroke="blue" fill="none" />
+    <text x="10" y="20" class="text_normal">Stats Collector</text>
+  </g>
+
+  <!--       -->
+  <!-- files -->
+  <!--       -->
+  <g transform="translate(145, 490)">
+    <use xlink:href="#disc" />
+    <text x="35" y="45" class="text_normal">Log</text>
+    <text x="15" y="60" class="text_small">(text lines,</text>
+    <text x="20" y="75" class="text_small">sequential)</text>
+  </g>
+  <path d="M 195,465 v 20" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+
+  <g transform="translate(410, 490)">
+    <use xlink:href="#disc" />
+    <text x="10" y="40" class="text_normal">Heap and</text>
+    <text x="25" y="55" class="text_normal">Index</text>
+    <text x="10" y="70" class="text_small">(binary blocks,</text>
+    <text x="30" y="80" class="text_small">random)</text>
+  </g>
+  <path d="M 450,485 v -135" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+
+  <g transform="translate(295, 420)">
+    <use xlink:href="#note_170x50" />
+    <text x="5" y="15" class="text_comment">Read heap and index</text>
+    <text x="5" y="30" class="text_comment">pages and transfer</text>
+    <text x="5" y="45" class="text_comment">them to shared_buffers</text>
+  </g>
+
+  <g transform="translate(550, 490)">
+    <use xlink:href="#disc" />
+    <text x="30" y="45" class="text_normal">WAL</text>
+    <text x="5" y="60" class="text_small">(binary records,</text>
+    <text x="20" y="75" class="text_small">sequential)</text>
+  </g>
+
+  <g transform="translate(690, 490)">
+    <use xlink:href="#disc" />
+    <text x="16" y="40" class="text_normal">Archived</text>
+    <text x="36" y="55" class="text_normal">WAL</text>
+  </g>
+
+  <!-- boarder between client and server side -->
+  <path d="M 110,20 v 550" stroke="black" fill="none" />
+  <g transform="translate(123, 190) rotate(90)">
+    <use xlink:href="#note_200x20"  />
+    <text class="text_comment" x="10" y ="15">Via TCP/IP or socket</text>
+  </g>
+
+  <!-- right side -->
+  <g transform="translate(850, 0) rotate(90)">
+    <text class="text_big" x="95">RAM</text>
+    <text class="text_big" x="250">PROCESSES</text>
+    <text class="text_big" x="500">FILES</text>
+  </g>
+
+</svg>
diff --git a/doc/src/sgml/postgres.sgml b/doc/src/sgml/postgres.sgml
index e59cba7997..05d2862332 100644
--- a/doc/src/sgml/postgres.sgml
+++ b/doc/src/sgml/postgres.sgml
@@ -53,6 +53,7 @@
   </partintro>
 
   &start;
+  &architecture;
   &query;
   &advanced;
 
@@ -277,6 +278,7 @@
   &sourcerepo;
   &docguide;
   &limits;
+  &glossary;
   &acronyms;
 
  </part>

---

From: Jürgen Purtz <[email-masked]>
Date: Fri, 14 Feb 2020 18:42:02 +0100

The attached patch extends the previous one by one more figure, a rework 
of the old explanations plus additional explanations.

J. Purtz

 
   <sect1 id="tutorial-advanced-intro">
    <title>Introduction</title>
diff --git a/doc/src/sgml/architecture.sgml b/doc/src/sgml/architecture.sgml
new file mode 100644
index 0000000000..4c328c37f1
--- /dev/null
+++ b/doc/src/sgml/architecture.sgml
@@ -0,0 +1,562 @@
+<!-- doc/src/sgml/architecture.sgml -->
+
+ <chapter id="tutorial-architecture">
+  <title>The Architecture</title>
+
+  <para>
+   Every DBMS implements basic strategies to achieve a fast and
+   robust system. This chapter provides an overview about some
+   of the techniques which are used by <productname>
+   PostgreSQL</productname> to reach this aim.
+  </para>
+
+  <sect1 id="tutorial-ram-proc-file">
+   <title>Collabortion of Processes, RAM, and Files</title>
+   <para>
+    As is a matter of course, in a client/server architecture
+    clients do not have direct access to the database. Instead,
+    at the server side there is a group of processes, which
+    receive all requests comming from client applications,
+    handle them, and send resulting information back to
+    the clients.
+    These server-side processes work in close cooperation to
+    each other. Together with their common
+    <xref linkend="glossary-shared-memory"/> they are called an
+    <link linkend="glossary-instance">Instance</link>.
+   </para>
+
+   <para>
+    The instance is initiated by the
+    <xref linkend="glossary-postmaster"/> process.
+    He loads the configuration files, allocates the
+    <firstterm>Shared Memory</firstterm>
+    and starts the comprehensive network of processes:
+    <xref linkend="glossary-background-writer"/>,
+    <xref linkend="glossary-checkpointer"/>,
+    <xref linkend="glossary-wal-writer"/>,
+    <xref linkend="glossary-archiver"/>,
+    <xref linkend="glossary-auto-vacuum"/>,
+    <xref linkend="glossary-stats-collector"/>,
+    <xref linkend="glossary-log-writer"/>, and more.
+    <xref linkend="tutorial-architecture-figure"/> visualizes
+    main aspects of their collaboration.
+   </para>
+
+   <para>
+    Whenever a client application tries to connect to a
+    <xref linkend="glossary-database"/>, this request is handled
+    in a first step by the <firstterm>Postmaster
+    process</firstterm>. He checks the authorization, starts a
+    new <xref linkend="glossary-backend-process"/>,
+    and instructs the client application to connect to this
+    new <firstterm>Backend process</firstterm>. All further
+    client requests go to this process and are handled
+    by him. Thus - after the initial phase - each client
+    application communicates with exactly
+    one <firstterm>Backend process</firstterm>.
+   </para>
+
+   <figure id="tutorial-architecture-figure">
+    <title>Architecture</title>
+    <mediaobject>
+     <imageobject role="html">
+      <!-- attribute 'width=..px' is necessary to keep font-size of SVG text
+           in correlation with font-size of surrounding HTML  -->
+      <imagedata fileref="images/ram-proc-file-raw.svg" format="SVG" width="900px" />
+     </imageobject>
+     <imageobject role="fo">
+      <!-- For PDF attribute 'width=100%' is necessary to keep complete SVG visible
+           on the page, which has a fixed width. Font sizes will be adopted.  -->
+      <imagedata fileref="images/ram-proc-file-raw.svg" format="SVG" width="100%" />
+     </imageobject>
+    </mediaobject>
+   </figure>
+
+   <para>
+    Client requests (SELECT, UPDATE, ...) usually leads to the
+    necessity to read or write some data. In an first attempt
+    the client's <firstterm>Backend process</firstterm> tries
+    to get the information out of <firstterm>Shared
+    Memory</firstterm>. This <firstterm>Shared
+    Memory</firstterm> is a mirror of parts of the
+    <xref linkend="glossary-heap"/> and
+    <xref linkend="glossary-index"/> files. Because files are
+    much huger than memory, it is easily possible that
+    the desired information is not (completely) available
+    in the RAM. In this case the <firstterm>Backend process
+    </firstterm> must transfer additional file pages to
+    <firstterm>Shared Memory</firstterm>. Files are physically
+    organized in pages. Every transfer between files and
+    RAM is performed in units of complete pages while retaining
+    their size and layout.
+   </para>
+
+   <para>
+    Reading file pages is notedly slower than reading
+    RAM. This is the main motivation for the existence of
+    <firstterm>Shared Memory</firstterm>. As soon as one
+    of the <firstterm>Backend processes</firstterm> has done
+    the job, this pages are available for all other
+    <firstterm>Backend processes</firstterm> for direct
+    access in RAM.
+   </para>
+
+   <para>
+    <firstterm>Shared Memory</firstterm> is limited in size.
+    Sooner or later it is necessary to overwrite old RAM
+    pages. As long as the content of such pages hasn't
+    changed, this is not a problem. But in
+    <firstterm>Shared Memory</firstterm> also write
+    actions take place
+    - performed by any of the <firstterm>Backend
+    processes</firstterm> (or the
+    <firstterm>Auto Vacuum</firstterm> or other
+    processes).
+    Such modified pages are called
+    <firstterm>dirty pages</firstterm>.
+    Before <firstterm>dirty pages</firstterm> can be overwritten,
+    they must be saved to disk. This is a two-step process.
+   </para>
+
+   <para>
+    First, whenever the content of a page changes, a
+    <xref linkend="glossary-wal-record"/> is created out
+    of the delta-information (difference between old and
+    new content) and stored in another area of the
+    <firstterm>Shared Memory</firstterm>. These
+    <firstterm>WAL records</firstterm> are read by the
+    <firstterm>WAL writer</firstterm> process,
+    who runs in parallel to the <firstterm>Backend
+    processes</firstterm> and all other processes of
+    the <firstterm>instance</firstterm>. He writes
+    the continuously arising <firstterm>WAL
+    records</firstterm> to
+    the end of the current <firstterm>WAL
+    file</firstterm>. Because of the sequential
+    nature of this writing, it is much faster than
+    the more or less random access
+    to data files with <firstterm>heap</firstterm>
+    and <firstterm>index</firstterm> information.
+    As mentioned, this WAL-writing happens
+    in an independent process. Nevertheless all
+    <firstterm>WAL records</firstterm> created out of one
+    <firstterm>dirty page</firstterm> must be transfered
+    to disk before the <firstterm>dirty page</firstterm>
+    itself can be transfered to disk (???).
+   </para>
+
+   <para>
+    Second, the transfer of <firstterm>dirty pages</firstterm>
+    from <firstterm>Shared Memory</firstterm> to files must
+    take place. This is the primarily duty of the
+    <firstterm>Background Writer</firstterm> process. Because
+    huge I/O activities can block other processes significantly,
+    he starts periodically and acts only for a short period.
+    Doing so, his expensive I/O activities are spread over
+    time avoiding huge I/O peaks. Also the <firstterm>
+    Checkpointer</firstterm> process transfers
+    <firstterm>dirty pages</firstterm> to files, see next
+    paragraph.
+   </para>
+
+   <para>
+    The <firstterm>Checkpointer</firstterm> has a special
+    duty. As its name suggests, he has to create
+    <firstterm>Checkpoints</firstterm>. Such a
+    <xref linkend="glossary-checkpoint"/> is a point in time
+    when all older <firstterm>dirty pages</firstterm>,
+    all older <firstterm>WAL records</firstterm>, and
+    lastly a special <firstterm>Checkpoint record
+    </firstterm> have been written and flushed to disk.
+    In consequence, after a <firstterm>Checkpoint</firstterm>
+    data files and <firstterm>WAL files</firstterm> are in sync.
+    In case of a recovery (after a crash of the instance)
+    it is known, that the information of all
+    <firstterm>WAL records</firstterm> preceding
+    the last <firstterm>Checkpoint record</firstterm>
+    is already integrated into the data files. This
+    speeds up a possibly occurring recovery.
+   </para>
+
+   <para>
+    In correlation with data changes,
+    <firstterm>WAL records</firstterm> arise and are writen
+    to <firstterm>WAL files</firstterm>.
+    Those <firstterm>WAL files</firstterm> - in combination with
+    a previously taken <firstterm>Base Backup</firstterm> -
+    are necessary to restore a database after a crash of the
+    disk, where data files have been stored. Therefore it is
+    recommended to transfer a copy of the <firstterm>
+    WAL files</firstterm>
+    to a second, independent place. The purpose of the
+    <xref linkend="glossary-archiver"/> process is to perform
+    this copy action.
+   </para>
+
+   <para>
+    The <firstterm>Stats Collector</firstterm> process collects
+    counter about accesses to <firstterm>SQL
+    objects</firstterm> like tables, rows, indexes, pages,
+    and others. He stores the obtained information in system
+    tables.
+   </para>
+
+   <para>
+    The <firstterm>Log Writer</firstterm> process writes
+    readable text lines about serious and non-serious events,
+    which can happen during database access, e.g.: wrong password,
+    no permission, long-running query, ... .
+   </para>
+
+  </sect1>
+
+  <sect1 id="tutorial-cluster-db-schema">
+   <title>Cluster, Database, Schema</title>
+   <para>
+    <productname>PostgreSQL</productname> organizes data and
+    meta data in a strict hierarchy and allows connections
+    - depending on the user's rights - to access objects of
+    different hierarchy levels.
+   </para>
+   <sect2 id="tutorial-ownership">
+    <title>Ownership</title>
+
+    <para>
+     <xref linkend="tutorial-internal-objects-hierarchy-figure"/>
+     shows the relation of internal objects to each other, especially
+     their hierarchical nature.
+    </para>
+
+    <para>
+     On a <xref linkend="glossary-server"/>
+     exists one or more <xref linkend="glossary-cluster"/>.
+     A <firstterm>cluster</firstterm> essentially contains
+     <link linkend="managing-databases">databases</link>, but also
+     <link linkend="manage-ag-tablespaces">tablespaces</link>,
+     <link linkend="replication-origins">replication origins</link>,
+     subscriptions for
+     <link linkend="logical-replication">logical replication</link>,
+     <link linkend="database-roles">roles</link>, and information about all
+     <link linkend="catalog-pg-database">database names</link>
+     within this cluster.
+     <!--, as well as associated
+     comments, descriptions and toast-tables for such objects. -->
+     A <firstterm>database</firstterm> essentially contains
+     <firstterm>schemas</firstterm>, but also
+     <link linkend="collation">collations</link>, and - if created -
+     <link linkend="extend-extensions">extensions</link>.
+     A <firstterm>schema</firstterm> contains such objects
+     with which users interact mostly: <firstterm>tables,
+     views</firstterm>, and many more.
+    </para>
+
+    <figure id="tutorial-internal-objects-hierarchy-figure">
+     <title>Hierarchy of Internal Objects</title>
+     <mediaobject>
+      <imageobject role="html">
+       <!-- attribute 'width=..px' is necessary to keep font-size of SVG text
+            in correlation with font-size of surrounding HTML  -->
+       <imagedata fileref="images/internal-objects-hierarchy-raw.svg" format="SVG" width="900px" />
+      </imageobject>
+      <imageobject role="fo">
+       <!-- For PDF attribute 'width=100%' is necessary to keep complete SVG visible
+            on the page, which has a fixed width. Font sizes will be adopted.  -->
+       <imagedata fileref="images/internal-objects-hierarchy-raw.svg" format="SVG" width="100%" />
+      </imageobject>
+     </mediaobject>
+    </figure>
+
+    <para>
+     The hierarchy is strict, which means that each object has
+     exactly one parent, e.g.: each <firstterm>table</firstterm>
+     or <firstterm>view</firstterm> belongs to a certain
+     <firstterm>schema</firstterm>, it cannot belong to another
+     <firstterm>schema</firstterm>. An <firstterm>extension
+     </firstterm> like a <firstterm>foreign data wrapper
+     </firstterm> belongs to exactly one
+     <firstterm>database</firstterm>. If it is needed in another
+     <firstterm>database</firstterm> as well, it must be installed
+     twice.
+    </para>
+
+    <para>
+     <firstterm>Schemas</firstterm> contain <firstterm>SQL objects
+     </firstterm> of different type: <firstterm>table, view,
+     materialized view, index, constraint, sequence, function,
+     procedure, trigger, data type, operator</firstterm>, and more.
+     A schema is a namespace for all of its objects, independent
+     from the object type, and ensures that within its scope object
+     names are unique. E.g.: It is not possible
+     to have a table <literal>employee</literal> and a view
+     <literal>employee</literal> within the same
+     <firstterm>schema</firstterm>. But it is possible to have
+     two tables <literal>employee</literal> in different
+     <firstterm>schemas</firstterm>. In this case the two tables
+     are different objects and absolutely independent from each
+     other.
+    </para>
+
+   </sect2>
+
+   <sect2 id="tutorial-visibility">
+    <title>Visibility</title>
+    <para>
+     Independent from this strict 'belong-to' hierarchy in most
+     cases the knowledge about objects of the same or another
+     level is available via the <firstterm>system catalog</firstterm>.
+     Also the access to them is possible, if appropriate privileges
+     are granted.
+     All connections act at the database level (bold ellipse in the
+     above figure). From here they know about and have access to
+     nearly all objects:
+     <itemizedlist>
+      <listitem>
+       <para>
+        Their direct child objects <firstterm>schema, extension,
+        </firstterm> and <firstterm>collation</firstterm>. They can
+        access different schemas and use all extensions and
+        collations of this database.
+       </para>
+      </listitem>
+
+      <listitem>
+       <para>
+        Their grandchild objects <firstterm>tables, view, ...
+        </firstterm>. The sequence of schemas for locating
+        such objects is defined via the variable <firstterm>
+        search_path</firstterm>.
+       </para>
+      </listitem>
+
+      <listitem>
+       <para>
+        All <firstterm>tablespaces</firstterm>. If a tablespace is
+        defined in any database, it is automatically visible and
+        active in all other databases. It's name cannot be used
+        in any of the other databases for creating an additional
+        tablespace.
+       </para>
+      </listitem>
+
+      <listitem>
+       <para>
+        All <firstterm>roles</firstterm>. If a role is defined
+        in any database, it is visible and active in all
+        other databases. This implies, that the same
+        role cannot be created again in a different
+        <firstterm>database</firstterm>, it
+        exists already. But a DBA can grant different
+        privilegs to the same roles depending on databases.
+       </para>
+      </listitem>
+
+      <listitem>
+       <para>
+        All <firstterm>database names</firstterm> of this cluster.
+        Although the database names are known, the current
+        connection is not able to switch to a different
+        <firstterm>database</firstterm>. To do so, a different
+        connection is necessary. This behaviour results from the
+        implementation of connections.
+       </para>
+      </listitem>
+
+      <listitem>
+       <para>
+        Cluster limits are unbreachable boarders for a single
+        connection. No information about other clusters or their
+        content is visible or accessible. Only <firstterm>
+        foreing data wrappers</firstterm> and <firstterm>
+        replication</firstterm> mechanisms are able to communicate
+        across cluster limits. To do so, they use additional
+        communication lines.
+       </para>
+      </listitem>
+
+     </itemizedlist>
+    </para>
+   </sect2>
+
+   <sect2 id="tutorial-initial-objects">
+    <title>Initial Objects</title>
+
+    <para>
+     As a result of its initialization process
+     (<command>initdb</command>) a cluster
+     contains certain objects with predefined names. When
+     DBAs create more objects to satisfy their needs, these
+     user-created objects fit into the same hierarchy
+     and comply to the same visibility rules.
+     <xref linkend="tutorial-cluster-db-schema-figure"/>
+     shows the objects and their names.
+    </para>
+
+    <figure id="tutorial-cluster-db-schema-figure">
+     <title>Cluster, Database, Schema</title>
+     <mediaobject>
+      <imageobject role="html">
+       <!-- attribute 'width=..px' is necessary to keep font-size of SVG text
+            in correlation with font-size of surrounding HTML  -->
+       <imagedata fileref="images/cluster-db-schema-raw.svg" format="SVG" width="900px" />
+      </imageobject>
+      <imageobject role="fo">
+       <!-- For PDF attribute 'width=100%' is necessary to keep complete SVG visible
+            on the page, which has a fixed width. Font sizes will be adopted.  -->
+       <imagedata fileref="images/cluster-db-schema-raw.svg" format="SVG" width="100%" />
+      </imageobject>
+     </mediaobject>
+    </figure>
+
+    <para>
+     By default the command <command>initdb</command> creates the
+     cluster <literal>data</literal>.
+    </para>
+
+    <para>
+     <literal>template0</literal> is the very first
+     <firstterm>database</firstterm> of any <firstterm>
+     cluster</firstterm>. <literal>template0</literal>
+     is created by C-routines during the initialization phase
+     of the <firstterm>cluster</firstterm>.
+     In a second step <literal>template1</literal> is generated
+     as a copy of <literal>template0</literal> and finally
+     <literal>postgres</literal> as a copy of
+     <literal>template1</literal>. All other
+     <link linkend="app-createdb">new databases</link>
+     of this <firstterm>cluster</firstterm>,
+     such as <literal>my_db</literal>, are also copied from
+     <literal>template1</literal>. Due to the special
+     role of <literal>template0</literal> as the origin
+     of all other <firstterm>databases</firstterm>, no client
+     can connect to it.
+    </para>
+
+    <para>
+     The schema <literal>public</literal> acts as the default
+     schema and contains all such
+     <firstterm>SQL objects</firstterm>, which are created
+     within <literal>public</literal> or without using any schema
+     name. <literal>public</literal> should not contain user defined
+     <firstterm>SQL objects</firstterm>. It is recommended to
+     create a separate <firstterm>schema</firstterm> which
+     holds individual objects like application-specific tables or
+     views.
+    </para>
+
+    <para>
+     <literal>pg_catalog</literal> is a schema for all tables
+     and views of the <xref linkend="glossary-system-catalog"/>.
+     <literal>information_schema</literal> is a schema for several
+     tables and views of the <firstterm>System Catalog</firstterm>
+     in a way, which conforms to the SQL standard.
+    </para>
+
+   </sect2>
+  </sect1>
+
+  <sect1 id="tutorial-directories">
+   <title>Directory Structure</title>
+
+   <para>
+    <productname>PostgreSQL</productname> organizes long lasting
+    data as well as temporary state information about transactions
+    or replication actions in the file system. Every
+    <xref linkend="glossary-cluster"/> has its own root directory
+    anywhere in the file system. In many cases, the environment
+    variable <literal>PGDATA</literal> points to this directory.
+    The example of the following survey, which is shown in
+    <xref linkend="tutorial-directories-figure"/>, uses
+    <literal>data</literal> as the name of this root directory.
+   </para>
+
+   <figure id="tutorial-directories-figure">
+    <title>Directory Structure</title>
+    <mediaobject>
+     <imageobject role="html">
+      <!-- attribute 'width=..px' is necessary to keep font-size of SVG text
+           in correlation with font-size of surrounding HTML  -->
+      <imagedata fileref="images/directories-raw.svg" format="SVG" width="900px" />
+     </imageobject>
+     <imageobject role="fo">
+      <!-- For PDF attribute 'width=100%' is necessary to keep complete SVG visible
+           on the page, which has a fixed width. Font sizes will be adopted.  -->
+      <imagedata fileref="images/directories-raw.svg" format="SVG" width="100%" />
+     </imageobject>
+    </mediaobject>
+   </figure>
+
+   <para>
+    <literal>data</literal> contains many subdirectories and
+    some files, all of which are necessary to store long lasting
+    as well as temporary data. The following paragraphs
+    describe the files and subdirectories in
+    <literal>data</literal>.
+   </para>
+
+   <para>
+    <literal>base</literal> is a subdirectory in which one
+    subdirectory per <firstterm>database</firstterm> exists.
+    The names of those sudirectories consists of numbers.
+    These are the internal
+    <firstterm>Object Identifiers (OID)</firstterm>, which are
+    numbers to identify the database definition in the
+    <xref linkend="glossary-system-catalog"/>.
+   </para>
+
+   <para>
+    Within the database-specific
+    subdirectories there are many files. Primarily they contain
+    the <firstterm>heap</firstterm> and <firstterm>
+    index</firstterm>. But there are also optimization information
+    like <link linkend="storage-fsm">Free Space Maps</link> or
+    <link linkend="storage-vm">Visibility Maps</link>.
+   </para>
+
+   <para>
+    Another important subdirectory is <literal>global</literal>.
+    In analogy to the <firstterm>database</firstterm>-specific
+    subdirectories, there are files containing information about
+    <xref linkend="glossary-global-sql-object"/>s. One type
+    of such <firstterm>Global Objects</firstterm> are
+    <firstterm>tablespaces</firstterm>. In
+    <literal>global</literal> there are information about
+    the <firstterm>tablespaces</firstterm>, neither the
+    <firstterm>tablespaces</firstterm> itself nor the
+    symbolic links to them.
+   </para>
+
+   <para>
+    The subdirectory <literal>pg_wal</literal> contains
+    <link linkend="glossary-wal-file">WAL files</link>.
+    They arise and grow in parallel with data changes in the
+    <firstterm>cluster</firstterm> and remain alive as long as
+    they are required for recovery, archiving, or replication.
+    Please note that they belong to the complete cluster, not
+    to single databases.
+   </para>
+
+   <para>
+    The subdirectory <literal>pg_xact</literal> contains
+    information about the status of each transaction.
+   </para>
+
+   <para>
+    In <literal>pg_tblspc</literal> there are symbolic links
+    that point to directories containing such<firstterm>
+    SQL objects</firstterm> that are created within
+    <firstterm>tablespaces</firstterm>.
+   </para>
+
+   <para>
+    In the directory <literal>data</literal> exists also some
+    files. As long as the
+    <firstterm>cluster</firstterm> is up and running, the file
+    <literal>postmaster.pid</literal> exists and contains the ID of
+    the <firstterm>Postmaster</firstterm> process. In many cases
+    the configuration files of this <firstterm>cluster</firstterm>
+    are stored here.
+   </para>
+
+  </sect1>
+
+ </chapter>
diff --git a/doc/src/sgml/filelist.sgml b/doc/src/sgml/filelist.sgml
index 3da2365ea9..022c2efda3 100644
--- a/doc/src/sgml/filelist.sgml
+++ b/doc/src/sgml/filelist.sgml
@@ -8,9 +8,10 @@
 <!ENTITY problems   SYSTEM "problems.sgml">
 
 <!-- tutorial -->
 
 <!-- user's guide -->

index 0000000000..664d6d23b3
@@ -0,0 +1,502 @@
+     Global SQL objects</link>. The cluster is managed by exactly one
+     System Catalog</link> is a collection of tables and
+     views, which describes the structure of all
+     <firstterm>SQL objects</firstterm> of this
+     <firstterm>database</firstterm> and the
+     <firstterm>Global SQL objects</firstterm> of the
+     <firstterm>cluster</firstterm>.
+     The System Catalog resides in the schema
+     <literal>pg_catalog</literal>. Main parts are mirrored as
+     views in the schema <literal>information_schema</literal>.
+     is a <firstterm>table, view, materialized view, index,
+     constraint, sequence, function, procedure, trigger, data type,
+     operator</firstterm>, … . Every SQL object belongs
+     to exactly one <firstterm>schema</firstterm>. Within this
+     <firstterm>schema</firstterm> its name is unique.
+     See also: <link linkend="glossary-global-sql-object">
+     Global SQL objects</link>.
+     Not all objects belong to a certain
+     <firstterm>schema</firstterm> but to their
+     <firstterm>database</firstterm> or even to the complete
+     <firstterm>cluster</firstterm>. Therefore they are called
+     <firstterm>Global SQL objects</firstterm>.
+     <firstterm>Collations</firstterm> and <firstterm>Extensions
+     </firstterm> like <firstterm>foreing data wrappers</firstterm>
+     reside at the database level;
+     <firstterm>database names</firstterm>,
+     <firstterm>roles</firstterm>,
+     <firstterm>tablespaces</firstterm>,
+     <firstterm>replication origins</firstterm>, and
+     subscriptions for <firstterm>logical replication</firstterm>
+     at the cluster level.
index 0000000000..6acb2b69fe
@@ -0,0 +1,160 @@
+        (more system schemas)
+        (more system schemas)
+    <text class="text_normal" x="15" y="27">
+      Global SQL objects
+      Global SQL objects: Some SQL objects are automatically active
+      and known database- or even cluster-wide.
index 0000000000..beb1f00481
@@ -0,0 +1,482 @@
+   id="svg147"
+     id="metadata151">
+     inkscape:window-width="958"
+     inkscape:window-height="660"
+     id="namedview149"
+     inkscape:cy="458.60169"
+     inkscape:current-layer="svg147" />
+         id="text16">(more system schemas)</text>
+         id="text35">(more system schemas)</text>
+     id="g103">
+       y="27"
+       id="text93">Global SQL objects</text>
+       id="path95" />
+     id="g145">
+       id="use105" />
+       id="text107">1)</text>
+       id="text109">By default, you work in the cluster 'data', database 'postgres',</text>
+       id="text111">schema 'public'.</text>
+       id="text113">2)</text>
+       id="text115">More system schemas: pg_catalog, information_schema,</text>
+       id="text117">pg_temp, pg_toast.</text>
+       id="text119">3)</text>
+       id="text121">Global SQL objects: Some SQL objects are automatically active</text>
+       id="text123">and known database- or even cluster-wide.</text>
+       id="text125">4)</text>
+       id="text127">The command 'initdb' creates a new cluster with the three</text>
+       id="text129">databases 'template0', 'template1', and 'postgres'. The command</text>
+       id="text131">'createdb' creates a new database.</text>
+       id="text133">5)</text>
+       id="text135">If multiple clusters are active on one server at the same time,</text>
+       id="text137">each one is managed by an individual instance. Each such instance</text>
+       id="text139">uses a different port.</text>
+       id="text141">6)</text>
+       id="text143">No client application is allowed to connect to 'template0'.</text>
index 0000000000..a4919165e2
@@ -0,0 +1,173 @@
+      <text class="text_small"  x="20" y="125">(more system schemas)</text>
+      <text class="text_small"  x="20" y="190">(more system schemas)</text>
+    <text class="text_normal" x="15" y="27">Global SQL objects</text>
+    <text class="text_small" x="30" y="90">Global SQL objects: Some SQL objects are automatically active</text>
+    <text class="text_small" x="30" y="105">and known database- or even cluster-wide.</text>
index 0000000000..8dd88784ca
+      Subdirectory with information about Global SQL Objects
index 0000000000..2b89d02096
+     inkscape:window-width="640"
+       id="text92">Subdirectory with information about Global SQL Objects</text>
index 0000000000..92e766dd89
+    <text x="200" y="26" class="text_normal">Subdirectory with information about Global SQL Objects</text>
diff --git a/doc/src/sgml/images/internal-objects-hierarchy-ink-svgo.svg b/doc/src/sgml/images/internal-objects-hierarchy-ink-svgo.svg
index 0000000000..71b888b8b0
+++ b/doc/src/sgml/images/internal-objects-hierarchy-ink-svgo.svg
@@ -0,0 +1,85 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="900" height="485" viewBox="0 0 900 485">
+    Hierarchy of Internal Objects
+    Hierarchy of Internal Objects
+  <g transform="translate(450 270)" fill="none">
+    <ellipse rx="380" ry="200" stroke="blue"/>
+    <text class="text_normal" x="-140" y="-170">
+    <ellipse rx="320" ry="170" stroke="blue"/>
+    <text class="text_normal" x="-140" y="-130">
+      Cluster
+    <g transform="translate(40 -125)">
+      <ellipse rx="80" ry="20" stroke="blue"/>
+      <text class="text_normal" x="-60" y="5">
+        Database Names
+    <g transform="translate(180 -70)">
+      <ellipse rx="60" ry="20" stroke="blue"/>
+      <text class="text_normal" x="-40" y="5">
+        Tablespace
+    <g transform="translate(230 -5)">
+      <ellipse rx="80" ry="20" stroke="blue"/>
+      <text class="text_normal" x="-70" y="5">
+        Replication Origins
+    <g transform="translate(200 70)">
+      <ellipse rx="78" ry="27" stroke="blue"/>
+      <text class="text_normal" x="-60" y="-3">
+        Subscription for
+      <text class="text_normal" x="-68" y="10">
+        Logical Replication
+    <g transform="translate(100 120)">
+      <ellipse rx="40" ry="20" stroke="blue"/>
+      <text class="text_normal" x="-15" y="5">
+        Role
+    <g transform="translate(-80 10)">
+      <ellipse rx="220" ry="110" stroke="blue" stroke-width="2"/>
+      <text class="text_normal" x="-60" y="-80">
+        Database
+      <g transform="translate(-150 -30)">
+        <ellipse rx="50" ry="20" stroke="blue"/>
+        <text class="text_normal" x="-35" y="5">
+          Extension
+      <g transform="translate(-155 35)">
+        <ellipse rx="40" ry="20" stroke="blue"/>
+        <text class="text_normal" x="-35" y="5">
+          Collation
+      <g transform="translate(30 20)">
+        <ellipse rx="140" ry="70" stroke="blue"/>
+        <text class="text_normal" x="-80" y="-35">
+          Schema
+        <g transform="translate(20 10)">
+          <ellipse rx="90" ry="30" stroke="blue"/>
+          <text class="text_normal" x="-50" y="5">
+            Table, View, ...
diff --git a/doc/src/sgml/images/internal-objects-hierarchy-ink.svg b/doc/src/sgml/images/internal-objects-hierarchy-ink.svg
index 0000000000..052726e7ae
+++ b/doc/src/sgml/images/internal-objects-hierarchy-ink.svg
@@ -0,0 +1,268 @@
+   height="485px"
+   viewBox="0 0 900 485"
+   id="svg88"
+   sodipodi:docname="internal-objects-hierarchy-ink.svg"
+     id="metadata94">
+        <dc:title>Hierarchy of Internal Objects</dc:title>
+     id="defs92" />
+     inkscape:window-width="640"
+     id="namedview90"
+     inkscape:zoom="0.41555556"
+     inkscape:cy="242.5"
+     inkscape:current-layer="svg88" />
+     id="title2">Hierarchy of Internal Objects</title>
+     id="text8">Hierarchy of Internal Objects</text>
+    <!--  set default value  -->
+       transform="translate(450 270)"
+       id="g84">
+         rx="380"
+         ry="200"
+         id="ellipse10" />
+         x="-140"
+         y="-170"
+         id="text12">Server</text>
+         id="g50">
+           rx="320"
+           ry="170"
+           id="ellipse14" />
+           x="-140"
+           y="-130"
+           id="text16">Cluster</text>
+           transform="translate(40 -125)"
+           id="g22">
+             rx="80"
+             ry="20"
+             id="ellipse18" />
+             x="-60"
+             y="5"
+             id="text20">Database Names</text>
+           transform="translate(180 -70)"
+           id="g28">
+             rx="60"
+             ry="20"
+             id="ellipse24" />
+             x="-40"
+             y="5"
+             id="text26">Tablespace</text>
+           transform="translate(230 -5)"
+           id="g34">
+             rx="80"
+             ry="20"
+             id="ellipse30" />
+             x="-70"
+             y="5"
+             id="text32">Replication Origins</text>
+           transform="translate(200 70)"
+           id="g42">
+             rx="78"
+             ry="27"
+             id="ellipse36" />
+             x="-60"
+             y="-3"
+             id="text38">Subscription for</text>
+             x="-68"
+             id="text40">Logical Replication</text>
+           transform="translate(100 120)"
+           id="g48">
+             rx="40"
+             ry="20"
+             id="ellipse44" />
+             x="-15"
+             y="5"
+             id="text46">Role</text>
+         transform="translate(-80 10)"
+         id="g82">
+           rx="220"
+           ry="110"
+           id="ellipse52" />
+           x="-60"
+           y="-80"
+           id="text54">Database</text>
+           transform="translate(-120 -50)"
+           id="g80">
+             transform="translate(-30 20)"
+             id="g60">
+               ry="20"
+               id="ellipse56" />
+               x="-35"
+               y="5"
+               id="text58">Extension</text>
+             transform="translate(-35 85)"
+             id="g66">
+               rx="40"
+               ry="20"
+               id="ellipse62" />
+               x="-35"
+               y="5"
+               id="text64">Collation</text>
+             transform="translate(150 70)"
+               rx="140"
+               ry="70"
+               id="ellipse68" />
+               x="-80"
+               id="text70">Schema</text>
+               transform="translate(20 10)"
+               id="g76">
+                 rx="90"
+                 ry="30"
+                 id="ellipse72" />
+                 x="-50"
+                 y="5"
+                 id="text74">Table, View, ...</text>
diff --git a/doc/src/sgml/images/internal-objects-hierarchy-raw.svg b/doc/src/sgml/images/internal-objects-hierarchy-raw.svg
index 0000000000..531a24d3be
+++ b/doc/src/sgml/images/internal-objects-hierarchy-raw.svg
@@ -0,0 +1,99 @@
+     width="900px" height="485px"
+     viewBox="0 0 900 485" >
+  <title>Hierarchy of Internal Objects</title>
+  <text class="text_big" x="270" y="40">Hierarchy of Internal Objects</text>
+  <g fill="none">   <!--  set default value  -->
+    <g transform="translate(450 270)">
+      <ellipse rx="380" ry="200" stroke="blue" />
+      <text class="text_normal" x="-140" y="-170">Server</text>
+      <g>
+        <ellipse rx="320" ry="170" stroke="blue" />
+        <text class="text_normal" x="-140" y="-130">Cluster</text>
+        <g transform="translate(40 -125)">
+          <ellipse rx="80" ry="20" stroke="blue" />
+          <text class="text_normal" x="-60" y="5">Database Names</text>
+        <g transform="translate(180 -70)">
+          <ellipse rx="60" ry="20" stroke="blue" />
+          <text class="text_normal" x="-40" y="5">Tablespace</text>
+        <g transform="translate(230 -5)">
+          <ellipse rx="80" ry="20" stroke="blue" />
+          <text class="text_normal" x="-70" y="5">Replication Origins</text>
+        <g transform="translate(200 70)">
+          <ellipse rx="78" ry="27" stroke="blue" />
+          <text class="text_normal" x="-60" y="-3">Subscription for</text>
+          <text class="text_normal" x="-68" y="10">Logical Replication</text>
+        <g transform="translate(100 120)">
+          <ellipse rx="40" ry="20" stroke="blue" />
+          <text class="text_normal" x="-15" y="5">Role</text>
+      <g transform="translate(-80 10)">
+        <ellipse rx="220" ry="110" stroke="blue" stroke-width="2px" />
+        <text class="text_normal" x="-60" y="-80">Database</text>
+        <g transform="translate(-120 -50)">
+          <g transform="translate(-30 20)">
+            <ellipse rx="50" ry="20" stroke="blue" />
+            <text class="text_normal" x="-35" y="5">Extension</text>
+          <g transform="translate(-35 85)">
+            <ellipse rx="40" ry="20" stroke="blue" />
+            <text class="text_normal" x="-35" y="5">Collation</text>
+          <g transform="translate(150 70)">
+            <ellipse rx="140" ry="70" stroke="blue" />
+            <text class="text_normal" x="-80" y="-35">Schema</text>
+            <g  transform="translate(20 10)">
+              <ellipse rx="90" ry="30" stroke="blue" />
+              <text class="text_normal" x="-50" y="5">Table, View, ...</text>
index 0000000000..5f179c1688
+     inkscape:window-width="640"
+     inkscape:zoom="0.39333333"
+     inkscape:cy="300"
 
   &start;
+  &architecture;
   &query;
   &advanced;
 
@@ -277,6 +278,7 @@
   &sourcerepo;
   &docguide;
   &limits;
+  &glossary;
   &acronyms;
 
  </part>

---

From: Alvaro Herrera <[email-masked]>
Date: Fri, 14 Feb 2020 17:01:06 -0300

On 2020-Feb-14, Jürgen Purtz wrote:

> The attached patch extends the previous one by one more figure, a rework of
> the old explanations plus additional explanations.

So now we have two glossaries being proposed [1] [2], and they don't
have much in common with each other.  What to do now?  If we can get the
authors to agree on what patch to submit, we can move forward.

I suggest to make a glossary be 0001, and then the other patches can be
0002 or further.

(I also CC Liudmila, who mentioned the topic of a glossary in [3]).

[1] https://postgr.es/m/[email-masked]
[2] https://postgr.es/m/CADkLM=[email-masked]
[3] https://postgr.es/m/[email-masked]

-- 
Álvaro Herrera                https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

---

From: Jürgen Purtz <[email-masked]>
Date: Sat, 15 Feb 2020 09:19:32 +0100

> I suggest to make a glossary be 0001, and then the other patches can be

Yes, we should work on the glossary with priority because other things 
depend on it, not only the explanation of figures.

The two proposals differs in their nature: [1] is focused on PG-specific 
terms like WAL, Background Writer, Background Worker, ... and such terms 
that are broadly used but may differ from the meaning in other DBMS like 
Segment or Data Dictionary. It's only a starting point. Currently it 
misses the terms of important features like MVCC, Backup, Replication, 
... .  [2] also contains fundamental terms but is focused on universal 
terms of the DBMS community like SELECT, Null, Rollback, ... .

It's important to check, whether the existing documentation starts with 
something like "A <glossary-term> is a ...". In my opinion such 
redundancies aren't a problem as long as they don't contradict each 
other. On the contrary, I support this approach.

J. Purtz