码迷,mamicode.com
首页 > 其他好文 > 详细

利用docker搭建主从复制

时间:2021-04-23 11:52:48      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:distrib   顺序   下载   net   注意   成功   mys   mysql目录   mysql   

利用docker搭建主从复制

环境

首先拉取docker镜像,我们这里使用5.7版本的mysql:

docker pull mysql:5.7

然后使用此镜像启动容器,这里需要分别启动主从两个容器

Master(主):

docker run -p 3340:3306 --name master -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

Slave(从):

docker run -p 3341:3306 --name slave -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

Master对外映射的端口是3339,Slave对外映射的端口是3340。因为docker容器是相互独立的,每个容器有其独立的ip,所以不同容器使用相同的端口并不会冲突。这里我们应该尽量使用mysql默认的3306端口,否则可能会出现无法通过ip连接docker容器内mysql的问题。

docker ps 查看

技术图片

mysql环境

1.直接搭建

通过docker exec -it 627a2368c865 /bin/bash命令进入到Master容器内部,也可以通过docker exec -it mysql-master /bin/bash命令进入。627a2368c865是容器的id,而mysql-master是容器的名称。

cd /etc/mysql切换到/etc/mysql目录下,然后vi my.cnf对my.cnf进行编辑。此时会报出bash: vi: command not found,需要我们在docker容器内部自行安装vim。使用apt-get install vim命令安装vim

可能出现问题

Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package vim

执行apt-get update,然后再次执行apt-get install vim即可成功安装vim。然后我们就可以使用vim编辑my.cnf,在my.cnf中添加如下配置:

[mysqld] ## 同一局域网内注意要唯一 server-id=100 ## 开启二进制日志功能,可以随便取(关键) log-bin=mysql-bin

配置完成之后,需要重启mysql服务使配置生效。使用service mysql restart完成重启。重启mysql服务时会使得docker容器停止,我们还需要docker start mysql-master启动容器。

下一步在Master数据库创建数据同步用户,授予用户 slave REPLICATION SLAVE权限和REPLICATION CLIENT权限,用于在主从库之间同步数据。

CREATE USER ‘slave‘@‘%‘ IDENTIFIED BY ‘123456‘;
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO ‘slave‘@‘%‘;
创建远程连接
GRANT ALL PRIVILEGES ON *.* TO ‘root‘@‘8.140.159.229‘ IDENTIFIED BY ‘root‘ WITH GRANT OPTION
配置slave

和配置Master(主)一样,在Slave配置文件my.cnf中添加如下配置:

[mysqld]
## 设置server_id,注意要唯一
server-id=101  
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin   
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin  

配置完成后也需要重启mysql服务和docker容器,操作和配置Master(主)一致。

链接Master(主)和Slave(从)

在Master进入mysql,执行show master status;

File和Position字段的值后面将会用到,在后面的操作完成之前,需要保证Master库不能做任何操作,否则将会引起状态变化,File和Position字段的值变化。

在Slave 中进入 mysql,执行

change master to master_host=‘172.17.0.2‘, master_user=‘slave‘,master_password=‘123456‘, master_port=3306, master_log_file=‘mysql-bin.000001‘, master_log_pos= 2830, master_connect_retry=30;

master_host :Master的地址,指的是容器的独立ip,可以通过docker inspect --format=‘{{.NetworkSettings.IPAddress}}‘ 容器名称|容器id查询容器的ip

技术图片

master_port:Master的端口号,指的是容器的端口号

master_user:用于数据同步的用户

master_password:用于同步的用户的密码

master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值

master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值

master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒

在Slave 中的mysql终端执行show slave status \G;用于查看主从同步状态。

技术图片

可能遇到·的错误

使用start slave开启主从复制过程后,如果SlaveIORunning一直是Connecting,则说明主从复制 一直处于连接状态,这种情况一般是下面几种原因造成的,我们可以根据 Last_IO_Error提示予以排除。

  1. 网络不通

    检查ip,端口

  2. 密码不对

    检查是否创建用于同步的用户和用户密码是否正确

  3. pos不对

    检查Master的 Position

    show master status 重新修改位置

    change master to master_host=‘172.17.0.3‘, master_user=‘slave‘, master_password=‘root‘, master_port=3306, master_log_file=‘mysql-bin.000001‘, master_log_pos=154, master_connect_retry=30;
    

    使用start slave开启主从复制过程后,如果SlaveIORunning一直是No

    https://blog.csdn.net/qq_31725371/article/details/101540863

