01html
背景java
因爲業務形式的發展,愈來愈多的需求須要對交易數據進行實時分析,例如推薦、決策、監控等,傳統的處理辦法是使用ETL的方式把OLTP業務產生的數據同步到OLAP的數據數據庫,致使了數據須要在不一樣的數據庫之間流轉,耗費時間成本的同時須要耗費人力成本運維多套數據庫產品。 mysql
近年來業界開始興起HTAP的概念,對於數據庫,HTAP表明一個數據庫既能支持OLTP(在線事務處理),又能支持OLAP(在線分析處理),從而知足大部分企業級應用的需求。相比傳統使用多款數據庫進行不一樣的業務處理方式,HTAP數據庫可以避免傳統複雜的ETL過程,省去數據在不一樣數據庫之間的流轉時間;同時避免維護多一套用於分析的數據庫,從而節省人力和時間的成本,提升數據的價值。 linux
SequoiaDB巨杉數據庫採用「計算存儲分離」架構,支持MySQL、PostgreSQL與SparkSQL三種關係型數據庫實例、類MongoDB的JSON文檔類數據庫實例、以及S3對象存儲與Posix文件系統的非結構化數據實例。在事務場景能夠利用SDBAPI、MySQL和PGSQL實例對數據進行操做,在分析場景藉助分佈式計算框架Spark的併發計算性能,提升計算效率,從而實現HTAP功能sql
02shell
技術特性 數據庫
巨杉數據庫做爲一款優秀的分佈式數據庫有着許多技術優點:分佈式多節點、支持索引、基於代價的優化器、對應用透明的數據分片、高性能與無限水平彈性擴展能力、分佈式事務與 ACID 能力、標準SQL兼容、多種物理與邏輯的資源隔離能力。OLTP業務關注的是實時在線業務,要求是支持事務、低延時、高吞吐量。而OLAP業務主要是報表分析等大規模數據分析場景,因此更關注的是數據庫的存儲和計算能力。巨杉數據庫使用計算-存儲分離的架構可以同時搭配多種不一樣的SQL實例。例如面向聯機事務的交易型的MySQL和PostgreSQL實例,面向複雜聯機分析的SparkSQL實例。apache
所以,針對HTAP場景,咱們以最簡單的3副本舉例,把SequoiaDB的副本設置爲3,三副本的數據是保持一致的。其中,咱們經過業務域的設置,以及巨杉數據庫讀寫分離的功能,使得聯機交易型業務訪問其中的兩個副本,分析型業務訪問第三副本。這樣,在三副本互相獨立的的基礎上,分別支撐了聯機業務和分析業務的不一樣負載,避免了搶佔資源的狀況,極大下降了OLTP和OLAP業務同時運行形成的性能瓶頸。服務器
03網絡
安裝部署
服務器分佈
服務器
服務名稱
192.168.106.151
sdbserver1
192.168.106.152
sdbserver2
192.168.106.153
sdbserver3
服務器配置
虛擬機數量:3臺
CPU
4CORE
內存
8GB
磁盤
100GB*3
操做系統
Centos 7.4
2) 軟件配置
操做系統:Centos7.4
JDK版本:1.8.0_80 64位
SequoiaDB版本:3.4
MySQL版本:5.7.24
Spark版本:2.3.4
Sysbench版本:1.0.19
TPC-DS_tools版本:2.10.0
本文以三臺虛擬服務器進行實踐,下圖爲部署的物理架構:
本部署架構每臺服務均部署了MySQL和Spark實例。部署多個MySQL可以均衡聯機事務交易請求,同時避免單點故障。Spark計算引擎在每臺機器也部署了計算節點,加強其分析能力。可是須要均衡在線事務處理和在線分析處理進程之間資源。
SequoiaDB巨杉數據庫在每一個磁盤均部署了數據節點,可以充分利用磁盤的讀寫能力,在Spark計算引擎讀寫繁忙的狀況下,會產生較大的網絡傳輸從而侵佔MySQL實例在線事務處理的帶寬資源,因此生產環境下Spark和MySQL實例能夠配置使用不一樣的網卡。
解壓mysql安裝包
tar -zxvf sequoiasql-mysql-3.4-linux_x86_64-enterprise-installer.tar.gz
運行安裝程序(安裝MySQL實例須要root用戶),後根據提示設置。
./sequoiasql-mysql-3.4-linux_x86_64-enterprise-installer.run --mode text
切換用戶和目錄
su - sdbadmin
進入MySQL安裝目錄
cd /opt/sequoiasql/mysql
添加實例
bin/sdb_sql_ctl addinst myinst -D database/3306/
查看實例狀態
bin/sdb_sql_ctl status
配置 SequoiaDB 鏈接地址
bin/sdb_sql_ctl chconf myinst --sdb-conn-addr=sdbserver1:11810,sdbserver2:11810,sdbserver3:11810
登陸MySQL Shell
bin/mysql -S database/3306/mysqld.sock -u root
設置遠程鏈接
mysql> UPDATE mysql.user SET host='%' WHERE user='root';
設置MySQL的root用戶密碼
ALTER USER root@'%' IDENTIFIED BY 'xxxxxx';
從新登陸MySQL Shell
bin/mysql -S database/3306/mysqld.sock -u root -p
設置SquoiaDB 存儲引擎的用戶密碼
mysql> SET GLOBAL sequoiadb_user="sdbapp";
建立數據庫實例
mysql> CREATE DATABASE company;
建立表
CREATE TABLE employee(id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(128), age INT);
插入數據
mysql> INSERT INTO employee(name, age) VALUES("Jacky", 36);
查詢數據
mysql> SELECT * FROM employee;
使用巨杉數據庫shell模式查詢數據
sdb> db.company.employee.find()
三臺服務器均安裝MySQL實例後須要進行元數據同步配置
請參考巨杉數據庫官網進行配置
http://doc.sequoiadb.com/cn/sequoiadb-cat_id-1572505575-edition_id-0
從spark官網下載使用(sdbadmin用戶)
wget http://mirrors.tuna.tsinghua.edu.cn/apache/spark/spark-2.4.4/spark-2.4.4-bin-hadoop2.7.tgz
解壓到opt目錄下
tar -zxvf spark-2.4.4-bin-hadoop2.7.tgz -C /opt
進入配置文件conf目錄
cd /opt/spark-2.4.4-bin-hadoop2.7/conf
設置spark-env.sh
SPARK_WORKER_INSTANCES=2
設置spark-defaults.conf
spark.sql.cbo.enabled true
設置slaves
sdbserver1
建立設置元數據數據庫配置文件hive-site.xml
<configuration>
拷貝驅動到spark的jars目錄下
拷貝sequoiadb 和spark的鏈接驅動
cp /opt/sequoiadb/spark/spark-sequoiadb_2.11-3.4.jar /opt/spark-2.4.4-bin-hadoop2.7/jars/
拷貝mysql驅動(mysql驅動須要到mysql官網下載)
cp /home/sdbadmin/mysql-connector-java-5.1.47.jar /opt/spark-2.4.4-bin-hadoop2.7/jars/
拷貝sequoiadb的java驅動
cp /opt/sequoiadb/java/sequoiadb-driver-3.4.jar /opt/spark-2.4.4-bin-hadoop2.7/jars/
進入MySQL Shell,建立元數據庫
mysql> CREATE DATABASE metastore CHARACTER SET 'latin1' COLLATE 'latin1_bin';
設置免密
三臺機器均執行ssh-keygen生成公鑰和密鑰
ssh-keygen
在sdbserver1機器執行ssh-copy-id,把公鑰拷貝到其餘兩臺機器
ssh-copy-id sdbadmin@sdbserver1
分發Spark到另外兩臺機器
scp -r /opt/spark-2.4.4-bin-hadoop2.7 sdbadmin@sdbserver2:/opt/
啓動Spark
/opt/spark-2.4.4-bin-hadoop2.7/sbin/start-all.sh
啓動thriftserver
/opt/spark-2.4.4-bin-hadoop2.7/sbin/start-thriftserver.sh --master spark://sdbserver1:7077 --executor-cores 2 --total-executor-cores 12 --executor-memory 2g
進入beeline測試sql
/opt/spark-2.4.4-bin-hadoop2.7/bin/beeline
鏈接thriftserver
beeline> !connect jdbc:hive2://localhost:10000
建立Spark-sql映射表
0: jdbc:hive2://localhost:10000> create database company;
運行分析類SQL,測試是否部署對接成功。
0: jdbc:hive2://localhost:10000> select avg(age) from company.employee;
04
性能對比
爲了測試 OLTP 和 OLAP 同時運行時對集羣性能的影響,使用 MySQL 基準測試工具 Sysbench 進行測試 MySQL,使用 TPC-DS 決策支持系統測試基準測試 Spark-sql。本次 Sysbench 測試場景有:讀寫(oltp_read_write)、點查(oltp_point_select)、索引更新(oltp_update_index)三個場景。TPC-DS 測試場景選取99條SQL中的前30條進行測試,測試案例包含了較高的 IO 負載和 CPU 計算需求,同時具備利用巨杉數據庫的特性對數據進行優化的特色。
測試結果以下:
經過上面圖表展現的測試結果,能夠看到 OLTP 與 OLAP 和 HTAP 場景下的對比,能夠出 SequoiaDB 巨杉數據庫在 HTAP 混合場景下依然能表現優異性能,對各自場景性能影響較小。
05
相關優化
根據複製組和域的概念實現的資源隔離與分區方式結合,能夠把不一樣的數據類型使用域的邏輯概念把複製組進行隔離,而後使用適當的分區方式把數據打散到不一樣的複製組。
基於多租戶架構規劃:一個數據庫一般承載着多種業務系統,爲了不不一樣業務之間的性能影響,根據業務系統的存儲量、併發大小、數據生命週期等劃分不一樣的數據域承載相應的數據讀寫。
基於數據分區方式規劃:結合當前表的數據特性選擇合適的分區方式,如:
1)檔案類數據類數據 ,可使用水平分區按ID散列到不一樣的數據組保證數據均衡無熱點。
2)流水類數據選擇混合分區的方式建立多維分區表進行存放,把不一樣時間段的數據分佈在不一樣的數據組。多維分區表的好處有:一、當訪問某時間範圍的數據可以直接定位到子分區,避免掃描全表數據從而下降IO。二、在集羣擴容時,把擴展的子表建立在新的機器,無需執行rebalance的操做便可完成表存儲空間的擴容。
1)高可用。集羣的MySQL實例都可以提升讀寫操做,因爲各實例的元數據均只存儲在該實例自己,SequoiaSQL-MySQL 提供了元數據同步工具,用來保證 MySQL 服務的高可用。同步工具及部署操做能夠參考官網。
2)提升MySQL實例最大鏈接數。
3)爲每一個MySQL實例配置多個協調節點,均衡協調節點壓力,防止單個協調節點失效,引起MySQL實例單點故障。
4)其餘優化項詳細可參照巨杉數據庫官網的配置項列表。
1)Spark開啓CBO基於代價的優化,根據數據的特色選擇代價最小的物理執行計劃,決定是否進行廣播優化。
2)適當增大WORKER的數量,設置合理的WORKER核數和內存。
3)選擇高效的序列化方式。默認爲org.apache.spark.serializer.JavaSerializer,可是爲了提高性能,應該選擇org.apache.spark.serializer.KryoSerializer 序列化。
4)設置合理的shuffle分區數,使shuffle後的數據可以加入更多的的task數量,從而提升SQL執行的並行度。
5)設置Spark讀取數的節點爲從節點,避免從主節點讀取大量數據形成壓力。
06
小結
SequoiaDB巨杉數據庫採用計算存儲分離架構,在計算層能夠建立多種實例以知足同一集羣不一樣場景的業務須要。本文講述了MySQL和SparkSQL實例的部署和SequoiaDB巨杉數據庫進行對接操做,並利用Sysbench和TPC-DS工具分別在OLTP、OLAP和HTAP場景下進行性能測試,咱們能夠看到在HTAP場景下,SequoiaDB針對不一樣業務的性能表現沒有受到影響,保證業務的正常高效。