简介
在这篇文章中,我们将看到什么是YugabyteDB,如何安装它并使用PostgreSQL工具进行管理,以及你如何使用JDBC、JPA或Hibernate连接到它。
自从Franck Pachot以开发者倡导者的身份加入Yugabyte后,我对他们感到好奇。在关注Franck很长时间后,我决定调查他们正在开发的这个新的兼容PostgreSQL的数据库,因为我一直在从Franck那里学习很多关于SQL和数据库系统的东西。
什么是YugabyteDB
YugabyteDB是一个开源的分布式SQL数据库,它结合了使用关系型数据库(如ACID事务)的好处和全球分布式自动分片存储(如NoSQL文档数据库)的优点。
首先,它是一个开源的数据库,你可以在GitHub上找到它。只有云管理部分是专有的,但引擎本身是社区驱动的。
其次,YugabyteDB建立在PostgreSQL的基础上,所以每一个与PostgreSQL兼容的工具也可以与Yugabyte兼容。因此,你不仅能够使用PgAdmin连接到Yugabyte,而且你可以使用任何与PostgreSQL驱动一起工作的软件框架或库。正如你在这篇文章中所看到的,使现有的PostgreSQL应用程序在Yugabyte上工作是非常容易的。
第三,当涉及到数据和流量时,YugabyteDB是多功能的。因为它提供了自动扩展、自动分片和自动平衡,你不必在你的系统变得过于成功而使最初的架构无法应付的时候重新架构。
如何安装YugabyteDB
根据你的应用需求,有多种方法来安装Yugabyte。
然而,在这篇文章中,我将告诉你如何在Docker容器中运行Yugabyte。
第一步是拉动Docker镜像。
> docker pull yugabytedb/yugabyte:2.15.1.0-b175
2.15.1.0-b175: Pulling from yugabytedb/yugabyte
2d473b07cdd5: Pull complete
5954b7a9c5ea: Pull complete
5b00001786bb: Pull complete
c43e6bd8eb6c: Pull complete
99ad07cc1c7c: Pull complete
b9331fac7e42: Pull complete
a7e3630fe335: Pull complete
05b42b4417c9: Pull complete
d97501a5f6ad: Pull complete
06158813861c: Pull complete
736eaefc97b2: Pull complete
c45ea0648626: Pull complete
2843bee931d8: Pull complete
808b5e86368d: Pull complete
Digest: sha256:b340163bdd55bf6b3653224460eb93f71782b331804d2f9655194e2b135ba72f
Status: Downloaded newer image for yugabytedb/yugabyte:2.15.1.0-b175
docker.io/yugabytedb/yugabyte:2.15.1.0-b175
之后,我们可以使用以下docker run 命令创建一个新的容器。
> docker run -d --name yugabyte -p7000:7000 -p9000:9000 -p5433:5433 -p9042:9042 yugabytedb/yugabyte:2.15.1.0-b175 bin/yugabyted start --daemon=false --ui=false
如果你运行的是macOS Monterey,你必须用
-p7001:7000替换-p7000:7000。这是必要的,因为在默认情况下,AirPlay监听端口为7000。这与YugabyteDB冲突,并导致
yugabyted start,除非你如图所示转发该端口,否则会失败。另外,你可以禁用AirPlay接收,然后正常启动YugabyteDB,然后,可以选择重新启用AirPlay接收。
注意,新创建的容器被称为yugabyte ,我们可以看到它是通过ps -a 命令安装的。
> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
88feaa0a2942 yugabytedb/yugabyte:2.15.1.0-b175 "/sbin/tini -- bin/y…" 27 seconds ago Up 24 seconds 0.0.0.0:5433->5433/tcp, 6379/tcp, 7100/tcp, 0.0.0.0:7000->7000/tcp, 0.0.0.0:9000->9000/tcp, 7200/tcp, 9100/tcp, 10100/tcp, 11000/tcp, 0.0.0.0:9042->9042/tcp, 12000/tcp yugabyte
有了这个容器,下次我们启动系统时,我们可以使用start Docker命令启动Yugabyte数据库。
docker start yugabyte
这就是了!
如何连接到Yugabyte
一旦Yugabute数据库服务器启动,你可以使用任何与PostgreSQL兼容的工具连接到它。例如,我可以使用PgAdmin UI工具同时连接到我的本地PostgreSQL服务器和运行在Docker上的YugabyteDB服务器。

