溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Redis高可用架構(gòu)設(shè)計(jì)的方法是什么

發(fā)布時(shí)間:2021-11-01 10:17:08 來(lái)源:億速云 閱讀:146 作者:iii 欄目:開(kāi)發(fā)技術(shù)

本篇內(nèi)容主要講解“Redis高可用架構(gòu)設(shè)計(jì)的方法是什么”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Redis高可用架構(gòu)設(shè)計(jì)的方法是什么”吧!

 一、高可用架構(gòu)設(shè)計(jì)原理

1、概述

Qunar Redis 集群是一個(gè)分布式的高可用架構(gòu),整個(gè)架構(gòu)主要由以下幾個(gè)重要部分組成:

  •  Redis Server 節(jié)點(diǎn):每個(gè)節(jié)點(diǎn)有一主一從兩個(gè)實(shí)例,多個(gè)節(jié)點(diǎn)組成一份完整的集群數(shù)據(jù),其中每個(gè)節(jié)點(diǎn)只有主庫(kù)對(duì)外提供服務(wù),從庫(kù)僅僅用于節(jié)點(diǎn)高可用、數(shù)據(jù)持久化及定時(shí)備份。

  •  Zookeeper 集群:由五個(gè) zk 節(jié)點(diǎn)組成,Redis 集群配置變更后,通知客戶(hù)端進(jìn)行重連。

  •  Redis Sentinel 集群:由五個(gè) Sentinel 節(jié)點(diǎn)組成,用于 Reids Server 節(jié)點(diǎn)的高可用,主從切換、故障轉(zhuǎn)移、配置更新等。

  •  配置中心集群:由五個(gè) MySQL 節(jié)點(diǎn)組成的 PXC 集群,用于存儲(chǔ) Redis 集群的分片信息,即每個(gè)節(jié)點(diǎn)的 Master 實(shí)例信息及分配 key 的一致性 hash 值范圍。

  •  應(yīng)用程序客戶(hù)端:監(jiān)聽(tīng) zk 變化,在配置中心獲取 Redis 實(shí)例信息進(jìn)行連接。

2、架構(gòu)原理圖

Redis高可用架構(gòu)設(shè)計(jì)的方法是什么

3、客戶(hù)端實(shí)現(xiàn)

1)當(dāng)客戶(hù)端根據(jù) Redis 集群的 namespace 建立連接時(shí),會(huì)先從 zk 中查找/config_addr 節(jié)點(diǎn), 該節(jié)點(diǎn)下存放的是配置中心集群的實(shí)例信息,從中隨機(jī)選擇一個(gè)數(shù)據(jù)庫(kù)實(shí)例進(jìn)行連接。

2)在配置中心的特定庫(kù)表中,根據(jù) Redis 的 namespace 查詢(xún)集群的節(jié)點(diǎn)的連接配置,然后建立 Redis 連接。

3)客戶(hù)端建立 Redis 連接后,會(huì)啟動(dòng)了兩個(gè)線程:

  •  一個(gè)用于監(jiān)聽(tīng) zk 的地址的變化。每個(gè) Redis 集群在 zk 中都會(huì)有一個(gè)/redis/namespace 的節(jié)點(diǎn) ,如果集群配置發(fā)生變化,哨兵會(huì)通知 zk 更新此節(jié)點(diǎn)的值,客戶(hù)端感知到 zk 配置變化, 將會(huì)去配置中心獲取新的連接配置,重新建立連接。

  •  一個(gè)用于輪詢(xún)配置中心的連接配置。為了防止 zk 通知失敗,客戶(hù)端會(huì)通過(guò)這個(gè)線程,每隔 10s 去輪詢(xún)配置中心的配置信息,如果發(fā)現(xiàn)配置中心的配置和本地緩存的不一樣,就會(huì)使用配置中心的配置建立新的連接。

客戶(hù)端與其他組件的關(guān)系示意圖如下:

Redis高可用架構(gòu)設(shè)計(jì)的方法是什么

4、數(shù)據(jù)分片方法

