零基礎入門PolarDB-X:搭建高可用系統並聯動資料大屏
# 一、PolarDB-X 簡介
---
PolarDB-X 是一款面向超高併發、海量儲存、複雜查詢場景設計的雲原生分散式資料庫系統。其採用 Shared-nothing 與儲存計算分離架構,支援水平擴充套件、分散式事務、混合負載等能力,具備企業級、雲原生、高可用、高度相容 MySQL 系統及生態等特點。
PolarDB-X 最初為解決阿里巴巴天貓“雙十一”核心交易系統資料庫擴充套件性瓶頸而生,之後伴隨阿里雲一路成長,是一款經過多種核心業務場景驗證的、成熟穩定的資料庫系統。
# **二、PolarDB-X** **的核心特性**
---
- 水平擴充套件
PolarDB-X 採用 Shared-nothing 架構進行設計,支援多種 Hash 和 Range 資料拆分演算法,透過隱式主鍵拆分和資料分片動態排程,實現系統的透明水平擴充套件。
- 分散式事務
PolarDB-X 採用 MVCC + TSO 方案及 2PC 協議實現分散式事務。事務滿足 ACID 特性,支援 RC/RR 隔離級別,並透過一階段提交、只讀事務、非同步提交等最佳化實現事務的高效能。
- 混合負載
PolarDB-X 透過原生 MPP 能力實現對分析型查詢的支援,透過 CPU quota 約束、記憶體池化、儲存資源分離等實現了 OLTP 與 OLAP 流量的強隔離。
- 企業級
PolarDB-X 為企業場景設計了諸多核心能力,例如 SQL 限流、SQL Advisor、TDE、三權分立、Flashback Query 等。
- 雲原生
PolarDB-X 在阿里雲上有多年的雲原生實踐,支援透過 K8S Operator 管理叢集資源,支援公有云、混合雲、專有云等多種形態進行部署,並支援國產化作業系統和晶片。
- 高可用
透過多數派 Paxos 協議實現資料強一致,支援兩地三中心、三地五副本等多種容災方式,同時透過 Table Group、Geo-locality 等提高系統可用性。
- 相容 MySQL 系統及生態
PolarDB-X 的目標是完全相容 MySQL ,目前相容的內容包括 MySQL 協議、MySQL 大部分語法、Collation、事務隔離級別、Binlog 等。
# 三、如何搭建的高可用系統
---
#### 1\. 建立實驗資源及安裝環境
開始實驗之前,需要先建立ECS例項資源,並安裝Docker、kubectl、minikube和Helm3,最後安裝MySQL。
#### 2\. 使用PolarDB-X Operator安裝PolarDB-X
1. 使用minikube建立Kubernetes叢集。
[minikube]()是由社群維護的用於快速建立Kubernetes測試叢集的工具,適合測試和學習Kubernetes。使用minikube建立的Kubernetes叢集可以執行在容器或是虛擬機器中,該實驗場景以CentOS 8.5上建立Kubernetes為例。
a.新建賬號galaxykube,並將galaxykube加入docker組中。【minikube要求使用非root賬號進行部署】,切換到賬號galaxykube,進入到home/galaxykube目錄。執行如下命令,啟動一個minikube。
```
minikube start --cpus 4 --memory 12288 --image-mirror-country cn --registry-mirror= --kubernetes-version 1.23.3
```
b.執行如下命令,使用kubectl檢視叢集資訊。
```
kubectl cluster-info
```
2. 部署 PolarDB-X Operator。
a.執行如下命令,建立一個名為polardbx-operator-system的名稱空間。
```
kubectl create namespace polardbx-operator-system
```
b.執行如下命令,安裝PolarDB-X Operator。
```
helm repo add polardbx
helm install --namespace polardbx-operator-system polardbx-operator polardbx/polardbx-operator
```
c.執行如下命令,檢視PolarDB-X Operator元件的執行情況。等待所有元件都進入Running狀態,表示PolarDB-X Operator已經安裝完成。
```
kubectl get pods --namespace polardbx-operator-system
```
3. 部署 PolarDB-X 叢集。
a.建立polardb-x.yaml,按i鍵進入編輯模式,將如下程式碼複製到檔案中,然後按ECS退出編輯模式,輸入:wq後按下Enter鍵儲存並退出。
```
apiVersion: polardbx.aliyun.com/v1
kind: PolarDBXCluster
metadata:
name: polardb-x
spec:
config:
dn:
mycnfOverwrite: |-
print_gtid_info_during_recovery=1
gtid_mode = ON
enforce-gtid-consistency = 1
recovery_apply_binlog=on
slave_exec_mode=SMART
topology:
nodes:
cdc:
replicas: 1
template:
resources:
limits:
cpu: "1"
memory: 1Gi
requests:
cpu: 100m
memory: 500Mi
cn:
replicas: 2
template:
resources:
limits:
cpu: "2"
memory: 4Gi
requests:
cpu: 100m
memory: 1Gi
dn:
replicas: 1
template:
engine: galaxy
hostNetwork: true
resources:
limits:
cpu: "2"
memory: 4Gi
requests:
cpu: 100m
memory: 500Mi
gms:
template:
engine: galaxy
hostNetwork: true
resources:
limits:
cpu: "1"
memory: 1Gi
requests:
cpu: 100m
memory: 500Mi
serviceType: ClusterIP
upgradeStrategy: RollingUpgrade
```
b.建立PolarDB-X叢集,檢視PolarDB-X叢集建立狀態。
#### 3\. 連線PolarDB-X叢集
1.執行如下命令,檢視PolarDB-X叢集登入密碼。
```
kubectl get secret polardb-x -o jsonpath="{.data['polardbx_root']}" | base64 -d - | xargs echo "Password: "
```
2.執行如下命令,將PolarDB-X叢集埠轉發到3306埠。
```
kubectl port-forward svc/polardb-x 3306
```
3.執行如下命令,連線PolarDB-X叢集。
```
mysql -h127.0.0.1 -P3306 -upolardbx_root -p<PolarDB-X叢集登入密碼>
```
#### 4\. 啟動業務
·準備壓測資料
1. 建立壓測資料庫sysbench_test,輸入exit退出資料庫,切換到賬號galaxykube。
2. 進入到/home/galaxykube目錄,建立準備壓測資料的sysbench-prepare.yaml檔案。
3. 按i鍵進入編輯模式,將如下程式碼複製到檔案中,然後按ECS退出編輯模式,輸入:wq後按下Enter鍵儲存並退出。
```
apiVersion: batch/v1
kind: Job
metadata:
name: sysbench-prepare-data-test
namespace: default
spec:
backoffLimit: 0
template:
spec:
restartPolicy: Never
containers:
- name: sysbench-prepare
image: severalnines/sysbench
env:
- name: POLARDB_X_USER
value: polardbx_root
- name: POLARDB_X_PASSWD
valueFrom:
secretKeyRef:
name: polardb-x
key: polardbx_root
command: [ 'sysbench' ]
args:
- --db-driver=mysql
- --mysql-host=$(POLARDB_X_SERVICE_HOST)
- --mysql-port=$(POLARDB_X_SERVICE_PORT)
- --mysql-user=$(POLARDB_X_USER)
- --mysql_password=$(POLARDB_X_PASSWD)
- --mysql-db=sysbench_test
- --mysql-table-engine=innodb
- --rand-init=on
- --max-requests=1
- --oltp-tables-count=1
- --report-interval=5
- --oltp-table-size=160000
- --oltp_skip_trx=on
- --oltp_auto_inc=off
- --oltp_secondary
- --oltp_range_size=5
- --mysql_table_options=dbpartition by hash(`id`)
- --num-threads=1
- --time=3600
- /usr/share/sysbench/tests/include/oltp_legacy/parallel_prepare.lua
- run
```
4.執行如下命令,執行準備壓測資料的sysbench-prepare.yaml檔案,初始化測試資料。
```
kubectl apply -f sysbench-prepare.yaml
```
5.執行如下命令,獲取任務進行狀態。
```
kubectl get jobs
```
·啟動壓測流量。
1. 建立啟動壓測的sysbench-oltp.yaml檔案。
2. 按i鍵進入編輯模式,將如下程式碼複製到檔案中,然後按ECS退出編輯模式,輸入:wq後按下Enter鍵儲存並退出。
```
apiVersion: batch/v1
kind: Job
metadata:
name: sysbench-oltp-test
namespace: default
spec:
backoffLimit: 0
template:
spec:
restartPolicy: Never
containers:
- name: sysbench-oltp
image: severalnines/sysbench
env:
- name: POLARDB_X_USER
value: polardbx_root
- name: POLARDB_X_PASSWD
valueFrom:
secretKeyRef:
name: polardb-x
key: polardbx_root
command: [ 'sysbench' ]
args:
- --db-driver=mysql
- --mysql-host=$(POLARDB_X_SERVICE_HOST)
- --mysql-port=$(POLARDB_X_SERVICE_PORT)
- --mysql-user=$(POLARDB_X_USER)
- --mysql_password=$(POLARDB_X_PASSWD)
- --mysql-db=sysbench_test
- --mysql-table-engine=innodb
- --rand-init=on
- --max-requests=0
- --oltp-tables-count=1
- --report-interval=5
- --oltp-table-size=160000
- --oltp_skip_trx=on
- --oltp_auto_inc=off
- --oltp_secondary
- --oltp_range_size=5
- --mysql-ignore-errors=all
- --num-threads=8
- --time=3600
- /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua
- run
```
3. 執行如下命令,執行啟動壓測的sysbench-oltp.yaml檔案,開始壓測。
```
kubectl apply -f sysbench-oltp.yaml
```
4. 執行如下命令,查詢壓測指令碼執行的POD。
```
kubectl get pods
```
5. 執行如下命令,檢視QPS等流量資料。
```
kubectl logs -f 目標POD
```
#### 5\. 體驗PolarDB-X高可用能力
經過前面的準備工作,我們已經用PolarDB-X+Sysbench OLTP搭建了一個正在執行的業務系統。本步驟將透過使用kill POD的方式,模擬物理機當機、斷網等導致的節點不可用場景,並觀察業務QPS的變化情況。
1. 切換到賬號galaxykube,獲取CN POD的名字。返回結果如下,以‘polardb-x-xxxx-cn-default’開頭的是CN POD的名字。
![]()
2.刪除任意一個CN POD,檢視CN POD自動建立情況。返回結果如下,可檢視到CN POD已經處於自動建立中。經過幾十秒後,被kill的CN POD自動恢復正常。切換至終端二,可檢視kill CN之後業務QPS的情況。
![]()
3.切換至終端三,獲取DN POD的名字。返回結果如下,以‘polardb-x-xxxx-dn’開頭的是DN POD的名字。
![]()
4.執行如下命令,刪除任意一個DN POD,檢視DN POD自動建立情況。返回結果如下,您可檢視到DN POD已經處於自動建立中。經過幾十秒後,被kill的DN POD自動恢復正常。切換至終端二,可檢視kill DN之後業務QPS的情況。
![]()
5.切換至終端三,獲取CDC POD的名字。返回結果如下,以‘polardb-x-xxxx-cdc-defaul’開頭的是CDC POD的名字。
![]()
6.刪除任意一個CDC POD,檢視CDC POD自動建立情況。返回結果如下,您可檢視到CDC POD已經處於自動建立中。經過幾十秒後,被kill的CDC POD自動恢復正常。切換至終端二,您可檢視kill CDC之後業務QPS的情況。
![]()
# 四、如何聯動的資料大屏
---
#### 1\. 建立實驗資源/安裝PolarDB-X
開始實驗之前,需要先建立ECS例項資源,之後安裝並啟動Docker,最後安裝PolarDB-X
#### 2\. 在PolarDB-X中準備訂單表
PolarDB-X支援透過MySQL Client命令列、第三方客戶端以及符合MySQL互動協議的第三方程式程式碼進行連線。本實驗使用MySQL Client命令列連線到PolarDB-X資料庫。
1. 安裝MySQL,檢視MySQL版本號。執行如下命令,登入PolarDB-X資料庫。
```
mysql -h127.0.0.1 -P8527 -upolardbx_root -p123456
```
2.執行SQL語句,建立並使用測試庫mydb。
3.執行如下SQL語句,建立訂單表orders。
```
CREATE TABLE `orders` (
`order_id` int(11) NOT NULL AUTO_INCREMENT,
`order_date` datetime NOT NULL,
`customer_name` varchar(255) NOT NULL,
`price` decimal(10, 5) NOT NULL,
`product_id` int(11) NOT NULL,
`order_status` tinyint(1) NOT NULL,
PRIMARY KEY (`order_id`)
)AUTO_INCREMENT = 10001;
```
4.執行如下SQL語句,給訂單表orders中插入資料。
```
INSERT INTO orders
VALUES (default, '2020-07-30 10:08:22', 'Jark', 50.50, 102, false),
(default, '2020-07-30 10:11:09', 'Sally', 15.00, 105, false),
(default, '2020-07-30 12:00:30', 'Edward', 25.25, 106, false);
```
#### 3\. 執行Flink
1. 安裝JDK。
使用yum安裝JDK 1.8,檢視是否安裝成功。返回結果如下,表示您已成功安裝JDK 1.8。
![]()
2. 下載Flink和Flink CDC MySQL Connector。
下載並解壓Flink,進入lib目錄。執行如下命令,下載flink-sql-connector-mysql-cdc。
```
wget
```
3. 啟動Flink。
a.執行如下命令,啟動Flink。
```
./bin/start-cluster.sh
```
b.執行如下命令,連線Flink。
```
./bin/sql-client.sh
```
4. 在Flink中建立與PolarDB-X關聯的訂單表orders。
a.執行如下SQL語句,建立訂單表orders。
```
CREATE TABLE orders (
order_id INT,
order_date TIMESTAMP(0),
customer_name STRING,
price DECIMAL(10, 5),
product_id INT,
order_status BOOLEAN,
PRIMARY KEY (order_id) NOT ENFORCED
) WITH (
'connector' = 'mysql-cdc',
'hostname' = 'localhost',
'port' = '8527',
'username' = 'polardbx_root',
'password' = '123456',
'database-name' = 'mydb',
'table-name' = 'orders'
);
```
b.執行如下SQL語句,檢視訂單表orders。可以檢視到PolarDB-X的訂單表orders的資料已經同步到Flink的訂單表orders中。
```
select * from orders;
```
#### 4\. 啟動壓測指令碼並實時獲取GMV
經過前面幾步操作後,我們在PolarDB-X中準備好了原始訂單表,在Flink中準備好了對應的訂單表,並透過 PolarDB-X Global Binlog與Flink CDC MySQL Connector打通了兩者之間的實時同步鏈路。 本步驟將指導您如何建立壓測指令碼,模擬雙十一零點大量訂單湧入的場景。
1. 準備壓測指令碼。
a.建立新的終端二,配置檔案mysql-config.cnf。將如下程式碼新增到配置檔案mysql-config.cnf中。
```
[client]
user = "polardbx_root"
password = "123456"
host = 127.0.0.1
port = 8527
```
b.新增完成後,按下Esc鍵後,輸入:wq後按下Enter鍵儲存並退出。[建立指令碼buy.sh](),將如下程式碼新增到指令碼buy.sh中。新增完成後,按下Esc鍵後,輸入:wq後按下Enter鍵儲存並退出。
```
#!/bin/bash
echo "start buying..."
count=0
while :
do
mysql --defaults-extra-file=./mysql-config.cnf -Dmydb -e "insert into orders values(default, now(), 'free6om', 1024, 102, 0)"
let count++
if ! (( count % 10 )); then
let "batch = count/10"
echo $batch": got 10 products, gave 1024¥"
fi
sleep 0.05
done
```
c.執行如下命令,為指令碼buy.sh增加執行許可權。
```
chmod +x buy.sh
```
2. 啟動Flink實時計算。
切換至終端一,在Flink中執行如下SQL語句,查詢GMV(gmv列)和訂單數(orders列)。
```
select 1, sum(price) as gmv, count(order_id) as orders from orders;
```
3. 啟動壓測指令碼。
a.切換至終端二,執行如下命令,啟動壓測指令碼,開始建立訂單。
![]()
b.切換至終端一,在Flink的實時計算結果中,可檢視到實時的GMV(gmv列)和訂單數(orders列)。
![]()
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69975905/viewspace-2904424/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 零基礎入門大資料學習,如何才能系統的學好大資料大資料
- 教你零基礎如何快速入門大資料技巧大資料
- 大資料零基礎由入門到實戰大資料
- 大學剛畢業,零基礎大資料如何入門?大資料
- 大資料學習:零基礎大資料入門該看哪些書?大資料
- 大資料零基礎入門需要多長時間?大資料
- 大資料系列零基礎由入門到實戰大資料
- 搭建高併發、高可用的系統
- 資料分析 | 零基礎入門資料分析(一):從入門到摔門?
- 大資料大屏系統模板大資料
- 零基礎入門學習大資料可以從事哪些工作?大資料
- appium入門篇(1)--零基礎搭建自動化環境APP
- 高可用服務之Keepalived基礎入門
- 零基礎入門推薦系統-【排序模型+模型融合】排序模型
- 零基礎入門新聞推薦系統(多路召回)
- 資料庫MySQL(帶你零基礎入門MySQL)資料庫MySql
- Centos 7 搭建MariaDB 資料庫高可用CentOS資料庫
- django基礎入門之搭建部落格系統Django
- 好程式設計師大資料影片教程從零基礎入門到精通程式設計師大資料
- 【工具-Nginx】從入門安裝到高可用叢集搭建Nginx
- 大資料工資這麼高,零基礎可以學習嗎?大資料
- 零基礎如何轉行大資料?系統學習路線在此大資料
- 如何在大促中做好系統高可用
- 大資料入門:Hadoop Yarn元件基礎解析大資料HadoopYarn元件
- 零基礎大資料學習框架大資料框架
- 直播系統平臺搭建,大屏倒數計時動畫效果動畫
- 大資料入門大資料
- 零基礎入門Serverless:Hello WorldServer
- 阿里雲體驗有獎:如何將 PolarDB-X 與大資料等系統互通阿里大資料
- 大資料分散式計算系統 Spark 入門核心之 RDD大資料分散式Spark
- 警務大資料視覺化大屏管理平臺開發,公安合成作戰系統搭建大資料視覺化
- 大資料基礎Hadoop 3.1.1 的高可用HA安裝~踩坑記錄大資料Hadoop
- MySQL | 零基礎入門經驗(1)安裝MySQL及建立資料庫MySql資料庫
- 大資料入門001大資料
- 大話 資料入門
- 如何平穩入門並掌握inux系統?UX
- 《Kubernetes零基礎快速入門》簡介
- 零基礎入門Python的路徑Python