一个简单完整的 Mysql 主从复制,读写分离的示意图。

1. 首先搭建 Mysql 主从架构,实现 将 mater 数据自动复制到 slave

MySQL 复制的工作方式很简单,一台服务器作为主机,一台或多台服务器作为从机。主机会把数据库的变化记录到日志。一旦这些变化被记录到日志,就会立刻(或者以设定的时间间隔)被送到从机。

使用MySQL 复制提供扩展大型网站的能力,这些大型网站的数据库主要是读操作(SELECTs)。从机用於复制主机的銷秏是很少的(通常每个从机1%的开销),在大型网站中每个主机部署30 个从机也是常见的。

异步复制与同步复制

异步复制:MySQL本身支持单向的、异步的复制。异步复制意味着在把数据从一台机器拷贝到另一台机器时有一个延时 – 最重要的是这意味着当应用系统的事务提交已经确认时数据并不能在同一时刻拷贝/应用到从机。通常这个延时是由网络带宽、资源可用性和系统负载决定的。然而,使用正确的组件并且调优,复制能做到接近瞬时完成。

同步复制:同步复制可以定义为数据在同一时刻被提交到一台或多台机器,通常这是通过众所周知的“两阶段提交”做到的。虽然这确实给你在多系统中保持一致性,但也由于增加了额外的消息交换而造成性能下降。

使用MyISAM或者InnoDB存储引擎的MySQL本身并不支持同步复制,然而有些技术,例如分布式复制块设备(简称DRBD),可以在下层的文件系统提供同步复制,允许第二个MySQL服务器在主服务器丢失的情况下接管(使用第二服务器的复本)。要了解更多信息,请参见:http://www.drbd.org/

 异步复制方案:

1. Mysql 数据库安装

安装过程省略: 详细参见:http://pengranxiang.iteye.com/admin/blogs/1138059

服务器 Master :192.168.14.131

Mysql 安装目录: /home/mysql/mysql   (使用源码安装,独立目录)

服务器 Slave    :192.168.14.132

Mysql 安装目录 :/home/mysql/mysql

2. 修改配置

为了不影响原来的配置文件: /etc/my.cnf

创建新的配置文件,

cp /etc/my.cnf  /home/mysql/mysql/conf/master.cnf

cp /etc/my.cnf  /home/mysql/mysql/conf/slave.cnf

修改 master.cnf,  增加下面的设置 ,

(官方说明:为了使用事务的InnoDB在复制中最大的持久性和一致性,你应该指定innodb_flush_log_at_trx_commit=1,sync_binlog=1选项。)

  1. log-bin=mysql-bin #slave会基于此log-bin来做replication
  2. server-id=1           #master的标示
  3. innodb_flush_log_at_trx_commit=1
  4. sync_binlog=1

修改 slave.cnf

  1. [mysqld]
  2. server-id=2 #slave的标示

/****************************************salve配置********************************/

server-id=2

log_bin = /var/log/mysql/mysql-bin.log

master-host =192.168.1.100

master-user=test

master-pass=123456

master-port =3306

master-connect-retry=60

replicate-do-db =test

/*************************************salve配置end**************************************/

3. 启动服务

  1. # Master
  2. # 如果 Mysql 已启动,先关掉。
  3. /home/mysql/mysql/bin/mysqladmin -u root -p shutdown
  4. # 使用修改过的 master.cnf 启动 mysql
  5. /home/mysql/mysql/bin/mysqld_safe --defaults-file=/home/mysql/mysql/conf/master.cnf &
  1. # Slave
  2. # 如果 Mysql 已启动,先关掉。
  3. /home/mysql/mysql/bin/mysqladmin -u root -p shutdown
  4. # 使用修改过的 slave.cnf 启动 mysql
  5. /home/mysql/mysql/bin/mysqld_safe --defaults-file=/home/mysql/mysql/conf/slave.cnf &

4. 在 Master 上创建一个专门用于复制的账号 repl_user

5. 启动主从复制功能

需要查看 Master 中的  Master status

mysql> show master status;

然后再 Slave 中,启动复制

