zoukankan      html  css  js  c++  java
  • Windows下搭建MySQL Master Slave

    一、背景

    服务器上放了很多MySQL数据库,为了安全,现在需要做Master/Slave方案,因为操作系统是Window的,所以没有办法使用keepalived这个HA工具,但是我们可以接受人工进行切换,有什么好的方案呢?

    二、几种Master/Slave逻辑架构图

    clip_image001

    (Figure1:单Master-单Slave)

    clip_image002

    (Figure2:单Master-多Slave)

    clip_image004

    (Figure3:单Master-级联Slave)

    clip_image006

    (Figure4:Master/Slave部署逻辑图)

    三、搭建过程

    环境:Windows Server 2008 R2 + mysql-5.5.22-winx64

    主服务器(Master):192.168.1.66

    从服务器(Slave):192.168.1.67

    使用Master/Slave架构,Slave为只读模式;

    (一) 配置主服务器(Master)

    1. 编辑数据库配置文件my.ini,在[mysqld]标签下面加入下面代码:

    log-bin=mysql-bin

    server-id=1

    innodb_flush_log_at_trx_commit=1

    sync_binlog=1

    binlog_do_db=barfoo_weibo_hottop

    binlog_ignore_db=mysql

    说明:

    1) log-bin=mysql-bin启用Binary Log,会在数据文件夹中生成一系列的滚动文件,类似:mysql-bin.000002

    2) server-id=1中的1可以任定义,只要是唯一的就行,为了与其它Master和Slave进行区别;

    3) innodb_flush_log_at_trx_commit = 0,每秒写一次trax log,并执行fsync;

    innodb_flush_log_at_trx_commit = 1,每次trax 提交的时候写一次trax log, 并执行fsync;

    innodb_flush_log_at_trx_commit = 2,每次trax 提交的时候写一次trax log, 不会执行fsync;

    4) sync_binlog=1表示异步进行日志记录;

    5) binlog_do_db=barfoo_weibo_hottop是表示只对数据barfoo_weibo_hottop做日志记录,如果想记录多个数据库,添加多几条binlog_do_db就可以了;

    6) binlog_ignore_db=mysql表示忽略备份mysql;不加binlog_do_db和binlog_ignore_db,那就表示备份全部数据库。

    2. 重启MySQL服务

    3. 在Master服务器新建一个用户赋予“REPLICATION SLAVE”的权限,你不需要再赋予其它的权限,这里指定的IP为Slave的IP;

    mysql>CREATE USER viajar@'192.168.1.67' IDENTIFIED BY 'BarFoo2013';

    mysql>GRANT REPLICATION SLAVE ON *.* TO viajar@'192.168.1.67' IDENTIFIED BY 'abc2013';

    4. 在Master服务器执行下面的脚本,让数据库只能读;

    mysql>FLUSH TABLES WITH READ LOCK;

    5. 拷贝数据库文件夹和ibdata1文件到本地临时文件夹中,马上执行下面的步骤;

    6. 查看Master服务器的状态,记下File及Position的值,后面设置Slave服务器的时候需要用到;

    mysql>SHOW MASTER logs;

    mysql>SHOW MASTER STATUS;

    clip_image008

    (Figure1:Master状态)

    7. 对表进行解锁,恢复数据库读写;

    mysql>UNLOCK TABLES;

    8. 使用FTP等工具把第5步骤的临时文件传到Slave服务器;

    (二) 配置从服务器(Slave)

    1. 编辑数据库配置文件my.ini,在[mysqld]的下面加入下面代码,可以自己定义数值,只要保证唯一的就行,与Master的能区分开就行;

    server-id=2

    read-only=1

    2. 重启MySQL

    3. 登录MySQL服务器,执行下面的脚本命令:

    mysql>CHANGE MASTER TO

    MASTER_HOST='192.168.1.66',

    MASTER_USER='viajar',

    MASTER_PASSWORD='abc2013',

    MASTER_PORT=3309,

    MASTER_LOG_FILE='mysql-bin.000005',

    MASTER_LOG_POS=7179684,

    MASTER_CONNECT_RETRY=30;

    说明:

    1) MASTER_HOST:Master服务器的IP;

    2) MASTER_USER:配置主服务器时建立的用户名;

    3) ASTER_PASSWORD:用户名对应的密码;

    4) ASTER_PORT:主服务器mysql端口,如果未曾修改,默认即可;

    5) MASTER_LOG_FILE:log文件名,参考Figure1;

    6) MASTER_LOG_POS:只上次备份时的log文件的偏移量,参考Figure1;

    7) MASTER_CONNECT_RETRY:重新连接Master的时间间隔,单位为秒;

    4. 启动Slave进程,执行下面的脚本命令;

    mysql>START SLAVE;

    5. 检查主从同步状态,执行下面的脚本命令,其中Slave_IO_Running 与 Slave_SQL_Running 的值都必须为YES,才表明状态正常。

    mysql>SHOW SLAVE STATUS;

    clip_image010

    (Figure2:Slave状态1)

    clip_image011

    (Figure3:Slave状态2)

    6. 查看Slave服务器的MySQL日志;

    clip_image012

    (Figure4:Slave日志文件)

    四、补充说明

    1. 查看帮助

    mysql>help

    2. 查看slave帮助

    mysql>help slave

    3. 查找当前有哪些二进制日志文件

    mysql> show binary logs;

    4. 删除mysql-bin.000018之前的所有二进制日志文件

    mysql> purge binary logs to 'mysql-bin.000018';

    5. 从 MySQL 5.1.12 开始,能够用以下三种形式来告终:基于SQL语句的复制(statement-based replication, SBR),基于行的复制(row-based replication, RBR),混杂形式复制(mixed-based replication, MBR)。相应地,binlog的款式也有三种:STATEMENT,ROW,MIXED。MBR 形式中,SBR 形式是默认的。

    #binlog_format="STATEMENT" 
    #binlog_format="ROW" 
    #binlog_format="MIXED"

    当然了,也能够在运行时动态修正binlog的款式。例如

    mysql> SET SESSION binlog_format = 'STATEMENT'; 
    mysql> SET SESSION binlog_format = 'ROW'; 
    mysql> SET SESSION binlog_format = 'MIXED';

    mysql> SET GLOBAL binlog_format = 'STATEMENT'; 
    mysql> SET GLOBAL binlog_format = 'ROW'; 
    mysql> SET GLOBAL binlog_format = 'MIXED';

    6. MySQL同步故障:Slave_SQL_Running:No

    mysql> slave stop;

    mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;

    mysql> slave start;

    五、疑问

    (一) 复制级别有以下几种,默认级别是那种?如何显式设置这个值?

    1. Row Level:5.1.5开始支持。mater记录每行数据的更改日志,slave根据日志逐行应用。优点:数据一致性更有保障。缺点:可能造成日志文件比较大;

    2. Statement Level:master记录每个执行的query语句以及一些上下文信息,slave节点根据这些信息重新在slave上执行。优点:binary log比较小。缺点:某些情况下数据一致性难以保障;

    3. Mixed Level:MySQL根据情况选择哪种复制方式。5.1.8开始支持。

    (二) 常用架构有以下几种,我想要的效果是:当MasterA宕机之后,MasterB还能读写,在MasterA在恢复之后重新让MasterA成为主Master。

    1. Master-Slaves:通常都采用这种方式;

    2. Dual Master(Master-Master):2个master节点互相同步更新。因为MySQL的异步复制方式,为了防止数据冲突造成的不一致性,一般仅将其中一台用于写操作,另一台不用或仅用于读操作。目的是其中一台master停机维护或者故障中断时可以使用另一台master;

    3. 级联复制(Master-Slaves-Slaves):在Master Slaves中,如果slaves过多replication将增加master的负载,这时可以让master只向其中几台slave分发更新日志,这几台slave作为一级节点再向下级节点分发更新日志。

    (三) 如果slave报错或者宕机一段时间,那么应该如何重新同步宕机时间master的数据到slave呢?

    (四) 在Master设置binlog_do_db=test的时候,如何可以设置记录多个数据库?

    解答:直接在配置文件my.ini加入多条binlog_do_db就可以了;

    (五) 每天的日志文件就有10GB,如何清理?如何维护?有没什么设置或者方法可以减少日志量呢?

  • 相关阅读:
    Mysql推荐使用规范
    程序员应该经常浏览的技术网站
    百度,腾讯,阿里等互联网公司年终奖发多少
    JNI技术详解,让程序有飞一般的感觉
    日志:分布式系统的核心
    Spring Boot七:Spring boot集成MyBatis
    通俗理解TCP的三次握手
    JDBC添加数据
    JDBC概念
    今天是阳光明媚的一天
  • 原文地址:https://www.cnblogs.com/xuan52rock/p/4561138.html
Copyright © 2011-2022 走看看