我们知道应用对数据库的訪问通常情况下大部分都是读操作,写仅仅占非常少一部分。因此读写分离(read-write-splitting)能有效减少主库压力,从而解决站点发展过程中遇到的第一次数据库瓶颈。

主从复制

首先必须开启master库的bin-log,由于mysql的主从复制是异步的。所以master库必须将更新操作记录下来以供slave库读取。

假设如今有A, B两台机器,A为master, B为slave。

Master

ssh至A服务器,登陆mysql, 创建一个复制专用用户repl

GRANT REPLICATION SLAVE ON *.* TO 'repl'@'B的IP' IDENTIFIED BY '111111';

改动my.cnf文件。开启bin-log并设置server-id:

[mysqld]
log-bin = /XXXX/mysql-bin.log
server-id = 1

重新启动mysql使配置生效。

然后设置读锁,确保在配置好slave库之前master库没有读写操作:

flush tables with read lock;

查看master库当前bin-log的文件名称和偏移量:

show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 | 1075 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

记下文件名称和偏移量。此时master已经停止了全部的数据更新操作,这时候我们要把master库的数据进行备份,然后还原到slave库中。推荐通过mysqldump命令完毕该操作。master备份完毕后就可以取消锁:

unlock tables;

Slave

ssh至B服务器,改动配置文件:

[mysqld]
server-id = 2

通过mysqld_safe启动从库。加入--skip-slave-start參数:

mysqld_safe --skip-slave-start

这样做的目的是不要让从库启动时就启动复制线程。由于我们还没有配置主库信息。

mysql> CHANGE MASTER TO
-> MASTER_HOST='主库地址',
-> MASTER_PORT=3306,
-> MASTER_USER='repl',
-> MASTER_PASSWORD='111111',
-> MASTER_LOG_FILE='mysql-bin.000002', -> MASTER_LOG_POS=1075;

启动slave线程:

start slave;

至此从库配置完毕。假设一切顺利的话,此时在主库运行一条更新操作,从库也会立即跟进。

假设发现有问题,能够运行

show slave status;

查看具体信息。

读写分离

眼下读写分离有两种方案:

  1. 控制应用程序,写操作连接主库,读操作连接从库。
  2. 引入数据库中间件。如官方的mysql-proxy

    优点是读写分离相应用程序全然透明,不须要对程序代码做不论什么改动。

    可是眼下mysql-proxy依旧仅仅有alpha版本号,而且官方也不推荐将其用在生产环境中。

事实上对于方案一另一个比較优雅的解决方式。那就是使用ReplicationDriver

MySQL的JDBC驱动中自带ReplicationDriver。它能够将JDBC中全部conn.setReadOnly(true)的连接路由到从库中,从而使得我们不必对程序代码动大手术。

配合Spring, 我们能够使用@Transactional(readOnly = true)注解。

由于MySQL主从复制有延迟,所以对于实时性要求高的操作,我们能够将readOnly设为false来让ReplicationDriver从主库中读取数据,这也是一种能够接受的方案。

配置演示样例:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.ReplicationDriver" />
<property name="url" value="jdbc:mysql:replication://主库IP:3306,从库IP:3306/test" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>

