一、前言:为什么MySQL要做主从复制(读写分离)?
通俗来讲,如果对数据库的读和写都在同一个数据库服务器中操作,业务系统性能会降低。
为了提升业务系统性能,优化用户体验,可以通过做主从复制(读写分离)来减轻主数据库的负载。
而且如果主数据库宕机,可快速将业务系统切换到从数据库上,可避免数据丢失。
二、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翻译后再阅读吧~)。
三:准备工作
配置MySQL主从复制(读写分离)之前,需要在主从两台服务器先安装好MySQL5.5。我的环境是2台做的实验
系统:CentOS6.4 32位
Mysql:5.5版本
selinux关闭 防火墙关闭
setenfore 0 setvice iptables stop
Master:42.51.153.157
Slave:42.51.155.219
2.就是要确定服务器上的Mysql
yum install mysql mysql-server -y
3.确认时间同步
[[email protected] ~]# yum install ntp -y [[email protected] ~]# vi /etc/ntp.conf #添加以下2行 server 127.127.1.0 fudge 127.127.1.0 stratum 8
[[email protected] ~]# /etc/init.d/ntpd restart #重启ntpd服务
2)在节点服务器上进行时间同步
[[email protected] ~]# /etc/init.d/iptables stop [[email protected] ~]# chkconfig iptables off [[email protected] ~]# yum install -y ntpdate [[email protected] ~]# /usr/sbin/ntpdate 42.51.153.157
四:配置Mysql
1.首先修改Mysql主配置的配置文件(Master)
[[email protected] ~]# \cp /etc/my.cnf /etc/my.cnf.old ##修改之前备份 [[email protected] ~]# vi /etc/my.cnf ##修改 server-id = 11 //修改 log-bin=master-bin //修改 log-slave-updates=true //增加 [[email protected] ~]# /etc/init.d/mysqld restart ##重启Mysql [[email protected] ~]# mysql -u root –ppassword //登录数据库,给从服务器授权 mysql> grant replication slave on *.* to ‘yanghongfei‘@‘42.51.155.219‘ identified by ‘123456‘; mysql> flush privileges; mysql> show master status; ##这个日志后面会用的到 +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000005 | 343 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
2.配置从服务器 (Slave)
[[email protected] shell]# vi /etc/my.cnf server-id = 33 //修改 此处ID只要比Master大就可以 relay-log=relay-log-bin //增加 relay-log-index=slave-relay-bin.index //增加 修改完成之后重启mysql服务 登录Mysql,配置同步 [[email protected] shell]# service mysqld restart [[email protected] ~]# mysql -u root –ppassword mysql> stop slave; ##首先停止 mysql> change master to master_host=‘42.51.153.157‘,master_user=‘yanghongfei‘,master_password=‘123456‘,master_log_file=‘mysql-bin.000005‘,master_log_pos=343; mysql> start slave; mysql> show slave status \G;
查看是否成功~
上面2处都为Yes的时候表示已经成功了~~
3. 测试主从是否复制成功,主服务器创建数据库看是不是被同步过去了
Master:
Slave:
下面我来装一个Discuz论坛 我们来测试下数据表会不会被同步进去,这里安装网站不再详细说了 我这面用的环境是lnmp 首先下载一个Discuz的包 网上有很多
[[email protected] ~]# unzip Discuz_7.2_FULL_SC_UTF8.zip [[email protected] ~]# mv upload/ /usr/share/nginx/html/ [[email protected] ~]# cd /usr/share/nginx/html/ [[email protected] html]# mv upload/ Discuz [[email protected] html]# chmod 777 -R ./Discuz/ [[email protected] ~]# service nginx restart
Master:
Slave:
上面可以看出主从复制成功~~