一、背景

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

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

(Figure1:单Master-单Slave)

(Figure2:单Master-多Slave)

(Figure3:单Master-级联Slave)

(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;

(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;

(Figure2:Slave状态1)

(Figure3:Slave状态2)

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

(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,如何清理?如何维护?有没什么设置或者方法可以减少日志量呢?

六、参考文献

windows下Mysql master-slave配置

搭建MySql的Master/Slave架构

Linux MySQL主从复制(Replication)配置

13.4.2.1. CHANGE MASTER TO Syntax

innodb_flush_log_at_trx_commit option

innodb_flush_log_at_trx_commit

理解MySQL——复制(Replication)(图形并茂)

Windows下搭建MySQL Master Slave的更多相关文章

  1. Windows下搭建MySQL Master Slave[转]

    Windows下搭建MySQL Master Slave 一.背景 服务器上放了很多MySQL数据库,为了安全,现在需要做Master/Slave方案,因为操作系统是Window的,所以没有办法使用k ...

  2. Windows下搭建MySql Master-Master Replication

    1.首先下载最新版的MySql Server (http://dev.mysql.com/downloads/windows/installer/) 2.安装MySql Server到两台机器上 My ...

  3. Windows下搭建Mysql集群

    Mysql集群的基本架构如下: 基本原理参考:[转]MySQL Cluster (集群)基本原理 这里采用最小配置,用两台机器来分别部署一个management 节点,2个data node, 2个s ...

  4. linux下搭建mysql主从

    在master上创建repl账户,用于复制. grant replication slave on *.* to 'repl'@'%' identified by 'P@$$W0rd'; flush ...

  5. Windows下搭建PHP环境:Apache+PHP+MySQL

    本文简单记录一下Windows下搭建PHP环境的过程,一些细节可以参照本文参考资料,此文不再赘述 准备工作: Windows下手工搭建PHP环境需要先下载相应的软件,需要注意的是Apache与PHP的 ...

  6. windows下搭建apache+php+mysql

    在windows下,apache和mysql都有自动化安装的程序,本篇则侧重从apache和php版本选择,php线程安全,apache和mysql安装启动服务,工作环境配置这几个方面来阐述windo ...

  7. windows下搭建Apache+Mysql+PHP开发环境

    原文:windows下搭建Apache+Mysql+PHP开发环境 要求 必备知识 熟悉基本编程环境搭建. 运行环境 windows 7(64位); Apache2.2;MySQL Server 5. ...

  8. react-native —— 在Windows下搭建React Native Android开发环境

    在Windows下搭建React Native Android开发环境 前段时间在开发者头条收藏了 @天地之灵_邓鋆 分享的<在Windows下搭建React Native Android开发环 ...

  9. Windows下搭建论坛

    Windows下搭建论坛 真正的O基础架构,一步一步走向成功 转载请注明原作者出处 环境准备篇 安装集成包软件 解压后如下 以管理员身份运行setup的批处理 选择推荐的apache版本 选择推荐的m ...

随机推荐

  1. GRU(Gated Recurrent Unit) 更新过程推导及简单代码实现

    GRU(Gated Recurrent Unit) 更新过程推导及简单代码实现 RNN GRU matlab codes RNN网络考虑到了具有时间数列的样本数据,但是RNN仍存在着一些问题,比如随着 ...

  2. requirejs 打包 添加版本号收集资料 待测试

    https://www.npmjs.org/package/rjs-optimhttps://www.npmjs.org/package/grunt-requirejs-md5指定js版本号 但不是M ...

  3. 两种让tableview返回顶部的方法

    1. [self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:_currentRow inSection:0] animat ...

  4. Salesforce练习Case

    以下几个SFDC的Case基本覆盖了Force.com平台的一些基本操作流程,大家可以自己动手练习一下 Case 1: 在某公司的业务流程中,有零售店和销售人员两类信息,销售人员是指在零售店中工作的人 ...

  5. 【Silverlight】打开Silverlight程序报错,"未找到导入的项目......请确认<Import>声明中的路径正确,且磁盘上存在该文件"

    在打开Silverlight程序时,报错(如图所示),程序使用的是Visual Studio 2013和最新的Silverlight版本(Silverlight5). 然后我在网上找了下说:Silve ...

  6. function变量困惑

    var name = "The Window"; var object = { name : "My Object", getNameFunc : functi ...

  7. 最小生成树 prime + 队列优化

    存图方式 最小生成树prime+队列优化 优化后时间复杂度是O(m*lgm) m为边数 优化后简直神速,应该说对于绝大多数的题目来说都够用了 具体有多快呢 请参照这篇博客:堆排序 Heapsort / ...

  8. 【hihoCoder】1288 : Font Size

    题目:http://hihocoder.com/problemset/problem/1288 手机屏幕大小为 W(宽) * H(长),一篇文章有N段,每段有ai个字,要求使得该文章占用的页数不超过P ...

  9. *HDU 1398 母函数

    Square Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  10. angularjs内置指令 - form

    form类 angular js对form表单进行了那些扩展 ①html原生form表单不允许嵌套,而angular封装之后的form可以进行嵌套 ②angular为form扩展了自动校验,和防止重复 ...