搭建高可用mongodb集群(四)分片
按照上一节中《搭建高可用mongodb集群(三) 深入副本集》搭建后还有两个问题没有解决: 从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的时候能否做到自动扩展? 在系统早期,数据量还小的时候不会引起太大的
按照上一节中《搭建高可用mongodb集群(三)—— 深入副本集》搭建后还有两个问题没有解决:
- 从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大?
- 数据压力大到机器支撑不了的时候能否做到自动扩展?
在系统早期,数据量还小的时候不会引起太大的问题,但是随着数据量持续增多,后续迟早会出现一台机器硬件瓶颈问题的。而mongodb主打的就是海量数据架构,他不能解决海量数据怎么行!不行!“分片”就用这个来解决这个问题。
传统数据库怎么做海量数据读写?其实一句话概括:分而治之。上图看看就清楚了,如下 taobao岳旭强在infoq中提到的 架构图:
上图中有个TDDL,是taobao的一个数据访问层组件,他主要的作用是SQL解析、路由处理。根据应用的请求的功能解析当前访问的sql判断是在哪个业务数据库、哪个表访问查询并返回数据结果。具体如图:
说了这么多传统数据库的架构,那Nosql怎么去做到了这些呢?mysql要做到自动扩展需要加一个数据访问层用程序去扩展,数据库的增加、删除、备份还需要程序去控制。一但数据库的节点一多,要维护起来也是非常头疼的。不过mongodb所有的这一切通过他自己的内部机制就可以搞定!顿时石化了,这么牛X!还是上图看看mongodb通过哪些机制实现路由、分片:
从图中可以看到有四个组件:mongos、config server、shard、replica set。
mongos,数据库集群请求的入口,所有的请求都通过mongos进行协调,不需要在应用程序添加一个路由选择器,mongos自己就是一个请求分发中心,它负责把对应的数据请求请求转发到对应的shard服务器上。在生产环境通常有多mongos作为请求的入口,防止其中一个挂掉所有的mongodb请求都没有办法操作。
config server,顾名思义为配置服务器,存储所有数据库元信息(路由、分片)的配置。mongos本身没有物理存储分片服务器和数据路由信息,只是缓存在内存里,配置服务器则实际存储这些数据。mongos第一次启动或者关掉重启就会从 config server 加载配置信息,以后如果配置服务器信息变化会通知到所有的 mongos 更新自己的状态,这样 mongos 就能继续准确路由。在生产环境通常有多个 config server 配置服务器,因为它存储了分片路由的元数据,这个可不能丢失!就算挂掉其中一台,只要还有存货, mongodb集群就不会挂掉。
shard,这就是传说中的分片了。上面提到一个机器就算能力再大也有天花板,就像军队打仗一样,一个人再厉害喝血瓶也拼不过对方的一个师。俗话说三个臭皮匠顶个诸葛亮,这个时候团队的力量就凸显出来了。在互联网也是这样,一台普通的机器做不了的多台机器来做,如下图:
一台机器的一个数据表 Collection1 存储了 1T 数据,压力太大了!在分给4个机器后,每个机器都是256G,则分摊了集中在一台机器的压力。也许有人问一台机器硬盘加大一点不就可以了,为什么要分给四台机器呢?不要光想到存储空间,实际运行的数据库还有硬盘的读写、网络的IO、CPU和内存的瓶颈。在mongodb集群只要设置好了分片规则,通过mongos操作数据库就能自动把对应的数据操作请求转发到对应的分片机器上。在生产环境中分片的片键可要好好设置,这个影响到了怎么把数据均匀分到多个分片机器上,不要出现其中一台机器分了1T,其他机器没有分到的情况,这样还不如不分片!
replica set,上两节已经详细讲过了这个东东,怎么这里又来凑热闹!其实上图4个分片如果没有 replica set 是个不完整架构,假设其中的一个分片挂掉那四分之一的数据就丢失了,所以在高可用性的分片架构还需要对于每一个分片构建 replica set 副本集保证分片的可靠性。生产环境通常是 2个副本 + 1个仲裁。
说了这么多,还是来实战一下如何搭建高可用的mongodb集群:
首先确定各个组件的数量,mongos 3个, config server 3个,数据分3片 shard server 3个,每个shard 有一个副本一个仲裁也就是 3 * 2 = 6 个,总共需要部署15个实例。这些实例可以部署在独立机器也可以部署在一台机器,我们这里测试资源有限,只准备了 3台机器,在同一台机器只要端口不同就可以,看一下物理部署图:
架构搭好了,安装软件!
1、准备机器,IP分别设置为: 192.168.0.136、192.168.0.137、192.168.0.138。
2、分别在每台机器上建立mongodb分片对应测试文件夹。
#存放mongodb数据文件
mkdir -p /data/mongodbtest#进入mongodb文件夹
cd /data/mongodbtest3、下载mongodb的安装程序包
wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.4.8.tgz
#解压下载的压缩包
tar xvzf mongodb-linux-x86_64-2.4.8.tgz4、分别在每台机器建立mongos 、config 、 shard1 、shard2、shard3 五个目录。
因为mongos不存储数据,只需要建立日志文件目录即可。#建立mongos目录
mkdir -p /data/mongodbtest/mongos/log#建立config server 数据文件存放目录
mkdir -p /data/mongodbtest/config/data#建立config server 日志文件存放目录
mkdir -p /data/mongodbtest/config/log#建立config server 日志文件存放目录
mkdir -p /data/mongodbtest/mongos/log#建立shard1 数据文件存放目录
mkdir -p /data/mongodbtest/shard1/data#建立shard1 日志文件存放目录
mkdir -p /data/mongodbtest/shard1/log#建立shard2 数据文件存放目录
mkdir -p /data/mongodbtest/shard2/data#建立shard2 日志文件存放目录
mkdir -p /data/mongodbtest/shard2/log#建立shard3 数据文件存放目录
mkdir -p /data/mongodbtest/shard3/data#建立shard3 日志文件存放目录
mkdir -p /data/mongodbtest/shard3/log5、规划5个组件对应的端口号,由于一个机器需要同时部署 mongos、config server 、shard1、shard2、shard3,所以需要用端口进行区分。
这个端口可以自由定义,在本文 mongos为 20000, config server 为 21000, shard1为 22001 , shard2为22002, shard3为22003.6、在每一台服务器分别启动配置服务器。
/data/mongodbtest/mongodb-linux-x86_64-2.4.8/bin/mongod –configsvr –dbpath /data/mongodbtest/config/data –port 21000 –logpath /data/mongodbtest/config/log/config.log –fork
7、在每一台服务器分别启动mongos服务器。
/data/mongodbtest/mongodb-linux-x86_64-2.4.8/bin/mongos –configdb 192.168.0.136:21000,192.168.0.137:21000,192.168.0.138:21000 –port 20000 –logpath /data/mongodbtest/mongos/log/mongos.log –fork
8、配置各个分片的副本集。
#在每个机器里分别设置分片1服务器及副本集shard1
/data/mongodbtest/mongodb-linux-x86_64-2.4.8/bin/mongod –shardsvr –replSet shard1 –port 22001 –dbpath /data/mongodbtest/shard1/data –logpath /data/mongodbtest/shard1/log/shard1.log –fork –nojournal –oplogSize 10为了快速启动并节约测试环境存储空间,这里加上 nojournal 是为了关闭日志信息,在我们的测试环境不需要初始化这么大的redo日志。同样设置 oplogsize是为了降低 local 文件的大小,oplog是一个固定长度的 capped collection,它存在于”local”数据库中,用于记录Replica Sets操作日志。注意,这里的设置是为了测试!
#在每个机器里分别设置分片2服务器及副本集shard2
/data/mongodbtest/mongodb-linux-x86_64-2.4.8/bin/mongod –shardsvr –replSet shard2 –port 22002 –dbpath /data/mongodbtest/shard2/data –logpath /data/mongodbtest/shard2/log/shard2.log –fork –nojournal –oplogSize 10#在每个机器里分别设置分片3服务器及副本集shard3
/data/mongodbtest/mongodb-linux-x86_64-2.4.8/bin/mongod –shardsvr –replSet shard3 –port 22003 –dbpath /data/mongodbtest/shard3/data –logpath /data/mongodbtest/shard3/log/shard3.log –fork –nojournal –oplogSize 10分别对每个分片配置副本集,深入了解副本集参考本系列前几篇文章。
任意登陆一个机器,比如登陆192.168.0.136,连接mongodb
#设置第一个分片副本集
/data/mongodbtest/mongodb-linux-x86_64-2.4.8/bin/mongo 127.0.0.1:22001#使用admin数据库
use admin#定义副本集配置
config = { _id:“shard1”, members:[1 <code class="plain">{_id:<code class="value">0<code class="plain">,host:<code class="string">"192.168.0.136:22001"<code class="plain">}, 2 <code class="plain">{_id:<code class="value">1<code class="plain">,host:<code class="string">"192.168.0.137:22001"<code class="plain">},
3 <code class="plain">{_id:<code class="value">2<code class="plain">,host:<code class="string">"192.168.0.138:22001"<code class="plain">,arbiterOnly:<code class="keyword">true<code class="plain">}
4 <code class="plain">]
5 <code class="plain">}
#初始化副本集配置
rs.initiate(config);#设置第二个分片副本集
/data/mongodbtest/mongodb-linux-x86_64-2.4.8/bin/mongo 127.0.0.1:22002#使用admin数据库
use admin#定义副本集配置
config = { _id:“shard2”, members:[1 <code class="plain">{_id: 0
,host:
"192.168.0.136:22002"<code class="plain">},
2 <code class="plain">{_id:
1
,host:
"192.168.0.137:22002"<code class="plain">},
3 <code class="plain">{_id:
2
,host:
"192.168.0.138:22002"
,arbiterOnly:
true<code class="plain">}
4 <code class="plain">]
5 <code class="plain">}
#初始化副本集配置
rs.initiate(config);#设置第三个分片副本集
/data/mongodbtest/mongodb-linux-x86_64-2.4.8/bin/mongo 127.0.0.1:22003#使用admin数据库
use admin#定义副本集配置
config = { _id:“shard3”, members:[1 <code class="plain">{_id: 0
,host:
"192.168.0.136:22003"<code class="plain">},
2 <code class="plain">{_id:
1
,host:
"192.168.0.137:22003"<code class="plain">},
3 <code class="plain">{_id:
2
,host:
"192.168.0.138:22003"
,arbiterOnly:
true<code class="plain">}
4 <code class="plain">]
5 <code class="plain">}
#初始化副本集配置
rs.initiate(config);
9、目前搭建了mongodb配置服务器、路由服务器,各个分片服务器,不过应用程序连接到 mongos 路由服务器并不能使用分片机制,还需要在程序里设置分片配置,让分片生效。#连接到mongos
/data/mongodbtest/mongodb-linux-x86_64-2.4.8/bin/mongo 127.0.0.1:20000#使用admin数据库
user admin#串联路由服务器与分配副本集1
db.runCommand( { addshard : “shard1/192.168.0.136:22001,192.168.0.137:22001,192.168.0.138:22001”});如里shard是单台服务器,用 db.runCommand( { addshard : “[: ]” } )这样的命令加入,如果shard是副本集,用db.runCommand( { addshard : “replicaSetName/[:port][,serverhostname2[:port],…]” });这样的格式表示 。
#串联路由服务器与分配副本集2
db.runCommand( { addshard : “shard2/192.168.0.136:22002,192.168.0.137:22002,192.168.0.138:22002”});#串联路由服务器与分配副本集3
db.runCommand( { addshard : “shard3/192.168.0.136:22003,192.168.0.137:22003,192.168.0.138:22003”});#查看分片服务器的配置
db.runCommand( { listshards : 1 } );#内容输出
{01 "shards" <code class="plain">: [
02 <code class="plain">{
03 <code class="string">"_id" <code class="plain">: <code class="string">"shard1"<code class="plain">,
04 <code class="string">"host" <code class="plain">: <code class="string">"shard1/192.168.0.136:22001,192.168.0.137:22001"
05 <code class="plain">},
06 <code class="plain">{
07 <code class="string">"_id" <code class="plain">: <code class="string">"shard2"<code class="plain">,
08 <code class="string">"host" <code class="plain">: <code class="string">"shard2/192.168.0.136:22002,192.168.0.137:22002"
09 <code class="plain">},
10 <code class="plain">{
11 <code class="string">"_id" <code class="plain">: <code class="string">"shard3"<code class="plain">,
12 <code class="string">"host" <code class="plain">: <code class="string">"shard3/192.168.0.136:22003,192.168.0.137:22003"
13 <code class="plain">}
14 <code class="plain">],
15 <code class="string">"ok" <code class="plain">: <code class="value">1
}
因为192.168.0.138是每个分片副本集的仲裁节点,所以在上面结果没有列出来。10、目前配置服务、路由服务、分片服务、副本集服务都已经串联起来了,但我们的目的是希望插入数据,数据能够自动分片,就差那么一点点,一点点。。。
连接在mongos上,准备让指定的数据库、指定的集合分片生效。#指定testdb分片生效
db.runCommand( { enablesharding :“testdb”});#指定数据库里需要分片的集合和片键
db.runCommand( { shardcollection : “testdb.table1”,key : {id: 1} } )我们设置testdb的 table1 表需要分片,根据 id 自动分片到 shard1 ,shard2,shard3 上面去。要这样设置是因为不是所有mongodb 的数据库和表 都需要分片!
11、测试分片配置结果。
#连接mongos服务器
/data/mongodbtest/mongodb-linux-x86_64-2.4.8/bin/mongo 127.0.0.1:20000#使用testdb
use testdb;#插入测试数据
for (var i = 1; i db.table1.save({id:i,“test1”:“testval1”});#查看分片情况如下,部分无关信息省掉了
db.table1.stats();{
01 "sharded" <code class="plain">: <code class="keyword">true<code class="plain">,
02 <code class="string">"ns" <code class="plain">: <code class="string">"testdb.table1"<code class="plain">,
03 <code class="string">"count" <code class="plain">: <code class="value">100000<code class="plain">,
04 <code class="string">"numExtents" <code class="plain">: <code class="value">13<code class="plain">,
05 <code class="string">"size" <code class="plain">: <code class="value">5600000<code class="plain">,
06 <code class="string">"storageSize" <code class="plain">: <code class="value">22372352<code class="plain">,
07 <code class="string">"totalIndexSize" <code class="plain">: <code class="value">6213760<code class="plain">,
08 <code class="string">"indexSizes" <code class="plain">: {
09 <code class="string">"_id_" <code class="plain">: <code class="value">3335808<code class="plain">,
10 <code class="string">"id_1" <code class="plain">: <code class="value">2877952
11 <code class="plain">},
12 <code class="string">"avgObjSize" <code class="plain">: <code class="value">56<code class="plain">,
13 <code class="string">"nindexes" <code class="plain">: <code class="value">2<code class="plain">,
14 <code class="string">"nchunks" <code class="plain">: <code class="value">3<code class="plain">,
15 <code class="string">"shards" <code class="plain">: {
16 <code class="string">"shard1" <code class="plain">: {
17 <code class="string">"ns" <code class="plain">: <code class="string">"testdb.table1"<code class="plain">,
18 <code class="string">"count" <code class="plain">: <code class="value">42183<code class="plain">,
19 <code class="string">"size" <code class="plain">: <code class="value">0<code class="plain">,
20 <code class="plain">...
21 <code class="string">"ok" <code class="plain">: <code class="value">1
22 <code class="plain">},
23 <code class="string">"shard2" <code class="plain">: {
24 <code class="string">"ns" <code class="plain">: <code class="string">"testdb.table1"<code class="plain">,
25 <code class="string">"count" <code class="plain">: <code class="value">38937<code class="plain">,
26 <code class="string">"size" <code class="plain">: <code class="value">2180472<code class="plain">,
27 <code class="plain">...
28 <code class="string">"ok" <code class="plain">: <code class="value">1
29 <code class="plain">},
30 <code class="string">"shard3" <code class="plain">: {
31 <code class="string">"ns" <code class="plain">: <code class="string">"testdb.table1"<code class="plain">,
32 <code class="string">"count" <code class="plain">:<code class="value">18880<code class="plain">,
33 <code class="string">"size" <code class="plain">: <code class="value">3419528<code class="plain">,
34 <code class="plain">...
35 <code class="string">"ok" <code class="plain">: <code class="value">1
36 <code class="plain">}
37 <code class="plain">},
38 <code class="string">"ok" <code class="plain">: <code class="value">1
}
可以看到数据分到3个分片,各自分片数量为: shard1 “count” : 42183,shard2 “count” : 38937,shard3 “count” : 18880。已经成功了!不过分的好像不是很均匀,所以这个分片还是很有讲究的,后续再深入讨论。12、java程序调用分片集群,因为我们配置了三个mongos作为入口,就算其中哪个入口挂掉了都没关系,使用集群客户端程序如下:
public class TestMongoDBShards {
01 public <code class="keyword">static <code class="keyword">void <code class="plain">main(String[] args) {
02 03 try <code class="plain">{
04 <code class="plain">List<serveraddress> addresses = <code class="keyword">new <code class="plain">ArrayList<serveraddress>();</serveraddress>
05 <code class="plain">ServerAddress address1 = <code class="keyword">new <code class="plain">ServerAddress(<code class="string">"192.168.0.136" <code class="plain">, <code class="value">20000<code class="plain">);
06 <code class="plain">ServerAddress address2 = <code class="keyword">new <code class="plain">ServerAddress(<code class="string">"192.168.0.137" <code class="plain">, <code class="value">20000<code class="plain">);
07 <code class="plain">ServerAddress address3 = <code class="keyword">new <code class="plain">ServerAddress(<code class="string">"192.168.0.138" <code class="plain">, <code class="value">20000<code class="plain">);
08 <code class="plain">addresses.add(address1);
09 <code class="plain">addresses.add(address2);
10 <code class="plain">addresses.add(address3);
11 12 <code class="plain">MongoClient client = <code class="keyword">new <code class="plain">MongoClient(addresses);
13 <code class="plain">DB db = client.getDB( <code class="string">"testdb" <code class="plain">);
14 <code class="plain">DBCollection coll = db.getCollection( <code class="string">"table1" <code class="plain">);
15 16 <code class="plain">BasicDBObject object = <code class="keyword">new <code class="plain">BasicDBObject();
17 <code class="plain">object.append( <code class="string">"id" <code class="plain">, <code class="value">1<code class="plain">);
18 19 <code class="plain">DBObject dbObject = coll.findOne(object);
20 21 <code class="plain">System. out .println(dbObject);
22 23 <code class="plain">}
catch
(Exception e) {
24 <code class="plain">e.printStackTrace();
25 <code class="plain">}
26 <code class="plain">}
}
整个分片集群搭建完了,思考一下我们这个架构是不是足够好呢?其实还有很多地方需要优化,比如我们把所有的仲裁节点放在一台机器,其余两台机器承担了全部读写操作,但是作为仲裁的192.168.0.138相当空闲。让机器3 192.168.0.138多分担点责任吧!架构可以这样调整,把机器的负载分的更加均衡一点,每个机器既可以作为主节点、副本节点、仲裁节点,这样压力就会均衡很多了,如图:当然生产环境的数据远远大于当前的测试数据,大规模数据应用情况下我们不可能把全部的节点像这样部署,硬件瓶颈是硬伤,只能扩展机器。要用好mongodb还有很多机制需要调整,不过通过这个东东我们可以快速实现高可用性、高扩展性,所以它还是一个非常不错的Nosql组件。
再看看我们使用的mongodb java 驱动客户端 MongoClient(addresses),这个可以传入多个mongos 的地址作为mongodb集群的入口,并且可以实现自动故障转移,但是负载均衡做的好不好呢?打开源代码查看:
它的机制是选择一个ping 最快的机器来作为所有请求的入口,如果这台机器挂掉会使用下一台机器。那这样。。。。肯定是不行的!万一出现双十一这样的情况所有请求集中发送到这一台机器,这台机器很有可能挂掉。一但挂掉了,按照它的机制会转移请求到下台机器,但是这个压力总量还是没有减少啊!下一台还是可能崩溃,所以这个架构还有漏洞!不过这个文章已经太长了,后续解决吧。
参考:
http://docs.mongodb.org/manual/core/sharding-introduction/原创文章,转载请注明: 转载自LANCEYAN.COM
本文链接地址: 搭建高可用mongodb集群(四)—— 分片

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

.NET 4.0 用於創建各種應用程序,它為應用程式開發人員提供了豐富的功能,包括:物件導向程式設計、靈活性、強大的架構、雲端運算整合、效能最佳化、廣泛的程式庫、安全性、可擴展性、資料存取和行動開發支援。

本文介紹如何在Debian系統上配置MongoDB實現自動擴容,主要步驟包括MongoDB副本集的設置和磁盤空間監控。一、MongoDB安裝首先,確保已在Debian系統上安裝MongoDB。使用以下命令安裝:sudoaptupdatesudoaptinstall-ymongodb-org二、配置MongoDB副本集MongoDB副本集確保高可用性和數據冗餘,是實現自動擴容的基礎。啟動MongoDB服務:sudosystemctlstartmongodsudosys

在開發一個電商網站時,我遇到了一個棘手的問題:如何為用戶提供個性化的商品推薦。最初,我嘗試了一些簡單的推薦算法,但效果並不理想,用戶的滿意度也因此受到影響。為了提升推薦系統的精度和效率,我決定採用更專業的解決方案。最終,我通過Composer安裝了andres-montanez/recommendations-bundle,這不僅解決了我的問題,還大大提升了推薦系統的性能。可以通過一下地址學習composer:學習地址

本文介紹如何在Debian系統上構建高可用性的MongoDB數據庫。我們將探討多種方法,確保數據安全和服務持續運行。關鍵策略:副本集(ReplicaSet):利用副本集實現數據冗餘和自動故障轉移。當主節點出現故障時,副本集會自動選舉新的主節點,保證服務的持續可用性。數據備份與恢復:定期使用mongodump命令進行數據庫備份,並製定有效的恢復策略,以應對數據丟失風險。監控與報警:部署監控工具(如Prometheus、Grafana)實時監控MongoDB的運行狀態,並

直接通過 Navicat 查看 MongoDB 密碼是不可能的,因為它以哈希值形式存儲。取回丟失密碼的方法:1. 重置密碼;2. 檢查配置文件(可能包含哈希值);3. 檢查代碼(可能硬編碼密碼)。

CentOS系統下MongoDB高效備份策略詳解本文將詳細介紹在CentOS系統上實施MongoDB備份的多種策略,以確保數據安全和業務連續性。我們將涵蓋手動備份、定時備份、自動化腳本備份以及Docker容器環境下的備份方法,並提供備份文件管理的最佳實踐。手動備份:利用mongodump命令進行手動全量備份,例如:mongodump-hlocalhost:27017-u用戶名-p密碼-d數據庫名稱-o/備份目錄此命令會將指定數據庫的數據及元數據導出到指定的備份目錄。

CentOS系統上GitLab數據庫部署指南選擇合適的數據庫是成功部署GitLab的關鍵步驟。 GitLab兼容多種數據庫,包括MySQL、PostgreSQL和MongoDB。本文將詳細介紹如何選擇並配置這些數據庫。數據庫選擇建議MySQL:一款廣泛應用的關係型數據庫管理系統(RDBMS),性能穩定,適用於大多數GitLab部署場景。 PostgreSQL:功能強大的開源RDBMS,支持複雜查詢和高級特性,適合處理大型數據集。 MongoDB:流行的NoSQL數據庫,擅長處理海

PiNetwork即將推出革命性移動銀行平台PiBank! PiNetwork今日發布重大更新Elmahrosa(Face)PIMISRBank,簡稱PiBank,它將傳統銀行服務與PiNetwork加密貨幣功能完美融合,實現法幣與加密貨幣的原子交換(支持美元、歐元、印尼盾等法幣與PiCoin、USDT、USDC等加密貨幣的互換)。究竟PiBank有何魅力?讓我們一探究竟! PiBank主要功能:一站式管理銀行賬戶和加密貨幣資產。支持實時交易,並採用生物特
