sql >> Database >  >> RDS >> MariaDB

Een MySQL- of MariaDB-server voorbereiden voor productie - deel één

Het is uiterst belangrijk om een ​​MySQL-productieserver te installeren en configureren met de nodige pakketten en tools om de operaties op de lange termijn soepel te laten verlopen. We hebben veel gevallen gezien waarin het oplossen van problemen of het afstemmen van een productieserver (vooral een server zonder openbare internettoegang) vaak moeilijk is vanwege het ontbreken van de benodigde tools die op de server zijn geïnstalleerd om het probleem te helpen identificeren en oplossen.

In deze tweedelige blogserie gaan we je 9 tips en trucs laten zien over hoe je een MySQL-server voorbereidt op productiegebruik vanuit het perspectief van een systeembeheerder. Alle voorbeelden in deze blogpost zijn gebaseerd op onze twee-node, master-slave MySQL-replicatie-installatie die draait op CentOS 7.

Installeer essentiële pakketten

Na de installatie van MySQL- of MariaDB-client- en serverpakketten, moeten we de MySQL/MariaDB-server voorbereiden met alle benodigde hulpmiddelen om alle beheer-, beheer- en controlebewerkingen die op de server. Als u van plan bent de MySQL-server in productie te vergrendelen, zal het een beetje moeilijker zijn om ze allemaal handmatig te installeren zonder de internetverbinding.

Enkele van de belangrijke pakketten die op de MySQL/MariaDB-server voor Linux moeten worden geïnstalleerd:

  • Percona Xtrabackup/MariaDB Backup - Niet-blokkerende fysieke back-up van de databaseserver.
  • ntp/ntpdate - Servertijd synchroniseren.
  • pv - Gegevens monitoren via een pijplijn, kan ook worden gebruikt voor beperking.
  • socat of netcat- tool voor gegevensstreaming, goed voor streamingback-up.
  • net-tools - Een verzameling hulpprogramma's voor netwerkfoutopsporing voor Linux.
  • bind-utils - Een verzameling DNS-foutopsporingstools voor Linux.
  • sysstat - Een verzameling hulpprogramma's voor prestatiebewaking voor Linux.
  • telnet - Telnet-client om de bereikbaarheid van de service te controleren.
  • mailx/mailutils - MTA-client.
  • openssl - Toolkit voor de Transport Layer Security (TLS) en Secure Sockets Layer (SSL) protocollen.
  • unzip - decomprimeer tool.
  • htop - Hulpprogramma voor het bewaken van hosts.
  • innotop - MySQL-controletool.
  • vim - Teksteditor met syntaxisaccentuering (of een andere gewenste teksteditor).
  • python-setuptools - Python-pakketbeheerder.
  • lm_sensors/ipmitool - Om de temperatuur van de servercomponent te controleren. Alleen bare-metal server.

Merk op dat sommige van de voorgestelde pakketten alleen beschikbaar zijn in niet-standaard pakketrepositories zoals EPEL voor CentOS. Daarom, voor YUM-gebaseerde installatie:

$ yum install epel-release
$ yum install -y wget ntp pv socat htop innotop vim mailx bind-utils net-tools telnet sysstat openssl python-setuptools lm_sensors ipmitool

Terwijl voor APT-gebaseerde installatie:

$ apt-get install ntp pv socat htop innotop vim easy_install mailutils bind-utils sysstat net-tools telnet openssl lm_sensors ipmitool

Voor de MySQL-opdrachtregelinterface kunnen we een ander hulpmiddel gebruiken dan de standaard "mysql"-opdrachtregelclient zoals mycli, met automatische aanvulling en syntaxisaccentuering. Om het pakket te installeren, kunnen we pip (Python-pakketbeheerder) gebruiken:

$ pip install mycli

Met mycli kan men de vector voor menselijke fouten verminderen met een betere visualisatie bij het omgaan met de productieserver, zoals weergegeven in de volgende schermafbeelding:

Betekenisvolle Shell-prompt

Dit onderdeel lijkt in de eerste plaats overbodig, maar het zal je waarschijnlijk behoeden voor het maken van domme fouten in de productie. Als mens zijn we geneigd fouten te maken, vooral bij het uitvoeren van destructieve opdrachten tijdens een intens moment, bijvoorbeeld wanneer de productieserver niet beschikbaar is.

