Skip to content

Commit

Permalink
[feature](docker) add disaggregated doris docker image content (apach…
Browse files Browse the repository at this point in the history
…e#39093)

1. Added corresponding scripts for the doris image(fe,be) of storage-computing separation deployment 
2. Added a new metaservice image module
3. Added binary package storage paths and prompt files for different architectures to facilitate clearer construction of your own image
catpineapple authored and dataroaring committed Aug 26, 2024
1 parent b889848 commit 9288c8f
Showing 18 changed files with 937 additions and 0 deletions.
23 changes: 23 additions & 0 deletions docker/runtime/be/resource/amd64/x64_package_is_here
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->


This file is not required for building an image.
It is just a reminder for you: If you build a docker image yourself,
please place the installation package (already unzipped) corresponding to the CPU architecture at the same level as this file.
23 changes: 23 additions & 0 deletions docker/runtime/be/resource/arm64/arm64_package_is_here
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->


This file is not required for building an image.
It is just a reminder for you: If you build a docker image yourself,
please place the installation package (already unzipped) corresponding to the CPU architecture at the same level as this file.
185 changes: 185 additions & 0 deletions docker/runtime/be/resource/be_disaggregated_entrypoint.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
#!/bin/bash
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.

#TODO: convert to "_"
MS_ENDPOINT=${MS_ENDPOINT}
MS_TOKEN=${MS_TOKEN:="greedisgood9999"}
DORIS_HOME=${DORIS_HOME:="/opt/apache-doris"}
CONFIGMAP_PATH=${CONFIGMAP_PATH:="/etc/doris"}
INSTANCE_ID=${INSTANCE_ID}
INSTANCE_NAME=${INSTANCE_NAME}
HEARTBEAT_PORT=9050
CLUSTER_NMAE=${CLUSTER_NAME}
#option:IP,FQDN
HOST_TYPE=${HOST_TYPE:="FQDN"}
STATEFULSET_NAME=${STATEFULSET_NAME}
POD_NAMESPACE=$POD_NAMESPACE
DEFAULT_CLUSTER_ID=${POD_NAMESPACE}"_"${STATEFULSET_NAME}
CLUSTER_ID=${CLUSTER_ID:="$DEFAULT_CLUSTER_ID"}
POD_NAME=${POD_NAME}
CLOUD_UNIQUE_ID_PRE=${CLOUD_UNIQUE_ID_PRE:="1:$INSTANCE_ID"}
CLOUD_UNIQUE_ID="$CLOUD_UNIQUE_ID_PRE:$POD_NAME"
# replace "-" with "_" in CLUSTER_ID and CLOUD_UNIQUE_ID
CLUSTER_ID=$(sed 's/-/_/g' <<<$CLUSTER_ID)

CONFIG_FILE="$DORIS_HOME/be/conf/be.conf"
MY_SELF=

DEFAULT_CLUSTER_NAME=$(awk -F $INSTANCE_NAME"-" '{print $NF}' <<<$STATEFULSET_NAME)
CLUSTER_NAME=${CLUSTER_NAME:="$DEFAULT_CLUSTER_NAME"}

#TODO: check config or not, add default
echo 'file_cache_path = [{"path":"/opt/apache-doris/be/storage","total_size":107374182400,"query_limit":107374182400}]' >> $DORIS_HOME/be/conf/be.conf

function log_stderr()
{
echo "[`date`] $@" >& 1
}

function add_cluster_info_to_conf()
{
echo "meta_service_endpoint=$MS_ENDPOINT" >> $DORIS_HOME/be/conf/be.conf
echo "cloud_unique_id=$CLOUD_UNIQUE_ID" >> $DORIS_HOME/be/conf/be.conf
echo "meta_service_use_load_balancer = false" >> $DORIS_HOME/be/conf/be.conf
echo "enable_file_cache = true" >> $DORIS_HOME/be/conf/be.conf
}

function link_config_files()
{
if [[ -d $CONFIGMAP_PATH ]]; then
for file in `ls $CONFIGMAP_PATH`;
do
if [[ -f $DORIS_HOME/be/conf/$file ]]; then
mv $DORIS_HOME/be/conf/$file $DORIS_HOME/be/conf/$file.bak
fi
done
fi

for file in `ls $CONFIGMAP_PATH`;
do
if [[ "$file" == "be.conf" ]]; then
cp $CONFIGMAP_PATH/$file $DORIS_HOME/be/conf/$file
add_cluster_info_to_conf
continue
fi

ln -sfT $CONFIGMAP_PATH/$file $DORIS_HOME/be/conf/$file
done
}

function parse_config_file_with_key()
{
local key=$1
local value=`grep "^\s*$key\s*=" $CONFIG_FILE | sed "s|^\s*$key\s*=\s*\(.*\)\s*$|\1|g"`
}

function parse_my_self_address()
{
local my_ip=`hostname -i | awk '{print $1}'`
local my_fqdn=`hostname -f`
if [[ $HOST_TYPE == "IP" ]]; then
MY_SELF=$my_ip
else
MY_SELF=$my_fqdn
fi
}

function variables_initial()
{
parse_my_self_address
local heartbeat_port=$(parse_config_file_with_key "heartbeat_service_port")
if [[ "x$heartbeat_port" != "x" ]]; then
HEARTBEAT_PORT=$heartbeat_port
fi
}

function check_or_register_in_ms()
{
interval=5
start=$(date +%s)
timeout=60
while true;
do
local find_address="http://$MS_ENDPOINT/MetaService/http/get_cluster?token=$MS_TOKEN"
local output=$(curl -s $find_address \
-d '{"cloud_unique_id":"'$CLOUD_UNIQUE_ID'","cluster_id":"'$CLUSTER_ID'"}')
if grep -q -w "$MY_SELF" <<< $output &>/dev/null; then
log_stderr "[INFO] $MY_SELF have register in instance id $INSTANCE_ID cluser id $CLUSTER_ID!"
return
fi

local code=$(jq -r ".code" <<< $output)
if [[ "$code" == "NOT_FOUND" ]]; then
# if grep -q -w "$CLUSTER_ID" <<< $output &>/dev/null; then
# log_stderr "[INFO] cluster id $CLUSTER_ID have exists, only register self.!"
# add_my_self
# else
log_stderr "[INFO] register cluster id $CLUSTER_ID with myself $MY_SELF into instance id $INSTANCE_ID."
add_my_self_with_cluster
# fi
else
log_stderr "[INFO] register $MY_SELF into cluster id $CLUSTER_ID!"
add_my_self
fi

local now=$(date +%s)
let "expire=start+timeout"
if [[ $expire -le $now ]]; then
log_stderr "[ERROR] Timeout for register myself to ms, abort!"
exit 1
fi
sleep $interval
done
}

function add_my_self()
{
local register_address="http://$MS_ENDPOINT/MetaService/http/add_node?token=$MS_TOKEN"
local output=$(curl -s $register_address \
-d '{"instance_id":"'$INSTANCE_ID'",
"cluster":{"type":"COMPUTE","cluster_id":"'$CLUSTER_ID'",
"nodes":[{"cloud_unique_id":"'$CLOUD_UNIQUE_ID'","ip":"'$MY_SELF'","host":"'$MY_SELF'","heartbeat_port":'$HEARTBEAT_PORT'}]}}')
local code=$(jq -r ".code" <<< $output)
if [[ "$code" == "OK" ]]; then
log_stderr "[INFO] my_self $MY_SELF register to ms $MS_ENDPOINT instance_id $INSTANCE_ID be cluster $CLUSTER_ID success."
else
log_stderr "[ERROR] my_self $MY_SELF register ms $MS_ENDPOINT instance_id $INSTANCE_ID be cluster $CLUSTER_ID failed,err=$output!"
fi
}

function add_my_self_with_cluster()
{
local register_address="http://$MS_ENDPOINT/MetaService/http/add_cluster?token=$MS_TOKEN"
local output=$(curl -s $register_address \
-d '{"instance_id":"'$INSTANCE_ID'",
"cluster":{"type":"COMPUTE","cluster_name":"'$CLUSTER_NAME'","cluster_id":"'$CLUSTER_ID'",
"nodes":[{"cloud_unique_id":"'$CLOUD_UNIQUE_ID'","ip":"'$MY_SELF'","host":"'$MY_SELF'","heartbeat_port":'$HEARTBEAT_PORT'}]}}')
local code=$(jq -r ".code" <<< $output)
if [[ "$code" == "OK" ]]; then
log_stderr "[INFO] cluster $CLUSTER_ID contains $MY_SELF register to ms $MS_ENDPOINT instance_id $INSTANCE_ID success."
else
log_stderr "[ERROR] cluster $CLUSTER_ID contains $MY_SELF register to ms $MS_ENDPOINT instance_id $INSTANCE_ID failed,err=$output!"
fi
}

add_cluster_info_to_conf
link_config_files
variables_initial
check_or_register_in_ms

$DORIS_HOME/be/bin/start_be.sh --console
23 changes: 23 additions & 0 deletions docker/runtime/be/resource/be_disaggregated_prestop.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#!/bin/bash
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.

#

DORIS_HOME=${DORIS_HOME:="/opt/apache-doris"}

$DORIS_HOME/be/bin/stop_be.sh --grace
64 changes: 64 additions & 0 deletions docker/runtime/be/resource/be_disaggregated_probe.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
#!/bin/bash
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.

#

PROBE_TYPE=$1
DORIS_HOME=${DORIS_HOME:="/opt/apache-doris"}
CONFIG_FILE="$DORIS_HOME/be/conf/be.conf"
DEFAULT_HEARTBEAT_SERVICE_PORT=9050
DEFAULT_WEBSERVER_PORT=8040

function parse_config_file_with_key()
{
local key=$1
local value=`grep "^\s*$key\s*=" $CONFIG_FILE | sed "s|^\s*$key\s*=\s*\(.*\)\s*$|\1|g"`
echo $value
}

function alive_probe()
{
local heartbeat_service_port=$(parse_config_file_with_key "heartbeat_service_port")
heartbeat_service_port=${heartbeat_service_port:=$DEFAULT_HEARTBEAT_SERVICE_PORT}
if netstat -lntp | grep ":$heartbeat_service_port" > /dev/null ; then
exit 0
else
exit 1
fi
}

function ready_probe()
{
local webserver_port=$(parse_config_file_with_key "webserver_port")
webserver_port=${webserver_port:=$DEFAULT_WEBSERVER_PORT}
local ip=`hostname -i | awk '{print $1}'`
local url="http://${ip}:${webserver_port}/api/health"
local res=$(curl -s $url)
local status=$(jq -r ".status" <<< $res)
if [[ "x$status" == "xOK" ]]; then
exit 0
else
exit 1
fi
}

if [[ "$PROBE_TYPE" == "ready" ]]; then
ready_probe
else
alive_probe
fi
23 changes: 23 additions & 0 deletions docker/runtime/broker/resource/amd64/x64_package_is_here
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->


This file is not required for building an image.
It is just a reminder for you: If you build a docker image yourself,
please place the installation package (already unzipped) corresponding to the CPU architecture at the same level as this file.
23 changes: 23 additions & 0 deletions docker/runtime/broker/resource/arm64/arm64_package_is_here
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->


This file is not required for building an image.
It is just a reminder for you: If you build a docker image yourself,
please place the installation package (already unzipped) corresponding to the CPU architecture at the same level as this file.
23 changes: 23 additions & 0 deletions docker/runtime/fe/resource/amd64/x64_package_is_here
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->


This file is not required for building an image.
It is just a reminder for you: If you build a docker image yourself,
please place the installation package (already unzipped) corresponding to the CPU architecture at the same level as this file.
23 changes: 23 additions & 0 deletions docker/runtime/fe/resource/arm64/arm64_package_is_here
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->


This file is not required for building an image.
It is just a reminder for you: If you build a docker image yourself,
please place the installation package (already unzipped) corresponding to the CPU architecture at the same level as this file.
207 changes: 207 additions & 0 deletions docker/runtime/fe/resource/fe_disaggregated_entrypoint.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,207 @@
#!/bin/bash
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.


# ms address, fe pod's address should register in it.
MS_ENDPOINT=${MS_ENDPOINT}
MS_TOKEN=${MS_TOKEN:="greedisgood9999"}
ELECT_NUMBER=${ELECT_NUMBER:=1}
FE_EDIT_PORT=${FE_EDIT_PORT:=9010}
# cloud_id is default.
CLUSTER_ID=${CLUSTER_ID:="RESERVED_CLUSTER_ID_FOR_SQL_SERVER"}
# cloud_name is default.
CLUSTER_NAME=${CLUSTER_NAME:="RESERVED_CLUSTER_NAME_FOR_SQL_SERVER"}
#the instance id, pod's address should register in instance->cluster.
INSTANCE_ID=${INSTANCE_ID}
MY_SELF=
HOSTNAME=`hostname`
STATEFULSET_NAME=${STATEFULSET_NAME}
POD_NAME=${POD_NAME}
CLOUD_UNIQUE_ID_PRE=${CLOUD_UNIQUE_ID_PRE:="1:$INSTANCE_ID"}
CLOUD_UNIQUE_ID="$CLOUD_UNIQUE_ID_PRE:$POD_NAME"

CONFIGMAP_PATH=${CONFIGMAP_MOUNT_PATH:="/etc/doris"}
DORIS_HOME=${DORIS_HOME:="/opt/apache-doris"}
CONFIG_FILE="$DORIS_HOME/fe/conf/fe.conf"

SEQUENCE_NUMBER=$(hostname | awk -F '-' '{print $NF}')
NODE_TYPE="FE_MASTER"

if [ "$SEQUENCE_NUMBER" -ge "$ELECT_NUMBER" ]; then
NODE_TYPE="FE_OBSERVER"
fi

# 1. add default config in config file or link config files.
# 2. assign global variables.
# 3. register myself.


function log_stderr()
{
echo "[`date`] $@" >& 1
}

function add_cluster_info_to_conf()
{
echo "meta_service_endpoint=$MS_ENDPOINT" >> $DORIS_HOME/fe/conf/fe.conf
echo "cloud_unique_id=$CLOUD_UNIQUE_ID" >> $DORIS_HOME/fe/conf/fe.conf
}

function link_config_files()
{
if [[ -d $CONFIGMAP_PATH ]]; then
#backup files want to replace
for file in `ls $CONFIGMAP_PATH`;
do
if [[ -f $DORIS_HOME/fe/conf/$file ]]; then
mv $DORIS_HOME/fe/conf/$file $DORIS_HOME/fe/conf/$file.bak
fi
done

for file in `ls $CONFIGMAP_PATH`;
do
if [[ "$file" == "fe.conf" ]]; then
cp $CONFIGMAP_PATH/$file $DORIS_HOME/fe/conf/$file
add_cluster_info_to_conf
continue
fi

ln -sfT $CONFIGMAP_PATH/$file $DORIS_HOME/fe/conf/$file
done
fi
}

parse_config_file_with_key()
{
local key=$1
local value=`grep "^\s*$key\s*=" $CONFIG_FILE | sed "s|^\s*$key\s*=\s*\(.*\)\s*$|\1|g"`
echo $value
}

# confirm the register address, if config `enable_fqdn_mode=true` use fqdn start or use ip.
function parse_my_self_address()
{
local value=`parse_config_file_with_key "enable_fqdn_mode"`

local my_ip=`hostname -i | awk '{print $1}'`
local my_fqdn=`hostname -f`
if [[ $value == "true" ]]; then
MY_SELF=$my_fqdn
else
MY_SELF=$my_ip
fi
}

function variables_inital()
{
parse_my_self_address
local edit_port=$(parse_config_file_with_key "edit_log_port")
if [[ "x$edit_port" != "x" ]]; then
FE_EDIT_PORT=${edit_port:=$FE_EDIT_PORT}
fi

}

function check_or_register_in_ms()
{
interval=5
start=$(date +%s)
timeout=60
while true;
do
local find_address="http://$MS_ENDPOINT/MetaService/http/get_cluster?token=$MS_TOKEN"
local output=$(curl -s $find_address \
-d '{"cloud_unique_id": "'$CLOUD_UNIQUE_ID'",
"cluster_id": "RESERVED_CLUSTER_ID_FOR_SQL_SERVER"}')
if grep -q -w $MY_SELF <<< $output &>/dev/null ; then
log_stderr "[INFO] $MY_SELF have registerd in metaservice!"
return
fi

local code=$(jq -r ".code" <<< $output)
if [[ "$code" == "NOT_FOUND" ]]; then
# if grep -q -w "RESERVED_CLUSTER_NAME_FOR_SQL_SERVER" <<< $output &>/dev/null; then
# log_stderr "[INFO] RESERVED_CLUSTER_NAME_FOR_SQL_SERVER fe cluster have exist, register node $MY_SELF."
# add_my_self
# else
log_stderr "[INFO] RESERVED_CLUSTER_NAME_FOR_SQL_SERVER fe cluster not exist, register fe clsuter."
add_my_self_with_cluster
# fi
else
log_stderr "[INFO] register myself $MY_SELF into fe cluster cloud_unique_id $CLOUD_UNIQUE_ID."
add_my_self
fi

local now=$(date +%s)
let "expire=start+timeout"
if [[ $expire -le $now ]]; then
log_stderr "[ERROR] Timeout for register myself to ms, abort!"
exit 1
fi
sleep $interval
done
}

function add_my_self()
{
local register_address="http://$MS_ENDPOINT/MetaService/http/add_node?token=$MS_TOKEN"
local curl_cmd="curl -s $register_address -d '{\"instance_id\":\"$INSTANCE_ID\",\"cluster\":{\"type\":\"SQL\",\"cluster_name\":\"RESERVED_CLUSTER_NAME_FOR_SQL_SERVER\",\"cluster_id\":\"RESERVED_CLUSTER_ID_FOR_SQL_SERVER\",\"nodes\":[{\"cloud_unique_id\":\"$CLOUD_UNIQUE_ID\",\"ip\":\"$MY_SELF\",\"host\":\"$MY_SELF\",\"edit_log_port\":9010,\"node_type\":\"$NODE_TYPE\"}]}}'"
# echo "add_my_self: $curl_cmd"
local output=$(eval "$curl_cmd")
# echo "add_my_self response:$output"
local code=$(jq -r ".code" <<< $output)
if [[ "$code" == "OK" ]]; then
log_stderr "[INFO] my_self $MY_SELF register to ms $MS_ENDPOINT instance_id $INSTANCE_ID fe cluster RESERVED_CLUSTER_NAME_FOR_SQL_SERVER success!"
else
log_stderr "[ERROR] my_self register ms $MS_ENDPOINT instance_id $INSTANCE_ID fe cluster failed, response $output!"
fi
}

function add_my_self_with_cluster()
{
local register_address="http://$MS_ENDPOINT/MetaService/http/add_cluster?token=$MS_TOKEN"
local curl_data="{\"instance_id\":\"$INSTANCE_ID\",\"cluster\":{\"type\":\"SQL\",\"cluster_name\":\"RESERVED_CLUSTER_NAME_FOR_SQL_SERVER\",\"cluster_id\":\"RESERVED_CLUSTER_ID_FOR_SQL_SERVER\",\"nodes\":[{\"cloud_unique_id\":\"$CLOUD_UNIQUE_ID\",\"ip\":\"$MY_SELF\",\"host\":\"$MY_SELF\",\"node_type\":\"$NODE_TYPE\",\"edit_log_port\":$FE_EDIT_PORT}]}}"
local curl_cmd="curl -s $register_address -d '$curl_data'"
# echo "add_my_self_with_cluster: $curl_cmd"
local output=$(eval "$curl_cmd")
# echo "add_my_self_with_cluster response: $output"
code=$(jq -r ".code" <<< $output)
if [[ "$code" == "OK" ]]; then
log_stderr "[INFO] fe cluster contains $MY_SELF node_type $NODE_TYPE register to ms $MS_ENDPOINT instance_id $INSTANCE_ID success."
else
log_stderr "[ERROR] fe cluster contains $MY_SELF node_type $NODE_TYPE register to ms $MS_ENDPOINT instance_id $INSTANCE_ID faied, $output!"
fi
}

function check_and_modify_fqdn_config()
{
local enable_fqdn=`parse_config_file_with_key "enable_fqdn_mode"`
log_stderr "enable_fqdn is : $enable_fqdn"
if [[ "x$enable_fqdn" != "xtrue" ]] ; then
log_stderr "add enable_fqdn_mode = true to $CONFIG_FILE"
echo "enable_fqdn_mode = true" >> $CONFIG_FILE
fi
}

add_cluster_info_to_conf
check_and_modify_fqdn_config
link_config_files
variables_inital
check_or_register_in_ms
/opt/apache-doris/fe/bin/start_fe.sh --console

23 changes: 23 additions & 0 deletions docker/runtime/fe/resource/fe_disaggregated_prestop.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#!/bin/bash
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.

#

DORIS_HOME=${DORIS_HOME:="/opt/apache-doris"}

$DORIS_HOME/fe/bin/stop_fe.sh --grace
64 changes: 64 additions & 0 deletions docker/runtime/fe/resource/fe_disaggregated_probe.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
#!/bin/bash
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.

#

DORIS_HOEM=${DORIS_HOME:="/opt/apache-doris"}
CONFIG_FILE="$DORIS_HOME/fe/conf/fe.conf"
DEFAULT_HTTP_PORT=8030
DEFAULT_QUERY_PORT=9030
PROBE_TYPE=$1

function parse_config_file_with_key()
{
local key=$1
local value=`grep "^\s*$key\s*=" $CONFIG_FILE | sed "s|^\s*$key\s*=\s*\(.*\)\s*$|\1|g"`
echo $value
}

function alive_probe()
{
local query_port=$(parse_config_file_with_key "query_port")
query_port=${query_port:=$DEFAULT_QUERY_PORT}
if netstat -lntp | grep ":$query_port" > /dev/null ; then
exit 0
else
exit 1
fi
}

function ready_probe()
{
local http_port=$(parse_config_file_with_key "http_port")
http_port=${http_port:=$DEFAULT_HTTP_PORT}
local ip=`hostname -i | awk '{print $1}'`
local url="http://${ip}:${http_port}/api/health"
local res=$(curl -s $url)
local code=$(jq -r ".code" <<< $res)
if [[ "x$code" == "x0" ]]; then
exit 0
else
exit 1
fi
}

if [[ "$PROBE_TYPE" == "ready" ]]; then
ready_probe
else
alive_probe
fi
57 changes: 57 additions & 0 deletions docker/runtime/ms/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.

# how to use Dockerfile.
# this is dockerfile for build doris ms image
# when build youself image.
# 1. pull binary from official website and decompress into resource directory that the level equals with this Dockerfile.
# 2. untar xxxx.tar.gz in resource/{arch} directory, makesure your doris package real version and target arch.
# 3. run commad docker build -t xxx.doris.ms:xx -f Dockerfile --build-arg DORIS_VERSION=3.0.0

# we have support buildx for amd64 and arm64 architecture image build.
# get the binary from doris github and utar into resource, update the directory as apache-`version(example:3.0.0)`-bin-`architecture(amd64/arm64)` mode.

# choose a base image
FROM selectdb/base:latest

ARG TARGETARCH

ARG DORIS_VERSION="x.x.x"


RUN if echo $DORIS_VERSION | grep -E '^([3-9]|([1-9]([0-9])))|^branch\-([3-9]|([1-9]([0-9])))|master.*' >>/dev/null ; then \
ln -s /usr/lib/jvm/jdk-17 /usr/lib/jvm/java && \
rm -rf /usr/lib/jvm/jdk-8; \
else \
ln -s /usr/lib/jvm/jdk-8 /usr/lib/jvm/java && \
rm -rf /usr/lib/jvm/jdk-17; \
fi;

# set environment variables
ENV JAVA_HOME=/usr/lib/jvm/java
ENV PATH=$PATH:$JAVA_HOME/bin:/opt/apache-doris/ms/bin

COPY resource/${TARGETARCH:-amd64}/apache-doris-${DORIS_VERSION}-bin-*/ms /opt/apache-doris/ms

COPY resource/ms_*.sh /opt/apache-doris/

#RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

WORKDIR /opt/apache-doris

#ENTRYPOINT ["bash","entry_point.sh"]
ENTRYPOINT ["bash","ms_disaggregated_entrypoint.sh"]
23 changes: 23 additions & 0 deletions docker/runtime/ms/resource/amd64/x64_package_is_here
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->


This file is not required for building an image.
It is just a reminder for you: If you build a docker image yourself,
please place the installation package (already unzipped) corresponding to the CPU architecture at the same level as this file.
23 changes: 23 additions & 0 deletions docker/runtime/ms/resource/arm64/arm64_package_is_here
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->


This file is not required for building an image.
It is just a reminder for you: If you build a docker image yourself,
please place the installation package (already unzipped) corresponding to the CPU architecture at the same level as this file.
44 changes: 44 additions & 0 deletions docker/runtime/ms/resource/ms_disaggregated_entrypoint.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
#!/bin/bash
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.

#

#get from env
FDB_ENDPOINT=${FDB_ENDPOINT}
CONFIGMAP_PATH=${CONFIGMAP_PATH:="/etc/doris"}
DORIS_HOME=${DORIS_HOME:="/opt/apache-doris"}

echo "fdb_cluster=$FDB_ENDPOINT" >> $DORIS_HOME/ms/conf/doris_cloud.conf
if [[ -d $CONFIGMAP_PATH ]]; then
for file in `ls $CONFIGMAP_PATH`
do
if [[ "$file" == "doris_cloud.conf" ]] ; then
mv -f $DORIS_HOME/ms/conf/$file $DORIS_HOME/ms/conf/$file.bak
cp $CONFIGMAP_PATH/$file $DORIS_HOME/ms/conf/$file
echo "fdb_cluster=$FDB_ENDPOINT" >> $DORIS_HOME/ms/conf/doris_cloud.conf
continue
fi

if test -e $DORIS_HOME/ms/conf/$file ; then
mv -f $DORIS_HOME/ms/conf/$file $DORIS_HOME/ms/conf/$file.bak
fi
ln -sfT $CONFIGMAP_PATH/$file $DORIS_HOME/ms/conf/$file
done
fi

$DORIS_HOME/ms/bin/start.sh --$1
24 changes: 24 additions & 0 deletions docker/runtime/ms/resource/ms_disaggregated_prestop.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#!/bin/bash
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.


#get from env
DORIS_HOME=${DORIS_HOME:="/opt/apache-doris"}

$DORIS_HOME/ms/bin/stop.sh --$1

62 changes: 62 additions & 0 deletions docker/runtime/ms/resource/ms_disaggregated_probe.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
#!/bin/bash
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.

DORIS_HOME=${DORIS_HOME:="/opt/apache-doris"}
CONFIG_FILE="$DORIS_HOME/ms/conf/doris_cloud.conf"
DEFAULT_BRPC_LISTEN_PORT=5000
PROBE_TYPE=$1

log_stderr()
{
echo "[`date`] $@" >&2
}

function parse_config_file_with_key()
{
local key=$1
local value=`grep "^\s*$key\s*=" $CONFIG_FILE | sed "s|^\s*$key\s*=\s*\(.*\)\s*$|\1|g"`
echo $value
}

function alive_probe()
{
local brpc_listen_port=$(parse_config_file_with_key "brpc_listen_port")
brpc_listen_port=${brpc_listen_port:=$DEFAULT_BRPC_LISTEN_PORT}
if netstat -lntp | grep ":$brpc_listen_port" > /dev/null ; then
exit 0
else
exit 1
fi
}

function ready_probe()
{
local brpc_listen_port=$(parse_config_file_with_key "brpc_listen_port")
brpc_listen_port=${brpc_listen_port:=$DEFAULT_BRPC_LISTEN_PORT}
if netstat -lntp | grep ":$brpc_listen_port" > /dev/null ; then
exit 0
else
exit 1
fi
}

if [[ "$PROBE_TYPE" == "ready" ]]; then
ready_probe
else
alive_probe
fi

0 comments on commit 9288c8f

Please sign in to comment.