MySQL 5.7发布后,在复制方面有了很大的改进和提高。好比开始支持多源复制(multi-source)以及真正的支持多线程复制了。多源复制可使用基于二进制日子的复制或者基于事务的复制。下面咱们说一说如何配置基于二进制日志的多源复制。html
首先,咱们要清楚几种常见的复制模式:node
一主一从mysql
一主多从linux
级联复制sql
multi-master数据库
MySQL 5.7 以前只能支持一主一从,一主多从或者多主多从的复制。若是想实现多主一从的复制 只能使用mariadb,可是mariadb又与官方的mysql版本不兼容。缓存
MySQL 5.7 开始支持了多主一从的复制方式也就是多源复制。MySQL 5.7 版本相比以前的版本,不管是功能仍是性能仍是安全等方面都已经有了很多的提高。安全
首先咱们要清楚multi-master OR multi-source 复制不是同样的。multi-master复制一般是环形的复制,能够在任意的主机上将数据复制给其余的主机。如图:bash
multi-source 是不一样的。简单的说,多源复制就是将多个主库同步到一个从库,从而增长从的利用率,节省了机器。如图:服务器
数据分析部门会须要各个业务部门的部分数据作数据分析,这个时候就可使用到多源复制把各个主数据库的数据复制到统一的数据库中
在从服务器进行数据的汇总,若是咱们的主服务器进行了分库分表的操做,为了实现后期的一些数据的统计功能,每每要把数据汇总在一块儿在进行统计
在从服务器对全部主服务器的数据进行备份,在MySQL 5.7以前每一个主服务器都须要一台从服务器,这样很容易形成资源的浪费,同时也加大了DBA的维护成本,但MySQL 5.7引入的多源复制,能够把多个主服务器的数据同步到一台从服务器进行备份。
不论是使用基于二进制日志的复制或者基于事务的复制,要开启多源复制功能必需要在从库上设置master-info-repository AND relay-log-info-repository 这两个参数。
这两个参数是用来存储同步信息的,能够设置的值为FILE和TABLE,默认是FILE。好比master-info就保存在master.info文件中,relay-log-info保存在relay-log.inf文件中服务器若是意外关闭,正确的relay-log-info没有来的及更新带relay-log.info文件,这样就会形成数据的丢失。
为了数据更加安全,一般设置为TABLE。这些表都是innodb类型的,支持事务。相对文件存储安全得多。在MySQL库下能够看到这两个表的信息,分别是mysql.slave_master_info AND mysql.slave_relay_log_info 。
这两个参数也是能够动态调整的。
SET GLOBAL master_info_repository = 'TABLE';
SET GLOBAL relay_log_info_repository = 'TABLE';
若是要启用enhanced multi-threaded slave(多线程复制),能够设置一下参数
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=8
relay_log_recovery=ON
若是SLAVE已经为开启状态,那么须要首先关闭SLAVE(stop slave;)
hostname |
IP |
mysql |
dev-master-01 |
192.168.1.131 |
master |
dev_node-01 |
192.168.1.132 |
master |
dev-node-02 |
192.168.1.133 |
slave |
可参考官方文档:https://dev.mysql.com/doc/refman/5.7/en/linux-installation-yum-repo.html
MySQL 5.7软件包下载地址:https://dev.mysql.com/downloads/repo/yum/
下载yum源rpm安装包:wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
安装yum源:yum localinstall mysql57-community-release-el7-11.noarch.rpm
检查mysql源是否安装成功:yum repolist enable | grep "mysql.*-community.*"
安装MySqL:yum install mysql-community-server
启动MySQL服务:systemctl start mysqld
查看MySQL的启动状态:systemctl status mysqld
设置开机自启:systemctl enable mysqld ----> systemctl daemon-reload
修改root默认密码(这里出现了一些小问题)下面作问题的阐述
在修改密码的过程当中出现了和官网上说法不一致的问题
mysql安装完成后,在/var/log/mysqld.log文件中给root生成一个默认的密码,经过下面的方式能够找到root的默认密码,而后登陆mysql进行修改:
找密码:grep 'temporary password' /var/log/mysqld.log
登陆mysql:mysql -uroot -p
修改密码:ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!'
注意:MySQL的 validate_password 插件默认安装。这将要求密码至少包含一个大写字母,一个小写字母,一位数字和一个特殊字符,而且总密码长度至少为8个字符。
使用官方提供的找密码的命令根本就在mysqld.log文件中找不到默认的密码,只能想办法本身解决mysql的密码的问题了 尝试了一些mysql5.7以前的版本的修改密码的方法可是仍是不可行,可是最后仍是想到了一种至关简单的方法:
修改/etc/my.cnf 在[mysqld]下面添加 skip-grant-tables=1 这一行配置 让mysql启动的时候不对密码进行验证
重启mysqld服务:systemctl restart mysqld
使用root用户登陆到mysql:mysql -uroot
切换到mysql数据库:use mysql;
更新user表:UPDATE user SET authentication_string = PASSWORD('sycx_2009abc') WHERE user = 'root';
使修改后生效:FLUSH PRIVILEGES;
退出mysql,编辑/etc/my.cnf文件 注释掉skip-grant-tables=1
重启mysqld服务,再用新密码登陆便可
上面咱们已经把MySQL 5.7版本的mysql安装成功了 如今咱们只要修改my.cnf配置文件重启mysql验证多源复制便可。步骤以下:
修改192.168.1.131和192.168.1.132下面的/etc/my.cnf文件,修改以下:记得修改配置参数中的server-id(192.168.1.131为1,那么192。168.1.132就得是2,每台服务器中的这个id不能同样,切记!!!)
[mysqld] # 指定端口 不指定默认3306 #port=5603 # mysql数据存放路径 datadir=/var/lib/mysql # mysql socker文件存放路径 socket=/var/lib/mysql/mysql.sock # 建立符号连接(建议禁用符号连接,以防止各类安全风险。开启将参数的值设置为1) symbolic-links=0 # 错误日志存放路径 log-error=/var/log/mysqld.log # 启动pid文件存放路径 pid-file=/var/run/mysqld/mysqld.pid # 设置主从的时候的惟一ID 每台主机的ID不可重复 server-id=1 # #打开日志(主机须要打开),这个mysql-bin也能够自定义,这里也能够加上路径,如:/home/www/mysql_bin_log/mysql-bin log-bin=mysql-bin # 设定mysql的复制模式(STATEMENT ROW MIXED) binlog_format=mixed # 绕过密码验证可直接使用root登陆(用于修改密码) #skip-grant-tables=1 # 启动服务器来禁用主机名缓存 skip-host-cache # 若是这个参数设为OFF,则MySQL服务在检查客户端链接的时候会解析主机名;若是这个参数设为ON,则MySQL服务只会使用IP,在这种状况下,受权表中的Host字段必须是IP地址或localhost。 skip-name-resolve # 网络传输时单个数据包的大小 max_allowed_packet = 500M # 设置数据库的时间 default-time-zone = '+8:00' # 内部内存临时表的最大内存 tmp_table_size=200M # MySQL服务器用来做普通索引扫描、范围索引扫描和不使用索引而执行全表扫描这些操做所用的缓存大小。 join_buffer_size = 32M # 每一个会话执行排序操做所分配的内存大小。 sort_buffer_size = 1M # 每一个客户端线程和链接缓存和结果缓存交互,每一个缓存最初都被分配大小为net_buffer_length的容量,并动态增加,直至达到max_allowed_packet参数的大小 net_buffer_length = 8K # 为每一个线程对MyISAm表执行顺序读所分配的内存。若是数据库有不少顺序读,能够增长这个参数,默认值是131072字节。 read_buffer_size = 512K # 这个参数用在MyISAM表和任何存储引擎表随机读所使用的内存。 read_rnd_buffer_size = 32M # 在REPAIR TABLE、CREATE INDEX 或 ALTER TABLE操做中,MyISAM索引排序使用的缓存大小。 myisam_sort_buffer_size = 256M # 设置客户端的并发链接数量 max_connections = 8000 # mysql关闭非交互链接前的等待时间,单位是秒 wait_timeout = 604800 # Mysql关闭交互链接前的等待时间,单位是秒 interactive_timeout = 604800 # 设定远程用户必须回应PORT类型数据链接的最大时间 connect_timeout = 30 # 若是客户端尝试链接的错误数量超过这个参数设置的值,则服务器再也不接受新的客户端链接。能够经过清空主机的缓存来解除服务器的这种阻止新链接的状态,经过FLUSH HOSTS或mysqladmin flush-hosts命令来清空缓存。 max_connect_errors = 30000 # mysql关闭链接前的等待时间,单位是秒 interactive_timeout = 86400 # 慢查询的时间设置,单位为秒 long_query_time = 20 # mysql服务缓存以重用的线程数 thread_cache_size = 120 # 为查询结果所分配的缓存 query_cache_size = 256M # 若是一个事务须要的内存超过这个参数,就会报错 max_heap_table_size=2097152000
二、修改192.168.1.133也就是从库的/etc/my.cnf 配置参数,配置以下:(记得修改server-id为3,不能和其余服务器id同样,切记!!!)
[mysqld] # 指定端口 不指定默认3306 #port=5603 # mysql数据存放路径 datadir=/var/lib/mysql # mysql socker文件存放路径 socket=/var/lib/mysql/mysql.sock # 建立符号连接(建议禁用符号连接,以防止各类安全风险。开启将参数的值设置为1) symbolic-links=0 # 错误日志存放路径 log-error=/var/log/mysqld.log # 启动pid文件存放路径 pid-file=/var/run/mysqld/mysqld.pid # 设置主从的时候的惟一ID 每台主机的ID不可重复 server-id=1 # #打开日志(主机须要打开),这个mysql-bin也能够自定义,这里也能够加上路径,如:/home/www/mysql_bin_log/mysql-bin log-bin=mysql-bin # 设定mysql的复制模式(STATEMENT ROW MIXED) binlog_format=mixed # 绕过密码验证可直接使用root登陆(用于修改密码) #skip-grant-tables=1 # 启动服务器来禁用主机名缓存 skip-host-cache # 若是这个参数设为OFF,则MySQL服务在检查客户端链接的时候会解析主机名;若是这个参数设为ON,则MySQL服务只会使用IP,在这种状况下,受权表中的Host字段必须是IP地址或localhost。 skip-name-resolve # 网络传输时单个数据包的大小 max_allowed_packet = 500M # 设置数据库的时间 default-time-zone = '+8:00' # 内部内存临时表的最大内存 tmp_table_size=200M # MySQL服务器用来做普通索引扫描、范围索引扫描和不使用索引而执行全表扫描这些操做所用的缓存大小。 join_buffer_size = 32M # 每一个会话执行排序操做所分配的内存大小。 sort_buffer_size = 1M # 每一个客户端线程和链接缓存和结果缓存交互,每一个缓存最初都被分配大小为net_buffer_length的容量,并动态增加,直至达到max_allowed_packet参数的大小 net_buffer_length = 8K # 为每一个线程对MyISAm表执行顺序读所分配的内存。若是数据库有不少顺序读,能够增长这个参数,默认值是131072字节。 read_buffer_size = 512K # 这个参数用在MyISAM表和任何存储引擎表随机读所使用的内存。 read_rnd_buffer_size = 32M # 在REPAIR TABLE、CREATE INDEX 或 ALTER TABLE操做中,MyISAM索引排序使用的缓存大小。 myisam_sort_buffer_size = 256M # 设置客户端的并发链接数量 max_connections = 8000 # mysql关闭非交互链接前的等待时间,单位是秒 wait_timeout = 604800 # Mysql关闭交互链接前的等待时间,单位是秒 interactive_timeout = 604800 # 设定远程用户必须回应PORT类型数据链接的最大时间 connect_timeout = 30 # 若是客户端尝试链接的错误数量超过这个参数设置的值,则服务器再也不接受新的客户端链接。能够经过清空主机的缓存来解除服务器的这种阻止新链接的状态,经过FLUSH HOSTS或mysqladmin flush-hosts命令来清空缓存。 max_connect_errors = 30000 # mysql关闭链接前的等待时间,单位是秒 interactive_timeout = 86400 # 慢查询的时间设置,单位为秒 long_query_time = 20 # mysql服务缓存以重用的线程数 thread_cache_size = 120 # 为查询结果所分配的缓存 query_cache_size = 256M # 若是一个事务须要的内存超过这个参数,就会报错 max_heap_table_size=2097152000 # mysql5.7 多源复制从库的配置参数 master-info-repository = table # 这个参数是必须的 relay-log-info-repository = table # 这个参数是必须的 report-port = 3306 report-host = 192.168.1.131 replicate-do-db = master1 replicate-do-db = master2 replicate_wild_do_table=master1.% replicate_wild_do_table=master2.%
三、从新启动mysql服务:systemctl restart mysqld
四、升级mysql受权表:mysql_upgrade -uroot -p
五、登陆192.168.1.131和192.168.1.132的mysql:mysql -uroot -p
六、如下的执行都是在192.168.1.131和192.168.1.132的mysql中执行sql语句
建立mysql的主从受权用户:grant replication slave on *.* to 'slave'@'192.168.1.%' identified by '2017123';
刷新生效:FLUSH PRIVILEGES;
七、登陆192.168.1.133的mysql执行sql语句:
CHANGE MASTER TO MASTER_HOST='192.168.1.131', MASTER_USER='slave', MASTER_PORT=3306, MASTER_PASSWORD='2017123', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=1 FOR CHANNEL 'master1'; CHANGE MASTER TO MASTER_HOST='192.168.1.132', MASTER_USER='slave', MASTER_PORT=3306, MASTER_PASSWORD='2017123', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=1 FOR CHANNEL 'master2';
八、所有显示sql语句执行ok,而后查看主从的状态:
执行sql语句:show slave status\G;
若是要查看单一信道的复制的详细状态,可使用如下命令:
SHOW SLAVE STATUS FOR CHANNEL 'master1'\G;
九、在主库(192.168.1.131)实例建立一些数据。
create database master1; use master1; CREATE TABLE `test1` (`id` int(11) DEFAULT NULL,`count` int(11) DEFAULT NULL); insert into test1 values(1,1);
十、在主库(192.168.1.132)实例建立一些数据。
create database master2; use master2; CREATE TABLE `test2` (`id` int(11) DEFAULT NULL,`count` int(11) DEFAULT NULL); insert into test2 values(1,1);
十一、在从库(192.168.1.133)实例检查数据是否成功复制。
select * from master1.test1; select * from master2.test2;
十二、列出全部的复制信道的复制状态概况:
select * from performance_schema.replication_applier_status_by_worker;
1三、在 performance_schema 库中,提供了复制相关的一些视图,可供查看复制相关的信息。
use performance_schema; show tables like '%repl%';
这些表里分别有多源通道的配置信息和多源通道的状态信息,另外还有链接配置信息和链接状态信息,若是配置了多线程复制的话,还会有多线程配置信息和多线程状态信息。
其它一些须要注意的点:
初次配置耗时较长,须要将各个 master 的数据 dump 下来,再 source 到 slave 上。
须要考虑各 master 数据增加频率,slave 的数据增加频率是这些数据的总和。若是过高,会致使大量的磁盘IO,形成数据更新延迟,最严重的是会影响正常的查询。
若是多个主数据库实例中存在同名的库,则同名库的表都会放到一个库中;
若是同名库中的表名相同且结构相同,则数据会到一块儿;若是结构不一样,则先建的有效。