您好,登錄后才能下訂單哦!
本文小編為大家詳細(xì)介紹“MariaDB Spider數(shù)據(jù)庫分庫分表的方法”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“MariaDB Spider數(shù)據(jù)庫分庫分表的方法”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識(shí)吧。
一般來說,數(shù)據(jù)庫分庫分表,有以下做法:
按哈希分片:根據(jù)一條數(shù)據(jù)的標(biāo)識(shí)計(jì)算哈希值,將其分配到特定的數(shù)據(jù)庫引擎中;
按范圍分片:根據(jù)一條數(shù)據(jù)的標(biāo)識(shí)(一般是值),將其分配到特定的數(shù)據(jù)庫引擎中;
按列表分片:根據(jù)某些字段的標(biāo)識(shí),如果符合條件則分配到特定的數(shù)據(jù)庫引擎中。
分庫分表的做法有很多種,例如編寫代碼庫,在程序中支持多數(shù)據(jù)庫,程序需要知道每個(gè)數(shù)據(jù)庫的地址,并要編寫代碼進(jìn)行支持;使用中間件將多個(gè)數(shù)據(jù)庫引擎連接起來,程序只需要知道中間件地址。
但是分庫分表后,因?yàn)槿我鈨蓚€(gè)表可能在不同的數(shù)據(jù)庫實(shí)例中,兩個(gè)表進(jìn)行連接查詢時(shí),兩個(gè)數(shù)據(jù)庫實(shí)例之間的交互變得復(fù)雜起來,當(dāng)集群中的數(shù)據(jù)量較大時(shí),便不能隨意 join
了,可能需要其他方式支撐聚合查詢。
分庫分表有優(yōu)點(diǎn)有缺點(diǎn),這里就不再多說,先學(xué)會(huì)再打算。
MariaDB Server 是開源的,目前最流行的關(guān)系型數(shù)據(jù)庫之一,MariaDB 是從 Mysql 的分支開發(fā)而來,一直保持對(duì) Mysql 的兼容性。因?yàn)榧坠俏牡氖召彛琈ySQL 屬于 Oracle 所有,存在閉源的可能,以及逐漸商業(yè)化,變得不清真,于是 Mysql之父創(chuàng)建了 MariaDB,目的是完全兼容 Mysql,并且開源、免費(fèi)。
MariaDB 使用 Spider 插件進(jìn)行分庫分表的支持,Spider 存儲(chǔ)引擎是一個(gè)內(nèi)置分片功能的存儲(chǔ)引擎。它支持分區(qū)和xa 事務(wù),并允許處理不同 MariaDB 實(shí)例的表,就好像它們?cè)谕粋€(gè)實(shí)例上一樣。
請(qǐng)參考資料:https://mariadb.com/kb/en/spider/
在這篇文章中,筆者將使用 MariaDB Spider 進(jìn)行分庫分表的實(shí)踐。
為了更好地創(chuàng)建分庫分表實(shí)踐環(huán)境,這里需要三個(gè) “物理”數(shù)據(jù)庫,一個(gè)邏輯數(shù)據(jù)庫,即四個(gè) MariaDB 實(shí)例。MariaDB 實(shí)際占用的內(nèi)存并不大,筆者 4G 內(nèi)存的服務(wù)器裝了 Kubernetes ,用 Docker 部署四個(gè) MariaDB 數(shù)據(jù)庫,運(yùn)行速度正常,對(duì)于我們測(cè)試練習(xí) 4G 內(nèi)存足以。
四個(gè)數(shù)據(jù)庫的關(guān)系如圖:
其中,邏輯數(shù)據(jù)庫實(shí)例稱為 Spider Proxy Node,實(shí)際存儲(chǔ)數(shù)據(jù)的數(shù)據(jù)庫實(shí)例被稱為 Backend Node。
典型的 Spider 部署具有無共享的集群架構(gòu)。該系統(tǒng)適用于任何廉價(jià)的硬件,并且對(duì)硬件或軟件的特定要求最低。它由一組計(jì)算機(jī)組成,具有一個(gè)或多個(gè) MariaDB 進(jìn)程,稱為節(jié)點(diǎn)。
存儲(chǔ)數(shù)據(jù)的節(jié)點(diǎn)將被設(shè)計(jì)為Backend Nodes
,并且可以是任何 MariaDB、MySQL、Oracle 服務(wù)器實(shí)例,使用后端內(nèi)可用的任何存儲(chǔ)引擎。
如果機(jī)器不夠,使用虛擬機(jī)部署便會(huì)顯得很麻煩,這里筆者使用 Docker 快速部署練習(xí)。
參考資料:https://mariadb.com/kb/en/installing-and-using-mariadb-via-docker/
查看 MariaDB 鏡像版本列表:https://hub.docker.com/_/mariadb/
直接創(chuàng)建四個(gè)數(shù)據(jù)庫實(shí)例,其中一個(gè)是 Spider 實(shí)例,實(shí)例使用端口區(qū)分。
docker run --name mariadbtest1 -e MYSQL_ROOT_PASSWORD=123456 -p 13306:3306 -d docker.io/library/mariadb:10.7 docker run --name mariadbtest2 -e MYSQL_ROOT_PASSWORD=123456 -p 13307:3306 -d docker.io/library/mariadb:10.7 docker run --name mariadbtest3 -e MYSQL_ROOT_PASSWORD=123456 -p 13308:3306 -d docker.io/library/mariadb:10.7 docker run --name mariadbspider -e MYSQL_ROOT_PASSWORD=123456 -p 13309:3306 -d docker.io/library/mariadb:10.7
接著,進(jìn)入每個(gè)容器實(shí)例中,進(jìn)入 /etc/mysql/mariadb.conf.d
目錄,修改50-server.cnf
文件,運(yùn)行遠(yuǎn)程訪問數(shù)據(jù)庫實(shí)例。由于容器中沒有 nano、vi 這些編輯命令,因此可以使用下面的命令快速替換文件內(nèi)容:
echo ' [server] [mysqld] pid-file = /run/mysqld/mysqld.pid basedir = /usr datadir = /var/lib/mysql tmpdir = /tmp lc-messages-dir = /usr/share/mysql lc-messages = en_US skip-external-locking bind-address = 0.0.0.0 expire_logs_days = 10 character-set-server = utf8mb4 collation-server = utf8mb4_general_ci [embedded] [mariadb] [mariadb-10.7] ' > 50-server.cnf
然后查看每個(gè)容器的主機(jī)內(nèi) IP:
docker inspect --format='{{.NetworkSettings.IPAddress}}' mariadbtest1 mariadbtest2 mariadbtest3 mariadbspider
172.17.0.2
172.17.0.3
172.17.0.4
172.17.0.5
接著打開名為 mariadbspider 的容器,在里面按照 Spider 插件:
apt update apt install mariadb-plugin-spider
這里需要四個(gè)虛擬機(jī),每個(gè)虛擬機(jī)都需要先安裝 MariaDB 數(shù)據(jù)庫引擎以及一些工具包。
可參考:https://mariadb.com/kb/en/spider-installation/
首先在每個(gè)虛擬安裝 MariaDB Community Server,即數(shù)據(jù)庫引擎。
如果使用虛擬機(jī)部署安裝,需要替換國(guó)內(nèi)鏡像源,以便快速下載需要的包, Centos 服務(wù)器,可以直接以下命令快速更新鏡像源,如果是 Debain 系列,可自行查找對(duì)應(yīng)的鏡像源。
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo #清除緩存 yum clean all #生成新的緩存 yum makecache
接著,配置 MariaDB 官方的軟件包存儲(chǔ)庫:
sudo yum install wget wget https://downloads.mariadb.com/MariaDB/mariadb_repo_setup echo "fd3f41eefff54ce144c932100f9e0f9b1d181e0edd86a6f6b8f2a0212100c32c mariadb_repo_setup" | sha256sum -c - chmod +x mariadb_repo_setup sudo ./mariadb_repo_setup --mariadb-server-version="mariadb-10.7"
再次更新鏡像源緩存:
#清除緩存 yum clean all #生成新的緩存 yum makecache
安裝 MariaDB 社區(qū)服務(wù)器和軟件包依賴項(xiàng):
sudo yum install MariaDB-server MariaDB-backup
接著,配置允許遠(yuǎn)程訪問數(shù)據(jù)庫。
MariaDB 的配置文件都在 /etc/my.cnf
中,打開 /etc/my.cnf.d/
目錄后,修改 server.cnf
文件,允許遠(yuǎn)程訪問。找到 bind-address
屬性,去掉 #
。
#bind-address=0.0.0.0 ↓ bind-address=0.0.0.0
如需了解每個(gè)配置的作用,請(qǐng)參考資料: https://mariadb.com/docs/deploy/community-spider/
修改密碼。因?yàn)槁銠C(jī)部署的數(shù)據(jù)庫,本身沒有密碼,所以需要手動(dòng)配置。
打開終端,執(zhí)行以下命令:
mysql -u root -p
set password for root @localhost = password('123456');
然后執(zhí)行 quit;
退出數(shù)據(jù)庫操作終端。
如果提示 root 不存在,則請(qǐng)使用 mysql -u mysql -p
,密碼為空,直接按下回車鍵即可。如果不行,則參考:https://www.whuanle.cn/archives/1385
然后重啟數(shù)據(jù)庫實(shí)例:
systemctl restart mariadb systemctl status mariadb
接著檢查防火墻配置,或執(zhí)行 sudo iptables -F
清理防火墻配置。
MariaDB 配置文件中,部分主要屬性的說明如下如下:
字段 | 說明 |
---|---|
bind_address | 綁定訪問地址 |
max_connections | 最大連接數(shù) |
thread_handling | 設(shè)置 MariaDB 社區(qū)服務(wù)器如何處理客戶端連接的線程 |
log_error | 錯(cuò)誤日志輸出文件 |
MariaDB 基礎(chǔ)維護(hù)命令:
說明 | 命令 |
---|---|
啟動(dòng) | sudo systemctl start mariadb |
停止 | sudo systemctl stop mariadb |
重新啟動(dòng) | sudo systemctl restart mariadb |
在啟動(dòng)期間啟用 | sudo systemctl enable mariadb |
啟動(dòng)時(shí)禁用 | sudo systemctl disable mariadb |
狀態(tài) | sudo systemctl status mariadb |
部署數(shù)據(jù)庫后,需要連接每個(gè)數(shù)據(jù)庫進(jìn)行測(cè)試,以便檢查數(shù)據(jù)庫是否正常。
打開 mariadbspider 數(shù)據(jù)庫實(shí)例,執(zhí)行以下命令,加載 spider 插件,將其設(shè)置為 Spider 數(shù)據(jù)庫實(shí)例。
INSTALL SONAME 'ha_spider';
執(zhí)行命令查詢是否已經(jīng)啟動(dòng) Spider 插件:
SELECT * FROM mysql.plugin;
請(qǐng)參考資料:https://mariadb.com/kb/en/spider-installation/
MariaDB Spider 模式已經(jīng)搭建好了,這里開始進(jìn)行實(shí)踐。
在這個(gè)模式中,Spider 中的一個(gè)表對(duì)應(yīng)一個(gè)數(shù)據(jù)庫實(shí)例中的同名數(shù)據(jù)庫的同名表,即數(shù)據(jù)庫名稱系統(tǒng),表名稱相同。
首先在 三個(gè)數(shù)據(jù)庫實(shí)例中,創(chuàng)建一個(gè)測(cè)試數(shù)據(jù)庫,名稱為 test1 ,然后執(zhí)行命令創(chuàng)建表:
CREATE TABLE s( id INT NOT NULL AUTO_INCREMENT, code VARCHAR(10), PRIMARY KEY(id));
然后在 mariadbspider 實(shí)例中,執(zhí)行命令,創(chuàng)建邏輯表,并將這個(gè)表綁定到 mariadbtest1 實(shí)例中。
CREATE TABLE s( id INT NOT NULL AUTO_INCREMENT, code VARCHAR(10), PRIMARY KEY(id) ) ENGINE=SPIDER COMMENT 'host "172.17.0.2", user "root", password "123456", port "3306"';
注意替換你的 IP,另外注意端口,如果是容器訪問容器,直接使用 3306。
如果沒有配置好,數(shù)據(jù)庫不對(duì)應(yīng)等,可能會(huì)出現(xiàn):
> 1046 - No database selected
> 時(shí)間: 0.062s
然后在 mariadbspider 中,插入四條數(shù)據(jù):
INSERT INTO s(code) VALUES ('a'); INSERT INTO s(code) VALUES ('b'); INSERT INTO s(code) VALUES ('c'); INSERT INTO s(code) VALUES ('d');
如果分別打開三個(gè)實(shí)例,你會(huì)發(fā)現(xiàn),插入的數(shù)據(jù)只會(huì)出現(xiàn)在 mariadbtest1 中出現(xiàn),因?yàn)檫@個(gè)表只綁定了它。你還可以在 mariadbspider 上對(duì)這個(gè)表進(jìn)行增刪查改,所有操作都會(huì)同步到對(duì)應(yīng)數(shù)據(jù)庫實(shí)例中。
SysBench 是一個(gè)模塊化、跨平臺(tái)和多線程的基準(zhǔn)測(cè)試工具,支持 Windows 和 Linux,用于評(píng)估對(duì)于在高負(fù)載下運(yùn)行數(shù)據(jù)庫的系統(tǒng)非常重要的操作系統(tǒng)參數(shù)。這個(gè)基準(zhǔn)測(cè)試套件的想法是,在不設(shè)置復(fù)雜的數(shù)據(jù)庫基準(zhǔn)或甚至根本不安裝數(shù)據(jù)庫的情況下,快速獲得系統(tǒng)性能的印象。它可以測(cè)試出:
文件 i/o 性能
調(diào)度器性能
內(nèi)存分配和傳輸速度
POSIX 線程實(shí)現(xiàn)性能
數(shù)據(jù)庫服務(wù)器性能(OLTP 基準(zhǔn))
項(xiàng)目地址:https://github.com/akopytov/sysbench
Linux 可以直接安裝二進(jìn)制包。
Debian/Ubuntu
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.deb.sh | sudo bash sudo apt -y install sysbench
RHEL/CentOS:
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash sudo yum -y install sysbench
Fedora:
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash sudo dnf -y install sysbench
Arch Linux:
sudo pacman -Suy sysbench
sysbench 命令格式:
sysbench <TYPE> --threads=2 --report-interval=3 --histogram --time=50 --db-driver=mysql --mysql-host=<HOST> --mysql-db=<SCHEMA> --mysql-user=<USER> --mysql-password=<PASSWORD> run
首先,在當(dāng)前特定數(shù)據(jù)庫下創(chuàng)建模擬數(shù)據(jù):
sysbench oltp_read_write --db-driver=mysql --mysql-user=root --mysql-password=123456 --mysql-host=123.123.123.123 --mysql-port=13309 --mysql-db=test1 prepare
sysbench 1.0.18 (using system LuaJIT 2.1.0-beta3) Creating table 'sbtest1'... Inserting 10000 records into 'sbtest1' Creating a secondary index on 'sbtest1'...
接著運(yùn)行測(cè)試:
sysbench oltp_read_write --db-driver=mysql --mysql-user=root --mysql-password=123456 --mysql-host=123.123.123.123 --mysql-port=13309 --mysql-db=test1 run
SQL statistics: queries performed: read: 112 write: 32 other: 16 total: 160 transactions: 8 (0.80 per sec.) queries: 160 (15.96 per sec.) ignored errors: 0 (0.00 per sec.) reconnects: 0 (0.00 per sec.) General statistics: total time: 10.0273s total number of events: 8 Latency (ms): min: 1244.02 avg: 1253.36 max: 1267.87 95th percentile: 1258.08 sum: 10026.85 Threads fairness: events (avg/stddev): 8.0000/0.00 execution time (avg/stddev): 10.0269/0.00
或者每 3 秒生成一次直方圖:
sysbench oltp_read_write --threads=2 --report-interval=3 --histogram --time=50 --table-size=1000000 --db-driver=mysql --mysql-user=root --mysql-password=123456 --mysql-host=123.123.123.123 --mysql-port=13309 --mysql-db=test1 run
清理模擬生成的數(shù)據(jù):
sysbench oltp_read_write --db-driver=mysql --mysql-user=root --mysql-password=123456 --mysql-host=123.123.123.123 --mysql-port=13309 --mysql-db=test1 cleanup
sysbench 跑測(cè)試時(shí),可選參數(shù)如下:
使用–time=<SECONDS>
運(yùn)行固定時(shí)間
使用–events=0
對(duì)執(zhí)行的查詢不設(shè)置限制
使用–db-ps-mode=disable
禁用準(zhǔn)備好的語句
使用–report-interval=<SECONDS>
獲取繪圖點(diǎn)
用--histogram
得到一個(gè)直方圖
sysbench 有三個(gè)過程或執(zhí)行模式:
prepare
:為需要它們的測(cè)試執(zhí)行準(zhǔn)備操作,例如在磁盤上為fileio
測(cè)試創(chuàng)建必要的文件,或填充測(cè)試數(shù)據(jù)庫以進(jìn)行數(shù)據(jù)庫基準(zhǔn)測(cè)試。
run
:運(yùn)行使用testname 參數(shù)指定的實(shí)際測(cè)試。此命令由所有測(cè)試提供。
cleanup
:在創(chuàng)建一個(gè)的測(cè)試中測(cè)試運(yùn)行后刪除臨時(shí)數(shù)據(jù)。
你也可以參考筆者的另一篇文章,使用別的方法做基準(zhǔn)測(cè)試:https://www.whuanle.cn/archives/1388
在遠(yuǎn)程表一節(jié)中,我們是在創(chuàng)建表的時(shí)候,再綁定一個(gè)數(shù)據(jù)庫實(shí)例,其實(shí)也可以提前配置多個(gè)數(shù)據(jù)庫實(shí)例到 Spider 中,下面是在 Spider 中執(zhí)行的配置命令:
CREATE SERVER mariadbtest1 FOREIGN DATA WRAPPER mysql OPTIONS( HOST '172.17.0.2', DATABASE 'test1', USER 'root', PASSWORD '123456', PORT 3306 ); CREATE SERVER mariadbtest2 FOREIGN DATA WRAPPER mysql OPTIONS( HOST '172.17.0.3', DATABASE 'test1', USER 'root', PASSWORD '123456', PORT 3306 ); CREATE SERVER mariadbtest3 FOREIGN DATA WRAPPER mysql OPTIONS( HOST '172.17.0.4', DATABASE 'test1', USER 'root', PASSWORD '123456', PORT 3306 );
在這一小節(jié)中,我們將一個(gè)表進(jìn)行分片,在插入數(shù)據(jù)時(shí),數(shù)據(jù)自動(dòng)分片到三個(gè)數(shù)據(jù)庫實(shí)例中。
在三個(gè)數(shù)據(jù)節(jié)點(diǎn)數(shù)據(jù)庫中,在 test1 數(shù)據(jù)庫下,執(zhí)行命令,創(chuàng)建表:
CREATE TABLE shardtest ( id int(10) unsigned NOT NULL AUTO_INCREMENT, k int(10) unsigned NOT NULL DEFAULT '0', c char(120) NOT NULL DEFAULT '', pad char(60) NOT NULL DEFAULT '', PRIMARY KEY (id), KEY k (k) )
此時(shí),三個(gè)數(shù)據(jù)庫實(shí)例都具有相同的表。
然后在 mariadbspider 實(shí)例中,執(zhí)行命令,創(chuàng)建邏輯表,并將此表通過切片的模式,連接到三個(gè)數(shù)據(jù)庫實(shí)例中。
CREATE TABLE test1.shardtest ( id int(10) unsigned NOT NULL AUTO_INCREMENT, k int(10) unsigned NOT NULL DEFAULT '0', c char(120) NOT NULL DEFAULT '', pad char(60) NOT NULL DEFAULT '', PRIMARY KEY (id), KEY k (k) ) ENGINE=spider COMMENT='wrapper "mysql", table "shardtest"' PARTITION BY KEY (id) ( PARTITION pt1 COMMENT = 'srv "mariadbtest1"', PARTITION pt2 COMMENT = 'srv "mariadbtest2"', PARTITION pt3 COMMENT = 'srv "mariadbtest3"' ) ;
然后打開 https://github.com/whuanle/write_share_database,找到 分片測(cè)試數(shù)據(jù).sql
這個(gè)文件,里面有很多模擬數(shù)據(jù)。
你可以觀察到,三個(gè)數(shù)據(jù)庫實(shí)例的數(shù)據(jù)是不同的。
分片方式的選擇在于 PARTITION BY
屬性,例如哈希分片是根據(jù)一個(gè)鍵進(jìn)行計(jì)算的,則配置命令為 PARTITION BY KEY (id)
,如果是根據(jù)值范圍分片,則是 PARTITION BY range columns (<字段名稱>)
。
) ENGINE=spider COMMENT='wrapper "mysql", table "shardtest"' PARTITION BY range columns (k) ( PARTITION pt1 values less than (5000) COMMENT = 'srv "mariadbtest1"', PARTITION pt2 values less than (5100) COMMENT = 'srv "mariadbtest2"' PARTITION pt3 values less than (5200) COMMENT = 'srv "mariadbtest3"' ) ;
根據(jù)列表分片,一般是某個(gè)字段,可以將數(shù)據(jù)劃分為不同類型,可以根據(jù)這個(gè)字段的內(nèi)容對(duì)數(shù)據(jù)進(jìn)行分組。
) ENGINE=spider COMMENT='wrapper "mysql", table "shardtest"' PARTITION BY list columns (k) ( PARTITION pt1 values in ('4900', '4901', '4902') COMMENT = 'srv "mariadbtest1"', PARTITION pt2 values in ('5000', '5100') COMMENT = 'srv "mariadbtest2"' PARTITION pt3 values in ('5200', '5300') COMMENT = 'srv "mariadbtest3"' ) ;
當(dāng)數(shù)據(jù)的 k 字段,值是 4900 、4901 或 4902 時(shí),將被分片到 mariadbtest1 實(shí)例中。
讀到這里,這篇“MariaDB Spider數(shù)據(jù)庫分庫分表的方法”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。