很久之前就听过MySQL主从同步功能,一直都没有花时间去做这方面的尝试。最近公司有需求做MySQL主从同步功能,就花时间在网上找了找这方面配置的资料,了解到主从备份的大致优点:
MySQL的主从同步是一个很成熟的架构,优点为:
①在从服务器可以执行查询工作(即我们常说的读功 能),降低主服 务器压力;
②在从主服务器进行备份,避免备份期间影响主服务器服务;
③当主服务器出现问题时,可以切换到从服务器。
MySQL异步复制基本原理
从MySQL3.23.15以后,MySQL支持单向的异步复制。也就是说,1台MySQL服务器充当Master(主库),1台或多台 MySQL服务器充当Slaves(从库),数据从Master向Slaves进行异步复制。注意,这种复制是异步的,有别于MySQL的同步复制实现(这种实现称做MySQL集群,MySQL Cluster)。
当主库有更新的时候,主库会把更新操作的SQL写入二进制日志(Bin log),并维护一个二进制日志文件的索引,以便于日志文件轮回(Rotate)。在从库启动异步复制的时候,从库会开启两个I/O线程,其中一个线程连接主库,要求主库把二进制日志的变化部分传给从库,并把传回的日志写入本地磁盘。另一个线程则负责读取本地写入的二进制日志,并在本地执行,以反映出这种变化。较老的版本在复制的时候只启用一个I/O线程,实现这两部分的功能。
有几个关键性的地方需要注意:
- 主库必须启用Bin log,主库和从库必须有唯一的Server Id
- 从库必须清楚了解从主库的哪一个Bin log文件的哪一个偏移位置起开始复制
- 从库可以从主库只复制指定的数据库,或者数据库的某些数据表
- 主库和从库的数据库名称可以不一样,不过还是推荐使用一样的名称
- 主库和从库的MySQL版本需保持一致
尝试测试的开发的生产环境为:
主数据库:IP:192.168.1.191 MySQL版本:Ver 14.14 Distrib 5.1.53
从数据库:IP:192.168.1.192 MySQL版本:Ver 14.12 Distrib 5.0.91
从数据库:IP:192.168.1.193 MySQL版本:Ver 14.12 Distrib 5.0.91
服务器操作系统都是:Centos 5.6
A:配置主数据库:
1.修改主库(IP:192.168.1.191) my.cnf配置文件
#vim /etc/my.cnf
在[mysqld]区域段内加入以下配置:
server-id =1 #设置主机ID标识,注意此ID不要同其他主机相同,保证唯一性
log-bin=mysql-bin #记录mysql日志
binlog-do-db=database1 #设置需要同步的数据库,如果有多个数据库,每个数据库一行
binlog-do-db=database2 #再增加一个需要同步的数据库
binlog-ignore-db=mysql #设置不需要同步的数据库,如果有多个数据库,每个数据库一行
2.重启主库(IP:192.168.1.191)MySQL服务器,使配置生效
#service mysqld restart
3.增加一个数据库用户,给予此用户可远程连接到主库数据,且要有对需要备份数据库操作所有权限。
增加用户语句:grant all privileges on *.* to '用户名'@'%' identified by '密码';
#mysql -uroot -p //登陆数据库
mysql>grant all privileges on *.* to 'kylingood'@'%' identified by '123456'; //建立数据库kylingood用户
4.选其中一台从库(IP:192.168.1.192或IP:192.168.1.193)验证,新增加的数据库用户是否有权限登陆主服务器,且是否具有对备份数据进行想关操作权限。
从库:IP:192.168.1.192
#mysql -h 192.168.1.191 -u kylingood -p
如果可以连接成功,且能对需要备份数据进行操作,证明用户权限这块已没有问题。
这点很重要,大部分原因同步配置不成功,很可能是用户没有权限造成。
5.把主库表给锁住,并把需要备份的数据分别导入到对应的二个从库.
为了避免风险,新主库mysql现在最好不要对外提供服.同时主库中复制数据到两个从库. 可以直接压缩数据库文件包,并上传到二个从服务器上。
mysql> flush tables with read lock;
6.查看并记录同步的位置,记住File和position的值,在下面同步时会运用到这二个数据。
mysql>show master status;
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 98 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
B:修改二个从库(IP:192.168.1.192)和(IP:192.168.1.193)配置文件my.cnf
1.分别修改对应的数据库配置文件
#vim /etc/my.cnf
在[mysqld]区域段内加入以下配置:
IP:192.168.1.192
server-id=2 #请注意这个ID唯一性
log-bin=mysql-bin #记录mysql日志
binlog-do-db=database1 #设置需要同步的数据库,如果有多个数据库,每个数据库一行
binlog-do-db=database2 #再增加一个需要同步的数据库
binlog-ignore-db=mysql #设置不需要同步的数据库,如果有多个数据库,每个数据库一行
IP:192.168.1.193
server-id=3 #请注意这个ID唯一性
log-bin=mysql-bin #记录mysql日志
binlog-do-db=database1 #设置需要同步的数据库,如果有多个数据库,每个数据库一行
binlog-do-db=database2 #再增加一个需要同步的数据库
binlog-ignore-db=mysql #设置不需要同步的数据库,如果有多个数据库,每个数据库一行
此二个配置基本和主库一样,是为了以后如果同步出错,或是主服务器出问题,可以做主从切换,这样网站就可以在短时间内恢复。
2.把主库数据分别导入到对应从服务器的数据库中
3.解锁主库表(IP:192.168.1.191).
mysql>unlock tables;
4.开始设置同步
设置连接MASTER MASTER_LOG_FILE为主库的File,MASTER_LOG_POS为主库的Position
mysql>slave stop;
mysql> change master to master_host='192.168.1.191',master_user='kylingood', master_password='123456',
master_log_file=mysql-bin.000001', master_log_pos=98;
mysql> slave start;
解释一下:
master_host='主服务器IPod'
master_user='允许连接主库的用户名',
master_password='用户密码',
master_log_file='主库的File',
master_log_pos='主库的Position';
5.查看主从同步是否配置成功.
下面输出的信息参考说明可以参考观方文档:
http://dev.mysql.com/doc/refman/5.1/zh/replication.html
mysql> show slave status\G;
Slave_IO_Running: Yes(网络正常);
Slave_SQL_Running: Yes(表结构正常),
进一步验证了以上过程的正确性,截图如下(一定要保证这二项参数为YES).

