MySQL作為常用生產數據庫中的一種,容災及高可用方面設計是必須考慮的。而MySQL replicate是容災、負載均衡、讀寫分離、高可用性等技術的基礎,不僅使用廣泛且易于擴展,是一項成熟的技術。成功的商業案例如:replicate+MHA;replicate+corbar;replicate+MMM等。
## 1.MySQL replicate復制常見用途:
* 數據容災:復制是備份的擴展方案,但不能直接取代備份;
* 負載均衡:通過復制可以將讀操作分布到多個服務器上;
* 高可用性:能避免單點故障,一個包含復制的良好設計系統能夠顯著縮短宕機時間;
* MySQL升級:復制也是作為常用升級測試的解決方案。
## 2.MySQL replicate復制原理:

* 在每次準備提交事務完成數據更新前,主庫將數據更新的事件記錄到二進制日志中。MySQL會按事務提交的順序而非每條語句執行的順序來記錄二進制日志。在記錄二進制日志后,主庫會告訴存儲引擎可以提交事務了。
* 備庫將主庫的二進制日志復制到本地中繼日志中。備庫會啟動一個IO線程,IO線程跟主庫建立一個普通的客戶端連接,然后再主庫上啟動一個特殊的二進制(binlog dump)線程,這個二進制轉儲線程會讀取主庫上二進制日志中的事件。它不會對事件進行輪詢。如果該線程追趕上了主庫,它將進入睡眠狀態,知道主庫發送信號通知其有新的事件產生時才會被喚醒,備庫IO線程會將接受到的事件記錄到中繼日志中。
* 備庫啟動SQL線程從中繼日志中讀取事件并在備庫執行,從而實現備庫數據的更新。當SQL線程追趕上IO線程時,中繼日志通常已經在系統緩存中,所以中繼日志開銷很低。SQL線程執行的事件也可以通過配置選項來決定是否寫入其自己的二進制日志中。
## 3.MySQL replicate實現方式
* 環境
主庫IP:192.168.1.75
從庫IP:192.168.1.76
### 3.1 追加主庫my.cnf配置文件
```
[mysqld]
# 要體現出server的唯一性
server-id = 75
# 啟用二進制日志
log_bin = /var/log/mysql/mysql-bin.log
# 磁盤刷新指令.1表示每次寫入時都將binlog與硬盤同步,影響效率
sync_binlog=1
# binlog日志格式,mysql默認采用statement,建議使用mixed
binlog_format=mixed
```
修改完成之后,重新啟動主數據庫 `service mysql restart`
### 3.2 在主庫創建同步賬號
```
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.76' IDENTIFIED BY 'repl';
flush privileges;
```
>注意:IP是從庫所在的IP地址
## 3.2 修改從庫my.cnf配置文件
```
[mysqld]
# 服務器唯一ID,默認是1,一般取IP最后一段
server-id=76
# 啟用二進制日志
log-bin=/var/log/mysql/mysql-bin.log
```
修改完成之后,重新啟動從數據庫
### 3.3 主庫鎖表備份
* 鎖表
```
#mysql -uroot -p
mysql>FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 | 120 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
```
二進制日志文件是mysql-bin.000002,位置是120,記錄下這兩個值,稍后要用到。
* 備份主庫數據
```
# mysqldump -uroot -p -h127.0.0.1 -P3306 --all-databases --triggers --routines --events > ./all.sql
```
* 解鎖主庫鎖表
```
mysql>UNLOCK TABLES;
```
### 3.4 從庫導入快照
* 導入主庫備份的數據
```
mysql -uroot -p -h127.0.0.1 -P3306 < ./all.sql
```
* 開啟從庫同步
```
#mysql -uroot -p
mysql>
CHANGE MASTER TO MASTER_HOST='192.168.1.75',MASTER_USER='repl',MASTER_PASSWORD='repl',MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=120;
#然后啟動從數據庫的復制線程:
mysql>START slave;
# 接著查詢數據庫的slave狀態:
mysql> SHOW slave STATUS
#如果下面兩個參數都是Yes(不能是Running),則說明主從配置成功!
Slave_IO_Running:Yes
Slave_SQL_Running:Yes
```
> 注意:MASTER_LOG_FILE,MASTER_LOG_POS修改成主庫3.3中的查詢結果
## 參考
http://www.cnblogs.com/kezf/p/mysql-slave.html
http://blog.csdn.net/stuartjing/article/details/9719701
- 版權
- 博客主題
- 如何不去做運行3.5G-docker鏡像的工程師
- 預備主題
- FastDFS快速入門
- mysql定時創建月表
- SpringMVC-Restful
- Docker生態系統
- The Docker Ecosystem: An Introduction to Common Components
- docker監控指標
- 基于etcd服務發現的overlay跨多宿主機容器網絡
- etcd:從應用場景到實現原理的全方位解讀
- docker存儲驅動詳解
- 使用docker/engine-api操作docker
- 提升Docker安全性
- docker安全之用戶資源隔離
- marathon
- 開始
- 安裝mararhon
- 高可用模式
- 使用marathon
- 應用的部署
- 架構組件
- Dubbo與Zookeeper、SpringMVC整合和使用(負載均衡、容錯)
- Openstack架構解析
- haproxy
- Ubuntu系統安裝截圖
- mesos官方文檔
- 關于譯者
- mesos基礎
- Mesos架構
- 視頻與ppt
- 讓mesos跑起來
- 快速入門
- 配置
- Containerizer
- Docker Containerizer
- 監控
- 博客文章集
- 煮餃子與mesos之間妙不可言的關系
- linux運維
- 基礎篇
- 進階篇
- mysql
- Ubuntu14.04安裝mysql5.6
- MySQL 5.6 replicate原理與實踐
- mysql性能
- redis
- redis安裝及基礎知識
- redis數據結構
- redis命令
- redis數據持久化
- Redis主從復制
- redis集群
- 其他