零基礎入門PolarDB-X:搭建高可用系統並聯動資料大屏

bainana發表於2022-07-06

# 一、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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章