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- 下载如下两个软件包到/usr/srC目录
- cmake-2.8.8.tar.gz
- mysql-5.5.25a.tar.gz
- 开始安装配置,主从服务器的配置一样,
- #cd /usr/src
- #tar xzvf cmake-2.8.8.tar.gz
- #cd cmake-2.8.8
- #./bootstrap
- #make
- #make install
- #cd /usr/src
- #tar xzvf mysql-5.5.25a.tar.gz
- #cd mysql-5.5.25a
- #cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
- -DMYSQL_DATADIR=/data/mysql \
- -DSYSCONFDIR=/etc \
- -DWITH_INNOBASE_STORAGE_ENGINE=1 \
- -DWITH_ARCHIVE_STORAGE_ENGINE=1 \
- -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
- -DWITH_READLINE=1 \
- -DWITH_SSL=system \
- -DWITH_ZLIB=system \
- -DWITH_LIBWRAP=0 \
- -DMYSQL_UNIX_ADDR=/tmp/mysqld.sock \
- -DDEFAULT_CHARSET=utf8 \
- -DDEFAULT_COLLATION=utf8_general_ci
- #make
- #make install
- #useradd -r mysql
- #mkdir -p /data/mysql
- #chown -R mysql.mysql /usr/local/mysql/
- #/usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/data/mysql --basedir=/usr/local/mysql
- #cp /usr/local/mysql/support-files/my-large.cnf /etc/my.cnf
- #vim /etc/my.cnf
- [mysqld] 在mysqld配置中添加
- datadir = /data/mysql
- #cp -p /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
- #chkconfig mysqld on
- #service mysqld restart
二,配置主从复制,
1, 在主服务器上做如下操作- #/usr/local/mysql/bin/mysql -e "GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO test@10.0.0.2 IDENTIFIED BY 'passwd';"
- #vim /etc/my.cnf 要保证mysqld配置段里面有以下两行
- log-bin=mysql-bin
- sync_binlog=1 innodb_flush_logs_at_trx_commit=1
- server-id = 1
- #service mysqld restart
- # /usr/local/mysql/bin/mysql -e "SHOW MASTER STATUS"; 记住下面的file字段跟Position待会有用
-
- +------------------+----------+--------------+------------------+
- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
- +------------------+----------+--------------+------------------+
- | mysql-bin.000002 | 350 | | |
- +------------------+----------+--------------+------------------+
2.在从服务器上做以下配置
- #vim /etc/my.cnf 要保证mysqld配置段里面有如下
- relay-log = mysql-relay
- read_only = ON
- skip_slave_start=1
- #log-bin=mysql-bin
- server-id = 12
- #service mysqld restart
- #/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;"
- #/usr/local/mysql/bin/mysql -e "START SLAVE;"
ok, 基本已经配置好了,可以进行测试了,在主服务器上建一数据库,然后在从服务器上看有没有复制过来即可,
********************************************************************************************************************************************* 上面主从的复制基本配置好了,下面来扩展下配置,需要注意的是下面每个小段都是一个知识点,并不是关联起来的,根据自己的需要配置,如何设置半同步复制,- # 在主服务器上做以下配置
- mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
- mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
- mysql> SET GLOBAL rpl_semi_sync_master_timeout = 1000;
- #vim /etc/my.cnf
- [mysqld]
- rpl_semi_sync_master_enabled=1
- rpl_semi_sync_master_timeout=1000
- #在从服务器上做以下配置
- mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
- mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;
- mysql> STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;
- #vim /etc/my.cnf
- [mysqld]
- rpl_semi_sync_slave_enabled=1
- #在主服务器上实现复制过滤,不建议在主服务器上做
- #vim /etc/my.cnf
- [mysqld]
- binlog-do-db=testdb #表示只保存testdb的二进制日志,
- #在从服务器上实现复制过滤, 也建议在从服务器上做过滤,
- #vim /etc/my.cnf
- [mysqld]
- replicate_do_db=testdb #表示只复制某个数据库
- rpplicate_ignore_db=testdb #表示不复制某个数据库
- replicate_do_table=testdb.t1 表示只复制testdb库里面的t1表
- replicate_ignore_table=testdb.t1 表示不复制某个库的某个表