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

本文的主要内容有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.2    master.test.com

192.168.1.3    slave1.test.com

192.168.1.4    slave2.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;

Query OK, 0 rows affected (0.00 sec)

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上配置开启同步

> CHANGE MASTER TO

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

Query OK, 0 rows affected (0.02 sec)

mysql> START SLAVE;

Query OK, 0 rows affected (0.00 sec)

mysql> SHOW SLAVE STATUS\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 故障排除

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

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

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

三 双主互为主备部署解析


1 实验环境准备

192.168.1.2    master1.test.com

192.168.1.3    master2.test.com

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

2 双主配置

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

masterA操作

> GRANT REPLICATION SLAVE ON *.* TO ‘master‘@‘192.168.1..%‘ IDENTIFIED BY ‘123456‘;

> FLUSH PRIVILEGES;

> FLUSH TABLES WITH READ LOCK;

mysqldump -uroot -p123456 --databases test >/tmp/testA.sql

scp /tmp/testA.sql 192.168.1.103:/tmp

> UNLOCK TABLES;

Query OK, 0 rows affected (0.00 sec)

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

mysql> GRANT REPLICATION SLAVE ON *.* TO ‘master‘@‘192.168.1.%‘ IDENTIFIED BY ‘123456‘;mysql> FLUSH TABLES WITH READ LOCK;

mysqldump -uroot -p123456 --databases test >/tmp/testB.sql

scp /tmp/testB.sql 192.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-offset   = 2

4 分别在master1和master2上获取File和Position位置

master1:

>flush tables with read lock;

>show matser status;

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

| File                       | Position | Binlog_Do_DB |Binlog_Ignore_DB

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

| mysql-bin.000002|   106      | test               |       mysql

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

>unlock tables;

master2:

>flush tables with read lock;

>show matser status;

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

| File                       | Position | Binlog_Do_DB |Binlog_Ignore_DB

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

| mysql-bin.000003|   106      | test               |          mysql

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

>unlock tables;

5 配置主从,分别在master1和 master2上配置对方的从

master1上:

> CHANGE MASTER TO

->   MASTER_HOST=‘192.168.1.3‘,

->   MASTER_USER=‘master‘,

->   MASTER_PASSWORD=‘123456‘,

->   MASTER_PORT=3306,

->   MASTER_LOG_FILE=‘mysql-bin.000003‘,

->   MASTER_LOG_POS=106,

->   MASTER_CONNECT_RETRY=10;

Query OK, 0 rows affected (0.02 sec)

mysql> START SLAVE;

Query OK, 0 rows affected (0.00 sec)

master2上:

> CHANGE MASTER TO

->   MASTER_HOST=‘192.168.1.2‘,

->   MASTER_USER=‘master‘,

->   MASTER_PASSWORD=‘123456‘,

->   MASTER_PORT=3306,

->   MASTER_LOG_FILE=‘mysql-bin.000002‘,

->   MASTER_LOG_POS=106,

->   MASTER_CONNECT_RETRY=10;

Query OK, 0 rows affected (0.02 sec)

mysql> START SLAVE;

Query OK, 0 rows affected (0.00 sec)

用>show processlist查看进程状态

6 测试,在其中一个数据库test中创建新表,插入数据,在另一个数据库中查看是否同步。

四 主从复制中常见的故障及解决方法


1 从服务器上show slave status\G;查看slave状态为NO

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

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

2 主服务器宕机了,如何把从服务器提升会主服务器

在一主多从的环境中,必须选择数据最新的从服务器做新的主服务器,以保证数据的完整可靠。在一主两从的环境中,Server1宕机后,等到Server1和Server2把宕机前同步到的日志都执行完,比较Master_Log_File和Read_Master_Log_Pos就可以判断出谁快谁慢,因为Server2从 Server1同步的数据(1589)比Server3从Server1同步的数据(1293)新,所以应该提升Server2为新的主服务器。

3 主从复制突然停止了,该怎么处理

复制错误多半是因为日志错误引起的,所以首先要搞清楚是主日志错误还是中继日志错误,从错误信息里就能判断,如果不能判断,则使用下面的mysqlbinlog命令:

shell> mysqlbinlog <MASTER_BINLOG_FILE> > /dev/null

shell> mysqlbinlog <SLAVE_BINLOG_FILE> > /dev/null

# 如果没有错误,则不会有任何输出,反之如果有错误,则会显示出来.

如果是主日志错误,则需要在从服务器设置SET GLOBAL sql_slave_skip_counter

mysql> SET GLOBAL sql_slave_skip_counter = 1;

mysql> START SLAVE;

注:如果有多个错误,可能需要执行多次(提醒:主从服务器数据可能因此不一致)

如果是中继日志错误,只要在从服务器使用CHANGE MASTER TO即可,系统会抛弃当前的中继日志,重新下载。

mysql> CHANGE MASTER TO

MASTER_LOG_FILE=’<Relay_Master_Log_File>’,

MASTER_LOG_POS=<Exec_Master_Log_Pos>;

mysql> START SLAVE;

另外,不同的应用环境系统总会出现各种各样的错误,处理错误的最重要依据是根据日志中错误信息分析定位故障所在,建议在出现故障时候,不要忙着百度谷歌找答案,先去日志上看看,大部分的应用故障都会有相应的日志输出,通过日志分析错误是基本的”救火之道“。

时间: 2024-08-02 06:48:31

MySQL主从多种架构部署及常见错误问题解析的相关文章

Mysql主从数据库架构的复制原理及配置详解

1 复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的.复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器.主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环.这些日志可以记录发送到从服务器的更新.当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置.从服务器接收

WAVSEP在Linux系统中部署时常见错误

使用Tomcat部署时常见错误 环境:Debian7 , tomcat7, WAVSEP v1.5 安装时提示: javax.servlet.ServletException: java.sql.SQLException: Database 'db/WavsepConfigDB'  not found 原因: tomat用户没有写入根目录的权限. 解决办法: 以root身份运行,在根目录建立db目录并将所有权授予tomcat用户. #mkdir /db #chown -R tomcat:tomc

MySQL+Heartbeat+DRBD架构部署

MySQL高可用生成业务需求 在企业实际生产场景中,一主多从的MYSQL数据库架构是最常用的DB架构方案,该架构方案部署简单,维护方便,并且通过配置简单的代理或者通过程序的方式就可以实现应用服务队主从库的读写分离,且多个从库还可以通过LVS或者Haproxy等代理实现多个从库的负载均衡,分担读的压力,同时排除单点问题 但是MYSQL数据库架构中,我们不难发现,虽然从库是多个,但是主库仅有一个,也就是说主库一旦宕机,所以写的业务都会终止,而从库宕机1个就没什么影响,那么如何解决这个主库单点的问题呢

mysql主从机制的部署与应用

部署mysql主从复制 Mysql master ip: 192.168.30.25   一主两从 Mysql slave ip: 192.168.30.24 Mysql slave ip:192.168.30.23 关闭防火墙 [[email protected] ~]# setenforce 0 [[email protected] ~]# iptables -F [[email protected] ~]# systemctl stop firewalld 在mysql master 上的

linux服务器部署svn常见错误处理→转载

转载地址→http://blog.seweal.com/post/2013-02-04/svn-errors [开放svn端口] iptables -I INPUT -p tcp --dport 3690 -j ACCEPT #开放3690端口 /etc/rc.d/init.d/iptables save #保存配置,非常重要,保存才能生效 /etc/init.d/iptables status # 查看是否已经成功: 如果提示 iptables: command not found 则是没有安

MySQL wait_timeout参数设置与网上常见错误小纠

discard connection com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet successfully received from the server was 1,210,878 milliseconds ago. The last packet sent successfully to the server was 0 millis

MySQL 主从复制 详细实例讲解 与 常见错误解决方法

一.主机ip 192.168.0.128 ,从机ip:192.168.0.130 分别测试是否能ping通对方,如果不能,请关闭防火墙或开放对应端口 二.主服务器配置 1.备份主服务器的数据 mysqldump -uroot --all-databases --lock-all-tables > ~/master_db.sql -p 将来会在家目录下生产一个master_db.sql的数据库文件,即备份文件 2.修改主服务器的配置文件 vim /etc/my.cnf 添加 [mysqld] lo

rancher 使用RKE部署Kubernetes常见错误解决方法

./rke up报错如下:panic: runtime error: slice bounds out of range [recovered] panic: runtime error: slice bounds out of range解决办法:重新修改了cluster.yml文件 ./rke up报错如下:FATA[0080] Failed to create [rke-worker-port-listener] container on host [192.168.18.132]: Ca

趁一切还来得及【五】数据库MySQL主从同步的实践部署

自笑栖迟淮海客,十年心事一灯前.                                           --[元]萨都拉 第二章 数据库MySQL主从同步部署操作实践 2.1 数据同步相关应用基础 ①MySQL主从同步架构是目前使用最多的数据库架构之一,尤其是负载比较大的网站,因此对于主从同步的部署管理也就显得非常重要. ②MySQL主从同步的作用:(1) 数据分布,(2) 负载平衡(load balancing),(3) 备份,(4) 高可用性(high availability