有没有办法在初始化两个MarkLogic节点后将它们添加到群集中?我有自动脚本使用ML amis在AWS中构建新节点。使用该配置,节点在启动时已经配置完毕,并且没有用于加入集群的初始化屏幕。有什么方法可以加入已经处于这种状态的节点?
答案 0 :(得分:0)
我不得不修改http://docs.marklogic.com/guide/admin-api/cluster#id_52842上的脚本才能使其对我有用。
主要变化是:
-
#!/bin/bash
################################################################
# Use this script to initialize and add one or more hosts to a
# MarkLogic Server cluster. The first (bootstrap) host for the
# cluster should already be fully initialized.
#
# Use the options to control admin username and password,
# authentication mode, and the security realm. At least two hostnames
# must be given: A host already in the cluster, and at least one host
# to be added to the cluster. Only minimal error checking is performed,
# so this script is not suitable for production use.
#
# Usage: this_command [options] cluster-host joining-host(s)
#
################################################################
USER="admin"
PASS="password"
AUTH_MODE="anyauth"
N_RETRY=5
RETRY_INTERVAL=10
#######################################################
# restart_check(hostname, baseline_timestamp, caller_lineno)
#
# Use the timestamp service to detect a server restart, given a
# a baseline timestamp. Use N_RETRY and RETRY_INTERVAL to tune
# the test length. Include authentication in the curl command
# so the function works whether or not security is initialized.
# $1 : The hostname to test against
# $2 : The baseline timestamp
# $3 : Invokers LINENO, for improved error reporting
# Returns 0 if restart is detected, exits with an error if not.
#
function restart_check {
LAST_START=`$AUTH_CURL "http://$1:8001/admin/v1/timestamp"`
for i in `seq 1 ${N_RETRY}`; do
if [ "$2" == "$LAST_START" ] || [ "$LAST_START" == "" ]; then
sleep ${RETRY_INTERVAL}
LAST_START=`$AUTH_CURL "http://$1:8001/admin/v1/timestamp"`
else
return 0
fi
done
echo "ERROR: Line $3: Failed to restart $1"
exit 1
}
#######################################################
# Parse the command line
OPTIND=1
while getopts ":a:p:u:" opt; do
case "$opt" in
a) AUTH_MODE=$OPTARG ;;
p) PASS=$OPTARG ;;
u) USER=$OPTARG ;;
\?) echo "Unrecognized option: -$OPTARG" >&2; exit 1 ;;
esac
done
shift $((OPTIND-1))
if [ $# -ge 2 ]; then
BOOTSTRAP_HOST=$1
shift
else
echo "ERROR: At least two hostnames are required." >&2
exit 1
fi
ADDITIONAL_HOSTS=$@
# Curl command for all requests. Suppress progress meter (-s),
# but still show errors (-S)
CURL="curl -s -S"
# Curl command when authentication is required, after security
# is initialized.
AUTH_CURL="${CURL} --${AUTH_MODE} --user ${USER}:${PASS}"
#######################################################
# Add one or more hosts to a cluster. For each host joining
# the cluster:
# (1) POST /admin/v1/init (joining host)
# (2) GET /admin/v1/server-config (joining host)
# (3) POST /admin/v1/cluster-config (bootstrap host)
# (4) POST /admin/v1/cluster-config (joining host)
# GET /admin/v1/timestamp is used to confirm restarts.
for JOINING_HOST in $ADDITIONAL_HOSTS; do
echo "Adding host to cluster: $JOINING_HOST..."
# (1) Initialize MarkLogic Server on the joining host
TIMESTAMP=`$AUTH_CURL -X GET \
http://${JOINING_HOST}:8001/admin/v1/timestamp`
if [ "$TIMESTAMP" == "" ]; then
echo "ERROR: Failed to initialize $JOINING_HOST" >&2
exit 1
fi
#restart_check $JOINING_HOST $TIMESTAMP $LINENO
# (2) Retrieve the joining host's configuration
JOINER_CONFIG=`$AUTH_CURL -X GET -H "Accept: application/xml" \
http://${JOINING_HOST}:8001/admin/v1/server-config`
echo $JOINER_CONFIG | grep -q "^<host"
if [ "$?" -ne 0 ]; then
echo "ERROR: Failed to fetch server config for $JOINING_HOST"
exit 1
fi
# (3) Send the joining host's config to the bootstrap host, receive
# the cluster config data needed to complete the join. Save the
# response data to cluster-config.zip.
$AUTH_CURL -X POST -o cluster-config.zip -d "group=Default" \
--data-urlencode "server-config=${JOINER_CONFIG}" \
-H "Content-type: application/x-www-form-urlencoded" \
http://${BOOTSTRAP_HOST}:8001/admin/v1/cluster-config
if [ "$?" -ne 0 ]; then
echo "ERROR: Failed to fetch cluster config from $BOOTSTRAP_HOST"
exit 1
fi
if [ `file cluster-config.zip | grep -cvi "zip archive data"` -eq 1 ]; then
echo "ERROR: Failed to fetch cluster config from $BOOTSTRAP_HOST"
exit 1
fi
# (4) Send the cluster config data to the joining host, completing
# the join sequence.
TIMESTAMP=`$AUTH_CURL -X POST -H "Content-type: application/zip" \
--data-binary @./cluster-config.zip \
http://${JOINING_HOST}:8001/admin/v1/cluster-config \
| grep "last-startup" \
| sed 's%^.*<last-startup.*>\(.*\)</last-startup>.*$%\1%'`
restart_check $JOINING_HOST $TIMESTAMP $LINENO
rm ./cluster-config.zip
echo "...$JOINING_HOST successfully added to the cluster."
done
答案 1 :(得分:0)
请注意,如果您使用MarkLogic的“托管群集”功能,则不需要您自己的任何部署或群集加入脚本,该功能除了可以通过自动替换故障节点并重新连接提供HA之外,还可以透明地对其进行管理。到EBS存储,以及随时暂停和重新启动群集的功能。使用受管群集功能,任何大小(> = 3)的群集都可以承受所有节点的全部故障,并且无需手动干预即可自动恢复。添加节点只需更改云形成脚本中的参数即可。您可能要为下一个群集研究此功能。