为什么MySQL要做主从复制(读写分离)?

通俗来讲,如果对数据库的读和写都在同一个数据库服务器中操作,业务系统性能会降低。 
为了提升业务系统性能,优化用户体验,可以通过做主从复制(读写分离)来减轻主数据库的负载。 
而且如果主数据库宕机,可快速将业务系统切换到从数据库上,可避免数据丢失。

MySQL主从复制(读写分离)和集群的区别:

我对MySQL也是刚开始研究,不是很专业。我的理解是:

主从复制(读写分离):

一般需要两台及以上数据库服务器即可(一台用于写入数据,一台用于同步主的数据并用于数据查询操作)。 
局限性:

配置好主从复制之后,同一张表,只能对一个服务器写操作。如果在从上执行了写操作,而之后主也操作了这张表,或导致主从不同步;据说可以配置成主主方式,但我还没有研究到。

主数据库服务器宕机,需要手动将业务系统切换到从数据库服务器。无法做到高可用性(除非再通过部署keepalive做成高可用方案)。

集群是由N台数据库服务器组成,数据的写入和查询是随机到任意一台数据库服务器的,其他数据库服务器会自动同步数据库的操作。

任何一台数据库宕机,不会对整个集群造成大的影响。

局限性

我经过测试才知道目前mysql集群版本(MySQL Cluster)只能对NDB存储引擎的数据进行集群同步,如果是INNODB或其他的MySQL存储引擎是不行的。这个也导致了我放弃了在业务系统中应用这种方案。

回归正题

MySQL5.6开始主从复制有两种方式:基于日志(binlog);基于GTID(全局事务标示符)。 
需要注意的是:GTID方式不支持临时表!所以如果你的业务系统要用到临时表的话就不要考虑这种方式了,至少目前最新版本MySQL5.6.12的GTID复制还是不支持临时表的。 
所以此篇教程主要是告诉大家如何通过日志(binlog)方式做主从复制! 
Master :192.168.15.141 
Slave:192.168.15.142 
如何安装mysql我就不细说了,请看linux下安装mysql

配置文件

master

  1.  
    vi /etc/my.cnf
  2.  
    [mysqld]
  3.  
    server-id = 1
  4.  
    log-bin innodb_flush_log_at_trx_commit=1
  5.  
    sync_binlog=1
  6.  
    datadir=/var/lib/mysql
  7.  
    character-set-server=utf8
  8.  
    init_connect='SET NAMES utf8'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

什么是sync_binlog? 
当每个sync_binlog’th写入该二进制日志后,MySQL服务器将它的二进制日志同步到硬盘上(fdatasync())。请注意如果在autocommit模式,每执行一个语句向二进制日志写入一次,否则每个事务写入一次。 默认值是0,不与硬盘同步。值为1是最安全的选择,因为崩溃时,你最多丢掉二进制日志中的一个语句/事务;但是,这是最慢的选择(除非硬盘有电池备份缓存,从而使同步工作较快)。 
slave:

  1.  
    server-id=2
  2.  
    datadir=/var/lib/mysql
  3.  
    character-set-server=utf8
  4.  
    init_connect='SET NAMES utf8'
  • 1
  • 2
  • 3
  • 4

在master数据库设置用来同步的slave用户权限

启动数据库

[root@localhost ~]# service mysqld start
  • 1

进入mysql

  1.  
    [root@localhost ~]# mysql -uroot -p123456
  2.  
    mysql> GRANT REPLICATION SLAVE ON *.* TO '<root>'@'<192.168.15.142>' IDENTIFIED BY '<123456>';
  3.  
    Query OK, 0 rows affected (0.10 sec)
  • 1
  • 2
  • 3
  • 4

主数据库锁表(禁止再插入数据以获取主数据库的的二进制日志坐标)

>FLUSH TABLES WITH READ LOCK;
  • 1

在主数据库上使用mysqldump命令创建一个数据快照

[root@localhost ~]# mysqldump -u root -pnew-password  --databases drp > /root/test.sql
  • 1

解锁第(2)步主数据的锁表操作

SSH登录到从数据库

通过FTP、SFTP或其他方式,将上一步备份的主数据库快照all.sql上传到从数据库某个路径,例如我放在了/root/目录下;

从导入主的快照

  1.  
    [root@localhost ~]# mysql -uroot -p -h127.0.0.1 -P3306< test.sql
  2.  
    Enter password:
  3.  
    You have mail in /var/spool/mail/root
  • 1
  • 2
  • 3
  • 4

给从数据库设置复制的主数据库信息(注意修改MASTER_LOG_FILE和MASTER_LOG_POS的值)

MASTER_LOG_FILE和MASTER_LOG_POS在主数据中查看

  1.  
    mysql> CHANGE MASTER TO MASTER_HOST='192.168.15.141',MASTER_USER='root',MASTER_PASSWORD='new-password',MASTER_LOG_FILE='mysqlmaster-bin.000001',MASTER_LOG_POS=3931
  2.  
    mysql> START slave;
  3.  
    Query OK, 0 rows affected (0.74 sec)
  • 1
  • 2
  • 3
  • 4

查看重数据库的状态

mysql> SHOW slave STATUS \G
  • 1

如果下面两个参数都是Yes,则说明主从配置成功! 
 
