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 表示不復制某個庫的某個表