MySQL复制介绍及搭建
MySQL复制介绍
MySQL复制就是一台MySQL服务器(slave)从另一台MySQL服务器(master)进行日志的复制然后再解析日志并应用到自身,类似Oracle中的Data Guard。
MySQL复制有那些好处:
- 第一是解决宕机带来的数据不一致,因为MySQL复制可以实时备份数据;
- 第二点是减轻数据库服务器的压力,多台服务器的性能一般比单台要好。但是MySQL复制不适合大数据量,大数据量推荐使用集群。
MySQL复制过程分成三步:
- master将改变记录到二进制日志(binary log)。这些记录过程叫做二进制日志事件,binary log events;
- slave将master的binary log events拷贝到它的中继日志(relay log);
- slave重做中继日志中的事件,将改变应用到自己的数据库中。 MySQL复制是异步的且串行化的
MySQL复制原理图
MySQL复制搭建
环境准备
master 192.168.1.5
slave 192.168.1.6
OS:Oracle Linux 6.1
MySQL:5.5.37
Master配置
1)分配复制权限
主库和从库均需要执行
mysql> grant replication client,replication slave on *.* to root@'192.168.1.%' identified by 'root';
Query OK, 0 rows affected (0.00 sec)
2)清空日志文件
主从库都是默认开启二进制日志文件
mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 26636 |
| mysql-bin.000002 | 1069399 |
| mysql-bin.000003 | 26636 |
| mysql-bin.000004 | 1069399 |
| mysql-bin.000005 | 536 |
+------------------+-----------+
5 rows in set (0.00 sec)
mysql> reset master;
Query OK, 0 rows affected (0.01 sec)
mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 107 |
+------------------+-----------+
1 row in set (0.00 sec)
需要注意的是,如果不想清空日志文件的话,需要记录当前master的log_file和log_pos,并在下面启用复制操作时指定这两个参数或者在slave的配置文件指定。
Slave设置
1) 修改从服务器server-id
# vim /etc/my.cnf
server-id = 2
修改完以后需要重启数据库
2)清空日志文件,同Master
3)启用复制
让slave连接master并开始重做master二进制日志中的事件
mysql> change master to
master_host='192.168.1.5',master_user='root',master_password='root',master_port=3306,master_log_file='mysql-bin.000001',master_log_pos=0;
master_log_pos的值为0,因为它是日志的开始位置;master_log_file是初始日志文件。如果master日志没有被清空,这里就是当前master的日志信息
需要注意的是,默认情况下,会同步该用户下所有的DB,如果想限定哪些DB,有3种思路
- 在master上的/etc/my.inf中通过参数binlog-do-db、binlog-ignore-db设置需要同步的数据库。
- 在执行grant分配权限操作的时候,限定数据库
- 在slave上限定数据库使用replicate-do-db=dbname
4)开启slave
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
5)确认Slave是否和Mater成功通信。如果 Slave_IO_Running和Slave_SQL_Running都是yes,则证明配置成功
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.5
Master_User: root
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 107
Relay_Log_File: rac-node2-relay-bin.000002
Relay_Log_Pos: 253
Relay_Master_Log_File: mysql-bin.000001
**Slave_IO_Running: Yes**
**Slave_SQL_Running: Yes**
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 107
Relay_Log_Space: 413
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
1 row in set (0.00 sec)
测试
Master创建数据库
mysql> create database d;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| d |
| mysql |
| performance_schema |
| test |
+--------------------+
Slave查看数据库已同步
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| d |
| mysql |
| performance_schema |
| test |
+--------------------+
Master创建表插入数据
mysql> use d
mysql> create table t(id int);
mysql> insert into t values(1);
mysql> commit;
Slave查看
mysql> use d;
mysql> show tables;
mysql> select * from t;
+------+
| id |
+------+
| 1 |
+------+
通过以上验证,可以看到主服务器上的修改能够正常同步到从服务器。
补充说明
1)做了MySQL主从复制以后,使用mysqldump对数据备份时,一定要注意按照如下方式:
mysqldump –master-data –single-transaction –user=username –password=password dbname> dumpfilename
这样就可以保留file和position的信息,在新搭建一个slave的时候,还原完数据库,file和position的信息也随之更新,接着再start slave 就可以很迅速的完成增量同步。
其他复制方式
主主复制
master-slave只能进行单向操作,像网络中的半双工。master-master可以实现服务器之间互相同步,且主主复制可以避免出现单点故障后整个系统宕机。主主复制最大的问题就是数据插入或更新冲突。配置方法同主从复制,反过来让slave同步master。注意master_log_file和master_log_pos参数要与master上对应。具体可以参考这里
单一master和多slave
由一个master和多个slave组成的复制系统比较简单。slave之间并不互相通信,只能与master通信。如果写操作较少,读操作很多,可以采用。可以将读操作分布到其他slave,从而减轻master的压力。但slave增加到一定数量时,slave对master的负载以及网络带宽都会成为问题。
主从多级复制
读操作很多可以采用单一maste和多slave,但增大到一定slave后连到master的slaveIO线程太多会造成master压力增大,从而造成数据复制延时。多级复制就是为了解决这个问题。如果想实现主-从(主)-从多级复制,需要设置log-slave-updates参数。同时二进制日志也必须启用。
mysql多级复制
当然,增加复制的级联层次,同一个变更传到最底层的Slave所需要经过的MySQL也会更多,同样可能造成延时较长的风险。如果条件允许,倾向于通过拆分成多个Replication集群来解决。
参考:
http://heylinux.com/archives/1004.html
http://blog.csdn.net/hguisu/article/details/7325124
MySQL复制介绍及搭建的更多相关文章
- MySQL 复制介绍及搭建
MySQL复制介绍 MySQL复制就是一台MySQL服务器(slave)从另一台MySQL服务器(master)进行日志的复制然后再解析日志并应用到自身,类似Oracle中的Data Guard. M ...
- 深入MySQL复制(一)
本文非常详细地介绍MySQL复制相关的内容,包括基本概念.复制原理.如何配置不同类型的复制(传统复制)等等.在此文章之后,还有几篇文章分别介绍GTID复制.半同步复制.实现MySQL的动静分离,以及M ...
- MYSQL 复制详解
MySql 复制介绍 MySQL复制允许将主实例(master)上的数据同步到一个或多个从实例(slave)上,默认情况 下复制是异步进行的,从库也不需要一直连接到主库来同步数据 MySQL复制的数据 ...
- 转mysql复制主从集群搭建
最近搭了个主从复制,中间出了点小问题,排查搞定,记录下来 1环境:虚拟机:OS:centos6.5Linux host2 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 ...
- 生产环境搭建MySQL复制的教程(转)
[导读] 网络上有很多关于MySQL复制搭建的步骤和范例,以及手册上有一章完整的篇幅,讲述MySQL复制的原理.搭建步骤.优化等,但依然存在很多刚开始学习MySQL知识或者刚进入DBA行业的朋友咨询, ...
- 搭建MHA环境【2】安装mysql-5.6 + mysql复制
本例中mysql的安装方式选用了二进制包安装方案.mysql复制用半同步复制方案 [1]安装mysql-5.6.31 要在所有的数据节点上都安装上mysql,安装方式大致相同,所以我这里就不重复写多次 ...
- 快速搭建MySQL复制集
快速搭建MySQL复制集 1 环境说明 MySQL版本 5.6 basedir :/u01/my3306 #MySQL软件目录 数据目录 :/u01/mysql/[实例名]/data 日志目录 :/u ...
- MySQL复制异常大扫盲:快速溯源与排查错误全解
MySQL复制异常大扫盲:快速溯源与排查错误全解https://mp.weixin.qq.com/s/0Ic8BnUokyOj7m1YOrk1tA 作者介绍王松磊,现任职于UCloud,从事MySQL ...
- MySQL复制以及调优
一. 简介 MySQL自带复制方案,带来好处有: 数据备份. 负载均衡. 分布式数据. 概念介绍: 主机(master):被复制的数据库. 从机(slave):复制主机数据的数据库. 复制步骤: (1 ...
随机推荐
- SpringBoot中的@ConfigurationProperties
有什么用 该注解的作用类似于@Value,即为组件中的属性进行赋值. 怎么用 首先是建立一个springboot的工程,不再赘述. 首先我们建立一个Person类和一个Dog类. package co ...
- springboot2.1.8使用poi导出数据生成excel(.xlsx)文件
前言:在实际开发中经常需要将数据库的数据导出成excel文件,poi方式则是其中一种较为常用的导出框架.简单读取excel文件在之前的一篇有说明 本项目实现需求:user发出一个导出student信息 ...
- handy网络库源码阅读
简洁易用的C++11网络库,From:https://github.com/yedf/handy 在整理过去的资料过程中,发现过去有关注过这一个网络库,简单看了一下属于轻量级的实现,因此本文将对该库进 ...
- 有关kali更新源时出现的GPG数字证书无效提示的解决方法
下载并导入key文件 wget -O - https://archive.kali.org/archive-key.asc |apt-key add 显示ok表示成功导入key,然后再进行之后的其他步 ...
- 路由Routers
路由Routers 对于视图集ViewSet,我们除了可以自己手动指明请求方式与动作action之间的对应关系外,还可以使用Routers来帮助我们快速实现路由信息. REST framework提供 ...
- Spring Cloud--服务的发布与调用示例
[Provider] 引依赖: 启动类上添加注解: 配置文件: [Consumer] 引依赖: 加注解: 配置文件: 调用服务: 方式一(动态获取服务列表): Eureka默认30秒拉取一次服务列表. ...
- 网页中插入Flash动画(.swf)代码和常用参数设置
我们现在大部分人做网页,都是直接用DW插入flash,而且DW也是所见即所得,直接生成了相应的flash显示代码.可是我们又有多少人了解这些直接由DW生成的代码呢?其实我接触flash player标 ...
- vue页面params传值的必须传name
a.vue向b.vue传值 a.vue this.$router.push({ path: '/payType', query: { putUpList: this.putUpList, name:' ...
- java之hibernate之helloworld
这篇文章,会一步一步的演示hibernate的使用. 目录结构如下: 1.新建java项目 2.增加一个lib文件夹,并把 hibernate必须的jar包 和 数据库驱动包 一起复制进去 然后把hi ...
- springboot笔记08——整合swagger2
Swagger是什么? Swagger是一个RESTFUL 接口的文档在线自动生成和功能测试的框架.利用swagger2的注解可以快速的在项目中构建Api接口文档,并且提供了测试API的功能. Spr ...