Cree un clúster MySQL de replicación maestro-esclavo semisincrónico basado en keepalived + GTID

Tabla de contenido

Servidores necesarios para el proyecto.

La dirección IP del servidor requerido para el proyecto.

Diagrama de arquitectura del proyecto.

Pasos del proyecto:

1. Configure 4 servidores de bases de datos MySQL, instale el sistema MySQL e instale el complemento de semisincronización

Instalación con un clic del script mysql en el sistema Linux:

Habilite el registro binario en el servidor

Configurar la semisincronización en el maestro.

Configurar semisincronización en el servidor esclavo

2. Configurar el servidor ansible

Instalar ansible

Edite la configuración y cree una lista de hosts:

Deje que ansible establezca un canal libre de secretos entre todos los servidores de nodos MySQL

Copie el registro binario del maestro al local y transfiéralo a cada esclavo después de obtener los datos básicos.

3. Habilite la función GTID e inicie la replicación maestro-esclavo

Agregue configuración en los archivos de configuración de esclavo y maestro:

Cree un nuevo usuario autorizado en el maestro para copiar el registro binario al esclavo

Configurar la información del maestro en el esclavo

4. Configure un servidor de respaldo retrasado para leer archivos binarios desde MySQL-slave1

5. Utilice rsync + sersync para lograr la sincronización de archivos en tiempo real y sincronizar de forma remota los datos del maestro con el servidor ansible (equivalente a un servidor de respaldo externo)

Configure rsync en el servidor ansible de respaldo. rsync en el servidor de respaldo es un demonio que escucha en el puerto 873.

Configurar rsync en el servidor de origen de datos

Instale la herramienta sersync para activar rsync en tiempo real para la sincronización (instalada en el servidor de origen de datos)

Escriba un script de respaldo en el maestro y configure tareas programadas para el respaldo programado

6. Instale e implemente el software middleware mysqlrouter para lograr la separación de lectura y escritura.

1. Descargue el enrutador mysql

2. Transfiera de forma remota el archivo rpm descargado a la máquina virtual y luego instálelo directamente

3. Modifique el archivo de configuración /etc/mysqlrouter.conf

7. Instale keepalived para lograr alta disponibilidad y configure 2 instancias vrrp para lograr la función de alta disponibilidad de VIP dual

1. Modifique el archivo de configuración de la máquina mysqlrouter

2. Instalar keepalived

3. Modificar el archivo de configuración

4. Comprueba si aparece vip

8. Utilice la herramienta de prueba de estrés sysbench para probar el rendimiento de todo el clúster MySQL.

 1. Instale sysbench en la máquina cliente

2. Utilice la biblioteca del maestro para realizar pruebas.

3. Construya tablas de prueba y datos de prueba. 

4. Pruebe el rendimiento de lectura y escritura de la base de datos

5. Después de completar la prueba de estrés, borre los datos.

9. Cree un sistema de monitoreo basado en prometheus + grafana para monitorear el clúster de bases de datos.

1. Instale e implemente el componente mysqld_exporter

descargar

Cargue el paquete de software mysqld_exporter en cada nodo mysql

Descomprímelo simultáneamente en cada servidor mysql y muévelo al directorio /usr/local/mysqld_exporter

Editar archivo de configuración

Agregue el comando mysqld_exporter a la variable de entorno y configure el inicio en segundo plano

2. Instalar e implementar Prometheus

Cargue el paquete de instalación, descomprímalo y muévalo a /prometheus

Configurar prometheus como un servicio de servicio

Visite la página de servicio de Prometheus

Agregue el nodo Prometheus y actualice el servicio

Visite la página del servicio Prometheus para verificar si el nodo se agregó correctamente.

3. Instalar grafana

Cargue el paquete de instalación de grafana e instálelo

Iniciar grafana

Visita grafana

Agregar fuente de datos prometheus en grafana

Agregar plantilla de paneles (use 14057: buen efecto de representación de imagen)

visualización del efecto grafana


Servidores necesarios para el proyecto.

4 servidores MySQL: configure un clúster de replicación maestro-esclavo, un servidor maestro (MySQL-master), dos servidores esclavos (MySQL-slave1, MySQL-slave2) y un servidor de respaldo retrasado (delay-backup): realice operaciones de respaldo en Ejecutado dentro de un cierto retraso para resolver el impacto de la copia de seguridad en el rendimiento del servidor de la base de datos de origen.

2 servidores mysqlrouter: instale el software keepalived para lograr un servicio de separación de lectura y escritura de alta disponibilidad

1 servidor de control central ansible: realiza la gestión por lotes de servidores en todo el clúster MySQL

La dirección IP del servidor requerido para el proyecto.

mysql-master 192.168.15.159

mysql-esclavo-1 192.168.15.157

mysql-esclavo-2 192.168.15.160

respaldo retrasado 192.168.15.161

máquina de control central ansible 192.168.15.162

enrutador mysql-1 192.168.15.169 vip: 192.168.15.200

enrutador mysql-2 192.168.15.170 vip: 192.168.15.210

Diagrama de arquitectura del proyecto.

Pasos del proyecto:

1. Configure 4 servidores de bases de datos MySQL, instale el sistema MySQL e instale el complemento de semisincronización

Descargue el paquete de instalación binaria de mysql del mysql oficial: mysql-5.7.41-linux-glibc2.12-x86_64.tar.gz

Instalación con un clic del script mysql en el sistema Linux:

#解决软件的依赖关系并且安装需要的工具
yum  install cmake ncurses-devel gcc  gcc-c++  vim  lsof bzip2 openssl-devel ncurses-compat-libs net-tools -y

#解压mysql二进制安装包
tar xf mysql-5.7.41-linux-glibc2.12-x86_64.tar.gz

#移动mysql解压后的文件到/usr/local下改名叫mysql
#/usr/local/mysql是mysql的安装目录
mv mysql-5.7.41-linux-glibc2.12-x86_64 /usr/local/mysql

#新建组和用户 mysql
groupadd mysql
#mysql这个用户的shell是/bin/false 属于mysql组,-r表示为系统用户
useradd -r -g mysql -s /bin/false mysql

#关闭firewalld防火墙服务,并且设置开机不要启动
service firewalld stop
systemctl  disable  firewalld

#临时关闭selinux
setenforce 0
#永久关闭selinux
sed -i '/^SELINUX=/ s/enforcing/disabled/'  /etc/selinux/config

