You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by xx...@apache.org on 2022/08/12 10:09:09 UTC

[kylin] 01/03: KYLIN-5221, add deploy mode

This is an automated email from the ASF dual-hosted git repository.

xxyu pushed a commit to branch doc5.0
in repository https://gitbox.apache.org/repos/asf/kylin.git

commit 8ab848ed25e017ebfc6c0b40c55ea94438f2e40f
Author: Mukvin <bo...@163.com>
AuthorDate: Fri Aug 12 15:41:31 2022 +0800

    KYLIN-5221, add deploy mode
---
 .../deployment/deploy_mode/cluster_deployment.md   |  86 +++++++++++++++
 .../deploy_mode/images/cluster_20191231.png        | Bin 0 -> 199821 bytes
 website/docs/deployment/deploy_mode/intro.md       |  18 ++++
 .../docs/deployment/deploy_mode/rw_separation.md   |  90 ++++++++++++++++
 .../deployment/deploy_mode/service_discovery.md    |  36 +++++++
 .../rdbms_metastore/{ => mysql}/install_mysql.md   |   6 +-
 .../docs/deployment/rdbms_metastore/mysql/intro.md |  20 ++++
 .../rdbms_metastore/mysql/mysql_metastore.md       | 118 +++++++++++++++++++++
 .../{ => postgresql}/default_metastore.md          |   0
 .../{ => postgresql}/install_postgresql.md         |   4 +-
 .../deployment/rdbms_metastore/postgresql/intro.md |  20 ++++
 website/docs/intro.md                              |  14 ++-
 website/docs/modeling/intro.md                     |  25 +++--
 website/docs/operations/intro.md                   |  26 +++--
 website/docs/restapi/intro.md                      |  25 +++--
 website/sidebars.js                                |  86 +++++++++++++--
 16 files changed, 530 insertions(+), 44 deletions(-)

