Redis基礎:主從模式的優點和缺點

上篇文章使用容器化的方式構建了一個一主兩叢的Redis服務,這篇文章繼續在此基礎之上確認一下相應的優點和缺點。

環境構建

詳細可參看:https://liumiaocn.blog.csdn.net/article/details/106582498
使用一個docker-compose.yml即可拉起一主兩叢的Redis,詳細如下所示:

liumiaocn:redis liumiao$ cat docker-compose.yml
version: '2'
services:
  # redis master
  master:
    image: redis:6.0.4
    container_name: redis-master
    restart: always
    command: redis-server --port 6379 --requirepass liumiaocn@server  --appendonly yes
    ports:
      - 6379:6379
    volumes:
      - ./data:/data

  # redis slave 1 
  slave1:
    image: redis:6.0.4
    container_name: redis-slave-1
    restart: always
    command: redis-server --slaveof 192.168.31.242 6379 --port 6380 --requirepass liumiaocn@server --masterauth liumiaocn@server  --appendonly yes
    ports:
      - 6380:6380
    volumes:
      - ./data:/data

  # redis slave 2 
  slave2:
    image: redis:6.0.4
    container_name: redis-slave-2
    restart: always
    command: redis-server --slaveof 192.168.31.242 6379 --port 6381 --requirepass liumiaocn@server --masterauth liumiaocn@server  --appendonly yes
    ports:
      - 6381:6381
    volumes:
      - ./data:/data
liumiaocn:redis liumiao$ 
liumiaocn:redis liumiao$ docker-compose up -d
Creating network "redis_default" with the default driver
Creating redis-master  ... done
Creating redis-slave-2 ... done
Creating redis-slave-1 ... done
liumiaocn:redis liumiao$ docker-compose ps
    Name                   Command               State                Ports              
-----------------------------------------------------------------------------------------
redis-master    docker-entrypoint.sh redis ...   Up      0.0.0.0:6379->6379/tcp          
redis-slave-1   docker-entrypoint.sh redis ...   Up      6379/tcp, 0.0.0.0:6380->6380/tcp
redis-slave-2   docker-entrypoint.sh redis ...   Up      6379/tcp, 0.0.0.0:6381->6381/tcp
liumiaocn:redis liumiao$

優點:主寫,從讀,降低讀的壓力

liumiaocn:redis liumiao$ redis-cli -p 6379
127.0.0.1:6379> auth liumiaocn@server
OK
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set greeting "hello liumiao"
OK
127.0.0.1:6379> get greeting
"hello liumiao"
127.0.0.1:6379> keys *
1) "greeting"
127.0.0.1:6379> 
127.0.0.1:6379> exit
liumiaocn:redis liumiao$

Master寫,Slave可讀

liumiaocn:redis liumiao$ redis-cli -p 6380
127.0.0.1:6380> auth liumiaocn@server
OK
127.0.0.1:6380> keys *
1) "greeting"
127.0.0.1:6380> get greeting
"hello liumiao"
127.0.0.1:6380>
liumiaocn:redis liumiao$ redis-cli -p 6381
127.0.0.1:6381> auth liumiaocn@server
OK
127.0.0.1:6381> keys *
1) "greeting"
127.0.0.1:6381> get greeting
"hello liumiao"
127.0.0.1:6381> 

缺點:Master的寫的壓力難以降低

從節點無法進行寫操作

liumiaocn:redis liumiao$ redis-cli -p 6380
127.0.0.1:6380> auth liumiaocn@server
OK
127.0.0.1:6380> set name "liumiao"
(error) READONLY You can't write against a read only replica.
127.0.0.1:6380> 

注:雖然也可設定使得slave可寫,但在數據的同步等方面使用上都有很多問題。主從模式最爲常見的場景就是主寫從讀的模式,讀寫分離,降低讀的壓力。

優點:從節點宕機,影響較小

事前確認

liumiaocn:redis liumiao$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                              NAMES
19ed07e594b2        redis:6.0.4         "docker-entrypoint.s…"   8 minutes ago       Up 8 minutes        6379/tcp, 0.0.0.0:6381->6381/tcp   redis-slave-2
66e84b66542e        redis:6.0.4         "docker-entrypoint.s…"   8 minutes ago       Up 8 minutes        0.0.0.0:6379->6379/tcp             redis-master
e1bc030fc87d        redis:6.0.4         "docker-entrypoint.s…"   8 minutes ago       Up 8 minutes        6379/tcp, 0.0.0.0:6380->6380/tcp   redis-slave-1
liumiaocn:redis liumiao$ redis-cli -p 6380
127.0.0.1:6380> auth liumiaocn@server
OK
127.0.0.1:6380> keys *
1) "greeting"
127.0.0.1:6380> 
127.0.0.1:6380> exit
liumiaocn:redis liumiao$

