未加星标

MySQL主从多种架构部署及常见错误问题解析

字体大小 | |
[数据库(mysql) 所属分类 数据库(mysql) | 发布者 店小二05 | 时间 2017 | 作者 红领巾 ] 0人收藏点击收藏

本文的主要内容有mysql复制原理,mysql一主多从、双主架构的示例解读,以及mysql在主从复制架构实践中的常见错误问题和解决方法。

一 mysql复制原理 1 原理解读

mysql的复制(replication)是异步复制,即从一个mysql实列或端口(Master)复制到另一个mysql实列的或端口(slave);复制操作由3个进程完成,其中2个(SQL进程和I/O进程)在Slave上,另一个在Master上;要实现复制,必须打开Master端的二进制日志(log-bin),log-bin记录着整个数据对的操作信息,所有slave从master端获取该更新的日志,将其传送到本地并写到本地文件中,然后在读取本地文件内容执行日志中记录的更新操作;slave上已经完整拷贝master数据后,就可以连接到master上然后等待处理更新了。如果master当机或者slave连接断开,slave会定期尝试连接到master上直到能重连并且等待更新.重试的时间间隔由--master-connect-retry选项来控制,它的默认值是60秒。每个slave都记录了它关闭时的日志位置,msater也不知道有多少个slave连接上来或者哪个slave从什么时候开始更新。

2 数据同步实现步骤

(1)mysql的同步功能由三个线程来实现,master上一个,slave上两个;
(2)slave启动时,I/O线程连接到mater上,请求master发送二进制日志中的语句;
(3)mater建立一个I/O线程,把日志内容发送到salve上;
(4)slave上的I/O线程读取master上的binlog dump发送的语句,并且记录到中继日志relay logs;
(5)slave开启SQL线程,读取中继日志,然后执行这些语句来更新数据

slave上开启两个线程很有用:把读日志和执行日志分作两个线程任务处理,执行任务慢的话,读日志的任务不会跟着慢下来,而且读日志任务常常很快就完成,执行任务的sql线程往往需要很久。

二 一主多从架构部署示例及常见故障解决

1 实验环境分配

192.168.1.2master.test.com
192.168.1.3slave1.test.com
192.168.1.4slave2.test.com
2 创建主从复制账号,限定账户在指定服务器登录

在master上创建用户

> grant replication salve on *.* to 'slave1'@'192.168.1.3' identified by '123456';

>grant replication salve on *.* to 'slave2'@'192.168.1.4' identified by '123456';

>flush privileges;

3 备份已有数据,并复制数据到从节点(如果都是新数据库,可以略去此步)

>flush tables with read lock;

>show matser status;

+------------------+----------+--------------+------------------+

|File |Position|Binlog_Do_DB|Binlog_Ignore_DB

+------------------+----------+--------------+------------------+

|mysql-bin.000001| 106 |test |

+------------------+----------+--------------+------------------+

tar zcvf /tmp/mysql.tar.gz /var/lib/mysql/

rsync -zrvz --delete/tmp/mysql.tar.gz 192.168.1.3:/tmp/

rsync -zrvz --delete/tmp/mysql.tar.gz 192.168.1.4:/tmp/

3 解锁

>unlock tables;

QueryOK,0rowsaffected(0.00sec)

