#!/bin/bash # Copyright 2015 The Kubernetes Authors. # # Licensed 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 is an example script that creates a fully functional vitess cluster. # It performs the following steps: # - Create etcd clusters # - Create vtctld pod # - Create vttablet pods # - Perform vtctl initialization: # SetKeyspaceShardingInfo, Rebuild Keyspace, Reparent Shard, Apply Schema # - Create vtgate pods script_root=`dirname "${BASH_SOURCE}"` source $script_root/env.sh cells=`echo $CELLS | tr ',' ' '` num_cells=`echo $cells | wc -w` function update_spinner_value () { spinner='-\|/' cur_spinner=${spinner:$(($1%${#spinner})):1} } function wait_for_running_tasks () { # This function waits for pods to be in the "Running" state # 1. task_name: Name that the desired task begins with # 2. num_tasks: Number of tasks to wait for # Returns: # 0 if successful, -1 if timed out task_name=$1 num_tasks=$2 counter=0 echo "Waiting for ${num_tasks}x $task_name to enter state Running" while [ $counter -lt $MAX_TASK_WAIT_RETRIES ]; do # Get status column of pods with name starting with $task_name, # count how many are in state Running num_running=`$KUBECTL get pods | grep ^$task_name | grep Running | wc -l` echo -en "\r$task_name: $num_running out of $num_tasks in state Running..." if [ $num_running -eq $num_tasks ] then echo Complete return 0 fi update_spinner_value $counter echo -n $cur_spinner let counter=counter+1 sleep 1 done echo Timed out return -1 } if [ -z "$GOPATH" ]; then echo "ERROR: GOPATH undefined, can't obtain vtctlclient" exit -1 fi export KUBECTL='kubectl' echo "Downloading and installing vtctlclient..." go get -u github.com/youtube/vitess/go/cmd/vtctlclient num_shards=`echo $SHARDS | tr "," " " | wc -w` total_tablet_count=$(($num_shards*$TABLETS_PER_SHARD*$num_cells)) vtgate_count=$VTGATE_COUNT if [ $vtgate_count -eq 0 ]; then vtgate_count=$(($total_tablet_count/4>3?$total_tablet_count/4:3)) fi echo "****************************" echo "*Creating vitess cluster:" echo "* Shards: $SHARDS" echo "* Tablets per shard: $TABLETS_PER_SHARD" echo "* Rdonly per shard: $RDONLY_COUNT" echo "* VTGate count: $vtgate_count" echo "* Cells: $cells" echo "****************************" echo 'Running etcd-up.sh' && CELLS=$CELLS ./etcd-up.sh wait_for_running_tasks etcd-global 3 for cell in $cells; do wait_for_running_tasks etcd-$cell 3 done echo 'Running vtctld-up.sh' && ./vtctld-up.sh echo 'Running vttablet-up.sh' && CELLS=$CELLS ./vttablet-up.sh echo 'Running vtgate-up.sh' && ./vtgate-up.sh wait_for_running_tasks vtctld 1 wait_for_running_tasks vttablet $total_tablet_count wait_for_running_tasks vtgate $vtgate_count vtctld_port=30001 vtctld_ip=`kubectl get -o yaml nodes | grep 'type: ExternalIP' -B 1 | head -1 | awk '{print $NF}'` vtctl_server="$vtctld_ip:$vtctld_port" kvtctl="$GOPATH/bin/vtctlclient -server $vtctl_server" echo Waiting for tablets to be visible in the topology counter=0 while [ $counter -lt $MAX_VTTABLET_TOPO_WAIT_RETRIES ]; do num_tablets=0 for cell in $cells; do num_tablets=$(($num_tablets+`$kvtctl ListAllTablets $cell | wc -l`)) done echo -en "\r$num_tablets out of $total_tablet_count in topology..." if [ $num_tablets -eq $total_tablet_count ] then echo Complete break fi update_spinner_value $counter echo -n $cur_spinner let counter=counter+1 sleep 1 if [ $counter -eq $MAX_VTTABLET_TOPO_WAIT_RETRIES ] then echo Timed out fi done # split_shard_count = num_shards for sharded keyspace, 0 for unsharded split_shard_count=$num_shards if [ $split_shard_count -eq 1 ]; then split_shard_count=0 fi echo -n Setting Keyspace Sharding Info... $kvtctl SetKeyspaceShardingInfo -force -split_shard_count $split_shard_count test_keyspace keyspace_id uint64 echo Done echo -n Rebuilding Keyspace Graph... $kvtctl RebuildKeyspaceGraph test_keyspace echo Done echo -n Reparenting... shard_num=1 for shard in $(echo $SHARDS | tr "," " "); do $kvtctl InitShardMaster -force test_keyspace/$shard `echo $cells | awk '{print $1}'`-0000000${shard_num}00 let shard_num=shard_num+1 done echo Done echo -n Applying Schema... $kvtctl ApplySchema -sql "$(cat create_test_table.sql)" test_keyspace echo Done echo "****************************" echo "* Complete!" echo "* Use the following line to make an alias to kvtctl:" echo "* alias kvtctl='\$GOPATH/bin/vtctlclient -server $vtctl_server'" echo "* See the vtctld UI at: http://${vtctld_ip}:30000" echo "****************************"