開(kāi)發(fā)人員提交 Redis 集群申請(qǐng)工單信息后,DBA 會(huì)依據(jù)工單中的內(nèi)存大小、QPS 大小等幾項(xiàng)主要的數(shù)據(jù),規(guī)劃集群分片節(jié)點(diǎn)數(shù)量為 N,所有節(jié)點(diǎn)平均分配 0~4294967295 范圍內(nèi)的值,即共有 2 的 32 次方個(gè) key 的值,某一個(gè) key 使用 murmurhash3 算法計(jì)算哈希值后,只會(huì)落在集群的一個(gè)節(jié)點(diǎn)上。

分片節(jié)點(diǎn)示意圖如下:

Redis高可用架構(gòu)設(shè)計(jì)的方法是什么

分片節(jié)點(diǎn)信息在配置中心的存儲(chǔ)信息如下:

Redis高可用架構(gòu)設(shè)計(jì)的方法是什么

5、架構(gòu)特點(diǎn)

Quanr Redis 高可用架構(gòu)具有以下特點(diǎn):

  •  實(shí)現(xiàn)自己的 Redis 客戶(hù)端,客戶(hù)端不再訪問(wèn) Sentinel, Sentinel 只負(fù)責(zé)高可用。

  •  通過(guò) ZK 集群和配置中心來(lái)實(shí)現(xiàn)配置的集中管理。

  •  將端口視作一種資源,即集群的一個(gè)節(jié)點(diǎn)的主從實(shí)例使用一個(gè)端口,下線的集群端口可復(fù)用。

  •  弱化了哨兵機(jī)器的地位, 降低了哨兵和集群之間直接的耦合度。

  •  減少了哨兵機(jī)器的使用量, 目前只使用了 5 臺(tái)哨兵機(jī)器組成集群。

  •  客戶(hù)端使用 namespace 訪問(wèn)集群, 將端口和 namespace 對(duì)應(yīng),namespace 和業(yè)務(wù)部門(mén)對(duì)應(yīng),方便 DBA 管理和運(yùn)維,對(duì)應(yīng)用透明。

6、架構(gòu)局限性

Quanr Redis 高可用架構(gòu)具有以下局限性:

  •  支持的客戶(hù)端比較少。目前客戶(hù)端僅支持 Java 和 Python。

  •  不支持快速水平擴(kuò)容。當(dāng)集群內(nèi)存不足時(shí)可以快速擴(kuò)大各個(gè)節(jié)點(diǎn)實(shí)例的內(nèi)存大小,以此來(lái)增加整個(gè)集群大小,但單個(gè)實(shí)例的內(nèi)存大小也有一定的限度,不能無(wú)限擴(kuò)展。當(dāng)需要增加集群節(jié)點(diǎn)個(gè)數(shù)時(shí),由于各個(gè)節(jié)點(diǎn)的一致性哈希范圍發(fā)生了變化,所有的 key 需要重新分配,對(duì)于比較大的集群,過(guò)程比較繁瑣和耗時(shí)。

  •  整個(gè)架構(gòu)依賴(lài)的組件比較多。雖然架構(gòu)中的 zookeeper、配置中心、Sentinel 等都是多節(jié)點(diǎn)的高可用集群,但依賴(lài)的組件越多,發(fā)生故障的可能性也越大,運(yùn)維難度和工作量也會(huì)隨著增加,無(wú)疑對(duì)運(yùn)維人員有更高的要求。

  •  部分 Redis 原生功能無(wú)法使用。由于客戶(hù)端的限制,部分 Redis 原生功能無(wú)法使用,如不支持事務(wù)、Lua 腳本等。

二、安全機(jī)制

Redis 被設(shè)計(jì)成僅供可信環(huán)境下的可信用戶(hù)才可以訪問(wèn),并沒(méi)有最大化的去優(yōu)化安全方面,而是盡量可能的去優(yōu)化高性能和易用性,因此 Redis 沒(méi)有類(lèi)似關(guān)系型數(shù)據(jù)庫(kù)那樣嚴(yán)格的權(quán)限控制,因此將 Redis 實(shí)例直接暴露在網(wǎng)絡(luò)上或者讓不可信的用戶(hù)直接訪問(wèn) Redis 的 TCP 端口,是非常危險(xiǎn)的行為。