模擬slave1宕機

liumiaocn:redis liumiao$ docker stop redis-slave-1
redis-slave-1
liumiaocn:redis liumiao$ 
liumiaocn:redis liumiao$ redis-cli -p 6380
Could not connect to Redis at 127.0.0.1:6380: Connection refused
not connected> exit
liumiaocn:redis liumiao$ 

剩餘一主一從仍可使用

liumiaocn:redis liumiao$ redis-cli -p 6379
127.0.0.1:6379> auth liumiaocn@server
OK
127.0.0.1:6379> keys *
1) "greeting"
127.0.0.1:6379> set version 0.1
OK
127.0.0.1:6379> keys *
1) "version"
2) "greeting"
127.0.0.1:6379> exit
liumiaocn:redis liumiao$ 
liumiaocn:redis liumiao$ redis-cli -p 6381
127.0.0.1:6381> auth liumiaocn@server
OK
127.0.0.1:6381> keys *
1) "greeting"
2) "version"
127.0.0.1:6381> exit
liumiaocn:redis liumiao$ 

啓動slave1後即可繼續使用

liumiaocn:redis liumiao$ docker start redis-slave-1
redis-slave-1
liumiaocn:redis liumiao$ 
liumiaocn:redis liumiao$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                              NAMES
19ed07e594b2        redis:6.0.4         "docker-entrypoint.s…"   11 minutes ago      Up 11 minutes       6379/tcp, 0.0.0.0:6381->6381/tcp   redis-slave-2
66e84b66542e        redis:6.0.4         "docker-entrypoint.s…"   11 minutes ago      Up 11 minutes       0.0.0.0:6379->6379/tcp             redis-master
e1bc030fc87d        redis:6.0.4         "docker-entrypoint.s…"   11 minutes ago      Up 2 seconds        6379/tcp, 0.0.0.0:6380->6380/tcp   redis-slave-1
liumiaocn:redis liumiao$ 

啓動後,在宕機期間更新的數據也已經同步

liumiaocn:redis liumiao$ redis-cli -p 6380
127.0.0.1:6380> auth liumiaocn@server
OK
127.0.0.1:6380> keys *
1) "greeting"
2) "version"
127.0.0.1:6380> get version
"0.1"
127.0.0.1:6380> exit
liumiaocn:redis liumiao$

缺點:主節點宕機,無法繼續使用

liumiaocn:redis liumiao$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                              NAMES
19ed07e594b2        redis:6.0.4         "docker-entrypoint.s…"   13 minutes ago      Up 13 minutes       6379/tcp, 0.0.0.0:6381->6381/tcp   redis-slave-2
66e84b66542e        redis:6.0.4         "docker-entrypoint.s…"   13 minutes ago      Up 13 minutes       0.0.0.0:6379->6379/tcp             redis-master
e1bc030fc87d        redis:6.0.4         "docker-entrypoint.s…"   13 minutes ago      Up About a minute   6379/tcp, 0.0.0.0:6380->6380/tcp   redis-slave-1
liumiaocn:redis liumiao$ docker stop redis-master
redis-master
liumiaocn:redis liumiao$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                              NAMES
19ed07e594b2        redis:6.0.4         "docker-entrypoint.s…"   13 minutes ago      Up 13 minutes       6379/tcp, 0.0.0.0:6381->6381/tcp   redis-slave-2
e1bc030fc87d        redis:6.0.4         "docker-entrypoint.s…"   13 minutes ago      Up About a minute   6379/tcp, 0.0.0.0:6380->6380/tcp   redis-slave-1
liumiaocn:redis liumiao$ 

只能連接從節點進行讀操作,無法執行寫操作,需要進行手工干預

liumiaocn:redis liumiao$ redis-cli -p 6380
127.0.0.1:6380> auth liumiaocn@server
OK
127.0.0.1:6380> keys *
1) "greeting"
2) "version"
127.0.0.1:6380> 
127.0.0.1:6380> set name "liumiao"
(error) READONLY You can't write against a read only replica.
127.0.0.1:6380> 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章