You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dolphinscheduler.apache.org by gi...@apache.org on 2020/02/26 02:38:04 UTC

[incubator-dolphinscheduler-website] branch asf-site updated: Automated deployment: Wed Feb 26 02:37:54 UTC 2020 f03dea6b2598ec0c7522e5cd518b1c82d906f2a6

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

github-bot pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/incubator-dolphinscheduler-website.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new ba0d520  Automated deployment: Wed Feb 26 02:37:54 UTC 2020 f03dea6b2598ec0c7522e5cd518b1c82d906f2a6
ba0d520 is described below

commit ba0d520f75216b0e167418b81fa5541270f29881
Author: lgcareer <lg...@users.noreply.github.com>
AuthorDate: Wed Feb 26 02:37:54 2020 +0000

    Automated deployment: Wed Feb 26 02:37:54 UTC 2020 f03dea6b2598ec0c7522e5cd518b1c82d906f2a6
---
 build/blog.js                               |   2 +-
 build/blogDetail.js                         |   2 +-
 build/community.js                          |   2 +-
 build/documentation.js                      |   2 +-
 build/home.js                               |   2 +-
 zh-cn/docs/1.2.1/architecture-design.html   | 316 +++++++++
 zh-cn/docs/1.2.1/architecture-design.json   |   6 +
 zh-cn/docs/1.2.1/cluster-deployment.html    | 372 +++++++++++
 zh-cn/docs/1.2.1/cluster-deployment.json    |   6 +
 zh-cn/docs/1.2.1/hardware-environment.html  | 132 ++++
 zh-cn/docs/1.2.1/hardware-environment.json  |   6 +
 zh-cn/docs/1.2.1/metadata-1.2.html          | 737 +++++++++++++++++++++
 zh-cn/docs/1.2.1/metadata-1.2.json          |   6 +
 zh-cn/docs/1.2.1/plugin-development.html    |  81 +++
 zh-cn/docs/1.2.1/plugin-development.json    |   6 +
 zh-cn/docs/1.2.1/quick-start.html           |  97 +++
 zh-cn/docs/1.2.1/quick-start.json           |   6 +
 zh-cn/docs/1.2.1/standalone-deployment.html | 439 +++++++++++++
 zh-cn/docs/1.2.1/standalone-deployment.json |   6 +
 zh-cn/docs/1.2.1/system-manual.html         | 976 ++++++++++++++++++++++++++++
 zh-cn/docs/1.2.1/system-manual.json         |   6 +
 zh-cn/docs/1.2.1/upgrade.html               |  65 ++
 zh-cn/docs/1.2.1/upgrade.json               |   6 +
 23 files changed, 3274 insertions(+), 5 deletions(-)

diff --git a/build/blog.js b/build/blog.js
index 86d1528..c445723 100644
--- a/build/blog.js
+++ b/build/blog.js
@@ -8,7 +8,7 @@ object-assign
 (c) Sindre Sorhus
 @license MIT
 */
-var o=Object.getOwnPropertySymbols,a=Object.prototype.hasOwnProperty,i=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map(function(e){return t[e]}).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach(function(e){r[e]=e}),"abcdefghijklmn [...]
+var o=Object.getOwnPropertySymbols,a=Object.prototype.hasOwnProperty,i=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map(function(e){return t[e]}).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach(function(e){r[e]=e}),"abcdefghijklmn [...]
  * react-is.production.min.js
  *
  * Copyright (c) Facebook, Inc. and its affiliates.
diff --git a/build/blogDetail.js b/build/blogDetail.js
index ab4aa36..74dd410 100644
--- a/build/blogDetail.js
+++ b/build/blogDetail.js
@@ -8,7 +8,7 @@ object-assign
 (c) Sindre Sorhus
 @license MIT
 */
-var o=Object.getOwnPropertySymbols,i=Object.prototype.hasOwnProperty,a=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map(function(e){return t[e]}).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach(function(e){r[e]=e}),"abcdefghijklmn [...]
+var o=Object.getOwnPropertySymbols,i=Object.prototype.hasOwnProperty,a=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map(function(e){return t[e]}).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach(function(e){r[e]=e}),"abcdefghijklmn [...]
  * react-is.production.min.js
  *
  * Copyright (c) Facebook, Inc. and its affiliates.
diff --git a/build/community.js b/build/community.js
index bf8f4c9..bb601cc 100644
--- a/build/community.js
+++ b/build/community.js
@@ -8,7 +8,7 @@ object-assign
 (c) Sindre Sorhus
 @license MIT
 */
-var o=Object.getOwnPropertySymbols,i=Object.prototype.hasOwnProperty,a=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map(function(e){return t[e]}).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach(function(e){r[e]=e}),"abcdefghijklmn [...]
+var o=Object.getOwnPropertySymbols,i=Object.prototype.hasOwnProperty,a=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map(function(e){return t[e]}).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach(function(e){r[e]=e}),"abcdefghijklmn [...]
  * react-is.production.min.js
  *
  * Copyright (c) Facebook, Inc. and its affiliates.
diff --git a/build/documentation.js b/build/documentation.js
index 5786f74..bd6972a 100644
--- a/build/documentation.js
+++ b/build/documentation.js
@@ -8,7 +8,7 @@ object-assign
 (c) Sindre Sorhus
 @license MIT
 */
-var o=Object.getOwnPropertySymbols,i=Object.prototype.hasOwnProperty,a=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map(function(e){return t[e]}).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach(function(e){r[e]=e}),"abcdefghijklmn [...]
+var o=Object.getOwnPropertySymbols,i=Object.prototype.hasOwnProperty,a=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map(function(e){return t[e]}).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach(function(e){r[e]=e}),"abcdefghijklmn [...]
  * react-is.production.min.js
  *
  * Copyright (c) Facebook, Inc. and its affiliates.
diff --git a/build/home.js b/build/home.js
index b0588c4..46c5abd 100644
--- a/build/home.js
+++ b/build/home.js
@@ -8,7 +8,7 @@ object-assign
 (c) Sindre Sorhus
 @license MIT
 */
-var o=Object.getOwnPropertySymbols,a=Object.prototype.hasOwnProperty,i=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map(function(e){return t[e]}).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach(function(e){r[e]=e}),"abcdefghijklmn [...]
+var o=Object.getOwnPropertySymbols,a=Object.prototype.hasOwnProperty,i=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map(function(e){return t[e]}).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach(function(e){r[e]=e}),"abcdefghijklmn [...]
  * react-is.production.min.js
  *
  * Copyright (c) Facebook, Inc. and its affiliates.
