一个简单完整的 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程序员面试笔试宝典》之volatile有什么作用

    在由Java语言编写的程序中,有时候为了提高程序的运行效率,编译器会自动对其进行优化,把经常被访问的变量缓存起来,程序在读取这个变量的时候有可能会直接从缓存(例如寄存器)中来读取这个值,而不会去内存中 ...

  2. JQuery DOM 有关代码练习

    //累加你选择的个数 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <hea ...

  3. Hacker(14)----扫描目标计算机端口

    端口是目前计算机与外界的通道,因而黑客一旦锁定目标计算机,便会扫描该计算机中已经开放的端口,从而得到更多的有用信息.扫描目标计算机端口一般使用SuperScan.X-Scan等. 一.端口扫描原理 扫 ...

  4. EffectiveC#17--装箱和拆箱的最小化

    1.如下这段代码会经历装箱和拆箱.例如25会先装箱成object后传递给writeline方法(一次拷贝),在方法内部又 经历拆箱成int(第二次拷贝)后然后调用tostring(). Console ...

  5. css-布局1-基本属性

    <!DOCTYPE html>CSS4-布局1-基本属性 属性:displayvisibilityfloatclear HTML元素类型:行内元素,块级元素 块级元素:最大的区别:换行行内 ...

  6. 疯狂安卓Android自学笔记

    开发者必备自学工具: 谷歌搜索:www.yundou.info Android原版开发文档 (英文) Doc http://www.phoned.cn/docs/reference/android/v ...

  7. mysql忘记密码时如何修改root用户密码

    1.关闭正在运行的MySQL服务. 2.打开DOS窗口,转到mysql\bin目录. 3. 输入mysqld --skip-grant-tables 回车.--skip-grant-tables 的意 ...

  8. 本地计算机上的OracleOraDb11g_home2TNSListener服务启动又停止了。

    电脑上装了oracle后启动很慢,然后我就不oracle服务设置成手动启动,没想到今天启动的时候居然报错 折腾了一上午,终于搞定, 在环境变量中把ORACLE_HOME 设置成D:\app\XL\pr ...

  9. 自定义tableviewCell的分割线

    第一种:addsubview UIView *line = [[UIView alloc]initWithFrame:CGRectMake(10, cellH-0.5, DEVW-10, 0.5)]; ...

  10. automaticallyAdjustsScrollViewInsets的作用

    简单点说就是automaticallyAdjustsScrollViewInsets根据按所在界面的status bar,navigationbar,与tabbar的高度,自动调整scrollview ...