mysql_replication(主從複製)mysql
MySQL 支持單向、異步複製,複製過程當中一個服務器充當主服務器,而一個或多個其它服務器充 當從服務器。主服務器將更新寫入二進制日誌文件,並維護文件的一個索引以跟蹤日誌循環。這 些日誌能夠記錄發送到從服務器的更新。當一個從服務器鏈接主服務器時,它通知主服務器從服 務器在日誌中讀取的最後一次成功更新的位置。從服務器接收從那時起發生的任何更新,而後封 鎖並等待主服務器通知新的更新。 請注意當你進行復制時,全部對複製中的表的更新必須在主服務器上進行。不然,你必需要當心, 以免用戶對主服務器上的表進行的更新與對從服務器上的表所進行的更新之間的衝突。 sql
單向複製有利於健壯性、速度和系統管理: 數據庫
1. 主服務器/從服務器設置增長了健壯性。主服務器出現問題時,你能夠切換到從服務器做爲備份 vim
2. 經過在主服務器和從服務器之間切分處理客戶查詢的負荷,能夠獲得更好的客戶響應時間。 SELECT 查詢能夠發送到從服務器以下降主服務器的查詢處理負荷。但修改 數據的語句仍然應發送到主服務器,以便主服務器和從服務器保持同步。若是非更新查詢爲主,該 負載均衡策略頗有效,但通常是更新查詢。 服務器
3. 使用複製的另外一個好處是可使用一個從服務器執行備份,而不會干擾主服務器。在備份過程 中主服務器能夠繼續處理更新。 網絡
MySQL 提供了數據庫的同步功能,這對咱們實現數據庫的冗災、備份、恢復、負載均衡等都是 有極大幫助的。實驗環境: 負載均衡
RHEL 6 mysql-5.1.71-1.el6.x86_64異步
master 172.25.28.7 (vm7)ide
slave 1 172.25.28.8 (vm8)測試
mysql 的 AB 複製
注: mysql 數據庫的版本,兩個數據庫版本要相同,或者 slave 比 master 版本高!mysql 軟件能夠在 http://www.mysql.com[/上下載,源碼或是 rpm 包均可以,因爲 RHEL6 自帶
mysql 軟件包,直接 yum 安裝。
master server 配置:
1)分別在master和slave端安裝mysql-server
[root@vm7 ~]# mysql_secure_installation 建議生產環境下設置
配置 /etc/my.cnf 配置文件
在[mysqld]下添加一下參數
log-bin=mysql-bin #啓動二進制日誌系統
binlog-do-db=westos #二進制須要同步的數據庫名,若是須要同步多個庫,例如要再同步 westos 庫,再添加一行「binlog-do-db=westos」,以此類推
server-id=1 #必須爲 1 到 232–1 之間的一個正整數值
binlog-ignore-db=mysql #禁止同步 mysql 數據庫
2 ) 啓動 master
# service mysqld start
3)建立同步賬戶,並給予權限
mysql> grant replication slave,reload, super on *.* to westos @'172.25.28.%' identified by 'westos';
mysql>Flush privileges;
調試:
在 master 上用下面的命令查看
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 | 106 | westos | mysql |
+------------------+----------+--------------+------------------+
記錄 File 和 Position 的值,下面會用到。
[root@vm7 mysql]# mysqldump -pwestos westos > westos.bak
[root@vm7 mysql]# scp westos.bak 172.25.28.8: 在slave上面同步日誌文件
slave1server 配置
1 )配置 /etc/ my.cnf 文件
在[mysqld]下添加一下參數
server-id=2 #從服務器 ID 號,不要和主 ID 相同,若是設置多個從服務器,每一個從服務器必 須有一個惟一的 server-id 值,必須與主服務器的以及其它從服務器的不相同。 能夠認爲 server-id 值相似於 IP 地址:這些 ID 值能惟一識別複製服務器羣集
中的每一個服務器實例。
2 ) 啓動 slave
# service mysqld start
3) 在 slave1 上執行一下命令
同時也在slave上面執行mysql_secure_installation
/etc/init.d/mysqld restart
測試slave是否能在遠程登錄master: mysql -uwestos -pwestos -h 172.25.28.7
mysqladmin -pwestos create westos
mysql -pwestos westos < westos.bak
mysql> change master to master_host='172.25.28.7', master_user='westos', master_password='westos', master_log_file='mysql-bin.000002', master_log_pos=106;
Query OK, 0 rows affected (0.28 sec)
mysql> slave start;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
出現上面兩行即成功。
一對多
若是寫操做較少,而讀操做不少時,能夠採起這種結構。你能夠將讀操做分佈到其它的 slave,從而減少master 的壓力。可是,當 slave 增長到必定數量時,slave 對 master 的負載以及網絡帶寬都會成爲一個嚴重的問題。這種結構雖然簡單,可是,它卻很是靈活,足夠知足大多數應用需求。
相關文件做用:
1. mysql-bin.index:服務器一旦開啓二進制日誌,會產生一個與二日誌文件同名,可是以.index 結尾 的文件。它用於跟蹤磁盤上存在哪些二進制日誌文件。MySQL 用它來定位二進制日誌文件。
2. mysqld-relay-bin.index:該文件的功能與 mysql-bin.index 相似,可是它是針對中繼日誌,而不是 二進制日誌。
3. master.info:保存 master 的相關信息。不要刪除它,不然,slave 重啓後不能連master。
4. relay-log.info:包含 slave 中當前二進制日誌和中繼日誌的信息。
mysql線性結構:vm7(master)->vm8(既充當master也充當slave)->vm1(slave)
當設置 log_slave_updates 時,你可讓 slave 扮演其它 slave 的 master。此時,slave 把 SQL 線程執行的事件寫進行本身的二進制日誌(binary log),而後,其它的 slave 能夠獲取這些事件並執行它,從而有效緩解master 的壓力。
添加一個 slave2: 172.25.28.1 (vm1)
1. 因爲 master 上已經有數據,而新加的 slave2 沒有,必須在配置複製前同步數據。
1)在 master 上執行一下命令
mysql> FLUSH TABLES WITH READ LOCK; #鎖表
mysql> mysqldump --all-databases --lock-all-tables > backup.db
mysql> UNLOCK TABLES; #表解鎖
2)若是你僅使用 MyISAM 表,你可使用 mysqlhotcopy 拷貝,即便服務器正在運行。
# mysqlhotcopy -u root -p westos mysql bakcup
[root@vm1 ~]# vim /etc/my.cnf
server-id=3
在vm1執行操做:service mysqld start
[root@vm8 mysql]# vim /etc/my.cnf
server-id=2
log-bin=mysql-bin************************************************代表開啓二進制日誌文件
binlog-do-db=westos**********************************************代表要記錄的是westos庫
binlog-ignore-db=mysql*******************************************默認監控mysql庫(若是不寫上面的westos庫)
log-slave-updates************************************************生成binary-log文件(此節點既是master也是slave)
[root@vm8 mysql]# mysql -pwestos
mysql> grant replication slave, reload, super on *.* to westos@'172.25.28.%' identified by 'westos';
mysql> flush privileges;
[root@vm1 ~]# mysql -uwestos -pwestos -h 172.25.28.8(測試能夠遠程登錄)
[root@vm7 mysql]# scp mysql-bin.* 172.25.28.1:
[root@vm1 ~]# mysqlbinlog mysql-bin.000001 |mysql -uroot -pwestos
[root@vm1 ~]# mysqlbinlog mysql-bin.000002 |mysql -uroot -pwestos
此時進入vm1的數據庫查看,能夠看到同步了的數據庫內容
[root@vm8 mysql]# mysql -pwestos
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 348 | westos | mysql |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
[root@vm1 ~]# mysql -pwestos
mysql> change master to master_host='172.25.28.8', master_user='westos', master_password='westos',master_log_file='mysql-bin.000001', master_log_pos=348;
mysql> show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
上面兩個線程爲yes則說明測試成功