我需要通过ssh隧道从Mysql服务器中获取数据。我在Google Dataflow上使用Apache Beam 2.19.0 Java JdbcIO连接数据库。但是由于数据库位于专用网络内部,因此我需要通过ssh隧道通过ssh服务器之间的一个服务器访问数据库。
使用apache beam jdbc IO可以实现吗?
此功能不是Apache Beam内置的,但是有几个选项。 JdbcIO使用标准的Java JDBC接口连接到数据库。在连接之前,用您自己的包装器(该包装器建立SSH隧道)重载Mysql JDBC驱动程序并不难。我在Google上进行了快速搜索,发现了一个项目,该项目使用SSHJ使用SSH隧道包装了任意JDBC驱动程序:jdbc-sshj(副本以com.cekrlic:jdbc-sshj:0.1.0的形式发布到maven)。该项目看起来有些空缺,但可以满足您的需求。将此添加到您的运行时依赖项,然后将您的配置更新为如下所示(此示例不安全):
pipeline.apply(JdbcIO.<KV<Integer, String>>read()
.withDataSourceConfiguration(JdbcIO.DataSourceConfiguration.create(
"com.cekrlic.jdbc.ssh.tunnel.SshJDriver",
"jdbc:sshj://sshbastion?remote=database:3306&username=sshuser&password=sshpassword&verify_hosts=off;;;jdbc:mysql://localhost:3306/mydb")
.username("username")
.withPassword("password"))
.withQuery("select id,name from Person")
.withCoder(KvCoder.of(BigEndianIntegerCoder.of(), StringUtf8Coder.of()))
.withRowMapper(new JdbcIO.RowMapper<KV<Integer, String>>() {
public KV<Integer, String> mapRow(ResultSet resultSet) throws Exception {
return KV.of(resultSet.getInt(1), resultSet.getString(2));
}
})
);
如果使用的是Dataflow,则可以设置GCE VM充当网关。在该VM上,使用SSH转发将数据库传送到VM的外部接口(ssh -R \*:3306:database:3306 sshbastion
),使端口在VPC内可用,然后运行数据流作业on your VPC。如果您的数据库已经在GCP中运行,则可以使用此方法在与数据库相同的VPC上运行数据流作业,并删除SSH步骤。