擴(kuò)展方式
Scale UP(縱向擴(kuò)展)
Scale Out(橫向擴(kuò)展)
MySQL的擴(kuò)展
- 讀寫分離:
- 復(fù)制:每個階段都有相同的數(shù)據(jù)集
向外擴(kuò)展
二進(jìn)制日志
單向
復(fù)制的功用
- 數(shù)據(jù)分布
- 負(fù)載均衡讀
- 備份
- 高可用和故障切換
- MySQL升級測試
MySQL讀寫分離
讀寫分離應(yīng)用:
- mysql-proxy:Oracle
https://downloads.mysql.com/archives/proxy/ - Atlas:Qihoo
https://github.com/Qihoo360/Atlas/blob/master/README_ZH.md - dbproxy:美團(tuán)
https://github.com/Meituan-Dianping/DBProxy - Amoeba:
https://sourceforge.net/projects/amoeba/
MySQL主從復(fù)制

MySQL復(fù)制

MySQL復(fù)制
MySQL垂直分區(qū)

MySQL垂直分區(qū)
MySQL水平分片(Sharding)

MySQL水平分片
對應(yīng) shard 中查詢相關(guān)數(shù)據(jù)

主從復(fù)制線程:
- 主節(jié)點(diǎn):
dump Thread:為每個 Slave 的I/O Thread啟動一個 dump 線程,用于向其發(fā)送 binary log events - 從節(jié)點(diǎn):
I/O Thread:向 Master 請求二進(jìn)制日志事件,并保存于中繼日志中
SQL Thread:從中繼日志中讀取日志事件,在本地完成重放
跟復(fù)制功能相關(guān)的文件:
- master.info:用于保存 slave 連接至 master 時(shí)的相關(guān)信息,例如賬號、密碼、服務(wù)器地址等
- relay-log.info:保存在當(dāng)前 slave 節(jié)點(diǎn)上已經(jīng)復(fù)制的當(dāng)前二進(jìn)制日志和本地 replay log 日志的對應(yīng)關(guān)系
主從復(fù)制特點(diǎn):
- 異步復(fù)制
- 主從數(shù)據(jù)不一致比較常見
復(fù)制架構(gòu):
- Master/Slave,Master/Master,環(huán)狀復(fù)制
- 一主多從
- 從服務(wù)器還可以再有從服務(wù)器
- 一從多主:適用于多個不同數(shù)據(jù)庫
復(fù)制需要考慮二進(jìn)制日志事件記錄格式
STATEMENT(5.0之前)
ROW(5.1之后,推薦)
MIXED
主從配置過程:參考官網(wǎng)
https://mariadb.com/kb/en/library/setting-up-replication/
https://dev.mysql.com/doc/refman/5.5/en/replication-configuration.html
主節(jié)點(diǎn)配置:
- 啟用二進(jìn)制日志:
vim /etc/my.cnf[mysqld] log_bin - 為當(dāng)前節(jié)點(diǎn)設(shè)置一個全局唯一的ID號:
vim /etc/my.cnf[mysqld] server_id=# log-basename=master #可選項(xiàng),設(shè)置datadir中日志名稱,確保不依賴主機(jī)名 - 創(chuàng)建有復(fù)制權(quán)限的用戶賬號:
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'HOST' IDENTIFIED BY 'replpass';
從節(jié)點(diǎn)配置:
- 啟動中繼日志:
[mysqld] server_id=# #為當(dāng)前節(jié)點(diǎn)設(shè)置一個全局唯一的ID號 relay_log=relay-log #relay log的文件路徑,默認(rèn)值hostname-relay-bin relay_log_index=relay-log.index 默認(rèn)值hostname-relay-bin.index - 使用有復(fù)制權(quán)限的用戶賬號連接至主服務(wù)器,并啟動復(fù)制線程
mysql> CHANGE MASTER TO MASTER_HOST='host', MASTER_USER='repluser',MASTER_PASSWORD='replpass', MASTER_LOG_FILE='mysql-bin.xxxxx',MASTER_LOG_POS=#; mysql> START SLAVE [IO_THREAD|SQL_THREAD];
復(fù)制架構(gòu)中應(yīng)該注意的問題:
-
如果主節(jié)點(diǎn)已經(jīng)運(yùn)行了一段時(shí)間,且有大量數(shù)據(jù)時(shí),如何配置并啟動 slave節(jié)點(diǎn)
- 通過備份恢復(fù)數(shù)據(jù)至從服務(wù)器
- 復(fù)制起始位置為備份時(shí),二進(jìn)制日志文件及其POS
-
如果要啟用級聯(lián)復(fù)制,需要在從服務(wù)器啟用以下配置
[mysqld] log_bin log_slave_updates -
限制從服務(wù)器為只讀
- 在從服務(wù)器上設(shè)置 read_only=ON(此限制對擁有SUPER權(quán)限是用戶均無效)
- 阻止所有用戶,包括主服務(wù)器復(fù)制的更新
mysql> FLUSH TABLES WITH READ LOCK;
RESET SLAVE
在從服務(wù)器清除master.info,relay-log.info,relay log,開始新的relay log,注意:需要先 STOP SLAVE
RESET SLAVE ALL:清除所有從服務(wù)器上設(shè)置的主服務(wù)器同步信息如:PORT,HOST,USER 和 PASSWORD 等-
如何保證主從復(fù)制的事務(wù)安全
參看https://mariadb.com/kb/en/library/server-systemc-variables/- 在 master 節(jié)點(diǎn)啟用參數(shù):
sync_binlog=1:每次寫后立即同步二進(jìn)制日志到磁盤,性能差
如果用到的為 InnoDB 存儲引擎:
innodb_flush_log_at_trx_commit=1:每次事務(wù)提交立即同步日志寫磁盤
innodb_support_xa=ON:默認(rèn)值,分布式事務(wù) MariaDB10.3.0 廢除
sync_master_info=#:#次事件后 master.info 同步到磁盤 - 在 slave 節(jié)點(diǎn)啟用服務(wù)器選項(xiàng):
skip_slave_start=ON:不自動啟動 slave - 在 slave 節(jié)點(diǎn)啟用參數(shù):
sync_relay_log=#:#次寫后同步 relay log 到磁盤
sync_relay_log_info=#:#次事務(wù)后同步 relay-log.info 到磁盤
- 在 master 節(jié)點(diǎn)啟用參數(shù):
主主復(fù)制
主主復(fù)制:互為主從
- 容易產(chǎn)生的問題:數(shù)據(jù)不一致;因此慎用
- 考慮要點(diǎn):自動增長 id
配置一個節(jié)點(diǎn)使用奇數(shù) id
auto_increment_offset=1:開始點(diǎn)
auto_increment_incremen=2:增長幅度
另一個節(jié)點(diǎn)使用偶數(shù) id
auto_increment_offset=2
auto_increment_increment=2
主主復(fù)制的配置步驟:
- 各節(jié)點(diǎn)使用一個唯一的 server_id
- 都啟動 binary log 和 relay log
- 創(chuàng)建擁有復(fù)制權(quán)限的用戶賬號
- 定義自動增長 id 字段的數(shù)值范圍各為奇偶
- 均把對方指定為主節(jié)點(diǎn),并啟動復(fù)制線程