diff --git a/zh-cn/docs/1.2.1/architecture-design.html b/zh-cn/docs/1.2.1/architecture-design.html
new file mode 100644
index 0000000..be261d2
--- /dev/null
+++ b/zh-cn/docs/1.2.1/architecture-design.html
@@ -0,0 +1,316 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+	<meta charset="UTF-8">
+	<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
+	<meta name="keywords" content="architecture-design" />
+	<meta name="description" content="architecture-design" />
+	<!-- 网页标签标题 -->
+	<title>architecture-design</title>
+	<link rel="shortcut icon" href="/img/docsite.ico"/>
+	<link rel="stylesheet" href="/build/documentation.css" />
+</head>
+<body>
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><img class="logo" src="/img/hlogo_colorful.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-switch-normal">En</span><div class="header-menu"><img class="header-menu-toggle" src="/img/system/menu_gray.png"/><div><ul class="ant-menu blackClass an [...]
+<p>在对调度系统架构说明之前,我们先来认识一下调度系统常用的名词</p>
+<h3>1.名词解释</h3>
+<p><strong>DAG:</strong> 全称Directed Acyclic Graph,简称DAG。工作流中的Task任务以有向无环图的形式组装起来,从入度为零的节点进行拓扑遍历,直到无后继节点为止。举例如下图:</p>
+<p align="center">
+  <img src="/img/dag_examples_cn.jpg" alt="dag示例"  width="60%" />
+  <p align="center">
+        <em>dag示例</em>
+  </p>
+</p>
+<p><strong>流程定义</strong>:通过拖拽任务节点并建立任务节点的关联所形成的可视化<strong>DAG</strong></p>
+<p><strong>流程实例</strong>:流程实例是流程定义的实例化,可以通过手动启动或定时调度生成,流程定义每运行一次,产生一个流程实例</p>
+<p><strong>任务实例</strong>:任务实例是流程定义中任务节点的实例化,标识着具体的任务执行状态</p>
+<p><strong>任务类型</strong>: 目前支持有SHELL、SQL、SUB_PROCESS(子流程)、PROCEDURE、MR、SPARK、PYTHON、DEPENDENT(依赖),同时计划支持动态插件扩展,注意:其中子 <strong>SUB_PROCESS</strong>  也是一个单独的流程定义,是可以单独启动执行的</p>
+<p><strong>调度方式:</strong> 系统支持基于cron表达式的定时调度和手动调度。命令类型支持:启动工作流、从当前节点开始执行、恢复被容错的工作流、恢复暂停流程、从失败节点开始执行、补数、定时、重跑、暂停、停止、恢复等待线程。其中 <strong>恢复被容错的工作流</strong> 和 <strong>恢复等待线程</strong> 两种命令类型是由调度内部控制使用,外部无法调用</p>
+<p><strong>定时调度</strong>:系统采用 <strong>quartz</strong> 分布式调度器,并同时支持cron表达式可视化的生成</p>
+<p><strong>依赖</strong>:系统不单单支持 <strong>DAG</strong> 简单的前驱和后继节点之间的依赖,同时还提供<strong>任务依赖</strong>节点,支持<strong>流程间的自定义任务依赖</strong></p>
+<p><strong>优先级</strong> :支持流程实例和任务实例的优先级,如果流程实例和任务实例的优先级不设置,则默认是先进先出</p>
+<p><strong>邮件告警</strong>:支持 <strong>SQL任务</strong> 查询结果邮件发送,流程实例运行结果邮件告警及容错告警通知</p>
+<p><strong>失败策略</strong>:对于并行运行的任务,如果有任务失败,提供两种失败策略处理方式,<strong>继续</strong>是指不管并行运行任务的状态,直到流程失败结束。<strong>结束</strong>是指一旦发现失败任务,则同时Kill掉正在运行的并行任务,流程失败结束</p>
+<p><strong>补数</strong>:补历史数据,支持<strong>区间并行和串行</strong>两种补数方式</p>
+<h3>2.系统架构</h3>
+<h4>2.1 系统架构图</h4>
+<p align="center">
+  <img src="/img/architecture.jpg" alt="系统架构图"  width="70%" />
+  <p align="center">
+        <em>系统架构图</em>
+  </p>
+</p>
+<h4>2.2 架构说明</h4>
+<ul>
+<li>
+<p><strong>MasterServer</strong></p>
+<p>MasterServer采用分布式无中心设计理念,MasterServer主要负责 DAG 任务切分、任务提交监控,并同时监听其它MasterServer和WorkerServer的健康状态。
+MasterServer服务启动时向Zookeeper注册临时节点,通过监听Zookeeper临时节点变化来进行容错处理。</p>
+<h5>该服务内主要包含:</h5>
+<ul>
+<li>
+<p><strong>Distributed Quartz</strong>分布式调度组件,主要负责定时任务的启停操作,当quartz调起任务后,Master内部会有线程池具体负责处理任务的后续操作</p>
+</li>
+<li>
+<p><strong>MasterSchedulerThread</strong>是一个扫描线程,定时扫描数据库中的 <strong>command</strong> 表,根据不同的<strong>命令类型</strong>进行不同的业务操作</p>
+</li>
+<li>
+<p><strong>MasterExecThread</strong>主要是负责DAG任务切分、任务提交监控、各种不同命令类型的逻辑处理</p>
+</li>
+<li>
+<p><strong>MasterTaskExecThread</strong>主要负责任务的持久化</p>
+</li>
+</ul>
+</li>
+<li>
+<p><strong>WorkerServer</strong></p>
+<p>WorkerServer也采用分布式无中心设计理念,WorkerServer主要负责任务的执行和提供日志服务。WorkerServer服务启动时向Zookeeper注册临时节点,并维持心跳。</p>
+<h5>该服务包含:</h5>
+<ul>
+<li>
+<p><strong>FetchTaskThread</strong>主要负责不断从<strong>Task Queue</strong>中领取任务,并根据不同任务类型调用<strong>TaskScheduleThread</strong>对应执行器。</p>
+</li>
+<li>
+<p><strong>LoggerServer</strong>是一个RPC服务,提供日志分片查看、刷新和下载等功能</p>
+</li>
+</ul>
+</li>
+<li>
+<p><strong>ZooKeeper</strong></p>
+<p>ZooKeeper服务,系统中的MasterServer和WorkerServer节点都通过ZooKeeper来进行集群管理和容错。另外系统还基于ZooKeeper进行事件监听和分布式锁。
+我们也曾经基于Redis实现过队列,不过我们希望DolphinScheduler依赖到的组件尽量地少,所以最后还是去掉了Redis实现。</p>
+</li>
+<li>
+<p><strong>Task Queue</strong></p>
+<p>提供任务队列的操作,目前队列也是基于Zookeeper来实现。由于队列中存的信息较少,不必担心队列里数据过多的情况,实际上我们压测过百万级数据存队列,对系统稳定性和性能没影响。</p>
+</li>
+<li>
+<p><strong>Alert</strong></p>
+<p>提供告警相关接口,接口主要包括<strong>告警</strong>两种类型的告警数据的存储、查询和通知功能。其中通知功能又有<strong>邮件通知</strong>和**SNMP(暂未实现)**两种。</p>
+</li>
+<li>
+<p><strong>API</strong></p>
+<p>API接口层,主要负责处理前端UI层的请求。该服务统一提供RESTful api向外部提供请求服务。
+接口包括工作流的创建、定义、查询、修改、发布、下线、手工启动、停止、暂停、恢复、从该节点开始执行等等。</p>
+</li>
+<li>
+<p><strong>UI</strong></p>
+<p>系统的前端页面,提供系统的各种可视化操作界面,详见<a href="/zh-cn/docs/user_doc/system-manual.html" target="_self">系统使用手册</a>部分。</p>
+</li>
+</ul>
+<h4>2.3 架构设计思想</h4>
+<h5>一、去中心化vs中心化</h5>
+<h6>中心化思想</h6>
+<p>中心化的设计理念比较简单,分布式集群中的节点按照角色分工,大体上分为两种角色:</p>
+<p align="center">
+   <img src="https://analysys.github.io/easyscheduler_docs_cn/images/master_slave.png" alt="master-slave角色"  width="50%" />
+ </p>
+<ul>
+<li>Master的角色主要负责任务分发并监督Slave的健康状态,可以动态的将任务均衡到Slave上,以致Slave节点不至于“忙死”或”闲死”的状态。</li>
+<li>Worker的角色主要负责任务的执行工作并维护和Master的心跳,以便Master可以分配任务给Slave。</li>
+</ul>
+<p>中心化思想设计存在的问题:</p>
+<ul>
+<li>一旦Master出现了问题,则群龙无首,整个集群就会崩溃。为了解决这个问题,大多数Master/Slave架构模式都采用了主备Master的设计方案,可以是热备或者冷备,也可以是自动切换或手动切换,而且越来越多的新系统都开始具备自动选举切换Master的能力,以提升系统的可用性。</li>
+<li>另外一个问题是如果Scheduler在Master上,虽然可以支持一个DAG中不同的任务运行在不同的机器上,但是会产生Master的过负载。如果Scheduler在Slave上,则一个DAG中所有的任务都只能在某一台机器上进行作业提交,则并行任务比较多的时候,Slave的压力可能会比较大。</li>
+</ul>
+<h6>去中心化</h6>
+ <p align="center"
+   <img src="https://analysys.github.io/easyscheduler_docs_cn/images/decentralization.png" alt="去中心化"  width="50%" />
+ </p>
+<ul>
+<li>
+<p>在去中心化设计里,通常没有Master/Slave的概念,所有的角色都是一样的,地位是平等的,全球互联网就是一个典型的去中心化的分布式系统,联网的任意节点设备down机,都只会影响很小范围的功能。</p>
+</li>
+<li>
+<p>去中心化设计的核心设计在于整个分布式系统中不存在一个区别于其他节点的”管理者”,因此不存在单点故障问题。但由于不存在” 管理者”节点所以每个节点都需要跟其他节点通信才得到必须要的机器信息,而分布式系统通信的不可靠行,则大大增加了上述功能的实现难度。</p>
+</li>
+<li>
+<p>实际上,真正去中心化的分布式系统并不多见。反而动态中心化分布式系统正在不断涌出。在这种架构下,集群中的管理者是被动态选择出来的,而不是预置的,并且集群在发生故障的时候,集群的节点会自发的举行&quot;会议&quot;来选举新的&quot;管理者&quot;去主持工作。最典型的案例就是ZooKeeper及Go语言实现的Etcd。</p>
+</li>
+<li>
+<p>DolphinScheduler的去中心化是Master/Worker注册到Zookeeper中,实现Master集群和Worker集群无中心,并使用Zookeeper分布式锁来选举其中的一台Master或Worker为“管理者”来执行任务。</p>
+</li>
+</ul>
+<h5>二、分布式锁实践</h5>
+<p>DolphinScheduler使用ZooKeeper分布式锁来实现同一时刻只有一台Master执行Scheduler,或者只有一台Worker执行任务的提交。</p>
+<ol>
+<li>获取分布式锁的核心流程算法如下</li>
+</ol>
+ <p align="center">
+   <img src="https://analysys.github.io/easyscheduler_docs_cn/images/distributed_lock.png" alt="获取分布式锁流程"  width="50%" />
+ </p>
+<ol start="2">
+<li>DolphinScheduler中Scheduler线程分布式锁实现流程图:</li>
+</ol>
+ <p align="center">
+   <img src="/img/distributed_lock_procss.png" alt="获取分布式锁流程"  width="50%" />
+ </p>
+<h5>三、线程不足循环等待问题</h5>
+<ul>
+<li>如果一个DAG中没有子流程,则如果Command中的数据条数大于线程池设置的阈值,则直接流程等待或失败。</li>
+<li>如果一个大的DAG中嵌套了很多子流程,如下图则会产生“死等”状态:</li>
+</ul>
+ <p align="center">
+   <img src="https://analysys.github.io/easyscheduler_docs_cn/images/lack_thread.png" alt="线程不足循环等待问题"  width="50%" />
+ </p>
+上图中MainFlowThread等待SubFlowThread1结束,SubFlowThread1等待SubFlowThread2结束, SubFlowThread2等待SubFlowThread3结束,而SubFlowThread3等待线程池有新线程,则整个DAG流程不能结束,从而其中的线程也不能释放。这样就形成的子父流程循环等待的状态。此时除非启动新的Master来增加线程来打破这样的”僵局”,否则调度集群将不能再使用。
+<p>对于启动新Master来打破僵局,似乎有点差强人意,于是我们提出了以下三种方案来降低这种风险:</p>
+<ol>
+<li>计算所有Master的线程总和,然后对每一个DAG需要计算其需要的线程数,也就是在DAG流程执行之前做预计算。因为是多Master线程池,所以总线程数不太可能实时获取。</li>
+<li>对单Master线程池进行判断,如果线程池已经满了,则让线程直接失败。</li>
+<li>增加一种资源不足的Command类型,如果线程池不足,则将主流程挂起。这样线程池就有了新的线程,可以让资源不足挂起的流程重新唤醒执行。</li>
+</ol>
+<p>注意:Master Scheduler线程在获取Command的时候是FIFO的方式执行的。</p>
+<p>于是我们选择了第三种方式来解决线程不足的问题。</p>
+<h5>四、容错设计</h5>
+<p>容错分为服务宕机容错和任务重试,服务宕机容错又分为Master容错和Worker容错两种情况</p>
+<h6>1. 宕机容错</h6>
+<p>服务容错设计依赖于ZooKeeper的Watcher机制,实现原理如图:</p>
+ <p align="center">
+   <img src="https://analysys.github.io/easyscheduler_docs_cn/images/fault-tolerant.png" alt="DolphinScheduler容错设计"  width="40%" />
+ </p>
+其中Master监控其他Master和Worker的目录,如果监听到remove事件,则会根据具体的业务逻辑进行流程实例容错或者任务实例容错。
+<ul>
+<li>Master容错流程图:</li>
+</ul>
+ <p align="center">
+   <img src="https://analysys.github.io/easyscheduler_docs_cn/images/fault-tolerant_master.png" alt="Master容错流程图"  width="40%" />
+ </p>
+ZooKeeper Master容错完成之后则重新由DolphinScheduler中Scheduler线程调度,遍历 DAG 找到”正在运行”和“提交成功”的任务,对”正在运行”的任务监控其任务实例的状态,对”提交成功”的任务需要判断Task Queue中是否已经存在,如果存在则同样监控任务实例的状态,如果不存在则重新提交任务实例。
+<ul>
+<li>Worker容错流程图:</li>
+</ul>
+ <p align="center">
+   <img src="https://analysys.github.io/easyscheduler_docs_cn/images/fault-tolerant_worker.png" alt="Worker容错流程图"  width="40%" />
+ </p>
+<p>Master Scheduler线程一旦发现任务实例为” 需要容错”状态,则接管任务并进行重新提交。</p>
+<p>注意:由于” 网络抖动”可能会使得节点短时间内失去和ZooKeeper的心跳,从而发生节点的remove事件。对于这种情况,我们使用最简单的方式,那就是节点一旦和ZooKeeper发生超时连接,则直接将Master或Worker服务停掉。</p>
+<h6>2.任务失败重试</h6>
+<p>这里首先要区分任务失败重试、流程失败恢复、流程失败重跑的概念:</p>
+<ul>
+<li>任务失败重试是任务级别的,是调度系统自动进行的,比如一个Shell任务设置重试次数为3次,那么在Shell任务运行失败后会自己再最多尝试运行3次</li>
+<li>流程失败恢复是流程级别的,是手动进行的,恢复是从只能<strong>从失败的节点开始执行</strong>或<strong>从当前节点开始执行</strong></li>
+<li>流程失败重跑也是流程级别的,是手动进行的,重跑是从开始节点进行</li>
+</ul>
+<p>接下来说正题,我们将工作流中的任务节点分了两种类型。</p>
+<ul>
+<li>
+<p>一种是业务节点,这种节点都对应一个实际的脚本或者处理语句,比如Shell节点,MR节点、Spark节点、依赖节点等。</p>
+</li>
+<li>
+<p>还有一种是逻辑节点,这种节点不做实际的脚本或语句处理,只是整个流程流转的逻辑处理,比如子流程节等。</p>
+</li>
+</ul>
+<p>每一个<strong>业务节点</strong>都可以配置失败重试的次数,当该任务节点失败,会自动重试,直到成功或者超过配置的重试次数。<strong>逻辑节点</strong>不支持失败重试。但是逻辑节点里的任务支持重试。</p>
+<p>如果工作流中有任务失败达到最大重试次数,工作流就会失败停止,失败的工作流可以手动进行重跑操作或者流程恢复操作</p>
+<h5>五、任务优先级设计</h5>
+<p>在早期调度设计中,如果没有优先级设计,采用公平调度设计的话,会遇到先行提交的任务可能会和后继提交的任务同时完成的情况,而不能做到设置流程或者任务的优先级,因此我们对此进行了重新设计,目前我们设计如下:</p>
+<ul>
+<li>按照<strong>不同流程实例优先级</strong>优先于<strong>同一个流程实例优先级</strong>优先于<strong>同一流程内任务优先级</strong>优先于<strong>同一流程内任务</strong>提交顺序依次从高到低进行任务处理。
+<ul>
+<li>
+<p>具体实现是根据任务实例的json解析优先级,然后把<strong>流程实例优先级_流程实例id_任务优先级_任务id</strong>信息保存在ZooKeeper任务队列中,当从任务队列获取的时候,通过字符串比较即可得出最需要优先执行的任务</p>
+<ul>
+<li>
+<p>其中流程定义的优先级是考虑到有些流程需要先于其他流程进行处理,这个可以在流程启动或者定时启动时配置,共有5级,依次为HIGHEST、HIGH、MEDIUM、LOW、LOWEST。如下图</p>
+  <p align="center">
+     <img src="https://analysys.github.io/easyscheduler_docs_cn/images/process_priority.png" alt="流程优先级配置"  width="40%" />
+   </p>
+</li>
+<li>
+<p>任务的优先级也分为5级,依次为HIGHEST、HIGH、MEDIUM、LOW、LOWEST。如下图</p>
+  <p align="center">
+     <img src="https://analysys.github.io/easyscheduler_docs_cn/images/task_priority.png" alt="任务优先级配置"  width="35%" />
+   </p>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+<h5>六、Logback和gRPC实现日志访问</h5>
+<ul>
+<li>
+<p>由于Web(UI)和Worker不一定在同一台机器上,所以查看日志不能像查询本地文件那样。有两种方案:</p>
+</li>
+<li>
+<p>将日志放到ES搜索引擎上</p>
+</li>
+<li>
+<p>通过gRPC通信获取远程日志信息</p>
+</li>
+<li>
+<p>介于考虑到尽可能的DolphinScheduler的轻量级性,所以选择了gRPC实现远程访问日志信息。</p>
+</li>
+</ul>
+ <p align="center">
+   <img src="https://analysys.github.io/easyscheduler_docs_cn/images/grpc.png" alt="grpc远程访问"  width="50%" />
+ </p>
+<ul>
+<li>我们使用自定义Logback的FileAppender和Filter功能,实现每个任务实例生成一个日志文件。</li>
+<li>FileAppender主要实现如下:</li>
+</ul>
+<pre><code class="language-java"><span class="hljs-comment">/**
+ * task log appender
+ */</span>
+<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">TaskLogAppender</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">FileAppender</span>&lt;<span class="hljs-title">ILoggingEvent</span> </span>{
+
+    ...
+
+   <span class="hljs-meta">@Override</span>
+   <span class="hljs-function"><span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">append</span><span class="hljs-params">(ILoggingEvent event)</span> </span>{
+
+       <span class="hljs-keyword">if</span> (currentlyActiveFile == <span class="hljs-keyword">null</span>){
+           currentlyActiveFile = getFile();
+       }
+       String activeFile = currentlyActiveFile;
+       <span class="hljs-comment">// thread name: taskThreadName-processDefineId_processInstanceId_taskInstanceId</span>
+       String threadName = event.getThreadName();
+       String[] threadNameArr = threadName.split(<span class="hljs-string">"-"</span>);
+       <span class="hljs-comment">// logId = processDefineId_processInstanceId_taskInstanceId</span>
+       String logId = threadNameArr[<span class="hljs-number">1</span>];
+       ...
+       <span class="hljs-keyword">super</span>.subAppend(event);
+   }
+}
+</code></pre>
+<p>以/流程定义id/流程实例id/任务实例id.log的形式生成日志</p>
+<ul>
+<li>
+<p>过滤匹配以TaskLogInfo开始的线程名称:</p>
+</li>
+<li>
+<p>TaskLogFilter实现如下:</p>
+</li>
+</ul>
+<pre><code class="language-java"><span class="hljs-comment">/**
+*  task log filter
+*/</span>
+<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">TaskLogFilter</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Filter</span>&lt;<span class="hljs-title">ILoggingEvent</span> </span>{
+
+   <span class="hljs-meta">@Override</span>
+   <span class="hljs-function"><span class="hljs-keyword">public</span> FilterReply <span class="hljs-title">decide</span><span class="hljs-params">(ILoggingEvent event)</span> </span>{
+       <span class="hljs-keyword">if</span> (event.getThreadName().startsWith(<span class="hljs-string">"TaskLogInfo-"</span>)){
+           <span class="hljs-keyword">return</span> FilterReply.ACCEPT;
+       }
+       <span class="hljs-keyword">return</span> FilterReply.DENY;
+   }
+}
+</code></pre>
+<h3>总结</h3>
+<p>本文从调度出发,初步介绍了大数据分布式工作流调度系统--DolphinScheduler的架构原理及实现思路。未完待续</p>
+</div></section><footer class="footer-container"><div class="footer-body"><img src="/img/ds_gray.svg"/><div class="cols-container"><div class="col col-12"><h3>Disclaimer</h3><p>Apache DolphinScheduler (incubating) is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by Incubator. 
+Incubation is required of all newly accepted projects until a further review indicates 
+that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. 
+While incubation status is not necessarily a reflection of the completeness or stability of the code, 
+it does indicate that the project has yet to be fully endorsed by the ASF.</p></div><div class="col col-6"><dl><dt>文档</dt><dd><a href="/zh-cn/docs/1.2.0/user_doc/architecture-design.html" target="_self">概览</a></dd><dd><a href="/zh-cn/docs/1.2.0/user_doc/quick-start.html" target="_self">快速开始</a></dd><dd><a href="/zh-cn/docs/1.2.0/user_doc/backend-development.html" target="_self">开发者指南</a></dd></dl></div><div class="col col-6"><dl><dt>ASF</dt><dd><a href="http://www.apache.org" target="_se [...]
+	<script src="https://f.alicdn.com/react/15.4.1/react-with-addons.min.js"></script>
+	<script src="https://f.alicdn.com/react/15.4.1/react-dom.min.js"></script>
+	<script>
+		window.rootPath = '';
+  </script>
+	<script src="/build/documentation.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/zh-cn/docs/1.2.1/architecture-design.json b/zh-cn/docs/1.2.1/architecture-design.json
new file mode 100644
index 0000000..466c6a9
--- /dev/null
+++ b/zh-cn/docs/1.2.1/architecture-design.json
@@ -0,0 +1,6 @@
+{
+  "filename": "architecture-design.md",
+  "__html": "<h2>系统架构设计</h2>\n<p>在对调度系统架构说明之前,我们先来认识一下调度系统常用的名词</p>\n<h3>1.名词解释</h3>\n<p><strong>DAG:</strong> 全称Directed Acyclic Graph,简称DAG。工作流中的Task任务以有向无环图的形式组装起来,从入度为零的节点进行拓扑遍历,直到无后继节点为止。举例如下图:</p>\n<p align=\"center\">\n  <img src=\"/img/dag_examples_cn.jpg\" alt=\"dag示例\"  width=\"60%\" />\n  <p align=\"center\">\n        <em>dag示例</em>\n  </p>\n</p>\n<p><strong>流程定义</strong>:通过拖拽任务节点并建立任务节点的关联所形成的可视化<strong>DAG</strong></p>\n<p><strong>流程实例</strong>:流程实例是流程定义的实例化,可以通过手动启动或定时调度生成, [...]
+  "link": "/zh-cn/docs/1.2.1/architecture-design.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/1.2.1/cluster-deployment.html b/zh-cn/docs/1.2.1/cluster-deployment.html
new file mode 100644
index 0000000..0848e65
--- /dev/null
+++ b/zh-cn/docs/1.2.1/cluster-deployment.html
@@ -0,0 +1,372 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+	<meta charset="UTF-8">
+	<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
+	<meta name="keywords" content="cluster-deployment" />
+	<meta name="description" content="cluster-deployment" />
+	<!-- 网页标签标题 -->
+	<title>cluster-deployment</title>
+	<link rel="shortcut icon" href="/img/docsite.ico"/>
+	<link rel="stylesheet" href="/build/documentation.css" />
+</head>
+<body>
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><img class="logo" src="/img/hlogo_colorful.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-switch-normal">En</span><div class="header-menu"><img class="header-menu-toggle" src="/img/system/menu_gray.png"/><div><ul class="ant-menu blackClass an [...]
+<p>1.2.1之前DolphinScheduler集群部署分为后端部署和前端部署两部分,1.2.1合并了前后端:</p>
+<h1>1、集群部署</h1>
+<h3>1.1 : 基础软件安装(必装项请自行安装)</h3>
+<ul>
+<li>PostgreSQL (8.2.15+) or Mysql (5.6或者5.7系列)  :  两者任选其一即可</li>
+<li><a href="https://www.oracle.com/technetwork/java/javase/downloads/index.html">JDK</a> (1.8+) :  必装,请安装好后在/etc/profile下配置 JAVA_HOME 及 PATH 变量</li>
+<li>ZooKeeper (3.4.6+) :必装</li>
+<li>Hadoop (2.6+) or MinIO :选装,如果需要用到资源上传功能,可以选择上传到Hadoop or MinIO上</li>
+</ul>
+<pre><code class="language-markdown"> 注意:DolphinScheduler本身不依赖Hadoop、Hive、Spark,仅是会调用他们的Client,用于对应任务的提交。
+</code></pre>
+<h3>1.2 : 下载后端tar.gz包</h3>
+<ul>
+<li>请下载最新版本的后端安装包至服务器部署目录,比如创建 /opt/dolphinscheduler 做为安装部署目录,下载地址: <a href="https://dolphinscheduler.apache.org/zh-cn/docs/release/download.html">下载</a> (以1.2.1版本为例),下载后上传tar包到该目录中,并进行解压</li>
+</ul>
+<pre><code class="language-shell"><span class="hljs-meta">#</span><span class="bash"> 创建部署目录</span>
+mkdir -p /opt/dolphinscheduler;
+cd /opt/dolphinscheduler;
+<span class="hljs-meta">#</span><span class="bash"> 解压缩</span>
+tar -zxvf apache-dolphinscheduler-incubating-1.2.1-dolphinscheduler-bin.tar.gz -C /opt/dolphinscheduler;
+
+mv apache-dolphinscheduler-incubating-1.2.1-dolphinscheduler-bin  dolphinscheduler-bin
+</code></pre>
+<h3>1.3:创建部署用户和hosts映射</h3>
+<ul>
+<li>在<strong>所有</strong>部署调度的机器上创建部署用户,并且一定要配置sudo免密。假如我们计划在ds1,ds2,ds3,ds4这4台机器上部署调度,首先需要在每台机器上都创建部署用户</li>
+</ul>
+<pre><code class="language-shell"><span class="hljs-meta">#</span><span class="bash"> 设置用户名,请自行修改,后面以dolphinscheduler为例</span>
+useradd dolphinscheduler;
+<span class="hljs-meta">
+#</span><span class="bash"> 设置用户密码,请自行修改,后面以dolphinscheduler123为例</span>
+echo "dolphinscheduler123" | passwd --stdin dolphinscheduler
+<span class="hljs-meta">
+#</span><span class="bash"> 配置sudo免密</span>
+echo 'dolphinscheduler  ALL=(ALL)  NOPASSWD: NOPASSWD: ALL' &gt;&gt; /etc/sudoers
+</code></pre>
+<pre><code> 注意:
+ - 因为是以 sudo -u {linux-user} 切换不同linux用户的方式来实现多租户运行作业,所以部署用户需要有 sudo 权限,而且是免密的。
+ - 如果发现/etc/sudoers文件中有&quot;Default requiretty&quot;这行,也请注释掉
+ - 如果用到资源上传的话,还需要在`HDFS或者MinIO`上给该部署用户分配读写的权限
+</code></pre>
+<h3>1.4 : 配置hosts映射和ssh打通及修改目录权限</h3>
+<ul>
+<li>
+<p>以第一台机器(hostname为ds1)作为部署机,在ds1上配置所有待部署机器的hosts, 在ds1以root登录</p>
+<pre><code class="language-shell">vi /etc/hosts
+<span class="hljs-meta">
+#</span><span class="bash">add ip hostname</span>
+192.168.xxx.xxx ds1
+192.168.xxx.xxx ds2
+192.168.xxx.xxx ds3
+192.168.xxx.xxx ds4
+</code></pre>
+<p><em>注意:请删掉或者注释掉127.0.0.1这行</em></p>
+</li>
+<li>
+<p>同步ds1上的/etc/hosts到所有部署机器</p>
+<pre><code class="language-shell">for ip in ds2 ds3;     #请将此处ds2 ds3替换为自己要部署的机器的hostname
+do
+    sudo scp -r /etc/hosts  $ip:/etc/          #在运行中需要输入root密码
+done
+</code></pre>
+<p><em>备注:当然 通过<code>sshpass -p xxx sudo scp -r /etc/hosts $ip:/etc/</code>就可以省去输入密码了</em></p>
+<blockquote>
+<p>centos下sshpass的安装:</p>
+<ol>
+<li>
+<p>先安装epel</p>
+<p>yum install -y epel-release</p>
+<p>yum repolist</p>
+</li>
+<li>
+<p>安装完成epel之后,就可以按照sshpass了</p>
+<p>yum install -y sshpass</p>
+</li>
+</ol>
+</blockquote>
+</li>
+<li>
+<p>在ds1上,切换到部署用户并配置ssh本机免密登录</p>
+<pre><code class="language-shell">su dolphinscheduler;
+
+ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
+cat ~/.ssh/id_rsa.pub &gt;&gt; ~/.ssh/authorized_keys
+chmod 600 ~/.ssh/authorized_keys
+</code></pre>
+</li>
+</ul>
+<p>​ 注意:<em>正常设置后,dolphinscheduler用户在执行命令<code>ssh localhost</code> 是不需要再输入密码的</em></p>
+<ul>
+<li>
+<p>在ds1上,配置部署用户dolphinscheduler ssh打通到其他待部署的机器</p>
+<pre><code class="language-shell">su dolphinscheduler;
+for ip in ds2 ds3;     #请将此处ds2 ds3替换为自己要部署的机器的hostname
+do
+    ssh-copy-id  $ip   #该操作执行过程中需要手动输入dolphinscheduler用户的密码
+done
+<span class="hljs-meta">#</span><span class="bash"> 当然 通过 sshpass -p xxx ssh-copy-id <span class="hljs-variable">$ip</span> 就可以省去输入密码了</span>
+</code></pre>
+</li>
+<li>
+<p>在ds1上,修改目录权限,使得部署用户对dolphinscheduler-bin目录有操作权限</p>
+<pre><code class="language-shell">sudo chown -R dolphinscheduler:dolphinscheduler dolphinscheduler-bin
+</code></pre>
+</li>
+</ul>
+<h3>1.5 : 数据库初始化</h3>
+<ul>
+<li>进入数据库,默认数据库是PostgreSQL,如选择Mysql的话,后续需要添加mysql-connector-java驱动包到DolphinScheduler的lib目录下,这里以mysql为例</li>
+</ul>
+<pre><code>mysql -uroot -p
+</code></pre>
+<ul>
+<li>进入数据库命令行窗口后,执行数据库初始化命令,设置访问账号和密码。<strong>注: {user} 和 {password} 需要替换为具体的数据库用户名和密码</strong></li>
+</ul>
+<pre><code class="language-mysql">   mysql&gt; CREATE DATABASE dolphinscheduler DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
+   mysql&gt; GRANT ALL PRIVILEGES ON dolphinscheduler.* TO '{user}'@'%' IDENTIFIED BY '{password}';
+   mysql&gt; GRANT ALL PRIVILEGES ON dolphinscheduler.* TO '{user}'@'localhost' IDENTIFIED BY '{password}';
+   mysql&gt; flush privileges;
+</code></pre>
+<ul>
+<li>
+<p>创建表和导入基础数据</p>
+<ul>
+<li>修改 conf 目录下 application-dao.properties 中的下列配置</li>
+</ul>
+<pre><code class="language-shell">  vi conf/application-dao.properties 
+</code></pre>
+<ul>
+<li>如果选择 Mysql,请注释掉 PostgreSQL 相关配置(反之同理), 还需要手动添加 [<a href="https://downloads.mysql.com/archives/c-j/"> mysql-connector-java 驱动 jar </a>] 包到 lib 目录下,这里下载的是mysql-connector-java-5.1.47.jar,然后正确配置数据库连接相关信息</li>
+</ul>
+<pre><code class="language-properties"><span class="hljs-comment">  #postgre</span>
+<span class="hljs-comment">  #spring.datasource.driver-class-name=org.postgresql.Driver</span>
+<span class="hljs-comment">  #spring.datasource.url=jdbc:postgresql://localhost:5432/dolphinscheduler</span>
+<span class="hljs-comment">  # mysql</span>
+  <span class="hljs-meta">spring.datasource.driver-class-name</span>=<span class="hljs-string">com.mysql.jdbc.Driver</span>
+  <span class="hljs-meta">spring.datasource.url</span>=<span class="hljs-string">jdbc:mysql://xxx:3306/dolphinscheduler?useUnicode=true&amp;characterEncoding=UTF-8     需要修改ip</span>
+  <span class="hljs-meta">spring.datasource.username</span>=<span class="hljs-string">xxx						需要修改为上面的{user}值</span>
+  <span class="hljs-meta">spring.datasource.password</span>=<span class="hljs-string">xxx						需要修改为上面的{password}值</span>
+</code></pre>
+<ul>
+<li>修改并保存完后,执行 script 目录下的创建表及导入基础数据脚本</li>
+</ul>
+<pre><code class="language-shell">sh script/create-dolphinscheduler.sh
+</code></pre>
+</li>
+</ul>
+<p>​       <em>注意: 如果执行上述脚本报 ”/bin/java: No such file or directory“ 错误,请在/etc/profile下配置  JAVA_HOME 及 PATH 变量</em></p>
+<h3>1.6 : 修改运行参数</h3>
+<ul>
+<li>
+<p>修改 conf/env 目录下的 <code>.dolphinscheduler_env.sh</code> 环境变量(以相关用到的软件都安装在/opt/soft下为例)</p>
+<pre><code class="language-shell">export HADOOP_HOME=/opt/soft/hadoop
+export HADOOP_CONF_DIR=/opt/soft/hadoop/etc/hadoop
+<span class="hljs-meta">#</span><span class="bash"><span class="hljs-built_in">export</span> SPARK_HOME1=/opt/soft/spark1</span>
+export SPARK_HOME2=/opt/soft/spark2
+export PYTHON_HOME=/opt/soft/python
+export JAVA_HOME=/opt/soft/java
+export HIVE_HOME=/opt/soft/hive
+export FLINK_HOME=/opt/soft/flink
+export PATH=$HADOOP_HOME/bin:$SPARK_HOME2/bin:$PYTHON_HOME:$JAVA_HOME/bin:$HIVE_HOME/bin:$PATH:$FLINK_HOME/bin:$PATH
+
+</code></pre>
+<p><code>注: 这一步非常重要,例如 JAVA_HOME 和 PATH 是必须要配置的,没有用到的可以忽略或者注释掉</code></p>
+</li>
+<li>
+<p>将jdk软链到/usr/bin/java下(仍以 JAVA_HOME=/opt/soft/java 为例)</p>
+<pre><code class="language-shell">sudo ln -s /opt/soft/java/bin/java /usr/bin/java
+</code></pre>
+</li>
+<li>
+<p>修改一键部署脚本 <code>install.sh</code>中的各参数,特别注意以下参数的配置</p>
+<pre><code class="language-shell"><span class="hljs-meta">#</span><span class="bash"> 这里填 mysql or postgresql</span>
+dbtype="mysql"
+<span class="hljs-meta">
+#</span><span class="bash"> 数据库连接地址</span>
+dbhost="192.168.xx.xx:3306"
+<span class="hljs-meta">
+#</span><span class="bash"> 数据库名</span>
+dbname="dolphinscheduler"
+<span class="hljs-meta">
+#</span><span class="bash"> 数据库用户名,此处需要修改为上面设置的{user}具体值</span>
+username="xxx"    
+<span class="hljs-meta">
+#</span><span class="bash"> 数据库密码, 如果有特殊字符,请使用\转义,需要修改为上面设置的{passowrd}具体值</span>
+passowrd="xxx"
+<span class="hljs-meta">
+#</span><span class="bash">将DS安装到哪个目录,如: /opt/soft/dolphinscheduler,不同于现在的目录</span>
+installPath="/opt/soft/dolphinscheduler"
+<span class="hljs-meta">
+#</span><span class="bash">使用哪个用户部署,使用1.3小节创建的用户</span>
+deployUser="dolphinscheduler"
+<span class="hljs-meta">
+#</span><span class="bash">zookeeper地址</span>
+zkQuorum="192.168.xx.xx:2181,192.168.xx.xx:2181,192.168.xx.xx:2181"
+<span class="hljs-meta">
+#</span><span class="bash">在哪些机器上部署DS服务</span>
+ips="ds1,ds2,ds3,ds4"
+<span class="hljs-meta">
+#</span><span class="bash">master服务部署在哪台机器上</span>
+masters="ds1,ds2"
+<span class="hljs-meta">
+#</span><span class="bash">worker服务部署在哪台机器上</span>
+workers="ds3,ds4"
+<span class="hljs-meta">
+#</span><span class="bash">报警服务部署在哪台机器上</span>
+alertServer="ds2"
+<span class="hljs-meta">
+#</span><span class="bash">后端api服务部署在在哪台机器上</span>
+apiServers="ds1"
+<span class="hljs-meta">
+
+#</span><span class="bash"> 邮件配置,以qq邮箱为例</span>
+<span class="hljs-meta">#</span><span class="bash"> 邮件协议</span>
+mailProtocol="SMTP"
+<span class="hljs-meta">
+#</span><span class="bash"> 邮件服务地址</span>
+mailServerHost="smtp.exmail.qq.com"
+<span class="hljs-meta">
+#</span><span class="bash"> 邮件服务端口</span>
+mailServerPort="25"
+<span class="hljs-meta">
+#</span><span class="bash"> mailSender和mailUser配置成一样即可</span>
+<span class="hljs-meta">#</span><span class="bash"> 发送者</span>
+mailSender="xxx@qq.com"
+<span class="hljs-meta">
+#</span><span class="bash"> 发送用户</span>
+mailUser="xxx@qq.com"
+<span class="hljs-meta">
+#</span><span class="bash"> 邮箱密码</span>
+mailPassword="xxx"
+<span class="hljs-meta">
+#</span><span class="bash"> TLS协议的邮箱设置为<span class="hljs-literal">true</span>,否则设置为<span class="hljs-literal">false</span></span>
+starttlsEnable="true"
+<span class="hljs-meta">
+#</span><span class="bash"> 邮件服务地址值,参考上面 mailServerHost</span>
+sslTrust="smtp.exmail.qq.com"
+<span class="hljs-meta">
+#</span><span class="bash"> 开启SSL协议的邮箱配置为<span class="hljs-literal">true</span>,否则为<span class="hljs-literal">false</span>。注意: starttlsEnable和sslEnable不能同时为<span class="hljs-literal">true</span></span>
+sslEnable="false"
+<span class="hljs-meta">
+#</span><span class="bash"> excel下载路径</span>
+xlsFilePath="/tmp/xls"
+<span class="hljs-meta">
+#</span><span class="bash"> 业务用到的比如sql等资源文件上传到哪里,可以设置:HDFS,S3,NONE。如果想上传到HDFS,请配置为HDFS;如果不需要资源上传功能请选择NONE。</span>
+resUploadStartupType="HDFS"
+<span class="hljs-meta">
+#</span><span class="bash">如果上传资源保存想保存在hadoop上,hadoop集群的NameNode启用了HA的话,需要将core-site.xml和hdfs-site.xml放到conf目录下,本例即是放到/opt/dolphinscheduler/conf下面,并配置namenode cluster名称;如果NameNode不是HA,则只需要将mycluster修改为具体的ip或者主机名即可 </span>
+defaultFS="hdfs://mycluster:8020"
+<span class="hljs-meta">
+
+#</span><span class="bash"> 如果ResourceManager是HA,则配置为ResourceManager节点的主备ip或者hostname,比如<span class="hljs-string">"192.168.xx.xx,192.168.xx.xx"</span>,否则如果是单ResourceManager或者根本没用到yarn,请配置yarnHaIps=<span class="hljs-string">""</span>即可,我这里没用到yarn,配置为<span class="hljs-string">""</span></span>
+yarnHaIps=""
+<span class="hljs-meta">
+#</span><span class="bash"> 如果是单ResourceManager,则配置为ResourceManager节点ip或主机名,否则保持默认值即可。我这里没用到yarn,保持默认</span>
+singleYarnIp="ark1"
+</code></pre>
+<p><em>特别注意:</em></p>
+<ul>
+<li>如果需要用资源上传到Hadoop集群功能, 并且Hadoop集群的NameNode 配置了 HA的话 ,需要开启 HDFS类型的资源上传,同时需要将Hadoop集群下的core-site.xml和hdfs-site.xml复制到/opt/dolphinscheduler/conf,非NameNode HA跳过次步骤</li>
+</ul>
+</li>
+</ul>
+<h3>1.7 : 执行install.sh部署脚本</h3>
+<ul>
+<li>
+<p>切换到部署用户dolphinscheduler,然后执行一键部署脚本</p>
+<p><code>sh install.sh</code></p>
+<pre><code>注意:
+第一次部署的话,在运行中第3步`3,stop server`出现5次以下信息,此信息可以忽略
+sh: bin/dolphinscheduler-daemon.sh: No such file or directory
+</code></pre>
+</li>
+<li>
+<p>脚本完成后,会启动以下5个服务,使用<code>jps</code>命令查看服务是否启动(<code>jps</code>为<code>java JDK</code>自带)</p>
+</li>
+</ul>
+<pre><code class="language-aidl">    MasterServer         ----- master服务
+    WorkerServer         ----- worker服务
+    LoggerServer         ----- logger服务
+    ApiApplicationServer ----- api服务
+    AlertServer          ----- alert服务
+</code></pre>
+<p>如果以上服务都正常启动,说明自动部署成功</p>
+<p>部署成功后,可以进行日志查看,日志统一存放于logs文件夹内</p>
+<pre><code class="language-日志路径"> logs/
+    ├── dolphinscheduler-alert-server.log
+    ├── dolphinscheduler-master-server.log
+    |—— dolphinscheduler-worker-server.log
+    |—— dolphinscheduler-api-server.log
+    |—— dolphinscheduler-logger-server.log
+</code></pre>
+<h3>1.8 : 登录系统</h3>
+<ul>
+<li>
+<p>访问前端页面地址: <a href="http://192.168.xx.xx:12345/dolphinscheduler">http://192.168.xx.xx:12345/dolphinscheduler</a> ,出现前端登录页面,接口地址(自行修改)</p>
+<pre><code class="language-html"><span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">align</span>=<span class="hljs-string">"center"</span>&gt;</span>
+   <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"/img/login.png"</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"60%"</span> /&gt;</span>
+ <span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
+</code></pre>
+</li>
+</ul>
+<h1>2、启停服务</h1>
+<ul>
+<li>
+<p>一键停止集群所有服务</p>
+<p><code>sh ./bin/stop-all.sh</code></p>
+</li>
+<li>
+<p>一键开启集群所有服务</p>
+<p><code>sh ./bin/start-all.sh</code></p>
+</li>
+<li>
+<p>启停Master</p>
+</li>
+</ul>
+<pre><code class="language-shell">sh ./bin/dolphinscheduler-daemon.sh start master-server
+sh ./bin/dolphinscheduler-daemon.sh stop master-server
+</code></pre>
+<ul>
+<li>启停Worker</li>
+</ul>
+<pre><code class="language-shell">sh ./bin/dolphinscheduler-daemon.sh start worker-server
+sh ./bin/dolphinscheduler-daemon.sh stop worker-server
+</code></pre>
+<ul>
+<li>启停Api</li>
+</ul>
+<pre><code class="language-shell">sh ./bin/dolphinscheduler-daemon.sh start api-server
+sh ./bin/dolphinscheduler-daemon.sh stop api-server
+</code></pre>
+<ul>
+<li>启停Logger</li>
+</ul>
+<pre><code class="language-shell">sh ./bin/dolphinscheduler-daemon.sh start logger-server
+sh ./bin/dolphinscheduler-daemon.sh stop logger-server
+</code></pre>
+<ul>
+<li>启停Alert</li>
+</ul>
+<pre><code class="language-shell">sh ./bin/dolphinscheduler-daemon.sh start alert-server
+sh ./bin/dolphinscheduler-daemon.sh stop alert-server
+</code></pre>
+<p><code>注:服务用途请具体参见《系统架构设计》小节</code></p>
+</div></section><footer class="footer-container"><div class="footer-body"><img src="/img/ds_gray.svg"/><div class="cols-container"><div class="col col-12"><h3>Disclaimer</h3><p>Apache DolphinScheduler (incubating) is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by Incubator. 
+Incubation is required of all newly accepted projects until a further review indicates 
+that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. 
+While incubation status is not necessarily a reflection of the completeness or stability of the code, 
+it does indicate that the project has yet to be fully endorsed by the ASF.</p></div><div class="col col-6"><dl><dt>文档</dt><dd><a href="/zh-cn/docs/1.2.0/user_doc/architecture-design.html" target="_self">概览</a></dd><dd><a href="/zh-cn/docs/1.2.0/user_doc/quick-start.html" target="_self">快速开始</a></dd><dd><a href="/zh-cn/docs/1.2.0/user_doc/backend-development.html" target="_self">开发者指南</a></dd></dl></div><div class="col col-6"><dl><dt>ASF</dt><dd><a href="http://www.apache.org" target="_se [...]
+	<script src="https://f.alicdn.com/react/15.4.1/react-with-addons.min.js"></script>
+	<script src="https://f.alicdn.com/react/15.4.1/react-dom.min.js"></script>
+	<script>
+		window.rootPath = '';
+  </script>
+	<script src="/build/documentation.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/zh-cn/docs/1.2.1/cluster-deployment.json b/zh-cn/docs/1.2.1/cluster-deployment.json
new file mode 100644
index 0000000..e2c0518
--- /dev/null
+++ b/zh-cn/docs/1.2.1/cluster-deployment.json
@@ -0,0 +1,6 @@
+{
+  "filename": "cluster-deployment.md",
+  "__html": "<h1>集群部署(Cluster)</h1>\n<p>1.2.1之前DolphinScheduler集群部署分为后端部署和前端部署两部分,1.2.1合并了前后端:</p>\n<h1>1、集群部署</h1>\n<h3>1.1 : 基础软件安装(必装项请自行安装)</h3>\n<ul>\n<li>PostgreSQL (8.2.15+) or Mysql (5.6或者5.7系列)  :  两者任选其一即可</li>\n<li><a href=\"https://www.oracle.com/technetwork/java/javase/downloads/index.html\">JDK</a> (1.8+) :  必装,请安装好后在/etc/profile下配置 JAVA_HOME 及 PATH 变量</li>\n<li>ZooKeeper (3.4.6+) :必装</li>\n<li>Hadoop (2.6+) or MinIO :选装,如果需要用到资源上传功能,可以选择上传到Hadoop or MinIO上</li>\n</ul>\n<pr [...]
+  "link": "/zh-cn/docs/1.2.1/cluster-deployment.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/1.2.1/hardware-environment.html b/zh-cn/docs/1.2.1/hardware-environment.html
new file mode 100644
index 0000000..a4d4984
--- /dev/null
+++ b/zh-cn/docs/1.2.1/hardware-environment.html
@@ -0,0 +1,132 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+	<meta charset="UTF-8">
+	<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
+	<meta name="keywords" content="hardware-environment" />
+	<meta name="description" content="hardware-environment" />
+	<!-- 网页标签标题 -->
+	<title>hardware-environment</title>
+	<link rel="shortcut icon" href="/img/docsite.ico"/>
+	<link rel="stylesheet" href="/build/documentation.css" />
+</head>
+<body>
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><img class="logo" src="/img/hlogo_colorful.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-switch-normal">En</span><div class="header-menu"><img class="header-menu-toggle" src="/img/system/menu_gray.png"/><div><ul class="ant-menu blackClass an [...]
+<p>DolphinScheduler 作为一款开源分布式工作流任务调度系统,可以很好的部署和运行在 Intel 架构服务器环境及主流虚拟化环境下,并支持主流的Linux操作系统环境。</p>
+<h2>1. Linux 操作系统版本要求</h2>
+<table>
+<thead>
+<tr>
+<th style="text-align:left">操作系统</th>
+<th style="text-align:center">版本</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td style="text-align:left">Red Hat Enterprise Linux</td>
+<td style="text-align:center">7.0 及以上</td>
+</tr>
+<tr>
+<td style="text-align:left">CentOS</td>
+<td style="text-align:center">7.0 及以上</td>
+</tr>
+<tr>
+<td style="text-align:left">Oracle Enterprise Linux</td>
+<td style="text-align:center">7.0 及以上</td>
+</tr>
+<tr>
+<td style="text-align:left">Ubuntu LTS</td>
+<td style="text-align:center">16.04 及以上</td>
+</tr>
+</tbody>
+</table>
+<blockquote>
+<p><strong>注意:</strong>
+以上 Linux 操作系统可运行在物理服务器以及 VMware、KVM、XEN 主流虚拟化环境上。</p>
+</blockquote>
+<h2>2. 服务器建议配置</h2>
+<p>DolphinScheduler 支持运行在 Intel x86-64 架构的 64 位通用硬件服务器平台。对生产环境的服务器硬件配置有以下建议:</p>
+<h3>生产环境</h3>
+<table>
+<thead>
+<tr>
+<th><strong>CPU</strong></th>
+<th><strong>内存</strong></th>
+<th><strong>硬盘类型</strong></th>
+<th><strong>网络</strong></th>
+<th><strong>实例数量</strong></th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>4核+</td>
+<td>8 GB+</td>
+<td>SAS</td>
+<td>千兆网卡</td>
+<td>1+</td>
+</tr>
+</tbody>
+</table>
+<blockquote>
+<p><strong>注意:</strong></p>
+<ul>
+<li>以上建议配置为部署 DolphinScheduler 的最低配置,生产环境强烈推荐使用更高的配置。</li>
+<li>硬盘大小配置建议 50GB+ ,系统盘和数据盘分开。</li>
+</ul>
+</blockquote>
+<h2>3. 网络要求</h2>
+<p>DolphinScheduler正常运行提供如下的网络端口配置:</p>
+<table>
+<thead>
+<tr>
+<th>组件</th>
+<th>默认端口</th>
+<th>说明</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>MasterServer</td>
+<td>5566</td>
+<td>非通信端口,只需本机端口不冲突即可</td>
+</tr>
+<tr>
+<td>WorkerServer</td>
+<td>7788</td>
+<td>非通信端口,只需本机端口不冲突即可</td>
+</tr>
+<tr>
+<td>ApiApplicationServer</td>
+<td>12345</td>
+<td>提供后端通信端口</td>
+</tr>
+<tr>
+<td>nginx</td>
+<td>8888</td>
+<td>提供 UI 端通信端口</td>
+</tr>
+</tbody>
+</table>
+<blockquote>
+<p><strong>注意:</strong></p>
+<ul>
+<li>MasterServer 和 WorkerServer 不需要开启网络间通信,只需本机端口不冲突即可</li>
+<li>管理员可根据实际环境中 DolphinScheduler 组件部署方案,在网络侧和主机侧开放相关端口</li>
+</ul>
+</blockquote>
+<h2>4. 客户端 Web 浏览器要求</h2>
+<p>DolphinScheduler 推荐 Chrome 以及使用 Chrome 内核的较新版本浏览器访问前端可视化操作界面。</p>
+</div></section><footer class="footer-container"><div class="footer-body"><img src="/img/ds_gray.svg"/><div class="cols-container"><div class="col col-12"><h3>Disclaimer</h3><p>Apache DolphinScheduler (incubating) is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by Incubator. 
+Incubation is required of all newly accepted projects until a further review indicates 
+that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. 
+While incubation status is not necessarily a reflection of the completeness or stability of the code, 
+it does indicate that the project has yet to be fully endorsed by the ASF.</p></div><div class="col col-6"><dl><dt>文档</dt><dd><a href="/zh-cn/docs/1.2.0/user_doc/architecture-design.html" target="_self">概览</a></dd><dd><a href="/zh-cn/docs/1.2.0/user_doc/quick-start.html" target="_self">快速开始</a></dd><dd><a href="/zh-cn/docs/1.2.0/user_doc/backend-development.html" target="_self">开发者指南</a></dd></dl></div><div class="col col-6"><dl><dt>ASF</dt><dd><a href="http://www.apache.org" target="_se [...]
+	<script src="https://f.alicdn.com/react/15.4.1/react-with-addons.min.js"></script>
+	<script src="https://f.alicdn.com/react/15.4.1/react-dom.min.js"></script>
+	<script>
+		window.rootPath = '';
+  </script>
+	<script src="/build/documentation.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/zh-cn/docs/1.2.1/hardware-environment.json b/zh-cn/docs/1.2.1/hardware-environment.json
new file mode 100644
index 0000000..a4e0212
--- /dev/null
+++ b/zh-cn/docs/1.2.1/hardware-environment.json
@@ -0,0 +1,6 @@
+{
+  "filename": "hardware-environment.md",
+  "__html": "<h1>软硬件环境建议配置</h1>\n<p>DolphinScheduler 作为一款开源分布式工作流任务调度系统,可以很好的部署和运行在 Intel 架构服务器环境及主流虚拟化环境下,并支持主流的Linux操作系统环境。</p>\n<h2>1. Linux 操作系统版本要求</h2>\n<table>\n<thead>\n<tr>\n<th style=\"text-align:left\">操作系统</th>\n<th style=\"text-align:center\">版本</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td style=\"text-align:left\">Red Hat Enterprise Linux</td>\n<td style=\"text-align:center\">7.0 及以上</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">CentOS</td>\n<td style=\"text-align:center\"> [...]
+  "link": "/zh-cn/docs/1.2.1/hardware-environment.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/1.2.1/metadata-1.2.html b/zh-cn/docs/1.2.1/metadata-1.2.html
new file mode 100644
index 0000000..2b797e3
--- /dev/null
+++ b/zh-cn/docs/1.2.1/metadata-1.2.html
@@ -0,0 +1,737 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+	<meta charset="UTF-8">
+	<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
+	<meta name="keywords" content="metadata-1.2" />
+	<meta name="description" content="metadata-1.2" />
+	<!-- 网页标签标题 -->
+	<title>metadata-1.2</title>
+	<link rel="shortcut icon" href="/img/docsite.ico"/>
+	<link rel="stylesheet" href="/build/documentation.css" />
+</head>
+<body>
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><img class="logo" src="/img/hlogo_colorful.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-switch-normal">En</span><div class="header-menu"><img class="header-menu-toggle" src="/img/system/menu_gray.png"/><div><ul class="ant-menu blackClass an [...]
+<p><a name="25Ald"></a></p>
+<h3>表概览</h3>
+<table>
+<thead>
+<tr>
+<th style="text-align:center">表名</th>
+<th style="text-align:center">表信息</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td style="text-align:center">t_ds_access_token</td>
+<td style="text-align:center">访问ds后端的token</td>
+</tr>
+<tr>
+<td style="text-align:center">t_ds_alert</td>
+<td style="text-align:center">告警信息</td>
+</tr>
+<tr>
+<td style="text-align:center">t_ds_alertgroup</td>
+<td style="text-align:center">告警组</td>
+</tr>
+<tr>
+<td style="text-align:center">t_ds_command</td>
+<td style="text-align:center">执行命令</td>
+</tr>
+<tr>
+<td style="text-align:center">t_ds_datasource</td>
+<td style="text-align:center">数据源</td>
+</tr>
+<tr>
+<td style="text-align:center">t_ds_error_command</td>
+<td style="text-align:center">错误命令</td>
+</tr>
+<tr>
+<td style="text-align:center">t_ds_process_definition</td>
+<td style="text-align:center">流程定义</td>
+</tr>
+<tr>
+<td style="text-align:center">t_ds_process_instance</td>
+<td style="text-align:center">流程实例</td>
+</tr>
+<tr>
+<td style="text-align:center">t_ds_project</td>
+<td style="text-align:center">项目</td>
+</tr>
+<tr>
+<td style="text-align:center">t_ds_queue</td>
+<td style="text-align:center">队列</td>
+</tr>
+<tr>
+<td style="text-align:center">t_ds_relation_datasource_user</td>
+<td style="text-align:center">用户关联数据源</td>
+</tr>
+<tr>
+<td style="text-align:center">t_ds_relation_process_instance</td>
+<td style="text-align:center">子流程</td>
+</tr>
+<tr>
+<td style="text-align:center">t_ds_relation_project_user</td>
+<td style="text-align:center">用户关联项目</td>
+</tr>
+<tr>
+<td style="text-align:center">t_ds_relation_resources_user</td>
+<td style="text-align:center">用户关联资源</td>
+</tr>
+<tr>
+<td style="text-align:center">t_ds_relation_udfs_user</td>
+<td style="text-align:center">用户关联UDF函数</td>
+</tr>
+<tr>
+<td style="text-align:center">t_ds_relation_user_alertgroup</td>
+<td style="text-align:center">用户关联告警组</td>
+</tr>
+<tr>
+<td style="text-align:center">t_ds_resources</td>
+<td style="text-align:center">资源文件</td>
+</tr>
+<tr>
+<td style="text-align:center">t_ds_schedules</td>
+<td style="text-align:center">流程定时调度</td>
+</tr>
+<tr>
+<td style="text-align:center">t_ds_session</td>
+<td style="text-align:center">用户登录的session</td>
+</tr>
+<tr>
+<td style="text-align:center">t_ds_task_instance</td>
+<td style="text-align:center">任务实例</td>
+</tr>
+<tr>
+<td style="text-align:center">t_ds_tenant</td>
+<td style="text-align:center">租户</td>
+</tr>
+<tr>
+<td style="text-align:center">t_ds_udfs</td>
+<td style="text-align:center">UDF资源</td>
+</tr>
+<tr>
+<td style="text-align:center">t_ds_user</td>
+<td style="text-align:center">用户</td>
+</tr>
+<tr>
+<td style="text-align:center">t_ds_version</td>
+<td style="text-align:center">ds版本信息</td>
+</tr>
+<tr>
+<td style="text-align:center">t_ds_worker_group</td>
+<td style="text-align:center">worker分组</td>
+</tr>
+</tbody>
+</table>
+<p><a name="VNVGr"></a></p>
+<h3>用户	队列	数据源</h3>
+<p><img src="/img/metadata-erd/user-queue-datasource.png" alt="image.png"></p>
+<ul>
+<li>一个租户下可以有多个用户<br /></li>
+<li>t_ds_user中的queue字段存储的是队列表中的queue_name信息,t_ds_tenant下存的是queue_id,在流程定义执行过程中,用户队列优先级最高,用户队列为空则采用租户队列<br /></li>
+<li>t_ds_datasource表中的user_id字段表示创建该数据源的用户,t_ds_relation_datasource_user中的user_id表示,对数据源有权限的用户<br />
+<a name="HHyGV"></a></li>
+</ul>
+<h3>项目	资源	告警</h3>
+<p><img src="/img/metadata-erd/project-resource-alert.png" alt="image.png"></p>
+<ul>
+<li>一个用户可以有多个项目,用户项目授权通过t_ds_relation_project_user表完成project_id和user_id的关系绑定<br /></li>
+<li>t_ds_projcet表中的user_id表示创建该项目的用户,t_ds_relation_project_user表中的user_id表示对项目有权限的用户<br /></li>
+<li>t_ds_resources表中的user_id表示创建该资源的用户,t_ds_relation_resources_user中的user_id表示对资源有权限的用户<br /></li>
+<li>t_ds_udfs表中的user_id表示创建该UDF的用户,t_ds_relation_udfs_user表中的user_id表示对UDF有权限的用户<br />
+<a name="Bg2Sn"></a></li>
+</ul>
+<h3>命令	流程	任务</h3>
+<p><img src="/img/metadata-erd/command.png" alt="image.png"><br /><img src="/img/metadata-erd/process-task.png" alt="image.png"></p>
+<ul>
+<li>一个项目有多个流程定义,一个流程定义可以生成多个流程实例,一个流程实例可以生成多个任务实例<br /></li>
+<li>t_ds_schedulers表存放流程定义的定时调度信息<br /></li>
+<li>t_ds_relation_process_instance表存放的数据用于处理流程定义中含有子流程的情况,parent_process_instance_id表示含有子流程的主流程实例id,process_instance_id表示子流程实例的id,parent_task_instance_id表示子流程节点的任务实例id,流程实例表和任务实例表分别对应t_ds_process_instance表和t_ds_task_instance表
+<a name="Pv25P"></a></li>
+</ul>
+<h3>核心表Schema</h3>
+<p><a name="32Jzd"></a></p>
+<h4>t_ds_process_definition</h4>
+<table>
+<thead>
+<tr>
+<th>字段</th>
+<th>类型</th>
+<th>注释</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>id</td>
+<td>int</td>
+<td>主键</td>
+</tr>
+<tr>
+<td>name</td>
+<td>varchar</td>
+<td>流程定义名称</td>
+</tr>
+<tr>
+<td>version</td>
+<td>int</td>
+<td>流程定义版本</td>
+</tr>
+<tr>
+<td>release_state</td>
+<td>tinyint</td>
+<td>流程定义的发布状态:0 未上线  1已上线</td>
+</tr>
+<tr>
+<td>project_id</td>
+<td>int</td>
+<td>项目id</td>
+</tr>
+<tr>
+<td>user_id</td>
+<td>int</td>
+<td>流程定义所属用户id</td>
+</tr>
+<tr>
+<td>process_definition_json</td>
+<td>longtext</td>
+<td>流程定义json串</td>
+</tr>
+<tr>
+<td>description</td>
+<td>text</td>
+<td>流程定义描述</td>
+</tr>
+<tr>
+<td>global_params</td>
+<td>text</td>
+<td>全局参数</td>
+</tr>
+<tr>
+<td>flag</td>
+<td>tinyint</td>
+<td>流程是否可用:0 不可用,1 可用</td>
+</tr>
+<tr>
+<td>locations</td>
+<td>text</td>
+<td>节点坐标信息</td>
+</tr>
+<tr>
+<td>connects</td>
+<td>text</td>
+<td>节点连线信息</td>
+</tr>
+<tr>
+<td>receivers</td>
+<td>text</td>
+<td>收件人</td>
+</tr>
+<tr>
+<td>receivers_cc</td>
+<td>text</td>
+<td>抄送人</td>
+</tr>
+<tr>
+<td>create_time</td>
+<td>datetime</td>
+<td>创建时间</td>
+</tr>
+<tr>
+<td>timeout</td>
+<td>int</td>
+<td>超时时间</td>
+</tr>
+<tr>
+<td>tenant_id</td>
+<td>int</td>
+<td>租户id</td>
+</tr>
+<tr>
+<td>update_time</td>
+<td>datetime</td>
+<td>更新时间</td>
+</tr>
+</tbody>
+</table>
+<p><a name="e6jfz"></a></p>
+<h4>t_ds_process_instance</h4>
+<table>
+<thead>
+<tr>
+<th>字段</th>
+<th>类型</th>
+<th>注释</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>id</td>
+<td>int</td>
+<td>主键</td>
+</tr>
+<tr>
+<td>name</td>
+<td>varchar</td>
+<td>流程实例名称</td>
+</tr>
+<tr>
+<td>process_definition_id</td>
+<td>int</td>
+<td>流程定义id</td>
+</tr>
+<tr>
+<td>state</td>
+<td>tinyint</td>
+<td>流程实例状态:0 提交成功,1 正在运行,2 准备暂停,3 暂停,4 准备停止,5 停止,6 失败,7 成功,8 需要容错,9 kill,10 等待线程,11 等待依赖完成</td>
+</tr>
+<tr>
+<td>recovery</td>
+<td>tinyint</td>
+<td>流程实例容错标识:0 正常,1 需要被容错重启</td>
+</tr>
+<tr>
+<td>start_time</td>
+<td>datetime</td>
+<td>流程实例开始时间</td>
+</tr>
+<tr>
+<td>end_time</td>
+<td>datetime</td>
+<td>流程实例结束时间</td>
+</tr>
+<tr>
+<td>run_times</td>
+<td>int</td>
+<td>流程实例运行次数</td>
+</tr>
+<tr>
+<td>host</td>
+<td>varchar</td>
+<td>流程实例所在的机器</td>
+</tr>
+<tr>
+<td>command_type</td>
+<td>tinyint</td>
+<td>命令类型:0 启动工作流,1 从当前节点开始执行,2 恢复被容错的工作流,3 恢复暂停流程,4 从失败节点开始执行,5 补数,6 调度,7 重跑,8 暂停,9 停止,10 恢复等待线程</td>
+</tr>
+<tr>
+<td>command_param</td>
+<td>text</td>
+<td>命令的参数(json格式)</td>
+</tr>
+<tr>
+<td>task_depend_type</td>
+<td>tinyint</td>
+<td>节点依赖类型:0 当前节点,1 向前执行,2 向后执行</td>
+</tr>
+<tr>
+<td>max_try_times</td>
+<td>tinyint</td>
+<td>最大重试次数</td>
+</tr>
+<tr>
+<td>failure_strategy</td>
+<td>tinyint</td>
+<td>失败策略 0 失败后结束,1 失败后继续</td>
+</tr>
+<tr>
+<td>warning_type</td>
+<td>tinyint</td>
+<td>告警类型:0 不发,1 流程成功发,2 流程失败发,3 成功失败都发</td>
+</tr>
+<tr>
+<td>warning_group_id</td>
+<td>int</td>
+<td>告警组id</td>
+</tr>
+<tr>
+<td>schedule_time</td>
+<td>datetime</td>
+<td>预期运行时间</td>
+</tr>
+<tr>
+<td>command_start_time</td>
+<td>datetime</td>
+<td>开始命令时间</td>
+</tr>
+<tr>
+<td>global_params</td>
+<td>text</td>
+<td>全局参数(固化流程定义的参数)</td>
+</tr>
+<tr>
+<td>process_instance_json</td>
+<td>longtext</td>
+<td>流程实例json(copy的流程定义的json)</td>
+</tr>
+<tr>
+<td>flag</td>
+<td>tinyint</td>
+<td>是否可用,1 可用,0不可用</td>
+</tr>
+<tr>
+<td>update_time</td>
+<td>timestamp</td>
+<td>更新时间</td>
+</tr>
+<tr>
+<td>is_sub_process</td>
+<td>int</td>
+<td>是否是子工作流 1 是,0 不是</td>
+</tr>
+<tr>
+<td>executor_id</td>
+<td>int</td>
+<td>命令执行用户</td>
+</tr>
+<tr>
+<td>locations</td>
+<td>text</td>
+<td>节点坐标信息</td>
+</tr>
+<tr>
+<td>connects</td>
+<td>text</td>
+<td>节点连线信息</td>
+</tr>
+<tr>
+<td>history_cmd</td>
+<td>text</td>
+<td>历史命令,记录所有对流程实例的操作</td>
+</tr>
+<tr>
+<td>dependence_schedule_times</td>
+<td>text</td>
+<td>依赖节点的预估时间</td>
+</tr>
+<tr>
+<td>process_instance_priority</td>
+<td>int</td>
+<td>流程实例优先级:0 Highest,1 High,2 Medium,3 Low,4 Lowest</td>
+</tr>
+<tr>
+<td>worker_group_id</td>
+<td>int</td>
+<td>任务指定运行的worker分组</td>
+</tr>
+<tr>
+<td>timeout</td>
+<td>int</td>
+<td>超时时间</td>
+</tr>
+<tr>
+<td>tenant_id</td>
+<td>int</td>
+<td>租户id</td>
+</tr>
+</tbody>
+</table>
+<p><a name="IvHEc"></a></p>
+<h4>t_ds_task_instance</h4>
+<table>
+<thead>
+<tr>
+<th>字段</th>
+<th>类型</th>
+<th>注释</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>id</td>
+<td>int</td>
+<td>主键</td>
+</tr>
+<tr>
+<td>name</td>
+<td>varchar</td>
+<td>任务名称</td>
+</tr>
+<tr>
+<td>task_type</td>
+<td>varchar</td>
+<td>任务类型</td>
+</tr>
+<tr>
+<td>process_definition_id</td>
+<td>int</td>
+<td>流程定义id</td>
+</tr>
+<tr>
+<td>process_instance_id</td>
+<td>int</td>
+<td>流程实例id</td>
+</tr>
+<tr>
+<td>task_json</td>
+<td>longtext</td>
+<td>任务节点json</td>
+</tr>
+<tr>
+<td>state</td>
+<td>tinyint</td>
+<td>任务实例状态:0 提交成功,1 正在运行,2 准备暂停,3 暂停,4 准备停止,5 停止,6 失败,7 成功,8 需要容错,9 kill,10 等待线程,11 等待依赖完成</td>
+</tr>
+<tr>
+<td>submit_time</td>
+<td>datetime</td>
+<td>任务提交时间</td>
+</tr>
+<tr>
+<td>start_time</td>
+<td>datetime</td>
+<td>任务开始时间</td>
+</tr>
+<tr>
+<td>end_time</td>
+<td>datetime</td>
+<td>任务结束时间</td>
+</tr>
+<tr>
+<td>host</td>
+<td>varchar</td>
+<td>执行任务的机器</td>
+</tr>
+<tr>
+<td>execute_path</td>
+<td>varchar</td>
+<td>任务执行路径</td>
+</tr>
+<tr>
+<td>log_path</td>
+<td>varchar</td>
+<td>任务日志路径</td>
+</tr>
+<tr>
+<td>alert_flag</td>
+<td>tinyint</td>
+<td>是否告警</td>
+</tr>
+<tr>
+<td>retry_times</td>
+<td>int</td>
+<td>重试次数</td>
+</tr>
+<tr>
+<td>pid</td>
+<td>int</td>
+<td>进程pid</td>
+</tr>
+<tr>
+<td>app_link</td>
+<td>varchar</td>
+<td>yarn app id</td>
+</tr>
+<tr>
+<td>flag</td>
+<td>tinyint</td>
+<td>是否可用:0 不可用,1 可用</td>
+</tr>
+<tr>
+<td>retry_interval</td>
+<td>int</td>
+<td>重试间隔</td>
+</tr>
+<tr>
+<td>max_retry_times</td>
+<td>int</td>
+<td>最大重试次数</td>
+</tr>
+<tr>
+<td>task_instance_priority</td>
+<td>int</td>
+<td>任务实例优先级:0 Highest,1 High,2 Medium,3 Low,4 Lowest</td>
+</tr>
+<tr>
+<td>worker_group_id</td>
+<td>int</td>
+<td>任务指定运行的worker分组</td>
+</tr>
+</tbody>
+</table>
+<p><a name="pPQkU"></a></p>
+<h4>t_ds_schedules</h4>
+<table>
+<thead>
+<tr>
+<th>字段</th>
+<th>类型</th>
+<th>注释</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>id</td>
+<td>int</td>
+<td>主键</td>
+</tr>
+<tr>
+<td>process_definition_id</td>
+<td>int</td>
+<td>流程定义id</td>
+</tr>
+<tr>
+<td>start_time</td>
+<td>datetime</td>
+<td>调度开始时间</td>
+</tr>
+<tr>
+<td>end_time</td>
+<td>datetime</td>
+<td>调度结束时间</td>
+</tr>
+<tr>
+<td>crontab</td>
+<td>varchar</td>
+<td>crontab 表达式</td>
+</tr>
+<tr>
+<td>failure_strategy</td>
+<td>tinyint</td>
+<td>失败策略: 0 结束,1 继续</td>
+</tr>
+<tr>
+<td>user_id</td>
+<td>int</td>
+<td>用户id</td>
+</tr>
+<tr>
+<td>release_state</td>
+<td>tinyint</td>
+<td>状态:0 未上线,1 上线</td>
+</tr>
+<tr>
+<td>warning_type</td>
+<td>tinyint</td>
+<td>告警类型:0 不发,1 流程成功发,2 流程失败发,3 成功失败都发</td>
+</tr>
+<tr>
+<td>warning_group_id</td>
+<td>int</td>
+<td>告警组id</td>
+</tr>
+<tr>
+<td>process_instance_priority</td>
+<td>int</td>
+<td>流程实例优先级:0 Highest,1 High,2 Medium,3 Low,4 Lowest</td>
+</tr>
+<tr>
+<td>worker_group_id</td>
+<td>int</td>
+<td>任务指定运行的worker分组</td>
+</tr>
+<tr>
+<td>create_time</td>
+<td>datetime</td>
+<td>创建时间</td>
+</tr>
+<tr>
+<td>update_time</td>
+<td>datetime</td>
+<td>更新时间</td>
+</tr>
+</tbody>
+</table>
+<p><a name="TkQzn"></a></p>
+<h4>t_ds_command</h4>
+<table>
+<thead>
+<tr>
+<th>字段</th>
+<th>类型</th>
+<th>注释</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>id</td>
+<td>int</td>
+<td>主键</td>
+</tr>
+<tr>
+<td>command_type</td>
+<td>tinyint</td>
+<td>命令类型:0 启动工作流,1 从当前节点开始执行,2 恢复被容错的工作流,3 恢复暂停流程,4 从失败节点开始执行,5 补数,6 调度,7 重跑,8 暂停,9 停止,10 恢复等待线程</td>
+</tr>
+<tr>
+<td>process_definition_id</td>
+<td>int</td>
+<td>流程定义id</td>
+</tr>
+<tr>
+<td>command_param</td>
+<td>text</td>
+<td>命令的参数(json格式)</td>
+</tr>
+<tr>
+<td>task_depend_type</td>
+<td>tinyint</td>
+<td>节点依赖类型:0 当前节点,1 向前执行,2 向后执行</td>
+</tr>
+<tr>
+<td>failure_strategy</td>
+<td>tinyint</td>
+<td>失败策略:0结束,1继续</td>
+</tr>
+<tr>
+<td>warning_type</td>
+<td>tinyint</td>
+<td>告警类型:0 不发,1 流程成功发,2 流程失败发,3 成功失败都发</td>
+</tr>
+<tr>
+<td>warning_group_id</td>
+<td>int</td>
+<td>告警组</td>
+</tr>
+<tr>
+<td>schedule_time</td>
+<td>datetime</td>
+<td>预期运行时间</td>
+</tr>
+<tr>
+<td>start_time</td>
+<td>datetime</td>
+<td>开始时间</td>
+</tr>
+<tr>
+<td>executor_id</td>
+<td>int</td>
+<td>执行用户id</td>
+</tr>
+<tr>
+<td>dependence</td>
+<td>varchar</td>
+<td>依赖字段</td>
+</tr>
+<tr>
+<td>update_time</td>
+<td>datetime</td>
+<td>更新时间</td>
+</tr>
+<tr>
+<td>process_instance_priority</td>
+<td>int</td>
+<td>流程实例优先级:0 Highest,1 High,2 Medium,3 Low,4 Lowest</td>
+</tr>
+<tr>
+<td>worker_group_id</td>
+<td>int</td>
+<td>任务指定运行的worker分组</td>
+</tr>
+</tbody>
+</table>
+</div></section><footer class="footer-container"><div class="footer-body"><img src="/img/ds_gray.svg"/><div class="cols-container"><div class="col col-12"><h3>Disclaimer</h3><p>Apache DolphinScheduler (incubating) is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by Incubator. 
+Incubation is required of all newly accepted projects until a further review indicates 
+that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. 
+While incubation status is not necessarily a reflection of the completeness or stability of the code, 
+it does indicate that the project has yet to be fully endorsed by the ASF.</p></div><div class="col col-6"><dl><dt>文档</dt><dd><a href="/zh-cn/docs/1.2.0/user_doc/architecture-design.html" target="_self">概览</a></dd><dd><a href="/zh-cn/docs/1.2.0/user_doc/quick-start.html" target="_self">快速开始</a></dd><dd><a href="/zh-cn/docs/1.2.0/user_doc/backend-development.html" target="_self">开发者指南</a></dd></dl></div><div class="col col-6"><dl><dt>ASF</dt><dd><a href="http://www.apache.org" target="_se [...]
+	<script src="https://f.alicdn.com/react/15.4.1/react-with-addons.min.js"></script>
+	<script src="https://f.alicdn.com/react/15.4.1/react-dom.min.js"></script>
+	<script>
+		window.rootPath = '';
+  </script>
+	<script src="/build/documentation.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/zh-cn/docs/1.2.1/metadata-1.2.json b/zh-cn/docs/1.2.1/metadata-1.2.json
new file mode 100644
index 0000000..726d80c
--- /dev/null
+++ b/zh-cn/docs/1.2.1/metadata-1.2.json
@@ -0,0 +1,6 @@
+{
+  "filename": "metadata-1.2.md",
+  "__html": "<h1>Dolphin Scheduler 1.2元数据文档</h1>\n<p><a name=\"25Ald\"></a></p>\n<h3>表概览</h3>\n<table>\n<thead>\n<tr>\n<th style=\"text-align:center\">表名</th>\n<th style=\"text-align:center\">表信息</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td style=\"text-align:center\">t_ds_access_token</td>\n<td style=\"text-align:center\">访问ds后端的token</td>\n</tr>\n<tr>\n<td style=\"text-align:center\">t_ds_alert</td>\n<td style=\"text-align:center\">告警信息</td>\n</tr>\n<tr>\n<td style=\"text-align:center\">t [...]
+  "link": "/zh-cn/docs/1.2.1/metadata-1.2.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/1.2.1/plugin-development.html b/zh-cn/docs/1.2.1/plugin-development.html
new file mode 100644
index 0000000..87d0ba1
--- /dev/null
+++ b/zh-cn/docs/1.2.1/plugin-development.html
@@ -0,0 +1,81 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+	<meta charset="UTF-8">
+	<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
+	<meta name="keywords" content="plugin-development" />
+	<meta name="description" content="plugin-development" />
+	<!-- 网页标签标题 -->
+	<title>plugin-development</title>
+	<link rel="shortcut icon" href="/img/docsite.ico"/>
+	<link rel="stylesheet" href="/build/documentation.css" />
+</head>
+<body>
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><img class="logo" src="/img/hlogo_colorful.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-switch-normal">En</span><div class="header-menu"><img class="header-menu-toggle" src="/img/system/menu_gray.png"/><div><ul class="ant-menu blackClass an [...]
+<p>提醒:目前任务插件开发暂不支持热部署</p>
+<h3>基于SHELL的任务</h3>
+<h4>基于YARN的计算(参见MapReduceTask)</h4>
+<ul>
+<li>需要在 <strong>cn.dolphinscheduler.server.worker.task</strong> 下的 <strong>TaskManager</strong> 类中创建自定义任务(也需在TaskType注册对应的任务类型)</li>
+<li>需要继承<strong>cn.dolphinscheduler.server.worker.task</strong> 下的 <strong>AbstractYarnTask</strong></li>
+<li>构造方法调度 <strong>AbstractYarnTask</strong> 构造方法</li>
+<li>继承 <strong>AbstractParameters</strong> 自定义任务参数实体</li>
+<li>重写 <strong>AbstractTask</strong> 的 <strong>init</strong> 方法中解析<strong>自定义任务参数</strong></li>
+<li>重写 <strong>buildCommand</strong> 封装command</li>
+</ul>
+<h4>基于非YARN的计算(参见ShellTask)</h4>
+<ul>
+<li>
+<p>需要在 <strong>cn.dolphinscheduler.server.worker.task</strong> 下的 <strong>TaskManager</strong> 中创建自定义任务</p>
+</li>
+<li>
+<p>需要继承<strong>cn.dolphinscheduler.server.worker.task</strong> 下的 <strong>AbstractTask</strong></p>
+</li>
+<li>
+<p>构造方法中实例化 <strong>ShellCommandExecutor</strong></p>
+<pre><code>public ShellTask(TaskProps props, Logger logger) {
+  super(props, logger);
+
+  this.taskDir = props.getTaskDir();
+
+  this.processTask = new ShellCommandExecutor(this::logHandle,
+      props.getTaskDir(), props.getTaskAppId(),
+      props.getTenantCode(), props.getEnvFile(), props.getTaskStartTime(),
+      props.getTaskTimeout(), logger);
+  this.processDao = DaoFactory.getDaoInstance(ProcessDao.class);
+}
+</code></pre>
+<p>传入自定义任务的 <strong>TaskProps</strong>和自定义<strong>Logger</strong>,TaskProps 封装了任务的信息,Logger分装了自定义日志信息</p>
+</li>
+<li>
+<p>继承 <strong>AbstractParameters</strong> 自定义任务参数实体</p>
+</li>
+<li>
+<p>重写 <strong>AbstractTask</strong> 的 <strong>init</strong> 方法中解析<strong>自定义任务参数实体</strong></p>
+</li>
+<li>
+<p>重写 <strong>handle</strong> 方法,调用 <strong>ShellCommandExecutor</strong> 的 <strong>run</strong> 方法,第一个参数传入自己的<strong>command</strong>,第二个参数传入 ProcessDao,设置相应的 <strong>exitStatusCode</strong></p>
+</li>
+</ul>
+<h3>基于非SHELL的任务(参见SqlTask)</h3>
+<ul>
+<li>需要在 <strong>cn.dolphinscheduler.server.worker.task</strong> 下的 <strong>TaskManager</strong> 中创建自定义任务</li>
+<li>需要继承<strong>cn.dolphinscheduler.server.worker.task</strong> 下的 <strong>AbstractTask</strong></li>
+<li>继承 <strong>AbstractParameters</strong> 自定义任务参数实体</li>
+<li>构造方法或者重写 <strong>AbstractTask</strong> 的 <strong>init</strong> 方法中,解析自定义任务参数实体</li>
+<li>重写 <strong>handle</strong> 方法实现业务逻辑并设置相应的<strong>exitStatusCode</strong></li>
+</ul>
+</div></section><footer class="footer-container"><div class="footer-body"><img src="/img/ds_gray.svg"/><div class="cols-container"><div class="col col-12"><h3>Disclaimer</h3><p>Apache DolphinScheduler (incubating) is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by Incubator. 
+Incubation is required of all newly accepted projects until a further review indicates 
+that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. 
+While incubation status is not necessarily a reflection of the completeness or stability of the code, 
+it does indicate that the project has yet to be fully endorsed by the ASF.</p></div><div class="col col-6"><dl><dt>文档</dt><dd><a href="/zh-cn/docs/1.2.0/user_doc/architecture-design.html" target="_self">概览</a></dd><dd><a href="/zh-cn/docs/1.2.0/user_doc/quick-start.html" target="_self">快速开始</a></dd><dd><a href="/zh-cn/docs/1.2.0/user_doc/backend-development.html" target="_self">开发者指南</a></dd></dl></div><div class="col col-6"><dl><dt>ASF</dt><dd><a href="http://www.apache.org" target="_se [...]
+	<script src="https://f.alicdn.com/react/15.4.1/react-with-addons.min.js"></script>
+	<script src="https://f.alicdn.com/react/15.4.1/react-dom.min.js"></script>
+	<script>
+		window.rootPath = '';
+  </script>
+	<script src="/build/documentation.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/zh-cn/docs/1.2.1/plugin-development.json b/zh-cn/docs/1.2.1/plugin-development.json
new file mode 100644
index 0000000..90b28a1
--- /dev/null
+++ b/zh-cn/docs/1.2.1/plugin-development.json
@@ -0,0 +1,6 @@
+{
+  "filename": "plugin-development.md",
+  "__html": "<h2>任务插件开发</h2>\n<p>提醒:目前任务插件开发暂不支持热部署</p>\n<h3>基于SHELL的任务</h3>\n<h4>基于YARN的计算(参见MapReduceTask)</h4>\n<ul>\n<li>需要在 <strong>cn.dolphinscheduler.server.worker.task</strong> 下的 <strong>TaskManager</strong> 类中创建自定义任务(也需在TaskType注册对应的任务类型)</li>\n<li>需要继承<strong>cn.dolphinscheduler.server.worker.task</strong> 下的 <strong>AbstractYarnTask</strong></li>\n<li>构造方法调度 <strong>AbstractYarnTask</strong> 构造方法</li>\n<li>继承 <strong>AbstractParameters</strong> 自定义任务参数实体</li>\n<li>重写 <strong> [...]
+  "link": "/zh-cn/docs/1.2.1/plugin-development.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/1.2.1/quick-start.html b/zh-cn/docs/1.2.1/quick-start.html
new file mode 100644
index 0000000..0d07d7e
--- /dev/null
+++ b/zh-cn/docs/1.2.1/quick-start.html
@@ -0,0 +1,97 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+	<meta charset="UTF-8">
+	<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
+	<meta name="keywords" content="quick-start" />
+	<meta name="description" content="quick-start" />
+	<!-- 网页标签标题 -->
+	<title>quick-start</title>
+	<link rel="shortcut icon" href="/img/docsite.ico"/>
+	<link rel="stylesheet" href="/build/documentation.css" />
+</head>
+<body>
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><img class="logo" src="/img/hlogo_colorful.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-switch-normal">En</span><div class="header-menu"><img class="header-menu-toggle" src="/img/system/menu_gray.png"/><div><ul class="ant-menu blackClass an [...]
+<ul>
+<li>管理员用户登录
+<blockquote>
+<p>地址:192.168.xx.xx:8888 用户名密码:admin/dolphinscheduler123</p>
+</blockquote>
+</li>
+</ul>
+<p align="center">
+   <img src="/img/login.png" width="60%" />
+ </p>
+<ul>
+<li>创建队列</li>
+</ul>
+<p align="center">
+   <img src="/img/create-queue.png" width="60%" />
+ </p>
+<ul>
+<li>创建租户</li>
+</ul>
+   <p align="center">
+    <img src="/img/addtenant.png" width="60%" />
+  </p>
+<ul>
+<li>创建普通用户</li>
+</ul>
+<p align="center">
+   <img src="/img/useredit2.png" width="60%" />
+ </p>
+<ul>
+<li>创建告警组</li>
+</ul>
+ <p align="center">
+    <img src="/img/mail_edit.png" width="60%" />
+  </p>
+<ul>
+<li>创建Worker分组</li>
+</ul>
+ <p align="center">
+    <img src="/img/worker_group.png" width="60%" />
+  </p>
+<ul>
+<li>创建token令牌</li>
+</ul>
+ <p align="center">
+    <img src="/img/creat_token.png" width="60%" />
+  </p>
+<ul>
+<li>使用普通用户登录</li>
+</ul>
+<blockquote>
+<p>点击右上角用户名“退出”,重新使用普通用户登录。</p>
+</blockquote>
+<ul>
+<li>项目管理-&gt;创建项目-&gt;点击项目名称</li>
+</ul>
+<p align="center">
+   <img src="/img/project.png" width="60%" />
+ </p>
+<ul>
+<li>点击工作流定义-&gt;创建工作流定义-&gt;上线工作流定义</li>
+</ul>
+<p align="center">
+   <img src="/img/dag1.png" width="60%" />
+ </p>
+<ul>
+<li>运行工作流定义-&gt;点击工作流实例-&gt;点击工作流实例名称-&gt;双击任务节点-&gt;查看任务执行日志</li>
+</ul>
+ <p align="center">
+   <img src="/img/task-log.png" width="60%" />
+</p></div></section><footer class="footer-container"><div class="footer-body"><img src="/img/ds_gray.svg"/><div class="cols-container"><div class="col col-12"><h3>Disclaimer</h3><p>Apache DolphinScheduler (incubating) is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by Incubator. 
+Incubation is required of all newly accepted projects until a further review indicates 
+that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. 
+While incubation status is not necessarily a reflection of the completeness or stability of the code, 
+it does indicate that the project has yet to be fully endorsed by the ASF.</p></div><div class="col col-6"><dl><dt>文档</dt><dd><a href="/zh-cn/docs/1.2.0/user_doc/architecture-design.html" target="_self">概览</a></dd><dd><a href="/zh-cn/docs/1.2.0/user_doc/quick-start.html" target="_self">快速开始</a></dd><dd><a href="/zh-cn/docs/1.2.0/user_doc/backend-development.html" target="_self">开发者指南</a></dd></dl></div><div class="col col-6"><dl><dt>ASF</dt><dd><a href="http://www.apache.org" target="_se [...]
+	<script src="https://f.alicdn.com/react/15.4.1/react-with-addons.min.js"></script>
+	<script src="https://f.alicdn.com/react/15.4.1/react-dom.min.js"></script>
+	<script>
+		window.rootPath = '';
+  </script>
+	<script src="/build/documentation.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/zh-cn/docs/1.2.1/quick-start.json b/zh-cn/docs/1.2.1/quick-start.json
new file mode 100644
index 0000000..b747709
--- /dev/null
+++ b/zh-cn/docs/1.2.1/quick-start.json
@@ -0,0 +1,6 @@
+{
+  "filename": "quick-start.md",
+  "__html": "<h1>快速上手</h1>\n<ul>\n<li>管理员用户登录\n<blockquote>\n<p>地址:192.168.xx.xx:8888 用户名密码:admin/dolphinscheduler123</p>\n</blockquote>\n</li>\n</ul>\n<p align=\"center\">\n   <img src=\"/img/login.png\" width=\"60%\" />\n </p>\n<ul>\n<li>创建队列</li>\n</ul>\n<p align=\"center\">\n   <img src=\"/img/create-queue.png\" width=\"60%\" />\n </p>\n<ul>\n<li>创建租户</li>\n</ul>\n   <p align=\"center\">\n    <img src=\"/img/addtenant.png\" width=\"60%\" />\n  </p>\n<ul>\n<li>创建普通用户</li>\n</ul>\n<p a [...]
+  "link": "/zh-cn/docs/1.2.1/quick-start.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/1.2.1/standalone-deployment.html b/zh-cn/docs/1.2.1/standalone-deployment.html
new file mode 100644
index 0000000..29b3404
--- /dev/null
+++ b/zh-cn/docs/1.2.1/standalone-deployment.html
@@ -0,0 +1,439 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+	<meta charset="UTF-8">
+	<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
+	<meta name="keywords" content="standalone-deployment" />
+	<meta name="description" content="standalone-deployment" />
+	<!-- 网页标签标题 -->
+	<title>standalone-deployment</title>
+	<link rel="shortcut icon" href="/img/docsite.ico"/>
+	<link rel="stylesheet" href="/build/documentation.css" />
+</head>
+<body>
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><img class="logo" src="/img/hlogo_colorful.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-switch-normal">En</span><div class="header-menu"><img class="header-menu-toggle" src="/img/system/menu_gray.png"/><div><ul class="ant-menu blackClass an [...]
+<p>DolphinScheduler单机部署分为后端部署和前端部署两部分:</p>
+<h1>1、后端部署</h1>
+<h3>1.1 : 基础软件安装(必装项请自行安装)</h3>
+<ul>
+<li>PostgreSQL (8.2.15+) or Mysql (5.6或者5.7系列)  :  两者任选其一即可</li>
+<li><a href="https://www.oracle.com/technetwork/java/javase/downloads/index.html">JDK</a> (1.8+) :  必装,请安装好后在/etc/profile下配置 JAVA_HOME 及 PATH 变量</li>
+<li>ZooKeeper (3.4.6+) :必装</li>
+<li>Hadoop (2.6+) or MinIO :选装, 如果需要用到资源上传功能,针对单机可以选择本地文件目录作为上传文件夹(此操作不需要部署Hadoop);当然也可以选择上传到Hadoop or MinIO集群上</li>
+</ul>
+<pre><code class="language-markdown"> 注意:DolphinScheduler本身不依赖Hadoop、Hive、Spark,仅是会调用他们的Client,用于对应任务的运行。
+</code></pre>
+<h3>1.2 : 下载后端tar.gz包</h3>
+<ul>
+<li>请下载最新版本的后端安装包至服务器部署目录,比如创建 /opt/dolphinscheduler 做为安装部署目录,下载地址: <a href="https://dolphinscheduler.apache.org/zh-cn/docs/release/download.html">下载</a> (以1.2.0版本为例),下载后上传tar包到该目录中,并进行解压</li>
+</ul>
+<pre><code class="language-shell"><span class="hljs-meta">#</span><span class="bash"> 创建部署目录</span>
+mkdir -p /opt/dolphinscheduler;
+cd /opt/dolphinscheduler;
+<span class="hljs-meta">#</span><span class="bash"> 解压缩</span>
+tar -zxvf apache-dolphinscheduler-incubating-1.2.0-dolphinscheduler-backend-bin.tar.gz -C /opt/dolphinscheduler;
+ 
+mv apache-dolphinscheduler-incubating-1.2.0-dolphinscheduler-backend-bin  dolphinscheduler-backend
+</code></pre>
+<p>###1.3:创建部署用户并赋予目录操作权限</p>
+<ul>
+<li>创建部署用户,并且一定要配置sudo免密。以创建dolphinscheduler用户为例</li>
+</ul>
+<pre><code class="language-shell"><span class="hljs-meta">#</span><span class="bash"> add user dolphinscheduler</span>
+useradd dolphinscheduler;
+<span class="hljs-meta">
+#</span><span class="bash"> modify user password</span>
+echo "dolphinscheduler" | passwd --stdin dolphinscheduler
+<span class="hljs-meta">
+#</span><span class="bash"> 配置sudo免密</span>
+sed -i '$adolphinscheduler  ALL=(ALL)  NOPASSWD: NOPASSWD: ALL' /etc/sudoers
+<span class="hljs-meta">
+#</span><span class="bash"> 修改目录权限,使得部署用户对dolphinscheduler-backend目录有操作权限  </span>
+chown -R dolphinscheduler:dolphinscheduler dolphinscheduler-backend
+</code></pre>
+<pre><code> 注意:
+ - 因为任务执行服务是以 sudo -u {linux-user} 切换不同linux用户的方式来实现多租户运行作业,所以部署用户需要有 sudo 权限,而且是免密的。初学习者不理解的话,完全可以暂时忽略这一点
+ - 如果发现/etc/sudoers文件中有&quot;Default requiretty&quot;这行,也请注释掉
+ - 如果用到资源上传的话,还需要给该部署用户分配操作`本地文件系统或者HDFS或者MinIO`的权限
+</code></pre>
+<h3>1.4 : ssh免密配置</h3>
+<ul>
+<li>切换到部署用户并配置ssh本机免密登录</li>
+</ul>
+<pre><code class="language-shell">su dolphinscheduler;
+
+ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
+cat ~/.ssh/id_rsa.pub &gt;&gt; ~/.ssh/authorized_keys
+chmod 600 ~/.ssh/authorized_keys
+</code></pre>
+<p>注意:<em>正常设置后,dolphinscheduler用户在执行命令<code>ssh localhost</code> 是不需要再输入密码的</em></p>
+<h3>1.5 : 数据库初始化</h3>
+<ul>
+<li>进入数据库,默认数据库是PostgreSQL,如选择Mysql的话,后续需要添加mysql-connector-java驱动包到DolphinScheduler的lib目录下</li>
+</ul>
+<pre><code>mysql -uroot -p
+</code></pre>
+<ul>
+<li>进入数据库命令行窗口后,执行数据库初始化命令,设置访问账号和密码。<strong>注: {user} 和 {password} 需要替换为具体的数据库用户名和密码</strong></li>
+</ul>
+<pre><code class="language-mysql">mysql&gt; CREATE DATABASE dolphinscheduler DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
+mysql&gt; GRANT ALL PRIVILEGES ON dolphinscheduler.* TO '{user}'@'%' IDENTIFIED BY '{password}';
+mysql&gt; GRANT ALL PRIVILEGES ON dolphinscheduler.* TO '{user}'@'localhost' IDENTIFIED BY '{password}';
+mysql&gt; flush privileges;
+</code></pre>
+<ul>
+<li>
+<p>创建表和导入基础数据</p>
+<ul>
+<li>
+<p>修改 conf 目录下 application-dao.properties 中的下列配置</p>
+<ul>
+<li>
+<pre><code class="language-shell">vi conf/application-dao.properties 
+</code></pre>
+</li>
+</ul>
+</li>
+<li>
+<p>如果选择 Mysql,请注释掉 PostgreSQL 相关配置(反之同理), 还需要手动添加 [<a href="https://downloads.mysql.com/archives/c-j/"> mysql-connector-java 驱动 jar </a>] 包到 lib 目录下,这里下载的是mysql-connector-java-5.1.47.jar,然后正确配置数据库连接相关信息</p>
+</li>
+</ul>
+<pre><code class="language-properties"><span class="hljs-comment">  # postgre</span>
+<span class="hljs-comment">  #spring.datasource.driver-class-name=org.postgresql.Driver</span>
+<span class="hljs-comment">  #spring.datasource.url=jdbc:postgresql://localhost:5432/dolphinscheduler</span>
+<span class="hljs-comment">  # mysql</span>
+  <span class="hljs-meta">spring.datasource.driver-class-name</span>=<span class="hljs-string">com.mysql.jdbc.Driver</span>
+  <span class="hljs-meta">spring.datasource.url</span>=<span class="hljs-string">jdbc:mysql://xxx:3306/dolphinscheduler?useUnicode=true&amp;characterEncoding=UTF-8     需要修改ip,本机localhost即可</span>
+  <span class="hljs-meta">spring.datasource.username</span>=<span class="hljs-string">xxx						需要修改为上面的{user}值</span>
+  <span class="hljs-meta">spring.datasource.password</span>=<span class="hljs-string">xxx						需要修改为上面的{password}值</span>
+</code></pre>
+<ul>
+<li>修改并保存完后,执行 script 目录下的创建表及导入基础数据脚本</li>
+</ul>
+<pre><code class="language-shell">sh script/create-dolphinscheduler.sh
+</code></pre>
+</li>
+</ul>
+<p>​       <em>注意: 如果执行上述脚本报 ”/bin/java: No such file or directory“ 错误,请在/etc/profile下配置  JAVA_HOME 及 PATH 变量</em></p>
+<h3>1.6 : 修改运行参数</h3>
+<ul>
+<li>
+<p>修改 conf/env 目录下的 <code>.dolphinscheduler_env.sh</code> 环境变量(以相关用到的软件都安装在/opt/soft下为例)</p>
+<pre><code class="language-shell">export HADOOP_HOME=/opt/soft/hadoop
+export HADOOP_CONF_DIR=/opt/soft/hadoop/etc/hadoop
+<span class="hljs-meta">#</span><span class="bash"><span class="hljs-built_in">export</span> SPARK_HOME1=/opt/soft/spark1</span>
+export SPARK_HOME2=/opt/soft/spark2
+export PYTHON_HOME=/opt/soft/python
+export JAVA_HOME=/opt/soft/java
+export HIVE_HOME=/opt/soft/hive
+export FLINK_HOME=/opt/soft/flink
+export PATH=$HADOOP_HOME/bin:$SPARK_HOME2/bin:$PYTHON_HOME:$JAVA_HOME/bin:$HIVE_HOME/bin:$PATH:$FLINK_HOME/bin:$PATH
+
+</code></pre>
+<p><code>注: 这一步非常重要,例如 JAVA_HOME 和 PATH 是必须要配置的,没有用到的可以忽略或者注释掉</code></p>
+</li>
+<li>
+<p>将jdk软链到/usr/bin/java下(仍以 JAVA_HOME=/opt/soft/java 为例)</p>
+<pre><code class="language-shell">sudo ln -s /opt/soft/java/bin/java /usr/bin/java
+</code></pre>
+</li>
+<li>
+<p>修改一键部署脚本 <code>install.sh</code>中的各参数,特别注意以下参数的配置</p>
+<pre><code class="language-shell"><span class="hljs-meta">#</span><span class="bash"> 这里填 mysql or postgresql</span>
+dbtype="mysql"
+<span class="hljs-meta">
+#</span><span class="bash"> 数据库连接地址</span>
+dbhost="localhost:3306"
+<span class="hljs-meta">
+#</span><span class="bash"> 数据库名</span>
+dbname="dolphinscheduler"
+<span class="hljs-meta">
+#</span><span class="bash"> 数据库用户名,此处需要修改为上面设置的{user}具体值</span>
+username="xxx"    
+<span class="hljs-meta">
+#</span><span class="bash"> 数据库密码, 如果有特殊字符,请使用\转义,需要修改为上面设置的{passowrd}具体值</span>
+passowrd="xxx"
+<span class="hljs-meta">
+#</span><span class="bash">将DS安装到哪个目录,如: /opt/soft/dolphinscheduler,不同于现在的目录</span>
+installPath="/opt/soft/dolphinscheduler"
+<span class="hljs-meta">
+#</span><span class="bash">使用哪个用户部署,使用1.3小节创建的用户</span>
+deployUser="dolphinscheduler"
+<span class="hljs-meta">
+#</span><span class="bash">zookeeper地址,单机本机是localhost:2181,记得把2181端口带上</span>
+zkQuorum="localhost:2181"
+<span class="hljs-meta">
+#</span><span class="bash">在哪些机器上部署DS服务,本机选localhost</span>
+ips="localhost"
+<span class="hljs-meta">
+#</span><span class="bash">master服务部署在哪台机器上</span>
+masters="localhost"
+<span class="hljs-meta">
+#</span><span class="bash">worker服务部署在哪台机器上</span>
+workers="localhost"
+<span class="hljs-meta">
+#</span><span class="bash">报警服务部署在哪台机器上</span>
+alertServer="localhost"
+<span class="hljs-meta">
+#</span><span class="bash">后端api服务部署在在哪台机器上</span>
+apiServers="localhost"
+<span class="hljs-meta">
+
+#</span><span class="bash"> 邮件配置,以qq邮箱为例</span>
+<span class="hljs-meta">#</span><span class="bash"> 邮件协议</span>
+mailProtocol="SMTP"
+<span class="hljs-meta">
+#</span><span class="bash"> 邮件服务地址</span>
+mailServerHost="smtp.exmail.qq.com"
+<span class="hljs-meta">
+#</span><span class="bash"> 邮件服务端口</span>
+mailServerPort="25"
+<span class="hljs-meta">
+#</span><span class="bash"> mailSender和mailUser配置成一样即可</span>
+<span class="hljs-meta">#</span><span class="bash"> 发送者</span>
+mailSender="xxx@qq.com"
+<span class="hljs-meta">
+#</span><span class="bash"> 发送用户</span>
+mailUser="xxx@qq.com"
+<span class="hljs-meta">
+#</span><span class="bash"> 邮箱密码</span>
+mailPassword="xxx"
+<span class="hljs-meta">
+#</span><span class="bash"> TLS协议的邮箱设置为<span class="hljs-literal">true</span>,否则设置为<span class="hljs-literal">false</span></span>
+starttlsEnable="true"
+<span class="hljs-meta">
+#</span><span class="bash"> 邮件服务地址值,参考上面 mailServerHost</span>
+sslTrust="smtp.exmail.qq.com"
+<span class="hljs-meta">
+#</span><span class="bash"> 开启SSL协议的邮箱配置为<span class="hljs-literal">true</span>,否则为<span class="hljs-literal">false</span>。注意: starttlsEnable和sslEnable不能同时为<span class="hljs-literal">true</span></span>
+sslEnable="false"
+<span class="hljs-meta">
+#</span><span class="bash"> excel下载路径</span>
+xlsFilePath="/tmp/xls"
+<span class="hljs-meta">
+#</span><span class="bash"> 业务用到的比如sql等资源文件上传到哪里,可以设置:HDFS,S3,NONE,单机如果想使用本地文件系统,请配置为HDFS,因为HDFS支持本地文件系统;如果不需要资源上传功能请选择NONE。强调一点:使用本地文件系统不需要部署hadoop </span>
+resUploadStartupType="HDFS"
+<span class="hljs-meta">
+#</span><span class="bash"> 这里以保存到本地文件系统为例</span>
+<span class="hljs-meta">#</span><span class="bash">注:但是如果你想上传到HDFS的话,NameNode启用了HA,则需要将core-site.xml和hdfs-site.xml放到conf目录下,本例即是放到/opt/dolphinscheduler/conf下面,并配置namenode cluster名称;如果NameNode不是HA,则修改为具体的ip或者主机名即可 </span>
+defaultFS="file:///data/dolphinscheduler"    #hdfs://{具体的ip/主机名}:8020
+<span class="hljs-meta">
+
+#</span><span class="bash"> 如果ResourceManager是HA,则配置为ResourceManager节点的主备ip或者hostname,比如<span class="hljs-string">"192.168.xx.xx,192.168.xx.xx"</span>,否则如果是单ResourceManager或者根本没用到yarn,请配置yarnHaIps=<span class="hljs-string">""</span>即可,我这里没用到yarn,配置为<span class="hljs-string">""</span></span>
+yarnHaIps=""
+<span class="hljs-meta">
+#</span><span class="bash"> 如果是单ResourceManager,则配置为ResourceManager节点ip或主机名,否则保持默认值即可。我这里没用到yarn,保持默认</span>
+singleYarnIp="ark1"
+<span class="hljs-meta">
+#</span><span class="bash"> 由于hdfs支持本地文件系统,需要确保本地文件夹存在且有读写权限</span>
+hdfsPath="/data/dolphinscheduler"
+</code></pre>
+<p><em>注:如果打算用到<code>资源中心</code>功能,请执行以下命令:</em></p>
+<pre><code class="language-shell">sudo mkdir /data/dolphinscheduler
+sudo chown -R dolphinscheduler:dolphinscheduler /data/dolphinscheduler
+</code></pre>
+</li>
+</ul>
+<h3>1.7 : 安装python的zookeeper工具kazoo</h3>
+<ul>
+<li>安装python的 zookeeper 工具 ,<code>此步骤仅在一键部署时候用到</code></li>
+</ul>
+<pre><code class="language-shell"><span class="hljs-meta">#</span><span class="bash">安装pip</span>
+sudo yum -y install python-pip;  #ubuntu请使用 sudo apt-get install python-pip
+sudo pip install kazoo;
+</code></pre>
+<p><em>注意:如果yum没找到python-pip,也可以通过下面方式安装</em></p>
+<pre><code class="language-shell">sudo curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
+sudo python get-pip.py  # 如果是python3,使用sudo python3 get-pip.py 
+<span class="hljs-meta">#</span><span class="bash">然后</span>
+sudo pip install kazoo;
+</code></pre>
+<ul>
+<li>
+<p>切换到部署用户,执行一键部署脚本</p>
+<p><code>sh install.sh</code></p>
+<pre><code>注意:
+第一次部署的话,在运行中第3步`3,stop server`出现5次以下信息,此信息可以忽略
+sh: bin/dolphinscheduler-daemon.sh: No such file or directory
+</code></pre>
+</li>
+<li>
+<p>脚本完成后,会启动以下5个服务,使用<code>jps</code>命令查看服务是否启动(<code>jps</code>为<code>java JDK</code>自带)</p>
+</li>
+</ul>
+<pre><code class="language-aidl">    MasterServer         ----- master服务
+    WorkerServer         ----- worker服务
+    LoggerServer         ----- logger服务
+    ApiApplicationServer ----- api服务
+    AlertServer          ----- alert服务
+</code></pre>
+<p>如果以上服务都正常启动,说明自动部署成功</p>
+<p>部署成功后,可以进行日志查看,日志统一存放于logs文件夹内</p>
+<pre><code class="language-日志路径"> logs/
+    ├── dolphinscheduler-alert-server.log
+    ├── dolphinscheduler-master-server.log
+    |—— dolphinscheduler-worker-server.log
+    |—— dolphinscheduler-api-server.log
+    |—— dolphinscheduler-logger-server.log
+</code></pre>
+<h1>2、前端部署</h1>
+<p>请下载最新版本的前端安装包至服务器部署目录,下载地址: <a href="https://dolphinscheduler.apache.org/zh-cn/docs/release/download.html">下载</a> (以1.2.0版本为例),下载后上传tar包到该目录中,并进行解压</p>
+<pre><code class="language-shell">cd /opt/dolphinscheduler;
+
+tar -zxvf apache-dolphinscheduler-incubating-1.2.0-dolphinscheduler-front-bin.tar.gz -C /opt/dolphinscheduler;
+
+mv apache-dolphinscheduler-incubating-1.2.0-dolphinscheduler-front-bin dolphinscheduler-ui
+</code></pre>
+<p><strong>以下两种部署方式任选其一种即可,推荐自动化部署</strong></p>
+<h3>2.1 自动化部署</h3>
+<ul>
+<li>
+<p>进入dolphinscheduler-ui目录下执行(<code>注意:自动化部署会自动下载 nginx</code>)</p>
+<pre><code class="language-shell">cd dolphinscheduler-ui;
+sh ./install-dolphinscheduler-ui.sh;
+</code></pre>
+<ul>
+<li>执行后,会在运行中请键入前端端口,默认端口是8888,如果选择默认,请键入y,或者键入其他端口</li>
+<li>然后会让键入跟前端ui交互的api-server的ip</li>
+<li>接着是让键入跟前端ui交互的api-server的port</li>
+<li>接着是操作系统选择</li>
+<li>等待部署完成</li>
+</ul>
+</li>
+<li>
+<p>部署完,为防止资源过大无法上传到资源中心,建议修改nginx上传大小参数,具体如下</p>
+<ul>
+<li>添加nginx配置 client_max_body_size 1024m,在http方法体内添加即可</li>
+</ul>
+<pre><code class="language-shell">vi /etc/nginx/nginx.conf
+<span class="hljs-meta">
+#</span><span class="bash"> add param</span>
+client_max_body_size 1024m;
+</code></pre>
+<ul>
+<li>然后重启Nginx服务</li>
+</ul>
+<pre><code class="language-shell">systemctl restart nginx
+</code></pre>
+</li>
+<li>
+<p>访问前端页面地址: <a href="http://localhost:8888">http://localhost:8888</a> ,出现前端登录页面,前端web也安装完成了</p>
+<pre><code class="language-html"><span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">align</span>=<span class="hljs-string">"center"</span>&gt;</span>
+   <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"/img/login.png"</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"60%"</span> /&gt;</span>
+ <span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
+</code></pre>
+</li>
+</ul>
+<h3>2.2 手动部署</h3>
+<ul>
+<li>
+<p>自行安装nginx,去官网下载: <a href="http://nginx.org/en/download.html">http://nginx.org/en/download.html</a>  或者 <code>yum install nginx -y</code></p>
+</li>
+<li>
+<p>修改nginx配置文件(注意<code>自行修改</code>的几处)</p>
+</li>
+</ul>
+<pre><code class="language-html">vi /etc/nginx/nginx.conf
+
+server {
+    listen       8888;# 访问端口(自行修改)
+    server_name  localhost;
+    #charset koi8-r;
+    #access_log  /var/log/nginx/host.access.log  main;
+    location / {
+        root   /opt/soft/dolphinscheduler-ui/dist;      # 前端解压的dist目录地址(自行修改)
+        index  index.html index.html;
+    }
+    location /dolphinscheduler {
+        proxy_pass http://localhost:12345;    # 接口地址(自行修改)
+        proxy_set_header Host $host;
+        proxy_set_header X-Real-IP $remote_addr;
+        proxy_set_header x_real_ipP $remote_addr;
+        proxy_set_header remote_addr $remote_addr;
+        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_http_version 1.1;
+        proxy_connect_timeout 4s;
+        proxy_read_timeout 30s;
+        proxy_send_timeout 12s;
+        proxy_set_header Upgrade $http_upgrade;
+        proxy_set_header Connection "upgrade";
+    }
+    #error_page  404              /404.html;
+    # redirect server error pages to the static page /50x.html
+    #
+    error_page   500 502 503 504  /50x.html;
+    location = /50x.html {
+        root   /usr/share/nginx/html;
+    }
+}
+</code></pre>
+<ul>
+<li>
+<p>然后重启Nginx服务</p>
+<pre><code class="language-shell">systemctl restart nginx
+</code></pre>
+</li>
+<li>
+<p>访问前端页面地址: <a href="http://localhost:8888">http://localhost:8888</a> ,出现前端登录页面,前端web也安装完成了</p>
+<pre><code class="language-html"><span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">align</span>=<span class="hljs-string">"center"</span>&gt;</span>
+   <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"/img/login.png"</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"60%"</span> /&gt;</span>
+ <span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
+</code></pre>
+</li>
+</ul>
+<h1>3、启停服务</h1>
+<ul>
+<li>
+<p>一键停止集群所有服务</p>
+<p><code>sh ./bin/stop-all.sh</code></p>
+</li>
+<li>
+<p>一键开启集群所有服务</p>
+<p><code>sh ./bin/start-all.sh</code></p>
+</li>
+<li>
+<p>启停Master</p>
+</li>
+</ul>
+<pre><code class="language-shell">sh ./bin/dolphinscheduler-daemon.sh start master-server
+sh ./bin/dolphinscheduler-daemon.sh stop master-server
+</code></pre>
+<ul>
+<li>启停Worker</li>
+</ul>
+<pre><code class="language-shell">sh ./bin/dolphinscheduler-daemon.sh start worker-server
+sh ./bin/dolphinscheduler-daemon.sh stop worker-server
+</code></pre>
+<ul>
+<li>启停Api</li>
+</ul>
+<pre><code class="language-shell">sh ./bin/dolphinscheduler-daemon.sh start api-server
+sh ./bin/dolphinscheduler-daemon.sh stop api-server
+</code></pre>
+<ul>
+<li>启停Logger</li>
+</ul>
+<pre><code class="language-shell">sh ./bin/dolphinscheduler-daemon.sh start logger-server
+sh ./bin/dolphinscheduler-daemon.sh stop logger-server
+</code></pre>
+<ul>
+<li>启停Alert</li>
+</ul>
+<pre><code class="language-shell">sh ./bin/dolphinscheduler-daemon.sh start alert-server
+sh ./bin/dolphinscheduler-daemon.sh stop alert-server
+</code></pre>
+<p><code>注:服务用途请具体参见《系统架构设计》小节</code></p>
+</div></section><footer class="footer-container"><div class="footer-body"><img src="/img/ds_gray.svg"/><div class="cols-container"><div class="col col-12"><h3>Disclaimer</h3><p>Apache DolphinScheduler (incubating) is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by Incubator. 
+Incubation is required of all newly accepted projects until a further review indicates 
+that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. 
+While incubation status is not necessarily a reflection of the completeness or stability of the code, 
+it does indicate that the project has yet to be fully endorsed by the ASF.</p></div><div class="col col-6"><dl><dt>文档</dt><dd><a href="/zh-cn/docs/1.2.0/user_doc/architecture-design.html" target="_self">概览</a></dd><dd><a href="/zh-cn/docs/1.2.0/user_doc/quick-start.html" target="_self">快速开始</a></dd><dd><a href="/zh-cn/docs/1.2.0/user_doc/backend-development.html" target="_self">开发者指南</a></dd></dl></div><div class="col col-6"><dl><dt>ASF</dt><dd><a href="http://www.apache.org" target="_se [...]
+	<script src="https://f.alicdn.com/react/15.4.1/react-with-addons.min.js"></script>
+	<script src="https://f.alicdn.com/react/15.4.1/react-dom.min.js"></script>
+	<script>
+		window.rootPath = '';
+  </script>
+	<script src="/build/documentation.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/zh-cn/docs/1.2.1/standalone-deployment.json b/zh-cn/docs/1.2.1/standalone-deployment.json
new file mode 100644
index 0000000..b1fa7e8
--- /dev/null
+++ b/zh-cn/docs/1.2.1/standalone-deployment.json
@@ -0,0 +1,6 @@
+{
+  "filename": "standalone-deployment.md",
+  "__html": "<h1>单机部署(Standalone)</h1>\n<p>DolphinScheduler单机部署分为后端部署和前端部署两部分:</p>\n<h1>1、后端部署</h1>\n<h3>1.1 : 基础软件安装(必装项请自行安装)</h3>\n<ul>\n<li>PostgreSQL (8.2.15+) or Mysql (5.6或者5.7系列)  :  两者任选其一即可</li>\n<li><a href=\"https://www.oracle.com/technetwork/java/javase/downloads/index.html\">JDK</a> (1.8+) :  必装,请安装好后在/etc/profile下配置 JAVA_HOME 及 PATH 变量</li>\n<li>ZooKeeper (3.4.6+) :必装</li>\n<li>Hadoop (2.6+) or MinIO :选装, 如果需要用到资源上传功能,针对单机可以选择本地文件目录作为上传文件夹(此操作不需要部署Hadoop);当然也可以选择上传到Hadoop  [...]
+  "link": "/zh-cn/docs/1.2.1/standalone-deployment.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/1.2.1/system-manual.html b/zh-cn/docs/1.2.1/system-manual.html
new file mode 100644
index 0000000..cf57f4d
--- /dev/null
+++ b/zh-cn/docs/1.2.1/system-manual.html
@@ -0,0 +1,976 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+	<meta charset="UTF-8">
+	<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
+	<meta name="keywords" content="system-manual" />
+	<meta name="description" content="system-manual" />
+	<!-- 网页标签标题 -->
+	<title>system-manual</title>
+	<link rel="shortcut icon" href="/img/docsite.ico"/>
+	<link rel="stylesheet" href="/build/documentation.css" />
+</head>
+<body>
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><img class="logo" src="/img/hlogo_colorful.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-switch-normal">En</span><div class="header-menu"><img class="header-menu-toggle" src="/img/system/menu_gray.png"/><div><ul class="ant-menu blackClass an [...]
+<h2>快速上手</h2>
+<blockquote>
+<p>请参照<a href="quick-start.html">快速上手</a></p>
+</blockquote>
+<h2>操作指南</h2>
+<h3>1. 首页</h3>
+<p>首页包含用户所有项目的任务状态统计、流程状态统计、工作流定义统计。
+<p align="center">
+<img src="/img/home.png" width="80%" />
+</p></p>
+<h3>2. 项目管理</h3>
+<h4>2.1 创建项目</h4>
+<ul>
+<li>
+<p>点击&quot;项目管理&quot;进入项目管理页面,点击“创建项目”按钮,输入项目名称,项目描述,点击“提交”,创建新的项目。</p>
+<p align="center">
+    <img src="/img/project.png" width="80%" />
+</p>
+</li>
+</ul>
+<h4>2.2 项目首页</h4>
+<ul>
+<li>
+<p>在项目管理页面点击项目名称链接,进入项目首页,如下图所示,项目首页包含该项目的任务状态统计、流程状态统计、工作流定义统计。</p>
+<p align="center">
+   <img src="/img/project-home.png" width="80%" />
+</p>
+</li>
+<li>
+<p>任务状态统计:在指定时间范围内,统计任务实例中状态为提交成功、正在运行、准备暂停、暂停、准备停止、停止、失败、成功、需要容错、kill、等待线程的个数</p>
+</li>
+<li>
+<p>流程状态统计:在指定时间范围内,统计工作流实例中状态为提交成功、正在运行、准备暂停、暂停、准备停止、停止、失败、成功、需要容错、kill、等待线程的个数</p>
+</li>
+<li>
+<p>工作流定义统计:统计用户创建的工作流定义及管理员授予该用户的工作流定义</p>
+</li>
+</ul>
+<h4>2.3 工作流定义</h4>
+<h4><span id=creatDag>2.3.1 创建工作流定义</span></h4>
+<ul>
+<li>点击项目管理-&gt;工作流-&gt;工作流定义,进入工作流定义页面,点击“创建工作流”按钮,进入<strong>工作流DAG编辑</strong>页面,如下图所示:<p align="center">
+    <img src="/img/dag0.png" width="80%" />
+</p>  
+</li>
+<li>工具栏中拖拽<img src="/img/shell.png" width="35"/>到画板中,新增一个Shell任务,如下图所示:<p align="center">
+    <img src="/img/shell_dag.png" width="80%" />
+</p>  
+</li>
+<li><strong>添加shell任务的参数设置:</strong></li>
+</ul>
+<ol>
+<li>填写“节点名称”,“描述”,“脚本”字段;</li>
+<li>“运行标志”勾选“正常”,若勾选“禁止执行”,运行工作流不会执行该任务;</li>
+<li>选择“任务优先级”:当worker线程数不足时,级别高的任务在执行队列中会优先执行,相同优先级的任务按照先进先出的顺序执行;</li>
+<li>超时告警(非必选):勾选超时告警、超时失败,填写“超时时长”,当任务执行时间超过<strong>超时时长</strong>,会发送告警邮件并且任务超时失败;</li>
+<li>资源(非必选)。资源文件是资源中心-&gt;文件管理页面创建或上传的文件,如文件名为<code>test.sh</code>,脚本中调用资源命令为<code>sh test.sh</code>;</li>
+<li>自定义参数(非必填),参考<a href="#UserDefinedParameters">自定义参数</a>;</li>
+<li>点击&quot;确认添加&quot;按钮,保存任务设置。</li>
+</ol>
+<ul>
+<li>
+<p><strong>增加任务执行的先后顺序:</strong> 点击右上角图标<img src="/img/line.png" width="35"/>连接任务;如下图所示,任务2和任务3并行执行,当任务1执行完,任务2、3会同时执行。</p>
+<p align="center">
+   <img src="/img/dag2.png" width="80%" />
+</p>
+</li>
+<li>
+<p><strong>删除依赖关系:</strong> 点击右上角&quot;箭头&quot;图标<img src="/img/arrow.png" width="35"/>,选中连接线,点击右上角&quot;删除&quot;图标<img src="/img/delete.png" width="35"/>,删除任务间的依赖关系。</p>
+<p align="center">
+   <img src="/img/dag3.png" width="80%" />
+</p>
+</li>
+<li>
+<p><strong>保存工作流定义:</strong> 点击”保存“按钮,弹出&quot;设置DAG图名称&quot;弹框,如下图所示,输入工作流定义名称,工作流定义描述,设置全局参数(选填,参考<a href="#UserDefinedParameters">自定义参数</a>),点击&quot;添加&quot;按钮,工作流定义创建成功。</p>
+<p align="center">
+   <img src="/img/dag4.png" width="80%" />
+ </p>
+</li>
+</ul>
+<blockquote>
+<p>其他类型任务,请参考 <a href="#TaskParamers">任务节点类型和参数设置</a>。</p>
+</blockquote>
+<h4>2.3.2  工作流定义操作功能</h4>
+<p>点击项目管理-&gt;工作流-&gt;工作流定义,进入工作流定义页面,如下图所示:
+<p align="center">
+<img src="/img/work_list.png" width="80%" />
+</p>
+工作流定义列表的操作功能如下:</p>
+<ul>
+<li><strong>编辑:</strong> 只能编辑&quot;下线&quot;的工作流定义。工作流DAG编辑同<a href="#creatDag">创建工作流定义</a>。</li>
+<li><strong>上线:</strong> 工作流状态为&quot;下线&quot;时,上线工作流,只有&quot;上线&quot;状态的工作流能运行,但不能编辑。</li>
+<li><strong>下线:</strong> 工作流状态为&quot;上线&quot;时,下线工作流,下线状态的工作流可以编辑,但不能运行。</li>
+<li><strong>运行:</strong> 只有上线的工作流能运行。运行操作步骤见<a href="#runWorkflow">2.3.3 运行工作流</a></li>
+<li><strong>定时:</strong> 只有上线的工作流能设置定时,系统自动定时调度工作流运行。创建定时后的状态为&quot;下线&quot;,需在定时管理页面上线定时才生效。定时操作步骤见<a href="#creatTiming">2.3.4 工作流定时</a>。</li>
+<li><strong>定时管理:</strong> 定时管理页面可编辑、上线/下线、删除定时。</li>
+<li><strong>删除:</strong> 删除工作流定义。</li>
+<li><strong>下载:</strong> 下载工作流定义到本地。</li>
+<li><strong>树形图:</strong> 以树形结构展示任务节点的类型及任务状态,如下图所示:<p align="center">
+    <img src="/img/tree.png" width="80%" />
+</p>  
+</li>
+</ul>
+<h4><span id=runWorkflow>2.3.3 运行工作流</span></h4>
+<ul>
+<li>
+<p>点击项目管理-&gt;工作流-&gt;工作流定义,进入工作流定义页面,如下图所示,点击&quot;上线&quot;按钮<img src="/img/online.png" width="35"/>,上线工作流。</p>
+<p align="center">
+    <img src="/img/work_list.png" width="80%" />
+</p>
+</li>
+<li>
+<p>点击”运行“按钮,弹出启动参数设置弹框,如下图所示,设置启动参数,点击弹框中的&quot;运行&quot;按钮,工作流开始运行,工作流实例页面生成一条工作流实例。</p>
+ <p align="center">
+   <img src="/img/run-work.png" width="80%" />
+ </p>  
+</li>
+</ul>
+<p><span id=runParamers>工作流运行参数说明:</span></p>
+<pre><code>* 失败策略:当某一个任务节点执行失败时,其他并行的任务节点需要执行的策略。”继续“表示:某一任务失败后,其他任务节点正常执行;”结束“表示:终止所有正在执行的任务,并终止整个流程。
+* 通知策略:当流程结束,根据流程状态发送流程执行信息通知邮件,包含任何状态都不发,成功发,失败发,成功或失败都发。
+* 流程优先级:流程运行的优先级,分五个等级:最高(HIGHEST),高(HIGH),中(MEDIUM),低(LOW),最低(LOWEST)。当master线程数不足时,级别高的流程在执行队列中会优先执行,相同优先级的流程按照先进先出的顺序执行。
+* worker分组:该流程只能在指定的worker机器组里执行。默认是Default,可以在任一worker上执行。
+* 通知组:选择通知策略||超时报警||发生容错时,会发送流程信息或邮件到通知组里的所有成员。
+* 收件人:选择通知策略||超时报警||发生容错时,会发送流程信息或告警邮件到收件人列表。
+* 抄送人:选择通知策略||超时报警||发生容错时,会抄送流程信息或告警邮件到抄送人列表。
+* 补数:包括串行补数、并行补数2种模式。串行补数:指定时间范围内,从开始日期至结束日期依次执行补数,只生成一条流程实例;并行补数:指定时间范围内,多天同时进行补数,生成N条流程实例。 
+</code></pre>
+<ul>
+<li>
+<p>补数: 执行指定日期的工作流定义,可以选择补数时间范围(目前只支持针对连续的天进行补数),比如需要补5月1号到5月10号的数据,如下图所示:</p>
+<p align="center">
+    <img src="/img/complement.png" width="80%" />
+</p>
+<blockquote>
+<p>串行模式:补数从5月1号到5月10号依次执行,流程实例页面生成一条流程实例;</p>
+</blockquote>
+<blockquote>
+<p>并行模式:同时执行5月1号到5月10号的任务,流程实例页面生成十条流程实例。</p>
+</blockquote>
+</li>
+</ul>
+<h4><span id=creatTiming>2.3.4 工作流定时</span></h4>
+<ul>
+<li>创建定时:点击项目管理-&gt;工作流-&gt;工作流定义,进入工作流定义页面,上线工作流,点击&quot;定时&quot;按钮<img src="/img/timing.png" width="35"/>,弹出定时参数设置弹框,如下图所示:<p align="center">
+    <img src="/img/time-schedule.png" width="80%" />
+</p>
+</li>
+<li>选择起止时间。在起止时间范围内,定时运行工作流;不在起止时间范围内,不再产生定时工作流实例。</li>
+<li>添加一个每天凌晨5点执行一次的定时,如下图所示:<p align="center">
+    <img src="/img/time-schedule2.png" width="80%" />
+</p>
+</li>
+<li>失败策略、通知策略、流程优先级、Worker分组、通知组、收件人、抄送人同<a href="#runParamers">工作流运行参数</a>。</li>
+<li>点击&quot;创建&quot;按钮,创建定时成功,此时定时状态为&quot;<strong>下线</strong>&quot;,定时需<strong>上线</strong>才生效。</li>
+<li>定时上线:点击&quot;定时管理&quot;按钮<img src="/img/timeManagement.png" width="35"/>,进入定时管理页面,点击&quot;上线&quot;按钮,定时状态变为&quot;上线&quot;,如下图所示,工作流定时生效。<p align="center">
+    <img src="/img/time-schedule3.png" width="80%" />
+</p>
+</li>
+</ul>
+<h4>2.3.5 导入工作流</h4>
+<p>点击项目管理-&gt;工作流-&gt;工作流定义,进入工作流定义页面,点击&quot;导入工作流&quot;按钮,导入本地工作流文件,工作流定义列表显示导入的工作流,状态为下线。</p>
+<h4>2.4 工作流实例</h4>
+<h4>2.4.1 查看工作流实例</h4>
+<ul>
+<li>点击项目管理-&gt;工作流-&gt;工作流实例,进入工作流实例页面,如下图所示:   <p align="center">
+      <img src="/img/instance-list.png" width="80%" />
+   </p>           
+</li>
+<li>点击工作流名称,进入DAG查看页面,查看任务执行状态,如下图所示。<p align="center">
+  <img src="/img/instance-detail.png" width="80%" />
+</p>
+</li>
+</ul>
+<h4>2.4.2 查看任务日志</h4>
+<ul>
+<li>进入工作流实例页面,点击工作流名称,进入DAG查看页面,双击任务节点,如下图所示: <p align="center">
+   <img src="/img/instanceViewLog.png" width="80%" />
+ </p>
+</li>
+<li>点击&quot;查看日志&quot;,弹出日志弹框,如下图所示,任务实例页面也可查看任务日志,参考<a href="#taskLog">任务查看日志</a>。 <p align="center">
+   <img src="/img/task-log.png" width="80%" />
+ </p>
+</li>
+</ul>
+<h4>2.4.3 查看任务历史记录</h4>
+<ul>
+<li>点击项目管理-&gt;工作流-&gt;工作流实例,进入工作流实例页面,点击工作流名称,进入工作流DAG页面;</li>
+<li>双击任务节点,如下图所示,点击&quot;查看历史&quot;,跳转到任务实例页面,并展示该工作流实例运行的任务实例列表 <p align="center">
+   <img src="/img/task_history.png" width="80%" />
+ </p>
+</li>
+</ul>
+<h4>2.4.4 查看运行参数</h4>
+<ul>
+<li>点击项目管理-&gt;工作流-&gt;工作流实例,进入工作流实例页面,点击工作流名称,进入工作流DAG页面;</li>
+<li>点击左上角图标<img src="/img/run_params_button.png" width="35"/>,查看工作流实例的启动参数;点击图标<img src="/img/global_param.png" width="35"/>,查看工作流实例的全局参数和局部参数,如下图所示: <p align="center">
+   <img src="/img/run_params.png" width="80%" />
+ </p>      
+</li>
+</ul>
+<h4>2.4.4 工作流实例操作功能</h4>
+<p>点击项目管理-&gt;工作流-&gt;工作流实例,进入工作流实例页面,如下图所示:<br>
+<p align="center">
+<img src="/img/instance-list.png" width="80%" />
+</p></p>
+<ul>
+<li><strong>编辑:</strong> 只能编辑已终止的流程。点击&quot;编辑&quot;按钮或工作流实例名称进入DAG编辑页面,编辑后点击&quot;保存&quot;按钮,弹出保存DAG弹框,如下图所示,在弹框中勾选&quot;是否更新到工作流定义&quot;,保存后则更新工作流定义;若不勾选,则不更新工作流定义。   <p align="center">
+     <img src="/img/editDag.png" width="80%" />
+   </p>
+</li>
+<li><strong>重跑:</strong> 重新执行已经终止的流程。</li>
+<li><strong>恢复失败:</strong> 针对失败的流程,可以执行恢复失败操作,从失败的节点开始执行。</li>
+<li><strong>停止:</strong> 对正在运行的流程进行<strong>停止</strong>操作,后台会先<code>kill</code>worker进程,再执行<code>kill -9</code>操作</li>
+<li><strong>暂停:</strong> 对正在运行的流程进行<strong>暂停</strong>操作,系统状态变为<strong>等待执行</strong>,会等待正在执行的任务结束,暂停下一个要执行的任务。</li>
+<li><strong>恢复暂停:</strong> 对暂停的流程恢复,直接从<strong>暂停的节点</strong>开始运行</li>
+<li><strong>删除:</strong> 删除工作流实例及工作流实例下的任务实例</li>
+<li><strong>甘特图:</strong> Gantt图纵轴是某个工作流实例下的任务实例的拓扑排序,横轴是任务实例的运行时间,如图示:   <p align="center">
+       <img src="/img/gant-pic.png" width="80%" />
+   </p>
+</li>
+</ul>
+<h4>2.5 任务实例</h4>
+<ul>
+<li>
+<p>点击项目管理-&gt;工作流-&gt;任务实例,进入任务实例页面,如下图所示,点击工作流实例名称,可跳转到工作流实例DAG图查看任务状态。</p>
+   <p align="center">
+      <img src="/img/task-list.png" width="80%" />
+   </p>
+</li>
+<li>
+<p><span id=taskLog>查看日志:</span>点击操作列中的“查看日志”按钮,可以查看任务执行的日志情况。</p>
+   <p align="center">
+      <img src="/img/task-log2.png" width="80%" />
+   </p>
+</li>
+</ul>
+<h3>3. 资源中心</h3>
+<h4>3.1 hdfs资源配置</h4>
+<ul>
+<li>上传资源文件和udf函数,所有上传的文件和资源都会被存储到hdfs上,所以需要以下配置项:</li>
+</ul>
+<pre><code>conf/common/common.properties  
+    # Users who have permission to create directories under the HDFS root path
+    hdfs.root.user=hdfs
+    # data base dir, resource file will store to this hadoop hdfs path, self configuration, please make sure the directory exists on hdfs and have read write permissions。&quot;/escheduler&quot; is recommended
+    data.store2hdfs.basepath=/dolphinscheduler
+    # resource upload startup type : HDFS,S3,NONE
+    res.upload.startup.type=HDFS
+    # whether kerberos starts
+    hadoop.security.authentication.startup.state=false
+    # java.security.krb5.conf path
+    java.security.krb5.conf.path=/opt/krb5.conf
+    # loginUserFromKeytab user
+    login.user.keytab.username=hdfs-mycluster@ESZ.COM
+    # loginUserFromKeytab path
+    login.user.keytab.path=/opt/hdfs.headless.keytab
+    
+conf/common/hadoop.properties      
+    # ha or single namenode,If namenode ha needs to copy core-site.xml and hdfs-site.xml
+    # to the conf directory,support s3,for example : s3a://dolphinscheduler
+    fs.defaultFS=hdfs://mycluster:8020    
+    #resourcemanager ha note this need ips , this empty if single
+    yarn.resourcemanager.ha.rm.ids=192.168.xx.xx,192.168.xx.xx    
+    # If it is a single resourcemanager, you only need to configure one host name. If it is resourcemanager HA, the default configuration is fine
+    yarn.application.status.address=http://xxxx:8088/ws/v1/cluster/apps/%s
+
+</code></pre>
+<ul>
+<li>yarn.resourcemanager.ha.rm.ids与yarn.application.status.address只需配置其中一个地址,另一个地址配置为空。</li>
+<li>需要从Hadoop集群的conf目录下复制core-site.xml、hdfs-site.xml到dolphinscheduler项目的conf目录下,重启api-server服务。</li>
+</ul>
+<h4>3.2 文件管理</h4>
+<blockquote>
+<p>是对各种资源文件的管理,包括创建基本的txt/log/sh/conf/py/java等文件、上传jar包等各种类型文件,可进行编辑、重命名、下载、删除等操作。</p>
+</blockquote>
+  <p align="center">
+   <img src="/img/file-manage.png" width="80%" />
+ </p>
+<ul>
+<li>创建文件</li>
+</ul>
+<blockquote>
+<p>文件格式支持以下几种类型:txt、log、sh、conf、cfg、py、java、sql、xml、hql、properties</p>
+</blockquote>
+<p align="center">
+   <img src="/img/file_create.png" width="80%" />
+ </p>
+<ul>
+<li>上传文件</li>
+</ul>
+<blockquote>
+<p>上传文件:点击&quot;上传文件&quot;按钮进行上传,将文件拖拽到上传区域,文件名会自动以上传的文件名称补全</p>
+</blockquote>
+<p align="center">
+   <img src="/img/file_upload.png" width="80%" />
+ </p>
+<ul>
+<li>文件查看</li>
+</ul>
+<blockquote>
+<p>对可查看的文件类型,点击文件名称,可查看文件详情</p>
+</blockquote>
+<p align="center">
+   <img src="/img/file_detail.png" width="80%" />
+ </p>
+<ul>
+<li>下载文件</li>
+</ul>
+<blockquote>
+<p>点击文件列表的&quot;下载&quot;按钮下载文件或者在文件详情中点击右上角&quot;下载&quot;按钮下载文件</p>
+</blockquote>
+<ul>
+<li>文件重命名</li>
+</ul>
+<p align="center">
+   <img src="/img/file_rename.png" width="80%" />
+ </p>
+<ul>
+<li>删除</li>
+</ul>
+<blockquote>
+<p>文件列表-&gt;点击&quot;删除&quot;按钮,删除指定文件</p>
+</blockquote>
+<h4>3.3 UDF管理</h4>
+<h4>3.3.1 资源管理</h4>
+<blockquote>
+<p>资源管理和文件管理功能类似,不同之处是资源管理是上传的UDF函数,文件管理上传的是用户程序,脚本及配置文件
+操作功能:重命名、下载、删除。</p>
+</blockquote>
+<ul>
+<li>上传udf资源</li>
+</ul>
+<blockquote>
+<p>和上传文件相同。</p>
+</blockquote>
+<h4>3.3.2 函数管理</h4>
+<ul>
+<li>创建udf函数</li>
+</ul>
+<blockquote>
+<p>点击“创建UDF函数”,输入udf函数参数,选择udf资源,点击“提交”,创建udf函数。</p>
+</blockquote>
+<blockquote>
+<p>目前只支持HIVE的临时UDF函数</p>
+</blockquote>
+<ul>
+<li>UDF函数名称:输入UDF函数时的名称</li>
+<li>包名类名:输入UDF函数的全路径</li>
+<li>UDF资源:设置创建的UDF对应的资源文件</li>
+</ul>
+<p align="center">
+   <img src="/img/udf_edit.png" width="80%" />
+ </p>
+<h3>4. 创建数据源</h3>
+<blockquote>
+<p>数据源中心支持MySQL、POSTGRESQL、HIVE/IMPALA、SPARK、CLICKHOUSE、ORACLE、SQLSERVER等数据源</p>
+</blockquote>
+<h4>4.1 创建/编辑MySQL数据源</h4>
+<ul>
+<li>
+<p>点击“数据源中心-&gt;创建数据源”,根据需求创建不同类型的数据源。</p>
+</li>
+<li>
+<p>数据源:选择MYSQL</p>
+</li>
+<li>
+<p>数据源名称:输入数据源的名称</p>
+</li>
+<li>
+<p>描述:输入数据源的描述</p>
+</li>
+<li>
+<p>IP主机名:输入连接MySQL的IP</p>
+</li>
+<li>
+<p>端口:输入连接MySQL的端口</p>
+</li>
+<li>
+<p>用户名:设置连接MySQL的用户名</p>
+</li>
+<li>
+<p>密码:设置连接MySQL的密码</p>
+</li>
+<li>
+<p>数据库名:输入连接MySQL的数据库名称</p>
+</li>
+<li>
+<p>Jdbc连接参数:用于MySQL连接的参数设置,以JSON形式填写</p>
+</li>
+</ul>
+<p align="center">
+   <img src="/img/mysql_edit.png" width="80%" />
+ </p>
+<blockquote>
+<p>点击“测试连接”,测试数据源是否可以连接成功。</p>
+</blockquote>
+<h4>4.2 创建/编辑POSTGRESQL数据源</h4>
+<ul>
+<li>数据源:选择POSTGRESQL</li>
+<li>数据源名称:输入数据源的名称</li>
+<li>描述:输入数据源的描述</li>
+<li>IP/主机名:输入连接POSTGRESQL的IP</li>
+<li>端口:输入连接POSTGRESQL的端口</li>
+<li>用户名:设置连接POSTGRESQL的用户名</li>
+<li>密码:设置连接POSTGRESQL的密码</li>
+<li>数据库名:输入连接POSTGRESQL的数据库名称</li>
+<li>Jdbc连接参数:用于POSTGRESQL连接的参数设置,以JSON形式填写</li>
+</ul>
+<p align="center">
+   <img src="/img/postgresql_edit.png" width="80%" />
+ </p>
+<h4>4.3 创建/编辑HIVE数据源</h4>
+<p>1.使用HiveServer2方式连接</p>
+ <p align="center">
+    <img src="/img/hive_edit.png" width="80%" />
+  </p>
+<ul>
+<li>数据源:选择HIVE</li>
+<li>数据源名称:输入数据源的名称</li>
+<li>描述:输入数据源的描述</li>
+<li>IP/主机名:输入连接HIVE的IP</li>
+<li>端口:输入连接HIVE的端口</li>
+<li>用户名:设置连接HIVE的用户名</li>
+<li>密码:设置连接HIVE的密码</li>
+<li>数据库名:输入连接HIVE的数据库名称</li>
+<li>Jdbc连接参数:用于HIVE连接的参数设置,以JSON形式填写</li>
+</ul>
+<p>2.使用HiveServer2 HA Zookeeper方式连接</p>
+ <p align="center">
+    <img src="/img/hive_edit2.png" width="80%" />
+  </p>
+<p>注意:如果开启了<strong>kerberos</strong>,则需要填写 <strong>Principal</strong></p>
+<p align="center">
+    <img src="/img/hive_kerberos.png" width="80%" />
+  </p>
+<h4>4.4 创建/编辑Spark数据源</h4>
+<p align="center">
+   <img src="/img/spark_datesource.png" width="80%" />
+ </p>
+<ul>
+<li>数据源:选择Spark</li>
+<li>数据源名称:输入数据源的名称</li>
+<li>描述:输入数据源的描述</li>
+<li>IP/主机名:输入连接Spark的IP</li>
+<li>端口:输入连接Spark的端口</li>
+<li>用户名:设置连接Spark的用户名</li>
+<li>密码:设置连接Spark的密码</li>
+<li>数据库名:输入连接Spark的数据库名称</li>
+<li>Jdbc连接参数:用于Spark连接的参数设置,以JSON形式填写</li>
+</ul>
+<p>注意:如果开启了<strong>kerberos</strong>,则需要填写 <strong>Principal</strong></p>
+<p align="center">
+    <img src="/img/sparksql_kerberos.png" width="80%" />
+  </p>
+<h3>5. 安全中心(权限系统)</h3>
+<pre><code> * 安全中心只有管理员账户才有权限操作,分别有队列管理、租户管理、用户管理、告警组管理、worker分组管理、令牌管理等功能,在用户管理模块可以对资源、数据源、项目等授权
+ * 管理员登录,默认用户名密码:admin/dolphinscheduler123
+</code></pre>
+<h4>5.1 创建队列</h4>
+<ul>
+<li>队列是在执行spark、mapreduce等程序,需要用到“队列”参数时使用的。</li>
+<li>管理员进入安全中心-&gt;队列管理页面,点击“创建队列”按钮,创建队列。</li>
+</ul>
+ <p align="center">
+    <img src="/img/create-queue.png" width="80%" />
+  </p>
+<h4>5.2 添加租户</h4>
+<ul>
+<li>租户对应的是Linux的用户,用于worker提交作业所使用的用户。如果linux没有这个用户,worker会在执行脚本的时候创建这个用户。</li>
+<li>租户编码:<strong>租户编码是Linux上的用户,唯一,不能重复</strong></li>
+<li>管理员进入安全中心-&gt;租户管理页面,点击“创建租户”按钮,创建租户。</li>
+</ul>
+ <p align="center">
+    <img src="/img/addtenant.png" width="80%" />
+  </p>
+<h4>5.3 创建普通用户</h4>
+<ul>
+<li>用户分为<strong>管理员用户</strong>和<strong>普通用户</strong></li>
+</ul>
+<pre><code>* 管理员有授权和用户管理等权限,没有创建项目和工作流定义的操作的权限。
+* 普通用户可以创建项目和对工作流定义的创建,编辑,执行等操作。
+* 注意:如果该用户切换了租户,则该用户所在租户下所有资源将复制到切换的新租户下。
+</code></pre>
+<ul>
+<li>管理员进入安全中心-&gt;用户管理页面,点击“创建用户”按钮,创建用户。</li>
+</ul>
+<p align="center">
+   <img src="/img/useredit2.png" width="80%" />
+ </p>
+<blockquote>
+<p><strong>编辑用户信息</strong></p>
+</blockquote>
+<ul>
+<li>管理员进入安全中心-&gt;用户管理页面,点击&quot;编辑&quot;按钮,编辑用户信息。</li>
+<li>普通用户登录后,点击用户名下拉框中的用户信息,进入用户信息页面,点击&quot;编辑&quot;按钮,编辑用户信息。</li>
+</ul>
+<blockquote>
+<p><strong>修改用户密码</strong></p>
+</blockquote>
+<ul>
+<li>管理员进入安全中心-&gt;用户管理页面,点击&quot;编辑&quot;按钮,编辑用户信息时,输入新密码修改用户密码。</li>
+<li>普通用户登录后,点击用户名下拉框中的用户信息,进入修改密码页面,输入密码并确认密码后点击&quot;编辑&quot;按钮,则修改密码成功。</li>
+</ul>
+<h4>5.4 创建告警组</h4>
+<ul>
+<li>告警组是在启动时设置的参数,在流程结束以后会将流程的状态和其他信息以邮件形式发送给告警组。</li>
+</ul>
+<ul>
+<li>管理员进入安全中心-&gt;告警组管理页面,点击“创建告警组”按钮,创建告警组。</li>
+</ul>
+  <p align="center">
+    <img src="/img/mail_edit.png" width="80%" />
+  </p>
+<h4>5.5 创建worker分组</h4>
+<ul>
+<li>worker分组,提供了一种让任务在指定的worker上运行的机制。管理员创建worker分组,在任务节点和运行参数中设置中可以指定该任务运行的worker分组,如果指定的分组被删除或者没有指定分组,则该任务会在任一worker上运行。</li>
+<li>管理员进入安全中心-&gt;Worker分组管理页面,点击“创建Worker分组”按钮,创建Worker分组。worker分组内有多个ip地址(<strong>不能写别名</strong>),以<strong>英文逗号</strong>分隔。</li>
+</ul>
+  <p align="center">
+    <img src="/img/worker1.png" width="80%" />
+  </p>
+<h4>5.6 令牌管理</h4>
+<blockquote>
+<p>由于后端接口有登录检查,令牌管理提供了一种可以通过调用接口的方式对系统进行各种操作。</p>
+</blockquote>
+<ul>
+<li>管理员进入安全中心-&gt;令牌管理页面,点击“创建令牌”按钮,选择失效时间与用户,点击&quot;生成令牌&quot;按钮,点击&quot;提交&quot;按钮,则选择用户的token创建成功。</li>
+</ul>
+  <p align="center">
+      <img src="/img/creat_token.png" width="80%" />
+   </p>
+<ul>
+<li>
+<p>普通用户登录后,点击用户名下拉框中的用户信息,进入令牌管理页面,选择失效时间,点击&quot;生成令牌&quot;按钮,点击&quot;提交&quot;按钮,则该用户创建token成功。</p>
+</li>
+<li>
+<p>调用示例:</p>
+</li>
+</ul>
+<pre><code class="language-令牌调用示例">    /**
+     * test token
+     */
+    public  void doPOSTParam()throws Exception{
+        // create HttpClient
+        CloseableHttpClient httpclient = HttpClients.createDefault();
+
+        // create http post request
+        HttpPost httpPost = new HttpPost(&quot;http://127.0.0.1:12345/escheduler/projects/create&quot;);
+        httpPost.setHeader(&quot;token&quot;, &quot;123&quot;);
+        // set parameters
+        List&lt;NameValuePair&gt; parameters = new ArrayList&lt;NameValuePair&gt;();
+        parameters.add(new BasicNameValuePair(&quot;projectName&quot;, &quot;qzw&quot;));
+        parameters.add(new BasicNameValuePair(&quot;desc&quot;, &quot;qzw&quot;));
+        UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(parameters);
+        httpPost.setEntity(formEntity);
+        CloseableHttpResponse response = null;
+        try {
+            // execute
+            response = httpclient.execute(httpPost);
+            // response status code 200
+            if (response.getStatusLine().getStatusCode() == 200) {
+                String content = EntityUtils.toString(response.getEntity(), &quot;UTF-8&quot;);
+                System.out.println(content);
+            }
+        } finally {
+            if (response != null) {
+                response.close();
+            }
+            httpclient.close();
+        }
+    }
+</code></pre>
+<h4>5.7 授予权限</h4>
+<pre><code>* 授予权限包括项目权限,资源权限,数据源权限,UDF函数权限。
+* 管理员可以对普通用户进行非其创建的项目、资源、数据源和UDF函数进行授权。因为项目、资源、数据源和UDF函数授权方式都是一样的,所以以项目授权为例介绍。
+* 注意:对于用户自己创建的项目,该用户拥有所有的权限。则项目列表和已选项目列表中不会显示。
+</code></pre>
+<ul>
+<li>管理员进入安全中心-&gt;用户管理页面,点击需授权用户的“授权”按钮,如下图所示:</li>
+</ul>
+  <p align="center">
+   <img src="/img/auth_user.png" width="80%" />
+ </p>
+<ul>
+<li>选择项目,进行项目授权。</li>
+</ul>
+<p align="center">
+   <img src="/img/auth_project.png" width="80%" />
+ </p>
+<ul>
+<li>资源、数据源、UDF函数授权同项目授权。</li>
+</ul>
+<h3>6. 监控中心</h3>
+<h4>6.1 服务管理</h4>
+<ul>
+<li>服务管理主要是对系统中的各个服务的健康状况和基本信息的监控和显示</li>
+</ul>
+<h4>6.1.1 master监控</h4>
+<ul>
+<li>主要是master的相关信息。</li>
+</ul>
+<p align="center">
+   <img src="/img/master-jk.png" width="80%" />
+ </p>
+<h4>6.1.2 worker监控</h4>
+<ul>
+<li>主要是worker的相关信息。</li>
+</ul>
+<p align="center">
+   <img src="/img/worker-jk.png" width="80%" />
+ </p>
+<h4>6.1.3 Zookeeper监控</h4>
+<ul>
+<li>主要是zookpeeper中各个worker和master的相关配置信息。</li>
+</ul>
+<p align="center">
+   <img src="/img/zk-jk.png" width="80%" />
+ </p>
+<h4>6.1.4 DB监控</h4>
+<ul>
+<li>主要是DB的健康状况</li>
+</ul>
+<p align="center">
+   <img src="/img/mysql-jk.png" width="80%" />
+ </p>
+<h4>6.2 统计管理</h4>
+<p align="center">
+   <img src="/img/Statistics.png" width="80%" />
+ </p>
+<ul>
+<li>待执行命令数:统计t_ds_command表的数据</li>
+<li>执行失败的命令数:统计t_ds_error_command表的数据</li>
+<li>待运行任务数:统计zookeeper中task_queue的数据</li>
+<li>待杀死任务数:统计zookeeper中task_kill的数据</li>
+</ul>
+<h3>7. <span id=TaskParamers>任务节点类型和参数设置</span></h3>
+<h4>7.1 Shell节点</h4>
+<blockquote>
+<p>shell节点,在worker执行的时候,会生成一个临时shell脚本,使用租户同名的linux用户执行这个脚本。</p>
+</blockquote>
+<ul>
+<li>
+<p>点击项目管理-项目名称-工作流定义,点击&quot;创建工作流&quot;按钮,进入DAG编辑页面。</p>
+</li>
+<li>
+<p>工具栏中拖动<img src="/img/shell.png" width="35"/>到画板中,如下图所示:</p>
+<p align="center">
+    <img src="/img/shell_dag.png" width="80%" />
+</p> 
+</li>
+<li>
+<p>节点名称:一个工作流定义中的节点名称是唯一的。</p>
+</li>
+<li>
+<p>运行标志:标识这个节点是否能正常调度,如果不需要执行,可以打开禁止执行开关。</p>
+</li>
+<li>
+<p>描述信息:描述该节点的功能。</p>
+</li>
+<li>
+<p>任务优先级:worker线程数不足时,根据优先级从高到低依次执行,优先级一样时根据先进先出原则执行。</p>
+</li>
+<li>
+<p>Worker分组:任务分配给worker组的机器机执行,选择Default,会随机选择一台worker机执行。</p>
+</li>
+<li>
+<p>失败重试次数:任务失败重新提交的次数,支持下拉和手填。</p>
+</li>
+<li>
+<p>失败重试间隔:任务失败重新提交任务的时间间隔,支持下拉和手填。</p>
+</li>
+<li>
+<p>超时告警:勾选超时告警、超时失败,当任务超过&quot;超时时长&quot;后,会发送告警邮件并且任务执行失败.</p>
+</li>
+<li>
+<p>脚本:用户开发的SHELL程序。</p>
+</li>
+<li>
+<p>资源:是指脚本中需要调用的资源文件列表,资源中心-文件管理上传或创建的文件。</p>
+</li>
+<li>
+<p>自定义参数:是SHELL局部的用户自定义参数,会替换脚本中以${变量}的内容。</p>
+</li>
+</ul>
+<h4>7.2 子流程节点</h4>
+<ul>
+<li>子流程节点,就是把外部的某个工作流定义当做一个任务节点去执行。</li>
+</ul>
+<blockquote>
+<p>拖动工具栏中的<img src="https://analysys.github.io/easyscheduler_docs_cn/images/toolbar_SUB_PROCESS.png" alt="PNG">任务节点到画板中,如下图所示:</p>
+</blockquote>
+<p align="center">
+   <img src="/img/subprocess_edit.png" width="80%" />
+ </p>
+<ul>
+<li>节点名称:一个工作流定义中的节点名称是唯一的</li>
+<li>运行标志:标识这个节点是否能正常调度</li>
+<li>描述信息:描述该节点的功能</li>
+<li>超时告警:勾选超时告警、超时失败,当任务超过&quot;超时时长&quot;后,会发送告警邮件并且任务执行失败.</li>
+<li>子节点:是选择子流程的工作流定义,右上角进入该子节点可以跳转到所选子流程的工作流定义</li>
+</ul>
+<h4>7.3 依赖(DEPENDENT)节点</h4>
+<ul>
+<li>依赖节点,就是<strong>依赖检查节点</strong>。比如A流程依赖昨天的B流程执行成功,依赖节点会去检查B流程在昨天是否有执行成功的实例。</li>
+</ul>
+<blockquote>
+<p>拖动工具栏中的<img src="https://analysys.github.io/easyscheduler_docs_cn/images/toolbar_DEPENDENT.png" alt="PNG">任务节点到画板中,如下图所示:</p>
+</blockquote>
+<p align="center">
+   <img src="/img/dependent_edit.png" width="80%" />
+ </p>
+<blockquote>
+<p>依赖节点提供了逻辑判断功能,比如检查昨天的B流程是否成功,或者C流程是否执行成功。</p>
+</blockquote>
+  <p align="center">
+   <img src="/img/depend-node.png" width="80%" />
+ </p>
+<blockquote>
+<p>例如,A流程为周报任务,B、C流程为天任务,A任务需要B、C任务在上周的每一天都执行成功,如图示:</p>
+</blockquote>
+ <p align="center">
+   <img src="/img/depend-node2.png" width="80%" />
+ </p>
+<blockquote>
+<p>假如,周报A同时还需要自身在上周二执行成功:</p>
+</blockquote>
+ <p align="center">
+   <img src="/img/depend-node3.png" width="80%" />
+ </p>
+<h4>7.4 存储过程节点</h4>
+<ul>
+<li>根据选择的数据源,执行存储过程。</li>
+</ul>
+<blockquote>
+<p>拖动工具栏中的<img src="https://analysys.github.io/easyscheduler_docs_cn/images/toolbar_PROCEDURE.png" alt="PNG">任务节点到画板中,如下图所示:</p>
+</blockquote>
+<p align="center">
+   <img src="/img/procedure_edit.png" width="80%" />
+ </p>
+<ul>
+<li>数据源:存储过程的数据源类型支持MySQL和POSTGRESQL两种,选择对应的数据源</li>
+<li>方法:是存储过程的方法名称</li>
+<li>自定义参数:存储过程的自定义参数类型支持IN、OUT两种,数据类型支持VARCHAR、INTEGER、LONG、FLOAT、DOUBLE、DATE、TIME、TIMESTAMP、BOOLEAN九种数据类型</li>
+</ul>
+<h4>7.5 SQL节点</h4>
+<ul>
+<li>拖动工具栏中的<img src="https://analysys.github.io/easyscheduler_docs_cn/images/toolbar_SQL.png" alt="PNG">任务节点到画板中</li>
+<li>非查询SQL功能:编辑非查询SQL任务信息,sql类型选择非查询,如下图所示:</li>
+</ul>
+  <p align="center">
+   <img src="/img/sql-node.png" width="80%" />
+ </p>
+<ul>
+<li>查询SQL功能:编辑查询SQL任务信息,sql类型选择查询,选择表格或附件形式发送邮件到指定的收件人,如下图所示。</li>
+</ul>
+<p align="center">
+   <img src="/img/sql-node2.png" width="80%" />
+ </p>
+<ul>
+<li>数据源:选择对应的数据源</li>
+<li>sql类型:支持查询和非查询两种,查询是select类型的查询,是有结果集返回的,可以指定邮件通知为表格、附件或表格附件三种模板。非查询是没有结果集返回的,是针对update、delete、insert三种类型的操作。</li>
+<li>sql参数:输入参数格式为key1=value1;key2=value2…</li>
+<li>sql语句:SQL语句</li>
+<li>UDF函数:对于HIVE类型的数据源,可以引用资源中心中创建的UDF函数,其他类型的数据源暂不支持UDF函数。</li>
+<li>自定义参数:SQL任务类型,而存储过程是自定义参数顺序的给方法设置值自定义参数类型和数据类型同存储过程任务类型一样。区别在于SQL任务类型自定义参数会替换sql语句中${变量}。</li>
+<li>前置sql:前置sql在sql语句之前执行。</li>
+<li>后置sql:后置sql在sql语句之后执行。</li>
+</ul>
+<h4>7.6 SPARK节点</h4>
+<ul>
+<li>通过SPARK节点,可以直接直接执行SPARK程序,对于spark节点,worker会使用<code>spark-submit</code>方式提交任务</li>
+</ul>
+<blockquote>
+<p>拖动工具栏中的<img src="https://analysys.github.io/easyscheduler_docs_cn/images/toolbar_SPARK.png" alt="PNG">任务节点到画板中,如下图所示:</p>
+</blockquote>
+<p align="center">
+   <img src="/img/spark_edit.png" width="80%" />
+ </p>
+<ul>
+<li>程序类型:支持JAVA、Scala和Python三种语言</li>
+<li>主函数的class:是Spark程序的入口Main Class的全路径</li>
+<li>主jar包:是Spark的jar包</li>
+<li>部署方式:支持yarn-cluster、yarn-client和local三种模式</li>
+<li>Driver内核数:可以设置Driver内核数及内存数</li>
+<li>Executor数量:可以设置Executor数量、Executor内存数和Executor内核数</li>
+<li>命令行参数:是设置Spark程序的输入参数,支持自定义参数变量的替换。</li>
+<li>其他参数:支持 --jars、--files、--archives、--conf格式</li>
+<li>资源:如果其他参数中引用了资源文件,需要在资源中选择指定</li>
+<li>自定义参数:是MR局部的用户自定义参数,会替换脚本中以${变量}的内容</li>
+</ul>
+<p>注意:JAVA和Scala只是用来标识,没有区别,如果是Python开发的Spark则没有主函数的class,其他都是一样</p>
+<h4>7.7 MapReduce(MR)节点</h4>
+<ul>
+<li>使用MR节点,可以直接执行MR程序。对于mr节点,worker会使用<code>hadoop jar</code>方式提交任务</li>
+</ul>
+<blockquote>
+<p>拖动工具栏中的<img src="https://analysys.github.io/easyscheduler_docs_cn/images/toolbar_MR.png" alt="PNG">任务节点到画板中,如下图所示:</p>
+</blockquote>
+<ol>
+<li>JAVA程序</li>
+</ol>
+ <p align="center">
+   <img src="/img/mr_java.png" width="80%" />
+ </p>
+<ul>
+<li>主函数的class:是MR程序的入口Main Class的全路径</li>
+<li>程序类型:选择JAVA语言</li>
+<li>主jar包:是MR的jar包</li>
+<li>命令行参数:是设置MR程序的输入参数,支持自定义参数变量的替换</li>
+<li>其他参数:支持 –D、-files、-libjars、-archives格式</li>
+<li>资源: 如果其他参数中引用了资源文件,需要在资源中选择指定</li>
+<li>自定义参数:是MR局部的用户自定义参数,会替换脚本中以${变量}的内容</li>
+</ul>
+<ol start="2">
+<li>Python程序</li>
+</ol>
+<p align="center">
+   <img src="/img/mr_edit.png" width="80%" />
+ </p>
+<ul>
+<li>程序类型:选择Python语言</li>
+<li>主jar包:是运行MR的Python jar包</li>
+<li>其他参数:支持 –D、-mapper、-reducer、-input  -output格式,这里可以设置用户自定义参数的输入,比如:</li>
+<li>-mapper  &quot;<a href="http://mapper.py">mapper.py</a> 1&quot;  -file <a href="http://mapper.py">mapper.py</a>   -reducer <a href="http://reducer.py">reducer.py</a>  -file <a href="http://reducer.py">reducer.py</a> –input /journey/words.txt -output /journey/out/mr/${currentTimeMillis}</li>
+<li>其中 -mapper 后的 <a href="http://mapper.py">mapper.py</a> 1是两个参数,<a href="http://xn--mapper-9m7iglm85bf76bbzbb87i.py">第一个参数是mapper.py</a>,第二个参数是1</li>
+<li>资源: 如果其他参数中引用了资源文件,需要在资源中选择指定</li>
+<li>自定义参数:是MR局部的用户自定义参数,会替换脚本中以${变量}的内容</li>
+</ul>
+<h4>7.8 Python节点</h4>
+<ul>
+<li>使用python节点,可以直接执行python脚本,对于python节点,worker会使用<code>python **</code>方式提交任务。</li>
+</ul>
+<blockquote>
+<p>拖动工具栏中的<img src="https://analysys.github.io/easyscheduler_docs_cn/images/toolbar_PYTHON.png" alt="PNG">任务节点到画板中,如下图所示:</p>
+</blockquote>
+<p align="center">
+   <img src="/img/python_edit.png" width="80%" />
+ </p>
+<ul>
+<li>脚本:用户开发的Python程序</li>
+<li>资源:是指脚本中需要调用的资源文件列表</li>
+<li>自定义参数:是Python局部的用户自定义参数,会替换脚本中以${变量}的内容</li>
+</ul>
+<h4>7.9 Flink节点</h4>
+<ul>
+<li>拖动工具栏中的<img src="/img/flink.png" width="35"/>任务节点到画板中,如下图所示:</li>
+</ul>
+<p align="center">
+  <img src="/img/flink_edit.png" width="80%" />
+</p>
+<ul>
+<li>程序类型:支持JAVA、Scala和Python三种语言</li>
+<li>主函数的class:是Flink程序的入口Main Class的全路径</li>
+<li>主jar包:是Flink的jar包</li>
+<li>部署方式:支持cluster、local三种模式</li>
+<li>slot数量:可以设置slot数</li>
+<li>taskManage数量:可以设置taskManage数</li>
+<li>jobManager内存数:可以设置jobManager内存数</li>
+<li>taskManager内存数:可以设置taskManager内存数</li>
+<li>命令行参数:是设置Spark程序的输入参数,支持自定义参数变量的替换。</li>
+<li>其他参数:支持 --jars、--files、--archives、--conf格式</li>
+<li>资源:如果其他参数中引用了资源文件,需要在资源中选择指定</li>
+<li>自定义参数:是Flink局部的用户自定义参数,会替换脚本中以${变量}的内容</li>
+</ul>
+<p>注意:JAVA和Scala只是用来标识,没有区别,如果是Python开发的Flink则没有主函数的class,其他都是一样</p>
+<h4>7.10 http节点</h4>
+<ul>
+<li>拖动工具栏中的<img src="/img/http.png" width="35"/>任务节点到画板中,如下图所示:</li>
+</ul>
+<p align="center">
+   <img src="/img/http_edit.png" width="80%" />
+ </p>
+<ul>
+<li>节点名称:一个工作流定义中的节点名称是唯一的。</li>
+<li>运行标志:标识这个节点是否能正常调度,如果不需要执行,可以打开禁止执行开关。</li>
+<li>描述信息:描述该节点的功能。</li>
+<li>任务优先级:worker线程数不足时,根据优先级从高到低依次执行,优先级一样时根据先进先出原则执行。</li>
+<li>Worker分组:任务分配给worker组的机器机执行,选择Default,会随机选择一台worker机执行。</li>
+<li>失败重试次数:任务失败重新提交的次数,支持下拉和手填。</li>
+<li>失败重试间隔:任务失败重新提交任务的时间间隔,支持下拉和手填。</li>
+<li>超时告警:勾选超时告警、超时失败,当任务超过&quot;超时时长&quot;后,会发送告警邮件并且任务执行失败.</li>
+<li>请求地址:http请求URL。</li>
+<li>请求类型:支持GET、POSt、HEAD、PUT、DELETE。</li>
+<li>请求参数:支持Parameter、Body、Headers。</li>
+<li>校验条件:支持默认响应码、自定义响应码、内容包含、内容不包含。</li>
+<li>校验内容:当校验条件选择自定义响应码、内容包含、内容不包含时,需填写校验内容。</li>
+<li>自定义参数:是http局部的用户自定义参数,会替换脚本中以${变量}的内容。</li>
+</ul>
+<h4>8. 参数</h4>
+<h4>8.1 系统参数</h4>
+<table>
+    <tr><th>变量</th><th>含义</th></tr>
+    <tr>
+        <td>${system.biz.date}</td>
+        <td>日常调度实例定时的定时时间前一天,格式为 yyyyMMdd,补数据时,该日期 +1</td>
+    </tr>
+    <tr>
+        <td>${system.biz.curdate}</td>
+        <td>日常调度实例定时的定时时间,格式为 yyyyMMdd,补数据时,该日期 +1</td>
+    </tr>
+    <tr>
+        <td>${system.datetime}</td>
+        <td>日常调度实例定时的定时时间,格式为 yyyyMMddHHmmss,补数据时,该日期 +1</td>
+    </tr>
+</table>
+<h4>8.2 时间自定义参数</h4>
+<ul>
+<li>
+<p>支持代码中自定义变量名,声明方式:${变量名}。可以是引用 &quot;系统参数&quot; 或指定 &quot;常量&quot;。</p>
+</li>
+<li>
+<p>我们定义这种基准变量为 [...] 格式的,[yyyyMMddHHmmss] 是可以任意分解组合的,比如:$[yyyyMMdd], $[HHmmss], $[yyyy-MM-dd] 等</p>
+</li>
+<li>
+<p>也可以使用以下格式:</p>
+<pre><code>* 后 N 年:$[add_months(yyyyMMdd,12*N)]
+* 前 N 年:$[add_months(yyyyMMdd,-12*N)]
+* 后 N 月:$[add_months(yyyyMMdd,N)]
+* 前 N 月:$[add_months(yyyyMMdd,-N)]
+* 后 N 周:$[yyyyMMdd+7*N]
+* 前 N 周:$[yyyyMMdd-7*N]
+* 后 N 天:$[yyyyMMdd+N]
+* 前 N 天:$[yyyyMMdd-N]
+* 后 N 小时:$[HHmmss+N/24]
+* 前 N 小时:$[HHmmss-N/24]
+* 后 N 分钟:$[HHmmss+N/24/60]
+* 前 N 分钟:$[HHmmss-N/24/60]
+</code></pre>
+</li>
+</ul>
+<h4>8.3 <span id=UserDefinedParameters>用户自定义参数</span></h4>
+<ul>
+<li>用户自定义参数分为全局参数和局部参数。全局参数是保存工作流定义和工作流实例的时候传递的全局参数,全局参数可以在整个流程中的任何一个任务节点的局部参数引用。
+例如:</li>
+</ul>
+<p align="center">
+   <img src="/img/local_parameter.png" width="80%" />
+ </p>
+<ul>
+<li>global_bizdate为全局参数,引用的是系统参数。</li>
+</ul>
+<p align="center">
+   <img src="/img/global_parameter.png" width="80%" />
+ </p>
+<ul>
+<li>任务中local_param_bizdate通过${global_bizdate}来引用全局参数,对于脚本可以通过${local_param_bizdate}来引全局变量global_bizdate的值,或通过JDBC直接将local_param_bizdate的值set进去</li>
+</ul>
+</div></section><footer class="footer-container"><div class="footer-body"><img src="/img/ds_gray.svg"/><div class="cols-container"><div class="col col-12"><h3>Disclaimer</h3><p>Apache DolphinScheduler (incubating) is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by Incubator. 
+Incubation is required of all newly accepted projects until a further review indicates 
+that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. 
+While incubation status is not necessarily a reflection of the completeness or stability of the code, 
+it does indicate that the project has yet to be fully endorsed by the ASF.</p></div><div class="col col-6"><dl><dt>文档</dt><dd><a href="/zh-cn/docs/1.2.0/user_doc/architecture-design.html" target="_self">概览</a></dd><dd><a href="/zh-cn/docs/1.2.0/user_doc/quick-start.html" target="_self">快速开始</a></dd><dd><a href="/zh-cn/docs/1.2.0/user_doc/backend-development.html" target="_self">开发者指南</a></dd></dl></div><div class="col col-6"><dl><dt>ASF</dt><dd><a href="http://www.apache.org" target="_se [...]
+	<script src="https://f.alicdn.com/react/15.4.1/react-with-addons.min.js"></script>
+	<script src="https://f.alicdn.com/react/15.4.1/react-dom.min.js"></script>
+	<script>
+		window.rootPath = '';
+  </script>
+	<script src="/build/documentation.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/zh-cn/docs/1.2.1/system-manual.json b/zh-cn/docs/1.2.1/system-manual.json
new file mode 100644
index 0000000..5e97ba5
--- /dev/null
+++ b/zh-cn/docs/1.2.1/system-manual.json
@@ -0,0 +1,6 @@
+{
+  "filename": "system-manual.md",
+  "__html": "<h1>系统使用手册</h1>\n<h2>快速上手</h2>\n<blockquote>\n<p>请参照<a href=\"quick-start.html\">快速上手</a></p>\n</blockquote>\n<h2>操作指南</h2>\n<h3>1. 首页</h3>\n<p>首页包含用户所有项目的任务状态统计、流程状态统计、工作流定义统计。\n<p align=\"center\">\n<img src=\"/img/home.png\" width=\"80%\" />\n</p></p>\n<h3>2. 项目管理</h3>\n<h4>2.1 创建项目</h4>\n<ul>\n<li>\n<p>点击&quot;项目管理&quot;进入项目管理页面,点击“创建项目”按钮,输入项目名称,项目描述,点击“提交”,创建新的项目。</p>\n<p align=\"center\">\n    <img src=\"/img/project.png\" width=\"80%\" />\n</p>\n</li>\n</ul>\n<h4>2.2 [...]
+  "link": "/zh-cn/docs/1.2.1/system-manual.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/1.2.1/upgrade.html b/zh-cn/docs/1.2.1/upgrade.html
new file mode 100644
index 0000000..ae463a8
--- /dev/null
+++ b/zh-cn/docs/1.2.1/upgrade.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+	<meta charset="UTF-8">
+	<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
+	<meta name="keywords" content="upgrade" />
+	<meta name="description" content="upgrade" />
+	<!-- 网页标签标题 -->
+	<title>upgrade</title>
+	<link rel="shortcut icon" href="/img/docsite.ico"/>
+	<link rel="stylesheet" href="/build/documentation.css" />
+</head>
+<body>
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><img class="logo" src="/img/hlogo_colorful.svg"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-switch-normal">En</span><div class="header-menu"><img class="header-menu-toggle" src="/img/system/menu_gray.png"/><div><ul class="ant-menu blackClass an [...]
+<h2>1. 备份上一版本文件和数据库</h2>
+<h2>2. 停止dolphinscheduler所有服务</h2>
+<p><code>sh ./script/stop-all.sh</code></p>
+<h2>3. 下载新版本的安装包</h2>
+<ul>
+<li><a href="https://dolphinscheduler.apache.org/en-us/docs/user_doc/download.html">下载</a>, 下载最新版本的前后端安装包(dolphinscheduler-backend、dolphinscheduler-ui)</li>
+<li>以下升级操作都需要在新版本的目录进行</li>
+</ul>
+<h2>4. 数据库升级</h2>
+<ul>
+<li>修改conf/application-dao.properties中的下列属性</li>
+</ul>
+<pre><code>    spring.datasource.url
+    spring.datasource.username
+    spring.datasource.password
+</code></pre>
+<ul>
+<li>执行数据库升级脚本</li>
+</ul>
+<p><code>sh ./script/upgrade-escheduler.sh</code></p>
+<h2>5. 后端服务升级</h2>
+<ul>
+<li>
+<p>修改install.sh配置内容,执行升级脚本</p>
+<p><code>sh install.sh</code></p>
+</li>
+</ul>
+<h2>6. 前端服务升级</h2>
+<ul>
+<li>
+<p>覆盖上一版本dist目录</p>
+</li>
+<li>
+<p>重启nginx服务</p>
+<p><code>systemctl restart nginx</code></p>
+</li>
+</ul>
+</div></section><footer class="footer-container"><div class="footer-body"><img src="/img/ds_gray.svg"/><div class="cols-container"><div class="col col-12"><h3>Disclaimer</h3><p>Apache DolphinScheduler (incubating) is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by Incubator. 
+Incubation is required of all newly accepted projects until a further review indicates 
+that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. 
+While incubation status is not necessarily a reflection of the completeness or stability of the code, 
+it does indicate that the project has yet to be fully endorsed by the ASF.</p></div><div class="col col-6"><dl><dt>文档</dt><dd><a href="/zh-cn/docs/1.2.0/user_doc/architecture-design.html" target="_self">概览</a></dd><dd><a href="/zh-cn/docs/1.2.0/user_doc/quick-start.html" target="_self">快速开始</a></dd><dd><a href="/zh-cn/docs/1.2.0/user_doc/backend-development.html" target="_self">开发者指南</a></dd></dl></div><div class="col col-6"><dl><dt>ASF</dt><dd><a href="http://www.apache.org" target="_se [...]
+	<script src="https://f.alicdn.com/react/15.4.1/react-with-addons.min.js"></script>
+	<script src="https://f.alicdn.com/react/15.4.1/react-dom.min.js"></script>
+	<script>
+		window.rootPath = '';
+  </script>
+	<script src="/build/documentation.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/zh-cn/docs/1.2.1/upgrade.json b/zh-cn/docs/1.2.1/upgrade.json
new file mode 100644
index 0000000..54ea9c4
--- /dev/null
+++ b/zh-cn/docs/1.2.1/upgrade.json
@@ -0,0 +1,6 @@
+{
+  "filename": "upgrade.md",
+  "__html": "<h1>DolphinScheduler升级文档</h1>\n<h2>1. 备份上一版本文件和数据库</h2>\n<h2>2. 停止dolphinscheduler所有服务</h2>\n<p><code>sh ./script/stop-all.sh</code></p>\n<h2>3. 下载新版本的安装包</h2>\n<ul>\n<li><a href=\"https://dolphinscheduler.apache.org/en-us/docs/user_doc/download.html\">下载</a>, 下载最新版本的前后端安装包(dolphinscheduler-backend、dolphinscheduler-ui)</li>\n<li>以下升级操作都需要在新版本的目录进行</li>\n</ul>\n<h2>4. 数据库升级</h2>\n<ul>\n<li>修改conf/application-dao.properties中的下列属性</li>\n</ul>\n<pre><code>    spring.datasource.u [...]
+  "link": "/zh-cn/docs/1.2.1/upgrade.html",
+  "meta": {}
+}
\ No newline at end of file