zoukankan      html  css  js  c++  java
  • Mysql主从复制,读写分离

    一个简单完整的 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选项。)

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

     

    修改 slave.cnf

    Cnf代码 
    1. [mysqld]  
    2.   
    3. 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. 启动服务

    Cnf代码 
    1. # Master  
    2.   
    3. # 如果 Mysql 已启动,先关掉。  
    4.   
    5. /home/mysql/mysql/bin/mysqladmin -u root -p shutdown   
    6.   
    7. # 使用修改过的 master.cnf 启动 mysql  
    8.   
    9. /home/mysql/mysql/bin/mysqld_safe --defaults-file=/home/mysql/mysql/conf/master.cnf &   
    Java代码 
    1. # Slave  
    2.   
    3. # 如果 Mysql 已启动,先关掉。  
    4.   
    5. /home/mysql/mysql/bin/mysqladmin -u root -p shutdown   
    6.   
    7. # 使用修改过的 slave.cnf 启动 mysql  
    8.   
    9. /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 直接实现 读写分离。

    Java代码  收藏代码
    1. package prx.dao;  
    2.   
    3. import java.sql.Connection;  
    4. import java.sql.ResultSet;  
    5. import java.util.Properties;  
    6.   
    7. import com.mysql.jdbc.ReplicationDriver;  
    8.   
    9. public class Test {  
    10.   
    11.     public static void main(String[] args) throws Exception {  
    12.         ReplicationDriver driver = new ReplicationDriver();  
    13.   
    14.         Properties props = new Properties();  
    15.   
    16.         // We want this for failover on the slaves  
    17.         props.put("autoReconnect""true");  
    18.   
    19.         // We want to load balance between the slaves  
    20.         props.put("roundRobinLoadBalance""true");  
    21.   
    22.         props.put("user""foo");  
    23.         props.put("password""bar");  
    24.   
    25.         //    
    26.         // Looks like a normal MySQL JDBC url, with a  
    27.         // comma-separated list of hosts, the first  
    28.         // being the 'master', the rest being any number  
    29.         // of slaves that the driver will load balance against  
    30.         //    
    31.   
    32.         Connection conn = driver.connect(  
    33.                 "jdbc:mysql://master,slave1,slave2,slave3/test", props);  
    34.   
    35.         //    
    36.         // Perform read/write work on the master  
    37.         // by setting the read-only flag to "false"  
    38.         //  
    39.         // 通过 conn 的 readOnly 是否为 true 来判断,要取 connection 连接的数据库是 主数据库,还是从数据库  
    40.         // false 为 主数据库的连接  
    41.         // true 为 从数据库的连接  
    42.           
    43.         conn.setReadOnly(false);  
    44.   
    45.         conn.setAutoCommit(false);  
    46.         conn.createStatement().executeUpdate("UPDATE some_table ....");  
    47.         conn.commit();  
    48.   
    49.         //    
    50.         // Now, do a query from a slave, the driver automatically picks one  
    51.         // from the list  
    52.         //    
    53.   
    54.         conn.setReadOnly(true);  
    55.   
    56.         ResultSet rs = conn.createStatement().executeQuery(  
    57.                 "SELECT a,b FROM alt_table");  
    58.   
    59.     }  
    60. }  
    如果感觉不错,请 一个!
    by simpman
  • 相关阅读:
    C 语言指针小结
    NOIP2012 复赛考生须知!
    2012 NOIP 初赛复习指导
    16元的纸币
    记一次社会化的钓鱼攻击
    福州大学ACM代表队获36届ACMICPC全球总决赛第18名
    福州教育相关教育资源介绍
    世界末日:科普很重要啊~~~
    201212信息学奥林匹克竞赛,新生招募
    模拟人脑:这个事儿,闹大了
  • 原文地址:https://www.cnblogs.com/simpman/p/3183156.html
Copyright © 2011-2022 走看看