mysql主从在线的搭建

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

MySQL同步概念及配置

同步功能在MySQL 3.23.15就开始引进了,它可以把一个MySQL服务器上的数据复制到另一个服务器上去。单向同步的好处是稳健,高速,系统易管理:

 有了master/slave机制后,就更稳健了。当master上发生问题时,可以把slave作为备用切换过去。

 可以在slave和master之间分担一些查询,这就能加速响应时间。SELECT 查询就可以在slave上执行以减少master的负载。更新数据的语句则要放在mater上执行以保持master和slave的同步。当非更新操作占多数时,负载均衡就很有效了,不过这只是普通情况而言。

 另一个好处是可以在slave上备份数据,无需干扰master。备份数据时master照样继续运作

 

 

一、同步机制与群集的区别

 

mysql集群和mysql主从复制有什么区别

复制的只有主节点能接受 insert,update,drop,delete 等操作,集群不存在此类限制。
不过,说实话,集群和复制不是一个级别的概念,在某些情况中,复制是集群的组成部分。

mysql 集群 减少数据中心结点压力和大数据量处理,采用把 mysql 分布,一个或多个 application 对应一个 mysql 数据库。把几个 mysql 数据库公用的数据做出共享数据,例如购物车,用户对象等等,存在数据结点里面。其他不共享的数据还维持在各自分布的 mysql 数据库本身中

具体根据架构环境来选择,总体性能的提高的是效率的增加。我公司用的是读写分离,5台从的负载读,主的负载写。

 

二、同步机制实现概念

MySQL同步机制基于master把所有对数据库的更新、删除等)都记录在二进制日志里。因此,想要启用同步机制,在master就必须启用二进制日志每个slave接受来自master上在二进制日志中记录的更新操作,因此在slave上执行了这个操作的一个拷贝。

所有的slave必须在启用二进制日志时把master上已经存在的数据拷贝过来。如果运行同步时slave上的数据和master启用二进制日志时的数据不一致的话,那么slave同步就会失败。(拷贝方法见后面)

slave上已经完整拷贝master数据后,就可以连接到master上然后等待处理更新了。如果master当机或者slave连接断开,slave会定期尝试连接到master上直到能重连并且等待更新。重试的时间间隔由--master-connect-retry选项来控制,它的默认值是60秒。

每个slave都记录了它关闭时的日志位置。msater是不知道有多少个slave连接上来或者哪个slave从什么时候开始更新。

注:启用同步后,所有要同步的更新操作都必须在master上执行。否则,必须注意不要造成用户在master上的更新和在slave上的更新引起冲突。

1、同步实现步骤

步骤一:MySQL同步功能由3个线程(master1个,slave2)来实现。执行START SLAVE语句后,SLAVE就创建一个I/O线程。

步骤二:I/O线程连接到master上,并请求master发送二进制日志中的语句。

步骤三:master创建一个线程来把日志的内容发送到slave上这个线程在master上执行SHOW PROCESSLIST 语句后的结果中的 Binlog Dump 线程便是。

步骤四:slave上的I/O线程读取master的 Binlog Dump 线程发送的语句,并且把它们拷贝到其数据目录下的中继日志(relay logs)中。

步骤五:第三个是SQL线程,salve用它来读取中继日志,然后执行它们来更新数据。

可参见下图图示:

 

每个master/slave上都有三个进程,master有多个线程,他为每个slave连接都创建一个线程,而每个slave只有I/OSQL线程

slave2个线程的好处:把读日志和执行分开成2个独立的任务。执行任务如果慢的话,读日志任务不会跟着慢下来。

如:slave停止了一段时间,那么I/O线程可以在slave启动后很快地从master上读取全部日志,尽管SQL线程可能落后I/O线程好几的小时。如果slaveSQL线程没全部执行完就停止了,但I/O线程却已经把所有的更新日志都读取并且保存在本地的中继日志中了,因此在slave再次启动后就会继续执行它们了。这就允许在master上清除二进制日志,因为slave已经无需去master读取更新日志了。

2、在master/slave查看状态

在master上,执行下面的命令,可以看到运行状态

Mysq > SHOW PROCESSLIST\G;

Mysql > show master status\G;

在slave上,可以执行以下命令

Mysql > show slave status\G;

