Replicación maestro-esclavo de la base de datos MYSQL
1 Arquitectura de separación de lectura-escritura
1.1 Introducción
Para reducir la presión sobre la base de datos, las dos soluciones más básicas en nuestras mentes son
-
Se construye una capa de almacenamiento en caché entre la aplicación y la base de datos para almacenar los datos de uso común en la caché. Cuando la aplicación lee los datos, primero los obtiene de la caché y luego los obtiene de la base de datos cuando fallan.
- Implemente dos bases de datos con datos consistentes, una para operaciones de escritura [base de datos primaria] y otra para operaciones de lectura [base de datos esclava] para lograr la separación de lectura y escritura de datos.
Lo que quiero presentar ahora es la solución para la separación de lectura y escritura [replicación maestro-esclavo mysql]
Para ello, debemos cumplir con los siguientes requisitos
-
Los datos de la base de datos maestro-esclavo deben ser consistentes
El mecanismo de replicación maestro-esclavo de la base de datos se puede utilizar para lograr la sincronización de datos
-
La operación de escritura de datos es la base de datos principal
Utilice fuentes de datos dinámicas en aplicaciones para conectar solicitudes de datos de escritura a la base de datos principal
-
La operación de lectura de datos es de la base de datos
Utilice fuentes de datos dinámicas en aplicaciones para conectar solicitudes de datos de lectura a la base de datos principal
2 implementación de replicación maestro-esclavo de mysql
2.1 Descripción
Principio de replicación maestro-esclavo:
- Los eventos de actualización (actualización, inserción, eliminación) de la base de datos principal se escriben en binlog
- La biblioteca principal crea un hilo de volcado de binlog y envía el contenido del binlog a la biblioteca esclava
- Comience desde la biblioteca e inicie una conexión para conectarse a la biblioteca principal
- Después de comenzar desde la biblioteca, cree un subproceso de E / S, lea el contenido del binlog de la biblioteca principal y escríbalo en el registro de retransmisión
- Después de comenzar desde la biblioteca, cree un subproceso SQL, lea el contenido del registro de retransmisión, ejecute el evento de actualización de lectura desde la posición Exec_Master_Log_Pos y escriba el contenido de actualización en la base de datos del esclavo. Esta replicación maestro-esclavo de MySQL se implementa mediante el contenedor de Docker , Necesita tener cierta capacidad de operación de la ventana acoplable.
El principio de replicación maestro-esclavo anterior se extrajo de [ https://blog.csdn.net/zai_xia/article/details/90379016 ]
2.2 Implementar la base de datos principal
- Descargar imagen de percona 5.7.23
docker pull percona:5.7.23
-
Espejo de vista
docker images
-
Crear volumen de datos de host mysql
mkdir -p /data/mysql/master //自行定义数据卷存放目录,要与启动docker容器宿主机的数据卷一致 cd /data/mysql/master //进入数据卷目录 mkdir conf data //创建两个目录,conf 用于存放mysql的配置文件,data用于存放mysql的数据 chmod 777 * -R //给目录授权
-
Crear archivo de configuración msyql
cd /data/mysql/master/conf //进入mysql存放配置文件目录 vim my.cnf //创建mysql配置文件
El contenido del archivo de configuración [my.conf]
[mysqld] log-bin=mysql-bin #开启二进制日志 server-id=1 #服务id,在集群内不允许重复 sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO ,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' #解决mysql5.7 版本以上出现 [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and错误
-
Crear contenedor de base de datos principal mysql
docker create --name percona-master -v /data/mysql/master/data:/var/lib/mysql -v /data/mysql/master/conf:/etc/my.cnf.d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root percona:5.7.23//创建主数据库容器 docker ps -a //查看是否创建成功
-v especifica el contenedor de mapeo del host [/ data / mysql / master / data] [/ var / lib / mysql], [/ data / mysql / master / conf] contenedor de mapeo [/etc/my.cnf.d]
-
Inicie el contenedor y vea si se inició correctamente
docker start percona-master //启动mysql-master容器 docker logs -f percona-master //查看mysql-master容器日志
-
Utilice el cliente mysql para autorizar la copia de la base de datos
Utilice Navicat para conectarse a la base de datos principal [Las herramientas las puede seleccionar usted mismo]
]
Ejecutar sentencias SQL para crear usuarios y autorización.
create user 'pango'@'%' identified by 'pango';//创建用户
grant replication slave on *.* to 'pango'@'%'; //授权复制权限给用户
flush privileges;//刷新权限
Ver el estado de la base de datos principal
show master status;
Archivo mysql-bin.000003 y ubicación 741, que son necesarios para sincronizar la base de datos maestra de la base de datos
Ver información de archivos binarios
show global variables like 'binlog%';
2.3 Implementar la base de datos esclava
Los pasos para crear el contenedor de la base de datos esclava son aproximadamente los mismos que los pasos para crear el contenedor de la base de datos maestra, por lo que no tomaré demasiadas notas aquí.
-
Cree un directorio de volumen de datos a partir de la base de datos en el host
mkdir /data/mysql/slave cd /data/mysql/slave mkdir conf data chmod 777 * -R
-
Crear archivo de configuración
cd /data/mysql/slave/conf vim my.cnf
Contenido del archivo de configuración [my.cnf]:
[mysqld] log-bin=mysql-bin #开启二进制日志 server-id=2 #服务id,在集群内不允许重复 sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO ,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' #解决mysql5.7 版本以上出现 [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and错误
-
Crear contenedor de base de datos esclavo
docker create --name percona-slave -v /data/mysql/slave/data:/var/lib/mysql -v /data/mysql/slave/conf:/etc/my.cnf.d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root percona:5.7.23
-
Iniciar el contenedor
docker start percona-slave //启动mysql-slave docker logs -f percona-slave //查看mysql-slave
-
Utilice el cliente para ejecutar la instrucción sql para establecer la configuración de la base de datos principal
CHANGE MASTER TO master_host='localhost', master_user='pango', master_password='pango', master_port=3306, master_log_file='mysql-bin.000003', master_log_pos=741;
-
Iniciar la sincronización desde la base de datos
start slave;
-
Ver el estado de la base de datos
show slave status
-
prueba
Cree una nueva biblioteca o tabla desde la base de datos maestra y verifique si la misma tabla y biblioteca existen en la base de datos esclava. Si existe, significa que la implementación de la replicación maestro-esclavo es exitosa