為了提高 Redis 使用的安全性,去哪兒網(wǎng)使用的 Redis Server 是在官方 Redis 4.0.14 版本上進(jìn)行了部分的源代碼改造,增加了一個(gè)白名單參數(shù) trustedip,屏蔽了部分高危指令,除了 trustedip 中配置的 IP 之外,任何其他客戶(hù)端連接都無(wú)法執(zhí)行這些高危指令,同時(shí)為了提高 Redis 的性能,對(duì)主從實(shí)例進(jìn)行了差異性配置。

1、clientcipher和IP白名單

Qunar Redis 客戶(hù)端并沒(méi)有直接通過(guò) TCP 方式去連接 Redis 實(shí)例,而是首先要通過(guò)集群 namespace 和該集群唯一的 clientcipher 的驗(yàn)證,然后從配置中心獲取真正的連接信息后,才可以連接 Redis 實(shí)例。同時(shí)白名單機(jī)制對(duì)客戶(hù)端請(qǐng)求中的高危指令進(jìn)行過(guò)濾,避免對(duì)線上 Redis 執(zhí)行不合理的操作,進(jìn)一步加強(qiáng)了其安全性。

  •  客戶(hù)端使用 namespace 和 clientcipher 方式訪問(wèn)集群。

  •  不同 namespace 對(duì)應(yīng)的 clientcipher 不同,在創(chuàng)建集群時(shí)通過(guò)隨機(jī)生成的密碼再次加密生成 clientcipher。

  •  即使知道密碼,也無(wú)法使用屏蔽的危險(xiǎn)命令,除非 IP 地址在白名單中。

  •  本地登陸和 IP 白名單登陸,命令不受限制,方便 DBA 管理和兼容各種監(jiān)控統(tǒng)計(jì)腳本。

  •  IP 白名單可以動(dòng)態(tài)配置,最大支持 32 個(gè) IP 白名單。

IP 白名單功能涉及修改代碼的地方:

1)在 config.c 文件的 configGetCommand 方法中增加參數(shù) trustedip

void configGetCommand(client *c) {  robj *o = c->argv[2];  void *replylen = addDeferredMultiBulkLength(c);  char *pattern = o->ptr;  char buf[128];  int matches = 0;  serverAssertWithInfo(c,o,sdsEncodedObject(o));  ...  /* 增加trustedip參數(shù) */  if (stringmatch(pattern,"trustedip",0)) {  sds buf = sdsempty();  int j;  int numips;  numips = server.trusted_ips.numips;  for (j = 0; j < numips; j++) { buf = sdscat(buf, server.trusted_ips.ips[j]);  if (j != numips - 1)  buf = sdscatlen(buf," ",1);  }  addReplyBulkCString(c,"trustedip");  addReplyBulkCString(c,buf);  sdsfree(buf);  matches++;  }  setDeferredMultiBulkLength(c,replylen,matches*2);  }

2)在 server.c 文件的 processCommand 方法中增加對(duì) issuperclient 的認(rèn)證

typedef struct trustedIPArray {  int numips;  sds* ips;  } trustedIPArray;

3)在 networking.c 文件中增加 isTrustedIP 方法

/* 判斷客戶(hù)端IP是否在IP白名單中 */  int isTrustedIP(int fd) {  char ip[128];  int i, port;  anetPeerToString(fd,ip,128,&port); if (strcmp(ip, "127.0.0.1") == 0) {  return 1;  }  for (i = 0; i < server.trusted_ips.numips; i++) {  if (strcmp(ip, server.trusted_ips.ips[i]) == 0) {  return 1;  }  }  return 0;  }

4)在 networking.c 文件的 createClient 方法中增加 issuperclient 的設(shè)置

