MySQL
的主从复制是实现应用的高性能,高可用的基础。对于数据库读操做较密集的应用,经过使数据库请求负载均衡分配到不一样MySQL
服务器,可有效减轻数据库压力。当遇到MySQL
单点故障中,也能在短期内实现故障切换。本文就MySQL
的内建的复制功能进行阐述。mysql
5.7.17
7.4.1708
1.13.1
MySQL
复制数据流程:sql
my.cnf
配置在主库的my.cnf
中打开二进制日志,并设置服务Id。docker
log-bin = mysql-bin server-id = 1
注意server-id
必须是一个惟一的数字,必须主从不一致, 且主从库必须设置项。数据库
my.cnf
配置log-bin = mysql-bin server-id = 2 log-slave-updates = 1 read-only = 1
从库也开启log-bin
,log-slave-updates
设置为从库重放中继日志时,记录到本身的二进制日志中,可让从库做为其余服务器的主库,将二进制日志转发给其余从库,在作一主多从方案时可考虑该种方案。安全
这里master
和slave
文件各自保存不共用,先建立文件夹 /usr/local/mysql
而后在目录建立master
和slave
两个目录,再各自建立data
文件夹bash
# 利用 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
都是基于同一个镜像构建,使用的存储引擎和其余的组件最好是同一中,否则在复制过程当中可能会出现异常。服务器
-- 建立 data_copy 数据库 DROP DATABASE IF EXISTS `data_copy`; CREATE DATABASE `data_copy` /*!40100 DEFAULT CHARACTER SET utf8mb4 collate utf8mb4_general_ci */; -- 建立 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
表。负载均衡
#!/bin/sh echo '启动mysql' service mysql start sleep 5 echo '初始化数据库' mysql -uroot -pytao < /mysql/init.sql echo '初始化完成!' tail -f /dev/null
master
和slave
镜像并运行容器构建master
镜像异步
docker build -t master/mysql .
构建slave
镜像性能
docker build -t slave/mysql .
构建成功会返回 Successfuly
,或经过docker images
命令查看镜像
使用刚构建的镜像来运行容器
# 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)。
GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO muser@'%' IDENTIFIED BY 'ytao';
这里设置的访问地址是开放的,实际使用过程当中安全起见必定要指定访问地址。
从库链接到主库,获取到二进制日志后重放。这里首先要配置上面建立的帐号进行链接,使用命令进行相应的设置。
CHANGE MASTER TO MASTER_HOST = '47.107.xx.xxx', MASTER_PORT = 3306, MASTER_USER = 'muser', MASTER_PASSWORD = 'ytao', MASTER_LOG_FILE = 'mysql-bin.000006';
到这里复制尚未启动,须要再从库中启动
START SLAVE;
使用SHOW SLAVE STATUS\G;
命令查看启动后的状况
上面标记的输出信息Slave_IO_Running: Yes
和Slave_SQL_Running: Yes
能够看到I/O线程和SQL线程已启动运行中。
若是在主库中添加,更新或删除一个数据,那么从库中应该也有与主库对应的数据变化。 向主库添加一条数据
INSERT INTO `data_copy`.`person` (`id`, `name`) VALUES ('1', 'ytao');
查询从库数据,数据已被同步过来。
上述是最简单最基本的配置,可是理解上面的配置过程,就能够根据自身状况定制不一样方案,实现一主多从,主主复制(主动-主动或主动-被动模式)等等来知足自身需求。
MySQL
的复制虽然使用简单方便,但也伴随着一些问题须要咱们在使用中进行解决,好比:不能从服务器异常中止中恢复,数据同步的延迟等等,还好如今遇到的大部分问题在行业中已获得相应的解决。对这方面感兴趣的能够去了解下如今解决这些问题的中间件实现方案。
我的博客: https://ytao.top
个人公众号 ytao