上面窗口是连接 Master , 下面窗口连接 Slave

6. 测试复制

在 Master 中插入一条数据, 然后在 Slave 中查询。 可以验证。

2 简单的读写分离实现

读写分离可以直接在 客户端 实现, 也可以通过 代理服务器 实现。

代理服务器一般可以选择:

官方的:mysql proxy  地址:http://dev.mysql.com/downloads/mysql-proxy/#downloads

国产开源项目:amoeba

Amoeba开发者博客: http://amoeba.meidusa.com 

Amoeba开源项目地址: http://www.sourceforge.net/projects/amoeba 
amoeba 中文文档下载地址:http://amoeba.meidusa.com/amoeba.pdf

这里只演示最简单的方案: JDBC 直接实现 读写分离。

  1. package prx.dao;
  2. import java.sql.Connection;
  3. import java.sql.ResultSet;
  4. import java.util.Properties;
  5. import com.mysql.jdbc.ReplicationDriver;
  6. public class Test {
  7. public static void main(String[] args) throws Exception {
  8. ReplicationDriver driver = new ReplicationDriver();
  9. Properties props = new Properties();
  10. // We want this for failover on the slaves
  11. props.put("autoReconnect", "true");
  12. // We want to load balance between the slaves
  13. props.put("roundRobinLoadBalance", "true");
  14. props.put("user", "foo");
  15. props.put("password", "bar");
  16. //
  17. // Looks like a normal MySQL JDBC url, with a
  18. // comma-separated list of hosts, the first
  19. // being the 'master', the rest being any number
  20. // of slaves that the driver will load balance against
  21. //
  22. Connection conn = driver.connect(
  23. "jdbc:mysql://master,slave1,slave2,slave3/test", props);
  24. //
  25. // Perform read/write work on the master
  26. // by setting the read-only flag to "false"
  27. //
  28. // 通过 conn 的 readOnly 是否为 true 来判断,要取 connection 连接的数据库是 主数据库,还是从数据库
  29. // false 为 主数据库的连接
  30. // true 为 从数据库的连接
  31. conn.setReadOnly(false);
  32. conn.setAutoCommit(false);
  33. conn.createStatement().executeUpdate("UPDATE some_table ....");
  34. conn.commit();
  35. //
  36. // Now, do a query from a slave, the driver automatically picks one
  37. // from the list
  38. //
  39. conn.setReadOnly(true);
  40. ResultSet rs = conn.createStatement().executeQuery(
  41. "SELECT a,b FROM alt_table");
  42. }
  43. }