从你喜欢的编程语言,你可以像对PostgreSQL那样连接到Yugabyte。例如,如果你使用Java,你可以使用PostgreSQL JDBC驱动程序中的PGSimpleDataSource ,正如下面的例子所说明的。
PGSimpleDataSource dataSource = new PGSimpleDataSource();
dataSource.setURL(
"jdbc:postgresql://127.0.0.1:5433/high_performance_java_persistence"
);
dataSource.setUser("yugabyte");
dataSource.setPassword("admin");
棒极了,对吗?
在Yugabyte上运行高性能资源库
对我来说,测试拥有JDBC驱动和Hibernate方言的数据库系统的最好方法是使用高性能Java Persistence GitHub仓库,因为它提供了大量的集成测试集合,可以验证大量的JPA、Hibernate、JDBC和数据库功能。
> find . -name '*Test.java' | wc -l
709
有了709 集成测试类,我有很多方法可以测试给定的关系型数据库,所以我打算把Yugabyte集成到我的高性能Java持久性GitHub资源库中,并使用现有的兼容PostgreSQL的集成测试来测试它的工作情况。
正如这个提交所说明的,增加对Yugabyte的支持只是创建一个新的 YugabyteDBDataSourceProvider.
如果我使用单一的Docker数据库服务器实例,我甚至不需要添加Yugabyte特有的JDBC驱动。YugabyteDB提供了它自己的JDBC驱动,如果你想从自动平衡中获益或启用他们提供的其他很酷的功能,就需要这个驱动。
测试时间
假设我们有以下JPA实体。
@Entity(name = "Post")
@Table(name = "post")
public class Post {
@Id
@GeneratedValue
private Long id;
private String title;
@Column(name = "created_on")
private LocalDateTime createdOn;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public Post setTitle(String title) {
this.title = title;
return this;
}
public LocalDateTime getCreatedOn() {
return createdOn;
}
public Post setCreatedOn(LocalDateTime createdOn) {
this.createdOn = createdOn;
return this;
}
}
当持久化三个Post 实体时。
entityManager.persist(
new Post()
.setTitle("High-Performance Java Persistence, Part 1")
.setCreatedOn(today.minusDays(2).atStartOfDay())
);
entityManager.persist(
new Post()
.setTitle("High-Performance Java Persistence, Part 2")
.setCreatedOn(today.minusDays(1).atStartOfDay())
);
entityManager.persist(
new Post()
.setTitle("High-Performance Java Persistence, Part 3")
.setCreatedOn(today.atStartOfDay())
);
Hibernate在YugabyteDB上执行了以下INSERT语句。
INSERT INTO post (
created_on,
title,
id
)
VALUES (
'2022-09-05 00:00:00.0',
'High-Performance Java Persistence, Part 1',
1
)
INSERT INTO post (
created_on,
title,
id
)
VALUES (
'2022-09-06 00:00:00.0',
'High-Performance Java Persistence, Part 2',
2
)
INSERT INTO post (
created_on,
title,
id
)
VALUES (
'2022-09-07 00:00:00.0',
'High-Performance Java Persistence, Part 3',
3
)
而且,查询工作就像在任何关系型数据库系统上一样。
List<Post> posts = entityManager.createNativeQuery("""
SELECT *
FROM post
WHERE
created_on >= :startTimestamp and
created_on < :endTimestamp
""", Post.class)
.setParameter("startTimestamp", today.minusDays(2))
.setParameter("endTimestamp", today)
.getResultList();
assertEquals(2, posts.size());
结论
这是我第一次使用YugabyteDB,我真的印象深刻,因为它允许我重复使用很多我已经熟悉的工具。
我不需要做任何特别的事情就可以让它与JPA和Hibernate一起工作,这一点非常好,因为我可以很容易地从PostgreSQL或YugabyteDB迁移一个现有的Spring Boot项目,并从其自动扩展能力中受益。