client *createClient(int fd) {  client *c = zmalloc(sizeof(client));  /* passing -1 as fd it is possible to create a non connected client.  * This is useful since all the commands needs to be executed  * in the context of a client. When commands are executed in other  * contexts (for instance a Lua script) we need a non connected client. */  if (fd != -1) {  anetNonBlock(NULL,fd);  anetEnableTcpNoDelay(NULL,fd);  if (server.tcpkeepalive)  anetKeepAlive(NULL,fd,server.tcpkeepalive);  if (aeCreateFileEvent(server.el,fd,AE_READABLE,  readQueryFromClient, c) == AE_ERR)  {  close(fd);  zfree(c);  return NULL;  }  ...  /* 設(shè)置is_super_client */  if (isTrustedIP(fd)) {  c->is_super_client = 1;  } else {  c->is_super_client = 0;  }  ...  return c;  }

5)在 server.c 文件的 processCommand 方法中增加對(duì) issuperclient 的認(rèn)證

int processCommand(client *c) {  /* The QUIT command is handled separately. Normal command procs will  * go through checking for replication and QUIT will cause trouble  * when FORCE_REPLICATION is enabled and would be implemented in  * a regular command proc. */ if (!strcasecmp(c->argv[0]->ptr,"quit")) {  addReply(c,shared.ok);  c->flags |= CLIENT_CLOSE_AFTER_REPLY;  return C_ERR;  }  ...  /* Check if the user is authenticated */  /* 增加is_super_client認(rèn)證 */  if (!c->is_super_client && server.requirepass && !c->authenticated && c->cmd->proc != authCommand)  ...  return C_OK;  }

6)在 db.c 文件中增加 checkCommandBeforeExec 方法

/* 如果是super client或者是master,返回1,否則返回0  * 因?yàn)樵趍aster-slave下,master(client)需要向slave執(zhí)行危險(xiǎn)命令*/  int checkCommandBeforeExec(client *c) {  if (c->is_super_client || (server.masterhost && (c->flags & CLIENT_MASTER))) {  return 1;  }  addReplyError(c,"No permission to execute this command");  return 0;  }

2、屏蔽高危指令

通過(guò)修改 Redis 源代碼,在 Server 端屏蔽部分危險(xiǎn)指令,規(guī)定只有通過(guò)白名單檢查的客戶(hù)端連接才可以執(zhí)行這些指令。在執(zhí)行高危指令前進(jìn)行檢查,如需對(duì) save 指令進(jìn)行屏蔽,可對(duì) rdb.c 文件的 saveCommand 方法的第一行增加 checkCommandBeforeExec 檢查。

void saveCommand(client *c) {  if (!checkCommandBeforeExec(c)) return; /* 執(zhí)行指令之前進(jìn)行檢查,如不通過(guò)直接返回 */   if (server.rdb_child_pid != -1) {  addReplyError(c,"Background save already in progress");  return;  }  rdbSaveInfo rsi, *rsiptr;  rsiptr = rdbPopulateSaveInfo(&rsi);  if (rdbSave(server.rdb_filename,rsiptr) == C_OK) { addReply(c,shared.ok);  } else {  addReply(c,shared.err);  }  }

屏蔽的高危指令有:

  •  比較耗時(shí)類(lèi)指令:info、keys *。

  •  清空數(shù)據(jù)類(lèi)指令:shutdown、flushdb、 flushall。

  •  數(shù)據(jù)持久化類(lèi)指令:save、bgsave、bgrewriteaof。

  •  配置類(lèi)指令:config get、config set、config rewrite。

  •  運(yùn)維管理類(lèi)指令:slaveof、monitor、client list、client kill。

在 Redis 源代碼涉及這些指令的地方,都需要加上 checkCommandBeforeExec 方法進(jìn)行檢查。

3、配置優(yōu)化

針對(duì)集群各個(gè)節(jié)點(diǎn)的主從實(shí)例進(jìn)行差異化配置,由于每個(gè)節(jié)點(diǎn)只有主庫(kù)對(duì)外提供服務(wù),為了最大限度的提高主庫(kù)的并發(fā)能力,一些比較耗時(shí)的操作可以放到從庫(kù)去執(zhí)行。