Bekijk de volgende schermafbeelding. Standaard ziet de bash PS1-prompt (primaire prompt) er nogal saai uit:

Een goede PS1-prompt zou duidelijke informatie moeten geven om SysAdmins meer bewust te maken van de omgeving, server en het huidige pad waarmee ze momenteel te maken hebben. Als gevolg hiervan zou men voorzichtiger zijn en altijd weten of het in het juiste pad/server/gebruiker is om het commando uit te voeren.

Om dit te bereiken, zoekt u de regel die de PS1-configuratie (primaire prompt) beschrijft, gewoonlijk in /etc/bashrc regel 41:

  [ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[\[email protected]\h \W]\\$ "

En vervang het door deze regel:

  [ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[\[\e[36m\]\u\[\e[m\]@\[\e[32m\]\h\[\e[m\]\[\e[31;47m\]Production\[\e[m\]: \[\e[33m\]\w\[\e[m\]]$ "

Log uit bij de terminal en log opnieuw in. Je zou nu iets als dit in de terminal moeten zien:

Zoals getoond in de bovenstaande schermafbeelding, is de huidige gebruiker (blauw), de server hostnaam (groen), Productielaag (vet in rode kleur met witte achtergrond), samen met het volledige pad van de huidige map (geel) geeft een betere samenvatting van de huidige sessie waarbij de belangrijke informatie gemakkelijk te onderscheiden is met verschillende kleuren.

U kunt deze gratis online tool gebruiken om uw bash-prompt aan uw smaak aan te passen.

MOTD

Als u een databasecluster beheert met meerdere rollen zoals MySQL of MariaDB-replicatie, is het gebruikelijk om altijd een angstig gevoel te hebben bij het rechtstreeks beheren van een van de hosts, omdat we extra controles moeten uitvoeren om te verifiëren dat de knooppunt waarin we ons bevinden, het knooppunt is dat we echt willen beheren. Replicatietopologie wordt meestal complexer naarmate uw databasecluster uitbreidt en er kunnen veel rollen in een cluster zijn, zoals intermediate master, binlog-server, back-upmaster met semi-sync-replicatie, alleen-lezen slaves en ook back-upverificatieserver.

Het zal veel beter zijn als we een samenvatting van de databasestatus kunnen krijgen wanneer we ons op die specifieke server bevinden, gewoon om ons een idee te geven van waar we mee te maken krijgen. We kunnen Linux's Message of the Day (MOTD) gebruiken om dit gedrag te automatiseren wanneer we inloggen op de server. Het gebruik van de standaard /etc/motd is alleen goed voor statische inhoud, wat niet is wat we echt willen als we de huidige status van een MySQL-server willen rapporteren.

Om een ​​vergelijkbaar resultaat te bereiken, kunnen we een eenvoudig Bash-script gebruiken om een ​​zinvolle MOTD-uitvoer te produceren om onze MySQL/MariaDB-server samen te vatten, bijvoorbeeld:

$ vim ~/.motd.sh
#!/bin/bash
# Auto-generate MOTD for MySQL/MariaDB Replication
# .motd.sh, to be executed under ~/.bash_profile

#####
# Preferred role of the node, pick one
#PREFER_ROLE='Slave'
PREFER_ROLE='Master'
#####

HOSTNAME=$(hostname)
UPTIME=$(uptime -p)
MYSQL_COMMAND='mysql --connect-timeout=2 -A -Bse'
MYSQL_READONLY=$(${MYSQL_COMMAND} 'SHOW GLOBAL VARIABLES LIKE "read_only"' | awk {'print $2'})
TIER='Production'
MAIN_IP=$(hostname -I | awk {'print $1'})
CHECK_MYSQL_REPLICATION=$(${MYSQL_COMMAND} 'SHOW SLAVE STATUS\G' | egrep 'Slave_.*_Running: Yes$')
MYSQL_MASTER=$(${MYSQL_COMMAND} 'SHOW SLAVE STATUS\G' | grep Master_Host | awk {'print $2'})
# The following requires show_compatibility_56=1 for MySQL 5.7 and later
MYSQL_UPTIME=$(${MYSQL_COMMAND} 'SELECT TIME_FORMAT(SEC_TO_TIME(VARIABLE_VALUE ),"%Hh %im")  AS Uptime FROM information_schema.GLOBAL_STATUS WHERE VARIABLE_NAME="Uptime"')

# coloring
bold=$(tput bold)
red=$(tput setaf 1)
green=$(tput setaf 2)
normal=$(tput sgr0)

MYSQL_SHOW=1
if [ $MYSQL_READONLY == 'ON' ]; then
        CURRENT_MYSQL_ROLE='Slave'
        if ${MYSQL_COMMAND} 'SHOW SLAVE STATUS\G' | egrep 'Slave_.*_Running: Yes$' &>/dev/null ; then
                lag=$(${MYSQL_COMMAND} 'SHOW SLAVE STATUS\G' | egrep 'Seconds_Behind_Master:' | awk {'print $2'})
                if [ $lag -eq 0 ]; then
                        REPLICATION_STATUS="${green}Healthy  "
                else
                        if [ $lag == 'NULL' ]; then
                                REPLICATION_STATUS=${red}Unhealthy
                        else
                                REPLICATION_STATUS="${red}Lagging ${lag}s"
                        fi
                fi
        else
                REPLICATION_STATUS=${red}Unhealthy
        fi

elif [ $MYSQL_READONLY == 'OFF' ]; then
        CURRENT_MYSQL_ROLE='Master'
        SLAVE_HOSTS=$(${MYSQL_COMMAND} 'SHOW SLAVE HOSTS' | awk {'print $1'})
else
        MYSQL_SHOW=0
fi

if [ $TIER == 'Production' ]; then
        TIER=${green}Production
fi

if [ $PREFER_ROLE == $CURRENT_MYSQL_ROLE ]; then
        MYSQL_ROLE=${green}$CURRENT_MYSQL_ROLE
else
        MYSQL_ROLE=${red}$CURRENT_MYSQL_ROLE
fi

echo
echo "HOST INFO"
echo "========="
echo -e "  Hostname       : ${bold}$HOSTNAME${normal} \t Server Uptime  : ${bold}$UPTIME${normal}"
echo -e "  IP Address       : ${bold}$MAIN_IP${normal} \t Tier           : ${bold}$TIER${normal}"
echo
if [ $MYSQL_SHOW -eq 1 ]; then
        echo "MYSQL STATE"
        echo "==========="
        echo -e "  Current role      : ${bold}$MYSQL_ROLE${normal} \t\t Read-only      : ${bold}$MYSQL_READONLY${normal}"
        echo -e "  Preferred role    : ${bold}$PREFER_ROLE${normal} \t\t DB Uptime      : ${bold}$MYSQL_UPTIME${normal}"
        if [ $CURRENT_MYSQL_ROLE == 'Slave' ]; then
                echo -e "  Replication state : ${bold}$REPLICATION_STATUS${normal} \t Current Master : ${bold}$MYSQL_MASTER${normal}"
        else
                echo -e "  Slave Hosts(s) ID : "
                for i in $SLAVE_HOSTS; do
                        echo -e "      - ${bold}$i${normal} \t"; done
        fi
        echo
fi

Kies een van de MySQL-rollen, ofwel een master of een slave op regel 8 of 9 en sla het script op. Dit script vereist het MySQL-optiebestand om de gebruikersreferenties van de database op te slaan, dus we moeten het eerst maken:

$ vim ~/.my.cnf

En voeg de volgende regels toe:

[client]
user=root
password='YourRootP4ssw0rd'

Vervang het wachtwoordgedeelte door het daadwerkelijke MySQL-rootwachtwoord. Pas vervolgens uitvoerbare toestemming toe op het script:

$ chmod 755 ~/.motd.sh

Test het uitvoerbare script of het de juiste uitvoer produceert of niet:

$ ~/.motd.sh

Als de uitvoer er goed uitziet (geen fouten of waarschuwingen), voeg dan het script toe aan ~/.bash_profile zodat het automatisch wordt geladen wanneer een gebruiker inlogt:

$ whoami
root
$ echo '~/.motd.sh' >> ~/.bash_profile

Log opnieuw in op de terminal en je zou zoiets op de master moeten zien:

Als je op de slave bent, zou je zoiets als dit moeten zien:

Merk op dat dit script speciaal is geschreven voor een eenvoudige MySQL/MariaDB- tier-master-slave-replicatie. U moet het script waarschijnlijk aanpassen als u een complexere installatie heeft, of als u andere MySQL-clustertechnologie wilt gebruiken, zoals Galera Cluster, Group Replication of NDB Cluster. Het idee is om de status en informatie van de databaseknooppunten op te halen wanneer we ons hebben aangemeld, zodat we op de hoogte zijn van de huidige status van de databaseserver waaraan we werken.

Sensoren en temperatuur

Dit deel wordt vaak genegeerd door veel SysAdmins. Het bewaken van de temperaturen is cruciaal omdat we niet voor grote verrassingen willen komen te staan ​​als de server zich onverwacht gedraagt ​​bij oververhitting. Een fysieke server bestaat doorgaans uit honderden elektronische onderdelen die in een doos aan elkaar zijn gelijmd en gevoelig zijn voor temperatuurwisselingen. Een defecte koelventilator zou een CPU-temperatuur kunnen doen stijgen om zijn harde limiet te bereiken, wat er uiteindelijk toe leidt dat de CPU-klok wordt vertraagd en de gegevensverwerkingsprestaties als geheel beïnvloeden.

Hiervoor kunnen we het lm-sensoren pakket gebruiken. Om het te installeren, doe je gewoon:

$ yum install lm-sensors # apt-get install lm-sensors for APT

Voer vervolgens het sensors-detect-programma uit om automatisch te bepalen welke kernelmodules u moet laden om lm_sensors het meest effectief te gebruiken:

$ sensors-detect

Beantwoordt alle vragen (accepteer gewoonlijk alle voorgestelde antwoorden). Sommige hosts, zoals virtuele machines of containers, ondersteunen deze module niet. Sensoren moeten echt op hosts (bare-metal) niveau zijn. Bekijk deze lijst voor meer informatie.

Voer vervolgens het commando sensors uit:

$ sensors
i350bb-pci-0203
Adapter: PCI adapter
loc1:         +53.0°C (high = +120.0°C, crit = +110.0°C)

power_meter-acpi-0
Adapter: ACPI interface
power1:        4.29 MW (interval =   1.00 s)

coretemp-isa-0000
Adapter: ISA adapter
Package id 0:  +55.0°C (high = +85.0°C, crit = +95.0°C)
Core 0:        +45.0°C (high = +85.0°C, crit = +95.0°C)
Core 1:        +51.0°C (high = +85.0°C, crit = +95.0°C)
Core 2:        +47.0°C (high = +85.0°C, crit = +95.0°C)
Core 3:        +51.0°C (high = +85.0°C, crit = +95.0°C)
Core 4:        +49.0°C (high = +85.0°C, crit = +95.0°C)
Core 5:        +48.0°C (high = +85.0°C, crit = +95.0°C)
Core 8:        +47.0°C (high = +85.0°C, crit = +95.0°C)
Core 9:        +49.0°C (high = +85.0°C, crit = +95.0°C)
Core 10:       +48.0°C (high = +85.0°C, crit = +95.0°C)
Core 11:       +48.0°C (high = +85.0°C, crit = +95.0°C)
Core 12:       +46.0°C (high = +85.0°C, crit = +95.0°C)
Core 13:       +49.0°C (high = +85.0°C, crit = +95.0°C)

coretemp-isa-0001
Adapter: ISA adapter
Package id 1:  +53.0°C (high = +85.0°C, crit = +95.0°C)
Core 0:        +46.0°C (high = +85.0°C, crit = +95.0°C)
Core 1:        +48.0°C (high = +85.0°C, crit = +95.0°C)
Core 2:        +47.0°C (high = +85.0°C, crit = +95.0°C)
Core 3:        +45.0°C (high = +85.0°C, crit = +95.0°C)
Core 4:        +46.0°C (high = +85.0°C, crit = +95.0°C)
Core 5:        +47.0°C (high = +85.0°C, crit = +95.0°C)
Core 8:        +47.0°C (high = +85.0°C, crit = +95.0°C)
Core 9:        +45.0°C (high = +85.0°C, crit = +95.0°C)
Core 10:       +45.0°C (high = +85.0°C, crit = +95.0°C)
Core 11:       +46.0°C (high = +85.0°C, crit = +95.0°C)
Core 12:       +46.0°C (high = +85.0°C, crit = +95.0°C)
Core 13:       +46.0°C (high = +85.0°C, crit = +95.0°C)

Het bovenstaande resultaat toont de algehele CPU-temperatuur, samen met alle CPU-kernen. Een ander hulpmiddel dat we kunnen gebruiken om de algehele staat van de servercomponenten te zien, is ipmitool. Om te installeren, doe je gewoon:

$ yum -y install ipmitool

Door het volgende commando uit te voeren, kunnen we de algemene toestand van de fysieke componenten in de server bepalen:

$ ipmitool sdr list full
Inlet_Temp       | 20 degrees C   | ok
PCIe_Inlet_Temp  | 37 degrees C   | ok
Outlet_Temp      | 20 degrees C   | ok
CPU0_VR_Temp     | 39 degrees C   | ok
CPU1_VR_Temp     | 41 degrees C   | ok
CPU0_Temp        | 55 degrees C   | ok
CPU1_Temp        | 52 degrees C   | ok
PCH_Temp         | 58 degrees C   | ok
DIMMG0_Temp      | 35 degrees C   | ok
DIMMG1_Temp      | 32 degrees C   | ok
PSU0_Temp        | 0 degrees C    | ok
PSU1_Temp        | 0 degrees C    | ok
SYS_3.3V         | 3.30 Volts     | ok
SYS_5V           | 5 Volts        | ok
SYS_12V          | 12.10 Volts    | ok
CPU0_VCORE       | 1.79 Volts     | ok
CPU1_VCORE       | 1.79 Volts     | ok
CPU0_DDR_VDD     | 1.23 Volts     | ok
CPU1_DDR_VDD     | 1.23 Volts     | ok
SYS_FAN1_Speed   | 4018 RPM   | ok
SYS_FAN2_Speed   | 4116 RPM   | ok
SYS_FAN3_Speed   | 4116 RPM   | ok
SYS_FAN4_Speed   | 4116 RPM   | ok
SYS_FAN5_Speed   | 4018 RPM   | ok
SYS_FAN6_Speed   | 4116 RPM   | ok
SYS_FAN7_Speed   | 4018 RPM   | ok
SYS_FAN8_Speed   | 4116 RPM   | ok
SYS_FAN9_Speed   | 4018 RPM   | ok
SYS_FAN10_Speed  | 4116 RPM   | ok
SYS_FAN11_Speed  | 4116 RPM   | ok
SYS_FAN12_Speed  | 4116 RPM   | ok
SYS_FAN13_Speed  | 4116 RPM   | ok
SYS_FAN14_Speed  | 4214 RPM   | ok
Airflow_rate     | 16 CFM     | ok
PSU1_PIN         | 0 Watts    | ok
PSU2_PIN         | 0 Watts    | ok
PSU1_POUT        | 0 Watts    | ok
PSU2_POUT        | 0 Watts    | ok
PSU1_IIN         | 0 Amps     | ok
PSU2_IIN         | 0 Amps     | ok
PSU1_VIN         | 0 Volts    | ok
PSU2_VIN         | 0 Volts    | ok
CPU_Power        | 63 Watts   | ok
MEM_Power        | 8 Watts    | ok
Total_Power      | 0 Watts    | ok
BP_Power         | 8 Watts    | ok
FAN_Power        | 6 Watts    | ok
MB_Power         | 0 Watts    | ok

De lijst is lang, maar spreekt voor zich en u zou de algemene toestand van de servercomponenten moeten kunnen overzien. Er kunnen gevallen zijn waarin sommige ventilatoren niet op volle snelheid draaien, waardoor de CPU-temperatuur stijgt. Het kan nodig zijn om hardware te vervangen om het probleem op te lossen.

Merk op dat de Intelligent Platform Management Interface (IPMI)-kernelmodule vereist dat de Baseboard Management Controller (BMC) op het moederbord is ingeschakeld. Gebruik dmesg om te controleren of het beschikbaar is:

$ dmesg | grep -i bmc
[    8.063470] ipmi_si IPI0001:00: Found new BMC (man_id: 0x000000, prod_id: 0x02f3, dev_id: 0x20)

Controleer anders de BIOS-instelling van de server als deze controller is uitgeschakeld.

Dat is het voor nu. Deel twee van deze blogserie behandelt de overige 5 onderwerpen, zoals configuratie van back-uptools, stresstests en serververgrendeling.


  1. Tel het aantal opeenvolgende voorkomen van waarden in tabel

  2. Wat is het voordeel van het gebruik van SET XACT_ABORT ON in een opgeslagen procedure?

  3. Welk SqlDbType verwijst naar varBinary(max)?

  4. Kon de database niet openen in lees-/schrijfmodus