生产环境搭建MySQL复制的教程(转)
【导读】
网络上有很多关于MySQL复制搭建的步骤和范例,以及手册上有一章完整的篇幅,讲述MySQL复制的原理、搭建步骤、优化等,但依然存在很多刚开始学习MySQL知识或者刚进入DBA行业的朋友咨询,知道搭建步骤,但还是在咨询生产环境的搭建或搭建过程碰到的问题,为此给大家简单讲述下复制的原理,并且讲述一下生产环境该如何搭建复制架构。
n 复制的基本原理及基础知识
使用3个线程来完成主从数据库服务器之间的数据复制功能,其中1 个I/O线程跑在主服务器上,另两个线程跑在从服务器上。当从服务器上执行START SLAVE时,从服务器会向主服务器申请创建一个数据库连接,连接到主数据库服务器,并用它发送记录在其二进制日志中的语句内容,此线程可以在主服务器上查看到,在主服务器上执行命令:SHOW PROCESSLIST,其输出信息中Command列值内容为:Binlog Dump,其连接信息中的HOST列值包含从服务器的IP地址。
从服务器上,执行SHOW PROCESSLIST;可以看到2个线程,其中一个为I/O线程,一个为SQL线程,其功能:
l I/O线程负责读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从数据库服务器数据目录中的本地文件中,也即中继日志;
l SQL线程,是从数据库服务器创建,用于读取解析中继日志并执行日志中的SQL语句;
MySQL的主从数据复制结构,如图1-1:
n 生产环境复制搭建范例
假设需要搭建复制的二台数据库服务器IP地址分别为:10.10.1.210、10.10.1.211,mysqld服务都跑在端口号:3306上。若是只有一台在线的场景,即假定10.10.1.210为在线服务器,10.10.1.211为新增加的服务器;若是要进行撤服务器的场景,那么拆除的服务器假定为10.10.1.211。
u 非在线环境搭建数据库的复制结构步骤(双主复制)
l 10.10.1.210/211:安装mysql软件包,用rpm包做示范:rpm –ivh /home/software/MySQL*
l 10.10.1.210/211上,执行SQL语句:
DELETE FROM mysql.user where user=’’ OR host=’’;FLUSH PRIVILEGES;
GRANT REPLICATION SLAVE ON *.* TO ‘repl’@’%’ IDENTIFIED ‘repl#3306’;
备注:
帐号名称和密码可按自行习惯或规范设置,建议帐号名称好区分用处,以及独立
专用,权限要限制,不多赋予任何权限,以免混淆或执行错误命令等而造成危害
l 10.10.1.210/211 停掉mysqld服务:mysqladmin –uroot shutdown
l 10.10.1.210上,必须修改的my.cnf参数:server-id和开启二进制功能,推荐与复制有关的参数设置:
server-id = 3306
port = 3306
log-bin = /data/mysqldata/binlog/mysql-bin (备注:路径替换为你所需要的)
log-bin-index = /data/mysqldata/binlog/mysql-bin.index
report_host = <本机IP地址>
report_port = 3306
innodb_flush_log_at_trx_commit = 2
sync_binlog = 0
binlog-format = mixed
transaction_isolation = REPEATABLE-READ
l 10.10.1.211上,必须修改的my.cnf参数:server-id,若是想做双主复制,也得开启二进制功能,推荐与复制有关的参数配置设置:
server-id = 33060
port = 3306
log-bin = /data/mysqldata/binlog/mysql-bin (备注:路径替换为你所需要的)
log-bin-index = /data/mysqldata/binlog/mysql-bin.index
report_host = <本机IP地址>
report_port = 3306
innodb_flush_log_at_trx_commit = 2
sync_binlog = 0
binlog-format = mixed
transaction_isolation = REPEATABLE-READ
log-slave-updates
l 10.10.1.210/211 启动mysqld服务:mysqld_safe &
l 10.10.1.210/211上执行SQL:SHOW MASTER STATUS;以获得各自上的二进制日志文件名称及日志位置
l 10.10.1.210->10.10.1.211的复制,则在10.10.1.211上执行SQL语句:
CHANGE MASTER TO master_host=’10.10.1.210′,
master_user=’repl’,master_password=’repl#3306′,
master_log_file=’mysql-bin.000002′,
master_log_pos=106,master_port=3306;
START SLAVE;SELECT SLEEP(1);SHOW SLAVE STATUS\G
备注:
若是SQL线程和I/O线程都显示为OK状态,则复制搭建成功;若是有错误信息,则看SQL语句的输出信息,以及查看错误日志文件内容(注释:error.log)
l 10.10.1.211->10.10.1.210的复制,则在10.10.1.210上执行SQL语句:
CHANGE MASTER TO master_host=’10.10.1.211′,
master_user=’repl’,master_password=’repl#3306′,
master_log_file=’mysql-bin.000002′,
master_log_pos=106,master_port=3306;
START SLAVE;SELECT SLEEP(1);SHOW SLAVE STATUS\G
对于如何阅读输出的信息,同上
u 给在线数据库服务器搭建复制步骤
前面假设了服务器IP:10.10.1.210为在线跑的数据库服务器,可能有不少公司为提高性能或疏忽等原因,二进制日志登记功能有可能没有打开。
l 10.10.1.210:检查是否开启二进制日志功能,若没有开启,则修改my.cnf文件,添加:
log-bin = /data/mysqldata/binlog/mysql-bin
log-bin-index = /data/mysqldata/binlog/mysql-bin.index
其他参数建议配置为:
server-id = 3306
port = 3306
report_host = <本机IP地址>
report_port = 3306
innodb_flush_log_at_trx_commit = 2
sync_binlog = 0
binlog-format = mixed
transaction_isolation = REPEATABLE-READ
然后申请停机维护时间,肯定要是用户访问量最小,且不影响内部其他业务运转的时间点,一般都是凌晨几点进行,把mysqld服务器重新启动,命令:
mysqladmin –uroot –p*** shutdown;mysqld_safe &
l 10.10.1.210:对于无服务上所有数据库完整备份的数据库服务器,则编写一个数据库备份的脚本程序,比如shell语言,然后crontab调用任务了,时间肯定要设置在服务器压力最小的时刻点;
l 10.10.1.210:脚本程序需要注意的参数:mysqldump工具备份的话,则建议加上参数:
–single-transaction –master-data=1 default-character-set=utf8(备注:修改为自己需要的字符集)
l 10.10.1.210:脚本写完之后,修改下备份的数据库名称指定参数为:-B test,测试下备份脚本,是否能执行成功,测试完毕再修改回来
l 10.10.1.211:安装mysql参考上述步骤,设置的my.cnf参数推荐:
server-id = 33060
port = 3306
log-bin = /data/mysqldata/binlog/mysql-bin
log-bin-index = /data/mysqldata/binlog/mysql-bin.index
report_host = <本机IP地址>
report_port = 3306
innodb_flush_log_at_trx_commit = 2
sync_binlog = 0
binlog-format = mixed
transaction_isolation = REPEATABLE-READ
log-slave-updates
l 10.10.1.211:重新启动mysqld服务,执行:
mysqladmin –uroot shutdown;mysqld_safe &
l 10.10.1.210/211上:增加复制帐号,执行的SQL语句:
GRANT REPLICATION SLAVE ON *.* TO ‘repl’@’%’ IDENTIFIED BY ‘repl#3306’;
l 10.10.1.211上进行10.10.1.211的数据库备份文件恢复:
mysql –uroot –default-character-set=utf8 < ***.bak
l 10.10.1.211的备份恢复完成之后,执行:more ***.bak,可以看到备份文件有一段类似的语句:
CHANGE MASTER TO MASTER_LOG_FILE=’mysql-bin.000019′, MASTER_LOG_POS=383196279;
可以把此语句复制出来后,修改为:
CHANGE MASTER TO MASTER_HOST=’10.10.1.210′,
MASTER_USER=’repl’,MASTER_PASSWORD=’repl#3306′,
MASTER_LOG_FILE=’mysql-bin.000019′,
MASTER_LOG_POS=383196279,MASTER_PORT=3306;
l 搭建10.10.1.210-> 10.10.1.211的复制,在10.10.1.211上执行:
SHOW MASTER STATUS; — 记录其日志文件的名称和位置信息
CHANGE MASTER TO MASTER_HOST=’10.10.1.210′,
MASTER_USER=’repl’,MASTER_PASSWORD=’repl#3306′,
MASTER_LOG_FILE=’mysql-bin.000019′,
MASTER_LOG_POS=383196279,MASTER_PORT=3306;
START SLAVE;SELECT SLEEP(1);SHOW SLAVE STATUS\G
备注:
判断复制是否搭建成功就看I/O和SQL线程是否显示为OK状态,另外必须注意的事项,一般此类复制必须放到服务器压力最小的时候搭建,因为会从主服务器上发送大量的二进制日志信息到从服务器,从而会加重主服务器的I/O、网卡和CPU负载,从而影响用户的体验。
l 搭建10.10.1.211->10.10.1.210复制,在10.10.1.210上执行:
CHANGE MASTER TO master_host=’10.10.1.211′,
master_user=’repl’,master_password=’repl#3306′,
master_log_file=’10.10.1.211上查看到的二进制日志文件名称’,
master_log_pos=10.10.1.211上查看到的二进制日志的位置,master_port=3306;
START SLAVE;SELECT SLEEP(1);SHOW SLAVE STATUS\G
备注:
10.10.1.211上无需要执行的日志信息发送到10.10.1.210上,故任何时间点搭建都可以,只要记住了二进制日志文件名称和位置信息.
u 对在线数据库服务器撤销复制功能步骤
假设双主复制模式的数据库服务器架构:10.10.1.210<->10.10.1.211,且两台服务器都有不同应用程序连接,进行读写操作,以分散读的压力,保留服务器IP:10.10.1.210。
l 10.10.1.211:把所有连接到10.10.1.211的程序数据库联接信息IP地址修改为:
10.10.1.210,然后对此部分的应用,分批重新启动程序服务,确保其连接更改完毕
l 10.10.1.211:检查是否已经没有数据库联接了,若没有,在检查下是否打开参数:log-slave-updates,若没有直接执行SQL语句:SHOW MASTER STATUS;间隔15分钟再执行,发现二进制日志位置没有变化,则基本说明没有任何程序连接到此;若是打开log-slave-updates参数,则建议先执行:STOP SLAVE;再用上述办法观察;
l 10.10.1.211上:执行停止复制的SQL语句:STOP SLAVE;并且关掉mysqld服务,以防止漏网之鱼的程序连接存在,不报错而无法发现:mysqladmin –uroot –p*** shutdown
l 10.10.1.210上:执行停止复制的SQL语句:STOP SLAVE;RESET SLAVE;
u 总结
本想再讲一下对于MySQL服务器迁移的事情,告诉大家生产环境一般是如何做的,比如双向复制架构:10.10.1.210<->10.10.1.211,要进行物理服务器的替换或搬迁,那么我们一般会通过复制的方式,把数据复制到新服务器上,然后再进行停机维护,切换数据库的方式完成,相信大家阅读了上面的案例,可以整合借鉴的。
给大家讲述了2种生产环境下,搭建复制的做法,以及拆除数据库复制的做法,其实技术含量都是非常有限的,而且手册上也能学习到基本操作,但请大家思考这些步骤的意义,是否是为了:减少停机维护的时间,减少对用户体验的影响,减少犯错而导致数据丢失或错乱等。
u 最后
上传一个MySQL官方手册中提供的,也是很多互联网行业企业中,解决读负载高的业务场景:读写分离的架构图,供大家参考的,图1-2:
再上传一个我们团队内部实习生绘制的MySQL复制数据流转图,供大家加深记忆和理解,图1-3:
文章原地址:http://www.mysqlops.com/2011/06/16/mysql-master-replication-slave.html
生产环境搭建MySQL复制的教程(转)的更多相关文章
- linux 生产环境搭建
Linux基础命令杂记 今天又一次搞Linux生产环境搭建.这是种步骤很多,很繁琐而且又不得不做的事情.虽然做过很多次,但还是有很多步骤.命令不记得,每一次到处找资料很麻烦,于是将一些步骤记下,以 ...
- 快速搭建MySQL复制集
快速搭建MySQL复制集 1 环境说明 MySQL版本 5.6 basedir :/u01/my3306 #MySQL软件目录 数据目录 :/u01/mysql/[实例名]/data 日志目录 :/u ...
- 生产环境搭建高可用Harbor(包括恢复演练实操)
生产环境搭建高可用Harbor(包括恢复演练实操) 前言 因资源成本问题,本Harbor高可用架构为最小开销方案,如果资源充足,可以将PG.Redis全部使用使用云厂商集群模式. 同时为了配置简单,并 ...
- 安卓自动化测试(2)Robotium环境搭建与新手入门教程
Robotium环境搭建与新手入门教程 准备工具:Robotium资料下载 知识准备: java基础知识,如基本的数据结构.语法结构.类.继承等 对Android系统较为熟悉,了解四大组件,会编写简单 ...
- Windows环境搭建mysql服务器
Windows环境搭建mysql服务器: 1.下载mysql-installer-community-5.7.3.0-m13.2063434697并安装 安装详细步骤>> 2.安装mys ...
- Hadoop生产环境搭建(含HA、Federation)
Hadoop生产环境搭建 1. 将安装包hadoop-2.x.x.tar.gz存放到某一目录下,并解压. 2. 修改解压后的目录中的文件夹etc/hadoop下的配置文件(若文件不存在,自己创建.) ...
- LNMP环境搭建——MySQL篇
The world's most popular open source database 1.Install MySQL root@kallen:~# apt-get install mysql-s ...
- centos 7.3 服务器环境搭建——MySQL 安装和配置
centos 7.3 服务器环境搭建——MySQL 安装和配置服务器信息如下:服务器:阿里云系统 centos 7.3 (阿里云该版本最新系统)mysql版本:5.7.18 (当前时间最新版本)连接服 ...
- linux php环境搭建以及magento安装教程
听朋友用magento在搭建电商系统,我好奇.遂自己下载了一个包部署了一套. 主机采用linux center os6.5,安装程序非常顺利,部署一套大概费时一个小时左右. ########### ...
随机推荐
- PHP 错误提示
HTTP/1.1 200 OKServer: nginxDate: Thu, 20 Jun 2013 03:06:10 GMTContent-Type: text/html; charset=utf- ...
- CentOS安装搜狗词库
中文输入使用ibus-pinyin. 在ibus-pinyin里使用搜狗词库 # wget http://hslinuxextra.googlecode.com/files/sougou-phrase ...
- Stm32 定时器 定时时间设置及PWM频率 占空比的设置总结
一.定时器的时钟: 当SYSCLK等于72M,APB1等于36M APB2等于72M时,定时器的时钟为72M.注意图中这句话:如果APB1/APB2预分频器=1则频率不变,否则频率x2.如果此时,AP ...
- Spring JDBC 随笔
Spring 框架,借助 JdbcTemplate 类来简化 java 访问 database. 完成一个增查改删(CRUD)的基本功能,借助下面 5 个角色来共同来完成. 1. object cla ...
- 线性表(gcc实现)
线性结构: ①存在一个唯一的被称为“第一个”的数据元素: ②存在一个唯一的被称为“最后一个”的数据元素: ③除第一个元素外,每个元素均有唯一一个直接前驱: ④除最后一个元素外,每个元素均有唯一一个直接 ...
- 几何学中的欧拉公式:V-E+F = 2
几何学中的欧拉公式:V-E+F = 2,V.E.F表示简单几何体的顶点数.边数.面数. 证明: 它的证明有多种,这里呈现一种递归证法. 对于任意简单几何体(几何体的边界不是曲线),我们考察这个几何体的 ...
- Mysql + keepalived 实现双主热备读写分离【转】
Mysql + keepalived 实现双主热备读写分离 2013年6月16日frankwong发表评论阅读评论 架构图 系统:CentOS6.4_X86_64软件版本:Mysql-5.6.12 ...
- 二分-hdu-4768-Flyer
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4768 题目意思: 有n个A.B.C,每个Ai,Bi,Ci,对于每个P=Ai+k*Ci(P<=B ...
- 总结了关于PHP xss 和 SQL 注入的问题(转)
漏洞无非这么几类,XSS.sql注入.命令执行.上传漏洞.本地包含.远程包含.权限绕过.信息泄露.cookie伪造.CSRF(跨站请求)等.这些漏洞不仅仅是针对PHP语言的,本文只是简单介绍PHP如何 ...
- 05-图2. Saving James Bond - Easy Version (25)
1 边界和湖心小岛分别算一个节点.连接全部距离小于D的鳄鱼.时间复杂度O(N2) 2 推断每一个连通图的节点中是否包括边界和湖心小岛,是则Yes否则No 3 冗长混乱的函数參数 #include &l ...