在主MySQL上可输入mysql> show full processlist;
观察其状态,正确结果也应该如截图所示:

6.测试从主数据插入,删除数据操作,再去二个从库查看是否有同步到。如果可以同步,则恭喜您配置主从同步成功。
MySQL主从架构投入生产前后应该注意的事项:
一、配置前,master和slave的hostname一定要取个不同的,免得配置时发生问题;另外,强烈建议ntpdate二台服务器的时间,不然来个未来(feature)时间就麻烦了。
二、由于MySQL数据库走的都是内网,所以二台机器的iptables可以关闭,在配置过程中由于没关iptables发生了错误,直接导致admin在slave数据库上连不上主数据库,这个特指出来给大家借荐 下;
三、主MySQL的binlog功能一定要打开,我们的线上服务器有次由于PHP程序误操作,可以用binlog恢复过来了;但开启此功能要注意binlog的大小。
附参考资料:
http://dev.mysql.com/doc/refman/4.1/en/replication.html
http://blog.sina.com.cn/s/blog_4b0710d8010007eo.html
http://www.javaeye.com/topic/153875
http://www.php100.com/html/webkaifa/database/Mysql/2010/1103/6744.html
http://blogold.chinaunix.net/u/27383/showart_542565.html
http://www.blogjava.net/lzj520/archive/2008/02/27/182485.html