时间:2021-05-02
前言
mysql的主从复制是实现应用的高性能,高可用的基础。对于数据库读操作较密集的应用,通过使数据库请求负载均衡分配到不同mysql服务器,可有效减轻数据库压力。当遇到mysql单点故障中,也能在短时间内实现故障切换。本文就mysql的内建的复制功能进行阐述。
版本
概述
mysql复制数据流程:
配置主从库
主库my.cnf配置
在主库的my.cnf中打开二进制日志,并设置服务id。
? 1 2 log-bin = mysql-bin server-id = 1注意server-id必须是一个唯一的数字,必须主从不一致, 且主从库必须设置项。
从库my.cnf配置
? 1 2 3 4 log-bin = mysql-bin server-id = 2 log-slave-updates = 1 read-only = 1从库也开启log-bin,log-slave-updates设置为从库重放中继日志时,记录到自己的二进制日志中,可以让从库作为其他服务器的主库,将二进制日志转发给其他从库,在做一主多从方案时可考虑该种方案。
dockerfile构建mysql镜像
构建所需文件
这里master和slave文件各自保存不共用,先创建文件夹 /usr/local/mysql 然后在目录创建master和slave两个目录,再各自创建data文件夹
dockerfile 内容
? 1 2 3 4 5 6 7 8 9 10 11 # 利用 mysql 镜像创建新的镜像 from mysql:5.7.17 env mysql_root_password ytao copy start.sh /mysql/start.sh copy my.cnf /etc/mysql/my.cnf copy init.sql /mysql/init.sql expose 3306 cmd ["sh", "/mysql/start.sh"]这里的master和slave都是基于同一个镜像构建,使用的存储引擎和其他的组件最好是同一中,不然在复制过程中可能会出现异常。
init.sql 初始化数据
? 1 2 3 4 5 6 7 8 9 10 11 12 -- 创建 data_copy 数据库 drop database if exists `data_copy`; create database `data_copy` ; -- 创建 person 表 use `data_copy`; drop table if exists `person`; create table `person` ( `id` int(32) not null, `name` varchar(255) default null, primary key (`id`) ) engine=innodb default charset=utf8mb4;创建data_copy数据库和person表。
start.sh 脚本
? 1 2 3 4 5 6 7 8 9 #!/bin/sh echo '启动mysql' service mysql start sleep 5 echo '初始化数据库' mysql -uroot -pytao < /mysql/init.sql echo '初始化完成!' tail -f /dev/null构建master和slave镜像并运行容器
构建master镜像
? 1 docker build -t master/mysql .构建slave镜像
? 1 docker build -t slave/mysql .构建成功会返回 successfuly,或通过docker images命令查看镜像
使用刚构建的镜像来运行容器
? 1 2 3 4 5 # master 容器 docker run --name master -p 3306:3306 -v /usr/local/mysql/master/data/:/var/lib/mysql -d master/mysql # slave 容器 docker run --name slave -p 3307:3306 -v /usr/local/mysql/slave/data/:/var/lib/mysql -d slave/mysql指定master端口为3306,slave端口为3307,挂载data目录为保存数据的目录。
连接到数据库后验证数据库是否初始化成功
查看 log-bin 是否开启
创建复制账号
前面有提到从库i/o线程要与主库建立连接,所以需要用到账号进行验证。账号除了要有连接权限(replication client),同时还要有复制权限(replication slave)。
? 1 grant replication client, replication slave on *.* to muser@'%' identified by 'ytao';这里设置的访问地址是开放的,实际使用过程中安全起见一定要指定访问地址。
从库启动复制
从库连接到主库,获取到二进制日志后重放。这里首先要配置上面创建的账号进行连接,使用命令进行相应的设置。
? 1 2 3 4 5 6 change master to master_host = '47.107.xx.xxx', master_port = 3306, master_user = 'muser', master_password = 'ytao', master_log_file = 'mysql-bin.000006';到这里复制还没有启动,需要再从库中启动
? 1 start slave;使用show slave status\g;命令查看启动后的情况
上面标记的输出信息slave_io_running: yes和slave_sql_running: yes可以看到i/o线程和sql线程已启动运行中。
测试同步数据
如果在主库中添加,更新或删除一个数据,那么从库中应该也有与主库对应的数据变化。
向主库添加一条数据
? 1 insert into `data_copy`.`person` (`id`, `name`) values ('1', 'ytao');查询从库数据,数据已被同步过来。
总结
上述是最简单最基本的配置,但是理解上面的配置过程,就可以根据自身情况定制不同方案,实现一主多从,主主复制(主动-主动或主动-被动模式)等等来满足自身需求。
mysql的复制虽然使用简单方便,但也伴随着一些问题需要我们在使用中进行解决,比如:不能从服务器异常停止中恢复,数据同步的延迟等等,还好现在遇到的大部分问题在行业中已得到相应的解决。对这方面感兴趣的可以去了解下现在解决这些问题的中间件实现方案。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对服务器之家的支持。
原文链接:https://segmentfault.com/a/1190000020841305
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
MySQL主从配置及原理,供大家参考,具体内容如下一、环境选择:1.Centos6.52.MySQL5.7二、什么是MySQL主从复制MySQL主从复制是其最重
详解mongoDB主从复制搭建详细过程实验目的搭建mongoDB主从复制主192.168.0.4从192.168.0.7mongodb的安装1:下载mongod
本文实例讲述了MySQL主从复制原理与实践。分享给大家供大家参考,具体如下:简介MySQL的主从复制又叫Replication、AB复制。至少需要两个MySQL
1.MySQL数据库主从同步延迟原理。要说延时原理,得从mysql的数据库主从复制原理说起,mysql的主从复制都是单线程的操作,主库对所有DDL和DML产生b
一、mysql主从复制介绍mysql的主从复制并不是数据库磁盘上的文件直接拷贝,而是通过逻辑的binlog日志复制到要同步的服务器本地,然后由本地的线程读取日志