mysql数据库的主、从复制是比较简单的,但是也是mysql数据库高可用性的一个基础,我的理解是所有mysql的高可用都是从这主、从简单复制演变而来。写这篇博客是因为最近有位同事和我说他做mysql ha实验,使用的是keepalived+mysql主、从架构,使我疑惑了,与他一起再次复习mysql ha的高可用架构,知道这样的架构并不理想。

    我的理解是主、从复制存在时间差的,数据库一致性得不到保证,即使是使用shell 进行监控从数据库的复制性那也是需要时间的,一个简单的例子当master down时从还没复制完全或没有复制,在实际的生产环境中就存在大问题了。而主、主复制的架构,就很好的解决了数据库一致性问题,是可以使用keepalived来实现。

    主、从复制的架构毕竟还是为了数据库的备份,虽然是热备的一种但是不能让他去做高冗余吧,其实这种架构我还是很欣赏的,还有一个好处可以读、写分离来提高数据库的I/O性能,我虽然建立的电子商务平台不多,但基本上上线的还是这个架构为主。这种架构在master出现故障后,还是要靠手工去切换,不存在裂脑问题,同时毕竟牵扯到数据库,稳妥点比较好,电子商务中数据库的事都是大事。

    另一种架构我是非常欣赏并使用过主、主的自动切换架构,即解决了单点故障问题,还可以自动切换(一定要设置切换时报警,还是要上线看的),同时还互为备份。在参看了煮酒抚琴兄的一篇mysql数据库优化(下)后,给我的启发是如果数据库的投入充裕的话,还可以主主、从的架构,虽然没有直接应用过,但从理论上应该是中底端mysql数据库应用最稳定的吧,有机会的话应用下,这架构下再加上负载均衡应该问题不大。有时间的话,一定要做这个测试来看看效果。

    mysql+lvs+cluster+keepalived的负载均衡、HA架构也应用过,但效果不是很理想,并且那个成本实在有点高,后期维护也是个问题,后面会把这个架构我实施的步骤和配置列出来,给感兴趣的朋友一起研究。

    我认为无论是那种高可用的mysql架构,至少做到本地和异地双备份。

    主、从复制就简单多了,大家都知道主、从复制的原理就是以下三步:

  (1)master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
    (2)slave将master的binary log events拷贝到它的中继日志(relay log);
    (3)slave重做中继日志中的事件,将改变反映它自己的数据。             

    这里提醒下大家,只需要将master二进制的日志打开即可,从的不需要,这点往往是很多人忽视的,数据引擎我一般是用的InnoDB。

实验环境:centos 6.4 mysql-server-5.1.73-3.el6_5.x86_64。

    一、开启Master的二进制日志

    开启mysql的binlog日志 

    vi/etc/my.cnf     mysqld中加入

    server-id=1

    log-bin = mysql-bin   

    binlog-do-db=falvhezi2 (需要同步的库)
    binlog-ignore-db=mysql (不需要同步的)

    binlog-ignore-db=test (不需要同步的)

wKioL1NfFIuj1BCzAABnZVFHcgI048.jpg

    重启mysqld,成功后进入mysql查看是否开启日志。

    mysql -uroot -p

wKiom1NeGRLzBIT8AACR-ebUQds768.jpg

    上图可以看到log_bin已打开。

    如果出现下图,那就是出现错误,需重新检查my.cnf的配置

wKioL1NeGUPRUnULAACAMSPuqBg912.jpg

    log_bin打开后,输入show master status;查看并记录

 

    二、授权master同步的用户

    grant all on *.* to share@192.168.1.163 identified by "admin888";

    设置mysql用来同步的用户名,指定从服务器IP及密码。

   wKioL1NfFZ2TjB_EAACgRlJ99y0662.jpg

     别忘记flush privileges;

     三、配置slaver

     先测试下share用户能否登录到master上。

    wKioL1NfGbGhEdBTAAChuaZKKvg572.jpg     查看下 slaver的状态 ,确定master_log_file和主数据库的对应,并且Slave_IO_Running和Slave_SQL_Running是yes状态,说明成功在即。

    wKioL1NfHLjx-ihoAAEvjjthIf0725.jpg

    start slave;

    wKioL1NfHXGANMmHAAAvstKKGmk129.jpg

    成功了。

    有两点问题要注意: 
    Slave_IO_Running: NO 
    如果此项为NO多为连接性问题 
    1、 两个服务器系统之间网络连接问题 
    2、 数据库用户权限问题 
    Slave_SQL_Running: NO   
    数据库二进制文件权限不对