MySQL集羣筆記(讀寫分離、MyCat、負載均衡、PXC)

視頻教程傳送門 -> MySQL集羣解決方案(主從複製、PXC集羣、MyCat、HAProxy)https://www.bilibili.com/video/BV1R4411s7zi

目錄
MySQL數據庫的集羣方案
讀寫分離(主從複製)架構
MyCat數據庫中間件
HAProxy負載均衡
PXC集羣的使用
多種集羣架構綜合應用

1. MySQL數據庫的集羣方案

相對於單節點DB Server,集羣可以應對大併發、海量數據存儲等問題。下文以MySQL數據庫爲例。

一般應用對數據庫是“讀多寫少”,思路=> 採用數據庫集羣方案讀寫分離
其中一個是主庫,負責寫入數據 -> 寫庫
其它都是從庫,負責讀取數據 -> 從庫

需要遵循,
1)讀庫和寫庫數據一致
2)寫數據必須到寫庫
3)讀數據必須到讀庫

1.1 架構

說明:
數據庫從單節點變爲多節點提供服務
主節點數據同步到從節點(實際可有多個從節點)
應用程序需要連到2個數據庫節點,並在程序內部實現判斷讀寫操作

該架構存在的問題:
1)應用程序需要連接到多個節點,對應用程序而言開發變得複雜
      解決:中間件;程序內部使用Spring的AOP功能實現
2)主從之間的同步,是異步完成 => 弱一致性
      存在數據寫入主庫後應用程序讀取從庫獲取不到數據的情況,且可能丟失數據 =>不適合對數據安全要求較高的應用
      解決:PXC集羣

1.2 中間件

說明:
應用程序無需連接到多個數據節點,連接到中間件即可
應用程序無需區分讀寫操作,對中間件直接進行讀寫操作即可 
在中間件區分讀寫操作,讀發送到從節點,寫發送到主節點

該架構存在的問題:中間件的性能成爲了系統的瓶頸
解決:中間件做集羣

中間件的可靠性得到了保證,但也帶來了新的問題,應用系統需要連接到兩個中間件增加了複雜度
解決:負載均衡

1.3 負載均衡

在應用程序和中間件之間增加proxy代理
由代理來完成負載均衡的功能,應用程序只需對接到proxy即可

1.4 PXC集羣架構

前述的架構都是基於MySQL主從架構,問題:弱一致性
有的場景,如交易數據,需要強一致性

解決:PXC提供了讀寫強一致性的功能,可以保證數據在任何一個節點寫入的同時可以同步到其它節點


 

1.5 混合架構

在PXC架構中,實現了事務的強一致性,但是犧牲了性能
如果在某些業務的場景下沒有強一致性的需求,使用PXC不合適
因此可以將讀寫分離和PXC綜合起來,如下

 

2. 主從複製(讀寫分離)架構

環境說明:使用docker,MySQL使用衍生版Percona(版本5.7.23);所有應用啓動在一臺服務器,所以有的地方需要修改端口

2.1 主從複製原理

master將數據改變記錄到二進制日誌(binary log)中,這些記錄叫做binary log events
slave將master的binary log events拷貝到它的中繼日誌(relay log)
slave重做中繼日誌中的事件

主從配置需要注意的地方:
1)主數據庫和從數據庫的版本一致
2)主數據庫和從數據庫數據一致
3)主數據庫開啓二進制日誌
4)主數據庫和從數據庫的server_id都必須唯一

2.2 主庫配置文件my.conf

編輯主庫my.cnf

#開啓主從複製
log-bin=mysql-bin
#指定主庫server-id
server-id=1
#指定同步的數據庫,如果不指定則同步全部數據庫
binlog-do-db=my_test

執行SQL語句查詢主庫狀態:SHOW MASTER STATUS

2.3 在主庫創建同步用戶

主庫執行如下語句
#授權用戶slave01使用密碼123456登錄MySQL
grant replication slave on *.* to 'slave01'@'127.0.0.1' identified by '123456';
#刷新配置
flush privileges;

2.4 從庫配置文件my.conf

編輯從庫my.conf

#指定server-id,不重複即可
server-id=2

執行以下SQL語句

CHANGE MASTER TO 
master_host='127.0.0.1',
master_user='slave01',
master_password='123456',
master_port=3306,
master_log_file='mysql-bin.000006', #通過SHOW MASTER STATUS;查詢
master_log_pos=1120; #通過SHOW MASTER STATUS;查詢

啓動slave同步:START SLAVE;

查看同步狀態:SHOW SLAVE STATUS;

2.5 搭建主庫

2.6 搭建從庫

@關於binlog_format
MySQL提供3種模式
1)基於SQL語句的複製(statement-based replication,SBR)
2)基於行的複製(row-based replication,RBR)
3)混合模式複製(mixed-based replication,MBR)

binlog的模式也有三種:STATEMENT、ROW(默認)、MIXED(建議使用)

STATEMENT(SBR)
每一條修改數據的SQL語句都會記錄到binlog中
優點:不需要記錄每一條SQL語句和每一行的數據變化,減少binlog日誌量,節約IO,提高性能
缺點:某些情況會導致master-slave中的數據不一致,如SELECT NOW()

ROW(RBR)
不記錄每條SQL語句的上下文信息,僅需記錄哪條數據被修改了,修改成什麼樣了
會產生大量日誌,尤其是ALTER TABLE(在已有的表中添加、修改或刪除列)的時候會讓日誌暴漲

