mysql复制其实就是把数据从一个节点(master) 拷贝到另一个节点(slaves), 当然根据应用架构的不同,采用的方式也不同,MySQL服务器之间的复制使用的是二进制日志机制.对master的更新与变动都会作为事件(event)记录在日志中,日志中的信息会随变化的不同被记录成不同的格式.slaves被配置成从master读取日志,并且执行二进制日志中的事件到slave本地数据库.一旦master启动二进制日志功能,那么所有语句操作都会被记录下来,每一个slave会收到一份整个日志内容的拷贝.slave的责任就是决定日志中的哪条语句需要被执行,而我们不能通过配置master来仅仅记录某些特定的事件.如果您没有另行指定,在主服务器二进制日志中的所有事件都在slave上执行.如果需要,还可以配置slave仅应用来自于特定数据库或表的事件.

根据上图来说说mysql复制的工作机制,复制的过程在主从架构中一般是有三个线程来完成复制工作的,主服务器上dump thread ,从服务器I/O thread ,从服务器sql  thread, 如果想使用多线程的话需要打补丁的, 根据上图一主一从的架构复制是这样工作的,主服务器将操作写入二进制日志,由主服务器上的dump线程将日志发送到从服务器上的I/O线程,然后存储为中继日志,而由sql线程根据中继日志将数据写入从服务器中,下面来配置下这样的复制架构,

*********************************************************************************************************************************************

配置主从复制

一,master和slave上编译安装mysql   这里使用目前最新的mysq版本5.5.25a

 
  1. 下载如下两个软件包到/usr/srC目录  
  2. cmake-2.8.8.tar.gz  
  3. mysql-5.5.25a.tar.gz  
  4. 开始安装配置,主从服务器的配置一样,  
  5. #cd /usr/src  
  6. #tar xzvf cmake-2.8.8.tar.gz  
  7. #cd cmake-2.8.8  
  8. #./bootstrap  
  9. #make  
  10. #make install  
  11. #cd /usr/src  
  12. #tar xzvf mysql-5.5.25a.tar.gz  
  13. #cd mysql-5.5.25a  
  14. #cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \  
  15. -DMYSQL_DATADIR=/data/mysql \ 
  16. -DSYSCONFDIR=/etc \  
  17. -DWITH_INNOBASE_STORAGE_ENGINE=1 \  
  18. -DWITH_ARCHIVE_STORAGE_ENGINE=1 \  
  19. -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \  
  20. -DWITH_READLINE=1 \  
  21. -DWITH_SSL=system \  
  22. -DWITH_ZLIB=system \  
  23. -DWITH_LIBWRAP=0 \  
  24. -DMYSQL_UNIX_ADDR=/tmp/mysqld.sock \  
  25. -DDEFAULT_CHARSET=utf8 \  
  26. -DDEFAULT_COLLATION=utf8_general_ci  
  27. #make  
  28. #make install  
  29. #useradd -r mysql 
  30. #mkdir -p /data/mysql 
  31. #chown -R mysql.mysql /usr/local/mysql/ 
  32. #/usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/data/mysql --basedir=/usr/local/mysql 
  33. #cp /usr/local/mysql/support-files/my-large.cnf /etc/my.cnf 
  34. #vim /etc/my.cnf 
  35. [mysqld]  在mysqld配置中添加
  36. datadir = /data/mysql 
  37.  
  38. #cp -p /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld 
  39. #chkconfig mysqld on 
  40. #service mysqld restart 

二,配置主从复制,

1, 在主服务器上做如下操作

 
  1. #/usr/local/mysql/bin/mysql -e "GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO test@10.0.0.2 IDENTIFIED BY 'passwd';" 
  2. #vim /etc/my.cnf 要保证mysqld配置段里面有以下两行 
  3. log-bin=mysql-bin 
  4. sync_binlog=1 innodb_flush_logs_at_trx_commit=1
  5. server-id       = 1 
  6.  
  7. #service mysqld restart
  8.  
  9. # /usr/local/mysql/bin/mysql -e "SHOW MASTER STATUS"; 记住下面的file字段跟Position待会有用
    • +------------------+----------+--------------+------------------+
    • | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    • +------------------+----------+--------------+------------------+
    • | mysql-bin.000002 |      350 |              |                  |
    • +------------------+----------+--------------+------------------+

2.在从服务器上做以下配置

 
  1. #vim /etc/my.cnf  要保证mysqld配置段里面有如下  
  2. relay-log = mysql-relay  
  3. read_only = ON  
  4. skip_slave_start=1
  5. #log-bin=mysql-bin  
  6. server-id       = 12  
  7.   
  8. #service mysqld restart
  9.  
  10. #/usr/local/mysql/bin/mysql -e "CHANGE MASTER TO MASTER_HOST = '10.0.0.1',MASTER_USER = 'test',MASTER_PASSWORD = 'passwd',MASTER_LOG_FILE = 'mysql-bin.000002',MASTER_LOG_POS = 350;" 
  11. #/usr/local/mysql/bin/mysql -e "START SLAVE;" 

ok, 基本已经配置好了,可以进行测试了,在主服务器上建一数据库,然后在从服务器上看有没有复制过来即可,

*********************************************************************************************************************************************
上面主从的复制基本配置好了,下面来扩展下配置,需要注意的是下面每个小段都是一个知识点,并不是关联起来的,根据自己的需要配置,
如何设置半同步复制, 

 
  1. # 在主服务器上做以下配置 
  2. mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';   
  3. mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;   
  4. mysql> SET GLOBAL rpl_semi_sync_master_timeout = 1000
  5.  
  6. #vim /etc/my.cnf   
  7. [mysqld]   
  8. rpl_semi_sync_master_enabled=1   
  9. rpl_semi_sync_master_timeout=1000  
  10.  
  11.  
  12. #在从服务器上做以下配置 
  13. mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';   
  14. mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;   
  15. mysql> STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;  
  16.  
  17. #vim /etc/my.cnf 
  18. [mysqld]   
  19. rpl_semi_sync_slave_enabled=1   

复制的过滤,配置如下

 
  1. #在主服务器上实现复制过滤,不建议在主服务器上做 
  2. #vim /etc/my.cnf 
  3. [mysqld] 
  4. binlog-do-db=testdb  #表示只保存testdb的二进制日志, 
  5.  
  6.  
  7. #在从服务器上实现复制过滤, 也建议在从服务器上做过滤, 
  8. #vim /etc/my.cnf 
  9. [mysqld] 
  10. replicate_do_db=testdb #表示只复制某个数据库 
  11. rpplicate_ignore_db=testdb  #表示不复制某个数据库 
  12.  
  13. replicate_do_table=testdb.t1  表示只复制testdb库里面的t1表 
  14. replicate_ignore_table=testdb.t1 表示不复制某个库的某个表