幾項(xiàng)主要的配置如下:

  •  主庫(kù)關(guān)閉 bgsave、bgrewriteaof 功能。

  •  從庫(kù)開(kāi)啟 aof 功能,定時(shí)調(diào)度重寫(xiě) aof 文件,釋放服務(wù)器磁盤(pán)空間。

  •  從庫(kù)定時(shí)執(zhí)行 bgsave 操作,備份 rdb 文件。

  •  從庫(kù)開(kāi)啟 slave-read-only 參數(shù),只讀。

當(dāng) Redis 集群部署完之后,會(huì)有定時(shí)任務(wù)去檢查服務(wù)器上各個(gè) Redis 實(shí)例的角色,根據(jù)角色的不同修改相關(guān)的配置參數(shù),同時(shí)將修改后的持久化到配置文件。

三、自動(dòng)化運(yùn)維

1、初始化系統(tǒng)環(huán)境

在 Redis 服務(wù)器上部署集群之前,首先需要初始化系統(tǒng)環(huán)境,將這些環(huán)境配置添加到 Redis 的 rpm 打包程序的 spec 文件中,安裝 Redis 軟件包時(shí)會(huì)自動(dòng)更改相關(guān)配置,主要的系統(tǒng)環(huán)境參數(shù)有以下幾個(gè):

sed -i -r '/vm.overcommit_memory.*/d' /etc/sysctl.conf  sed -i -r '/vm.swappiness.*/d' /etc/sysctl.conf  sed -i -r '/vm.dirty_bytes.*/d' /etc/sysctl.conf  echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf  echo "vm.swappiness = 0" >> /etc/sysctl.conf  echo "vm.dirty_bytes = 33554432" >> /etc/sysctl.conf  /sbin/sysctl -q -p /etc/sysctl.conf  groupadd redis >/dev/null 2>&1 || true  useradd -M -g redis redis -s /sbin/nologin >/dev/null 2>&1 || true  sed -i -r '/redis soft nofile.*/d' /etc/security/limits.conf  sed -i -r '/redis hard nofile.*/d' /etc/security/limits.conf  echo "redis soft nofile 288000" >> /etc/security/limits.conf  echo "redis hard nofile 288000" >> /etc/security/limits.conf  sed -i -r '/redis soft nproc.*/d' /etc/security/limits.conf  sed -i -r '/redis hard nproc.*/d' /etc/security/limits.conf  echo "redis soft nproc unlimited" >> /etc/security/limits.conf  echo "redis hard nproc unlimited" >> /etc/security/limits.conf  echo never > /sys/kernel/mm/transparent_hugepage/enabled

2、統(tǒng)一運(yùn)維管理工具

Qunar Redis 集群的統(tǒng)一管理套件,封裝了系統(tǒng)環(huán)境初始化、實(shí)例安裝、實(shí)例啟動(dòng)、實(shí)例關(guān)閉、監(jiān)控報(bào)警、定時(shí)任務(wù)等腳本,實(shí)現(xiàn)了監(jiān)控、統(tǒng)計(jì)、注冊(cè)等自動(dòng)化操作。

/etc/cron.d/appendonly_switch  /etc/cron.d/auto_upgrade_toolkit  /etc/cron.d/bgrewriteaof  /etc/cron.d/check_maxmemory  /etc/cron.d/dump_rdb_keys  /etc/cron.d/rdb_backup  /etc/profile.d/q_redis_path.sh  /xxx/collectd/etc/collectd.d/collect_redis.conf  /xxx/collectd/lib/collectd/collect_redis.py  /xxx/collectd/share/collectd/types_redis.db  /xxx/nrpe/libexec/q-check-redis-cpu-usage  /xxx/nrpe/libexec/q-check-redis-latency  /xxx/nrpe/libexec/q-check-redis-memory-usage  /xxx/nrpe/libexec/q-check-zookeeper-ruok  /xxx/redis/tools/cron_appendonly_switch.sh  /xxx/redis/tools/cron_bgrewrite_aof.sh  /xxx/redis/tools/cron_check_maxmemory.sh  /xxx/redis/tools/cron_dump_rdb_keys.sh  /xxx/redis/tools/cron_rdb_backup.sh  /xxx/redis/tools/dump_rdb_keys.py  /xxx/redis/tools/redis-cli5  /xxx/redis/tools/redis-latency  /xxx/redis/tools/redis_install.sh  /xxx/redis/tools/redis_start.sh  /xxx/redis/tools/redis_stop.sh

