MySQL5.6主从复制最佳实践

MySQL5.6     主从复制的配置

环境

操作系统:CentOS-6.6-x86_64

MySQL 版本:mysql-5.6.26.tar.gz

主节点 IP:192.168.31.57        主机名:edu-mysql-01

从节点 IP:192.168.31.59        主机名:edu-mysql-02

MySQL 主从复制官方文档

http://dev.mysql.com/doc/refman/5.6/en/replication.htm l

MySQL 主从复制(也称 A/B 复制)的原理

  1. Master 将数据改变记录到二进制日志(binary  log)中,也就是配置文件 log-bin 指定的文件,这些记录叫做二进制日志事件(binary  log  events);
  2. Slave 通过 I/O 线程读取 Master 中的 binary  log  events 并写入到它的 中继日志(relay  log);
  3. Slave 重做中继日志中的事件,把中继日志中的事件信息一条一条的在 本地执行一次,完成数据在本地的存储,从而实现将改变反映到它自己的 数据(数据重放)。

主从配置需要注意的点

  1. 主从服务器操作系统版本和位数一致;主从服务器的 hostname 不要一致。
  2. Master 和 Slave 数据库的版本要一致;
  3. Master 和 Slave 数据库中的数据要一致;
  4. Master 开启二进制日志,Master 和 Slave 的 server_id 在局域网内必 须唯一;
  5. Master 和 Slave  都创建数据库 mbank,表 testuser  ;

Master 配置

1、Master(192.168.31.57)和 Slave(192.168.31.59) 注意:两台数据库服务器的的 selinux 都要 disable(永久关闭 selinux,请 修改/etc/selinux/config,将 SELINUX 改为 disabled)

2、修改 Master 的配置文件/etc/my.cnf [[email protected]  ~]# vi  /etc/my.cnf

## 在 [mysqld] 中增加以下配置项

# 设置 server_id,一般设置为 IP

server_id=57

# 复制过滤:需要备份的数据库,输出 binlog

binlog-do-db=mbank

# 复制过滤:不需要备份的数据库,不输出(mysql 库一般不同步)

binlog-ignore-db=mysql

# 开启二进制日志功能,可以随便取,最好有含义

log-bin=edu-mysql-bin

# 为每个 session 分配的内存,在事务过程中用来存储二进制日志的缓存

binlog_cache_size=1M

# 主从复制的格式(mixed,statement,row,默认格式是 statement)

binlog_format=mixed

# 二进制日志自动删除/过期的天数。默认值为 0,表示不自动删除。

expire_logs_days=7

# 跳过主从复制中遇到的所有错误或指定类型的错误,避免 slave 端复制中断。

# 如:1062 错误是指一些主键重复,1032 错误是因为主从数据库数据不一 致

slave_skip_errors=1062

# 如果需要同步函数或者存储过程

log_bin_trust_function_creators=true

(如想了解以上参数的更多详细解析,可以直接百度参数名)

2.1 复制过滤可以让你只复制服务器中的一部分数据,有两种复制过滤:

  1. 在 Master 上过滤二进制日志中的事件;
  2. 在 Slave 上过滤中继日志中的事件。

2.2    MySQL 对于二进制日志 (binlog)的复制类型

  1. 基于语句的复制:在 Master 上执行的 SQL 语句,在 Slave 上执行同样的语句。MySQL 默认采用基于语句的复制,效率比较高。一旦发现没法精 确复制时,会自动选着基于行的复制。
  2. 基于行的复制:把改变的内容复制到 Slave,而不是把命令在 Slave 上 执行一遍。从 MySQL5.0 开始支持。
  3. 混合类型的复制:默认采用基于语句的复制,一旦发现基于语句的无法 精确的复制时,就会采用基于行的复制。

 3、启动/重启 Master 数据库服务,登录数据库,创建数据同步用户,并授予相应的权限

[[email protected]  ~]# service  mysql  restart

Shutting  down  MySQL..[  OK  ] Starting  MySQL..[  OK  ]

[[email protected]  ~]# mysql  -uroot  -p

Enter  password:

Welcome  to  the  MySQL  monitor.   Commands  end  with  ;  or  \g. Your  MySQL  connection  id  is  1

Server  version:  5.6.26-log  Source  distribution

Copyright  (c)  2000,  2015, Oracleand/or  its  affiliates.  All  rights  reser ved.

Oracle  is  a  registered  trademark  of  Oracle  Corporation  and/or  its affiliates.  Other  names  may  be  trademarks  of  their  respective owners.

Type  ‘help;‘  or  ‘\h‘  for  help.  Type  ‘\c‘  to  clear  the  current  input  stat ement.

#创建数据同步用户,并授予相应的权限