Mysql主从复制,读写分离的更多相关文章

  1. mysql主从复制-读写分离

    mysql主从复制+读写分离 环境:mysql主:193.168.1.1mysql从:193.168.1.2amoeba代理:193.168.1.3########################## ...

  2. mysql主从复制-读写分离-原理

    Mysql主从复制和读写分离 在实际的生产环境中,如果对mysql数据库的读和写都在一台数据库服务器中操作,无论是在安全性.高可用性,还是高并发等各个方面都是不能满足实际需求的.因此,一般通过主从复制 ...

  3. MySQL 主从复制&读写分离 简介

    1. 读写分离&读写分离 简介 主从同步延迟 分配机制 解决单点故障 总结 2. 主从复制&读写分离 搭建 搭建主从复制(双主) 搭建读写分离 1. 读写分离&读写分离 简介 ...

  4. Mycat+MySql 主从复制-读写分离 看这一篇就够了

    ​ 通过mycat和mysql的主从复制配合搭建数据库的读写分离,可以实现mysql的高可用性,下面我们来搭建mysql的读写分离. 1.一主一从 1.在node01上修改/etc/my.cnf的文件 ...

  5. mysql主从复制+读写分离 菜鸟入门

    MYsql主从复制 1.mysql主从复制原理: Master将数据变化记录到二进制日志中[binary log] Slave将master的二进制日志[binary log]拷贝到自己的中继日志[r ...

  6. MYSQL 主从复制,读写分离(8)

    Mysql 数据库的主从复制方案,是其自带的功能,并且主从复制并不是复制磁盘上的数据文件,而是通过binlog日志复制到需要同步的服务器上. 一 主从复制的原理实现 原理图解说: 数据库更改 生成数据 ...

  7. Mycat实现mysql主从复制(读写分离)

    数据库性能瓶颈主要原因: 随着用户数的增多,带来的是数据库连接的大幅度增长 随着业务体量的增长,表数据量(空间存储的问题)的大幅增长,其中涉及到索引的优化,mysql默认的索引是硬盘级别的,BTREE ...

  8. Mysql主从复制读写分离

    一.前言:为什么MySQL要做主从复制(读写分离)?通俗来讲,如果对数据库的读和写都在同一个数据库服务器中操作,业务系统性能会降低.为了提升业务系统性能,优化用户体验,可以通过做主从复制(读写分离)来 ...

  9. MySQL主从复制&读写分离&分库分表

    MySQL主从复制 MySQL的主从复制只能保证主机对外提供服务,从机是不提供服务的,只是在后台为主机进行备份数据 首先我们说说主从复制的原理,这个是必须要理解的玩意儿: 理解: MySQL之间的数据 ...

  10. MySQL主从复制读写分离如何提高从库性能-实战

    在做主从读写分离时候,需要注意主从的一些不同参数设置,来提高从库的性能,提高应用读取数据的速度,这样做很有必要的. 做读写分离复制主从参数不同设置如下(需要根据自己应用实际情况来设置): parmet ...

随机推荐

  1. BSEG和BSIS、BSAS、BSID、BSAD、BSIK、BSAK六个表的关系(转)

    BSEG和BSIS.BSAS.BSID.BSAD.BSIK.BSAK 六个表的关系 1.数据关系: BSAS+BSIS+BSAK+BSIK+BSAD+BSID = BSEG 2.六个表说明: clea ...

  2. ueditor编辑器图片自定义存放目录及路径修改

    百度编辑器ueditor功能强大,很多人士以应用项目开发中,但是里面有一个公众的问题就是上传图片存放目录太深,默认是ueditor/php/upload下,前不久测试后图片存放目录可以改变,但是路径会 ...

  3. 微软称iPad版Office必来临 目前在完善中

    [PConline 资讯]微软在今年6月份的时候面向iPhone发布了Office,同时需要用户注册Office 365.而鲍尔默今天在参加Garnter科技研讨会时透露,iPad版本的Office始 ...

  4. 在Excel中创建和使用ServerDocument

    ServerDocument是微软提供的一种读取Word或Excel文档级应用中CachedData的工具.本示例将向你展示如何使用用ServerDocument. 1.      创建文档级应用 打 ...

  5. FPGA的JTAG下载问题

    前两天做一个工频信号源项目,连续出现两块FPGA板JTAG编程failed现象,不知道原因.网上搜索了下,有帖子说如果是JTAG损坏了,用表笔打TCK,TMS,TDI,TDO,看是否存在和GND短接, ...

  6. [Redux] Filtering Redux State with React Router Params

    We will learn how adding React Router shifts the balance of responsibilities, and how the components ...

  7. GDB 调试程序系列

    http://blog.csdn.net/haoel/article/category/9197

  8. (转载)github简单使用教程

    github是一个基于git的代码托管平台,付费用户可以建私人仓库,我们一般的免费用户只能使用公共仓库,也就是代码要公开.对于一般人来说公共仓库就已经足够了,而且我们也没多少代码来管理,O(∩_∩)O ...

  9. AndroidStudio怎么将开源项目发布到jcenter

    前言 自己在网上搜了一大堆,大体就两种方法,而我选择的是其中代码少的的方法,不过他们或多或少留下了少许的坑,(按他们的方法我是上传成功,但不能发布到jCenter上去,也可能是我自己的问题o(≧v≦) ...

  10. angularjs 更新局部作用域

    前几天项目需要,做了一个背景遮罩的弹出框,html采用js动态添加进去的,结果发现angularjs绑定在这里面不起作用,搜索下解决了,记录下: var smallApplyParent = docu ...