3、單機(jī)多實(shí)例多版本部署

Qunar Redis 的安裝工具包支持單機(jī)多實(shí)例安裝,安裝腳本提供選項(xiàng)和配置文件模板,可以自定義安裝不同版本的 Redis,目前支持的 Redis Server 版本有 2.8.6、3.0.7 以及 4.0.14。

/* 安裝包及Redis實(shí)例目錄結(jié)構(gòu) */  .  ├── multi  │ ├── server_2800 /* Redis2.8.6軟件包 */  │ │ ├── bin  │ │ └── utils  │ ├── server_3000 /* Redis3.0.7軟件包 */  │ │ ├── bin  │ │ └── utils  │ └── server_4000 /* Redis4.0.14軟件包 */  │ ├── bin  │ └── utils  ├── redis10088 /* 端口為10088的Redis實(shí)例數(shù)據(jù)目錄,用于存放該實(shí)例的配置文件、日志、AOF文件及RDB文件 */  │ ├── bin  │ └── utils  ├── redis10803 /* 端口為10803的Redis實(shí)例數(shù)據(jù)目錄,用于存放該實(shí)例的配置文件、日志、AOF文件及RDB文件 */  │ ├── bin  │ └── utils  ├── redis11459 /* 端口為11459的Redis實(shí)例數(shù)據(jù)目錄,用于存放該實(shí)例的配置文件、日志、AOF文件及RDB文件 */  │ ├── bin  │ └── utils  /* Redis實(shí)例安裝程序用法 */  Usage: redis_install.sh -P <port> -v [2.8|3.0|4.0] -p <password> -m <size>  必選參數(shù):  -P redis端口  -p redis密碼  -v 將要安裝的redis版本,強(qiáng)烈推薦4.0版本  -m redis實(shí)例允許的最大內(nèi)存大小,單位是G  可選參數(shù):  --cluster 集群模式,version>=3.0  --testenv 測(cè)試環(huán)境  example:  sudo redis_install.sh -P 6379 -v 4.0 -m 20 -p 1qaz2wsx

4、使用git管理Redis哨兵

使用 git 集中管理所有的哨兵配置,一個(gè)地方發(fā)生變更,哨兵集群的所有服務(wù)器同時(shí)拉取進(jìn)行同步更新。同時(shí)詳細(xì)的 commit log,方便跟蹤配置文件修改歷史。Qunar Redis 哨兵具有以下特點(diǎn):

  •  一套哨兵只管理一個(gè)節(jié)點(diǎn),即只對(duì)端口號(hào)相同的一組 Redis(一主一從或一主多從)實(shí)例進(jìn)行監(jiān)控和故障轉(zhuǎn)移。

  •  哨兵只負(fù)責(zé)節(jié)點(diǎn)的高可用,客戶(hù)端不需要通過(guò)哨兵來(lái)訪問(wèn) Redis 實(shí)例。

  •  哨兵配置文件使用 git 統(tǒng)一管理,配置文件以[節(jié)點(diǎn)端口號(hào)+20000]_集群 namespace.conf 方式統(tǒng)一命名,例如 30708_redis_delay_test.conf,通過(guò)集群任意一個(gè)節(jié)點(diǎn)的端口號(hào)或者 namespace 可以獲取集群全部節(jié)點(diǎn)的信息。

  •  當(dāng)哨兵監(jiān)控的節(jié)點(diǎn)發(fā)生切換時(shí),會(huì)更新配置中心對(duì)應(yīng)節(jié)點(diǎn)的主庫(kù)配置和 zookeeper 中對(duì)應(yīng)節(jié)點(diǎn)的 dataVersion,客戶(hù)端檢測(cè)到 zookeeper 的變化會(huì)去配置中心獲取節(jié)點(diǎn)最新的信息進(jìn)行重連,同時(shí)哨兵會(huì)將切換信息發(fā)送至 DBA 和運(yùn)維事件平臺(tái)。

  • 哨兵服務(wù)器的 IP 默認(rèn)都添加到 Redis 實(shí)例的白名單中,即通過(guò)哨兵服務(wù)器可以訪問(wèn)任何一個(gè) Redis 實(shí)例進(jìn)行所有的操作,所以哨兵服務(wù)器的權(quán)限必須嚴(yán)格控制,只有 DBA 才有權(quán)限登陸。