#新建存放数据的目录
mkdir /data/mysql -p

#修改/data/mysql目录的权限归mysql用户和mysql组所有,这样mysql用户启动的mysql进程可以对这个文件夹进行读写了
chown mysql:mysql /data/mysql/
#只是允许mysql这个用户和mysql组可以访问,其他人都不能访问
chmod 750 /data/mysql/

#进入/usr/local/mysql/bin目录
cd /usr/local/mysql/bin/

#初始化mysql
./mysqld  --initialize --user=mysql --basedir=/usr/local/mysql/  --datadir=/data/mysql 

#让mysql支持ssl方式登录的设置
./mysql_ssl_rsa_setup --datadir=/data/mysql/

#修改PATH变量,加入mysql bin目录的路径
#临时修改PATH变量的值
export PATH=/usr/local/mysql/bin/:$PATH
#重新启动linux系统后也生效,永久修改
echo  'PATH=/usr/local/mysql/bin:$PATH' >>/root/.bashrc

#复制support-files里的mysql.server文件到/etc/init.d/目录下叫mysqld
cp  ../support-files/mysql.server   /etc/init.d/mysqld

#修改/etc/init.d/mysqld脚本文件里的datadir目录的值
sed  -i '70c  datadir=/data/mysql'  /etc/init.d/mysqld

#生成/etc/my.cnf配置文件
cat  >/etc/my.cnf  <<EOF
[mysqld_safe]

[client]
socket=/data/mysql/mysql.sock

[mysqld]
socket=/data/mysql/mysql.sock
port = 3306
open_files_limit = 8192
innodb_buffer_pool_size = 512M
character-set-server=utf8

[mysql]
auto-rehash
prompt=\\u@\\d \\R:\\m  mysql>
EOF

#临时修改:修改内核的open file(允许1个进程打开的文件)的数量 默认情况下是1024
ulimit -n 1000000
#永久修改:设置开机启动的时候也配置生效
echo "ulimit -n 1000000" >>/etc/rc.local
chmod +x /etc/rc.d/rc.local

#老式的设置mysql服务开机启动
#将mysqld添加到linux系统里服务管理名单里
/sbin/chkconfig --add mysqld
#设置mysqld服务开机启动
/sbin/chkconfig mysqld on

#启动mysqld进程
service mysqld start

#初次修改密码-p后面接的是系统自动生成的临时密码
#初次修改密码需要使用--connect-expired-password 选项
#-e 后面接的表示是在mysql里需要执行命令  execute 执行
#set password='Sanchuang123#';  修改root用户的密码为Sanchuang123#
mysql -uroot -p'FJjh7(li2sdu#' --connect-expired-password   -e  "set password='Sanchuang123#';"

#检验上一步修改密码是否成功,如果有输出能看到mysql里的数据库,说明成功。
mysql -uroot -p'Sanchuang123#'  -e "show databases;"

Habilite el registro binario en el servidor

Agregue la siguiente configuración al archivo de configuración:

log_bin
server_id = 1 	#服务器的编号

Configurar la semisincronización en el maestro.

root@(none) 20:04  mysql>install plugin rpl_semi_sync_master soname 'semisync_master.so';
root@(none) 20:07  mysql>set global rpl_semi_sync_master_timeout = 1; 	#临时修改变量
root@(none) 20:10  mysql>set global rpl_semi_sync_master_enabled = 1;

Modificar archivo de configuración

[root@sumeng-master ~]# vim /etc/my.cnf
[mysqld]
...
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000  #1 second 超时时间设置为1s

Actualice el servicio mysqld del maestro después de modificar el archivo de configuración

[root@sumeng-master ~]# service mysqld restart
Shutting down MySQL............. SUCCESS! 
Starting MySQL.. SUCCESS!

Configurar semisincronización en el servidor esclavo

root@(none) 20:06  mysql>install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
root@(none) 20:16  mysql> set global rpl_semi_sync_slave_enabled=1;

Modificar el archivo de configuración en el servidor esclavo.

[root@sumeng-slave ~]# vim /etc/my.cnf
[mysqld]
...
rpl_semi_sync_slave_enabled=1

Actualizar el servicio mysqld en el esclavo

[root@sumeng-slave ~]# service mysqld restart
Shutting down MySQL.. SUCCESS! 
Starting MySQL.. SUCCESS!

2. Configurar el servidor ansible

Instalar ansible

[root@localhost ~]# yum install epel-release -y
[root@localhost ~]# yum install ansible -y

Edite la configuración y cree una lista de hosts:

IP del servidor maestro: 192.168.15.159

IP del servidor esclavo: 192.168.15.157, 192.168.15.160, 192.168.15.161

[root@localhost ~]# vim /etc/ansible/hosts
[db]
192.168.15.159
192.168.15.157
192.168.15.160
192.168.15.161
[dbslaves]
192.168.15.161
192.168.15.157
192.168.15.160

Deje que ansible establezca un canal libre de secretos entre todos los servidores de nodos MySQL