slave_sql_running:负责自己的slave mysql进程 
Slave_IO_Running:负责与主机的io通信 
查看报错: 
Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the –replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it). 
意思就是从上的server_id和主的一样的,经查看发现从上的/etc/my.cnf中的server_id=1这行我没有注释掉(在下面复制部分我设置了server_id),于是马上把这行注释掉了,然后重启mysql,发现还是报同样的错误。 
解决方案: 
查看主从数据库中my.conf的server_id是否重复,如果重复,改一下再重启。 
这样当主数据库插入数据,新建表或者创建数据库时,就可以自动同步到从数据库了~

为什么mysql要做主从复制?的更多相关文章

  1. 使用 Xtrabackup 在线对MySQL做主从复制【转】

    1. 说明 1.1 xtrabackup mysqldump对于导出10G以下的数据库或几个表,还是适用的,而且更快捷.一旦数据量达到100-500G,无论是对原库的压力还是导出的性能,mysqldu ...

  2. Mysql主从(主从不同步解决办法,常见问题及解决办法,在线对mysql做主从复制)

    一.主从不同步解决办法 先上Master库: mysql>show processlist; 查看下进程是否Sleep太多.发现很正常. show master status; 也正常. mys ...

  3. 使用 Xtrabackup 在线对MySQL做主从复制

    1. 说明 1.1 xtrabackup mysqldump对于导出10G以下的数据库或几个表,还是适用的,而且更快捷.一旦数据量达到100-500G,无论是对原库的压力还是导出的性能,mysqldu ...

  4. Mysql的ssl主从复制+半同步主从复制

    Mysql的ssl主从复制+半同步主从复制 准备工作 1.主从服务器时间同步 [root@localhost ~]# crontab -e */30 * * * * /usr/sbin/ntpdate ...

  5. MySQL 5.7主从复制从零开始设置及全面详解——实现多线程并行同步,解决主从复制延迟问题!

    MySQL 5.7主从复制从零开始设置及全面详解——实现多线程并行同步,解决主从复制延迟问题!2017年06月15日 19:59:44 蓝色-鸢尾 阅读数:2062版权声明:本文为博主原创文章,如需转 ...

  6. 高可用Mysql架构_Mysql主从复制、Mysql双主热备、Mysql双主双从、Mysql读写分离(Mycat中间件)、Mysql分库分表架构(Mycat中间件)的演变

    [Mysql主从复制]解决的问题数据分布:比如一共150台机器,分别往电信.网通.移动各放50台,这样无论在哪个网络访问都很快.其次按照地域,比如国内国外,北方南方,这样地域性访问解决了.负载均衡:M ...

  7. MySQL 5.5 主从复制

    MySQL 5.5 主从复制的原理.过程   分为同步复制和异步复制,实际复制架构中大部分为异步复制.复制的基本过程如下:  1).Slave上面的IO进程连接上Master,并请求从指定日志文件的指 ...

  8. Mysql架构之主从复制

    author:JevonWei 版权声明:原创作品 主从复制架构 架构角色 mysql-master:192.168.198.139 mysql-slave:192.168.198.128 主数据库和 ...

  9. mysql数据库之主从复制+双主--MMM

    mysql复制:在主数据库中,前端用户每执行一个写操作/语句,都会在二进制日志中保存一个事件,把这个事件从mysql的服务器中3306端口发送给从服务器,从服务器把这个事件接受下来,接受下来先保存在本 ...

随机推荐

  1. redis集群与分片(2)-Redis Cluster集群的搭建与实践

    Redis Cluster集群 一.redis-cluster设计 Redis集群搭建的方式有多种,例如使用zookeeper等,但从redis 3.0之后版本支持redis-cluster集群,Re ...

  2. java 拦截器、过滤器、监听器

    一.理解Struts2拦截器 1. Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现. 2. ...

  3. SQL 集合例子

    IF OBJECT_ID('tempdb..#Purchase', 'U') IS NOT NULL DROP TABLE #Purchase; CREATE TABLE #Purchase ( Pu ...

  4. 使用Visual Studio 2010打造C语言编译器

    相信学习C语言的同学们一直在为自己的windows7不能用vc 6.0而烦恼着.或许有的电脑能使用上,但绝大多数是不能的,而且会出现软件不能兼容的提醒.其实大家都不需要再使用vc6.0了,因为软件更新 ...

  5. Flume - 快速入门

    关于Flume,官方定义如下: Apache Flume is a distributed, reliable, and available system for efficiently collec ...

  6. Java学习--javabean

  7. Spring 核心组件总结

    spring核心组件总结 spring介绍 spring概念 IOC: Inverse Of Control 控制反转 ​ 将我们创建对象的方式反转了,以前创建对象是由我们开发人员自己维护,包括依赖注 ...

  8. python 中迭代和遍历的区别

    什么是迭代? 迭代就是重复运行一段代码语句块的能力.分为两种方式 使用递归函数 使用循环(for 或 while 循环) 假设有个需求,要按照降序打印10以下(包括10),0 以上的整数,用递归和循环 ...

  9. Windows标准控件

    学习目的 学习创建, 使用Windows标准控件(按钮, 滚动条, 静态控件, 列表框, 编辑框, 组合框); 学习使用子窗口控件操作函数(EnableWindow, MoveWindow, SetW ...

  10. Differences between write through and write back

    https://stackoverflow.com/questions/27087912/write-back-vs-write-through