diff --git a/website/docs/deployment/deploy_mode/cluster_deployment.md b/website/docs/deployment/deploy_mode/cluster_deployment.md
new file mode 100644
index 0000000000..18b5d4b0ae
--- /dev/null
+++ b/website/docs/deployment/deploy_mode/cluster_deployment.md
@@ -0,0 +1,86 @@
+---
+title: Cluster Deployment
+language: en
+sidebar_label: Cluster Deployment
+pagination_label: Cluster Deployment
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - cluster deployment
+    - cluster
+draft: true
+last_update:
+    date: 12/08/2022
+---
+
+All Kylin state information instance is stored in a RDBMS database, so running Kylin on multiple nodes in a cluster is good practice for better load balance and higher availability. Currently, we only support deployment with one `all` node and multiple `query` nodes.
+
+[comment]: <#TODO> (![Deployment Architecture]&#40;images/cluster_20191231.png&#41;)
+
+In the above diagram, the components which require user deployment are below:
+
+- RDBMS as Metastore(PostgreSQL/MySQL)
+- Time-Series Database (InfluxDB)
+- Kylin nodes
+- Load Balancer
+
+We will go through each one of them:
+
+### RDBMS and Time-Series Database Introduction
+
+Kylin uses RDBMS to store metadata, please refer to [Use RDBMS as Metastore](../rdbms_metastore/intro.md).
+
+Kylin uses Time-series database to store metrics (mostly for monitor purpose), please refer to [Use InfluxDB as Time-Series Database](../../operations/monitoring/influxdb/influxdb.md). 
+
+### Kylin Nodes Introduction
+
+Currently, Kylin supports multiple nodes deployment. Queries will be distributed through all nodes and jobs can be submitted by all types of nodes. However, the building jobs will be submitted to job engine node ( `all` node and `job` node).
+
+- `query` node: You can submit queries or building jobs on `query` nodes but the jobs cannot be executed.
+- `job` node: This node can execute jobs and metadata operations
+- `all` node: `all` node can perform all the work of `query` and `job` node.
+
+### Kylin Instance Configuration
+
+**Note**: 
+
+- Please deploy Kylin nodes in the same Hadoop cluster. If you need to deploy a read/write separation environment, please refer to [Read/Write Separation Deployment](rw_separation.md) chapter.
+- It is recommended not to start multiple `all` nodes at the same time.
+
+### Kylin Multi-Active Job Engines
+
+Kylin job engine is used to execute building jobs, schedule jobs and metadata operations. Normally, users will configure one or more node as job engine in the cluster deployment.
+
+Since Kylin 5.0, Kylin works "Multi-Active" mode, which meanings every healthy `all` and `job` node can execute building tasks. When one job engine is stopped, the other job engines will take over the running task on it. That will ensure the high availability of Kylin services.
+
+It should be noted that, due to the existence of project locks, when jobs are allocated to nodes, the project is the smallest unit of allocation, that is, all jobs in a project can only be executed on one job engine. Different projects and jobs can be executed on different job engines.
+
+If you want to enable this function, add `kylin.server.mode=all` or `kylin.server.mode=job` into `$KYLIN_HOME/conf/kylin.properties` for more than one node.
+
+The related config items are shown below:
+```properties
+kylin.server.leader-race.heart-beat-timeout=60
+kylin.server.leader-race.heart-beat-interval=30
+kylin.job.ssh-username=username
+kylin.job.ssh-password=password
+```
+`kylin.server.leader-race.heart-beat-timeout` stands for heart beat timeout,default value is 60, in seconds. When an job engine node didn't send heartbeat for more than this value, this node will be marked as unavailable.
+`kylin.server.leader-race.heart-beat-interval` stands for heart beating's time interval,default value is 30, in seconds, which means each job engine node will send heartbeat for every 30 seconds.
+`kylin.job.ssh-username` stands for ssh login username between Kylin nodes, if passwordless is not configured.
+`kylin.job.ssh-password` stands for ssh login password between Kylin nodes, if passwordless is not configured.
+
+
+**Known Limitations**
+
+1. Enable session sharing is required when using Kylin HA. Add `spring.session.store-type=jdbc` into `$KYLIN_HOME/conf/kylin.properties` for each node.
+2. Please make sure there is no clock skew in the cluster. You can use `ntp` service to sync the clock in the cluster.
+3. When a Kylin job engine node is down, may lead to all projects owned by this node send metadata related requests, the hint is: `System is trying to recover, please try again later.`
+4. When all Kylin job engine nodes are down, you may see the hint when you trying to send metadata related requests in the `query` node: `There is no active All node, please contact to your administrator to check and fix.`.
+5. It is necessary to configure password-free login between each node, or ensure that the ssh login information between each node is consistent.
+
+**Note:**
+
+- The "Multi-Active" mode is enabled by default. If there is only one `all` or `job` node, this mode should be turned off because of performance considerations. If you want to disable this feature, please add `kylin.server.leader-race.enabled=false` in `$KYLIN_HOME/conf/kylin.properties` for the `all` or `job` node.
+- If you want to enable it again, please update the relationship between projects and the job engines. After that, you need call Rest API to update the data. For details, please refer to [Project Settings API](../../restapi/project_api.md)
diff --git a/website/docs/deployment/deploy_mode/images/cluster_20191231.png b/website/docs/deployment/deploy_mode/images/cluster_20191231.png
new file mode 100644
index 0000000000..0d13c43390
Binary files /dev/null and b/website/docs/deployment/deploy_mode/images/cluster_20191231.png differ
diff --git a/website/docs/deployment/deploy_mode/intro.md b/website/docs/deployment/deploy_mode/intro.md
new file mode 100644
index 0000000000..27ef9f3b86
--- /dev/null
+++ b/website/docs/deployment/deploy_mode/intro.md
@@ -0,0 +1,18 @@
+---
+title: Deployment Mode
+language: en
+sidebar_label: Deployment Mode
+pagination_label: Deployment Mode
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - deployment mode
+draft: false
+last_update:
+    date: 12/08/2022
+---
+
+This chapter introduces the different Kylin deployment modes and options to achieve high performance, high stability, and high availability.
+
diff --git a/website/docs/deployment/deploy_mode/rw_separation.md b/website/docs/deployment/deploy_mode/rw_separation.md
new file mode 100644
index 0000000000..2f2dbb1fc1
--- /dev/null
+++ b/website/docs/deployment/deploy_mode/rw_separation.md
@@ -0,0 +1,90 @@
+---
+title: Read/Write Separation Deployment
+language: en
+sidebar_label: Read/Write Separation Deployment
+pagination_label: Read/Write Separation Deployment
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+   - read/write separation
+   - separation
+draft: false
+last_update:
+   date: 12/08/2022
+---
+
+Kylin's tasks based on Hadoop are mainly divided into two types: build and query. If these two tasks use the same set of Hadoop resources, resource preemption may occur between the build and the query, which makes them not stable and fast.
+
+Kylin allows you to finish building and query tasks on different Hadoop clusters. There are many write operations in the former, known as the **Build Cluster**, while the latter is dominated by read-only operations, called **Query Cluster**. The build task will be sent to the build cluster. After the build is completed, the system will send the data into the query cluster so as to executing query tasks.
+
+With a read/write separation deployment, you can completely isolate both build and query workloads, allowing them to run independently, avoiding improper interactions between them and possible performance instability.
+
+### Prerequisites
+
+Due to the involvement of two Hadoop environments, please read and comply with the following environmental checks.
+
+1. Please confirm the Hadoop versions of build cluster and query cluster are identical, and they're supported version by Kylin.
+
+2. Please confirm that the Hadoop client of build cluster and query cluster is installed and configured on the **Kylin server**. Check commands like `hdfs`、`hive` are all working properly and can access cluster resources.
+
+3. If the two clusters have enabled the HDFS NameNode HA, please check and make sure their HDFS nameservice names are different. If they are the same, please change one of them to avoid conflict.
+
+4. Please check the two clusters can access each other without manually inputting any user credential.
+
+   > **Tips**: As a test, on any build cluster try to copy some HDFS files from/to the query cluster. The copy must succeed without any extra manual interaction.
+
+5. Please make sure the network latency between the two clusters is low enough, as there will be a large number of data moved back and forth during model build process.
+
+6. If Kerberos is enabled, please check the following:
+
+   - The build cluster and the query cluster belong to different realms.
+   - The cross-realm trust between the two clusters is configured properly.
+
+### Install and Configure Read/Write Separation Deployment
+
+You can follow the below instructions to finish Kylin read/write separation deployment based on hadoop clusters.
+
+1. First of all, on **Kylin server**, uncompress Kylin software package to the same location. This location will be referenced as `$KYLIN_HOME` later.
+
+2. Secondly, you should prepare the hadoop conf file of the two clusters. The hadoop configuration of query cluster should be put into `$KYLIN_HOME/hadoop_conf` directory, while that of build query will be put into `$KYLIN_HOME/write_hadoop_conf` directory. What's more, the `hive-site.xml` of the build cluster should be put into the above two directories, make two copies of hive-site.xml and name them hiveserver2-site.xml and hivemetastore-site.xml respectively. 
+   
+   If Kerberos authentication enabled, you need to copy the krb5.conf file of build cluster to the `$KYLIN_HOME/write_hadoop_conf` directory and copy the krb5.conf file of query cluster to the `$KYLIN_HOME/hadoop_conf` directory.
+
+3. Set the configuration:
+
+   ```properties
+   kylin.engine.submit-hadoop-conf-dir=$KYLIN_HOME/write_hadoop_conf
+
+   ## Working path of Kylin instance on HDFS. Please replace {working_dir} with the real working path, and use the absolute path, such as hdfs://kylin
+   kylin.env.hdfs-working-dir={working_dir}
+   ```
+
+4. If Kerberos is enabled, you will need to do additional configuration:
+
+   ```properties
+   kylin.storage.columnar.spark-conf.spark.yarn.access.hadoopFileSystems=hdfs://readcluster,hdfs://writecluster
+   kylin.engine.spark-conf.spark.yarn.access.hadoopFileSystems=hdfs://readcluster,hdfs://writecluster
+   ```
+5. If the Kerberos authentication mechanism enabled, the following checks need to be done to avoid errors in the segment build job:
+   
+   ```
+   java.lang.IllegalArgumentException: Can't get Kerberos realm
+   ...
+   Caused by: KrbException: Cannot locate default realm
+   ```
+   
+   1. Make sure the `keytab` file and `krb5.conf` file required for authentication exist in the directory `$KYLIN_HOME/conf`
+   2. If the directory `$KYLIN_HOME/hadoop_conf` exists, make sure there is a `krb5.conf` file in this directory
+   3. If the directory `$KYLIN_HOME/write_hadoop_conf` exists, make sure there is a `krb5.conf` file in this directory
+
+Now read/write separation deployment is configured. 
+
+**Note:**
+
+* `$KYLIN_HOME/bin/check-env.sh` and `$KYLIN_HOME/bin/sample.sh` are not available in this deployment mode.
+
+* In this mode, `kylin.engine.spark-conf.spark.yarn.queue` in `kylin.properties` should be configured as the queue of the build cluster.
+
+
diff --git a/website/docs/deployment/deploy_mode/service_discovery.md b/website/docs/deployment/deploy_mode/service_discovery.md
new file mode 100644
index 0000000000..a08758deff
--- /dev/null
+++ b/website/docs/deployment/deploy_mode/service_discovery.md
@@ -0,0 +1,36 @@
+---
+title: Service Discovery
+language: en
+sidebar_label: Service Discovery
+pagination_label: Service Discovery
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - service discovery
+    - ha
+draft: false
+last_update:
+    date: 12/08/2022
+---
+
+Multiple Kylin instances can work together as a cluster. When a Kylin instance is started, stopped, or lost, other instances in the cluster will be updated automatically. Kylin has a new implementation based on Apache Curator framework, which is more convenient and more stable. 
+
+If you want to enable service discovery, please set the correct ZooKeeper address in the configuration file `$KYLIN_HOME/conf/kylin.properties`. For example: 
+
+```properties
+kylin.env.zookeeper-connect-string=host1:2181,host2:2181,host3:2181
+```
+
+After the configuration, please restart Kylin. Each Kylin instance will register itself in ZooKeeper, and each one will discover other instances from ZooKeeper. 
+
+By default, Kylin will use hostname as the node name. If the cluster you run Kylin on cannot parses the host name to IP address through DNS and other services, you could set an additional configuration in  `$KYLIN_HOME/conf/kylin.properties` as below (this can avoid communication errors between Kylin servers). For example:
+
+```properties
+spring.cloud.zookeeper.discovery.instance-host=10.1.2.3
+```
+
+This config enforces Kylin to use IP address for service registry, making sure that other instances can find it by IP address instead of hostname. In case you use this config, please specify this config for **each of the Kylin instance** in `kylin.properties`. 
+
+**Note:** Please replace the IP address with actual IP address on each server.
diff --git a/website/docs/deployment/rdbms_metastore/install_mysql.md b/website/docs/deployment/rdbms_metastore/mysql/install_mysql.md
similarity index 97%
rename from website/docs/deployment/rdbms_metastore/install_mysql.md
rename to website/docs/deployment/rdbms_metastore/mysql/install_mysql.md
index b3bced9cd6..d3464debea 100644
--- a/website/docs/deployment/rdbms_metastore/install_mysql.md
+++ b/website/docs/deployment/rdbms_metastore/mysql/install_mysql.md
@@ -8,7 +8,9 @@ toc_max_heading_level: 6
 pagination_prev: null
 pagination_next: null
 keywords:
