无法从GCP数据流连接到GCP内存存储

时间:2019-07-16 07:32:06

标签: google-cloud-dataflow google-cloud-memorystore

我正在尝试使用GCP Memorystore处理在GCP Dataflow上运行的事件流作业的会话ID。尝试连接到Memorystore时,作业失败并出现超时:

redis.clients.jedis.exceptions.JedisConnectionException: Failed connecting to host 10.0.0.4:6379
    at redis.clients.jedis.Connection.connect(Connection.java:207)
    at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:101)
    at redis.clients.jedis.Connection.sendCommand(Connection.java:126)
    at redis.clients.jedis.Connection.sendCommand(Connection.java:117)
    at redis.clients.jedis.Jedis.get(Jedis.java:155)

我的Memorystore实例具有以下属性:

Version is 4.0
Authorized network is default-auto
Master is in us-central1-b. Replica is in us-central1-a.
Connection properties: IP address: 10.0.0.4, Port number: 6379 
> gcloud redis instances list --region us-central1
INSTANCE_NAME  VERSION    REGION       TIER         SIZE_GB  HOST      PORT  NETWORK       RESERVED_IP  STATUS  CREATE_TIME
memorystore    REDIS_4_0  us-central1  STANDARD_HA  1        10.0.0.4  6379  default-auto  10.0.0.0/29  READY   2019-07-15T11:43:14

我的数据流作业具有以下属性:

runner: org.apache.beam.runners.dataflow.DataflowRunner
zone: us-central1-b
network: default-auto
> gcloud dataflow jobs list   
JOB_ID                                    NAME                        TYPE       CREATION_TIME        STATE      REGION
2019-06-17_02_01_36-3308621933676080017   eventflow                   Streaming  2019-06-17 09:01:37  Running    us-central1

我的“默认”网络无法使用,因为它是旧版网络,Memorystore不接受。我无法找到将默认网络从旧版升级为自动的方法,并且不想删除现有的默认网络,因为这将使生产服务混乱。相反,我创建了一个新的类型为auto的网络“ default-auto”,其防火墙规则与默认网络相同。我认为与我的数据流工作相关的一个是:

Name: default-auto-internal
Type: Ingress
Targets: Apply to all   
Filters: IP ranges: 10.0.0.0/20
Protocols/ports: 
  tcp:0-65535
  udp:0-65535
  icmp
Action: Allow
Priority: 65534

我可以使用Compute Engine实例中的“ telnet 10.0.0.4 6379”连接到Memorystore。

我尝试过的东西,没有改变任何东西: -将Redis库从Jedis 2.9.3切换到Lettuce 5.1.7 -删除并重新创建Memorystore实例

Dataflow是否不应该能够连接到Memorystore,还是我丢失了什么?

1 个答案:

答案 0 :(得分:2)

弄清楚了。我试图通过直接从Dataflow作业的main方法调用的代码连接到Memorystore。通过在Dataflow步骤中运行的代码进行连接可以正常工作。在第二个(实际上,实际上更像是1002nd的想法),这是有道理的,因为main()在驱动程序计算机(在本例中为我的桌面)上运行,而Dataflow图的步骤将在GCP上运行。我已经通过连接到main()中localhost:6379上的Memorystore证实了这一理论。之所以有效,是因为我有一个通往在端口6379上运行的Memorystore的SSH隧道(使用this trick)。