关于MySQL AB复制
本文讲解如何快速打包和安装MySQL, MySQL AB复制,MySQL AB双向复制,MySQL多级主从复制,解决AB双向复制主键冲突。
首先我们先介绍什么是MySQL AB复制。
AB复制又称主从复制,实现的是数据同步。如果要做MySQL AB复制,数据库版本尽量保持一致。如果版本不一致,从服务器版本高于主服务器,但是版本不一致不能做双向复制。MySQL AB复制有什么好处呢?有两点,第一是解决宕机带来的数据不一致,因为MySQL AB复制可以实时备份数据;第二点是减轻数据库服务器压力,这点很容易想到,多台服务器的性能一般比单台要好。但是MySQL AB复制不适用于大数据量,如果是大数据环境,推荐使用集群。
然后我们来看看MySQL复制的 3 个主要步骤:
1)主服务器把数据更改记录到二进制日志中,这个操作叫做二进制日志事件;
2)从服务器把主服务器的二进制日志事件拷贝到自己的中继日志(relay log)中;
3)从服务器执行中继日志中的事件,把更改应用到自己的数据上。
快速打包和安装MySQL
在正式介绍MySQL AB复制之前,介绍怎样打包MySQL和快速安装MySQL。
第二步,打包[root@serv08 ~]# find /usr/local/mysql/ /etc/my.cnf /etc/init.d/mysqld > mysql
第三步,拷贝文件到实体机[root@serv08 ~]# tar -cPvzf mysql-5.5.29-linux2.6-x86_64.tar.gz -T mysql [root@serv08 ~]# ll -h total 202M -rw-r--r--. 1 root root 411K Oct 5 19:19 mysql -rw-r--r--. 1 root root 202M Oct 5 19:21 mysql-5.5.29-linux2.6-x86_64.tar.gz
第四步,拷贝文件到serv01[root@serv08 mysql]# scp mysql-5.5.29-linux2.6-x86_64.tar.gz 192.168.1.1:/home/Wentasy/software/
第五步,解压[root@serv01 ~]# yum install /usr/bin/scp -y [root@larrywen 1005]# scp /home/Wentasy/software/mysql-5.5.29-linux2.6-x86_64.tar.gz 192.168.1.11:/opt root@192.168.1.11's password: mysql-5.5.29-linux2.6-x86_64.tar.gz 100% 201MB 33.5MB/s 00:06
第六步,创建组和用户,注意编号和安装好数据库的机器上的用户一致[root@serv01 opt]# tar -xPvf mysql-5.5.29-linux2.6-x86_64.tar.gz
第七步,改变MySQL安装目录的拥有者和所属组[root@serv01 opt]# groupadd -g 500 mysql [root@serv01 opt]# useradd -u 500 -g 500 -r -M -s /sbin/nologin mysql [root@serv01 opt]# id mysql uid=500(mysql) gid=500(mysql) groups=500(mysql)
第八步,启动MySQL,做测试[root@serv01 opt]# chown mysql.mysql /usr/local/mysql/ -R
[root@serv01 opt]# /etc/init.d/mysqld start Starting MySQL.. SUCCESS! [root@serv01 opt]# mysql -bash: mysql: command not found [root@serv01 opt]# vim ~/.bash_profile [root@serv01 opt]# . !$ . ~/.bash_profile [root@serv01 opt]# mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.5.29-log Source distribution Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. 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 statement. mysql>
MySQL AB单向复制
好了,相信读者已经学会怎样打包MySQL和快速安装MySQL,接下来正式进入主题,我们先来看看一主多从架构的拓扑图:
图一 一主多从架构
该图展示了一个 master 复制多个 slave 的架构,多个 slave 和单个 slave 的实施并没有实质性的区别,在 master 端并不在乎有多少个 slave 连接自己,只要有 slave 的 IO 线程通过了连接认证,向他请求指定位置之后的 binary log 信息,他就会按照该 IO 线程的要球,读取自己的binary log 信息,返回给 slave的 IO 线程。
既然对拓扑图和原理有所了解,我们做一个实验,介绍如何使用MySQL AB复制:
实验环境介绍
主机 IP地址 主机名 备注
serv01: 192.168.1.11 serv01.host.com master
serv08: 192.168.1.18 serv08.host.com slave01
操作系统版本:rhel server 6.1
所需要的软件包:mysql-5.5.29-linux2.6-x86_64.tar.gz
第一步,主服务器创建用户并清空日志
第二步,修改从服务器的server-idmysql> show privileges; mysql> grant replication client, replication slave on *.* to 'larry'@'192.168.1.%' identified by 'larry'; Query OK, 0 rows affected (0.00 sec) mysql> show binary logs; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 27320 | | mysql-bin.000002 | 1035309 | | mysql-bin.000003 | 126 | | mysql-bin.000004 | 279 | +------------------+-----------+ 4 rows in set (0.00 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+ 4 rows in set (0.01 sec) mysql> reset master; Query OK, 0 rows affected (0.02 sec) mysql> show binary logs; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 107 | +------------------+-----------+ 1 row in set (0.00 sec)
第三步,从服务器清空日志[root@serv08 ~]# cat /etc/my.cnf | grep server-id server-id = 1 #server-id = 2 [root@serv08 ~]# vim /etc/my.cnf [root@serv08 ~]# cat /etc/my.cnf | grep server-id server-id = 2 #server-id = 2 [root@serv08 ~]# /etc/init.d/mysqld restart Shutting down MySQL... SUCCESS! Starting MySQL.. SUCCESS! #可以查看从服务器中的数据文件 [root@serv08 ~]# cd /usr/local/mysql/data/ [root@serv08 data]# ll total 29752 -rw-rw----. 1 mysql mysql 18874368 Oct 5 19:45 ibdata1 -rw-rw----. 1 mysql mysql 5242880 Oct 5 19:45 ib_logfile0 -rw-rw----. 1 mysql mysql 5242880 Oct 5 18:16 ib_logfile1 drwxr-xr-x. 2 mysql mysql 4096 Oct 5 18:15 mysql -rw-rw----. 1 mysql mysql 27320 Oct 5 18:15 mysql-bin.000001 -rw-rw----. 1 mysql mysql 1035309 Oct 5 18:15 mysql-bin.000002 -rw-rw----. 1 mysql mysql 126 Oct 5 18:16 mysql-bin.000003 -rw-rw----. 1 mysql mysql 126 Oct 5 19:45 mysql-bin.000004 -rw-rw----. 1 mysql mysql 107 Oct 5 19:45 mysql-bin.000005 -rw-rw----. 1 mysql mysql 95 Oct 5 19:45 mysql-bin.index drwx------. 2 mysql mysql 4096 Oct 5 18:15 performance_schema -rw-r-----. 1 mysql root 4775 Oct 5 19:45 serv08.host.com.err -rw-rw----. 1 mysql mysql 5 Oct 5 19:45 serv08.host.com.pid drwxr-xr-x. 2 mysql mysql 4096 Oct 5 18:12 test
mysql> show binary logs; ERROR 2006 (HY000): MySQL server has gone away No connection. Trying to reconnect... Connection id: 1 Current database: *** NONE *** +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | m