Commit Graph

32 Commits

Author SHA1 Message Date
kgasienica 5e07be785a bugfix/cannot-use-object-of-type-error-as-array-722 (#724)
Co-authored-by: Karol Gąsienica-Fronek <karol.gasienica-fronek@lppsa.com>
2021-12-01 10:18:59 -08:00
Pitchaya Boonsarngsuk 437d80a7a3 Fix misleading argument name in SentinelReplication
$this->retryWait is in milliseconds. It's setter misleadingly document it as seconds.
Fixing by renaming the argument variable name without altering the functionality.
2021-03-17 03:41:03 +00:00
Daniele Alessandri 16957f3b39 Revert support for redis-sentinel authentication.
Authentication for sentinels was implemented in v1.1.5 (commit 2e76410)
but ended up being bugged (see ISSUE #658). This is now postponed as it
requires a more thorough investigation.
2020-09-11 21:10:40 +02:00
Daniele Alessandri 2e76410e65 Support password-based authentication for sentinel instances.
Password-based authentication for sentinels has been added in Redis 5.
Predis was actively ignoring any "password" parameter for sentinels when
creating connections to them to avoid issues when this parameter is set
in the default "parameters" array passed via client options, as they are
applied to **every** connection created by Predis (see #346).

We need to find a better way to specify a common password for sentinels
to be handled in a different way than the ones for Redis nodes. For now
each sentinel node protected by password must have an explicit password
set in its parameters list even if this password, by design, is the same
for all sentinels. Since we cannot use default "parameters" as explained
above but we still need to pass a common value for all sentinels an idea
could be using a dedicated client option like we did with "service", but
we will see later.

In this commit we also explicitly reset any "username" parameter as it
would trigger an `AUTH $username $password` but sentinels do not support
ACL authentication.

Fixes #594.
2020-09-05 16:25:06 +02:00
Fabien Villepinte 94ccb2cc3b Fix PHPDoc of \Predis\Connection\Aggregate\SentinelReplication::assertConnectionRole() 2016-09-14 17:20:55 +02:00
Pascal Hofmann d92f31dc66 Don't send AUTH and/or SELECT command after connecting to sentinels 2016-06-14 17:20:08 +02:00
Daniele Alessandri a523cf7731 Use master for connect() when sentinel reports no slaves.
Fixes #342.
2016-06-13 15:51:23 +02:00
Daniele Alessandri 5a0dfc3602 Fix parameters overriding for sentinels.
Different fix than PR #339 but thanks @phofmann-trust for spotting.
2016-05-28 15:53:23 +02:00
Daniele Alessandri 9303029c13 Discard slave even when flag is "o_down". 2016-05-25 16:03:12 +02:00
Daniele Alessandri 0477499418 Fix ROLE expectation for read commands with no slaves.
This commit fixes #337.
2016-05-25 15:56:33 +02:00
Daniele Alessandri 5b3a5bbef9 Run php-cs-fixer. 2016-05-21 15:46:58 +02:00
Daniele Alessandri c1de65c4ee Swap params order in redis-sentinel constructor. 2016-05-21 15:23:24 +02:00
Daniele Alessandri f3999660fe Fix bug during assertion of connection role.
ROLE was not being sent to master when still disconnected and with an
empty slaves pool preventing the client from checking the actual role
of the server upon connect().
2016-05-19 19:06:49 +02:00
Daniele Alessandri 18e846c2ad Fix bug trying to switch to an unknown connection. 2016-05-19 17:42:51 +02:00
Daniele Alessandri 7e4800010a Add minor comment for clarity. 2016-05-19 15:59:21 +02:00
Daniele Alessandri 6b5181b030 Do not wipe server list when removing connection. 2016-05-19 12:58:07 +02:00
Daniele Alessandri 97dfba1e98 Remove useless use directive. 2016-05-16 16:57:24 +02:00
Daniele Alessandri be8ac3e205 Handle error responses returned by redis-sentinel.
Fixes #289.
2016-05-16 16:50:28 +02:00
Daniele Alessandri 0c99f9ef28 Disconnect before eventually throwing exception. 2016-05-15 15:56:16 +02:00
Daniele Alessandri 6e0743a29a Change method signature. 2016-05-15 15:53:14 +02:00
Daniele Alessandri b047e8b6a1 Rewrite the connection class for redis-sentinel.
Now we do not extend Predis\Connection\Aggregate\MasterSlaveReplication
anymore in order to obtain a more coherent implementation with the logic
of redis-sentinel and apply more optimizations by avoiding useless round
trips with sentinel servers.
2016-05-14 10:39:39 +02:00
Daniele Alessandri f8b3f18abf Implement ROLE for proper redis-sentinel support.
Once the client discovers the address of the master or a slave instance,
it must connect to that node and issue a ROLE command to verify that its
role still matches what the client got from the sentinel server.
2016-05-11 10:52:09 +02:00
Daniele Alessandri 0ec9f3351f Cap the number of retries on connection failure.
I think it is better to have a default limit to the number of attempts
when trying to send a command after a connection failure, I am just not
sure if 20 is a good value but we can adjust it later.
2016-05-10 17:36:30 +02:00
Daniele Alessandri 622e6c6ba2 Apply fixes on error responses from sentinel.
Fixes manually picked from @djagya's fork, thanks for spotting!
2016-05-10 17:09:37 +02:00
Daniele Alessandri bc212ad2b0 Update phpdoc. 2016-05-10 15:29:17 +02:00
Daniele Alessandri e896d89fa8 Merge remote-tracking branch 'github/pr/306' into v1.1-sentinel 2016-05-10 15:19:21 +02:00
Daniele Alessandri e851aaa21d Automatically assign aliases to slave connections. 2016-05-10 14:55:30 +02:00
Chris Butler eb154cd43d Replace automatic retry yes/no with a retry limit 2016-01-27 12:35:46 +00:00
Daniele Alessandri 24fb72a732 Implement ability to fetch an updated list of sentinels from active sentinel.
This can be optionally done automatically but is disabled by default, just use
SentinelReplication::setUpdateSentinels() accordingly to enable the automatic
fetching of an updated list of sentinels.
2015-08-16 20:25:42 +02:00
Daniele Alessandri 8d15503d6c Implement transparent auto-retry of commands upon server failure.
By default, when the current server dies while executing a command Predis asks
for a new configuration to one of the sentinels and re-issues the same command.

This behavior can be disabled calling SentinelReplication::setAutomaticRetry().
2015-08-16 20:25:39 +02:00
Daniele Alessandri 587fbbc446 Specify a timeout for the connect() operation to sentinel servers.
This value should be reasonably low so that the client can fallback to the next
sentinel if the connect() operation is taking too much and slowing things down.

When the connection parameters of sentinels contain a "timeout" parameter, its
value takes the precedence over the default sentinels timeout.
2015-08-16 16:28:21 +02:00
Daniele Alessandri 370d4e72c2 Add initial support for redis-sentinel.
This is a first implementation that is based on the work of @vmattila but some
more changes and missing bits are required in order to be considered complete.

To leverage redis-sentinel the client must be configured using the "aggregate"
option instead of the usual "replication" option, thought this may change for
the release of Predis v1.1.0 (it __will__ change for Predis v2.0.0 but this is
a whole different matter). This is a configuration example:

  use Predis\Connection\Aggregate\SentinelReplication;

  $sentinels = [
    'tcp://127.0.0.1:5381',
    'tcp://127.0.0.1:5382',
    'tcp://127.0.0.1:5383',
  ];

  $client = new Predis\Client($sentinels, [
    'service' => 'nrk-master',
    'aggregate' => function() {
      return function ($sentinels, $options) {
        $service = $option->service;
        $connections = $options->connections;

        return new SentinelReplication($sentinels, $service, $connections);
      };
    },
  ]);

The missing bits right now are:

  - A more solid handling of failures when querying sentinels.
  - When the connection fails while executing a command on one of the servers,
    we should query again a sentinel and then re-issue the command accordingly.
2015-08-16 16:28:13 +02:00