docker安装mysql 实现主从同步

news/2024/12/14 12:59:07/

1.安装master

1.1.拉取镜像

docker pull mysql:5.7

1.2.修改配置

创建外部存放Mysql的目录,

mkdir /data/mysql

创建配置目录和数据目录

cd /data/mysql
mkdir conf.d
mkdir mysql.conf.d
mkdir log
mkdir data

新建my.cnf配置文件,将该配置文件放到/data/mysql目录。
配置文件内容如下:

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
## 设置server_id,注意要唯一  server-id=101
### 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
server-id=101
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
default-time_zone = '+8:00'
#日志自动过时清理天数
expire_logs_days = 7
#要给从机同步的库
#binlog-do-db=hl
#不给从机同步的库(这里不同步mysql、information_schema、performance_schema、sys库)
#binlog-ignore-db=mysql
#binlog-ignore-db=information_schema
#binlog-ignore-db=performance_schema
#binlog-ignore-db=sys#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0#log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

配置中启动了log-bin这个配置,该配置会让MySQL开启写二进制日志功能,以便于salve读取该日志进行数据同步。binlog-do-db配置用于指定需要同步的库,如果不写,默认为同步全部库。binlog-ignore-db配置用于指定忽略哪些库不同步。请注意server-id这个配置,在进行主从的时候,这个值不能重复,也就是master与slave不用配置相同的server-id。

expire_logs_days这个自动清除日志的天数建议设置小一些,否则在data文件下将会堆积大量的二进制日志文件bin-log。这种文件十分占内存!!!!

1.3.启动容器

此时Master所需的挂载和配置就已经完成,只需要使用命令启动容器即可:

docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=xxxx -m 512M --memory-swap=1024M -v /data/mysql/data:/var/lib/mysql -v /data/mysql/my.cnf:/etc/mysql/my.cnf -v /data/mysql/conf.d:/etc/mysql/conf.d -v /data/mysql/mysql.conf.d:/etc/mysql/mysql.conf.d -d mysql:5.7

参数解释:

参数说明
--name指定容器的别名
-p端口映射,[宿主端口:容器端口],当访问主机的3306端口时,会自动映射到容器里的3306端口
--v容器挂载点,[挂载宿主目录:容器目录],用于容器内部的文件与宿主的文件互通
--e向容器设置环境变量,这里设置MySQL的密码为root

 容器启动完成之后,这时可以用工具连接数据库,连接数据库之后,创建一个账号,用户slave从库同步数据.
执行命令:

CREATE USER 'slave'@'%' IDENTIFIED BY 'xxxx';

然后进行授权,执行命令:

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
FLUSH PRIVILEGES;

参数解释:

参数说明
REPLICATION SLAVE拥有此权限可以查看从服务器,从主服务器读取二进制日志
REPLICATION CLIENT拥有此权限可以查询master server、slave server状态

 使用命令查看master状态:

SHOW MASTER STATUS

参数解释:

参数说明
file指定是当前log-bin日志文件,每次安装可能都不一样
Position数据同步的位置
Binlog-Do_DB要同步数据的数据库,默认为空,表示全部同步
Binlog-Ignore_DB忽略不同步的库,默认为空,表示都不忽略

 master安装到此结束,现在等待slave来连接进行通信,同步数据。

2.安装Slave

安装slave的步骤基本和master一致,只是需要改几个配置
 

2.1.拉取镜像

docker pull mysql:5.7

2.2.修改配置

创建外部存放Mysql的目录,

mkdir /data/mysql

创建配置目录和数据目录

mkdir conf.d
mkdir mysql.conf.d
mkdir log
mkdir data

新建my.cnf配置文件,将该配置文件放到/data/mysql目录。
配置文件内容如下:

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
## 设置server_id,注意要唯一  server-id=102
server-id=102
##关闭 log-bin
#log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
default-time_zone = '+8:00'
#日志自动过时清理天数
expire_logs_days = 7
#要给从机同步的库
#binlog-do-db=hl
#不给从机同步的库(这里不同步mysql、information_schema、performance_schema、sys库)
#binlog-ignore-db=mysql
#binlog-ignore-db=information_schema
#binlog-ignore-db=performance_schema
#binlog-ignore-db=sys#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0#log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

该文件内容与master的几乎一致,只是把log-bin配置关闭,因为slave不需要开启binlog日志,server-id值改为与master不一致的就行.