-   - postgresql
+   - mysql
+   - install mysql
+   - install
 draft: true
 last_update:
    date: 11/08/2022
@@ -21,7 +23,7 @@ last_update:
    - MySQL 5.1 to 5.7, MySQL 5.7 is recommended
    - MySQL 8
 
-2. JDBC driver of MySQL is needed in the Kyligence Enterprise running environment.
+2. JDBC driver of MySQL is needed in the Kylin running environment.
 
 3. You can download the JDBC driver jar package of MySQL 8 via the link below, that compatible with the version after 5.6:
 
diff --git a/website/docs/deployment/rdbms_metastore/mysql/intro.md b/website/docs/deployment/rdbms_metastore/mysql/intro.md
new file mode 100644
index 0000000000..fd0cf7a152
--- /dev/null
+++ b/website/docs/deployment/rdbms_metastore/mysql/intro.md
@@ -0,0 +1,20 @@
+---
+title: MySQL
+language: en
+sidebar_label: MySQL
+pagination_label: MySQL
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - mysql
+draft: false
+last_update:
+    date: 11/08/2022
+---
+
+Kylin supports to use MySQL as Metastore, this chapter will discuss how to:
+
+- [Install MySQL](install_mysql.md)
+- [Use MySQL as Metastore](mysql_metastore.md)
diff --git a/website/docs/deployment/rdbms_metastore/mysql/mysql_metastore.md b/website/docs/deployment/rdbms_metastore/mysql/mysql_metastore.md
new file mode 100644
index 0000000000..408edf4ceb
--- /dev/null
+++ b/website/docs/deployment/rdbms_metastore/mysql/mysql_metastore.md
@@ -0,0 +1,118 @@
+---
+title: Use MySQL as Metastore
+language: en
+sidebar_label: Use MySQL as Metastore
+pagination_label: Use MySQL as Metastore
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+   - mysql
+   - mysql metastore
+   - metastore
+draft: false
+last_update:
+   date: 11/08/2022
+---
+
+
+### <span id ="Prerequisite">Prerequisite</span>
+
+1. Please install MySQL, If the MySQL has not been installed, please refer to [Insatall MySQL](install_mysql.md) for more details. 
+
+### <span id ="ConfigurationSteps">Configuration Steps</span>
+
+The following steps illustrate how to connect MySQL as metastore. Here is an example for MySQL 5.7 .
+
+1. Create database `kylin` in MySQL
+
+2. Set configuration item `kylin.metadata.url = {metadata_name}@jdbc` in `$KYLIN_HOME/conf/kylin.properties`,
+   please replace `{metadata_name}` with your metadata name in MySQL, for example, `kylin_default_instance@jdbc`, the maximum length of `{metadata_name}` allowed is 29.
+
+   > **Note**: If the metadata name doesn't exist, it will be automatically created in MySQL. Otherwise, Kylin will use the existing one.
+
+   For example: 
+
+   ```properties
+   kylin.metadata.url={metadata_name}@jdbc,driverClassName=com.mysql.jdbc.Driver,url=jdbc:mysql://{host}:{port}/kylin?useUnicode=true&characterEncoding=utf8,username={user},password={password},maxTotal=50,maxIdle=8
+   ```
+   
+   The meaning of each parameter is as below, `url`, `username`, and `password` are required parameters. For others, default values will be used if they are not indicated.
+	
+   * **driverClassName**: JDBC's driver class name, default value is `com.mysql.jdbc.Driver`;
+   * **url**: JDBC's url;
+     * **host**:MySQL ip address, whose default value is `localhost`;
+     * **port**:MySQL port, whose default value is `3306`. Please use the actual port to replace. 
+     * **kylin**: Metabase name. Make sure this database `kylin` has been created in MySQL;
+   * **username**: JDBC's username; 
+   * **password**: JDBC's password;
+   * **maxTotal**: max number of database's connection number, default value is 50; 
+   * **maxIdle**: max number of database's waiting connection number, default value is 8;
+   
+> **Note**:  if your query SQL contains chinese, please configure the character encoding to utf8 in kylin.metadata.url to avoid confusing query history: useunicode = true & character encoding = utf8
+
+3. Encrypt JDBC password
+
+   If you need to encrypt JDBC's password, you can do it like this:
+   
+   **i.** run following commands in ${KYLIN_HOME}, it will print encrypted password
+   ```shell
+   ./bin/kylin.sh org.apache.kylin.tool.general.CryptTool -e AES -s <password>
+   ```
+
+   **ii.** config properties kylin.metadata.url's password like this
+   ```properties
+   password=ENC('${encrypted_password}')
+   ```
+
+   For example, the following assumes that the JDBC password is kylin:
+
+   First, we need to encrypt kylin using the following command
+   ```shell
+   ${KYLIN_HOME}/bin/kylin.sh org.apache.kylin.tool.general.CryptTool -e AES -s kylin
+   AES encrypted password is: 
+   YeqVr9MakSFbgxEec9sBwg==
+   ```
+   Then, config kylin.metadata.url like this:
+   ```properties
+   kylin.metadata.url={metadata_name}@jdbc,driverClassName=com.mysql.jdbc.Driver,url=jdbc:mysql://{host}:{port}/kylin?useUnicode=true&characterEncoding=utf8,username={user},password=ENC('YeqVr9MakSFbgxEec9sBwg=='),maxTotal=20,maxIdle=20
+   ```
+
+4. If you need to use MySQL cluster deployment, please add `replication` or `loadbalance` in url with `"`. For example:
+
+   ```properties
+   #use replication in cluster deployment       
+   kylin.metadata.url=kylin_default_instance@jdbc,driverClassName=com.mysql.jdbc.Driver,url="jdbc:mysql:replication://localhost:3306,localhost:3307/kylin?useUnicode=true&characterEncoding=utf8",username=root,password=,maxTotal=20,maxIdle=20
+      
+   #use loadbalance in cluster deployment
+   kylin.metadata.url=kylin_default_instance@jdbc,driverClassName=com.mysql.jdbc.Driver,url="jdbc:mysql:loadbalance://localhost:3306,localhost:3307/kylin?useUnicode=true&characterEncoding=utf8",username=root,password=,maxTotal=20,maxIdle=20
+   ```
+5. Make sure that the storage engine used with MySQL is **InnoDB** is not **MyISAM** and that the default storage engine is modified as follows:
+
+   ```Properties
+   [mysqld]
+   default-storage-engine=InnoDB
+   ```
+
+### <span id="faq">FAQ</span>
+
+**Q: After the JDK is upgraded to jdk 8u261, the startup of Kylin fails, indicating that the creation of the admin user failed, what should I do? **
+
+A: When you use JDK 8u261 and use MySQL 5.6 or 5.7 as metastore. Since the version before TLS 1.2 has been disabled since the JDK 8u261, and MySQL 5.6 and 5.7 use TLS 1.0 or TLS 1.1 by default, and MySQL must establish an SSL connection by default, which causes conflicts with the TLS protocol, resulting in the startup of Kylin fails, you will see the error message on the terminal as `Create Admin user failed`.
+
+ You have 2 solutions:
+
+Method 1: Modify the metadata configuration parameters and add `useSSL=false`
+
+```properties
+kylin.metadata.url={metadata_name}@jdbc,driverClassName=com.mysql.jdbc.Driver,url=jdbc:mysql://{host}:{port}/kylin?useSSL=false,useUnicode=true&characterEncoding=utf8,username={user},password={password},maxTotal=50,maxIdle=8
+```
+
+Method 2: Modify the java security file `java.security`, find the following configuration, delete TLSv1, TLSv1.1
+
+```sh
+#  jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048
+jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, include jdk.disabled.namedCurves
+```
+
diff --git a/website/docs/deployment/rdbms_metastore/default_metastore.md b/website/docs/deployment/rdbms_metastore/postgresql/default_metastore.md
similarity index 100%
rename from website/docs/deployment/rdbms_metastore/default_metastore.md
rename to website/docs/deployment/rdbms_metastore/postgresql/default_metastore.md
diff --git a/website/docs/deployment/rdbms_metastore/install_postgresql.md b/website/docs/deployment/rdbms_metastore/postgresql/install_postgresql.md
similarity index 98%
rename from website/docs/deployment/rdbms_metastore/install_postgresql.md
rename to website/docs/deployment/rdbms_metastore/postgresql/install_postgresql.md
index 392c4987d0..17d47f61d8 100644
--- a/website/docs/deployment/rdbms_metastore/install_postgresql.md
+++ b/website/docs/deployment/rdbms_metastore/postgresql/install_postgresql.md
@@ -125,7 +125,7 @@ last_update:
 
    **v.** <span id="metadata">Run `\l` to check if the database was created successfully. If you see picture as below, you have just created a database named `kylin`.</span>
 