mysql> grant  replication  slave,  replication  client  on  *.*  to  ‘repl‘@‘192. 168.31.59‘  identified  by  ‘123456‘;

Query  OK,  0  rows  affected  (0.00  sec)

# 刷新授权表信息

mysql> flush  privileges;

Query  OK,  0  rows  affected  (0.00  sec)

# 查看 MySQL 现在有哪些用户及对应的 IP 权限

mysql> select  user,host  from  mysql.user;

# 查看 position 号,记下 position 号(从机上需要用到这个 position 号和现 在的日志文件)

mysql> show  master  status;

Master 重启后会修改 mysql-bin 文件名(序号加 1)

 4、接下来处理 Slave(192.168.31.59),配置文件只需修改一项,其余配 置用命令来操作

[[email protected]  ~]# vi  /etc/my.cnf

## 在 [mysqld] 中增加以下配置项

# 设置 server_id,一般设置为 IP

server_id=59

# 复制过滤:需要备份的数据库,输出 binlog

binlog-do-db=mbank

#复制过滤:不需要备份的数据库,不输出(mysql 库一般不同步)

binlog-ignore-db=mysql

# 开启二进制日志,以备 Slave 作为其它 Slave 的 Master 时使用

log-bin=edu-mysql-slave1-bin

# 为每个 session 分配的内存,在事务过程中用来存储二进制日志的缓存

binlog_cache_size  =  1M

# 主从复制的格式(mixed,statement,row,默认格式是 statement)

binlog_format=mixed

# 二进制日志自动删除/过期的天数。默认值为 0,表示不自动删除。

expire_logs_days=7

# 跳过主从复制中遇到的所有错误或指定类型的错误,避免 slave 端复制中 断。

# 如:1062 错误是指一些主键重复,1032 错误是因为主从数据库数据不一 致

slave_skip_errors=1062

#  relay_log 配置中继日志

relay_log=edu-mysql-relay-bin

#  log_slave_updates 表示 slave 将复制事件写进自己的二进制日志

log_slave_updates=1

# 防止改变数据(除了特殊的线程)

read_only=1

如果 Slave 为其它 Slave 的 Master 时,必须设置 bin_log。在这里,我们 开启了二进制日志,而且显式的命名(默认名称为 hostname,但是,如果 h ostname 改变则会出现问题)。

relay_log 配置中继日志,log_slave_updates 表示 slave 将复制事件写进自 己的二进制日志。

当设置 log_slave_updates 时,你可以让 slave 扮演其它 slave 的 master。 此时,slave 把 SQL 线程执行的事件写进行自己的二进制日志 (binary  log), 然后,它的 slave 可以获取这些事件并执行它.

5、保存后重启 MySQL 服务,还原备份数据

[[email protected]  ~]# service  mysql  restart

Shutting  down  MySQL..[  OK  ] Starting  MySQL..[  OK  ]

6、登录 Slave 数据库,添加相关参数

###Master 的 IP、端口、同步用户、密码、position 号、读取哪个日志文件

[[email protected]  ~]# mysql  -uroot  -p

Enter  password:

Welcome  to  the  MySQL  monitor.   Commands  end  with  ;  or  \g. Your  MySQL  connection  id  is  3

Server  version:  5.6.26-log  Source  distribution

Copyright  (c)  2000,  2015,  Oracle  and/or  its  affiliates.  All  rights  rese rved.

Oracle  is  a  registered  trademark  of  Oracle  Corporation  and/or  its affiliates.  Other  names  may  be  trademarks  of  their  respective owners.

Type  ‘help;‘  or  ‘\h‘  for  help.  Type  ‘\c‘  to  clear  the  current  input  stat ement.

mysql> change  master  to  master_host=‘192.168.31.57‘,  master_user=‘ repl‘,  master_password=‘123456‘,  master_port=3306,  master_log_file=‘ edu-mysql-bin.000001‘,  master_log_pos=429,  master_connect_retry=3 0;

Query  OK,  0  rows  affected,  2  warnings  (0.01  sec)

上面执行的命令的解释:

master_host=‘192.168.31.57‘                   ##  Master 的 IP 地址 master_user=‘repl‘ ## 用于同步数据的用户(在 Master 中授权的用户)

master_password=‘123456‘                      ## 同步数据用户的密码 master_port=3306     ##  Master 数据库服务的端口 master_log_file=‘edu-mysql-bin.000001‘     ##指定 Slave 从哪个日志文 件开始读复制数据(可在 Master 上使用 show  master  status 查看到日志 文件名)

