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