一个简单完整的 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的标示

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的主从复制,之前一直在听说这个话题,一直没有实现,昨天学习了下,原来是这么回事: 既然是主从复制,那么肯定有主有从,也就说一个主数据库(一般为写库),一个从数据库(读库).主数据库更新了 ...

  2. Mysql数据库主从复制搭建

    Mysql数据库主从复制原理: 主库开启bin-log日志,同时生成IO线程.IO线程负责将用户写入数据库的sql语句记录在二进制日志bin-log,该记录过程可并发进行:生成标识号 server i ...

  3. mysql 主从复制原理

    主从形式   mysql主从复制 灵活 一主一从 主主复制 一主多从---扩展系统读取的性能,因为读是在从库读取的: 多主一从---5.7开始支持 联级复制---     用途及条件   mysql主 ...

  4. [转]MySQL主从复制原理介绍

    MySQL主从复制原理介绍 一.复制的原理 MySQL 复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新.删除等等).每个从服务器从主服务器接收主服务器已经记录到其二进制日志的保存的更新,以 ...

  5. Mysql中主从复制的原理、配置过程以及实际案例

    Mysql中主从复制的原理.配置过程以及实际案例1.什么是主从复制?原理:主从分离,什么意思呢?我们不妨画个图看看.如图1所示: 2.准备工作:预备两台服务器,我这里使用虚拟机安装了两个Centos6 ...

  6. Mysql主从复制原理及配置

    Mysql主从复制原理及配置 1.复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其 ...

  7. MySQL主从复制--原理

    简介 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一 ...

  8. MySQL(4):主从复制原理

    1.主从复制概述 MySQL主从复制也可以称为MySQL主从同步,它是构建数据库高可用集群架构的基础.它通过将一台主机的数据复制到其他一台或多台主机上,并重新应用relay log中的SQL语句来实现 ...

  9. mysql 主从复制原理(转)

    本文转自https://blog.csdn.net/php_younger/article/details/59673879 mysql 主从复制原理 主从形式   mysql主从复制 灵活 一主一从 ...

随机推荐

  1. 《Java程序员面试笔试宝典》之为什么Java中有些接口没有任何方法

    由于Java不支持多重继承,即一个类只能有一个父类,为了克服单继承的缺点,Java语言引入了接口这一概念.接口是抽象方法定义的集合(接口中也可以定义一些常量值),是一种特殊的抽象类.接口中只包含方法的 ...

  2. [Hapi.js] Managing State with Cookies

    hapi has built-in support for parsing cookies from a request headers, and writing cookies to a respo ...

  3. IOS 怎么修改Navigation Bar上的返回按钮文本颜色,箭头颜色以及导航栏按钮的颜色

    self.navigationController.navigationBar.barTintColor = [UIColor blackColor]; self.navigationControll ...

  4. ZOJ 3329 One Person Game 带环的概率DP

    每次都和e[0]有关系 通过方程消去环 dp[i] = sigma(dp[i+k]*p)+dp[0]*p+1 dp[i] = a[i]*dp[0]+b[i] dp[i] = sigma(p*(a[i+ ...

  5. iocomp控件的应用

    iocomp是一个强大的工业控件.适用于vb/vc/vs.net/Delphi/BCB(windows/linux).囊括了常见的工业控制控件,详见官网说明,源码能够到官网下载,也能够到我的资源库下载 ...

  6. 域名解析 URL转发

    URL转发 转发功能:如果您没有一台独立的服务器(也就是没有一个独立的IP地址)或者您还有一个域名B,您想访问A域名时访问到B域名的内容,这时您就可以通过URL转发来实现.url转发可以转发到某一个目 ...

  7. Firebase远程更新应用

    能打造出色的应用不意味着一定能在商业上取得成功,两者之间还有许多工作要做,绝不能简单发布应用后就宣告“收工”.您需要能迅速根据用户反馈作出调整.测试新功能,以及向用户提供他们最关注的内容. Fireb ...

  8. Hacker(六)----黑客藏匿之地--系统进程

    windows系统中,进程是程序在系统中的依次执行活动.主要包括系统进程和程序进程两种. 凡是用于完成操作系统各种功能的各种进程都统称为系统进程: 而通过启动应用程序所产生的进程则统称为程序进程. 由 ...

  9. 解决jquery和其他库的冲突

    一.jquery在其他库之后导入 (1)jQuery.noConflict();  //将变量的$控制权转交给其他库.          jQuery(function(){             ...

  10. hadoop启动守护进程报JAVA_HOME is not set and could not be found

    hadoop启动守护进程 sbin/start-dfs.sh 报如下错误:JAVA_HOME is not set and could not be found 解决办法(JAVA_HOME修改为具体 ...