docker搭建mysql8.0.32,实现主从复制(一主两从)

2023-12-21 12:28

本文主要是介绍docker搭建mysql8.0.32,实现主从复制(一主两从),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        安装docker的步骤、使用命令就不写了,本文章是基于会使用docker、linux基本命令的基础上来写的。

开始步骤:

1. 拉取 mysql 镜像 

docker pull mysql:8.0.32

2. 启动容器并运行mysql

 a. 准备mysql的配置文件(该配置文件是:mysql:8.0.32直接启动后的翻译过后的原始配置文件)

# 关于如何更改设置的建议,请参考
# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html[mysqld]
#
# 去掉前导的 #,并设置用于 MySQL 中最重要的数据缓存的内存量。
# 对于专用服务器,从总内存开始设置为 70%,否则为 10%。
# innodb_buffer_pool_size = 128M
#
# 去掉前导的 # 以启用一个非常重要的数据完整性选项:在备份之间记录
# 二进制日志中的更改。
# log_bin
#
# 去掉前导的 # 以设置主要用于报告服务器的选项。
# 对于事务和快速 SELECT,默认值更快。
# 根据需要调整大小,尝试找到最佳值。
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M# 去掉前导的 # 以恢复到先前的 default_authentication_plugin 值,
# 这将提高与旧客户端的兼容性。有关背景信息,请参阅:
# https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin
# default-authentication-plugin=mysql_native_password
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysqlpid-file=/var/run/mysqld/mysqld.pid[client]
socket=/var/run/mysqld/mysqld.sock!includedir /etc/mysql/conf.d/

重点:将配置文件在计算机本地创建好,后面会用来挂载到docker里的mysql的my.cnf 文件

只需要在本地创建 3个 my.cnf 文件,复制上面的内容 ,再分别在文中任意位置,最好放当中 添加 server_id=100、server_id=101、server_id=102 属性即可(没有顺序,值也可以是1、2、3任意的,不同就行,作用只是标记启动的不同数据库拥有不同的id,如果3个数据库不在一个服务器上就不需要添加这个配置了)。

下面是挂载的内容解释:-- 启动一个mysql将数据挂载到本地目录:/Users/wangqinmin/docker/mysql/master_slave/master_data 
-- 配置文件挂载到,mysql8.0.32的my.cnf文件位置在/etc/my.cnf:/Users/wangqinmin/docker/mysql/master_slave/conf/master_conf/my.cnf:/etc/my.cnf
-- 日志文件挂载到:/Users/wangqinmin/docker/mysql/master_slave/log/master_log:/var/log/mysql
-- SELECT ... INTO OUTFILE 操作导出的文件挂载到:/Users/wangqinmin/docker/mysql/master_slave/file/mysql-files

b.  写好命令,开始执行


docker run --name mysql_master_33066 -v /Users/wangqinmin/docker/mysql/master_slave/data/master_data:/var/lib/mysql -v /Users/wangqinmin/docker/mysql/master_slave/conf/master_conf/my.cnf:/etc/my.cnf -v /Users/wangqinmin/docker/mysql/master_slave/log/master_log:/var/log/mysql -v /Users/wangqinmin/docker/mysql/master_slave/file/mysql-files:/var/lib/mysql-files -p 33066:3306 -e MYSQL_ROOT_PASSWORD=wangqinmin -d mysql:8.0.32docker run --name mysql_slave_33067 -v /Users/wangqinmin/docker/mysql/master_slave/data/slave1_data:/var/lib/mysql -v /Users/wangqinmin/docker/mysql/master_slave/conf/slave1_conf/my.cnf:/etc/my.cnf -v /Users/wangqinmin/docker/mysql/master_slave/log/slave1_log:/var/log/mysql -v /Users/wangqinmin/docker/mysql/master_slave/file/mysql_files_slave1:/var/lib/mysql-files -p 33067:3306 -e MYSQL_ROOT_PASSWORD=wangqinmin -d mysql:8.0.32docker run --name mysql_slave_33068 -v /Users/wangqinmin/docker/mysql/master_slave/data/slave2_data:/var/lib/mysql -v /Users/wangqinmin/docker/mysql/master_slave/conf/slave2_conf/my.cnf:/etc/my.cnf -v /Users/wangqinmin/docker/mysql/master_slave/log/slave2_log:/var/log/mysql -v /Users/wangqinmin/docker/mysql/master_slave/file/mysql_files_slave2:/var/lib/mysql-files -p 33068:3306 -e MYSQL_ROOT_PASSWORD=wangqinmin -d mysql:8.0.32

3. 从上面的挂载目录命名就可以看出,我准备将 33066 作为主数据库,33067和33068做为从数据库

