From a5ac682925d230ee2b6c53ff758f3adc103c1a23 Mon Sep 17 00:00:00 2001
From: Pavel Semyonov
Date: Thu, 25 Jan 2024 14:27:53 +0700
Subject: [PATCH 01/14] Add getting started with TCM tutorial
---
.../tcm_get_started_config/config.yaml | 33 ++
.../tcm_get_started_config/instances.yml | 3 +
.../tcm_get_started_tt/config.yaml | 5 +
.../tcm_get_started_tt/instances.yml | 3 +
.../tcm_get_started_tt/myapp.lua | 20 ++
doc/how-to/getting_started_tcm.rst | 284 ++++++++++++++++++
doc/how-to/index.rst | 1 +
7 files changed, 349 insertions(+)
create mode 100644 doc/code_snippets/snippets/config/instances.enabled/tcm_get_started_config/config.yaml
create mode 100644 doc/code_snippets/snippets/config/instances.enabled/tcm_get_started_config/instances.yml
create mode 100644 doc/code_snippets/snippets/config/instances.enabled/tcm_get_started_tt/config.yaml
create mode 100644 doc/code_snippets/snippets/config/instances.enabled/tcm_get_started_tt/instances.yml
create mode 100644 doc/code_snippets/snippets/config/instances.enabled/tcm_get_started_tt/myapp.lua
create mode 100644 doc/how-to/getting_started_tcm.rst
diff --git a/doc/code_snippets/snippets/config/instances.enabled/tcm_get_started_config/config.yaml b/doc/code_snippets/snippets/config/instances.enabled/tcm_get_started_config/config.yaml
new file mode 100644
index 0000000000..3640b786ce
--- /dev/null
+++ b/doc/code_snippets/snippets/config/instances.enabled/tcm_get_started_config/config.yaml
@@ -0,0 +1,33 @@
+credentials:
+ users:
+ guest:
+ roles: [super]
+
+ wal:
+ dir: '{{ instance_name }}'
+
+ snapshot:
+ dir: '{{ instance_name }}'
+
+ console:
+ socket: '{{ instance_name }}.control'
+
+ iproto:
+ listen:
+ - uri: 'unix/:/tmp/{{ instance_name }}.sock'
+ advertise:
+ client: 'unix/:/tmp/{{ instance_name }}.sock'
+
+ groups:
+ group-001:
+ replicasets:
+ replicaset-001:
+ replication:
+ bootstrap_strategy: config
+ failover: manual
+ bootstrap_leader: instance-001
+ leader: instance-001
+ instances:
+ instance-001: {}
+ instance-002: {}
+ instance-003: {}
diff --git a/doc/code_snippets/snippets/config/instances.enabled/tcm_get_started_config/instances.yml b/doc/code_snippets/snippets/config/instances.enabled/tcm_get_started_config/instances.yml
new file mode 100644
index 0000000000..6c765b2e67
--- /dev/null
+++ b/doc/code_snippets/snippets/config/instances.enabled/tcm_get_started_config/instances.yml
@@ -0,0 +1,3 @@
+instance001:
+instance002:
+instance003:
\ No newline at end of file
diff --git a/doc/code_snippets/snippets/config/instances.enabled/tcm_get_started_tt/config.yaml b/doc/code_snippets/snippets/config/instances.enabled/tcm_get_started_tt/config.yaml
new file mode 100644
index 0000000000..52616f5e84
--- /dev/null
+++ b/doc/code_snippets/snippets/config/instances.enabled/tcm_get_started_tt/config.yaml
@@ -0,0 +1,5 @@
+config:
+ etcd:
+ endpoints:
+ - http://localhost:2379
+ prefix: /default
\ No newline at end of file
diff --git a/doc/code_snippets/snippets/config/instances.enabled/tcm_get_started_tt/instances.yml b/doc/code_snippets/snippets/config/instances.enabled/tcm_get_started_tt/instances.yml
new file mode 100644
index 0000000000..6c765b2e67
--- /dev/null
+++ b/doc/code_snippets/snippets/config/instances.enabled/tcm_get_started_tt/instances.yml
@@ -0,0 +1,3 @@
+instance001:
+instance002:
+instance003:
\ No newline at end of file
diff --git a/doc/code_snippets/snippets/config/instances.enabled/tcm_get_started_tt/myapp.lua b/doc/code_snippets/snippets/config/instances.enabled/tcm_get_started_tt/myapp.lua
new file mode 100644
index 0000000000..5a489d1eec
--- /dev/null
+++ b/doc/code_snippets/snippets/config/instances.enabled/tcm_get_started_tt/myapp.lua
@@ -0,0 +1,20 @@
+function create_space()
+ box.schema.space.create('bands')
+ box.space.bands:format({
+ { name = 'id', type = 'unsigned' },
+ { name = 'band_name', type = 'string' },
+ { name = 'year', type = 'unsigned' }
+ })
+ box.space.bands:create_index('primary', { type = "tree", parts = { 'id' } })
+ box.schema.user.grant('guest', 'read,write,execute', 'universe')
+end
+
+function load_data()
+ box.space.bands:insert { 1, 'Roxette', 1986 }
+ box.space.bands:insert { 2, 'Scorpions', 1965 }
+ box.space.bands:insert { 3, 'Ace of Base', 1987 }
+end
+
+function select_data()
+ box.space.bands:select { 3 }
+end
\ No newline at end of file
diff --git a/doc/how-to/getting_started_tcm.rst b/doc/how-to/getting_started_tcm.rst
new file mode 100644
index 0000000000..89bd8c66c2
--- /dev/null
+++ b/doc/how-to/getting_started_tcm.rst
@@ -0,0 +1,284 @@
+.. _getting_started_tcm:
+
+Getting started with Tarantool Cluster Manager
+==============================================
+
+.. admonition:: Enterprise Edition
+ :class: fact
+
+ This tutorial uses `Tarantool Enterprise Edition `_ .
+
+In this tutorial, you get :ref:`tcm` up and running on your local system, start
+a Tarantool EE cluster, and learn to manage the cluster from the |tcm| web UI.
+
+To complete this tutorial, you need:
+
+* A Linux machine with glibc 2.17 or later and a GUI.
+* A web browser based on Chromium 108 or later, for example, Google Chrome or Mozilla Firefox.
+* The Tarantool Enterprise Edition SDK 3.0 or later in the ``tar.gz`` archive.
+ See for :ref:`enterprise-setup` for information about getting the archive.
+
+Setting up Tarantool EE
+-----------------------
+
+1. Extract the Tarantool EE SDK archive:
+
+ .. code-block:: console
+
+ $ tar -xvzf tarantool-enterprise-sdk-gc64-->-r>.linux.x86_64.tar.gz
+
+ In result, the ``tarantool-enterprise`` directory is created beside the archive.
+ This directory contains three executables of key Tarantool EE components: ``tarantool``,
+ ``tt``, and ``tcm``.
+
+2. Add the Tarantool EE components to the executable path running the ``env.sh``
+ script included in the distribution:
+
+ .. code-block:: console
+
+ $ cd tarantool-enterprise
+ $ source ./env.sh
+
+Once completed, you can check that the Tarantool EE executables ``tarantool``, ``tt``,
+and ``tcm`` are available in the system by printing their versions. The result
+should look like this:
+
+.. code-block:: console
+
+ $ tarantool --version
+ Tarantool Enterprise 3.0.0-0-gf58f7d82a-r23-gc64
+ Target: Linux-x86_64-RelWithDebInfo
+ Build options: cmake . -DCMAKE_INSTALL_PREFIX=/home/centos/release/sdk/tarantool/static-build/tarantool-prefix -DENABLE_BACKTRACE=TRUE
+ Compiler: GNU-9.3.1
+ C_FLAGS: -fexceptions -funwind-tables -fasynchronous-unwind-tables -static-libstdc++ -fno-common -msse2 -fmacro-prefix-map=/home/centos/release/sdk/tarantool=. -std=c11 -Wall -Wextra -Wno-gnu-alignof-expression -fno-gnu89-inline -Wno-cast-function-type -O2 -g -DNDEBUG -ggdb -O2
+ CXX_FLAGS: -fexceptions -funwind-tables -fasynchronous-unwind-tables -static-libstdc++ -fno-common -msse2 -fmacro-prefix-map=/home/centos/release/sdk/tarantool=. -std=c++11 -Wall -Wextra -Wno-invalid-offsetof -Wno-gnu-alignof-expression -Wno-cast-function-type -O2 -g -DNDEBUG -ggdb -O2
+ $ tt version
+ Tarantool CLI EE 2.1.0, linux/amd64. commit: d80c2e3
+ $ tcm version
+ 1.0.0-0-gd38b12c2
+
+Starting TCM
+------------
+
+TCM is ready to run out of the box. To start it, run the following command:
+
+.. code-block:: console
+
+ $ ./tcm --storage.etcd.embed.enabled
+
+The ``--storage.etcd.embed.enabled`` options makes TCM start its own instance of
+`etcd `__. This instance serves as a configuration storage for
+TCM itself and can be used for storing configurations of connected Tarantool EE clusters.
+
+Logging into TCM
+----------------
+
+1. Open the browser and go to ``http://127.0.0.1:8080/``.
+2. Log in with the ``admin`` username. The initial password is generated automatically
+ and printed in the TCM log in a message like this:
+
+ .. code-block:: text
+
+ Jan 24 05:51:28.443 WRN Generated super admin credentials login=admin password=qF3A5rjGurjAwmlYccJ7JrL5XqjbIHY6
+
+ Paste this password into the login form and click **Log in**.
+
+After a successful login, you see the |tcm| web UI:
+
+.. image::
+
+Setting up a Tarantool EE cluster
+---------------------------------
+
+The next step is setting up and starting a Tarantool EE cluster. |tcm| manages
+cluster configurations in centralized configuration storages. However, deploying
+Tarantool instances is out of its scope. Thus, the cluster setup includes two steps:
+
+* Configuring a cluster in |tcm|.
+* Deploying and starting the cluster using the :ref:`tt-cli`.
+
+Configuring a cluster in TCM
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+A freshly installed |TCM| has one predefined cluster named **Default cluster**.
+
+It's an abstract entity and is
+not connected to any real instances; hasn't topology because its config is empty.
+
+To view its properties:
+
+1. Go to **Clusters** and click **Edit** opposite the cluster name.
+2. Optionally, add a description and select a color to highlight this cluster in |tcm|. Click **Next**.
+3. Remember the settings of the configuration storage that the cluster uses.
+ By default, it's an etcd storage with a prefix ``/default`` running on port
+ ``2379`` (default etcd port) on the same host. Click **Next**.
+4. Check the Tarantool user that |tcm| uses to connect to the cluster instances.
+ It's ``guest`` by default. Click **Update**.
+
+Next, write the cluster configuration and upload it to the etcd storage:
+
+1. Go to **Configuration**.
+2. Click **+** and paste the following configuration:
+
+ .. literalinclude:: /code_snippets/snippets/config/instances.enabled/tcm_get_started_config/config.yaml
+ :language: yaml
+ :dedent:
+
+ This configuration sets up a cluster of three nodes in one replica set,
+ one leader and two followers.
+
+3. Click **Apply**.
+
+To check the cluster state, go to **Stateboard**. You see that |tcm| already knows
+the cluster topology, but the instances aren't running.
+
+.. image::
+
+Deploying the cluster locally
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+To deploy the cluster based on the configuration from etcd:
+
+#. Create a new ``tt`` environment in a directory of your choice:
+
+ .. code-block:: console
+
+ $ mkdir cluster-env
+ $ cd cluster-env/
+ $ tt init
+
+#. Inside the ``instances.enabled`` directory of the created tt environment, create the ``cluster`` directory.
+
+ .. code-block:: console
+
+ $ mkdir instances.enabled/cluster
+ $ cd instances.enabled/cluster/
+
+#. Inside ``instances.enabled/create_db``, create the ``instances.yml`` and ``config.yaml`` files:
+
+ * ``instances.yml`` specifies instances to run in the current environment. In this example, there is one instance:
+
+ .. literalinclude:: /code_snippets/snippets/config/instances.enabled/tcm_get_started_tt/instances.yml
+ :language: yaml
+ :dedent:
+
+ * ``config.yaml`` contains basic :ref:`configuration `, for example:
+
+ .. literalinclude:: /code_snippets/snippets/config/instances.enabled/tcm_get_started_tt/config.yaml
+ :language: yaml
+ :dedent:
+
+ This ``config.yaml`` file instructs Tarantool to take the cluster configuration
+ from an etcd storage. The specified etcd location matches the configuration
+ storage of the **Default cluster** that was written on the previous step.
+
+#. Start the cluster from the ``tt`` environment root (the ``cluster-env`` directory):
+
+ .. code-block:: console
+
+ $ tt start
+
+To check how the cluster started, run ``tt status``. This output should look like this:
+
+ .. code-block:: console
+
+ $ tt status
+ INSTANCE STATUS PID
+ myapp:instance-001 RUNNING 2058
+ myapp:instance-002 RUNNING 2059
+ myapp:instance-003 RUNNING 2060
+
+
+Managing the cluster in TCM
+---------------------------
+
+To learn to interact with a cluster in |tcm|, complete typical database tasks such as:
+
+* check the cluster state
+* create a space
+* write data
+* view data
+
+Checking state
+~~~~~~~~~~~~~~
+
+To check the cluster state in |tcm|, go to **Stateboard**. Here you see the overview
+of the cluster topology, health, memory consumption, and other information.
+
+.. image::
+
+Connecting to the instance
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+To view detailed information about an instance, click its name in the instances list
+on the **Stateboard** page.
+
+.. image::
+
+To connect to the instance interactively and execute code on it, go to the **Terminal** tab.
+
+.. image::
+
+Creating a space
+----------------
+
+Open the terminal of ``instance-001`` (the leader instance) and run the following code to
+create a formatted space with a primary index in the cluster:
+
+ .. literalinclude:: /code_snippets/snippets/config/instances.enabled/tcm_get_started_tt/myapp.lua
+ :language: lua
+ :lines: 2-8
+ :dedent:
+
+Writing data
+~~~~~~~~~~~~
+
+Since ``instance-001`` is a read-write instance (its ``box.info.ro`` is ``false``),
+the write requests must be executed on it. Run the following code in the ``instance-001``
+terminal to write tuples in the space:
+
+ .. literalinclude:: /code_snippets/snippets/config/instances.enabled/create_db/myapp.lua
+ :language: lua
+ :lines: 13-15
+ :dedent:
+
+
+
+Reading data
+~~~~~~~~~~~~
+
+Check the space's tuples by running a read request on ``instance-001``:
+
+ .. literalinclude:: /code_snippets/snippets/config/instances.enabled/create_db/myapp.lua
+ :language: lua
+ :lines: 19
+ :dedent:
+
+Checking replication
+~~~~~~~~~~~~~~~~~~~~
+
+To check that the data is replicated across instances, run the read request on any
+other instance -- ``instance-002`` or ``instance-003``. The result is the same as on ``instance-001``
+
+.. note::
+
+ If you try to execute a write request on any instance but ``instance-001``,
+ you get an error because these instances are configured to be read-only.
+
+Viewing data in TCM
+-------------------
+
+|tcm| web UI includes a tool for viewing data stored in the cluster. To view
+the space tuples in |tcm|:
+
+#. Click an instance name on the **Stateboard page**.
+#. Open the **Actions** menu in the top-right corner and click **Explorer**.
+ This opens the page that lists the user spaces that exist on the instance.
+#. Click **View** in the **Actions** menu of the space you want to see. The page
+ shows all the tuples added previously.
+
+Next steps
+----------
+
+To learn more about |tcm|, refer to :ref:`tcm`.
diff --git a/doc/how-to/index.rst b/doc/how-to/index.rst
index f95685c0af..e8a1fb50c9 100644
--- a/doc/how-to/index.rst
+++ b/doc/how-to/index.rst
@@ -19,6 +19,7 @@ If you are new to Tarantool, please see our
Creating Tarantool database
getting_started_connectors
db/index
+ getting_started_tcm
getting_started_net_box
vshard_quick
app/index
From 813a8195fad9d7c1f05a1e968965fe3612624c26 Mon Sep 17 00:00:00 2001
From: Pavel Semyonov
Date: Mon, 29 Jan 2024 13:21:49 +0700
Subject: [PATCH 02/14] Add getting started with TCM tutorial
---
.../tcm_get_started_config/config.yaml | 55 +++----
doc/how-to/getting_started_tcm.rst | 153 ++++++++++++------
2 files changed, 132 insertions(+), 76 deletions(-)
diff --git a/doc/code_snippets/snippets/config/instances.enabled/tcm_get_started_config/config.yaml b/doc/code_snippets/snippets/config/instances.enabled/tcm_get_started_config/config.yaml
index 3640b786ce..ad49a58af6 100644
--- a/doc/code_snippets/snippets/config/instances.enabled/tcm_get_started_config/config.yaml
+++ b/doc/code_snippets/snippets/config/instances.enabled/tcm_get_started_config/config.yaml
@@ -1,33 +1,34 @@
+
credentials:
- users:
- guest:
- roles: [super]
+ users:
+ guest:
+ roles: [super]
- wal:
- dir: '{{ instance_name }}'
+wal:
+ dir: '{{ instance_name }}'
- snapshot:
- dir: '{{ instance_name }}'
+snapshot:
+ dir: '{{ instance_name }}'
- console:
- socket: '{{ instance_name }}.control'
+console:
+ socket: '{{ instance_name }}.control'
- iproto:
- listen:
- - uri: 'unix/:/tmp/{{ instance_name }}.sock'
- advertise:
- client: 'unix/:/tmp/{{ instance_name }}.sock'
+iproto:
+ listen:
+ - uri: 'unix/:/tmp/{{ instance_name }}.sock'
+ advertise:
+ client: 'unix/:/tmp/{{ instance_name }}.sock'
- groups:
- group-001:
- replicasets:
- replicaset-001:
- replication:
- bootstrap_strategy: config
- failover: manual
- bootstrap_leader: instance-001
- leader: instance-001
- instances:
- instance-001: {}
- instance-002: {}
- instance-003: {}
+groups:
+ group-001:
+ replicasets:
+ replicaset-001:
+ replication:
+ bootstrap_strategy: config
+ failover: manual
+ bootstrap_leader: instance-001
+ leader: instance-001
+ instances:
+ instance-001: {}
+ instance-002: {}
+ instance-003: {}
\ No newline at end of file
diff --git a/doc/how-to/getting_started_tcm.rst b/doc/how-to/getting_started_tcm.rst
index 89bd8c66c2..658e286c88 100644
--- a/doc/how-to/getting_started_tcm.rst
+++ b/doc/how-to/getting_started_tcm.rst
@@ -6,32 +6,35 @@ Getting started with Tarantool Cluster Manager
.. admonition:: Enterprise Edition
:class: fact
- This tutorial uses `Tarantool Enterprise Edition `_ .
+ This tutorial uses `Tarantool Enterprise Edition `_.
-In this tutorial, you get :ref:`tcm` up and running on your local system, start
-a Tarantool EE cluster, and learn to manage the cluster from the |tcm| web UI.
+In this tutorial, you get :ref:`tcm` up and running on your local system, deploy
+a local Tarantool EE cluster, and learn to manage the cluster from the |tcm| web UI.
To complete this tutorial, you need:
* A Linux machine with glibc 2.17 or later and a GUI.
-* A web browser based on Chromium 108 or later, for example, Google Chrome or Mozilla Firefox.
+* A web browser: Chromium-based (Chromium version 108 or later), Mozilla Firefox 101 or later, or another browser.
* The Tarantool Enterprise Edition SDK 3.0 or later in the ``tar.gz`` archive.
- See for :ref:`enterprise-setup` for information about getting the archive.
+ See :ref:`enterprise-setup` for information about getting the archive.
Setting up Tarantool EE
-----------------------
-1. Extract the Tarantool EE SDK archive:
+#. Extract the Tarantool EE SDK archive:
.. code-block:: console
- $ tar -xvzf tarantool-enterprise-sdk-gc64-->-r>.linux.x86_64.tar.gz
+ $ tar -xvzf tarantool-enterprise-sdk-gc64---r>.linux.x86_64.tar.gz
- In result, the ``tarantool-enterprise`` directory is created beside the archive.
- This directory contains three executables of key Tarantool EE components: ``tarantool``,
- ``tt``, and ``tcm``.
+ This creates the ``tarantool-enterprise`` directory beside the archive.
+ The directory contains three executables for key Tarantool EE components:
-2. Add the Tarantool EE components to the executable path running the ``env.sh``
+ * ``tarantool`` - Tarantool Enterprise Edition
+ * the - :ref:`tt ` command-line utility
+ * ``tcm`` - :ref:`tcm`
+
+#. Add the Tarantool EE components to the executable path running the ``env.sh``
script included in the distribution:
.. code-block:: console
@@ -40,8 +43,7 @@ Setting up Tarantool EE
$ source ./env.sh
Once completed, you can check that the Tarantool EE executables ``tarantool``, ``tt``,
-and ``tcm`` are available in the system by printing their versions. The result
-should look like this:
+and ``tcm`` are available in the system. For example, print their versions:
.. code-block:: console
@@ -60,21 +62,27 @@ should look like this:
Starting TCM
------------
-TCM is ready to run out of the box. To start it, run the following command:
+|tcm_full_name| is ready to run out of the box. To start it, run the following command:
.. code-block:: console
$ ./tcm --storage.etcd.embed.enabled
-The ``--storage.etcd.embed.enabled`` options makes TCM start its own instance of
-`etcd `__. This instance serves as a configuration storage for
-TCM itself and can be used for storing configurations of connected Tarantool EE clusters.
+The :ref:`--storage.etcd.embed.enabled `
+option makes |tcm| start its own instance of `etcd `__ on bootstrap.
+This ``etcd`` instance is used for storing the :ref:`TCM configuration `.
+
+.. note::
+
+ During the development, it is also convenient to use the TCM-embedded etcd
+ for storing the configurations of connected Tarantool EE clusters in it. Learn more
+ in :ref:`configuration_etcd`.
Logging into TCM
----------------
-1. Open the browser and go to ``http://127.0.0.1:8080/``.
-2. Log in with the ``admin`` username. The initial password is generated automatically
+#. Open a web browser and go to ``http://127.0.0.1:8080/``.
+#. Log in with the ``admin`` username. The initial password is generated automatically
and printed in the TCM log in a message like this:
.. code-block:: text
@@ -85,40 +93,68 @@ Logging into TCM
After a successful login, you see the |tcm| web UI:
-.. image::
+.. image:: tcm_start_empty_cluster.png
+ :width: 700
+ :align: center
+ :alt: TCM stateboard with empty cluster
Setting up a Tarantool EE cluster
---------------------------------
-The next step is setting up and starting a Tarantool EE cluster. |tcm| manages
-cluster configurations in centralized configuration storages. However, deploying
-Tarantool instances is out of its scope. Thus, the cluster setup includes two steps:
+To prepare a Tarantool EE cluster, complete the following steps:
-* Configuring a cluster in |tcm|.
-* Deploying and starting the cluster using the :ref:`tt-cli`.
+#. Configure the cluster in |tcm|. |tcm| provides a web-based editor for writing
+ cluster configurations. It is connected to the configuration storage (etcd in
+ this case): all changes you make in the browser are sent to etcd in one click.
+#. Deploy the cluster using the :ref:`tt ` utility. Deployment of cluster
+ instances in the system is the responsibility of the ``tt`` command-line utility.
Configuring a cluster in TCM
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-A freshly installed |TCM| has one predefined cluster named **Default cluster**.
+A freshly installed |TCM| has a predefined cluster named **Default cluster**. It
+doesn't have any configuration or topology out of the box. Check its properties to
+find out it's configuration storage.
+
+To view the **Default cluster**'s properties:
-It's an abstract entity and is
-not connected to any real instances; hasn't topology because its config is empty.
+#. Go to **Clusters** and click **Edit** in the **Actions** menu opposite the cluster name.
-To view its properties:
+ .. image:: tcm_start_cluster_edit.png
+ :width: 700
+ :align: center
+ :alt: TCM edit cluster
-1. Go to **Clusters** and click **Edit** opposite the cluster name.
-2. Optionally, add a description and select a color to highlight this cluster in |tcm|. Click **Next**.
-3. Remember the settings of the configuration storage that the cluster uses.
+#. Optionally, add a description and select a color to highlight this cluster in |tcm|. Click **Next**.
+
+ .. image:: tcm_start_cluster_general.png
+ :width: 700
+ :align: center
+ :alt: General cluster settings
+
+#. Remember the settings of the configuration storage that the cluster uses.
By default, it's an etcd storage with a prefix ``/default`` running on port
``2379`` (default etcd port) on the same host. Click **Next**.
-4. Check the Tarantool user that |tcm| uses to connect to the cluster instances.
- It's ``guest`` by default. Click **Update**.
+
+ .. image:: tcm_start_cluster_storage.png
+ :width: 700
+ :align: center
+ :alt: Cluster configuration storage settings
+
+#. Check the Tarantool user that |tcm| uses to connect to the cluster instances.
+ It's ``guest`` by default. Click **Update** to save the changes and return to
+ the **Clusters** page.
+
+ .. image:: tcm_start_cluster_tarantool.png
+ :width: 700
+ :align: center
+ :alt: Cluster Tarantool connection settings
Next, write the cluster configuration and upload it to the etcd storage:
-1. Go to **Configuration**.
-2. Click **+** and paste the following configuration:
+#. Go to **Configuration**.
+#. Click **+** and provide an arbitrary name for the configuration, for example, ``all``.
+#. Paste the following YAML configuration into the editor:
.. literalinclude:: /code_snippets/snippets/config/instances.enabled/tcm_get_started_config/config.yaml
:language: yaml
@@ -127,19 +163,22 @@ Next, write the cluster configuration and upload it to the etcd storage:
This configuration sets up a cluster of three nodes in one replica set,
one leader and two followers.
-3. Click **Apply**.
+3. Click **Apply** to send the configuration to etcd.
To check the cluster state, go to **Stateboard**. You see that |tcm| already knows
the cluster topology, but the instances aren't running.
-.. image::
+.. image:: tcm_start_stateboard_offline.png
+ :width: 700
+ :align: center
+ :alt: Offline cluster stateboard
Deploying the cluster locally
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+To deploy a local cluster based on the configuration from etcd:
-To deploy the cluster based on the configuration from etcd:
-
+#. Open a system terminal.
#. Create a new ``tt`` environment in a directory of your choice:
.. code-block:: console
@@ -155,7 +194,7 @@ To deploy the cluster based on the configuration from etcd:
$ mkdir instances.enabled/cluster
$ cd instances.enabled/cluster/
-#. Inside ``instances.enabled/create_db``, create the ``instances.yml`` and ``config.yaml`` files:
+#. Inside ``instances.enabled/cluster``, create the ``instances.yml`` and ``config.yaml`` files:
* ``instances.yml`` specifies instances to run in the current environment. In this example, there is one instance:
@@ -189,7 +228,6 @@ To check how the cluster started, run ``tt status``. This output should look lik
myapp:instance-002 RUNNING 2059
myapp:instance-003 RUNNING 2060
-
Managing the cluster in TCM
---------------------------
@@ -206,7 +244,10 @@ Checking state
To check the cluster state in |tcm|, go to **Stateboard**. Here you see the overview
of the cluster topology, health, memory consumption, and other information.
-.. image::
+.. image:: tcm_start_stateboard_online.png
+ :width: 700
+ :align: center
+ :alt: Online cluster stateboard
Connecting to the instance
~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -214,11 +255,17 @@ Connecting to the instance
To view detailed information about an instance, click its name in the instances list
on the **Stateboard** page.
-.. image::
+.. image:: tcm_start_instance_details.png
+ :width: 700
+ :align: center
+ :alt: Instance details in TCM
To connect to the instance interactively and execute code on it, go to the **Terminal** tab.
-.. image::
+.. image:: tcm_start_instance_terminal.png
+ :width: 700
+ :align: center
+ :alt: Instance terminal in TCM
Creating a space
----------------
@@ -238,29 +285,37 @@ Since ``instance-001`` is a read-write instance (its ``box.info.ro`` is ``false`
the write requests must be executed on it. Run the following code in the ``instance-001``
terminal to write tuples in the space:
- .. literalinclude:: /code_snippets/snippets/config/instances.enabled/create_db/myapp.lua
+ .. literalinclude:: /code_snippets/snippets/config/instances.enabled/tcm_get_started_tt/myapp.lua
:language: lua
:lines: 13-15
:dedent:
-
-
Reading data
~~~~~~~~~~~~
Check the space's tuples by running a read request on ``instance-001``:
- .. literalinclude:: /code_snippets/snippets/config/instances.enabled/create_db/myapp.lua
+ .. literalinclude:: /code_snippets/snippets/config/instances.enabled/tcm_get_started_tt/myapp.lua
:language: lua
:lines: 19
:dedent:
+.. image:: tcm_start_instance_write.png
+ :width: 700
+ :align: center
+ :alt: Writing data through TCM
+
Checking replication
~~~~~~~~~~~~~~~~~~~~
To check that the data is replicated across instances, run the read request on any
other instance -- ``instance-002`` or ``instance-003``. The result is the same as on ``instance-001``
+.. image:: tcm_start_instance_read.png
+ :width: 700
+ :align: center
+ :alt: Reading data through TCM
+
.. note::
If you try to execute a write request on any instance but ``instance-001``,
From b1a5743267525690fa9ff9343e76fc582195913d Mon Sep 17 00:00:00 2001
From: Pavel Semyonov
Date: Mon, 29 Jan 2024 13:42:53 +0700
Subject: [PATCH 03/14] Add images
---
doc/how-to/getting_started_tcm.rst | 6 +++---
doc/how-to/images/tcm_start_cluster_edit.png | Bin 0 -> 134480 bytes
.../images/tcm_start_cluster_general.png | Bin 0 -> 249327 bytes
.../images/tcm_start_cluster_storage.png | Bin 0 -> 227951 bytes
.../images/tcm_start_cluster_tarantool.png | Bin 0 -> 168178 bytes
doc/how-to/images/tcm_start_empty_cluster.png | Bin 0 -> 185355 bytes
.../images/tcm_start_instance_details.png | Bin 0 -> 263404 bytes
doc/how-to/images/tcm_start_instance_read.png | Bin 0 -> 249382 bytes
.../images/tcm_start_instance_terminal.png | Bin 0 -> 310754 bytes
doc/how-to/images/tcm_start_instance_write.png | Bin 0 -> 311258 bytes
.../images/tcm_start_stateboard_offline.png | Bin 0 -> 225735 bytes
.../images/tcm_start_stateboard_online.png | Bin 0 -> 247405 bytes
12 files changed, 3 insertions(+), 3 deletions(-)
create mode 100644 doc/how-to/images/tcm_start_cluster_edit.png
create mode 100644 doc/how-to/images/tcm_start_cluster_general.png
create mode 100644 doc/how-to/images/tcm_start_cluster_storage.png
create mode 100644 doc/how-to/images/tcm_start_cluster_tarantool.png
create mode 100644 doc/how-to/images/tcm_start_empty_cluster.png
create mode 100644 doc/how-to/images/tcm_start_instance_details.png
create mode 100644 doc/how-to/images/tcm_start_instance_read.png
create mode 100644 doc/how-to/images/tcm_start_instance_terminal.png
create mode 100644 doc/how-to/images/tcm_start_instance_write.png
create mode 100644 doc/how-to/images/tcm_start_stateboard_offline.png
create mode 100644 doc/how-to/images/tcm_start_stateboard_online.png
diff --git a/doc/how-to/getting_started_tcm.rst b/doc/how-to/getting_started_tcm.rst
index 658e286c88..4f4058309c 100644
--- a/doc/how-to/getting_started_tcm.rst
+++ b/doc/how-to/getting_started_tcm.rst
@@ -30,9 +30,9 @@ Setting up Tarantool EE
This creates the ``tarantool-enterprise`` directory beside the archive.
The directory contains three executables for key Tarantool EE components:
- * ``tarantool`` - Tarantool Enterprise Edition
- * the - :ref:`tt ` command-line utility
- * ``tcm`` - :ref:`tcm`
+ * ``tarantool`` -- Tarantool Enterprise Edition.
+ * ``tt`` -- the :ref:`tt ` command-line utility.
+ * ``tcm`` -- :ref:`tcm`.
#. Add the Tarantool EE components to the executable path running the ``env.sh``
script included in the distribution:
diff --git a/doc/how-to/images/tcm_start_cluster_edit.png b/doc/how-to/images/tcm_start_cluster_edit.png
new file mode 100644
index 0000000000000000000000000000000000000000..0b92eeb52f33f0ab3b375d84d850cb50fc9936a1
GIT binary patch
literal 134480
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