5、運(yùn)維操作平臺(tái)化

以上幾項(xiàng)規(guī)范統(tǒng)一的標(biāo)準(zhǔn)化流程,為 Qunar Redis 的整個(gè)運(yùn)維平臺(tái)化提供了有力的支撐,目前 Qunar Redis 的 90% 以上的運(yùn)維操作都實(shí)現(xiàn)了平臺(tái)自動(dòng)化,包括工單申請(qǐng)及審核、集群部署、實(shí)例遷移、集群垂直伸縮、不同維度(服務(wù)器、集群、實(shí)例)的信息查看等,下面主要介紹下 Qunar Redis 集群部署和實(shí)例遷移的實(shí)現(xiàn)過(guò)程。

集群部署

Qunar Redis 集群部署時(shí)主要有以下步驟:

1)開(kāi)發(fā)人員通過(guò)平臺(tái)提交集群申請(qǐng)工單發(fā)起流程,TL 審核完成后流程扭轉(zhuǎn)到 DBA。

2)DBA 根據(jù)申請(qǐng)工單的信息規(guī)劃集群規(guī)模,如節(jié)點(diǎn)個(gè)數(shù)、內(nèi)存大小、部署機(jī)房、Redis 版本等。

3)根據(jù)集群規(guī)劃在 Redis 集群部署頁(yè)面填寫(xiě)部署信息。

Redis高可用架構(gòu)設(shè)計(jì)的方法是什么

4)提交部署信息后平臺(tái)會(huì)自動(dòng)篩選資源空閑的服務(wù)器進(jìn)行集群部署。

Redis高可用架構(gòu)設(shè)計(jì)的方法是什么

5)集群部署完成后會(huì)在在 Qtalk 上通知 DBA,集群的 clientcipher 會(huì)通過(guò)郵件方式通知開(kāi)發(fā)人員,同時(shí)會(huì)將集群部署情況推送到公司運(yùn)維事件平臺(tái),保留操作記錄。

實(shí)例遷移

運(yùn)維過(guò)程中實(shí)例遷移主要分為兩大類(lèi):

1)部分實(shí)例遷移。當(dāng)某臺(tái)服務(wù)器的可用資源不足時(shí),將這臺(tái)機(jī)器上的部分實(shí)例遷移到其他資源比較空閑的服務(wù)器上。在頁(yè)面輸入實(shí)例的源主機(jī)和目前主機(jī),提交后會(huì)自動(dòng)生成遷移任務(wù)。

Redis高可用架構(gòu)設(shè)計(jì)的方法是什么

2)整機(jī)實(shí)例遷移。主要是替換過(guò)保服務(wù)器或者服務(wù)器需要停機(jī)維護(hù)時(shí),將該機(jī)器上的所有實(shí)例自動(dòng)遷移到其他資源比較空間的服務(wù)器上。在頁(yè)面輸入需要遷移的主機(jī)名,提交后會(huì)自動(dòng)生成遷移任務(wù)。

Redis高可用架構(gòu)設(shè)計(jì)的方法是什么

遷移任務(wù)開(kāi)始后,整個(gè)遷移過(guò)程無(wú)須人工介入,會(huì)自動(dòng)更新執(zhí)行進(jìn)度并輸出日志。

Redis高可用架構(gòu)設(shè)計(jì)的方法是什么

到此,相信大家對(duì)“Redis高可用架構(gòu)設(shè)計(jì)的方法是什么”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI