MySQL 支持單向、異步複製,複製過程中一個服務器充當主服務器,而一個或多個其它服務器充當從服務器。主服務器將更新寫入二進制日誌文件,並維護文件的一個索引以跟蹤日誌循環。這些日誌可以記錄發送到從服務器的更新。當一個從服務器連接主服務器時,它通知主服務器從服務器在日誌中讀取的最後一次成功更新的位置。 從服務器接收從那時起發生的任何更新,然後封鎖並等待主服務器通知新的更新。請注意當你進行復制時,所有對複製中的表的更新必須在主服務器上進行。否則,你必須要小心,以避免用戶對主服務器上的表進行的更新與對從服務器上的表所進行的更新之間的衝突。
單向複製有利於健壯性、速度和系統管理:
· 主服務器/從服務器設置增加了健壯性。主服務器出現問題時,你可以切換到從服務器作爲份。
· 通 過在主服務器和從服務器之間切分處理客戶查詢的負荷,可以得到更好的客戶響應時間。SELECT查詢可以發送到從服務器以降低主服務器的查詢處理負荷。但 修改數據的語句仍然發送到主服務器,以便主服務器和從服務器保持同步。如果非更新查詢爲主,該負載均衡策略很有效,但一般是更新查詢。
· 使用複製的另一個好處是可以使用一個從服務器執行備份,而不會干擾主服務器。在備份過程中主服務器可以繼續處理更新。
MySQL 提供了數據庫的同步功能,這對我們實現數據庫的冗災、備份、恢復、負載均衡等都是有極大幫助
實驗環境:
Rhel6.5版本虛擬機:
主服務器:172.25.21.18 server18.example.com
從服務器:172.25.21.19 server19.example.com
從服務器:172.25.21.20 server20.example.com
Selinux 、 iptables disabled
Yum install mysql mysql-server -y
mysql_secure_installation ## 對mysql初始化,設置密碼爲westos
Master server配置:
Vim /etc/my.cf
增加這幾行:log-bin=mysql-bin##啓動二進制日誌系統
binlog-do-db=westos##二進制需要同步的數據庫名
server-id=1##必須爲1—2^32之間的一個正整數值
binlog-ignore-db=mysql##避免同步mysql用戶配置,以免不必要的麻煩
/etc/init.d/mysqld start
Mysql -pwestos#進去mysql
Mysql>create database westos;
Mysql> show master status;##查看master狀態
記錄file和position的值,後面會用到,這個file文件保存在/var/lib/mysql/目錄下,數據庫所執行的每個動作都會保存到這個文件中,我們可以進行查看
Cd /var/lib/mysql
mysqlbinlog mysql-bin.000003
grant replication slave on *.* to lzk@’172.25.21.19’ identified by ‘westos’; ##創建同步帳號並給於授權。
Slave server配置:
因爲master server已經給slave server授權
Mysql -h 172.25.21.18 -u lzk -pwestos##查看是否授權成功
Vim /etc/my.cnf
Server-id=2##從服務器ID號,不要和主ID相同,如果設置多個從服務器,每個從服務器必須有一個唯一的server-id值,必須與主服務器的以及其它從服務器的不相同,可以認爲server-id值類似於IP地址,這些ID值能唯一識別複製服務器羣集中的每個服務器實例。
/etc/init.d/mysqld start
Mysql -pwestos
Create database westos;
Use westos;
change master to master_host='172.25.21.18', master_user='lzk', master_password='westos', master_log_file='mysql-bin.000003', master_log_pos=974;
Start slave;
Show slave status\G;
Slave_IO_Running:yes
Slave_SQL_Running:yes
如果都是yes,表示從庫的I/O,Slave_SQL線程都正確開啓.表明數據庫正在同步。當這個的狀態爲Slave_IO_Running: NO,一般都是用戶訪問和網絡的問題
驗證:
在master server端上:
Mysql>use westos;
Mysql>create table uses (
->username varchar(25) not null,
->password varchar(25) not null
->);
在從服務器上
Mysql>show tables;
會出現master端新建的table。證明數據同步。
Mysql雙向複製
因爲我所安裝的mysql是mysql-5.1.71-1.el6.x86_64,5.1版本的,不支持多線程,5.6以上版本支持多線程,以下我會說到,這個mysql的雙向複製我用三臺主機來做實驗。
主機:rhel6.5版本虛擬機
上面所用到的兩臺:
主服務器:server18.example.com 172.25.21.18
從服務器:server19.example.com 172.25.21.19(這個從服務器作爲server20從服務器的master端,server19從服務器複製server18的數據庫信息,然後保存在自己的文件裏,server20從服務器通過讀取server19進行同步數據。)
從服務器:server20.example.com 172.25.21.20
實驗操作:
在server19從服務器上配置:
Vim /etc/my.cnf
增加以下幾行: Server-id=2
Log-bin=mysql-bin
Binlog-do-db=westos
Binlog-ignore-db=mysql
Log-slave-updates
/etc/init.d/mysqld restart
在server20從服務器上配置:
Yum install -y mysql mysql-server
mysql_secure_installation ## 對mysql初始化,設置密碼爲westos
Mysql -pwestos
Create database westos;
Vi /etc/my.cnf
增加以下內容:server-id=3
/etc/init.d/mysqld start
在server19從服務器上:
Mysql -pwestos###進入數據庫
執行以下命令:
grant replication slave on *.* to lzk@’172.25.21.20’ identified by ‘westos’; ##創建同步帳號並給於授權。
在server20從服務其執行
Mysql -h 172.25.21.18 -u lzk -pwestos##查看是否授權成功
在server18上將/var/lib/mysql/mysql-bin.000003 文件scp到server20從服務器上
在server20從服務器上執行:
Mysqlbinlog --start-position=341 --stop-position=1122 mysql-bin.000003 | mysql -pwestos##將server18主服務器上的數據庫信息在server20從服務其上再執行一遍,生成數據表,這要才能讓它可以進行數據同步。
在server20從服務器上:
Mysql -pwestos##進入數據庫
執行以下操作
Use westos
change master to master_host='172.25.21.19', master_user='lzk', master_password='westos', master_log_file='mysql-bin.000001', master_log_pos=186;
Start slave;
Show slave status\G;##查看slave狀態。是否都爲YES
如果查看的額狀態沒問題,這樣就配置好了,server18是主服務器,作爲server19的數據備份來源,server19作爲server20的master,這樣在server18主服務器上的數據庫信息就會同步到這兩個從服務器。
如果寫操作較少,而讀操作很多時,可以採取這種結構。你可以將讀操作分佈到其它的 slave,從而減小master 的壓力。但是,當 slave 增加到一定數量時,slave 對 master 的負載以及網絡帶寬都會成爲一個嚴重的問題。這種結構雖然簡單,但是,它卻非常靈活,足夠滿足大多數應用需求。
當設置 log_slave_updates 時,你可以讓 slave 扮演其它 slave 的 master。此時,slave 把 SQL 線程執行的事件寫進行自己的二進制日誌(binary log),然後,其它的 slave 可以獲取這些事件並執行它,從而有效緩解master 的壓力。