3、中继日志及状态文件

中继日志

默认地,中继日志的名字格式为 `host_name-relay-bin.nnn`host_name 是服务器的主机名,nnn 是序号,如:sumi2-relay-bin.000008

索引中继日志

slave上用一个索引文件来跟踪当前正在使用的中继日志,这个文件的文件名是 `host_name-relay-bin.index`,如:sumi2-relay-bin.index。

在下列条件中会创建一个新的中继日志:

(1)slave启动后,I/O线程第一次启动(在MySQL 5.0中,每次I/O线程启动后都会新建一个中继日志,而不只是第一次启动时)。

(2)刷新日志时;例如,执行flush logs语句或运行mysqladmin flush-logs命令(从 MySQL 4.0.14开始才会创建新中继日志)。

(3)当前的中继日志大小太大了,“太大了”是这么判断的:

max_relay_log_size, 如果 max_relay_log_size > 0 的话

max_binlog_size, 如果 max_relay_log_size = 0 或 MySQL 低于 4.0.14

状态文件

状态文件,名字默认为 `master.info` and `relay-log.info`。slave关闭后,会保留他们。当下一次slave启动时,就会读取这两个文件来判断从master读取到二进制日志的什么位置了,处理中继日志到什么位置了。

 4、查看同步状态

Master服务器

Mysql> show master status\G;

 

*************************** 1. row ***************************

            File: mysql-bin.000003

        Position: 111052

    Binlog_Do_DB: sumi_test1

Binlog_Ignore_DB: mysql

1 row in set (0.00 sec)

ERROR: 

No query specified


 

Slave服务器

Mysql > show slave status\G;

 

*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: 192.168.0.32

Master_User: sum

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: mysql-bin.000003

Read_Master_Log_Pos: 111052

Relay_Log_File: sumi2-relay-bin.000014

Relay_Log_Pos: 251

Relay_Master_Log_File: mysql-bin.000003

Slave_IO_Running: Yes                      //如果都是yes,那代表已经在同步

Slave_SQL_Running: Yes

Replicate_Do_DB: sumi_test1

Replicate_Ignore_DB: mysql

 

三、MySQL同步的设置

1、准备服务器

准备两台服务器192.168.0.32master)和192.168.0.25slave)。两MySQLbasedir目录都是/usr/local/mysql,数据存放路径/usr/local/mysq/data/

创建数据库sumi_test1为同步数据库,添加用户sum为专用同步的用户。

注:MasterMySQL版本和Slave的版本相同或者更低,Master的版本定不能高于Slave版本

2、设置MASTER服务器

创建一个MySQL帐号为同步专用:

Mysql > grant  replication slave,reload,super, on *.* to sum@192.168.0.25 identified by 'sum123' ;

Mysql > FLUSH PRIVILEGES ;

修改my.cnf文件

# cat /etc/my.cnf

 

[mysqld]                          //mysqd中添加以下配置

log-bin = mysql-bin

server-id = 1

binlog-do-db = hou                     //需要同步的数据库

binlog-ignore-db = mysql              //忽略此数据库同步,若还有其他数据库不需要同步,在下

binlog-ignore-db = otherdb           面一一列出;

 

然后,将hou数据库导出,并导入slave数据库中,在启动同步之前,两边的数据要一致。

 

3、设置Slave服务器

 

修改my.cnf文件

# vi /etc/my.cnf

 

[mysqld]                   //mysqd中添加以下配置

log-bin = mysql-bin

server-id = 2

master-host = 192.168.0.32

master-user = user

master-password =  passwd

master-port = 3306

replicate-ignore-db = mysql            //需要同步的数据库

replicate-do-db = hou     //忽略此数据库同步,若还有其他数据库不需要同步,在下

replicate-do-db = otherdb        面一一列出


 

 

如上图所示:

 

四、同步数据方法

进行数据同步,网上的方法是将master数据库文件拿过来,势必要终止往主数据库写入,可以参考:

http://vps.15099.net/2009/01/mysql-replication-in-two-vps-hosting-546.html

但是这样从数据库们也不能使用了,王总的方法,可以不影响主数据库写入,从一个从数据库中将数据表拷贝到新slave服务器或问题服务器上来。

环境

