feat: 支持集群(doris)

This commit is contained in:
taojinlong 2022-03-22 17:46:54 +08:00
parent 301b5155c0
commit 1fa8fae237
11 changed files with 55 additions and 30 deletions

View File

@ -8,4 +8,7 @@ import lombok.Setter;
public class DorisConfiguration extends MysqlConfiguration { public class DorisConfiguration extends MysqlConfiguration {
private Integer httpPort; private Integer httpPort;
private Integer replicationNum = 1;
private Integer bucketNum = 10;
} }

View File

@ -1,6 +1,7 @@
package io.dataease.provider; package io.dataease.provider;
import io.dataease.base.domain.DatasetTableField; import io.dataease.base.domain.DatasetTableField;
import io.dataease.base.domain.Datasource;
import java.util.List; import java.util.List;
@ -17,7 +18,7 @@ public abstract class DDLProvider {
public abstract String replaceTable(String name); public abstract String replaceTable(String name);
public abstract String createTableSql(String name, List<DatasetTableField> datasetTableFields); public abstract String createTableSql(String name, List<DatasetTableField> datasetTableFields, Datasource engine);
public abstract String insertSql(String name, List<String[]> dataList, int page, int pageNumber); public abstract String insertSql(String name, List<String[]> dataList, int page, int pageNumber);
} }

View File

@ -1,6 +1,7 @@
package io.dataease.provider; package io.dataease.provider;
import io.dataease.base.domain.DatasetTableField; import io.dataease.base.domain.DatasetTableField;
import io.dataease.base.domain.Datasource;
import io.dataease.commons.utils.Md5Utils; import io.dataease.commons.utils.Md5Utils;
import java.util.Arrays; import java.util.Arrays;
@ -28,7 +29,7 @@ public class DDLProviderImpl extends DDLProvider {
} }
@Override @Override
public String createTableSql(String name, List<DatasetTableField> datasetTableFields) { public String createTableSql(String name, List<DatasetTableField> datasetTableFields, Datasource engine) {
return null; return null;
} }

View File