4. 主从复制就是在数据库上做配置的设置(重点在这里,但是很简单,就几条命令

     1. 进入33066主库 docker容器中

docker exec -it mysql_master_33066 /bin/bash

      a. 首先 mysql -uroot -p 进入mysql ,或者用 Navicat 工具连接

      b. 执行以下两条命令:

-- 创建名字为:copy_file_wangqinmin ,密码为:wangqinmin ,访问ip为任意ip的用户
CREATE USER 'copy_file_wangqinmin'@'%' IDENTIFIED BY 'wangqinmin';-- 为名字是 copy_file_wangqinmin 的用户,只设置 REPLICATION SLAVE (复制数据的权限)
GRANT REPLICATION SLAVE ON *.* TO 'copy_file_wangqinmin'@'%';-- mysql8.0.32 需要执行这个命令(搭建完成后,发现没有连接成功,看错误日志后添加的这一段命令)
-- 否则会有错误日志:
-- error connecting to master 'copy_file_wangqinmin@192.168.1.3:33066' - retry-time: 60 retries: 1 message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.
ALTER USER 'copy_file_wangqinmin'@'%' IDENTIFIED WITH 'mysql_native_password' BY 'wangqinmin';-- 刷新权限
FLUSH PRIVILEGES;

        c.  重启主库  docker restart mysql_master_33066

        d. 在主库上执行以下命令,并记下 "File" 和 "Position" 的值: 

SHOW MASTER STATUS;

我这里获取到的数据为:

因为mysql都在docker内部安装,所以容器的本地ip是127.0.0.1,但是本机外部的本地ip也是127.0.0.1,所以需要查询外部电脑的ip地址:

我的ip地址是: 192.168.1.3

     2. 进入33067从库 docker容器中

docker exec -it mysql_slave_33067 /bin/bash

进入mysql中 或者 用 Navicat 工具连接后,分别执行以下3条命令:

-- 停止从库的复制进程。这是为了确保在修改主从配置时,不会有正在运行的复制进程。
STOP SLAVE;-- 指定从库要去主库的哪个位置开始复制数据。
CHANGE MASTER TOMASTER_HOST='192.168.1.3',MASTER_PORT=33066,MASTER_USER='copy_file_wangqinmin',MASTER_PASSWORD='wangqinmin',MASTER_LOG_FILE='binlog.000002',MASTER_LOG_POS=721;-- 启动从库的复制进程,开始从主库复制数据。	
START SLAVE;

     3. 进入33068从库 docker容器中

docker exec -it mysql_slave_33068 /bin/bash

进入mysql中 或者 用 Navicat 工具连接后,分别执行以下3条命令: 

-- 停止从库的复制进程。这是为了确保在修改主从配置时,不会有正在运行的复制进程。
STOP SLAVE;-- 指定从库要去主库的哪个位置开始复制数据。
CHANGE MASTER TOMASTER_HOST='192.168.1.3',MASTER_PORT=33066,MASTER_USER='copy_file_wangqinmin',MASTER_PASSWORD='wangqinmin',MASTER_LOG_FILE='binlog.000002',MASTER_LOG_POS=721;-- 启动从库的复制进程,开始从主库复制数据。	
START SLAVE;

解释:

  • MASTER_HOST='192.168.1.3': 指定主库的 IP 地址。
  • MASTER_PORT=33066: 指定主库的端口号。
  • MASTER_USER='copy_file_wangqinmin': 指定用于连接主库的用户。
  • MASTER_PASSWORD='wangqinmin': 指定主库用户的登录密码。
  • MASTER_LOG_FILE='binlog.000002': 指定主库的二进制日志文件。
  • MASTER_LOG_POS=721: 指定从主库的从哪个二进制日志位置开始复制数据。

最后一步:查看从库的状态,确定从库是否已经连接到主库,是否能够复制文件和sql:

 在从库上执行以下命令:

SHOW SLAVE STATUS;

确保 "Slave_IO_Running" 和 "Slave_SQL_Running" 均为 "Yes"

如果一直没有连接上,可以尝试先重启主库,再重启从库。如果还不行,就看看是不是ip或者是参数填写错误。

或者查看错误日志:

执行命令查看错误日志(这里是我不断调试过程中发现的错误日志):SHOW SLAVE STATUS;  

给大家看一下成功的结果:

这时候向主库 【创建数据库,添加数据,修改数据等等】,导致数据变化的操作。从库都会实时的进行数据变更。

有一点要注意的是,虽然实现了主从复制,但是依然会有延迟,并且可能由于:网络、IO、CPU等因素的影响,最终会导致数据的不一致问题,这个问题不能被完全解决,只能优化,同时某些业务如果要求数据一致的情况下,还是需要直接去读主库。

5. 要完成读写分离的话,我使用 sharding jdbc来完成。让主库完成 (增、删、改的操作),让从库的轮询访问来完成读的操作。

~~未完待续

这篇关于docker搭建mysql8.0.32,实现主从复制(一主两从)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/519988

相关文章

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

MySQL双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要