Use Docker para construir un clúster de MySQL con un maestro y un esclavo. Se usa la imagen MySQL de la versión 8. Si no es la versión 8, algunos comandos de este artículo no serán válidos y el sistema host será arbitrario. Un maestro-un-esclavo es lo mismo que el proceso de un maestro-esclavo múltiple, excepto que hay algunos contenedores más y necesita conectarse al maestro varias veces
planificación
puerto | Role |
---|---|
3307 | maestro |
3308 | esclavo |
tren de pensamiento
preparar de antemano
Asegúrese de que el host de Linux tenga Docker instalado. Luego, descargue la imagen de MySQL al local, primero puede ir a Docker Hub para encontrar la versión correspondiente, luego copiar el comando de descarga de la versión correspondiente en la máquina host y finalmente esperar a que se complete la descarga.
Construcción externa
-
Obtener el archivo de configuración de MySQL
Puede iniciar un contenedor de MySQL a voluntad y luego copiar el contenido del directorio /etc a la máquina host, que es fácil de modificar.
Por ejemplo: Cree una carpeta en el directorio de inicioetc3307/
y luego use el comandodocker cp MySQL容器Id/etc/ ~/etc3007/
En este momento , habrá información del archivo de configuración de MySQL en este directorio. -
Modificar el archivo de configuración de MySQL
- Copie el archivo de configuración:
etc3307
copie el directoriocp -r ~etc3307/ ~/etc3308/
, y luego habrá dos directorios debajo del directorio de inicio,ect3307
el archivo de configuración debajo del directorio se usa como la configuración del maestro, yetc3308
el directorio se usa como la configuración debajo del esclavo - Use vim para modificar la configuración en los dos directorios
my.cnf
y[mysqld]
agregue el siguiente contenido debajo de ¡Observe la diferencia!#[必须]从服务器唯一ID 数字任意,各个主机间id不能相同!!! server-id=1 #[可选] 0(默认)表示读写(主机),1表示只读(从机) read-only=0
- Copie el archivo de configuración:
-
Inicie el contenedor, monte el directorio del host
e inicie el host 3307
docker run --name mysql-master --privileged=true -v ~/etc3307/:/etc/ -p 3307:3306 -e MYSQL_ROOT_PASSWORD=你的主机密码 -d 镜像id
enciende la esclava 3308
docker run --name mysql-slave --privileged=true -v ~/etc3308/:/etc/ -p 3308:3306 -e MYSQL_ROOT_PASSWORD=你的从机密码 -d 镜像id
- Cree una red para que los dos contenedores puedan acceder entre sí. Nota: El puerto de acceso entre contenedores es el 3306
- Crear una red
docker network inspect my-bridge
(my-bridge es un nombre personalizado) - Agregar el contenedor a la red
docker network connect my-bridge mysql-slave
significadocker network connect my-bridge mysql-master
agregar el esclavo a la red y el host a la red. El formato del comando esdocker network connect 网络名 容器名
- Use el comando
docker network inspect my-bridge
para verificar si la unión es exitosa
En este punto, se ha construido el entorno externo. Actualmente, los dos servidores MySQL pueden ejecutarse de forma independiente y los contenedores pueden acceder entre sí. La identificación del servidor en el archivo de configuración es diferente.
configuración interna
Establecer una relación maestro-esclavo entre dos servicios SQL
- Conecte dos servidores MySQL (preste atención al firewall) Por supuesto,
docker exec -it 容器id /bin/bash
también puede usar la línea de comando para conectarse a los contenedores respectivos.
Configuración del host 3307 :
--执行以下命令
-- 创建一个专门用来在从服务器使用从而复制主服务器数据的用户
CREATE USER '用户名'@'%' IDENTIFIED WITH mysql_native_password BY '用户密码';
-- 为此用户授予REPLICATION权限
GRANT REPLICATION SLAVE ON *.* TO '此用户名'@'%';
-- 刷新
flush privileges;
Luego verifique el estado actual de su registro binlog show master status;
y recuerde el archivo que se copiará y la posición inicial
Configuración del esclavo 3308 :
1.
--执行以下命令
CHANGE REPLICATION SOURCE TO SOURCE_HOST='mysql-master', SOURCE_USER='用户名', SOURCE_PASSWORD='次用户密码', SOURCE_LOG_FILE='上面要记住的主机日志文件 binlog.000003', SOURCE_LOG_POS=上面要记住的起始位置335;
-- 开启从模式,连接主机master
start replica ;
- Verifique el estado de la conexión (si la configuración es exitosa)
show replica status ;
Si hay un problema, puede usardocker logs 容器id
el mensaje de error de registro correspondiente para saber dónde está el error.
Ahora que la configuración está completa, cualquier operación de escritura en el maestro se sincronizará inmediatamente con el esclavo
Aviso:
- Si el esclavo no está configurado en solo lectura, el esclavo aún puede escribir, pero la escritura del maestro se sincronizará con el esclavo y la escritura del esclavo no sincronizará con el maestro.
- Una vez que el host está inactivo, todo el clúster maestro-esclavo no podrá escribir. No existe un clúster maestro-esclavo de Redis que pueda monitorearse de manera similar al mecanismo centinela, y el maestro se bloquea sobre el esclavo. Un solo maestro y varios esclavos no pueden lograr una alta disponibilidad.
- Si desea lograr una alta disponibilidad, puede configurar un clúster multimaestro y multiesclavo. El maestro escribirá datos entre sí y los datos se transferirán entre el maestro y el esclavo. Cuando un maestro está inactivo, los otros maestros y sus esclavos aún pueden funcionar normalmente.
- Si desea operar el clúster, esta situación nativa es perceptible. Por ejemplo: quiero escribir datos en el maestro y leer datos del esclavo, es decir, leer y escribir la separación, por lo que tengo que cambiar manualmente la base de datos durante la operación, así como a nivel de código. Si queremos lograr el desconocimiento, necesitamos una
反向代理
herramienta que pueda hacerlo, solo operamos una base de datos, y este código nos ayuda a usar el servidor correspondiente. Por lo tanto, los clústeres generalmente deben usarse con herramientasMyCat
comoShardingSphere
.