MIXED(MBR)
以上兩種模式的混合使用,
一般的複製使用STATEMENT模式保存binlog
對於STATEMENT模式無法複製的操作使用ROW模式保存binlog
MySQL會根據執行的SQL語句選擇日誌保存方式

 

3. MyCat中間件

3.1 讀寫分離

MySQL服務部署舉例

主機 端口 容器名稱 角色
192.168.1.18 3306 percona-master01 master
192.168.1.18 3307 percona-slave01 slave

 

 

 

 

step 1 編輯配置文件

(1)server.xml

(2)schema.xml

@balance屬性說明
代表負載均衡類型,取值說明如下
balance="0"  不開啓讀寫分離機制,所有讀操作都發送到當前可用的writeHost上
balance="1"  全部的readHost與standby writeHost參與select語句的負載均衡
                     即雙主從模式(M1->S1,M2->S2,並且M1和M2互爲主備),M2,S1,S2都參與select語句的負載均衡
balance="2"  所有讀操作都隨機地在writeHost、readHost上分發
balance="3"  所有讀操作隨機地分發到writeHost對應地readHost執行,writeHost不負擔讀壓力

(3) rule.xml,因爲只有一個MySQL集羣,這裏count保持爲1

 

step 2 啓動MyCat

先使用命令./mycat console測試,如果顯示successfully就沒問題,再用命令./startup_nowrap.sh啓動

step3 連接Mycat

默認端口8806,可以再配置文件server.xml中修改

@搭建多節點MyCat
以上是搭建單節點MyCat步驟,如果需要搭建多節點MyCat參考如下
注:因爲放在一臺服務器,所以需要設置不同端口

 

3.2 數據分片

MySQL服務部署舉例

MySQL集羣1

主機 端口 容器名稱 角色
192.168.1.18 3306 percona-master01 master
192.168.1.18 3307 percona-slave01 slave

 

 

 

 

MySQL集羣2

主機 端口 容器名稱 角色
192.168.1.18 3316 percona-master02 master
192.168.1.18 3317 percona-slave02 slave

 

 

 

 

step 1 修改配置文件

配置schema.xml

配置rule.xml,因爲有兩個MySQL集羣,count設置爲2

<function name="mod long" class=xxx>
    <property name="count">2</property>
</function>


4. HAProxy負載均衡

官網:http://www.haproxy.org

4.1 部署安裝HAProxy

拉取鏡像
docker pull haproxy:1.9.3

創建目錄,用於存放配置文件
mkdir /test/haproxy

創建容器
docker create --name haproxy --net host -v /test/haproxy:/usr/local/etc/haproxy haproxy:1.9.3

編輯配置文件
vim /test/haproxy/haproxy.cfg 

可以根據以上配置打開URL查看MyCat狀態(如下,綠色爲正常運行)


5.PXC集羣的使用

Percona XtraDB Cluster(PXC)是針對MySQL用戶高可用性地擴展性解決方案,基於Percona Server。
Percona Server是MySQL的改進版本,使用XtraDB存儲引擎,提升了在高負載情況下的InnoDB的性能,另外有更多的參數和命令來控制服務器行爲。

PXC提供了,
同步複製,事務可以在所有節點上提交
多主機複製,可以寫到任意節點
從(slave)服務器上的並行應用事件,真正地並行複製
自動節點配置
數據一致性,不再有位同步地從服務器

5.1 部署安裝

部署三節點PXC舉例

節點 端口 容器名稱 數據卷
node1 13306 pxc_node1 v1
node2 13307 pxc_node2 v2
node3 13308 pxc_node3 v3

 

 

 

 

 

具體步驟如下

注意:先啓動第一個節點,等mysql客戶端可以連接到服務後再啓動其它節點。

5.2 集羣的說明

儘可能控制PXC集羣規模,節點越多,數據同步速度越慢
所有PXC節點地硬件配置要一致,如果不一致,配置低地節點將拖慢數據同步速度
PXC集羣只支持InnoDB引擎,不支持其它地存儲引擎

@PXC集羣方案與Replication區別

PXC Replication
所有節點都是可讀可寫的 從節點不能寫入,因爲主從同步是單向的
同步機制是同步進行的 同步機制是異步進行的
犧牲性能保證數據的一致性 性能上高於PXC
用於重要信息的存儲,例如:訂單、用戶信息等 用於一般信息的存儲,能夠容忍數據丟失,例如:購物車、用戶行爲日誌等

 

 

 

 

 

 

6.多種集羣架構綜合應用

6.1 架構

說明:
HAProxy作爲負載均衡器
部署了2個MyCat節點作爲數據庫中間件
部署了2個PXC集羣節點,作爲2個 MyCat分片,每個PXC集羣中有2個節點,作爲數據的同步存儲
房源數據保存到PXC分片中,其餘數據如廣告保存到主從架構中(按表區分)

配置可以參考前述,需注意:
1)schema.xml文件前兩個集羣(PXC)balance設置爲2 -> 讀操作隨機到在writeHost、readHost),第三個集羣(主從)balance設置爲3 -> 讀操作隨機到writeHost對應地readHost執行,writeHost不負擔讀壓力。

2)schema.xml指定表給PXC或主從架構

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章