MySQL主从复制和读写分离的更多相关文章

  1. Mysql主从复制,读写分离(mysql-proxy),双主结构完整构建过程

    下面介绍MySQL主从复制,读写分离,双主结构完整构建过程,不涉及过多理论,只有实验和配置的过程. Mysql主从复制(转载请注明出处,博文地址:) 原理是master将改变记录到二进制日志(bina ...

  2. Mysql主从复制,读写分离

    一个简单完整的 Mysql 主从复制,读写分离的示意图. 1. 首先搭建 Mysql 主从架构,实现 将 mater 数据自动复制到 slave MySQL 复制的工作方式很简单,一台服务器作为主机, ...

  3. Mysql 主从复制,读写分离设置

    一个简单完整的 Mysql 主从复制,读写分离的示意图. 1. 首先搭建 Mysql 主从架构,实现 将 mater 数据自动复制到 slave MySQL 复制的工作方式很简单,一台服务器作为主机, ...

  4. mysql主从复制以及读写分离

    之前我们已经对LNMP平台的Nginx做过了负载均衡以及高可用的部署,今天我们就通过一些技术来提升数据的高可用以及数据库性能的提升. 一.mysql主从复制 首先我们先来看一下主从复制能够解决什么问题 ...

  5. Mysql主从复制,读写分离(mysql-proxy)

    Mysql主从复制,读写分离(mysql-proxy) 下面介绍MySQL主从复制,读写分离,双主结构完整构建过程,不涉及过多理论,只有实验和配置的过程. Mysql主从复制(转载请注明出处,博文地址 ...

  6. Linux下MySQL主从复制(GTID)+读写分离(ProxySQL)-实施笔记

    GTID概念: GTID( Global Transaction Identifier)全局事务标识.GTID 是 5.6 版本引入的一个有关于主从复制的重大改进,相对于之前版本基于 Binlog 文 ...

  7. MySQL 主从复制与读写分离 (超详细图文并茂小白闭着眼睛都会做)

    MySQL 主从复制与读写分离 1.什么是读写分离 2.为什么要读写分离 3.什么时候要读写分离 4.主从复制与读写分离 5.mysql支持的复制类型 6.主从复制的工作过程 7.MySQL主从复制延 ...

  8. 30.Mysql主从复制、读写分离

    Mysql主从复制.读写分离 目录 Mysql主从复制.读写分离 读写分离 读写分离概述 为什么要读写分离 什么时候要读写分离 主从复制与读写分离 mysql支持的复制类型 主从复制的工作过程 初始环 ...

  9. Windows操作系统下的MySQL主从复制及读写分离[转]

    mysql主从复制配置   保证主库和从库数据库数据一致 mysql主库MASTER配置(在my.cnf中加入以下配置):log-bin=master-binbinlog-do-db=test #需要 ...

  10. 重新学习Mysql数据13:Mysql主从复制,读写分离,分表分库策略与实践

    一.MySQL扩展具体的实现方式 随着业务规模的不断扩大,需要选择合适的方案去应对数据规模的增长,以应对逐渐增长的访问压力和数据量. 关于数据库的扩展主要包括:业务拆分.主从复制.读写分离.数据库分库 ...

随机推荐

  1. Unity引擎GUI之Button

    UGUI Button,可以说是真正的使用最广泛.功能最全面.几乎涵盖任何模块无所不用无所不能的组件,掌握了它的灵巧使用,你就几乎掌握了大半个UGUI! 一.Button组件: Interactabl ...

  2. C# 共享页调用css

    @RenderSection("Styles", required: false) @section Styles{ }

  3. C#--条形码和二维码的简单实现

    首先 简单的介绍一下条形码和二维码 条形码: 条形码技术是在计算机应用中产生发展起来的一种广泛应用于商业.邮政.图书管理.仓储.工业生产过程控制.交通运输.包装.配送等领域的自动识别技术.它最早出现在 ...

  4. Spark中Task,Partition,RDD、节点数、Executor数、core数目的关系和Application,Driver,Job,Task,Stage理解

    梳理一下Spark中关于并发度涉及的几个概念File,Block,Split,Task,Partition,RDD以及节点数.Executor数.core数目的关系. 输入可能以多个文件的形式存储在H ...

  5. BZOJ 1864: [Zjoi2006]三色二叉树 树形DP + 读入

    Description Input 仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色. 题解:本题大水 ...

  6. 原生js通过最外层id获取下面指定的子元素

    需求:在vue中使用v-for循环出来的元素,设置动态id,之后获取下面的所有textarea标签 template: <table cellpadding = 2 v-for="(i ...

  7. vue 路由跳转传参

    <li v-for="article in articles" @click="getDescribe(article.id)"> getDescr ...

  8. 纯CSS 3D翻转一个面(翻转导航菜单 立方体)

    在做练习的时候学到css的翻转导航菜单,原代码有点让人头疼,通过对其css的参数一点点研究了其实现过程. 这里推荐大家研究这个3D翻转动画的代码. 我的github:swarz,欢迎给老弟我++星星 ...

  9. 47.serch基本语法

    主要知识点 1._search api基本语法 2.http协议中get请求带上request body     一.search api的基本语法     1.GET /_search {所传递的参 ...

  10. vue 注册全局组件

    注册全局组件有啥好处呢? 提高代码的复用性:哪里需要写哪里,贼方便,就写一个标签:减少代码量:可以再配合slot一起使用,咦~~,舒服 为了让整个项目的可读性,我创建一个文件统一存放全局组件 1.创建 ...