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

相关文章

Spring Boot整合Redis注解实现增删改查功能(Redis注解使用)

《SpringBoot整合Redis注解实现增删改查功能(Redis注解使用)》文章介绍了如何使用SpringBoot整合Redis注解实现增删改查功能,包括配置、实体类、Repository、Se... 目录配置Redis连接定义实体类创建Repository接口增删改查操作示例插入数据查询数据删除数据更

Mysql数据库聚簇索引与非聚簇索引举例详解

《Mysql数据库聚簇索引与非聚簇索引举例详解》在MySQL中聚簇索引和非聚簇索引是两种常见的索引结构,它们的主要区别在于数据的存储方式和索引的组织方式,:本文主要介绍Mysql数据库聚簇索引与非... 目录前言一、核心概念与本质区别二、聚簇索引(Clustered Index)1. 实现原理(以 Inno

sqlserver、mysql、oracle、pgsql、sqlite五大关系数据库的对象名称和转义字符

《sqlserver、mysql、oracle、pgsql、sqlite五大关系数据库的对象名称和转义字符》:本文主要介绍sqlserver、mysql、oracle、pgsql、sqlite五大... 目录一、转义符1.1 oracle1.2 sqlserver1.3 PostgreSQL1.4 SQLi

Java Lettuce 客户端入门到生产的实现步骤

《JavaLettuce客户端入门到生产的实现步骤》本文主要介绍了JavaLettuce客户端入门到生产的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目录1 安装依赖MavenGradle2 最小化连接示例3 核心特性速览4 生产环境配置建议5 常见问题

linux ssh如何实现增加访问端口

《linuxssh如何实现增加访问端口》Linux中SSH默认使用22端口,为了增强安全性或满足特定需求,可以通过修改SSH配置来增加或更改SSH访问端口,具体步骤包括修改SSH配置文件、增加或修改... 目录1. 修改 SSH 配置文件2. 增加或修改端口3. 保存并退出编辑器4. 更新防火墙规则使用uf

Java 的ArrayList集合底层实现与最佳实践

《Java的ArrayList集合底层实现与最佳实践》本文主要介绍了Java的ArrayList集合类的核心概念、底层实现、关键成员变量、初始化机制、容量演变、扩容机制、性能分析、核心方法源码解析、... 目录1. 核心概念与底层实现1.1 ArrayList 的本质1.1.1 底层数据结构JDK 1.7

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代