mysql复制其实就是把数据从一个节点(master) 拷贝到另外一个节点(slaves), 固然根据应用架构的不一样,采用的方式也不一样,MySQL服务器之间的复制使用的是二进制日志机制.对master的更新与变更都会做为事件(event)记录在日志中,日志中的信息会随变化的不一样被记录成不一样的格式.slaves被配置成从master读取日志,而且执行二进制日志中的事件到slave本地数据库.一旦master启动二进制日志功能,那么全部语句操做都会被记录下来,每个slave会收到一份整个日志内容的拷贝.slave的责任就是决定日志中的哪条语句须要被执行,而咱们不能经过配置master来仅仅记录某些特定的事件.若是您没有另行指定,在主服务器二进制日志中的全部事件都在slave上执行.若是须要,还能够配置slave仅应用来自于特定数据库或表的事件.mysql
根据上图来讲说mysql复制的工做机制,复制的过程在主从架构中通常是有三个线程来完成复制工做的,主服务器上dump thread ,从服务器I/O thread ,从服务器sql thread, 若是想使用多线程的话须要打补丁的, 根据上图一主一从的架构复制是这样工做的,主服务器将操做写入二进制日志,由主服务器上的dump线程将日志发送到从服务器上的I/O线程,而后存储为中继日志,而由sql线程根据中继日志将数据写入从服务器中,下面来配置下这样的复制架构,
*********************************************************************************************************************************************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, 在主服务器上作以下操做bootstrap
- #/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
- #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 表示不复制某个库的某个表