Preview: Managed Upstash Redis with read replica support

We just switched on Managed Upstash Redis, a private, Redis compatible database, via our partnership with the admirable team at Upstash. You can deploy Upstash Redis today in any Fly region, both as a primary and a read-only replica. Give it a try with:

flyctl redis create

We want your feedback!

A Few Interesting Details

Upstash Redis on Fly is different than some other Redis offerings you’ll find in the wild. Check all the details in the docs. Briefly:

Your database is not exposed to the public internet! Each database is deployed on Fly infrastructure. It’s visible to your entire Fly organization via a private IPv6 address that routes traffic to the geographically nearest replica (or primary).

When using read replicas, you can use a single connection URL for all your app instances. Writes are automatically forwarded by Upstash Redis to the primary.

Upstash Redis is compatible with the Redis API, but isn’t stock Redis. Check their docs for details on supported commands.

Managed Services on Fly

We’re trying something new at Fly. Customers want managed services. But running managed services is a whole business in itself. And using internet-exposed services on other platforms, from Fly apps, has its downsides: potential latency in distant regions, exposure to attacks, and so on.

A happy middle path: providers provision services on Fly, for Fly customers. We’ve been working on plumbing to make this happen, like the Machines API and Flycast private load balancing. This gives providers just enough power to tightly control their deployments, and to expose their services to customers in a simple, secure fashion (and vice-versa).

Your feedback will help us figure out how upcoming integrations will work.

Thanks for your time.

13 Likes

This looks pretty cool! I took a look at it and was wondering if you’re able to provide a bit of information on how things work.

Does this mean that the servers/fly machines are inside the provider organisation? Or are they in the customer organisation but hidden?

If the servers are inside the provider organisation, does this mean that you have cross-organisation private networking? I see you mention the flycast private loadbalancing but currently this doesn’t work cross-organisation AFAIK.

I also noticed that the domain upstash.io is used for the redis urls. This domain isn’t queryable publicly, only inside fly. Is this a private/internal custom DNS feature that’s currently hidden or is this custom functionality only for upstash/providers?

2 Likes

I think the services from partnership should add a naming prefix to distinguish them from the services provided by fly.

When I saw fly redis create, I thought it was a fly managed service like fly postgres create.

Have been running the upstash redis for job queues, cache and session storage. All very nice and very performant! I am missing seeing “my” cache servers in the dashboard however

Hello! I created a new app and used the managed redis but I’m facing extreme latency from all commands, below is a small sample from NewRelic. I just created and pointed the URL to the created instance, maybe I missed some config?

Both the app and the primary region of Redis are the same (dfw) so I would not consider that it’s “normal” this timings.

Right now I returned to point my old Heroku instance (which has low latency as expected from Redis) while I figure it out the problem

If you have replicas in secondary regions, could you try disabling them to see if it helps? In this preview stage, we may have latency issues with larger requests, so it would be good to know their size, roughly.

Hi @jsierles , thank you for your reply. I tried removing the replicas but the latency stays the same. I’m only using Redis as cache store for a small Ruby objects (maybe around 4kb each). I think the problem is not related to the objects since I get high latency in all redis calls (even excluding get/set , in the screenshot you see connect/auth they have the same high latency). Any ideas ?

Is there a plan for the Upstash Redis offering to expose metrics like the rest of the Fly apps? I’m obsessed with metrics, so I’d love to have those available. I’ve tested and don’t seem to see any Redis metrics available from the Prometheus endpoints.

I know this is still in preview, and you probably have all kinds of exciting stuff planned, but am curious mainly for my knowledge as I decide whether to adopt the service.

Ideally, the metrics for the following would be available:

  • records
  • data usage
  • connections
  • operations

The above would be especially useful when trying to select a plan once we get some use out of the service.

1 Like

This looks neat.

Per docs:

If you’re using Redis as a fast, region-local cache, setup separate databases per-region and enable object eviction.

Matches my usecase.

Pricing wise… does that mean, if I setup one 100MB Fly Redis in each Fly region, I can issue 10K commands (per day) for free to all of those?

I was wondering why not KeyDB, and it looks like they have been snapped up (acquired) by a bigco.

I love the idea of having these kinds of services managed. Maybe MySQL, PostgreSQL, Elasticsearch cloud or Meilisearch could be next, as to not have to worry about managing them. neon.tech, planetscale, etc.

1 Like

We can take a look. Could you start a new post/thread for tracking this issue, with all the details you posted so far? Thanks.

Yes, we’ll be exposing metrics from Upstash, which should include these values and more.

Yes, you’d get 10k free commands per day for each instance.

KeyDB is pretty cool, but in this case we were looking for a fully managed, Redis-compatible service. Upstash fit the bill, given they already designed their product for - and are planning features for - multi-region support.

FWIW, we did try KeyDB, but it fell over quickly in a multiregion setup. This is why we want managed services:we can focus on making the underlying platform great, while passing the great work others have done on to you :smiley:

1 Like

This looks great !

I am trying to set up a database on a Remix App. I can’t figured out how to properly instantiate my redis client (using @upstash/redis) with env variable for URL and TOKEN of the database

Thank you for your help

Best regards

You won’t need to use that redis client, which is based on HTTP. Upstash Redis on Fly is deployed inside the Fly network and is available over TCP. Try using a client like ioredis, with ipv6 enabled, as mentioned in this thread.

Thank you for your reply.

I switch to ioredis. The configuration was tricky but I endup with a redis path looking like that

redis://username:passord@[ipv6]:6379

The IPv6 can be found when connecting locally with fly redis connect or with fly dig .upstash.io

The private url (with the app name) was not working when using the ip and port was

Best regards

1 Like