[root@localhost ~]# ssh-keygen -t rsa 	#生成秘钥
[root@localhost ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected] 	#将本地生成的ssh公钥信息复制到远程主机上
[root@localhost ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
[root@localhost ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
[root@localhost ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]

Pruebe a su vez si el canal sin contraseña se ha establecido correctamente

[root@localhost ~]# ssh '[email protected]'
[root@localhost ~]# ssh '[email protected]'
[root@localhost ~]# ssh '[email protected]'
[root@localhost ~]# ssh '[email protected]'

Copie el registro binario del maestro al local y transfiéralo a cada esclavo después de obtener los datos básicos.

[root@localhost ~]# scp [email protected]:/root/all_db.SQL .
[root@localhost ~]# ansible -m copy -a "src=/root/all_db.SQL dest=/root" dbslaves

Importar datos básicos en todas las máquinas esclavas.

mysql -uroot -p'Sanchuang123#' <all_db.SQL

3. Habilite la función GTID e inicie la replicación maestro-esclavo

Agregue configuración en los archivos de configuración de esclavo y maestro:

gtid-mode=ON 	#开启GTID功能
enforce-gtid-consistency=ON

Cree un nuevo usuario autorizado en el maestro para copiar el registro binario al esclavo

grant replication slave on *.* to 'zhouzhou'@'192.168.15.%' identified by 'Sanchuang123#';

Configurar la información del maestro en el esclavo

Para evitar que el ambiente sea impuro, realice las siguientes operaciones antes de iniciar el esclavo:

root@(none) 16:32  mysql>reset master;
Query OK, 0 rows affected (0.01 sec)

root@(none) 16:39  mysql>show master status;
+--------------------------+----------+--------------+------------------+-------------------+
| File                     | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+--------------------------+----------+--------------+------------------+-------------------+
| sumeng-master-bin.000001 |      154 |              |                  |                   |
+--------------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

root@(none) 16:39  mysql>stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

root@(none) 16:40  mysql>reset slave all;
Query OK, 0 rows affected (0.01 sec)

Configurar información maestra en esclavos

root@(none) 16:47  mysql>CHANGE MASTER TO MASTER_HOST='192.168.15.159',
    -> MASTER_USER='zhouzhou',
    -> MASTER_PASSWORD='Sanchuang123#',
    -> MASTER_PORT=3306,
    -> MASTER_AUTO_POSITION=1;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

root@(none) 16:47  mysql>start slave;
Query OK, 0 rows affected (0.01 sec)

Compruebe si el esclavo está configurado correctamente. Tanto Slave_IO_Running como Slave_SQL_Running son sí, lo que indica que tanto el subproceso IO como el subproceso SQL están iniciados.

root@(none) 16:57  mysql>show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.15.159
                  Master_User: zhouzhou
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: sumeng-master-bin.000002
          Read_Master_Log_Pos: 154
               Relay_Log_File: localhost-relay-bin.000002
                Relay_Log_Pos: 383
        Relay_Master_Log_File: sumeng-master-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 154
              Relay_Log_Space: 594
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
                  Master_UUID: b53f58ce-2a25-11ee-b708-000c29cf54b0
             Master_Info_File: /data/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 1
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

Posibles problemas durante la configuración: El subproceso io del esclavo no puede iniciarse. La razón es que el número GTID en el esclavo es mayor que el del maestro. Esto significa que los datos en el esclavo son más nuevos que los del maestro, lo que provoca que el subproceso io falla al iniciar Éxito, la solución es borrar la información del maestro y guardar la información de todos los esclavos, y luego reconfigurar e iniciar.

4. Configure un servidor de respaldo retrasado para leer archivos binarios desde MySQL-slave1

root@(none) 16:54  mysql>stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

root@(none) 17:10  mysql>reset master;
Query OK, 0 rows affected (0.01 sec)

root@(none) 17:10  mysql>reset slave all;
Query OK, 0 rows affected (0.01 sec)

root@(none) 17:10  mysql>CHANGE MASTER TO MASTER_HOST='192.168.15.157',
    -> MASTER_USER='zhouzhou',
    -> MASTER_PASSWORD='Sanchuang123#',
    -> MASTER_PORT=3306,
    -> MASTER_AUTO_POSITION=1;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

root@(none) 17:10  mysql>change master to master_delay = 10;
Query OK, 0 rows affected (0.01 sec)

root@(none) 17:11  mysql>start slave;
Query OK, 0 rows affected (0.00 sec)

Al configurar la copia de seguridad retrasada, la unidad predeterminada es segundos.

5. Utilice rsync + sersync para lograr la sincronización de archivos en tiempo real y sincronizar de forma remota los datos del maestro con el servidor ansible (equivalente a un servidor de respaldo externo)

Configure rsync en el servidor ansible de respaldo. rsync en el servidor de respaldo es un demonio que escucha en el puerto 873.

1. Apague permanentemente selinux y firewall

[root@localhost ~]# service firewalld stop
Redirecting to /bin/systemctl stop firewalld.service
[root@localhost ~]# setenforce 0     #临时关闭
[root@localhost ~]# vim /etc/selinux/config    #永久关闭,修改SELINUX=disabled
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted 

2. Instale el software del servidor rsync

[root@localhost ~]# yum install rsync xinetd -y

3. Configure rsync para que se inicie en el arranque e inicie el proceso xinetd, el proceso que proporciona servicios de niñera. rsync es el proceso del que se encarga.

[root@localhost ~]# vim /etc/rc.d/rc.local
...
/usr/bin/rsync --daemon --config=/etc/rsyncd.conf
[root@localhost ~]# chmod +x /etc/rc.d/rc.local
[root@localhost ~]# systemctl start xinetd

4. Cree el archivo de configuración rsync.conf

[root@localhost ~]# vim /etc/rsyncd.conf
uid = root
gid = root
use chroot = yes
max connections = 0
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid 
lock file = /var/run/rsync.lock 
secrets file = /etc/rsync.pass  
motd file = /etc/rsyncd.Motd
[back_data]
    path = /backup
    comment = A directory in which data is stored
    ignore errors = yes
    read only = no
    hosts allow = 192.168.15.159

5. Cree un archivo de autenticación de usuario

Agregue usuarios y contraseñas permitidas para la transmisión, formato: nombre de usuario: contraseña, puede configurar varios

[root@localhost ~]# vim /etc/rsync.pass
sumeng:sumeng123456

6. Establecer permisos de archivos: establecer permisos de lectura y escritura del propietario del archivo

[root@localhost ~]# chmod 600 /etc/rsyncd.conf 
[root@localhost ~]# chmod 600 /etc/rsync.pass

7. Inicie rsync y xinetd

[root@localhost ~]# /usr/bin/rsync --daemon --config=/etc/rsyncd.conf
[root@localhost ~]# systemctl start xinetd

8. Verifique el número de puerto que escucha rsync

[root@localhost ~]# netstat -anplut|grep rsync
tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      20313/rsync         
tcp6       0      0 :::873                  :::*                    LISTEN      20313/rsync

Configurar rsync en el servidor de origen de datos

1. Apague permanentemente selinux y firewall

[root@sumeng-master ~]# service firewalld stop
Redirecting to /bin/systemctl stop firewalld.service
[root@sumeng-master ~]# setenforce 0
[root@sumeng-master ~]# vim /etc/selinux/config
...
SELINUX=disabled
...

2. Instale el software del servidor rsync

[root@sumeng-master ~]# yum install rsync xinetd -y
[root@sumeng-master ~]# vim /etc/rc.d/rc.local
...
/usr/bin/rsync --daemon     #添加该行
[root@sumeng-master ~]# chmod +x /etc/rc.d/rc.local
[root@sumeng-master ~]# vim /etc/rsyncd.conf
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
motd file = /etc/rsyncd.Motd
[Sync]
comment = Sync
uid = root
gid = root
port= 873
[root@sumeng-master ~]# systemctl start xinetd

3. Cree un archivo de contraseña de autenticación

[root@sumeng-master ~]# vim /etc/passwd.txt
[root@sumeng-master ~]# cat /etc/passwd.txt 
sumeng123456
[root@sumeng-master ~]# chmod 600 /etc/passwd.txt     #设置文件权限

4. Pruebe la sincronización de datos

Sincronización de datos entre el servidor de origen de datos 192.168.15.159 y el servidor de respaldo 192.168.15.162

[root@sumeng-master ~]# rsync -avH --port=873 --progress --delete /backup [email protected]::back_data --password-file=/etc/passwd.txt

sending incremental file list
backup/

sent 60 bytes  received 16 bytes  152.00 bytes/sec
total size is 0  speedup is 0.00

Nota: Si los servidores de ambos lados no crean un nuevo directorio /backup, se informará un error que provocará la imposibilidad de realizar una copia de seguridad del pasado.

Instale la herramienta sersync para activar rsync en tiempo real para la sincronización (instalada en el servidor de origen de datos)

1. Modifique los parámetros predeterminados de inotify: los parámetros predeterminados del kernel son demasiado pequeños

[root@sumeng-master ~]# sysctl -w fs.inotify.max_queued_events="99999999"
fs.inotify.max_queued_events = 99999999
[root@sumeng-master ~]# sysctl -w fs.inotify.max_user_watches="99999999"
fs.inotify.max_user_watches = 99999999
[root@sumeng-master ~]# sysctl -w fs.inotify.max_user_instances="65535"
fs.inotify.max_user_instances = 65535
[root@sumeng-master ~]# vim /etc/sysctl.conf    #永久修改参数
fs.inotify.max_queued_events=99999999
fs.inotify.max_user_watches=99999999
fs.inotify.max_user_instances=65535

2. Instale sersync

#wget用于从指定网址下载网络文件
[root@sumeng-master ~]# wget http://down.whsir.com/downloads/sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@sumeng-master ~]# tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@sumeng-master ~]# mv GNU-Linux-x86/ /usr/local/sersync

3. Crea rsync

[root@sumeng-master ~]# cd /usr/local/sersync/
[root@sumeng-master sersync]# cp confxml.xml confxml.xml-bak    #备份配置文件,防止修改出错,便于还原
[root@sumeng-master sersync]# cp confxml.xml data_configxml.xml     #复制用于同步data目录的文件,data_configxml.xml是后面需要使用的配置文件

4. Modifique el archivo de configuración data_configxml.xml

[root@sumeng-master sersync]# vim data_configxml.xml
<sersync>
        <localpath watch="/backup">
            <remote ip="192.168.15.162" name="back_data"/>
            <!--<remote ip="192.168.8.39" name="tongbu"/>-->
            <!--<remote ip="192.168.8.40" name="tongbu"/>-->
        </localpath>
        <rsync>
            <commonParams params="-artuz"/>
            <auth start="false" users="root" passwordfile="/etc/passwd.txt"/>
            <userDefinedPort start="false" port="874"/><!-- port=874 -->
            <timeout start="false" time="100"/><!-- timeout=100 -->
            <ssh start="false"/>
        </rsync>
        <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
        <crontab start="false" schedule="600"><!--600mins-->
            <crontabfilter start="false">
                <exclude expression="*.php"></exclude>
                <exclude expression="info/*"></exclude>
            </crontabfilter>
        </crontab>
        <plugin start="false" name="command"/>
</sersync>

5. Inicie el servicio

#修改环境变量,可以直接使用文件名执行
[root@sumeng-master sersync]# PATH=/usr/local/sersync:$PATH
[root@sumeng-master sersync]# echo 'PATH=/usr/local/sersync:$PATH' >>/root/.bashrc
[root@sumeng-master sersync]# sersync2 -d -r -o  /usr/local/sersync/data_configxml.xml
set the system param
execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches
execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events
parse the command param
option: -d 	run as a daemon
option: -r 	rsync all the local files to the remote servers before the sersync work
option: -o 	config xml name:  /usr/local/sersync/data_configxml.xml
daemon thread num: 10
parse xml config file
host ip : localhost	host port: 8008
daemon start,sersync run behind the console 
config xml parse success
please set /etc/rsyncd.conf max connections=0 Manually
sersync working thread 12  = 1(primary thread) + 1(fail retry thread) + 10(daemon sub threads) 
Max threads numbers is: 22 = 12(Thread pool nums) + 10(Sub threads)
please according your cpu ,use -n param to adjust the cpu rate
------------------------------------------
rsync the directory recursivly to the remote servers once
working please wait...
execute command: cd /backup && rsync -artuz -R --delete ./ 192.168.15.162::back_data >/dev/null 2>&1 
run the sersync: 
watch path is: /backup

6. Configure la supervisión de sersync para que se ejecute automáticamente al arrancar

[root@sumeng-master sersync]# vim /etc/rc.d/rc.local
...
/usr/local/sersync/sersync2 -d -r -o  /usr/local/sersync/data_configxml.xml    #添加此行

Verificación: vaya al directorio /backup y cree algunos archivos o carpetas nuevos para probar si se pueden ver en el servidor de respaldo.

Escriba un script de respaldo en el maestro y configure tareas programadas para el respaldo programado

[root@sumeng-master backup]# vim backup_alldb.sh
[root@sumeng-master backup]# cat backup_alldb.sh 
#!/bin/bash

mkdir -p /backup
mysqldump -uroot -p"Sanchuang123#" --all-databases --triggers --routines --events >/backup/$(date +%Y%m%d%H%M%S)_all_db.SQL
[root@sumeng-master backup]# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
[root@sumeng-master backup]# crontab -l
30 2 * * * bash /backup/backup_alldb.sh

6. Instale e implemente el software middleware mysqlrouter para lograr la separación de lectura y escritura.

Inicie dos servidores instalados e implementados con el software middleware mysqlrouter para lograr alta disponibilidad.

Separación de lectura y escritura: operaciones como adiciones, eliminaciones, modificaciones y consultas de la base de datos se separarán. Las operaciones de lectura se realizan en el esclavo y se pueden realizar operaciones de lectura y escritura en el maestro, lo que esencialmente desempeña un papel. en el equilibrio de carga.

mysqlrouter es un software de separación de lectura y escritura que MySQL nos proporciona oficialmente. Es un middleware MySQL liviano que solo puede lograr una separación simple de lectura y escritura a través de diferentes puertos. La premisa de mysqlrouter es que el backend implementa el servidor MySQL principal. .

1. Descargue el enrutador mysql

https://dev.mysql.com/get/Downloads/MySQL-Router/mysql-router-community-8.0.23-1.el7.x86_64.rpm

2. Transfiera de forma remota el archivo rpm descargado a la máquina virtual y luego instálelo directamente

[root@mysql-router-1 ~]# rpm -ivh mysql-router-community-8.0.23-1.el7.x86_64.rpm 
警告:mysql-router-community-8.0.23-1.el7.x86_64.rpm: 头V3 DSA/SHA1 Signature, 密钥 ID 5072e1f5: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...
   1:mysql-router-community-8.0.23-1.e################################# [100%]

3. Modifique el archivo de configuración /etc/mysqlrouter.conf

cd /etc/mysqlrouter #Ingrese el directorio donde está almacenado el archivo de configuración

Añade el siguiente código

#read
[routing:slaves]
bind_address = 192.168.15.169:7001
destinations = 192.168.15.157:3306,192.168.15.160:3306
mode = read-only        #只读模式
connect_timeout = 1

#write and read
[routing:masters]
bind_address = 192.168.15.169:7002
destinations = 192.168.15.159:3306
mode = read-write         #可读可写
connect_timeout = 1

4. Inicie el servicio mysqlrouter

[root@mysql-router-1 mysqlrouter]# service mysqlrouter restart
Redirecting to /bin/systemctl restart mysqlrouter.service
[root@mysql-router-1 mysqlrouter]# netstat -anplut|grep mysqlrouter     #检查端口
tcp        0      0 192.168.15.169:7001     0.0.0.0:*               LISTEN      8808/mysqlrouter    
tcp        0      0 192.168.15.169:7002     0.0.0.0:*               LISTEN      8808/mysqlrouter    

5. Cree 2 cuentas de prueba en el maestro, una se puede leer y la otra se puede escribir.

root@(none) 09:56  mysql>grant all on *.* to 'scwrite'@'%' identified by 'Sanchuang123#';
Query OK, 0 rows affected, 1 warning (0.00 sec)

root@(none) 09:56  mysql>grant select on *.* to 'scread'@'%' identified by 'Sanchuang123#';
Query OK, 0 rows affected, 1 warning (0.01 sec)

6. Pruebe el efecto de separación de lectura y escritura en la máquina cliente

#只读用户无法对数据库进行更改
[root@sc-docker ~]# mysql -h 192.168.15.169 -P 7001 -uscread -p"Sanchuang123#"
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 5.7.41-log MySQL Community Server (GPL)

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

scread@(none) 10:30  mysql>create database sumeng;
ERROR 1044 (42000): Access denied for user 'scread'@'%' to database 'sumeng'

[root@sc-docker ~]# mysql -h 192.168.15.169 -P 7002 -uscwrite -p"Sanchuang123#"
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 5.7.41-log MySQL Community Server (GPL)

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

scwrite@(none) 10:35  mysql>create database Tuesday;
Query OK, 1 row affected (0.00 sec)

El punto clave de la separación de lectura y escritura son los permisos de usuario, lo que permite que diferentes usuarios se conecten a diferentes puertos. Al final, aún debe ir al servidor back-end mysql para verificar si hay permisos de lectura y escritura. Solo Mysqlrouter divide la lectura y la escritura, lo que permite que la aplicación se conecte a diferentes puertos

7. Instale keepalived para lograr alta disponibilidad y configure 2 instancias vrrp para lograr la función de alta disponibilidad de VIP dual

Alta disponibilidad de alta disponibilidad: no habrá un único punto de falla. Si uno falla, el otro puede tomar el control. El trabajo no se verá afectado. Hay respaldo.

keepalived es un software de enrutamiento escrito en lenguaje C. Su objetivo principal es proporcionar funciones de equilibrio de carga y alta disponibilidad simples y potentes para sistemas Linux e infraestructura basada en Linux. vip: dirección IP virtual, que estará vinculada a la máquina con alta prioridad

1. Modifique el archivo de configuración de la máquina mysqlrouter

Modifique la configuración de bind_address en el archivo de configuración /etc/mysqlrouter/mysqlrouter.conf de las dos máquinas mysqlrouter a 0.0.0.0: [puerto], para que la máquina pueda vincular VIP. Después de cambiar el archivo de configuración, recuerde actualizar el servicio mysqlrouter

2. Instalar keepalived

[root@mysql-router-1 ~]# yum install keepalived -y

3. Modificar el archivo de configuración

La ruta de almacenamiento del archivo de configuración keepalived es: /etc/keepalived/keepalived.conf

La idea de implementar VIP dual: cree 2 instancias vrrp, 2 VIP y las 2 instancias estén activas y se realicen copias de seguridad entre sí.

El significado de cada configuración en el archivo de configuración:

Configuración del enrutador mysql-1:

[root@mysql-router-1 ~]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
  #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 99
    priority 200
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.15.200
    }
}

