Mysql+docker实现主从复制功能

700 阅读5分钟

今天分享一下我使用docker搭建MySQL主从复制的功能吧。

一、我们需要先安装好docker在虚拟机中

我现在使用的Centos 7 去操作的,安装之前先查看一下有没有安装过吧。
查询docker安装过的包:
#通过这个命令可以查看是否有安装过。 yum list installed | grep docker

二、开始安装docker 现在我们开始安装docker了,运行命令

    sudo yum install docker
    #启动docker容器
    sudo service docker start

等待安装完成就好了 三、在docker中安装MySQL5.7版本 先查看MySQL的镜像有那些
sudo docker search mysql

找到我们需要pull的mysql5.7进行pull
docker pull mysql:5.7
安装完毕,接下来就是运行MySQL容器了,我启动不了太多的虚拟机所以我在一个docker中运行两个MySQL的实例来达到主从复制的功能。 三、正式开始搭建主从复制首先需要运行容器

docker run --name mysql3307 -p 3307:3306 --privileged=true -e MYSQL_ROOT_PASSWORD=root -eMYSQL_DATABASE=ybx -e MYSQL_USER=user -eMYSQL_PASSWORD=pass -v /home/mysql/docker-data/3307/conf:/etc/mysql/conf.d -v /home/mysql/docker-data/3307/data/:/var/lib/mysql -v /home/mysql/docker-data/3307/logs/:/var/log/mysql -d mysql:5.7

-v 代表的是docker容器中的MySQL文件挂载到宿主机的位置(不能是相对路径哦!),如果宿主机没有这个文件夹会自动创建。

docker run --name mysql3308 -p 3308:3306 --privileged=true -e MYSQL_ROOT_PASSWORD=root -eMYSQL_DATABASE=ybx -e MYSQL_USER=user -eMYSQL_PASSWORD=pass -v /home/mysql/docker-data/3308/conf:/etc/mysql/conf.d -v /home/mysql/docker-data/3308/data/:/var/lib/mysql -v /home/mysql/docker-data/3308/logs/:/var/log/mysql -d mysql:5.7

启动两个MySQL所以有两行代码。 运行完成之后通过

docker ps 

查看到都已经启动成功了

接下来使用navicat连接一下
现在都已经连接完了要开始配置主从复制了。 先进入宿主机的目录
/home/mysql/docker-data/3307/conf /home/mysql/docker-data/3308/conf 配置my.cnf如果没有我把文件内容放在下面

# 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
#
# 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
#datadir=/home/mysql/docker-data/3307/data
#socket=/home/mysql/docker-data/3307/mysql.sock

character_set_server=utf8
init_connect='SET NAMES utf8'

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

#log-error=/home/mysql/docker-data/3307/logs/mysqld.log
#pid-file=/home/mysql/docker-data/3307/mysqld.pid
#标识符不能重复 从机需要换一个id
server-id=1283307
#开启复制功能
log-bin=mysql-bin
#这个地方如果是有两台主机就是2如果三台就是3一定要匹配噢,如果主主复制可能会出现id重复
auto_increment_increment=2
#自增从1开始 从机可改为从2开始
auto_increment_offset=1
#忽略大小写
lower_case_table_names=1
#要同步的mstest数据库,要同步多个数据库 现在只同步一个ybx
binlog-do-db=ybx
#要忽略的数据库
binlog-ignore-db=mysql

#rpl_semi_sync_master_enabled=1
#rpl_semi_sync_master_timeout=10000

配置完成后接下来需要重启我的mysql3307和mysql3308容器,并在master主机中创建一个用户添加slave和replication权限

#连接3307mysql配置权限,我的主机是3307
#首先进入mysql容器内部 因为我宿主机是没有安装MySQL的所以才需要进入内部,你们安装了的话之间外部MySQL命令设置ip端口号就好了
docker exec -it mysql3307 bash
#连接MySQL
mysql -uroot -proot
#设置权限
GRANT REPLICATION SLAVE,FILE,REPLICATION CLIENT ON *.* TO 'repluser'@'%' IDENTIFIED BY '123456';
#刷新权限
FLUSH PRIVILEGES;

这是设置成功的图片,接下来因为我在MySQL的命令行输入命令好像出现问题了,接下来关于mysql的操作就在navicat操作了 查看一下master的二进制日志文件 SHOW MASTER STATUS

接下来设置salav机,连接方法跟上述一样,运行下面的语句时一定要设置成你对应的ip,端口号,账号,密码还有偏移量,偏移量是master主机的Postition就是上一张图的Postition字段对应的值,一定别错了。

change master to master_host='192.168.1.128',master_port=3307,master_user='repluser',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=629;

#开启slave,启动SQL和IO线程
start slave;

#查看slave的状态 \G是格式化的意思
show slave status\G

启动slave的SQL和IO线程之后如图会显示为yes

从机通过SHOW PROCESSLIST;查看进程信息,如下图可以明确看到在等待master发送事件和从服务器已读取所有中继日志;等待更多的更新

主机通过SHOW PROCESSLIST;查看进程信息,如下图可以明确看到主机已将binlog日志发送给从机,等待更多的更新操作

至此主从其实已经搭建完成,现在我们可以试试效果,现在我的主机和从机ybx数据库都没有表信息,我们现在创建一个user表

运行下面的建表语句

CREATE TABLE `user`  (
  `id` int NOT NULL,
  `name` varchar(255) NULL,
  PRIMARY KEY (`id`)
);

只在3307数据库创建了user表现在3308也有了哦。 现在宣布这次搭建圆满完成!!!
我是叶不修,一个想进大厂的憨憨程序猿。