master_log_pos=429                                 ## 从哪个 POSITION 号开始读 master_connect_retry=30                         ##当重新建立主从连接时,如果连接 建立失败,间隔多久后重试。单位为秒,默认设置为 60 秒,同步延迟调优 参数。

## 查看主从同步状态

mysql> show  slave  status\G;

可看到 Slave_IO_State 为空, Slave_IO_Running 和 Slave_SQL_Runnin g 是 No,表明 Slave 还没有开始复制过程。

## 开启主从同步

mysql> start  slave;

Query  OK,  0  rows  affected  (0.00  sec)

## 再查看主从同步状态

mysql> show  slave  status\G;

主要看以下两个参数,这两个参数如果是 Yes 就表示主从同步正常

Slave_IO_Running:  Yes Slave_SQL_Running:  Yes

由截图中的主从同步状态信息可以看出,我们配置的主从同步是正常的。

可查看 master 和 slave 上线程的状态。在 master 上,可以看到 slave 的 I

/O 线程创建的连接:

Master  :  mysql> show  processlist\G; 1.row 为处理 slave 的 I/O 线程的连接。 2.row 为处理 MySQL 客户端连接线程。

3.row 为处理本地命令行的线程。

Slave  :  mysql> show  processlist\G;

1. row 为 I/O 线程状态。

2. row 为 SQL 线程状态。

3. row 为处理本地命令行的线程。

7、主从数据复制同步测试

(1) 在 Master 中的 mbank 库上变更数据的同步测试;

mysql> INSERT  INTO  `testuser`(`usercode`,`username`)  VALUES  (`1`, ‘同步测试 1‘),(  `2`,‘同步测试 2‘);

Master 中添加完之后,登录 Slave 中查看数据是否已同步。

8、测试过程中,如果遇到同步出错,可在 Slave 上重置主从复制设置(选 操作):

(1)    mysql> reset  slave;

(2)    mysql> change  master  to  master_host=‘192.168.31.57‘, master_user=‘repl‘,

master_password=‘123456‘, master_port=3306,

master_log_file=‘edu-mysql-bin.00000x‘, master_log_pos=xx, master_connect_retry=30;

(此时,master_log_file 和 master_log_pos 要在 Master 中用 show  maste

r  status 命令查看)

注意:如果在 Slave 没做只读控制的情况下,千万不要在 Slave 中手动插 入数据,那样数据就会不一致,主从就会断开,就需要重新配置了。

9、上面所搭建的是单向复制的主从,也是用的比较多的,而双向主从其实 就是 Master 和 Slave 都开启日志功能,然后在 Master 执行授权用户

(这 里授权的是自己作为从服务器,也就是这里的 IP 地址是 Master 的 IP 地址), 然后再在 Master 上进行 chang  master 操作。

基于局域网的 Master/Slave 机制在通常情况下已经可以满足“实时”备份 的要求了。如果延迟比较大,可以从以下几个因素进行排查:

  1. 网络延迟;
  2. Master 负载过高;
  3. Slave 负载过高;

一般的做法是使用多台 Slave 来分摊读请求,再单独配置一台 Slave 只作 为备份用,不进行其他任何操作,就能相对最大限度地达到“实时”的要 求了。

我在部署的时候遇到的问题: 由于我的从服务器是主服务器复制过来的,mysql 的 server_id 一样,在同步的时候出错了:

Fatal error: The slave I/O thread stops because master and slave have equal MySQ L server UUIDs; these UUIDs must be different for replication to work.

(1)首先检查:

mysql> show variables like ‘server_id‘;

+—————+——-+

| Variable_name | Value |

+—————+——-+

| server_id | 3 |

+—————+——-+

主从不能不一样。

(2)如果还不行,继续排查。进入 mysql 的 data 目录,打开 auto.cnf 文件,里面记录了 数据库的 uuid,每个库的 uuid 应该是不一样的。

[auto]

server-uuid=6dcee5be-8cdb-11e2-9408-90e2ba2e2ea6

解决办法,按照这个 16 进制格式,随便改下,重启 mysql 即可。

时间: 2024-11-05 14:51:21

MySQL5.6主从复制最佳实践的相关文章

ngx_lua应用最佳实践

引子: 以下文字,是UPYUN系统开发工程师timebug在SegmentFault D-Day南京站技术沙龙上所做分享的内容要义提炼,主题为UPYUN系统开发团队在进行业务逻辑由C模块到ngx_lua的迁移过程中产生的心得体会,以及在NGINX上基于ngx_lua的方面的最佳实践方案. Upyun公众号:upaiyun --------------------------------------------------------------------- ngx_lua 是一个NGINX的第

ASP.NET跨平台最佳实践