-   ![check kylin database](./images/installation_create_postgresqldb.jpg)
+   ![check kylin database](../images/installation_create_postgresqldb.jpg)
 
    
 
@@ -162,7 +162,7 @@ The following example is that Linux user `abc` installs and configures PostgreSQ
 
    As the picture shows below, input password after run the command above, the password is the password for user `postgres`, say the password is `kylin`.
 
-   ![initialize postgresql](./images/install_initialize_postgresql.png)
+   ![initialize postgresql](../images/install_initialize_postgresql.png)
 
    **ii.** Edit configuration file
 
diff --git a/website/docs/deployment/rdbms_metastore/postgresql/intro.md b/website/docs/deployment/rdbms_metastore/postgresql/intro.md
new file mode 100644
index 0000000000..b84ad6905a
--- /dev/null
+++ b/website/docs/deployment/rdbms_metastore/postgresql/intro.md
@@ -0,0 +1,20 @@
+---
+title: PostgreSQL
+language: en
+sidebar_label: PostgreSQL
+pagination_label: PostgreSQL
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - postgresql
+draft: false
+last_update:
+    date: 11/08/2022
+---
+
+Kylin supports to use PostgreSQL as Metastore, this chapter will discuss how to:
+
+- [Install PostgreSQL](install_postgresql.md)
+- [Use PostgreSQL as Metastore](default_metastore.md)
diff --git a/website/docs/intro.md b/website/docs/intro.md
index e29e6b6094..e17893a55f 100644
--- a/website/docs/intro.md
+++ b/website/docs/intro.md
@@ -1,5 +1,17 @@
 ---