@ -1,7 +1,12 @@
package io.dataease.provider.engine.doris; package io.dataease.provider.engine.doris;
import com.google.gson.Gson;
import io.dataease.base.domain.DatasetTableField; import io.dataease.base.domain.DatasetTableField;
import io.dataease.base.domain.Datasource;
import io.dataease.commons.utils.TableUtils; import io.dataease.commons.utils.TableUtils;
import io.dataease.dto.datasource.DorisConfiguration;
import io.dataease.dto.datasource.JdbcConfiguration;
import io.dataease.dto.datasource.MysqlConfiguration;
import io.dataease.provider.DDLProviderImpl; import io.dataease.provider.DDLProviderImpl;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -16,8 +21,8 @@ public class DorisDDLProvider extends DDLProviderImpl {
private static final String creatTableSql = "CREATE TABLE IF NOT EXISTS `TABLE_NAME`" + private static final String creatTableSql = "CREATE TABLE IF NOT EXISTS `TABLE_NAME`" +
"Column_Fields" + "Column_Fields" +
"UNIQUE KEY(dataease_uuid)\n" + "UNIQUE KEY(dataease_uuid)\n" +
"DISTRIBUTED BY HASH(dataease_uuid) BUCKETS 10\n" + "DISTRIBUTED BY HASH(dataease_uuid) BUCKETS BUCKETS_NUM\n" +
"PROPERTIES(\"replication_num\" = \"1\");"; "PROPERTIES(\"replication_num\" = \"ReplicationNum\");";
@Override @Override
public String createView(String name, String viewSQL) { public String createView(String name, String viewSQL) {
@ -41,9 +46,12 @@ public class DorisDDLProvider extends DDLProviderImpl {
} }
@Override @Override
public String createTableSql(String tableName, List<DatasetTableField> datasetTableFields) { public String createTableSql(String tableName, List<DatasetTableField> datasetTableFields, Datasource engine) {
DorisConfiguration dorisConfiguration = new Gson().fromJson(engine.getConfiguration(), DorisConfiguration.class);
String dorisTableColumnSql = createDorisTableColumnSql(datasetTableFields); String dorisTableColumnSql = createDorisTableColumnSql(datasetTableFields);
return creatTableSql.replace("TABLE_NAME", tableName).replace("Column_Fields", dorisTableColumnSql); return creatTableSql.replace("TABLE_NAME", tableName).replace("Column_Fields", dorisTableColumnSql)
.replace("BUCKETS_NUM", dorisConfiguration.getBucketNum().toString())
.replace("ReplicationNum", dorisConfiguration.getReplicationNum().toString());
} }
private String createDorisTableColumnSql(final List<DatasetTableField> datasetTableFields) { private String createDorisTableColumnSql(final List<DatasetTableField> datasetTableFields) {

View File

@ -1,6 +1,7 @@
package io.dataease.provider.engine.mysql; package io.dataease.provider.engine.mysql;
import io.dataease.base.domain.DatasetTableField; import io.dataease.base.domain.DatasetTableField;
import io.dataease.base.domain.Datasource;
import io.dataease.commons.utils.TableUtils; import io.dataease.commons.utils.TableUtils;
import io.dataease.provider.DDLProviderImpl; import io.dataease.provider.DDLProviderImpl;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -43,7 +44,7 @@ public class MysqlDDLProvider extends DDLProviderImpl {
} }
@Override @Override
public String createTableSql(String tableName, List<DatasetTableField> datasetTableFields) { public String createTableSql(String tableName, List<DatasetTableField> datasetTableFields, Datasource engine) {
String dorisTableColumnSql = createDorisTableColumnSql(datasetTableFields); String dorisTableColumnSql = createDorisTableColumnSql(datasetTableFields);
return creatTableSql.replace("TABLE_NAME", tableName).replace("Column_Fields", dorisTableColumnSql); return creatTableSql.replace("TABLE_NAME", tableName).replace("Column_Fields", dorisTableColumnSql);
} }

View File

@ -605,7 +605,7 @@ public class ExtractDataService {
DatasourceRequest datasourceRequest = new DatasourceRequest(); DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setDatasource(engine); datasourceRequest.setDatasource(engine);
DDLProvider ddlProvider = ProviderFactory.getDDLProvider(engine.getType()); DDLProvider ddlProvider = ProviderFactory.getDDLProvider(engine.getType());
datasourceRequest.setQuery(ddlProvider.createTableSql(tableName, datasetTableFields)); datasourceRequest.setQuery(ddlProvider.createTableSql(tableName, datasetTableFields, engine));
jdbcProvider.exec(datasourceRequest); jdbcProvider.exec(datasourceRequest);
} }

View File

@ -59,6 +59,11 @@ public class DatasourceService {
@DeCleaner(DePermissionType.DATASOURCE) @DeCleaner(DePermissionType.DATASOURCE)
public Datasource addDatasource(Datasource datasource) throws Exception{ public Datasource addDatasource(Datasource datasource) throws Exception{
try{
DatasourceTypes datasourceType = DatasourceTypes.valueOf(datasource.getType());
}catch (Exception e){
throw e;
}
checkName(datasource); checkName(datasource);
long currentTimeMillis = System.currentTimeMillis(); long currentTimeMillis = System.currentTimeMillis();
datasource.setId(UUID.randomUUID().toString()); datasource.setId(UUID.randomUUID().toString());

View File

@ -9,6 +9,7 @@ import io.dataease.commons.utils.BeanUtils;
import io.dataease.controller.ResultHolder; import io.dataease.controller.ResultHolder;
import io.dataease.controller.request.datasource.DatasourceRequest; import io.dataease.controller.request.datasource.DatasourceRequest;
import io.dataease.dto.DatasourceDTO; import io.dataease.dto.DatasourceDTO;
import io.dataease.listener.util.CacheUtils;
import io.dataease.provider.ProviderFactory; import io.dataease.provider.ProviderFactory;
import io.dataease.provider.datasource.DatasourceProvider; import io.dataease.provider.datasource.DatasourceProvider;
import io.dataease.service.datasource.DatasourceService; import io.dataease.service.datasource.DatasourceService;
@ -31,8 +32,6 @@ public class EngineService {
private DeEngineMapper deEngineMapper; private DeEngineMapper deEngineMapper;
@Resource @Resource
private DatasourceService datasource; private DatasourceService datasource;
static private Datasource ds = null;
public Boolean isLocalMode(){ public Boolean isLocalMode(){
return env.getProperty("engine_mode", "local").equalsIgnoreCase("local"); return env.getProperty("engine_mode", "local").equalsIgnoreCase("local");
@ -51,7 +50,13 @@ public class EngineService {
} }
public DeEngine info(){ public DeEngine info(){
List<DeEngine> deEngines = deEngineMapper.selectByExampleWithBLOBs(new DeEngineExample()); DeEngineExample deEngineExample = new DeEngineExample();
if(isClusterMode()){
deEngineExample.createCriteria().andTypeEqualTo("engine_doris");
}else {
deEngineExample.createCriteria().andTypeEqualTo("engine_mysql");
}
List<DeEngine> deEngines = deEngineMapper.selectByExampleWithBLOBs(deEngineExample);
if(CollectionUtils.isEmpty(deEngines)){ if(CollectionUtils.isEmpty(deEngines)){
return new DeEngine(); return new DeEngine();
} }
@ -69,7 +74,7 @@ public class EngineService {
datasourceProvider.checkStatus(datasourceRequest); datasourceProvider.checkStatus(datasourceRequest);
return ResultHolder.success(datasource); return ResultHolder.success(datasource);
}catch (Exception e){ }catch (Exception e){
return ResultHolder.error("Datasource is invalid: " + e.getMessage()); return ResultHolder.error("Engine is invalid: " + e.getMessage());
} }
} }
@ -79,26 +84,23 @@ public class EngineService {
deEngineMapper.insert(engine); deEngineMapper.insert(engine);
}else { }else {
deEngineMapper.updateByPrimaryKeyWithBLOBs(engine); deEngineMapper.updateByPrimaryKeyWithBLOBs(engine);
datasource.handleConnectionPool(getDeEngine(), "delete");
} }
datasource.handleConnectionPool(this.ds, "delete");
setDs(engine); setDs(engine);
datasource.handleConnectionPool(this.ds, "add"); datasource.handleConnectionPool(getDeEngine(), "add");
return ResultHolder.success(engine); return ResultHolder.success(engine);
} }
private void setDs(DeEngine engine){ private void setDs(DeEngine engine){
if(this.ds == null){ CacheUtils.put("ENGINE", "engine", engine, null, null);
this.ds = new Datasource();
BeanUtils.copyBean(this.ds, engine);
}else {
BeanUtils.copyBean(this.ds, engine);
}
} }
public Datasource getDeEngine() throws Exception{ public Datasource getDeEngine() throws Exception{
if (this.ds != null) { Object catcheEngine = CacheUtils.get("ENGINE", "engine");
return this.ds; if(catcheEngine != null){
return (Datasource) catcheEngine;
} }
if(isLocalMode()){ if(isLocalMode()){
JSONObject jsonObject = new JSONObject(); JSONObject jsonObject = new JSONObject();
jsonObject.put("dataSourceType", "jdbc"); jsonObject.put("dataSourceType", "jdbc");
@ -123,12 +125,7 @@ public class EngineService {
} }
setDs(deEngines.get(0)); setDs(deEngines.get(0));
} }
// if(isSimpleMode()){ return getDeEngine();
//
// }
//TODO cluster mode
return this.ds;
} }

View File

@ -1301,6 +1301,7 @@ export default {
user_name: '用户名', user_name: '用户名',
password: '密码', password: '密码',
host: '主机名/IP地址', host: '主机名/IP地址',
doris_host: 'Doris 地址',
port: '端口', port: '端口',
datasource_url: '地址', datasource_url: '地址',
please_input_datasource_url: '请输入 Elasticsearch 地址,如: http://es_host:es_port', please_input_datasource_url: '请输入 Elasticsearch 地址,如: http://es_host:es_port',
@ -1332,6 +1333,10 @@ export default {
initial_pool_size: '初始连接数', initial_pool_size: '初始连接数',
min_pool_size: '最小连接数', min_pool_size: '最小连接数',
max_pool_size: '最大连接数', max_pool_size: '最大连接数',
bucket_num: 'Bucket 数量',
replication_num: '副本数量',
please_input_bucket_num: '请输入 Bucket 数量',
please_input_replication_num: '请输入副本数量',
max_idle_time: '最大空闲(秒)', max_idle_time: '最大空闲(秒)',
acquire_increment: '增长数', acquire_increment: '增长数',
connect_timeout: '连接超时(秒)', connect_timeout: '连接超时(秒)',

View File

@ -1,6 +1,5 @@
<template> <template>
<div> <div>
<!--邮件表单-->
<el-form ref="form" v-loading="loading" <el-form ref="form" v-loading="loading"
:model="form" :model="form"
:rules="rules" :rules="rules"

View File

@ -30,6 +30,10 @@
<simple-mode /> <simple-mode />
</el-tab-pane> </el-tab-pane>
<el-tab-pane v-if="engineMode==='cluster'" :lazy="true" :label="$t('system_parameter_setting.engine_mode_setting')" name="six">
<cluster-mode />
</el-tab-pane>
</el-tabs> </el-tabs>
</layout-content> </layout-content>
</template> </template>
@ -37,13 +41,14 @@
import BasicSetting from './BasicSetting' import BasicSetting from './BasicSetting'
import EmailSetting from './EmailSetting' import EmailSetting from './EmailSetting'
import SimpleMode from './SimpleModeSetting' import SimpleMode from './SimpleModeSetting'
import ClusterMode from './ClusterModeSetting'
import LayoutContent from '@/components/business/LayoutContent' import LayoutContent from '@/components/business/LayoutContent'
import PluginCom from '@/views/system/plugin/PluginCom' import PluginCom from '@/views/system/plugin/PluginCom'
import { pluginLoaded } from '@/api/user' import { pluginLoaded } from '@/api/user'
import { engineMode } from '@/api/system/engine' import { engineMode } from '@/api/system/engine'
export default { export default {
components: { BasicSetting, EmailSetting, LayoutContent, PluginCom, SimpleMode}, components: { BasicSetting, EmailSetting, LayoutContent, PluginCom, SimpleMode, ClusterMode},
data() { data() {
return { return {
activeName: 'zero', activeName: 'zero',