前言 八年的坚持敌不过领导的固执,最终还是不得不阔别已经成为我第二语言的C#,转战Java阵营.有过短暂的失落和迷茫,但技术转型真的没有想象中那么难.回头审视,其实单从语言本身来看,C#确实比Java更优秀(并非C#天生丽质,而是它站在了巨人的肩膀上). 本文并非为.NET正名而来,而仅仅是分享作者近几年在ASP.NET跨平台方面的研究与实践经验,算是对八年的.NET之路作一个阶段性的总结. .NET技术自诞生以来,便一直因其跨平台能力差而广受诟病.这里面有微软有意为之,也有别有用心之人在混淆视

PHP核心技术与最佳实践

<PHP核心技术与最佳实践>是一本致力于为希望成为中高级PHP程序员的读者提供高效而有针对性指导的经典著作.系统归纳和深刻解读了PHP开发中的编程思想.底层原理.核心技术.开发技巧.编码规范和最佳实践.全书分为5个部分:第一部分(1-2章)从不同的角度阐述了面向对象软件设计思想的核心概念.技术和原则,分析了面向对象的特性.设计模式的理念,指出了如何设计低耦合.高可扩展性的软件,等等:第二部分(3-6章)详细讲解了PHP中正则表达式的规范和使用技巧,PHP网络编程的原理.方法.技巧和一些重要的操

温习《PHP 核心技术与最佳实践》这本书

再次看这本书,顺手提炼了一下大致目录,以便后续看见目录就知道大概讲的些什么内容 PHP 核心技术与最佳实践 1.面向对象思想的核心概念 1.1 面向对象的『形』与『本』 1.2 魔术方法的应用 1.2.1 __set和 __get 方法 PHP 的重载和Java 等语言的重载不同. Java 里,重载指一个类中可以定义参数列表不同但名字相同的多个方法.比如,Java 也有构造 函数,只要保证方法签名不一样就行:而 PHP 则在一个类中只允许有一个构造函数. PHP 提供的『重载』指动态的『创建』

基础入门_Python-模块和包.运维开发中watchdog事件监视的最佳实践?

简单介绍: 说明:  此模块是一个跨平台的PY库和SHELL工具,可以监视文件系统事件(增加/删除/修改) 快速安装: pip install --upgrade watchdog 日志记录: event_handler = LoggingEventHandler() -> event_handler 说明: 创建一个日志处理句柄,其实LoggingEventHandler是继承自FileSystemEventHandler类,只是重写了增删查改的回调函数,直接调用logging模块写到对应lo

基础入门_Python-内建函数.运维开发中eval内建函数的最佳实践?

简单介绍: 说明: 在指定命名空间中计算参数字符串的有效表达式,并返回一个对象, Help on built-in function eval in module __builtin__: eval(...)     eval(source[, globals[, locals]]) -> value          Evaluate the source in the context of globals and locals.     The source may be a string 

45个实用的JavaScript技巧、窍门和最佳实践

如你所知,JavaScript是世界上第一的编程语言,它是Web的语言,是移动混合应用(mobile hybrid apps)的语言(比如PhoneGap或者Appcelerator),是服务器端的语言(比如NodeJS或者Wakanda),并且拥有很多其他的实现.同时它也是很多新手的启蒙语言,因为它不但可以在浏览器上显示一个简单的alert信息,而且还可以用来控制一个机器人(使用nodebot,或者nodruino).掌握JavaScript并且能够写出组织规范并性能高效的代码的开发人员,已经

毫秒必争,前端网页性能最佳实践

你愿意为打开一个网页等待多长时间?我一秒也不愿意等.但是事实上大多数网站在响应速度方面都让人失望.现在越来越多的人开始建立自己的网站,博客,你的网页响应速度如何呢?在这篇文章中我们来介绍一下提高网页性能的最佳实践,以及相应的问题解决方案,让站长或者即将要成为站长的朋友了解如何去测试和提高网站响应速度,对自己的网站更有信心. 最佳实践 最佳实践我们引用的来自yahoo前端性能团队总结的35条黄金定律.原文猛击这里.下面我们分门别类将每条的关键点总结一下. 网页内容 减少http请求次数 减少DNS

atitit.手动配置列表文件的选择and 数据的层次结构 attilax总结最佳实践--yaml

atitit.手动配置列表文件的选择and 数据的层次结构 attilax总结最佳实践--yaml 1. yaml是个好的选择.. 1 2. 数据的层次结构--结构:hash,list,和block literal. 1 3. yaml跟json的实现区别 1 4. xml的优点及json的问题 2 4.1. ide友好 2 4.2. JSON也适合与任何数据,复杂struts难以阅读 2 4.3. json难以手工维护 3 5. 基于YAML的开源项目解析YAML文件最常用的Java库是JvY