Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Redis cluster support #17982

Open
wants to merge 11 commits into
base: 5.next
Choose a base branch
from
Open

Redis cluster support #17982

wants to merge 11 commits into from

Conversation

zunnu
Copy link

@zunnu zunnu commented Oct 17, 2024

Support for Redis cluster.

I have included a test file but im not sure how to implement it to the Github actions.
To test this I have used a docker-compose file and I will put it as a comment to this PR.

@zunnu
Copy link
Author

zunnu commented Oct 17, 2024

docker-compose.yml

services:
  php:
    build:
      context: .
      args:
        PHP_MODE: production
    restart: unless-stopped
    volumes:
      - ./:/var/www/html
    depends_on:
      - redis-node-0
      - redis-node-1
      - redis-node-2
      - redis-node-3
      - redis-node-4
      - redis-node-5

  redis-node-0:
    image: bitnami/redis-cluster:latest
    restart: unless-stopped
    environment:
      ALLOW_EMPTY_PASSWORD: yes
      REDIS_CLUSTER_CREATOR: yes
      REDIS_CLUSTER_REPLICAS: 1
      REDIS_NODES: redis-node-0 redis-node-1 redis-node-2 redis-node-3 redis-node-4 redis-node-5
    depends_on:
      - redis-node-1
      - redis-node-2
      - redis-node-3
      - redis-node-4
      - redis-node-5

  redis-node-1:
    image: bitnami/redis-cluster:latest
    restart: unless-stopped
    environment:
      ALLOW_EMPTY_PASSWORD: yes
      REDIS_NODES: redis-node-0 redis-node-1 redis-node-2 redis-node-3 redis-node-4 redis-node-5

  redis-node-2:
    image: bitnami/redis-cluster:latest
    restart: unless-stopped
    environment:
      ALLOW_EMPTY_PASSWORD: yes
      REDIS_NODES: redis-node-0 redis-node-1 redis-node-2 redis-node-3 redis-node-4 redis-node-5

  redis-node-3:
    image: bitnami/redis-cluster:latest
    restart: unless-stopped
    environment:
      ALLOW_EMPTY_PASSWORD: yes
      REDIS_NODES: redis-node-0 redis-node-1 redis-node-2 redis-node-3 redis-node-4 redis-node-5

  redis-node-4:
    image: bitnami/redis-cluster:latest
    restart: unless-stopped
    environment:
      ALLOW_EMPTY_PASSWORD: yes
      REDIS_NODES: redis-node-0 redis-node-1 redis-node-2 redis-node-3 redis-node-4 redis-node-5

  redis-node-5:
    image: bitnami/redis-cluster:latest
    restart: unless-stopped
    environment:
      ALLOW_EMPTY_PASSWORD: yes
      REDIS_NODES: redis-node-0 redis-node-1 redis-node-2 redis-node-3 redis-node-4 redis-node-5

Edit:
The tests are locked to use specific ip's so the yml maybe should have ip's defined like this.

    networks:
      redis-cluster-net:
        ipv4_address: 172.18.0.7

@dereuromark dereuromark added this to the 5.2.0 milestone Oct 17, 2024
@LordSimal
Copy link
Contributor

LordSimal commented Oct 17, 2024

You can run composer cs-fix to automatically fix the codestyle errors which are present.
To check if codestyle is green, you can do composer cs-check

For stan you need to do a composer stan-setup (you need to have phive installed) and then a composer stan to locally debug and fix the PHPStan/Psalm issues.

Certain stan issues can't be fixed easily, so it may be, that you need to regenerate the baselines for phpstan and psalm composer phpstan-baseline and psalm-baseline

zunnu and others added 2 commits October 17, 2024 17:53
Co-authored-by: Kevin Pfeifer <info@pfiff.me>
src/Cache/Engine/RedisClusterEngine.php Outdated Show resolved Hide resolved
src/Cache/Engine/RedisEngine.php Show resolved Hide resolved
src/Cache/Engine/RedisEngine.php Show resolved Hide resolved
src/Cache/Engine/RedisEngine.php Outdated Show resolved Hide resolved
src/Cache/Engine/RedisEngine.php Outdated Show resolved Hide resolved
src/Cache/Engine/RedisEngine.php Outdated Show resolved Hide resolved
src/Cache/Engine/RedisEngine.php Show resolved Hide resolved
@ADmad
Copy link
Member

ADmad commented Oct 24, 2024

I think the changes to RedisEngine seem good, need to add/update the tests now.

@zunnu
Copy link
Author

zunnu commented Oct 24, 2024

Tests have been updated. There is a separated test for RedisCluster. The main problem with the current version of that test is that it uses static ips. Im not sure how to implement RedisCluster testing to Github actions

src/Cache/Cache.php Outdated Show resolved Hide resolved
Copy link
Member

@markstory markstory left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking good. I left a few comments on test coverage.

Comment on lines +60 to +66
* - `nodes` URL or IP addresses of the Redis cluster nodes.
* Format: an array of strings in the form `<ip>:<port>`, like:
* [
* '<ip>:<port>',
* '<ip>:<port>',
* '<ip>:<port>',
* ]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
* - `nodes` URL or IP addresses of the Redis cluster nodes.
* Format: an array of strings in the form `<ip>:<port>`, like:
* [
* '<ip>:<port>',
* '<ip>:<port>',
* '<ip>:<port>',
* ]
* - `nodes` When using redis-cluster, the URL or IP addresses of the
* Redis cluster nodes.
* Format: an array of strings in the form `<ip>:<port>`, like:
* [
* '<ip>:<port>',
* '<ip>:<port>',
* '<ip>:<port>',
* ]

}

if ($this->_Redis instanceof RedisCluster) {
foreach ($this->_Redis->_masters() as $masterNode) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should have tests for clear + RedisCluster.

$this->_Redis->setOption(Redis::OPT_SCAN, (string)Redis::SCAN_RETRY);
}

if ($this->_Redis instanceof RedisCluster) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Another place where we should have some test coverage.

Comment on lines +30 to +35
['host' => '172.18.0.7', 'port' => 6379],
['host' => '172.18.0.2', 'port' => 6379],
['host' => '172.18.0.3', 'port' => 6379],
['host' => '172.18.0.5', 'port' => 6379],
['host' => '172.18.0.4', 'port' => 6379],
['host' => '172.18.0.6', 'port' => 6379],
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need a 6 node cluster? Couldn't we make due with a 3 node cluster? No need to waste additional resources.

Comment on lines +91 to +96
'172.18.0.7:6379',
'172.18.0.2:6379',
'172.18.0.3:6379',
'172.18.0.5:6379',
'172.18.0.4:6379',
'172.18.0.6:6379',
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we use this in setup() so we don't have two lists?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants