[技术>>MySQL]

利用MySQL的MASTER SLAVE异步功能来实现数据库主从同步

  • 时间:2011年05月03日 19:04:05
  • 浏览量:2233
  • 评论量:2
  • 作者:Kylingood

很久之前就听过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
 

原创文章如转载,请注明:转载OOPHP开源博客 [ http://www.oophp.cn/article/view/id/422 ]

上一篇:如何解决Nginx+PHP出现The p... 下一篇:[转]怎样在linux下查看内核版本、系...

: Baidu搜藏 QQ书签 Google书签 Del.icio.us POCO网摘 Yahoo书签 新浪ViVi 365Key网摘 天极网摘 和讯网摘 Windows Live 提交新发现,Dig it

用户推荐文章
相关文章
网友评论
发表评论

会员的头像

: 请选个帅照吧!
:  *  尊姓大名大名(2-30字).
:  *  来了就多说几句吧(4-250字)
:  *  没办法,只为防机器人@_@