4 配置master服务器,修改mysql的主配置文件
vim /etc/my.cnf
[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

user=mysql

symbolic-links=0

####Master####

server-id=1

log-bin=mysql-bin

log-bin-index=mysql-bin.index

relay-log=mysql-relay

relay-log-index=mysql-relay.index

expire-logs-days=10

max-binlog-size=100M

log-slave-updates=1

binlog-do-db=test

replicate-do-db=test

binlog-ignore-db=mysql

replicate-ignore-db=mysql

如果需要备份多个数据库,那么应该写多行

binlog-do-db=test1

binlog-do-db=test2

replicate-do-db=test1

replicate-do-db=test2

修改完成后重启mysql

/etc/init.d/mysqld restart

5 配置slave服务器,修改两个从服务器的配置文件,并重启服务(注意修改server-id)

vim /etc/my.cnf

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

user=mysql

symbolic-links=0

server-id =2

6 在两个slave上配置开启同步

>CHANGEMASTERTO

->MASTER_HOST='192.168.1.2',

->MASTER_USER='salve1', #在104 上面改成slave2

->MASTER_PASSWORD='123456',

->MASTER_PORT=3306,

->MASTER_LOG_FILE='mysql-bin.000001',

->MASTER_LOG_POS=106,

->MASTER_CONNECT_RETRY=10;

QueryOK,0rowsaffected(0.02sec)

mysql>STARTSLAVE;

QueryOK,0rowsaffected(0.00sec)

mysql>SHOWSLAVESTATUS\G;

.............

Slave_IO_Running:Yes

Slave_SQL_Running:Yes

7 查看主数据库的状态

>show matser status;##查看主数据库状态

+------------------+----------+--------------+------------------+

|File |Position|Binlog_Do_DB|Binlog_Ignore_DB

+------------------+----------+--------------+------------------+

|mysql-bin.000001| 106 |test |

+------------------+----------+--------------+------------------+

>show processlist;##查看复制进程状态

8 测试验证

验证方法:在主数据库上创建数据库和在test下创建表,到从数据查看数据是否已经同步。

注意:新建的数据库不会同步,因为数据库的更新只设置了test数据库。

9 故障排除

从服务器上showslavestatus\G;查看slave状态

Slave_IO_Running,为No,则说明IO_THREAD没有启动,请执行:startslaveio_thread;

Slave_SQL_Running为No.则复制出错,查看Last_error字段排除错误后执行:startslavesql_thread;

三 双主互为主备部署解析

1 实验环境准备

192.168.1.2master1.test.com

192.168.1.3 master2.test.com

和一主多从的步骤是一样的,只是同样的步骤执行2次而已

2 双主配置

在masterA上新建一个账户,用户masterB同步数据

masterA操作

>GRANTREPLICATIONSLAVEON*.*TO'master'@'192.168.1..%'IDENTIFIEDBY'123456';

>FLUSHPRIVILEGES;

>FLUSHTABLESWITHREADLOCK;

mysqldump-uroot-p123456--databasestest>/tmp/testA.sql

scp/tmp/testA.sql192.168.1.103:/tmp

>UNLOCKTABLES;

QueryOK,0rowsaffected(0.00sec)

masterB:上同样的建立复制到账户,并导入数据

mysql>GRANTREPLICATIONSLAVEON*.*TO'master'@'192.168.1.%'IDENTIFIEDBY'123456';mysql>FLUSHTABLESWITHREADLOCK;

mysqldump-uroot-p123456--databasestest>/tmp/testB.sql

scp/tmp/testB.sql192.168.1.102:/tmp/

#分别在master1 和master2上分别导入对方的数据.但是存在一个问题:因为存在主键冲突的情况,导出数据的时候,不要把主键给导出来了;如果是一方没有数据,那就直接导入数据就好了,不过也要跳过主键;

mysql-uroot-p123456</tmp/testA.sql

mysql-uroot-p123456</tmp/testB.sql

3修改master1和master2 的配置文件,只是server-id不同

master1:的配置文件

vim /etc/my.cnf

[mysqld]

datadir=/var/lib/mysql

#datadir=/mysqldata

socket=/var/lib/mysql/mysql.sock

user=mysql

symbolic-links=0

####Master####

server-id=1

log-bin=mysql-bin

log-bin-index=mysql-bin.index

relay-log=mysql-relay

relay-log-index=mysql-relay.index

expire-logs-days=10

max-binlog-size=100M

log-slave-updates=1

binlog-do-db=test

replicate-do-db=test

binlog-ignore-db=mysql

replicate-ignore-db=mysql

sync-binlog=1

auto-increment-increment=2

auto-increment-offset=1

#master2:的配置文件

vim /etc/my.cnf

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

user=mysql

symbolic-links=0

###Master####

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

user=mysql

symbolic-links=0

server-id=2

log-bin=mysql-bin

log-bin-index=mysql-bin.index

relay-log=mysql-relay

relay-log-index=mysql-relay.index

expire-logs-days=10

max-binlog-size=100M

log-slave-updates

skip-slave-start

slave-skip-errors=all

binlog-do-db=test

replicate-do-db=test

binlog-ignore-db=mysql

replicate-ignore-db=mysql

sync-binlog=1

auto-increment-increment=2

auto-increment-offs

本文数据库(mysql)相关术语:navicat for mysql mysql workbench mysql数据库 mysql 存储过程 mysql安装图解 mysql教程 mysql 管理工具

主题: SQLMySQL服务器数据TI数据库TSLRY冲突
分页:12
转载请注明
本文标题:MySQL主从多种架构部署及常见错误问题解析
本站链接:http://www.codesec.net/view/534255.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 数据库(mysql) | 评论(0) | 阅读(87)