2.使用docker挂载的方式 搭建(推荐 vi下载太慢了)
创建目录

创建 data 和 conf配置目录 和 conf/cnf文件

技术图片技术图片

挂载

挂载目录

1.docker run -d -p 3340:3306 -v /home/mysql/conf/my.cnf:/etc/mysql/conf.d/mysql.cnf -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root mysql:5.7 

2.docker run -d -p 3341:3306 -v /home/mysql/conf1/my.cnf:/etc/mysql/conf.d/mysql.cnf -v /home/mysql/data1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root mysql:5.7 
配置

配置和方法1一样 只不过是在conf/my.cnf下配置

测试

在主库中随意创建一个表 看从库是否同步1就ok呢

主从复制的作用

1.读写分离,使数据库能支撑更大的并发

在报表中尤其重要。由于部分报表sql语句非常的慢,导致锁表,影响前台服务。如果前台使用master,报表使用slave,那么报表sql将不会造成前台锁,保证了前台速度。

2.发扬不同表引擎的优点

目前Myisam表的查询速度比innodb略快,而写入并发innodb比myIsam要好。那么,我们可以使用innodb作为master,处理高并发写入,使用mylsam作为slave,接受查询。或在myisam slave中建立全文索引,解决innodb无全文索引的弱点。

3.热备

slave和master的数据“准实时”同步。

二.复制技术能够解决的问题

MySQL复制技术有以下一些特点:1.数据分布 (Data distribution )2.负载平衡(load balancing)3.备份(Backups)4.高可用性和容错行 High availability and failover

三.MySQL主从同步复制原理

MySQL主从复制的基本交互过程,如下:

1.slave端的IO线程连接上master端,并请求从指定binlog日志文件的指定pos节点位置(或者从最开始的日志)开始复制之后的日志内容。

2.master端在接收到来自slave端的IO线程请求后,通知负责复制进程的IO线程,根据slave端IO线程的请求信息,读取指定 binlog日志指定pos节点位置之后的日志信息,然后返回给slave端的IO线程。该返回信息中除了binlog日志所包含的信息之外,还包括本次返回的信息在master端的binlog文件名以及在该binlog日志中的pos节点位置。

3.slave端的IO线程在接收到master端IO返回的信息后,将接收到的binlog日志内容依次写入到slave端的relaylog文件(mysql-relay-bin.xxxxxx)的最末端,并将读取到的master端的binlog文件名和pos节点位置记录到master- info(该文件存在slave端)文件中,以便在下一次读取的时候能够清楚的告诉master,我需要从哪个binlog文件的哪个pos节点位置开 始,请把此节点以后的日志内容发给我。

4.slave端的SQL线程在检测到relaylog文件中新增内容后,会马上解析该log文件中的内容。然后还原成在master端真实执行的那些SQL语句,并在自身按顺序依次执行这些SQL语句。这样,实际上就是在master端和slave端执行了同样的SQL语句,所以master端和 slave端的数据是完全一样的。

以上mysql主从复制交互过程比较拗口,理解起来也比较麻烦,我简化了该交互过程。如下:

1、master在执行sql之后,记录二进制log文件(bin-log)。

2、slave连接master,并从master获取binlog,存于本地relay-log中,然后从上次记住的位置起执行SQL语句,一旦遇到错误则停止同步。

注意:

请注意当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突。

四.MySQL主从同步复制的缺点

从以上mysql的Replication原理可以看出:

1.主从间的数据库不是实时同步,就算网络连接正常,也存在瞬间主从数据不一致的情况。

2.如果主从的网络断开,则从库会在网络恢复正常后,批量进行同步。

3.如果对从库进行修改数据,那么如果此时从库正在在执行主库的bin-log时,则会出现错误而停止同步,这个是很危险的操作。所以一般情况下,我们要非常小心的修改从库上的数据。

注意:

1.一个衍生的配置是双主、互为主从配置,只要双方的修改不冲突,则可以工作良好。

2.如果需要多主库的话,可以用环形配置,这样任意一个节点的修改都可以同步到所有节点。

利用docker搭建主从复制

标签:distrib   顺序   下载   net   注意   成功   mys   mysql目录   mysql   

原文地址:https://www.cnblogs.com/hcly/p/14689069.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!