一、前言:为什么MySQL要做主从复制(读写分离)?
通俗来讲,如果对数据库的读和写都在同一个数据库服务器中操作,业务系统性能会降低。
为了提升业务系统性能,优化用户体验,可以通过做主从复制(读写分离)来减轻主数据库的负载。
而且如果主数据库宕机,可快速将业务系统切换到从数据库上,可避免数据丢失。
二、MySQL主从复制(读写分离)和集群的区别:
1、主从复制(读写分离):一般需要两台及以上数据库服务器即可(一台用于写入数据,一台用于同步主的数据并用于数据查询操作)。
局限性:
(1)配置好主从复制之后,同一张表,只能对一个服务器写操作。如果在从上执行了写操作,而之后主也操作了这张表,或导致主从不同步;据说可以配置成主主方式,但我还没有研究到。
(2)主数据库服务器宕机,需要手动将业务系统切换到从数据库服务器。无法做到高可用性(除非再通过部署keepalive做成高可用方案)。
2、集群是由N台数据库服务器组成,数据的写入和查询是随机到任意一台数据库服务器的,其他数据库服务器会自动同步数据库的操作。
任何一台数据库宕机,不会对整个集群造成大的影响。
局限性:我经过测试才知道目前mysql集群版本(MySQL Cluster)只能对NDB存储引擎的数据进行集群同步,如果是INNODB或其他的MySQL存储引擎是不行的。这个也导致了我放弃了在业务系统中应用这种方案。
三、回归正题,接下来开始MySQL5.6.12的主从复制教程:
1、MySQL5.6开始主从复制有两种方式:基于日志(binlog);基于GTID(全局事务标示符)。
需要注意的是:GTID方式不支持临时表!所以如果你的业务系统要用到临时表的话就不要考虑这种方式了,至少目前最新版本MySQL5.6.12的GTID复制还是不支持临时表的。
所以此篇教程主要是告诉大家如何通过日志(binlog)方式做主从复制!
2、MySQL官方提供的MySQL Replication教程:
http://dev.mysql.com/doc/refman/5.6/en/replication.html
这个官方教程强烈建议大家阅读(需要一定的英语阅读能力哦!不行就google翻译后再阅读吧~)。
3、准备工作:
(1)配置MySQL主从复制(读写分离)之前,需要在主从两台服务器先安装好MySQL5.6。
(2)目前最新的MySQL5.6 GA版本是MySQL5.6.12
个人推荐Linux(RedHat/CentOS 6.4)源码编译安装,具体可以看本站这篇教程:RedHat/CentOS源码编译安装MySQL5.6.12
(3)注意:
(a)如果你需要用于生产环境,安教程安装MySQL时不要急着做mysql启动操作。建议把mysql初始化生成的/usr/local/mysql/mysql.cnf删除,然后把你优化好的mysql配置文件my.cnf放到/etc下。
(b)建议主备两台服务器在同一局域网,主备两台数据库网络需要互通。
(4)我的环境:
主数据库IP:192.168.100.2
从数据库IP:192.168.100.3
4、修改主数据库的的配置文件:
1
[mysqld]
2
server-id=1
3
log-bin=mysqlmaster-bin.日志代码> <代码> 4> 代码<代码类="普通"> sync_binlog=1 代码> <代码> 5 代码> <代码类="普通"> #注意:下面这个参数需要修改为服务器内存的70%左右代码> <代码> 6> 代码通过innodb_buffer_pool_size=<代码类="普通"> 512 代码> <代码> 7 代码> <代码类="普通"> innodb_flush_log_at_trx_commit=1 代码> <代码> 8 代码> <代码类="普通"> sql_mode=STRICT_TRANS_TABLES NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION, NO_AUTO_VALUE_ON_ZERO 代码> <代码> 9 代码> <代码类="普通"> lower_case_table_names 10=1 代码> <代码> 代码> <代码类="普通"> log_bin_trust_function_creators=1 代码> 修改之后要重启mysql:
<代码> 1 代码> <代码类="普通"> #/etc/init.d/mysql重启代码>
5,修改从数据库的的配置文件(服务器id配置为大于1的数字即可):
<代码> 1 代码> <代码类="普通"> (mysqld) 代码> <代码> 2> 代码<代码类="普通">服务器id=2 代码> <代码> 3 代码> <代码类="普通"> log-bin=mysqlslave-bin。日志代码> <代码> 4> 代码<代码类="普通"> sync_binlog=1 代码> <代码> 5 代码> <代码类="普通"> #注意:下面这个参数需要修改为服务器内存的70%左右代码> <代码> 6> 代码通过innodb_buffer_pool_size=<代码类="普通"> 512 代码> <代码> 7 代码> <代码类="普通"> innodb_flush_log_at_trx_commit=1 代码> <代码> 8 代码> <代码类="普通"> sql_mode=STRICT_TRANS_TABLES NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION, NO_AUTO_VALUE_ON_ZERO MySQL 5.6主从复制配置