本文來自社區用戶投稿,感謝這位小伙伴的技術分享
巨杉數據庫架構簡介
巨杉數據庫作為分布式數據庫是計算和存儲分離架構,由數據庫實例層和存儲引擎層組成的。存儲引擎層負責數據庫核心功能比如數據讀寫存儲以及分布式事務管理。數據庫實例層也就是這里的的SQL層負責把應用SQL請求處理后發存儲引擎層處理,並且把存儲引擎層響應結果反饋給應用層。支持結構化實例比如MySQL實例/PG實例/spark實例,也支持非結構化實例比如 Json實例/S3對象存儲實例/PosixFs實例等等。這種架構支持的實例類型比較多,方便從傳統數據庫無縫遷移到巨杉數據庫,減小了開發學習成本,之前也跟數據庫圈同行交流,他們對架構也是十分認可。
這里的SQL層采用的是MySQL實例,存儲引擎層是有三個數據節點和協調節點編目節點組成。其中數據節點就是用來存儲數據的,協調節點不存儲數據,是用來把MySQL的請求進行路由分發到數據庫節點。編目節點用來存儲集群的系統信息比如用戶信息/分區信息等等。這里用一個容器來模擬一個物理機或雲虛擬機,這里設置的是MySQL實例在一個容器里,編目和節點和協調節點放在了一個容器,三個數據節點分別放在一個容器,三個數據節點構成了三個數據組,每個數據組三個副本。Web應用的海量數據是通過分片切分的方式分散給不同的數據節點,像這里的數據ABC通過分片打散到三台機器。
這里的數據分片是通過分布式Hash算法DHT機制實現,DHT是distribute Hashing table 縮寫。當寫入數據時,首先通過MySQL實例把記錄下發到協調節點,協調節點會通過分布式Hash算法根據每條記錄的分區鍵進行散列,散列完之后協調節點根據分區鍵判斷到底發送到哪一個分區,所以每個分區之間的數據是完全隔離互相獨立的。采用這種方法,我們就可以把一個很大的表拆散到下面不同的子分區里面小表,實現數據拆分。
mysqldump和 mydumper/myloader 導入導出工具實戰
SequoiaDB實現了對MySQL的完整兼容,那么有的用戶會問了:
“既然是完整兼容,MySQL相關的工具是否能使用?”
“數據從MySQL遷移到SequoiaDB如何操作?”
下面我們就介紹SequoiaDB如何使用 mysqldump和 mydumper/myloader 進行數據的導入導出。
1. mysqldump
1)通過存儲過程制造測試數據
#mysql -h 127.0.0.1 -P 3306 -u root mysql>create database news; mysql>use news; mysql>create table user_info(id int(11),unickname varchar(100));
delimiter // create procedure `news`.`user_info_PROC`() begin declare iloop smallint default 0; declare iNum mediumint default 0; declare uid int default 0; declare unickname varchar(100) default 'test'; while iNum <=10 do start transaction; while iloop<=10 do set uid=uid+1; set unickname=CONCAT('test',uid); insert into `news`.`user_info`(id,unickname) values(uid,unickname); set iloop=iloop+1; end while; set iloop=0; set iNum=iNum+1; commit; end while; end// delimiter ; call news.user_info_PROC();
2)查看制造測試數據狀況
mysql> use news; Database changed mysql> show tables; +----------------+ | Tables_in_news | +----------------+ | user_info | +----------------+ 1 row in set (0.00 sec) mysql> select count(*) from user_info; +----------+ | count(*) | +----------+ | 121 | +----------+ 1 row in set (0.01 sec)
3)執行下面mysqldump備份指令
#/opt/sequoiasql/mysql/bin/mysqldump -h 127.0.0.1 -P 3306 -u root -B news > news.sql
查看到對應的文件為news.sql
然后登陸到數據庫刪除原來的數據庫數據
mysql> drop database news; Query OK, 1 row affected (0.10 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec)
4)用source導入新的數據
#/opt/sequoiasql/mysql/bin/mysql -h 127.0.0.1 -P 3306 -u root
使用mysqldump導出的完整sql語句,直接登陸數據庫執行導入即可:
#/opt/sequoiasql/mysql/bin/mysql -h 127.0.0.1 -P 3306 -u root mysql>source news.sql mysql> use news; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with-A Database changed mysql> show tables; +----------------+ | Tables_in_news | +----------------+ | user_info | +----------------+ 1 row in set (0.00 sec)
可以看到返回結果,的確支持mysqldump數據導出工具和source導入工具。
2. mydumper和myloader使用
這一章節將介紹有關mydumper和myloader工具的使用。
有的同學對於mysqldump與mydumper有點混淆:mysqldump是MySQL原廠自帶的。mydumper/myloader是由MySQL /Facebook等公司開發維護的一套邏輯備份恢復工具,DBA較常使用,需要單獨安裝,具體安裝方式可以在網絡上進行查詢。
針對SequoiaDB使用mydumper/myloader的情況,
我們首先查看mydumper版本號
# mydumper --version mydumper 0.9.1, built against MySQL 5.7.17
1)mydumper導出數據
# mydumper -h 127.0.0.1 -P 3306 -u root -B news -o /home/sequoiadb
刪除原來的數據庫
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | news | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec) mysql> drop database news; Query OK, 1 row affected (0.13 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec)
2)myloader 導入數據
可以看到數據已經被刪除,利用myloader導入數據
#myloader -h 127.0.0.1 -P 3306 -u root -B news -d /home/sequoiadb
登陸到數據庫中查看
# /opt/sequoiasql/mysql/bin/mysql -h 127.0.0.1 -P 3306 -u root mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | news | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec) mysql> use news; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> show tables; +----------------+ | Tables_in_news | +----------------+ | user_info | +----------------+ 1 row in set (0.00 sec) mysql> select count(*) from user_info; +----------+ | count(*) | +----------+ | 121 | +----------+ 1 row in set (0.00 sec)
mydumper 及 myloader 導入數據沒問題,看來巨杉數據庫 Sequoiadb 的確支持 MySQL 的兼容工具 mydumper 及 myloader。
遷移 MySQL 數據庫數據只需要把 MySQL 數據利用 mydumper 導出之后,在巨杉數據庫利用 myloader 導入到巨杉數據庫即可。
總結
巨杉數據庫采用計算-存儲分離的架構,實現了MySQL的100%完整兼容。通過本文,我們也可以看到,巨杉數據庫可以支持所有標准MySQL的周邊工具,同時分布式可擴展性將大大提升已有應用的擴展性以及整體數據管理能力。因此,巨杉數據庫SequoiaDB可以說是傳統單點MySQL方案的一種有力替換。