Skip to content

Instantly share code, notes, and snippets.

@diyan
Last active July 9, 2020 19:40
Show Gist options
  • Save diyan/e31565b48e15bd9a8ef9da44d31207d0 to your computer and use it in GitHub Desktop.
Save diyan/e31565b48e15bd9a8ef9da44d31207d0 to your computer and use it in GitHub Desktop.

Revisions

  1. diyan renamed this gist Jul 9, 2020. 1 changed file with 2 additions and 2 deletions.
    Original file line number Diff line number Diff line change
    @@ -1,6 +1,6 @@
    # Redis Cluster Behavior
    # Sharded Redis Cluster Behavior

    #### Provision Redis Cluster using Docker Compose
    #### Provision Sharded Redis Cluster using Docker Compose

    ```
    $ curl -sSL https://raw.githubusercontent.com/bitnami/bitnami-docker-redis-cluster/master/docker-compose.yml > docker-compose.yml
  2. diyan revised this gist Jun 29, 2020. 1 changed file with 98 additions and 49 deletions.
    147 changes: 98 additions & 49 deletions redis_cluster_behavior.md
    Original file line number Diff line number Diff line change
    @@ -1,3 +1,5 @@
    # Redis Cluster Behavior

    #### Provision Redis Cluster using Docker Compose

    ```
    @@ -8,56 +10,41 @@ $ docker-compose up
    #### Write sample dataset
    ```
    $ docker exec -ti redis_cluster_redis-node-0_1 bash -c 'REDISCLI_AUTH=bitnami redis-cli -c'
    127.0.0.1:6379> set a 1
    -> Redirected to slot [15495] located at 172.18.0.6:6379
    OK
    172.18.0.6:6379> set b 2
    -> Redirected to slot [3300] located at 172.18.0.7:6379
    OK
    172.18.0.7:6379> set c 3
    -> Redirected to slot [7365] located at 172.18.0.3:6379
    OK
    172.18.0.3:6379> set d 4
    -> Redirected to slot [11298] located at 172.18.0.6:6379
    172.18.0.3:6379> set key1 value1
    OK
    172.18.0.6:6379> set e 5
    OK
    172.18.0.6:6379> set f 6
    -> Redirected to slot [3168] located at 172.18.0.7:6379
    172.18.0.3:6379> set key2 value2
    -> Redirected to slot [4998] located at 172.18.0.7:6379
    OK
    172.18.0.7:6379> set g 7
    -> Redirected to slot [7233] located at 172.18.0.3:6379
    172.18.0.7:6379> set key3 value3
    OK
    172.18.0.3:6379> set h 8
    -> Redirected to slot [11694] located at 172.18.0.6:6379
    172.18.0.7:6379> set key4 value4
    -> Redirected to slot [13120] located at 172.18.0.6:6379
    OK
    172.18.0.6:6379> set i 9
    172.18.0.6:6379> set key5 value5
    -> Redirected to slot [9057] located at 172.18.0.3:6379
    OK
    ```
    #### MSET will fail if keys are belongs to multiple master nodes
    ```
    $ docker exec -ti redis_cluster_redis-node-0_1 bash -c 'REDISCLI_AUTH=bitnami redis-cli -c mset a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9'
    (error) CROSSSLOT Keys in request don't hash to the same slot
    ```
    172.18.0.3:6379> set key6 value6
    -> Redirected to slot [4866] located at 172.18.0.7:6379
    OK
    #### MULTI, SET, SET, SET, EXEC will fail if keys are belongs to multiple master nodes
    ```
    $ docker exec -ti redis_cluster_redis-node-3_1 bash -c 'REDISCLI_AUTH=bitnami redis-cli -c'
    172.18.0.6:6379> multi
    172.18.0.7:6379> set key7 value7
    OK
    172.18.0.6:6379> set a 1
    QUEUED
    172.18.0.6:6379> set b 2
    -> Redirected to slot [3300] located at 172.18.0.7:6379
    172.18.0.7:6379> set key8 value8
    -> Redirected to slot [13004] located at 172.18.0.6:6379
    OK
    172.18.0.7:6379> set c 3
    -> Redirected to slot [7365] located at 172.18.0.3:6379
    172.18.0.6:6379> set key9 value9
    -> Redirected to slot [8941] located at 172.18.0.3:6379
    OK
    172.18.0.3:6379> exec
    (error) ERR EXEC without MULTI
    ```


    #### Master Nodes are 3, 4, 5. Slave Nodes are 0, 1, 2.
    ```
    $ docker exec -ti redis_cluster_redis-node-0_1 bash -c 'REDISCLI_AUTH=bitnami redis-cli -c info' | grep 'role:'
    @@ -80,21 +67,83 @@ role:master
    ```


    #### Commands that touches keys hosted at multiple slots (master nodes) always fails
    - EXISTS key1 key2
    - MGET key1 key2
    - MSET key1 value1 key2 value2
    - MSETNX key1 value1 key2 value2
    - TOUCH key1 key2
    - DEL key1 key2
    - SDIFF key1 key2
    - MULTI, GET key1, GET key2, EXEC
    ```
    $ docker exec -ti redis_cluster_redis-node-3_1 bash -c 'REDISCLI_AUTH=bitnami redis-cli -c'
    172.18.0.3:6379> exists key1
    (integer) 1
    172.18.0.3:6379> exists key1 key2
    (error) CROSSSLOT Keys in request don't hash to the same slot
    ```
    ```
    172.18.0.6:6379> mget key1
    -> Redirected to slot [9189] located at 172.18.0.3:6379
    1) "value1"
    172.18.0.6:6379> mget key1 key2
    (error) CROSSSLOT Keys in request don't hash to the same slot
    ```
    ```
    172.18.0.3:6379> mset key1 value1
    OK
    172.18.0.3:6379> mset key1 value1 key2 value2
    (error) CROSSSLOT Keys in request don't hash to the same slot
    ```
    ```
    172.18.0.6:6379> touch key1
    -> Redirected to slot [9189] located at 172.18.0.3:6379
    (integer) 1
    #### KEYS, SCAN commands return dataset only for current master. Client must repeat same command for each Master Node in a cluster.
    172.18.0.6:6379> touch key1 key2
    (error) CROSSSLOT Keys in request don't hash to the same slot
    ```
    ```
    172.18.0.3:6379> del key1
    (integer) 1
    172.18.0.3:6379> del key1 key2
    (error) CROSSSLOT Keys in request don't hash to the same slot
    ```
    ```
    172.18.0.3:6379> multi
    OK
    172.18.0.3:6379> get key1
    QUEUED
    172.18.0.3:6379> get key2
    -> Redirected to slot [4998] located at 172.18.0.7:6379
    (nil)
    172.18.0.7:6379> exec
    (error) ERR EXEC without MULTI
    ```


    #### KEYS, SCAN commands return dataset only for current master
    - Both KEYS and SCAN has the same behavior, below an example for KEYS
    - Client must repeat same command for each Master Node in a cluster
    - WARN. Developer who are no aware on this won't see an error and keep working with an incomplete dataset
    ```
    $ docker exec -ti redis_cluster_redis-node-3_1 bash -c 'REDISCLI_AUTH=bitnami redis-cli -c keys "*"'
    1) "h"
    2) "a"
    3) "e"
    4) "i"
    5) "d"
    1) "key8"
    2) "key4"
    $ docker exec -ti redis_cluster_redis-node-4_1 bash -c 'REDISCLI_AUTH=bitnami redis-cli -c keys "*"'
    1) "g"
    2) "c"
    1) "key1"
    2) "key5"
    3) "key9"
    $ docker exec -ti redis_cluster_redis-node-5_1 bash -c 'REDISCLI_AUTH=bitnami redis-cli -c keys "*"'
    1) "f"
    2) "b"
    ```
    1) "key6"
    2) "key7"
    3) "key2"
    4) "key3"
    ```
  3. diyan revised this gist Jun 29, 2020. 1 changed file with 0 additions and 2 deletions.
    2 changes: 0 additions & 2 deletions redis_cluster_behavior.md
    Original file line number Diff line number Diff line change
    @@ -3,8 +3,6 @@
    ```
    $ curl -sSL https://raw.githubusercontent.com/bitnami/bitnami-docker-redis-cluster/master/docker-compose.yml > docker-compose.yml
    $ docker-compose up
    $ docker exec -ti redis_cluster_redis-node-0_1 bash
    (container)$ REDISCLI_AUTH=bitnami redis-cli -c
    ```

    #### Write sample dataset
  4. diyan revised this gist Jun 29, 2020. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion redis_cluster_behavior.md
    Original file line number Diff line number Diff line change
    @@ -43,7 +43,7 @@ $ docker exec -ti redis_cluster_redis-node-0_1 bash -c 'REDISCLI_AUTH=bitnami re
    (error) CROSSSLOT Keys in request don't hash to the same slot
    ```

    ### MULTI, SET, SET, SET, EXEC will fail if keys are belongs to multiple master nodes
    #### MULTI, SET, SET, SET, EXEC will fail if keys are belongs to multiple master nodes
    ```
    $ docker exec -ti redis_cluster_redis-node-3_1 bash -c 'REDISCLI_AUTH=bitnami redis-cli -c'
    172.18.0.6:6379> multi
  5. diyan revised this gist Jun 29, 2020. 1 changed file with 18 additions and 1 deletion.
    19 changes: 18 additions & 1 deletion redis_cluster_behavior.md
    Original file line number Diff line number Diff line change
    @@ -37,12 +37,29 @@ OK
    OK
    ```

    #### MSET will fail in case if keys are belongs multiple master nodes
    #### MSET will fail if keys are belongs to multiple master nodes
    ```
    $ docker exec -ti redis_cluster_redis-node-0_1 bash -c 'REDISCLI_AUTH=bitnami redis-cli -c mset a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9'
    (error) CROSSSLOT Keys in request don't hash to the same slot
    ```

    ### MULTI, SET, SET, SET, EXEC will fail if keys are belongs to multiple master nodes
    ```
    $ docker exec -ti redis_cluster_redis-node-3_1 bash -c 'REDISCLI_AUTH=bitnami redis-cli -c'
    172.18.0.6:6379> multi
    OK
    172.18.0.6:6379> set a 1
    QUEUED
    172.18.0.6:6379> set b 2
    -> Redirected to slot [3300] located at 172.18.0.7:6379
    OK
    172.18.0.7:6379> set c 3
    -> Redirected to slot [7365] located at 172.18.0.3:6379
    OK
    172.18.0.3:6379> exec
    (error) ERR EXEC without MULTI
    ```

    #### Master Nodes are 3, 4, 5. Slave Nodes are 0, 1, 2.
    ```
    $ docker exec -ti redis_cluster_redis-node-0_1 bash -c 'REDISCLI_AUTH=bitnami redis-cli -c info' | grep 'role:'
  6. diyan revised this gist Jun 29, 2020. 1 changed file with 2 additions and 1 deletion.
    3 changes: 2 additions & 1 deletion redis_cluster_behavior.md
    Original file line number Diff line number Diff line change
    @@ -81,4 +81,5 @@ $ docker exec -ti redis_cluster_redis-node-4_1 bash -c 'REDISCLI_AUTH=bitnami re
    $ docker exec -ti redis_cluster_redis-node-5_1 bash -c 'REDISCLI_AUTH=bitnami redis-cli -c keys "*"'
    1) "f"
    2) "b"```
    2) "b"
    ```
  7. diyan revised this gist Jun 29, 2020. 1 changed file with 4 additions and 4 deletions.
    8 changes: 4 additions & 4 deletions redis_cluster_behavior.md
    Original file line number Diff line number Diff line change
    @@ -7,7 +7,7 @@ $ docker exec -ti redis_cluster_redis-node-0_1 bash
    (container)$ REDISCLI_AUTH=bitnami redis-cli -c
    ```

    h4. Write sample dataset
    #### Write sample dataset
    ```
    $ docker exec -ti redis_cluster_redis-node-0_1 bash -c 'REDISCLI_AUTH=bitnami redis-cli -c'
    127.0.0.1:6379> set a 1
    @@ -37,13 +37,13 @@ OK
    OK
    ```

    h4. MSET will fail in case if keys are belongs multiple master nodes
    #### MSET will fail in case if keys are belongs multiple master nodes
    ```
    $ docker exec -ti redis_cluster_redis-node-0_1 bash -c 'REDISCLI_AUTH=bitnami redis-cli -c mset a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9'
    (error) CROSSSLOT Keys in request don't hash to the same slot
    ```

    h4. Master Nodes are 3, 4, 5. Slave Nodes are 0, 1, 2.
    #### Master Nodes are 3, 4, 5. Slave Nodes are 0, 1, 2.
    ```
    $ docker exec -ti redis_cluster_redis-node-0_1 bash -c 'REDISCLI_AUTH=bitnami redis-cli -c info' | grep 'role:'
    role:slave
    @@ -66,7 +66,7 @@ role:master



    h4. KEYS, SCAN commands return dataset only for current master. Client must repeat same command for each Master Node in a cluster.
    #### KEYS, SCAN commands return dataset only for current master. Client must repeat same command for each Master Node in a cluster.
    ```
    $ docker exec -ti redis_cluster_redis-node-3_1 bash -c 'REDISCLI_AUTH=bitnami redis-cli -c keys "*"'
    1) "h"
  8. diyan revised this gist Jun 29, 2020. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion redis_cluster_behavior.md
    Original file line number Diff line number Diff line change
    @@ -1,4 +1,4 @@
    h4. Provision Redis Cluster using Docker Compose
    #### Provision Redis Cluster using Docker Compose

    ```
    $ curl -sSL https://raw.githubusercontent.com/bitnami/bitnami-docker-redis-cluster/master/docker-compose.yml > docker-compose.yml
  9. diyan created this gist Jun 29, 2020.
    84 changes: 84 additions & 0 deletions redis_cluster_behavior.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,84 @@
    h4. Provision Redis Cluster using Docker Compose

    ```
    $ curl -sSL https://raw.githubusercontent.com/bitnami/bitnami-docker-redis-cluster/master/docker-compose.yml > docker-compose.yml
    $ docker-compose up
    $ docker exec -ti redis_cluster_redis-node-0_1 bash
    (container)$ REDISCLI_AUTH=bitnami redis-cli -c
    ```

    h4. Write sample dataset
    ```
    $ docker exec -ti redis_cluster_redis-node-0_1 bash -c 'REDISCLI_AUTH=bitnami redis-cli -c'
    127.0.0.1:6379> set a 1
    -> Redirected to slot [15495] located at 172.18.0.6:6379
    OK
    172.18.0.6:6379> set b 2
    -> Redirected to slot [3300] located at 172.18.0.7:6379
    OK
    172.18.0.7:6379> set c 3
    -> Redirected to slot [7365] located at 172.18.0.3:6379
    OK
    172.18.0.3:6379> set d 4
    -> Redirected to slot [11298] located at 172.18.0.6:6379
    OK
    172.18.0.6:6379> set e 5
    OK
    172.18.0.6:6379> set f 6
    -> Redirected to slot [3168] located at 172.18.0.7:6379
    OK
    172.18.0.7:6379> set g 7
    -> Redirected to slot [7233] located at 172.18.0.3:6379
    OK
    172.18.0.3:6379> set h 8
    -> Redirected to slot [11694] located at 172.18.0.6:6379
    OK
    172.18.0.6:6379> set i 9
    OK
    ```

    h4. MSET will fail in case if keys are belongs multiple master nodes
    ```
    $ docker exec -ti redis_cluster_redis-node-0_1 bash -c 'REDISCLI_AUTH=bitnami redis-cli -c mset a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9'
    (error) CROSSSLOT Keys in request don't hash to the same slot
    ```

    h4. Master Nodes are 3, 4, 5. Slave Nodes are 0, 1, 2.
    ```
    $ docker exec -ti redis_cluster_redis-node-0_1 bash -c 'REDISCLI_AUTH=bitnami redis-cli -c info' | grep 'role:'
    role:slave
    $ docker exec -ti redis_cluster_redis-node-1_1 bash -c 'REDISCLI_AUTH=bitnami redis-cli -c info' | grep 'role:'
    role:slave
    $ docker exec -ti redis_cluster_redis-node-2_1 bash -c 'REDISCLI_AUTH=bitnami redis-cli -c info' | grep 'role:'
    role:slave
    $ docker exec -ti redis_cluster_redis-node-3_1 bash -c 'REDISCLI_AUTH=bitnami redis-cli -c info' | grep 'role:'
    role:master
    $ docker exec -ti redis_cluster_redis-node-4_1 bash -c 'REDISCLI_AUTH=bitnami redis-cli -c info' | grep 'role:'
    role:master
    $ docker exec -ti redis_cluster_redis-node-5_1 bash -c 'REDISCLI_AUTH=bitnami redis-cli -c info' | grep 'role:'
    role:master
    ```



    h4. KEYS, SCAN commands return dataset only for current master. Client must repeat same command for each Master Node in a cluster.
    ```
    $ docker exec -ti redis_cluster_redis-node-3_1 bash -c 'REDISCLI_AUTH=bitnami redis-cli -c keys "*"'
    1) "h"
    2) "a"
    3) "e"
    4) "i"
    5) "d"
    $ docker exec -ti redis_cluster_redis-node-4_1 bash -c 'REDISCLI_AUTH=bitnami redis-cli -c keys "*"'
    1) "g"
    2) "c"
    $ docker exec -ti redis_cluster_redis-node-5_1 bash -c 'REDISCLI_AUTH=bitnami redis-cli -c keys "*"'
    1) "f"
    2) "b"```