同步功能在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上的更新引起冲突。
步骤一:MySQL同步功能由3个线程(master上1个,slave上2个)来实现。执行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/O和SQL线程。
slave有2个线程的好处:把读日志和执行分开成2个独立的任务。执行任务如果慢的话,读日志任务不会跟着慢下来。
如:slave停止了一段时间,那么I/O线程可以在slave启动后很快地从master上读取全部日志,尽管SQL线程可能落后I/O线程好几的小时。如果slave在SQL线程没全部执行完就停止了,但I/O线程却已经把所有的更新日志都读取并且保存在本地的中继日志中了,因此在slave再次启动后就会继续执行它们了。这就允许在master上清除二进制日志,因为slave已经无需去master读取更新日志了。
在master上,执行下面的命令,可以看到运行状态
Mysq > SHOW PROCESSLIST\G;
Mysql > show master status\G;
在slave上,可以执行以下命令
Mysql > show slave status\G;
中继日志
默认地,中继日志的名字格式为 `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 |
准备两台服务器192.168.0.32(master)和192.168.0.25(slave)。两个MySQL的basedir目录都是/usr/local/mysql,数据存放路径/usr/local/mysq/data/。
创建数据库sumi_test1为同步数据库,添加用户sum为专用同步的用户。
注:Master的MySQL版本和Slave的版本相同或者更低,Master的版本一定不能高于Slave版本。
创建一个MySQL帐号为同步专用:
Mysql > grant replication slave,reload,super, on *.* to [email protected] 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数据库中,在启动同步之前,两边的数据要一致。
修改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数据库IP:211.103.156.201 hostname:C2.xywy.com
Slave2数据库IP:211.103.156.203 hostname:C6.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服务器即可。