github.com/percona/percona-xtradb-cluster-operator@v1.14.0/build/pxc-configure-pxc.sh (about)

     1  #! /bin/bash
     2  
     3  # Copyright 2016 The Kubernetes Authors.
     4  #
     5  # Licensed under the Apache License, Version 2.0 (the "License");
     6  # you may not use this file except in compliance with the License.
     7  # You may obtain a copy of the License at
     8  #
     9  #     http://www.apache.org/licenses/LICENSE-2.0
    10  #
    11  # Unless required by applicable law or agreed to in writing, software
    12  # distributed under the License is distributed on an "AS IS" BASIS,
    13  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14  # See the License for the specific language governing permissions and
    15  # limitations under the License.
    16  
    17  # This script writes out a mysql galera config using a list of newline seperated
    18  # peer DNS names it accepts through stdin.
    19  
    20  # /etc/mysql is assumed to be a shared volume so we can modify my.cnf as required
    21  # to keep the config up to date, without wrapping mysqld in a custom pid1.
    22  # The config location is intentionally not /etc/mysql/my.cnf because the
    23  # standard base image clobbers that location.
    24  
    25  set -o errexit
    26  set -o xtrace
    27  
    28  function join {
    29      local IFS="$1"; shift; echo "$*";
    30  }
    31  
    32  function mysql_root_exec() {
    33    local server="$1"
    34    local query="$2"
    35    { set +x; } 2>/dev/null
    36    MYSQL_PWD="${OPERATOR_ADMIN_PASSWORD:-operator}" timeout 600 mysql -h "${server}" -P 33062 -uoperator -s -NB -e "${query}"
    37    set -x
    38  }
    39  
    40  NODE_IP=$(hostname -I | awk ' { print $1 } ')
    41  CLUSTER_NAME="$(hostname -f | cut -d'.' -f2)"
    42  SERVER_NUM=${HOSTNAME/$CLUSTER_NAME-/}
    43  SERVER_ID=${CLUSTER_HASH}${SERVER_NUM}
    44  NODE_NAME=$(hostname -f)
    45  NODE_PORT=3306
    46  
    47  while read -ra LINE; do
    48      echo "read line $LINE"
    49      LINE_IP=$(getent hosts "$LINE" | awk '{ print $1 }')
    50      if [ "$LINE_IP" != "$NODE_IP" ]; then
    51          LINE_HOST=$(mysql_root_exec "$LINE_IP" 'select @@hostname' || :)
    52          if [ -n "$LINE_HOST" ]; then
    53              PEERS=("${PEERS[@]}" $LINE_HOST)
    54              PEERS_FULL=("${PEERS_FULL[@]}" "$LINE_HOST.$CLUSTER_NAME")
    55          else
    56              PEERS_FULL=("${PEERS_FULL[@]}" $LINE_IP)
    57          fi
    58      fi
    59  done
    60  
    61  if [ "${#PEERS[@]}" != 0 ]; then
    62      DONOR_ADDRESS="$(printf '%s\n' "${PEERS[@]}" "${HOSTNAME}" | sort --version-sort | uniq | grep -v -- '-0$' | sed '$d' | tr '\n' ',' | sed 's/^,$//')"
    63  fi
    64  if [ "${#PEERS_FULL[@]}" != 0 ]; then
    65      WSREP_CLUSTER_ADDRESS="$(printf '%s\n' "${PEERS_FULL[@]}" | sort --version-sort | tr '\n' ',' | sed 's/,$//')"
    66  fi
    67  
    68  CFG=/etc/mysql/node.cnf
    69  MYSQL_VERSION=$(mysqld -V | awk '{print $3}' | awk -F'.' '{print $1"."$2}')
    70  if [ "$MYSQL_VERSION" == '8.0' ]; then
    71  	grep -E -q "^[#]?admin-address" "$CFG" || sed '/^\[mysqld\]/a admin-address=\n' ${CFG} 1<>${CFG}
    72  	grep -E -q "^[#]?log_error_suppression_list" "$CFG" || sed '/^\[mysqld\]/a log_error_suppression_list="MY-010055"\n' ${CFG} 1<>${CFG}
    73  else
    74  	grep -E -q "^[#]?extra_max_connections" "$CFG" || sed '/^\[mysqld\]/a extra_max_connections=\n' ${CFG} 1<>${CFG}
    75  	grep -E -q "^[#]?extra_port" "$CFG" || sed '/^\[mysqld\]/a extra_port=\n' ${CFG} 1<>${CFG}
    76  fi
    77  
    78  if [ "$IS_LOGCOLLECTOR" == 'yes' ]; then
    79  	grep -E -q "^[#]?log-error" "$CFG" || sed "/^\[mysqld\]/a log-error=$LOG_DATA_DIR/mysqld-error.log\n" ${CFG} 1<>${CFG}
    80  fi
    81  grep -E -q "^[#]?wsrep_sst_donor" "$CFG" || sed '/^\[mysqld\]/a wsrep_sst_donor=\n' ${CFG} 1<>${CFG}
    82  grep -E -q "^[#]?wsrep_node_incoming_address" "$CFG" || sed '/^\[mysqld\]/a wsrep_node_incoming_address=\n' ${CFG} 1<>${CFG}
    83  grep -E -q "^[#]?wsrep_provider_options" "$CFG" || sed '/^\[mysqld\]/a wsrep_provider_options="pc.weight=10"\n' ${CFG} 1<>${CFG}
    84  sed -r "s|^[#]?server_id=.*$|server_id=${SERVER_ID}|" ${CFG} 1<>${CFG}
    85  sed -r "s|^[#]?coredumper$|coredumper|" ${CFG} 1<>${CFG}
    86  sed -r "s|^[#]?wsrep_node_address=.*$|wsrep_node_address=${NODE_IP}|" ${CFG} 1<>${CFG}
    87  sed -r "s|^[#]?wsrep_cluster_name=.*$|wsrep_cluster_name=${CLUSTER_NAME}|" ${CFG} 1<>${CFG}
    88  sed -r "s|^[#]?wsrep_sst_donor=.*$|wsrep_sst_donor=${DONOR_ADDRESS}|" ${CFG} 1<>${CFG}
    89  sed -r "s|^[#]?wsrep_cluster_address=.*$|wsrep_cluster_address=gcomm://${WSREP_CLUSTER_ADDRESS}|" ${CFG} 1<>${CFG}
    90  sed -r "s|^[#]?wsrep_node_incoming_address=.*$|wsrep_node_incoming_address=${NODE_NAME}:${NODE_PORT}|" ${CFG} 1<>${CFG}
    91  { set +x; } 2>/dev/null
    92  ESCAPED_XTRABACKUP_PASSWORD=$(printf '%s\n' "$XTRABACKUP_PASSWORD" | sed -e 's/[]\|\&\!$*.^[]/\\&/g')
    93  sed -r "s|^[#]?wsrep_sst_auth=.*$|wsrep_sst_auth='xtrabackup:$ESCAPED_XTRABACKUP_PASSWORD'|" ${CFG} 1<>${CFG}
    94  set -x
    95  sed -r "s|^[#]?admin-address=.*$|admin-address=${NODE_IP}|" ${CFG} 1<>${CFG}
    96  sed -r "s|^[#]?extra_max_connections=.*$|extra_max_connections=100|" ${CFG} 1<>${CFG}
    97  sed -r "s|^[#]?extra_port=.*$|extra_port=33062|" ${CFG} 1<>${CFG}
    98  
    99  CA=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt
   100  if [ -f /var/run/secrets/kubernetes.io/serviceaccount/service-ca.crt ]; then
   101      CA=/var/run/secrets/kubernetes.io/serviceaccount/service-ca.crt
   102  fi
   103  SSL_DIR=${SSL_DIR:-/etc/mysql/ssl}
   104  if [ -f ${SSL_DIR}/ca.crt ]; then
   105      CA=${SSL_DIR}/ca.crt
   106  fi
   107  SSL_INTERNAL_DIR=${SSL_INTERNAL_DIR:-/etc/mysql/ssl-internal}
   108  if [ -f ${SSL_INTERNAL_DIR}/ca.crt ]; then
   109      CA=${SSL_INTERNAL_DIR}/ca.crt
   110  fi
   111  
   112  KEY=${SSL_DIR}/tls.key
   113  CERT=${SSL_DIR}/tls.crt
   114  if [ -f ${SSL_INTERNAL_DIR}/tls.key -a -f ${SSL_INTERNAL_DIR}/tls.crt ]; then
   115      KEY=${SSL_INTERNAL_DIR}/tls.key
   116      CERT=${SSL_INTERNAL_DIR}/tls.crt
   117  fi
   118  
   119  if [ -f $CA -a -f $KEY -a -f $CERT ]; then
   120      sed "/^\[mysqld\]/a pxc-encrypt-cluster-traffic=ON\nssl-ca=$CA\nssl-key=$KEY\nssl-cert=$CERT" ${CFG} 1<> ${CFG}
   121  else
   122      sed "/^\[mysqld\]/a pxc-encrypt-cluster-traffic=OFF" ${CFG} 1<> ${CFG}
   123  fi
   124  
   125  # don't need a restart, we're just writing the conf in case there's an
   126  # unexpected restart on the node.