Slave1数据库IP211.103.156.201  hostnameC2.xywy.com

Slave2数据库IP211.103.156.203  hostnameC6.xywy.com

步骤

1、先在新的slave上配置好mysql

配置方法见上面章节

2、停止slave 数据库 slave IP:211.103.156.201

# /usr/local/mysq/bin/mysqladmin -uroot -p shutdown

# cd /usr/local/mysql/var/

3、只拷贝需要同步的数据库(club)及需要的日志文件

# tar -zcvf club.tar.gz club

需要备份的日志文件

 

relay-log.info 

c2-relay-bin.index 

c2-relay-bin.000122  //当前执行到的日志

master.info

# tar -zcvf daillog.tar.gz relay-log.info c2-relay-bin.index c2-relay-bin.000122 master.info

4、在slave2上解压数据库club及修改日志名

# tar -zxvf club.tar.gz -C /usr/local/mysql/data/

# tar -zcvf daillog.tar.gz -C /usr/local/mysql/data/

# vi /etc/my.cnf

 

relay-log= /usr/local/mysql/data/c6-relay-bin


 

注:这里要查看一下本机的mysql配置中,relay-log的名字

# cd /usr/local/mysql/data/

# vi relay-log.info

 

data/mysqldata/c6-relay-bin.000139 //修改日志的名字为配置中设置的

10836749

mysql-bin.000017

366167395

# mv c2-relay-bin.index c6-relay-bin.index

# vi vi c6-relay-bin.index

 

/data/mysqldata/c6-relay-bin.000138

/data/mysqldata/c6-relay-bin.000139

# mv c2-relay-bin.000122 c6-relay-bin.000122

5、启动新的slave服务器即可



本文转自 houzaicunsky 51CTO博客,原文链接:http://blog.51cto.com/hzcsky/481396

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
关系型数据库 MySQL 开发工具
MySQL5.7主从配置(Docker)
MySQL5.7主从配置(Docker)
726 0
|
1月前
|
SQL 关系型数据库 MySQL
解决MySQL主从慢同步问题的常见的解决方案:
解决MySQL主从慢同步问题的方法有很多,以下是一些常见的解决方案: 1. 检查网络连接:确保主从服务器之间的网络连接稳定,避免网络延迟或丢包导致数据同步缓慢。 2. 优化数据库配置:调整MySQL的配置参数,如增大binlog文件大小、调整innodb_flush_log_at_trx_commit等参数,以提高主从同步性能。 3. 检查IO线程和SQL线程状态:通过SHOW SLAVE STATUS命令检查IO线程和SQL线程的状态,确保它们正常运行并没有出现错误。 4. 检查主从日志位置:确认主从服务器的binlog文件和位置是否正确,避免由于错误的日志位置导致同步延迟。 5.
117 1
|
4月前
|
负载均衡 关系型数据库 MySQL
MySQL主从架构的搭建
MySQL主从架构的搭建
58 3
|
4月前
|
SQL 关系型数据库 MySQL
小白带你学习linux的mysql服务(主从mysql服务和读写分离三十一)
小白带你学习linux的mysql服务(主从mysql服务和读写分离三十一)
64 0
|
3月前
|
SQL 关系型数据库 MySQL
MySQL-主从架构的搭建
MySQL-主从架构的搭建
52 0
|
7月前
|
SQL 关系型数据库 MySQL
MySQL搭建主从备份读写分离(MySQL5.7案例)
MySQL搭建主从备份读写分离(MySQL5.7案例)
114 0
|
10天前
|
SQL 关系型数据库 MySQL
mysql主从同步出错解决办法
mysql主从同步出错解决办法
7 0
|
5月前
|
SQL 关系型数据库 MySQL
MySQL的主从结构是通过一系列的步骤搭建出来的
MySQL的主从结构是通过一系列的步骤搭建出来的
30 1
|
4月前
|
消息中间件 关系型数据库 MySQL
在kafka connect 同步 mysql 主从数据库
在kafka connect 同步 mysql 主从数据库
43 0
|
4月前
|
关系型数据库 MySQL 数据库
分库分表之基于Shardingjdbc+docker+mysql主从架构实现读写分离(一)
分库分表之基于Shardingjdbc+docker+mysql主从架构实现读写分离(一)