-sidebar_position: 0
+title: Intro to Kylin 5.0
+language: en
+sidebar_label: Intro to Kylin 5.0
+pagination_label: Intro to Kylin 5.0
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - rest api
+draft: false
+last_update:
+    date: 12/08/2022
 ---
 
 # Intro to Kylin 5.0
diff --git a/website/docs/modeling/intro.md b/website/docs/modeling/intro.md
index ccf4259219..533404ab92 100644
--- a/website/docs/modeling/intro.md
+++ b/website/docs/modeling/intro.md
@@ -1,14 +1,17 @@
 ---
-sidebar_position: 1
+title: Model
+language: en
+sidebar_label: Model
+pagination_label: Model
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - model
+draft: false
+last_update:
+    date: 12/08/2022
 ---
 
-# Tutorial Intro
-
-Let's discover ** Kylin 5.0 in than 15 minutes **.
-
-## Getting Started
-
-```shell
-
-docker pull apachekylin/apache-kylin-standalone:5.0.0
-```
+This chapter introduces the core concepts of Kylin: model and index design basics, advanced measures and load data.
diff --git a/website/docs/operations/intro.md b/website/docs/operations/intro.md
index ccf4259219..e8feeac788 100644
--- a/website/docs/operations/intro.md
+++ b/website/docs/operations/intro.md
@@ -1,14 +1,18 @@
 ---
-sidebar_position: 1
+title: Operation and Maintenance Guide
+language: en
+sidebar_label: Operation and Maintenance Guide
+pagination_label: Operation and Maintenance Guide
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - operation
+    - maintenance
+draft: false
+last_update:
+    date: 12/08/2022
 ---
 
-# Tutorial Intro
-
-Let's discover ** Kylin 5.0 in than 15 minutes **.
-
-## Getting Started
-
-```shell
-
-docker pull apachekylin/apache-kylin-standalone:5.0.0
-```
+This Operation and Maintenance Guide will introduce a suite of capabilities that can help you to manage your Kylin projects, do system maintenance, work with logs.
diff --git a/website/docs/restapi/intro.md b/website/docs/restapi/intro.md
index ccf4259219..cc09056c66 100644
--- a/website/docs/restapi/intro.md
+++ b/website/docs/restapi/intro.md
@@ -1,14 +1,17 @@
 ---
-sidebar_position: 1
+title: Rest API
+language: en
+sidebar_label: Rest API
+pagination_label: Rest API
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - rest api
+draft: false
+last_update:
+    date: 12/08/2022
 ---
 
-# Tutorial Intro
-
-Let's discover ** Kylin 5.0 in than 15 minutes **.
-
-## Getting Started
-
-```shell
-
-docker pull apachekylin/apache-kylin-standalone:5.0.0
-```
+Kylin provides various REST APIs, which can be used to execute queries, trigger a build job and so on. With those APIs, the third-party system could integrate with Kylin system seamlessly.  
diff --git a/website/sidebars.js b/website/sidebars.js
index 0fddf1a701..b216a05067 100644
--- a/website/sidebars.js
+++ b/website/sidebars.js
@@ -81,18 +81,64 @@ const sidebars = {
                       type: 'doc',
                       id: 'deployment/rdbms_metastore/intro',
                   },