vrrp_instance VI_2 {
    state backup
    interface ens33
    virtual_router_id 66
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.15.210
    }
}

Configuración del enrutador mysql-2:

[root@mysql-router-2 ~]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
  #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state backup
    interface ens33
    virtual_router_id 99
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.15.200
    }
}

vrrp_instance VI_2 {
    state MASTER
    interface ens33
    virtual_router_id 66
    priority 200
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.15.210
    }
}

4. Comprueba si aparece vip

mysql-router-1, vip es 192.168.15.200:

[root@mysql-router-1 ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:74:8a:2a brd ff:ff:ff:ff:ff:ff
    inet 192.168.15.169/24 brd 192.168.15.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.15.200/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe74:8a2a/64 scope link 
       valid_lft forever preferred_lft forever

mysql-router-2, vip es 192.168.15.210:

[root@mysql-router-2 ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:f4:23:bc brd ff:ff:ff:ff:ff:ff
    inet 192.168.15.170/24 brd 192.168.15.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.15.210/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fef4:23bc/64 scope link 
       valid_lft forever preferred_lft forever

Al agregar el mismo nombre de dominio correspondiente a 2 VIP en el nombre de dominio dns, puede lograr el equilibrio de carga de dns

8. Utilice la herramienta de prueba de estrés sysbench para probar el rendimiento de todo el clúster MySQL.

 1. Instale sysbench en la máquina cliente

[root@sc-docker ~]# yum install epel-release -y
[root@sc-docker ~]# yum install sysbench -y

2. Utilice la biblioteca del maestro para realizar pruebas.

root@mysql 14:56  mysql>create database test_db;
Query OK, 1 row affected (0.01 sec)

3. Construya tablas de prueba y datos de prueba. 

Cuando utilice un cliente para crear tablas de prueba y probar datos de forma remota, recuerde apagar el firewall para evitar conexiones fallidas.

[root@localhost ~]# sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=192.168.15.200 --mysql-port=7002 --mysql-user=scwrite --mysql-password=Sanchuang123# --mysql-db=test_db --tables=10 --table_size=1000 oltp_read_write prepare
sysbench 1.0.17 (using system LuaJIT 2.0.4)

Initializing worker threads...

Creating table 'sbtest1'...
Creating table 'sbtest10'...
Creating table 'sbtest7'...
Creating table 'sbtest3'...
Creating table 'sbtest4'...
Creating table 'sbtest6'...
Creating table 'sbtest8'...
Creating table 'sbtest5'...
Creating table 'sbtest9'...
Creating table 'sbtest2'...
Inserting 1000 records into 'sbtest4'
Inserting 1000 records into 'sbtest7'
Inserting 1000 records into 'sbtest5'
Inserting 1000 records into 'sbtest10'
Inserting 1000 records into 'sbtest6'
Inserting 1000 records into 'sbtest9'
Inserting 1000 records into 'sbtest8'
Inserting 1000 records into 'sbtest1'
Inserting 1000 records into 'sbtest2'
Inserting 1000 records into 'sbtest3'
Creating a secondary index on 'sbtest8'...
Creating a secondary index on 'sbtest7'...
Creating a secondary index on 'sbtest5'...
Creating a secondary index on 'sbtest4'...
Creating a secondary index on 'sbtest1'...
Creating a secondary index on 'sbtest10'...
Creating a secondary index on 'sbtest9'...
Creating a secondary index on 'sbtest6'...
Creating a secondary index on 'sbtest2'...
Creating a secondary index on 'sbtest3'...

Descripción del parámetro utilizado al construir:

--db-driver=mysql: controlador de base de datos

--time=300: Acceso continuo durante 300 segundos

--threads=10: utilice 10 subprocesos para simular el acceso simultáneo

--report-interval = 1: genera un informe de progreso de la prueba cada segundo, 0 significa que solo genera los resultados del informe final, el valor predeterminado es 0

--mysql-host=192.168.15.200 --mysql-port=7002 --mysql-user=scwrite --mysql-password=Sanchuang123# --mysql-db=test_db: Indica información sobre cómo conectarse a la base de datos.Mysqlrouter está conectado aquí Configuración de la máquina VIP y puerto

--tables=10 --table_size=1000: construya 10 tablas de prueba en la biblioteca de prueba y construya 1000 datos de prueba en cada tabla de prueba. Si los datos de prueba son demasiado grandes, el disco del clúster MySQL puede agotarse y el clúster puede colapsar.

oltp_read_write: indica pruebas de lectura y escritura

preparar: en la etapa de preparación, cree una tabla para probar y complete los datos.

4. Pruebe el rendimiento de lectura y escritura de la base de datos

Cambie la fase de preparación a la fase de ejecución para realizar pruebas de estrés.

Resultados de la prueba por segundo:

[root@localhost ~]# sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=192.168.15.200 --mysql-port=7002 --mysql-user=scwrite --mysql-password=Sanchuang123# --mysql-db=test_db --tables=10 --table_size=1000 oltp_read_write run
sysbench 1.0.17 (using system LuaJIT 2.0.4)

Running the test with following options:
Number of threads: 10
Report intermediate results every 1 second(s)
Initializing random number generator from current time


Initializing worker threads...

Threads started!

[ 1s ] thds: 10 tps: 286.27 qps: 5828.84 (r/w/o: 4095.29/1151.06/582.49) lat (ms,95%): 43.39 err/s: 0.00 reconn/s: 0.00
[ 2s ] thds: 10 tps: 279.17 qps: 5609.51 (r/w/o: 3932.48/1118.69/558.34) lat (ms,95%): 52.89 err/s: 0.00 reconn/s: 0.00
[ 3s ] thds: 10 tps: 234.86 qps: 4661.30 (r/w/o: 3253.11/939.46/468.73) lat (ms,95%): 59.99 err/s: 0.00 reconn/s: 0.00
[ 4s ] thds: 10 tps: 178.46 qps: 3574.26 (r/w/o: 2506.47/710.86/356.93) lat (ms,95%): 68.05 err/s: 0.00 reconn/s: 0.00
[ 5s ] thds: 10 tps: 174.15 qps: 3470.99 (r/w/o: 2425.09/696.60/349.30) lat (ms,95%): 71.83 err/s: 0.00 reconn/s: 0.00
[ 6s ] thds: 10 tps: 164.90 qps: 3334.96 (r/w/o: 2334.57/671.59/328.80) lat (ms,95%): 81.48 err/s: 0.00 reconn/s: 0.00
[ 7s ] thds: 10 tps: 118.21 qps: 2336.07 (r/w/o: 1637.85/461.80/236.41) lat (ms,95%): 112.67 err/s: 0.00 reconn/s: 0.00
[ 8s ] thds: 10 tps: 135.99 qps: 2729.87 (r/w/o: 1914.91/541.97/272.99) lat (ms,95%): 97.55 err/s: 0.00 reconn/s: 0.00
[ 9s ] thds: 10 tps: 156.04 qps: 3147.90 (r/w/o: 2201.63/634.18/312.09) lat (ms,95%): 104.84 err/s: 0.00 reconn/s: 0.00
[ 10s ] thds: 10 tps: 179.90 qps: 3597.09 (r/w/o: 2522.66/713.62/360.81) lat (ms,95%): 69.29 err/s: 1.00 reconn/s: 0.00

Descripción del parámetro del resultado de la prueba:

thds: 10: Indica que hay 10 subprocesos realizando pruebas de estrés

tps: Indica cuántas transacciones se realizan por segundo

qps: Indica cuántas solicitudes se realizan por segundo

(r/w/o: 4095.29/1151.06/582.49): hay 4095,29 solicitudes de lectura por segundo, 1151,06 solicitudes de escritura y 582,49 otras solicitudes. De hecho, la esencia es desmontar las solicitudes qps.

lat (ms,95%): 43,39: indica que el 95% de los retrasos en las solicitudes están por debajo de 43,39 milisegundos

err/s: 0.00 reconn/s: 0.00: Indica que 0 solicitudes fallaron por segundo y 0 reconexiones de red ocurrieron.

Resultados generales de la prueba:

[root@localhost ~]# sysbench --db-driver=mysql --time=60 --threads=10 --mysql-host=192.168.15.200 --mysql-port=7002 --mysql-user=scwrite --mysql-password=Sanchuang123# --mysql-db=test_db --tables=10 --table_size=1000 oltp_read_write run
sysbench 1.0.17 (using system LuaJIT 2.0.4)

Running the test with following options:
Number of threads: 10
Initializing random number generator from current time


Initializing worker threads...

Threads started!

SQL statistics:
    queries performed:
        read:                            126266
        write:                           36073
        other:                           18037
        total:                           180376
    transactions:                        9018   (150.03 per sec.)
    queries:                             180376 (3000.88 per sec.)
    ignored errors:                      1      (0.02 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                          60.1034s
    total number of events:              9018

Latency (ms):
         min:                                   21.10
         avg:                                   66.58
         max:                                  262.32
         95th percentile:                      108.68
         sum:                               600417.67

Threads fairness:
    events (avg/stddev):           901.8000/13.27
    execution time (avg/stddev):   60.0418/0.03

Análisis de resultados de la prueba: 

Estadísticas de declaración de base de datos de estadísticas SQL

Estadísticas generales Según estadísticas completas, se realizaron un total de 9018 ejecuciones y el tiempo de ejecución real fue de 60,1034 s.

Latencia (ms) cuenta el tiempo real de ejecución del hilo, en milisegundos, el tiempo mínimo de ejecución para una sola vez es 21.10ms, el máximo es 262.32ms, el promedio es 66.58ms, el 95% del tiempo de ejecución es 108.68ms, y el tiempo total de ejecución es 600417,67 ms.

La equidad de subprocesos resume las estadísticas de las transacciones de ejecución y el tiempo de ejecución

5. Después de completar la prueba de estrés, borre los datos.

fase de limpieza: eliminar datos de prueba después de la prueba

[root@localhost ~]# sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=192.168.15.200 --mysql-port=7002 --mysql-user=scwrite --mysql-password=Sanchuang123# --mysql-db=test_db --tables=10 --table_size=1000 oltp_read_write cleanup
sysbench 1.0.17 (using system LuaJIT 2.0.4)

Dropping table 'sbtest1'...
Dropping table 'sbtest2'...
Dropping table 'sbtest3'...
Dropping table 'sbtest4'...
Dropping table 'sbtest5'...
Dropping table 'sbtest6'...
Dropping table 'sbtest7'...
Dropping table 'sbtest8'...
Dropping table 'sbtest9'...
Dropping table 'sbtest10'...

9. Cree un sistema de monitoreo basado en prometheus + grafana para monitorear el clúster de bases de datos.

Instale e implemente prometheus+grafana en un nuevo servidor para monitorear el rendimiento de los servidores maestro, esclavo1, esclavo2 y delay_backup.

1. Instale e implemente el componente mysqld_exporter

En la arquitectura Prometheus, el exportador es el componente responsable de recopilar datos y reportar información al servidor Prometheus. mysqld_exporter es una herramienta de monitoreo de bases de datos de uso común.

descargar

Dirección de descarga: https://prometheus.io/download/

Cargue el paquete de software mysqld_exporter en cada nodo mysql

Primero cargue el paquete de software en el servidor ansible y luego distribúyalo a los servidores maestro y esclavo en lotes.

[root@localhost ~]# ls
2_all_db.SQL  3_all_db.SQL  all_db.SQL  anaconda-ks.cfg  mysqld_exporter-0.15.0.linux-amd64.tar.gz
[root@localhost ~]# ansible -m copy -a "src=/root/mysqld_exporter-0.15.0.linux-amd64.tar.gz dest=/root" db
Descomprímelo simultáneamente en cada servidor mysql y muévelo al directorio /usr/local/mysqld_exporter
[root@sumeng-master ~]# tar -zxvf mysqld_exporter-0.15.0.linux-amd64.tar.gz 
mysqld_exporter-0.15.0.linux-amd64/
mysqld_exporter-0.15.0.linux-amd64/mysqld_exporter
mysqld_exporter-0.15.0.linux-amd64/NOTICE
mysqld_exporter-0.15.0.linux-amd64/LICENSE
[root@sumeng-master ~]# mv mysqld_exporter-0.15.0.linux-amd64 /usr/local/mysqld_exporter
[root@sumeng-master ~]# cd /usr/local/mysqld_exporter/
[root@sumeng-master mysqld_exporter]# ls
LICENSE  mysqld_exporter  NOTICE
Editar archivo de configuración

Primero cree un usuario en la base de datos para conectarse a la base de datos local.

root@mysql 10:37  mysql>create user 'sumeng'@'%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)

root@mysql 10:38  mysql>grant all on *.* to 'sumeng'@'%';
Query OK, 0 rows affected (0.00 sec)

Luego vaya a cada servidor para editar el archivo de configuración de forma sincrónica; edítelo en el directorio /usr/local/mysqld_exporter.

[root@sumeng-master mysqld_exporter]# vim my.cnf
[root@sumeng-master mysqld_exporter]# cat my.cnf 
[client]
user=sumeng
password=123456
Agregue el comando mysqld_exporter a la variable de entorno y configure el inicio en segundo plano

Sincronizado en cada servidor mysql

[root@sumeng-master mysqld_exporter]# PATH=/usr/local/mysqld_exporter/:$PATH
[root@sumeng-master mysqld_exporter]# echo "PATH=/usr/local/mysqld_exporter/:$PATH" >>/root/.bashrc
[root@sumeng-master mysqld_exporter]# nohup mysqld_exporter --config.my-cnf=/usr/local/mysqld_exporter/my.cnf &
[1] 5877

Verifique el proceso y el puerto para ver si están abiertos.

[root@sumeng-master mysqld_exporter]# ps aux|grep exporter
root       5877  0.0  0.4 719816  7984 pts/0    Sl   10:48   0:00 mysqld_exporter --config.my-cnf=/usr/local/mysqld_exporter/my.cnf
root       5883  0.0  0.0 112824   984 pts/0    S+   10:50   0:00 grep --color=auto exporter
[root@sumeng-master mysqld_exporter]# netstat -anplut|grep mysqld
tcp6       0      0 :::3306                 :::*                    LISTEN      4501/mysqld         
tcp6       0      0 :::9104                 :::*                    LISTEN      5877/mysqld_exporte 
tcp6       0      0 192.168.15.159:3306     192.168.15.157:44850    ESTABLISHED 4501/mysqld         
tcp6       0      0 192.168.15.159:3306     192.168.15.160:60524    ESTABLISHED 4501/mysqld

Prueba de acceso web: ip + 9140 (número de puerto)

2. Instalar e implementar Prometheus

Cree una nueva máquina virtual e instale e implemente prometheus+grafana en ella

Cargue el paquete de instalación, descomprímalo y muévalo a /prometheus
[root@prometheus_grafana ~]# ls
anaconda-ks.cfg  prometheus-2.43.0.linux-amd64.tar.gz
[root@prometheus_grafana ~]# tar -zvxf prometheus-2.43.0.linux-amd64.tar.gz 
prometheus-2.43.0.linux-amd64/
prometheus-2.43.0.linux-amd64/LICENSE
prometheus-2.43.0.linux-amd64/consoles/
prometheus-2.43.0.linux-amd64/consoles/prometheus.html
prometheus-2.43.0.linux-amd64/consoles/node-disk.html
prometheus-2.43.0.linux-amd64/consoles/node-overview.html
prometheus-2.43.0.linux-amd64/consoles/prometheus-overview.html
prometheus-2.43.0.linux-amd64/consoles/index.html.example
prometheus-2.43.0.linux-amd64/consoles/node-cpu.html
prometheus-2.43.0.linux-amd64/consoles/node.html
prometheus-2.43.0.linux-amd64/prometheus
prometheus-2.43.0.linux-amd64/promtool
prometheus-2.43.0.linux-amd64/NOTICE
prometheus-2.43.0.linux-amd64/console_libraries/
prometheus-2.43.0.linux-amd64/console_libraries/prom.lib
prometheus-2.43.0.linux-amd64/console_libraries/menu.lib
prometheus-2.43.0.linux-amd64/prometheus.yml
[root@prometheus_grafana ~]# mv prometheus-2.43.0.linux-amd64 /prometheus
[root@prometheus_grafana ~]# cd /prometheus/
[root@prometheus_grafana prometheus]# ls
console_libraries  consoles  LICENSE  NOTICE  prometheus  prometheus.yml  promtool
Configurar prometheus como un servicio de servicio
[root@prometheus_grafana prometheus]# vim /usr/lib/systemd/system/prometheus.service
[root@prometheus_grafana prometheus]# cat /usr/lib/systemd/system/prometheus.service 
[Unit]
Description=prometheus
 
[Service]
ExecStart=/prometheus/prometheus --config.file=/prometheus/prometheus.yml
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
 
[Install]
WantedBy=multi-user.target
[root@prometheus_grafana prometheus]# systemctl daemon-reload     #重新加载systemd相关服务
[root@prometheus_grafana prometheus]# service prometheus restart
Redirecting to /bin/systemctl restart prometheus.service
[root@prometheus_grafana prometheus]# ps aux|grep prometheus     #检查prometheus进程是否存在
root      22447  1.0  2.0 798956 38004 ?        Ssl  11:50   0:00 /prometheus/prometheus --config.file=/prometheus/prometheus.yml
root      22456  0.0  0.0 112824   992 pts/1    S+   11:50   0:00 grep --color=auto prometheus
[root@prometheus_grafana prometheus]# netstat -anplut|grep prometheus     #查看端口
tcp6       0      0 :::9090                 :::*                    LISTEN      22447/prometheus    
tcp6       0      0 ::1:58730               ::1:9090                ESTABLISHED 22447/prometheus    
tcp6       0      0 ::1:9090                ::1:58730               ESTABLISHED 22447/prometheus    
Visite la página de servicio de Prometheus

Acceda a ip + número de puerto (9090), puede ver la siguiente página

Agregue el nodo Prometheus y actualice el servicio
[root@prometheus_grafana ~]# cd /prometheus/
[root@prometheus_grafana prometheus]# ls
console_libraries  consoles  LICENSE  NOTICE  prometheus  prometheus.yml  promtool
[root@prometheus_grafana prometheus]# vim prometheus.yml
[root@prometheus_grafana prometheus]# cat prometheus.yml
# my global config
global:
  scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: "prometheus"

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ["localhost:9090"]

 - job_name: "master"
   static_configs:
      - targets: ["192.168.15.159:9104"]
 - job_name: "slave1"
   static_configs:
      - targets: ["192.168.15.157:9104"]
 - job_name: "slave2"
   static_configs:
      - targets: ["192.168.15.160:9104"]
 - job_name: "backup"
   static_configs:
      - targets: ["192.168.15.161:9104"]
[root@prometheus_grafana prometheus]# service prometheus restart
Redirecting to /bin/systemctl restart prometheus.service
Visite la página del servicio Prometheus para verificar si el nodo se agregó correctamente.

3. Instalar grafana

Cargue el paquete de instalación de grafana e instálelo
[root@prometheus_grafana ~]# ls
anaconda-ks.cfg    prometheus-2.43.0.linux-amd64.tar.gz
grafana-enterprise-9.4.7-1.x86_64.rpm
[root@prometheus_grafana ~]# yum install grafana-enterprise-9.4.7-1.x86_64.rpm -y
Iniciar grafana
[root@prometheus_grafana ~]# service grafana-server start
Starting grafana-server (via systemctl):                   [  确定  ]
[root@prometheus_grafana ~]# netstat -anplut|grep grafana     #查看端口
tcp        0      0 192.168.15.178:49718    34.120.177.193:443      ESTABLISHED 23204/grafana       
tcp6       0      0 :::3000                 :::*                    LISTEN      23204/grafana
Visita grafana

La cuenta inicial y la contraseña para acceder a la página son ambas de administrador.

Agregar fuente de datos prometheus en grafana

Agregar plantilla de paneles (use 14057: buen efecto de representación de imagen)

visualización del efecto grafana

Supongo que te gusta

Origin blog.csdn.net/m0_69298614/article/details/132236439
Recomendado
Clasificación