2.3.启动容器

此时slave所需的挂载和配置就已经完成,只需要使用命令启动容器即可:

docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=xxxx -m 512M --memory-swap=1024M -v /data/mysql/data:/var/lib/mysql -v /data/mysql/my.cnf:/etc/mysql/my.cnf -v /data/mysql/conf.d:/etc/mysql/conf.d -v /data/mysql/mysql.conf.d:/etc/mysql/mysql.conf.d -d mysql:5.7

2.4.创建主从关系

连接到salve数据库库,然后执行命令:

CHANGE MASTER TO master_host = '124.71.8.46', master_user = 'slave', master_password = 'xxxx', master_port = 3306, master_log_file = 'mysql-bin.000001', master_log_pos = 154, master_connect_retry = 30;

参数解释:

参数说明
master_hostmaster主机地址
master_user主从连接的用户名,刚才master创建的
master_password主从连接的密码,刚才master创建的
master_hostmaster的端口
master_log_filemaster的bin-log文件
master_log_posmaster数据同步的位置

 master_log_file和master_log_pos可以在master上输入SHOW MASTER STATUS;指令查询到,这个两个参数必须与master上一致。

 然后执行命令,启动slave功能:

START SLAVE;

查看slave状态,SHOW SLAVE STATUS;

SHOW SLAVE STATUS;

 

看到Slave_IO_State显示Waiting for master to send event表示主从已经建立成功,此时MySQL主从配置到此完毕。

在master新建一个数据库test,刷新slave后发现,slave已经同步完成。代表主从数据同步成功


http://www.ppmy.cn/news/1555018.html

相关文章

游戏引擎学习第39天

开场和欢迎 首先,我们的游戏是从零开始编写的,没有使用任何第三方库或引擎,因此我们从最基础的低层次编码做起。这种方式不仅适合那些对编程有兴趣的开发者,还对教育有很大帮助,因为许多开发者在学习过程中没有机会深…

Jackson将JSON对象转换为字符串

1. 概述 在基于Web的应用程序中,将JSON对象转换为字符串表示是一项常见的任务。 对于Java开发者来说,Jackson库是一个强大的工具,它使JSON处理变得简单。 在这个指南中,我们将使用Jackson库将用户管理系统中的用户对象转换为JS…

【Java Nio Netty】基于TCP的简单Netty自定义协议实现(万字,全篇例子)

基于TCP的简单Netty自定义协议实现(万字,全篇例子) 前言 有一阵子没写博客了,最近在学习Netty写一个实时聊天软件,一个高性能异步事件驱动的网络应用框架,我们常用的SpringBoot一般基于Http协议&#xff0…

数据结构面试题整理

1. 简述什么是数据结构? 数据结构就是一种组织和存储数据的方式,使得我们可以高效地访问和修改数据。就像你整理房间一样,不同的物品有不同的收纳方式,数据也有不同的存储和管理方法。 比如,数组就像一个排成一排的抽…

【PostgreSQL异常解决】PostgreSQL 异常错误: PG::Error 服务意外关闭连接

博主介绍:✌全网粉丝21W+,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物联网、机器学习等设计与开发。 感兴趣的可…

docker的简单基本操作

三个命令如下&#xff1a; docker ps docker run id号(可只输入3位确定) /bin/bashdocker exec -it id号 /bin/bash 功能如下 docker ps&#xff1a;列出正在运行的容器。docker run -it <image> /bin/bash&#xff1a;启动一个新的容器&#xff0c;并进入 Bash s…

Java 反射实战:动态属性处理的艺术 - 图表参数解析器揭秘

场景还原&#xff1a;为什么需要反射&#xff1f; 想象这样一个场景&#xff1a;我们正在开发一个数据可视化系统。系统需要根据用户的不同查询需求&#xff0c;动态地从图表参数对象中提取特定属性。 传统方法的局限性 传统的硬编码方式会导致&#xff1a; 代码重复 扩展性差…

CNCF云原生生态版图-分类指南(三)- 运行时

CNCF云原生生态版图-分类指南&#xff08;三&#xff09;- 运行时 CNCF云原生生态版图-分类指南三、运行时&#xff08;Runtime&#xff09;&#xff08;一&#xff09;云原生存储&#xff08;Cloud Native Storage&#xff09;1. 是什么&#xff1f;2. 解决什么问题&#xff1…