MySQL主从复制 + Mycat实现读写分离
版权所有, 转载请注明出处 http://www.cnblogs.com/YingYue/p/7677814.html
说明:两台MySQL服务器都是使用CentOS6.5系统,MySQL版本为mysql-5.7.17
MySQL一主一被实现主从复制
注意:写包括insert,delete,update 操作;读只有select其他操作由主master的二进制文件决定。
一.在192.168.42.128上安装MySQL(主库)
开启账号root的远程登录权限,过程:略
配置主服务器的my.cnf 文件 并重启(开启二进制文件等)
##------------------------------------------周建旭2017年3月6日 ::10添加------------------------------------# # # server-id 唯一的服务辨识号,数值位于 到 ^-1之间.
# # 此值在master和slave上都需要设置.
# # 如果 “master-host” 没有被设置,则默认为1, 但是如果忽略此选项,MySQL不会作为master生效.
server-id = #[必须]服务器唯一ID,默认是1 ##------------------------------------------master上的配置开始------------------------------------------------##
# #
# # log-bin 打开二进制日志功能. #
# # 在复制(replication)配置中,作为MASTER主服务器必须打开此项 #
# # 如果你需要从你最后的备份中做基于时间点的恢复,你也同样需要二进制日志. #
log-bin = mysql-bin #[必须]启用二进制日志 #
# # 需要开启生成二进制日志记录相关配置,配置在需要被复制的服务器上,即:master #
binlog-do-db = test_db #指定对名称为test_db的数据库记录二进制日志 #
binlog-ignore-db = mysql #指定不对名称为mysql的数据库记录二进制日志 #
binlog-ignore-db = information_schema #指定不对名称为information_schema的数据库记录二进制日志 #
binlog_format = mixed #binlog日志格式,mysql默认采用,如果从服务器slave有别的slave要复制那么该slave也需要这一项#
expire_logs_days = #超过7天的binlog删除### #
# #
##-------------------------------------------master上的配置开始-----------------------------------------------## ##-------------------------------------------slave上的配置开始------------------------------------------------##
# #
# # replicate-do-db 需要做复制的数据库,如果复制多个数据库,重复设置这选项即可master上不需要此项,slave上需要 #
#replicate-do-db = test_db #复制名称为test_db的数据库 #
# # replicate-ignore-db 不需要复制的数据库,如果要忽略复制多个数据库,重复设置这个选项即可 #
#replicate-ignore-db = mysql #不需要(忽略)复制名称为mysql的数据库 #
#replicate-ignore-db = information_schema #不需要(忽略)复制名称为information_schema的数据库 #
# #
# 如果你在使用链式从服务器结构的复制模式 (A->B->C), #
# # 你需要在服务器B上打开此项. #
# # 此选项打开在从线程上重做过的更新的日志, #
# # 并将其写入从服务器的二进制日志. #
# # 默认值为OFF;设置log_slave_updates = 1即表示开启 #
#log_slave_updates = #
# #
##------------------------------------------slave上的配置结束-------------------------------------------------## skip-external-locking #MySQL选项以避免外部锁定。该选项默认开启
default-storage-engine = InnoDB #默认存储引擎
lower_case_table_names = #忽略表大小写 ##------------------------------------------周建旭2017年3月6日 ::10添加------------------------------------#
截图
注意:
binlog-do-db = 需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可
binlog-ignore-db = 不需要复制的数据库库名,如果复制多个数据库,重复设置这个选项即可
二.在192.168.42.129 上安装MySQL(备库)
创建用户yingyue 授权可以远程登录和本地登录,拥有该实例所有数据库的权限。过程:略
配置slave服务器的my.cnf 文件 并重启(配置slave对master的二进制文件复制)
##------------------------------------------周建旭2017年3月6日 ::10添加------------------------------------# # # server-id 唯一的服务辨识号,数值位于 到 ^-1之间.
# # 此值在master和slave上都需要设置.
# # 如果 “master-host” 没有被设置,则默认为1, 但是如果忽略此选项,MySQL不会作为master生效.
server-id = #[必须]服务器唯一ID,默认是1 ##------------------------------------------master上的配置开始------------------------------------------------##
# #
# # log-bin 打开二进制日志功能. #
# # 在复制(replication)配置中,作为MASTER主服务器必须打开此项 #
# # 如果你需要从你最后的备份中做基于时间点的恢复,你也同样需要二进制日志. #
#log-bin = mysql-bin #[必须]启用二进制日志 #
# # 需要开启生成二进制日志记录相关配置,配置在需要被复制的服务器上,即:master #
#binlog-do-db = test_db #指定对名称为test_db的数据库记录二进制日志 #
#binlog-ignore-db = mysql #指定不对名称为mysql的数据库记录二进制日志 #
#binlog-ignore-db = information_schema #指定不对名称为information_schema的数据库记录二进制日志 #
#binlog_format = mixed #binlog日志格式,mysql默认采用,如果从服务器slave有别的slave要复制那么该slave也需要该项 #
#expire_logs_days = #超过7天的binlog删除### #
# #
##-------------------------------------------master上的配置开始-----------------------------------------------## ##-------------------------------------------slave上的配置开始------------------------------------------------##
# #
# # replicate-do-db 需要做复制的数据库,如果复制多个数据库,重复设置这选项即可master上不需要此项,slave上需要 #
replicate-do-db = test_db #复制名称为test_db的数据库 #
# # replicate-ignore-db 不需要复制的数据库,如果要忽略复制多个数据库,重复设置这个选项即可 #
replicate-ignore-db = mysql #不需要(忽略)复制名称为mysql的数据库 #
replicate-ignore-db = information_schema #不需要(忽略)复制名称为information_schema的数据库 #
# #
# 如果你在使用链式从服务器结构的复制模式 (A->B->C), #
# # 你需要在服务器B上打开此项. #
# # 此选项打开在从线程上重做过的更新的日志, #
# # 并将其写入从服务器的二进制日志. #
# # 默认值为OFF;设置log_slave_updates = 1即表示开启 #
#log_slave_updates = #
# #
##------------------------------------------slave上的配置结束-------------------------------------------------## skip-external-locking #MySQL选项以避免外部锁定。该选项默认开启
default-storage-engine = InnoDB #默认存储引擎
lower_case_table_names = #忽略表大小写 ###------------------------------------------周建旭2017年3月6日 ::10添加------------------------------------#
截图
注意:
replicate-do-db = 需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可
replicate-ignore-db = 不需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可
三.连接(我使用的是sqlyog)192.168.42.128服务器上的MySQL(主)
show master status; /*!查看主master的状态,如果没有数据,需要在my.cnf 中配置*/
注意:show master status; 只有在my.cnf中配置了log-bin开启生成数据库二进制记录才会显示数据
grant replication slave on *.* to 'yingyue'@'%'; /*!给ip地址为所有(%表示任何ip)MySQL服务器上的 盈月 授权对该master的复制权限*/
flush privileges; /*!刷新权限*/
四.连接 (我使用的是sqlyog)192.168.42.129 服务器上的MySQL(从)
show slave status; /*!查看该slave的状态,只有该slave执行命令start slave; 后才有显示记录*/
停止从服务器
stop slave;
重置从服务器
reset slave;
从服务器关联到主服务器
change master to master_user='root', master_password='a19911008', master_host='192.168.42.128',master_port=3306, master_log_file='mysql-bin.000002',master_log_pos=519;
注意:上面的关联配置的信息都是主服务器上的,但是要在slave从服务器上配置,如果master_log_file和master_log_pos不知道可以在master服务器(192。168.42.128)上使用show master status;查看
执行成功!
开启从服务器start slave;
查看从服务器连接状态show slave status\G /*!不加分号*/
Sqlyog不支持\解析不了sql可以使用命令行来查看
使用账号:yingyue 进行远程登录到192.168.42.129 上
全部信息如下:
Microsoft Windows [版本 6.1.] 版权所有 (c) Microsoft Corporation。保留所有权利。 C:\Users\Administrator>mysql -h192.168.42. -uyingyue -p000000 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is Server version: 5.7.-log Source distribution Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> show slave status\G *************************** . row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.42.128 Master_User: root Master_Port: Connect_Retry: Master_Log_File: mysql-bin. Read_Master_Log_Pos: Relay_Log_File: localhost-relay-bin. Relay_Log_Pos: Relay_Master_Log_File: mysql-bin. Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: test_db Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: Last_Error: Skip_Counter: Exec_Master_Log_Pos: Relay_Log_Space: Until_Condition: None Until_Log_File: Until_Log_Pos: Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: Master_SSL_Verify_Server_Cert: No Last_IO_Errno: Last_IO_Error: Last_SQL_Errno: Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: Master_UUID: a70b33cb-ff4a-11e6-9fdc-000c29589bdd Master_Info_File: /usr/local/mysql-5.7./data/master.info SQL_Delay: SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates Master_Retry_Count: Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version:
row in set (0.00 sec) mysql>
是否成功就看
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
是否都为Yes
如果有出现以上结果,则配置成功!
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
表示:从服务器已经读到了所有的主服务器库的二进制日志,随时待命复制;
下面来测试一下主从复制
测试描述:
DDL语句测试
在服务器192.168.42.128 的 test_db库中新建 country表,看看从服务器192.168.42.129的test_db中是否会自动同步复制country表,如果可以,则表明主从复制成功;
执行 create table country(id int not null primary key auto_increment, name varchar(100));
看看从服务器192.168.42.129 上从库test_db是否会自动同步country表
没问题
下面来删除主192.68.42.128上主库test_db的country表
看看192.168.42.129 上的从库的情况
也是可以的,没问题,现在再重新创建表country 下面测试需要使用(在主库中创建)
DML语句测试(包括insert, delete,update)
在192.168.42.128的主库test_db上执行insert into country values(1, '南非'),(2,'瑞典'),(3,'哥斯达黎加'),(4,'新西兰'),(5,'中国'),(6,'希腊') ,(7,'意大利'),(8,'苏格兰') ,(9,'冰岛') ,(10,'委内瑞拉') ,(11,'比利时');
查看192.168.42.129的test_db从库的country表是否多了11条记录
没问题。
在192.168.42.128的主库test_db上执行update country set name='中华人民共和国' where id = 5;
查看192.168.42.129的test_db从库的country表
没问题。
在192.168.42.128的主库test_db上执行 delete from country where id = 11;
查看192.168.42.129的test_db从库的country表,最后一个 ‘比利时’应该没了
没问题。
读写分离(主库写, 从库读)
读写分离使用的中间件为mycat
安装mycat 过程略
官方参考文档:
配置mycat环境变量 略:
注意防火墙开启8066 和9066 端口
修改server.xml文件
编辑server.xml文件(读写分离这些就够了,多了碍眼)
<?xml version="1.0" encoding="UTF-8"?> <!-- - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. --> <!DOCTYPE mycat:server SYSTEM "server.dtd"> <mycat:server xmlns:mycat="http://io.mycat/"> <system> <property name="useSqlStat">1</property> <!-- 1为开启实时统计、0为关闭 --> </system> <user name="root"> <property name="password">a19911008</property> <property name="schemas">TESTDB</property> </user> <user name="yingyue"> <property name="password">000000</property> <property name="schemas">TESTDB</property> </user> </mycat:server>
配置schema.xml文件 vi conf/schema.xml
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema> <dataNode name="dn1" dataHost="localhost1" database="test_db" /> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <!-- can have multi write hosts --> <writeHost host="hostM1" url="192.168.42.128:3306" user="root" password="a19911008"> <!-- can have multi read hosts --> <readHost host="hostS2" url="192.168.42.129:3306" user="yingyue" password="000000" /> </writeHost> </dataHost> </mycat:schema>
启动mycat 进入mycat安装怒目执行/bin/mycat start 或 /bin/mycat console
如下启动完成
使用mycat作为代理连接MySQL数据库
yingyue是192.168.42.129上的MySQL用户为什么可以连接到192.168.42.128的MySQL呢?因为在刚才的mycat的server.xml中配置了,相当于代理
参数解释
C:\Users\Administrator>mysql -h192.168.42.128 -uyingyue -p000000 -P8066 -DTESTDB
其中8066是mycat的监听端口,类似于mysql的3306端口,其中-u,-p,-h分别是用户名,密码和主机,-P是mycat端口 -D是连接的逻辑库。至于为什么是这些,这个跟mycat的server.xml和schema.xml配置文件有关。
在命令行中执行explain select * from country;
看到数据是从dn1节点查的。
插入一条数据
下面来看看mycat监控日志
从日志看到最终被插入到192.168.42.128的MySQL的test_db的country中
看一下主库是否有添加的数据
果然有,说明读写分离成功! 然后从库192.168.42.129中的test_db会复制这条数据
没问题的,读写分离也是成功的。
题外话:之前以为mycat可以实现主从库数据复制,原来是不可以的,看看下面,其实mycat就是代理实现了主从库的读写分离。总结:主从复制与读写分离无关,主从复制是MySQL的,读写分离是Mycat的。
--------------------------------------------------------------------------------------------------
高级篇
MySQL的slave断了怎么办?
如下图:
这个错是我故意弄的,因为192.168.42.128上的test_db是很早前就建的库并且里面有account表,但是192.168.42.128上的MySQL我今天重启过,每次重启二进制日志文件log-bin都不相同,在上次的文件版本上加一所以是mysql-bin.000002, 但是192.168.42.129服务器上的MySQL的是我今天重新关联的,关联的是mysql-bin.000002这个二进制日志文件,这个文件中没有记录account表的创建和插入数据记录。但是在我在主从复制正常的情况下在主服务器上将account删掉,这时删除的记录会记录到mysql-bin.000002的二进制日志文件中,然后slave服务器的MySQL会复制master的日志然后执行日志,slave上的test_db没有account表删除肯定报错;
解决方案:
mysql> stop slave;
Query OK, 0 rows
affected (0.01 sec)
mysql> set GLOBAL
SQL_SLAVE_SKIP_COUNTER=1;
Query OK, 0 rows
affected (0.00 sec)
mysql> start slave;
Query OK, 0 rows
affected (0.01 sec)
解释:
set GLOBAL SQL_SLAVE_SKIP_COUNTER=1; 表示 跳过一个事物
查看从库及其日志,已经开始正常复制
说明:今天发现最后一步不用做,设置完set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;后,开启slave后,该值自动变为0了。
------------------------------------------------------------------------------------------------------
延伸:
mysql主从错误断开 怎样恢复
mysql主从同步常见异常及恢复方法
1. 一般的异常只需要跳过一步即可恢复
mysql> stop slave;
mysql> set GLOBAL
SQL_SLAVE_SKIP_COUNTER=1;
mysql> slave start;
2.断电导致主从不能同步时,通主库的最后一个bin-log日志进行恢复
在主库服务器上,mysqlbinlog mysql-bin.xxxx > binxxxx.txt
tail -n 100000 binxxxx.txt > tail-binxxxx.txt
vim tail-binxxxx.txt 打开tail-binxxxx.txt文件找到最后一个postion值
然后在从库上,change host to 相应正确的值
mysql> stop slave;
mysql> change master to
master_host='ip', master_user='username', master_password='password',
master_log_file='mysql-bin.xxxx', master_log_pos=xxxx;
mysql> slave start;
mysql> show slave status\G
3.主键冲突、表已存在等错误代码如1062,1032,1060等,可以在mysql主配置文件my.cnf或my.ini文件指定
略过此类异常并继续下条sql同步,这样也可以避免很多主从同步的异常中断
[mysqld]
slave-skip-errors = 1062,1032,1060
-------------------------------------
从理想角度看,主从数据库应该无故障的运转下去,可以有时候还是会出现一些莫名其妙的问题,比如说即便从未在从服务器上手动更新过数据,但还是可能遇到“Error:
1062 Duplicate
entry”错误,具体原因不详,可能是MySQL本身的问题。遇到这类问题的时候,从服务器会停止复制操作,我们只能手动解决问题,具体的操作步骤如下:
mysql> stop slave;
mysql> set global sql_slave_skip_counter = 1;
mysql> start slave;
同样的操作可能需要进行多次,也可以设置自动处理此类操作,格式:slave-skip-errors = 错误代码
在从服务器的my.cnf里设置:
slave-skip-errors = 1062
MySQL主从复制 + Mycat实现读写分离的更多相关文章
- MySql 主从复制 mysql-proxy实现读写分离
1.安装和配置Docker 服务器版本阿里云CentOS7.4 docker版本18.06.0-ce docker安装步骤https://docs.docker.com/install/linux/d ...
- MySQL主从复制与Atlas读写分离
配置主从复制 1. 增加主从配置 # 主库配置文件 server-id = 1 log-bin = /var/lib/mysql/mysql-bin expire_logs_days = 10 ski ...
- mysql 与 mycat集成读写分离
1,先说下同步数据库原理,其实很简单.就是在主库做数据库操作的时候,会生成一个本地日志,日志会在my.ini当中配置看图一,读库会实时去扫描日志,如果有更新就直接在读库执行. 这个是主库my.ini配 ...
- MySQL - MyCat 实现读写分离
前言 MyCat是一个彻底开源的,面向企业应用开发的大数据库集群,支持事务.ACID.可以替代MySQL的加强版数据库.其功能有可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群.融 ...
- Mysql 高可用(MHA)-读写分离(Atlas)-分布式架构(Mycat)
Mysql 高可用(MHA)-读写分离(Atlas) 1. 搭建主从复制(一主两从) 1.1 准备环境 1 主库:10.0.0.51/db01 2 从库:10.0.0.52/db02,10.0.0.5 ...
- Mycat实现读写分离,主备热切换
实验环境:ubutu server 14 Master IP:172.16.34.212 Slave IP:172.16.34.34.156 Mycat server IP:172.16.34.219 ...
- Mycat分布式数据库架构解决方案--Mycat实现读写分离
echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! 安装完 ...
- mycat 实现读写分离
mycat 实现读写分离 配置mysql实现主从复制 安装jdk 安装mycat实现读写分离 tar zxf Mycat-server-1.6-RELEASE-20161028204710-sangn ...
- springboot2.0+mycat实验读写分离
声明:用户到达一定程度,架构就必须要考虑,因为在这个前提下,读写分离,尤为重要. 1.搭建mysql主从复制 https://www.cnblogs.com/ywjfx/p/10264383.html ...
随机推荐
- 基础知识(C#语法、数据库SQL Server)回顾与总结
前言 已经有大概一个多月没有更新博客,可能是开始变得有点懒散了吧,有时候想写,但是又需要额外投入更多的时间去学习,感觉精力完全不够用啊,所以为了弥补这一个多月的潜水,决定写一篇,衔接9月未写博客的空缺 ...
- 如何使用phpstudy本地搭建多站点(每个站点对应不同的端口)
到http://phpstudy.net/a.php/208.html下载phpstudy 1.装完phpstudy后,(假设安装在D盘,安装后开启服务) 在D:\phpStudy\WWW\路径下创建 ...
- px,em,rem的关系
之前听人说过,网站制作中字体单位应该用em而不用px,为什么呢?原因简单来说就是em支持IE6下的字体缩放,在页面中按ctrl+滚轮,字体以px为单位的网站没有反应.px是绝对单位,不支持IE的缩放, ...
- 团队作业8----第二次项目冲刺(Beta阶段) 第七天
BETA阶段冲刺第六天 1.小会议ing 2.每个人的工作 (1)昨天已完成的工作 完成查重部分 (2) 今天计划完成的工作 (3) 工作中遇到的困难: 尤少辉:在测试的时候发现了,文件名保存到数据 ...
- 201521123082 《Java程序设计》第8周学习总结
201521123082 <Java程序设计>第8周学习总结 标签(空格分隔):Java 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 1.2 ...
- 201521123025<<java程序设计>>第4周学习总结
Q1. 本周学习总结 Q2.书面作业 1.注释的应用 使用类的注释与方法的注释为前面编写的类与方法进行注释,并在Eclipse中查看.(截图) 2.面向对象设计(大作业1,非常重要) 2.1 将在网上 ...
- 201521123035 《Java程序设计》第九周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 题目5-1 1.常用异常 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现 ...
- 201521123009 《Java程序设计》第9周学习总结
1. 本周学习总结 2. 书面作业 本次PTA作业题集异常 Q1:常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现什么异常.需要捕获吗(为什么)?应如何 ...
- java类成员变量与代码块初始化
首先根据下面的这个一段代码:引入关于java初始化顺序的问题public class InitationTest extends Person { public InitationTest() { S ...
- 浅谈SQL优化入门:2、等值连接和EXPLAIN(MySQL)
1.等值连接:显性连接和隐性连接 在<MySQL必知必会>中对于等值连接有提到两种方式,第一种是直接在WHERE子句中规定如何关联即可,那么第二种则是使用INNER JOIN关键字.如下例 ...