+                  items: [
+                      {
+                          type: 'category',
+                          label: 'MySQL',
+                          link: {
+                              type: 'doc',
+                              id: 'deployment/rdbms_metastore/mysql/intro',
+                          },
+                          items: [
+                              {
+                                  type: 'doc',
+                                  id: 'deployment/rdbms_metastore/mysql/install_mysql'
+                              },
+                              {
+                                  type: 'doc',
+                                  id: 'deployment/rdbms_metastore/mysql/mysql_metastore'
+                              },
+                          ],
+                      },
+                      {
+                          type: 'category',
+                          label: 'PostgreSQL',
+                          link: {
+                              type: 'doc',
+                              id: 'deployment/rdbms_metastore/postgresql/intro',
+                          },
+                          items: [
+                              {
+                                  type: 'doc',
+                                  id: 'deployment/rdbms_metastore/postgresql/install_postgresql'
+                              },
+                              {
+                                  type: 'doc',
+                                  id: 'deployment/rdbms_metastore/postgresql/default_metastore'
+                              },
+                          ],
+                      },
+                  ]
+              },
+              {
+                  type: 'category',
+                  label: 'Deployment Mode',
+                  link: {
+                      type: 'doc',
+                      id: 'deployment/deploy_mode/intro',
+                  },
                   items: [
                       {
                           type: 'doc',
-                          id: 'deployment/rdbms_metastore/default_metastore'
+                          id: 'deployment/deploy_mode/cluster_deployment'
                       },
                       {
                           type: 'doc',
-                          id: 'deployment/rdbms_metastore/install_postgresql'
+                          id: 'deployment/deploy_mode/service_discovery'
                       },
                       {
                           type: 'doc',
-                          id: 'deployment/rdbms_metastore/install_mysql'
+                          id: 'deployment/deploy_mode/rw_separation'
                       },
                   ]
               }
@@ -130,11 +176,39 @@ const sidebars = {
       },
       {
           type: 'category',
-          label: 'Operations',
+          label: 'Operation and Maintenance Guide',
+          link: {
+              type: 'doc',
+              id: 'operations/intro',
+          },
           items: [
               {
-                  type: 'doc',
-                  id: 'operations/intro'
+                  type: 'category',
+                  label: 'Monitoring',
+                  link: {
+                      type: 'doc',
+                      id: 'operations/monitoring/intro',
+                  },
+                  items: [
+                      {
+                          type: 'category',
+                          label: 'InfluxDB',
+                          link: {
+                              type: 'doc',
+                              id: 'operations/monitoring/influxdb/intro',
+                          },
+                          items: [
+                              {
+                                  type: 'doc',
+                                  id: 'operations/monitoring/influxdb/influxdb'
+                              },
+                              {
+                                  type: 'doc',
+                                  id: 'operations/monitoring/influxdb/influxdb_maintenance'
+                              },
+                          ],
+                      },
+                  ],
               },
           ],
       },