• 关于

    云数据库redis网络类型修改

    的搜索结果

回答

您好, 云数据库 RDS 版-云服务器如何通过内网访问RDS? 云服务器公网带宽一般都是有限的。如果通过云服务器的公网网卡访问RDS,则往往会受带宽限制,导致整个系统性能很慢。 因此我们建议您通过云服务器的内网网卡访问RDS,从RDS控制台切换内网的方法如下: 1)在高安全访问模式下,支持内外网同时存在,您只需在RDS控制台单击申请内网地址即可; 2)在高性能访问模式下,只支持一种连接地址,您只需在RDS控制台单击申请内网地址,即可切换到内网地址,同时释放外网连接地址;    请注意增加内网连接后,如您的连接地址有变更,您的应用程序需要修改数据库的连接地址,并且需要重启应用程序。否则您的应用程序将无法访问RDS。 如问题还未解决,请联系售后技术支持。 相关参考:为什么 ECS 连接不上 Redis? 两者通过内网连接必须满足的条件如下: ECS 和 Redis 在相同的地域 ECS 和 Redis 在相同的网络环境,即:必须都属于经典网络或者同一个 VPC 下 ECS 内网 IP 在 Redis 白名单中 以下情况中,ECS 无法直接通过内网连接 Redis 数据库。 如果您的 ECS 和 redis 在不同地域的 VPC 中,内网是不通的。在不同地域下的 ECS 连接 Redis,目前只能通过高速通道实现跨 VPC 的内网访问,详情参见跨地域 VPC 互连。 如果您的 ECS 和 redis 属于不同的网络类型,您可以通过如下方法来解决: 如果可以接受转换为 VPC 网络类型,请参考切换为专有网络或者迁移方案概述。 如果不接受转化为 VPC,您需要重新购买同一地域下、同属经典网络的 ECS 和 Redis。

微wx笑 2019-12-01 23:47:47 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档适用场景使用数据传输DTS可以实现ECS自建数据库到RDS/MongoDB/Redis/DRDS/PetaData/OceanBase实例的数据迁移。对于支持增量迁移的存储引擎,还可以使用DTS在ECS自建数据库不停服的情况下,将数据迁移到目标实例。 本小节简单介绍使用DTS进行ECS自建数据库迁移到RDS/MongoDB/Redis/DRDS/PetaData/OceanBase等实例的数据迁移任务的配置流程。 环境准备 创建RDS实例数据库 如果目标实例为RDS实例,如果待迁移的数据库在目标RDS实例中不存在,那么DTS自动会创建。但是对于如下两种情况,用户需要在配置迁移任务之前,手动创建数据库。 数据库名称不符合:RDS定义规范(由小写字母、数字、下划线、中划线组成,字母开头,字母或数字结尾,最长64个字符)。待迁移数据库,在ECS自建数据库跟目标RDS实例中存储名称不同。 对于这两种情况,用户需要在配置迁移任务之前,先在RDS控制台完成数据库创建。具体参考RDS数据库创建流程。 创建迁移帐号 迁移任务配置时,需要提供ECS自建数据库及目的实例的迁移账号。 自建数据库的存储引擎不同,账号创建及权限授权的方式不同,具体授权方式可以参考各存储引擎的官方文档。 目的实例的迁移账号可以参考各个云产品的使用手册,进行账号创建。例如,RDS实例的迁移账号的创建流程可以参考 RDS账号创建说明。 操作步骤 以目标实例所属阿里云账号登录DTS数据传输控制台,单击右上角的创建迁移任务,开始任务配置。 设置实例连接信息。 这个步骤主要配置迁移任务名称、源ECS连接信息及目标实例连接信息。其中: 任务名称 DTS为每个任务自动生成一个任务名称,任务名称没有唯一性要求。您可以根据需要修改任务名称,建议为任务配置具有业务意义的名称,便于后续的任务识别。 源实例信息 实例类型:选择 ECS上的自建数据库ECS实例ID: 配置迁移的源ECS实例的实例ID。DTS支持经典网络、VPC网络的ECS实例。如果ECS实例跟目标实例在不同地域,那么ECS上面必须挂载公网EIP。数据库类型:选择ECS上自建数据库的数据库类型,例如Oracle/MySQL/SQLServer/PostgreSQL/Redis/MongoDB等。数据库名称: 如果自建数据库为PostgreSQL/MongoDB, 那么需要配置数据库名称。这个数据库名称为连接ECS自建数据库时使用的默认数据库。数据库账号:连接自建数据库的账号。数据库密码:上面数据账号对应的密码。 目标实例信息 实例类型: 选择要迁入的实例对应的实例类型,包括RDS/MongoDB/Redis/DRDS/PetaData/OceanBase等。实例ID: 配置迁移的目标实例的实例ID。数据库名称:如果数据库类型为PostgreSQL/PPAS/MongoDB, 那么需要配置数据库名称。这个数据库名称为连接实例时使用的默认数据库。数据库账号:连接实例的账号。数据库密码:上面数据账号对应的密码。 下图以ECS上自建MongoDB到MongoDB实例的数据迁移为例,展示配置内容。 迁移类型及迁移对象选择 迁移类型 对于不同的数据库类型,DTS 支持的迁移类型不同。 如果只需要进行全量迁移,那么迁移类型选择:结构迁移+全量数据迁移。 对于支持增量迁移的数据库类型,如果需要进行不停机迁移,迁移类型选择:结构迁移+全量数据迁移+增量数据迁移。 迁移对象 这个步骤选择要迁移的对象。迁移对象的选择粒度细化为:库、表、列三个粒度。默认情况下,对象迁移到目标实例后,对象名跟源实例一致。如果您迁移的对象在源实例跟目标实例上名称不同,那么需要使用DTS提供的对象名映射功能,详细使用方式可以参考库表列映射。 预检查。 在迁移任务正式启动之前,会先进行前置预检查,只有预检查通过后,才能成功启动迁移。 如果预检查失败,那么可以点击具体检查项后的按钮,查看具体的失败详情,并根据失败原因修复后,重新进行预检查。 启动迁移任务。 当预检查通过后,可以启动迁移任务,任务启动成功后,可以在任务列表中查看迁移的具体状态及迁移进度。 如果选择了增量迁移,那么进入增量迁移阶段后,源库的更新写入都会被DTS同步到目标实例。迁移任务不会自动结束。如果用户只是为了迁移,那么建议在增量迁移无延迟的状态时,源库停写几分钟,等待增量迁移再次进入无延迟状态后,停止掉迁移任务,直接将业务切换到目标实例上即可。 至此,完成ECS自建数据库到目标实例的数据迁移任务的配置。 说明:配置迁移任务时如果选择了增量迁移,那么增量迁移过程中,若用户不结束迁移,任务会一直处于迁移中。建议在业务验证通过且增量迁移无延迟的状态时,源库停写几分钟,等待增量迁移再次进入无延迟状态后,停止掉迁移任务,将业务切换到目标实例上即可。

2019-12-01 23:09:45 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档适用场景使用数据传输DTS可以实现ECS自建数据库到RDS/MongoDB/Redis/DRDS/PetaData/OceanBase实例的数据迁移。对于支持增量迁移的存储引擎,还可以使用DTS在ECS自建数据库不停服的情况下,将数据迁移到目标实例。 本小节简单介绍使用DTS进行ECS自建数据库迁移到RDS/MongoDB/Redis/DRDS/PetaData/OceanBase等实例的数据迁移任务的配置流程。 环境准备 创建RDS实例数据库 如果目标实例为RDS实例,如果待迁移的数据库在目标RDS实例中不存在,那么DTS自动会创建。但是对于如下两种情况,用户需要在配置迁移任务之前,手动创建数据库。 数据库名称不符合:RDS定义规范(由小写字母、数字、下划线、中划线组成,字母开头,字母或数字结尾,最长64个字符)。待迁移数据库,在ECS自建数据库跟目标RDS实例中存储名称不同。 对于这两种情况,用户需要在配置迁移任务之前,先在RDS控制台完成数据库创建。具体参考RDS数据库创建流程。 创建迁移帐号 迁移任务配置时,需要提供ECS自建数据库及目的实例的迁移账号。 自建数据库的存储引擎不同,账号创建及权限授权的方式不同,具体授权方式可以参考各存储引擎的官方文档。 目的实例的迁移账号可以参考各个云产品的使用手册,进行账号创建。例如,RDS实例的迁移账号的创建流程可以参考 RDS账号创建说明。 操作步骤 以目标实例所属阿里云账号登录DTS数据传输控制台,单击右上角的创建迁移任务,开始任务配置。 设置实例连接信息。 这个步骤主要配置迁移任务名称、源ECS连接信息及目标实例连接信息。其中: 任务名称 DTS为每个任务自动生成一个任务名称,任务名称没有唯一性要求。您可以根据需要修改任务名称,建议为任务配置具有业务意义的名称,便于后续的任务识别。 源实例信息 实例类型:选择 ECS上的自建数据库ECS实例ID: 配置迁移的源ECS实例的实例ID。DTS支持经典网络、VPC网络的ECS实例。如果ECS实例跟目标实例在不同地域,那么ECS上面必须挂载公网EIP。数据库类型:选择ECS上自建数据库的数据库类型,例如Oracle/MySQL/SQLServer/PostgreSQL/Redis/MongoDB等。数据库名称: 如果自建数据库为PostgreSQL/MongoDB, 那么需要配置数据库名称。这个数据库名称为连接ECS自建数据库时使用的默认数据库。数据库账号:连接自建数据库的账号。数据库密码:上面数据账号对应的密码。 目标实例信息 实例类型: 选择要迁入的实例对应的实例类型,包括RDS/MongoDB/Redis/DRDS/PetaData/OceanBase等。实例ID: 配置迁移的目标实例的实例ID。数据库名称:如果数据库类型为PostgreSQL/PPAS/MongoDB, 那么需要配置数据库名称。这个数据库名称为连接实例时使用的默认数据库。数据库账号:连接实例的账号。数据库密码:上面数据账号对应的密码。 下图以ECS上自建MongoDB到MongoDB实例的数据迁移为例,展示配置内容。 迁移类型及迁移对象选择 迁移类型 对于不同的数据库类型,DTS 支持的迁移类型不同。 如果只需要进行全量迁移,那么迁移类型选择:结构迁移+全量数据迁移。 对于支持增量迁移的数据库类型,如果需要进行不停机迁移,迁移类型选择:结构迁移+全量数据迁移+增量数据迁移。 迁移对象 这个步骤选择要迁移的对象。迁移对象的选择粒度细化为:库、表、列三个粒度。默认情况下,对象迁移到目标实例后,对象名跟源实例一致。如果您迁移的对象在源实例跟目标实例上名称不同,那么需要使用DTS提供的对象名映射功能,详细使用方式可以参考库表列映射。 预检查。 在迁移任务正式启动之前,会先进行前置预检查,只有预检查通过后,才能成功启动迁移。 如果预检查失败,那么可以点击具体检查项后的按钮,查看具体的失败详情,并根据失败原因修复后,重新进行预检查。 启动迁移任务。 当预检查通过后,可以启动迁移任务,任务启动成功后,可以在任务列表中查看迁移的具体状态及迁移进度。 如果选择了增量迁移,那么进入增量迁移阶段后,源库的更新写入都会被DTS同步到目标实例。迁移任务不会自动结束。如果用户只是为了迁移,那么建议在增量迁移无延迟的状态时,源库停写几分钟,等待增量迁移再次进入无延迟状态后,停止掉迁移任务,直接将业务切换到目标实例上即可。 至此,完成ECS自建数据库到目标实例的数据迁移任务的配置。 说明:配置迁移任务时如果选择了增量迁移,那么增量迁移过程中,若用户不结束迁移,任务会一直处于迁移中。建议在业务验证通过且增量迁移无延迟的状态时,源库停写几分钟,等待增量迁移再次进入无延迟状态后,停止掉迁移任务,将业务切换到目标实例上即可。

2019-12-01 23:09:45 0 浏览量 回答数 0

万券齐发助力企业上云,爆款产品低至2.2折起!

限量神券最高减1000,抢完即止!云服务器ECS新用户首购低至0.95折!

回答

详细解答可以参考官方帮助文档适用场景使用数据传输DTS可以实现ECS自建数据库到RDS/MongoDB/Redis/DRDS/PetaData/OceanBase实例的数据迁移。对于支持增量迁移的存储引擎,还可以使用DTS在ECS自建数据库不停服的情况下,将数据迁移到目标实例。 本小节简单介绍使用DTS进行ECS自建数据库迁移到RDS/MongoDB/Redis/DRDS/PetaData/OceanBase等实例的数据迁移任务的配置流程。 环境准备 创建RDS实例数据库 如果目标实例为RDS实例,如果待迁移的数据库在目标RDS实例中不存在,那么DTS自动会创建。但是对于如下两种情况,用户需要在配置迁移任务之前,手动创建数据库。 数据库名称不符合:RDS定义规范(由小写字母、数字、下划线、中划线组成,字母开头,字母或数字结尾,最长64个字符)。待迁移数据库,在ECS自建数据库跟目标RDS实例中存储名称不同。 对于这两种情况,用户需要在配置迁移任务之前,先在RDS控制台完成数据库创建。具体参考RDS数据库创建流程。 创建迁移帐号 迁移任务配置时,需要提供ECS自建数据库及目的实例的迁移账号。 自建数据库的存储引擎不同,账号创建及权限授权的方式不同,具体授权方式可以参考各存储引擎的官方文档。 目的实例的迁移账号可以参考各个云产品的使用手册,进行账号创建。例如,RDS实例的迁移账号的创建流程可以参考 RDS账号创建说明。 操作步骤 以目标实例所属阿里云账号登录DTS数据传输控制台,单击右上角的创建迁移任务,开始任务配置。 设置实例连接信息。 这个步骤主要配置迁移任务名称、源ECS连接信息及目标实例连接信息。其中: 任务名称 DTS为每个任务自动生成一个任务名称,任务名称没有唯一性要求。您可以根据需要修改任务名称,建议为任务配置具有业务意义的名称,便于后续的任务识别。 源实例信息 实例类型:选择 ECS上的自建数据库ECS实例ID: 配置迁移的源ECS实例的实例ID。DTS支持经典网络、VPC网络的ECS实例。如果ECS实例跟目标实例在不同地域,那么ECS上面必须挂载公网EIP。数据库类型:选择ECS上自建数据库的数据库类型,例如Oracle/MySQL/SQLServer/PostgreSQL/Redis/MongoDB等。数据库名称: 如果自建数据库为PostgreSQL/MongoDB, 那么需要配置数据库名称。这个数据库名称为连接ECS自建数据库时使用的默认数据库。数据库账号:连接自建数据库的账号。数据库密码:上面数据账号对应的密码。 目标实例信息 实例类型: 选择要迁入的实例对应的实例类型,包括RDS/MongoDB/Redis/DRDS/PetaData/OceanBase等。实例ID: 配置迁移的目标实例的实例ID。数据库名称:如果数据库类型为PostgreSQL/PPAS/MongoDB, 那么需要配置数据库名称。这个数据库名称为连接实例时使用的默认数据库。数据库账号:连接实例的账号。数据库密码:上面数据账号对应的密码。 下图以ECS上自建MongoDB到MongoDB实例的数据迁移为例,展示配置内容。 迁移类型及迁移对象选择 迁移类型 对于不同的数据库类型,DTS 支持的迁移类型不同。 如果只需要进行全量迁移,那么迁移类型选择:结构迁移+全量数据迁移。 对于支持增量迁移的数据库类型,如果需要进行不停机迁移,迁移类型选择:结构迁移+全量数据迁移+增量数据迁移。 迁移对象 这个步骤选择要迁移的对象。迁移对象的选择粒度细化为:库、表、列三个粒度。默认情况下,对象迁移到目标实例后,对象名跟源实例一致。如果您迁移的对象在源实例跟目标实例上名称不同,那么需要使用DTS提供的对象名映射功能,详细使用方式可以参考库表列映射。 预检查。 在迁移任务正式启动之前,会先进行前置预检查,只有预检查通过后,才能成功启动迁移。 如果预检查失败,那么可以点击具体检查项后的按钮,查看具体的失败详情,并根据失败原因修复后,重新进行预检查。 启动迁移任务。 当预检查通过后,可以启动迁移任务,任务启动成功后,可以在任务列表中查看迁移的具体状态及迁移进度。 如果选择了增量迁移,那么进入增量迁移阶段后,源库的更新写入都会被DTS同步到目标实例。迁移任务不会自动结束。如果用户只是为了迁移,那么建议在增量迁移无延迟的状态时,源库停写几分钟,等待增量迁移再次进入无延迟状态后,停止掉迁移任务,直接将业务切换到目标实例上即可。 至此,完成ECS自建数据库到目标实例的数据迁移任务的配置。 说明:配置迁移任务时如果选择了增量迁移,那么增量迁移过程中,若用户不结束迁移,任务会一直处于迁移中。建议在业务验证通过且增量迁移无延迟的状态时,源库停写几分钟,等待增量迁移再次进入无延迟状态后,停止掉迁移任务,将业务切换到目标实例上即可。

2019-12-01 23:09:45 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档适用场景使用数据传输DTS可以实现ECS自建数据库到RDS/MongoDB/Redis/DRDS/PetaData/OceanBase实例的数据迁移。对于支持增量迁移的存储引擎,还可以使用DTS在ECS自建数据库不停服的情况下,将数据迁移到目标实例。 本小节简单介绍使用DTS进行ECS自建数据库迁移到RDS/MongoDB/Redis/DRDS/PetaData/OceanBase等实例的数据迁移任务的配置流程。 环境准备 创建RDS实例数据库 如果目标实例为RDS实例,如果待迁移的数据库在目标RDS实例中不存在,那么DTS自动会创建。但是对于如下两种情况,用户需要在配置迁移任务之前,手动创建数据库。 数据库名称不符合:RDS定义规范(由小写字母、数字、下划线、中划线组成,字母开头,字母或数字结尾,最长64个字符)。待迁移数据库,在ECS自建数据库跟目标RDS实例中存储名称不同。 对于这两种情况,用户需要在配置迁移任务之前,先在RDS控制台完成数据库创建。具体参考RDS数据库创建流程。 创建迁移帐号 迁移任务配置时,需要提供ECS自建数据库及目的实例的迁移账号。 自建数据库的存储引擎不同,账号创建及权限授权的方式不同,具体授权方式可以参考各存储引擎的官方文档。 目的实例的迁移账号可以参考各个云产品的使用手册,进行账号创建。例如,RDS实例的迁移账号的创建流程可以参考 RDS账号创建说明。 操作步骤 以目标实例所属阿里云账号登录DTS数据传输控制台,单击右上角的创建迁移任务,开始任务配置。 设置实例连接信息。 这个步骤主要配置迁移任务名称、源ECS连接信息及目标实例连接信息。其中: 任务名称 DTS为每个任务自动生成一个任务名称,任务名称没有唯一性要求。您可以根据需要修改任务名称,建议为任务配置具有业务意义的名称,便于后续的任务识别。 源实例信息 实例类型:选择 ECS上的自建数据库ECS实例ID: 配置迁移的源ECS实例的实例ID。DTS支持经典网络、VPC网络的ECS实例。如果ECS实例跟目标实例在不同地域,那么ECS上面必须挂载公网EIP。数据库类型:选择ECS上自建数据库的数据库类型,例如Oracle/MySQL/SQLServer/PostgreSQL/Redis/MongoDB等。数据库名称: 如果自建数据库为PostgreSQL/MongoDB, 那么需要配置数据库名称。这个数据库名称为连接ECS自建数据库时使用的默认数据库。数据库账号:连接自建数据库的账号。数据库密码:上面数据账号对应的密码。 目标实例信息 实例类型: 选择要迁入的实例对应的实例类型,包括RDS/MongoDB/Redis/DRDS/PetaData/OceanBase等。实例ID: 配置迁移的目标实例的实例ID。数据库名称:如果数据库类型为PostgreSQL/PPAS/MongoDB, 那么需要配置数据库名称。这个数据库名称为连接实例时使用的默认数据库。数据库账号:连接实例的账号。数据库密码:上面数据账号对应的密码。 下图以ECS上自建MongoDB到MongoDB实例的数据迁移为例,展示配置内容。 迁移类型及迁移对象选择 迁移类型 对于不同的数据库类型,DTS 支持的迁移类型不同。 如果只需要进行全量迁移,那么迁移类型选择:结构迁移+全量数据迁移。 对于支持增量迁移的数据库类型,如果需要进行不停机迁移,迁移类型选择:结构迁移+全量数据迁移+增量数据迁移。 迁移对象 这个步骤选择要迁移的对象。迁移对象的选择粒度细化为:库、表、列三个粒度。默认情况下,对象迁移到目标实例后,对象名跟源实例一致。如果您迁移的对象在源实例跟目标实例上名称不同,那么需要使用DTS提供的对象名映射功能,详细使用方式可以参考库表列映射。 预检查。 在迁移任务正式启动之前,会先进行前置预检查,只有预检查通过后,才能成功启动迁移。 如果预检查失败,那么可以点击具体检查项后的按钮,查看具体的失败详情,并根据失败原因修复后,重新进行预检查。 启动迁移任务。 当预检查通过后,可以启动迁移任务,任务启动成功后,可以在任务列表中查看迁移的具体状态及迁移进度。 如果选择了增量迁移,那么进入增量迁移阶段后,源库的更新写入都会被DTS同步到目标实例。迁移任务不会自动结束。如果用户只是为了迁移,那么建议在增量迁移无延迟的状态时,源库停写几分钟,等待增量迁移再次进入无延迟状态后,停止掉迁移任务,直接将业务切换到目标实例上即可。 至此,完成ECS自建数据库到目标实例的数据迁移任务的配置。 说明:配置迁移任务时如果选择了增量迁移,那么增量迁移过程中,若用户不结束迁移,任务会一直处于迁移中。建议在业务验证通过且增量迁移无延迟的状态时,源库停写几分钟,等待增量迁移再次进入无延迟状态后,停止掉迁移任务,将业务切换到目标实例上即可。

2019-12-01 23:09:45 0 浏览量 回答数 0

问题

什么是Redis 管理控制台

云栖大讲堂 2019-12-01 21:19:31 1313 浏览量 回答数 0

回答

转自:阿飞的博客 一、数据库技术选型的思考维度 我们做选型的时候首先要问: 谁选型?是负责采购的同学、 DBA 还是业务研发? 如果选型的是采购的同学,他们更注重成本,包括存储方式、网络需求等。 如果选型的是 DBA 同学,他们关心的: ① 运维成本 首先是运维成本,包括监控告警是否完善、是否有备份恢复机制、升级和迁移的成本是否高、社区是否稳定、是否方便调优、排障是否简易等; ② 稳定性 其次,DBA会关注稳定性,包括是否支持数据多副本、服务高可用、多写多活等; ③ 性能 第三是性能,包括延迟、QPS 以及是否支持更高级的分级存储功能等; ④ 拓展性 第四是扩展性,如果业务的需求不确定,是否容易横向扩展和纵向扩容; ⑤ 安全 最后是安全,需要符合审计要求,不容易出现 SQL 注入或拖库情况。 ⑥ 其他 除了采购和 DBA之外,后台应用研发的同学同样会关注稳定性、性能、扩展性等问题,同时也非常关注数据库接口是否便于开发,是否便于修改数据库 schema 等问题。 接下来我们来看一下爱奇艺使用的数据库类型: MySQL,互联网业务必备系统; TiDB,爱奇艺的 TiDB 实践会有另外的具体介绍; Redis,KV 数据库,互联网公司标配; Couchbase,这个在爱奇艺用得比较多,但国内互联网公司用得比较少,接下来的部分会详细说明; 其他,比如 MongoDB、图数据库、自研 KV 数据库 HiKV 等; 大数据分析相关系统,比如 Hive、Impala 等等。 可以看到爱奇艺的数据库种类还是很多的,这会造成业务开发的同学可能不太清楚在他的业务场景下应该选用哪种数据库系统。 那么,我们先对这些数据库按照接口(SQL、NoSQL)和面向的业务场景(OLTP、OLAP)这两位维度进行一个简单非严谨的分类。 下图中,左上角是面向 OLTP、支持 SQL 的这样一类系统,例如 MySQL,一般支持事务不同的隔离级别, QPS 要求比较高,延时比较低,主要用于交易信息和关键数据的存储,比如订单、VIP 信息等。 左下角是 NoSQL 数据库,是一类针对特殊场景做优化的系统,schema 一般比较简单,吞吐量较高、延迟较低,一般用作缓存或者 KV 数据库。 整个右侧都是 OLAP 的大数据分析系统,包括 Clickhouse、Impala等,一般支持SQL、不支持事务,扩展性比较好,可以通过加机器增加数据的存储量,响应延迟较长。 还有一类数据库是比较中立的,在数据量比较小的时候性能比较好,在数据量较大或复杂查询的时候性能也不差,一般通过不同的存储引擎和查询引擎来满足不同的业务需求,我们把它叫做 HTAP,TiDB 就是这样一种数据库。 二、iQIYI对数据库的优化与完善 前面我们提到了很多种的数据库,那么接下来就和大家介绍一下在爱奇艺我们是怎么使用这些数据库的。 1、MySQL在爱奇艺的使用 ① MySQL 首先是 MySQL。MySQL 基本使用方式是 master-slave + 半同步,支持每周全备+每日增量备份。我们做了一些基本功能的增强,首先是增强了数据恢复工具 Xtrabackup 的性能。 之前遇到一个情况,我们有一个全量库是 300G 数据,增量库每天 70G 数据,总数据量 700G 左右。我们当时只需要恢复一个表的数据,但该工具不支持单表恢复,且整库恢复需要 5 个小时。 针对这个情况我们具体排查了原因,发现在数据恢复的过程中需要进行多次写盘的 IO 操作并且有很多串行操作,所以我们做了一些优化。例如删减过程中的一些写盘操作,减少落盘并将数据处理并行化,优化后整库恢复耗时减少到 100 分钟,而且可以直接恢复单表数据。 然后是适配 DDL 和 DML 工具到内部系统,gh-ostt 和 oak-online-alter-table 在数据量大的时候会造成 master-slave 延时,所以我们在使用工具的时候也增加了延时上的考虑,实时探测Master-Slave 库之间延时的情况,如果延时较大会暂停工具的使用,恢复到正常水平再继续。 ② MySQL高可用 第二是 MySQL 高可用。Master-slave 加上半同步这种高可用方式不太完善,所以我们参照了 MHA 并进行了改动,采用 master + agent 的方式。Agent 在每一个物理机上部署,可以监控这个物理机上的所有实例的状态,周期性地向 master 发送心跳,Master 会实时监测各个Agent的状态。 如果 MySQL故障,会启动 Binlog 补偿机制,并切换访问域名完成 failover。考虑到数据库跨机房跨地区部署的情况,MHA 的 master 我们也做了高可用设计,众多 master 会通过 raft 组成一个 raft group,类似 TiDB 的 PD 模块。目前 MySQL failover 策略支持三种方式:同机房、同地域跨机房以及跨地域。 ③ MySQL拓展能力 第三是提高MySQL扩展能力,以提供更大容量的数据存储。扩展方式有 SDK,例如开源的 ShardingSphere,在爱奇艺的使用也比较广泛。另外就是 Proxy,开源的就更多了。但是 SDK 和 Proxy 使用的问题是支持的 SQL 语句简单,扩容难度大,依赖较多且运维复杂,所以部分业务已经迁移至 TiDB。 ④ 审计 第四是审计。我们在 MySQL 上做了一个插件获取全量 SQL 操作,后端打到 Kafka,下游再接入包括 Clickhouse 等目标端进行 SQL 统计分析。除此之外还有安全策略,包括主动探索是否有 SQL 注入及是否存在拖库情况等,并触发对应的告警。 MySQL 审计插件最大的问题是如何降低对 MySQL 性能的影响,对此我们进行了一些测试,发现使用 General Log 对性能损耗较大,有 10%~20% 的降低。 于是我们通过接口来获取 MySQL 插件里的监控项,再把监控项放到 buffer 里边,用两级的 RingBuffer 来保证数据的写入不会有锁资源竞争。在这个插件里再启动一个线程,从 RingBuffer 里读取数据并把数据打包写到 FIFO 管道里。 我们在每台 MySQL 的物理机里再启动一个 Agent,从管道里阻塞地读取数据发至 Kafka。优化后我们再次进行压测,在每台机器上有 15 万的更新、删除或插入操作下不会丢失数据,性能损耗一般情况下小于 2%。 目前已经在公司内部的集群上线了一年时间,运行比较稳定,上线和下线对业务没有影响。 ⑤ 分级存储 第五是分级存储。MySQL 里会存一些过程性的数据,即只需要读写最近一段时间存入的数据,过段时间这些数据就不需要了,需要进行定时清理。 分级存储就是在 MySQL 之上又用了其他存储方式,例如 TiDB 或其他 TokuDB,两者之间可以进行数据自动搬迁和自动归档,同时前端通过 SDK + Proxy 来做统一的访问入口。这样一来,业务的开发同学只需要将数据存入 MySQL 里,读取时可能从后端接入的任意数据库读出。这种方式目前只是过渡使用,之后会根据 TiDB 的特性进行逐步迁移。 Redis在爱奇艺的使用 接下来是 Redis。Redis 也是使用 master - slave 这种方式,由于网络的复杂性我们对 Sentinel 的部署进行了一些特殊配置,在多机房的情况下每个机房配置一定数量 Sentinel 来避免脑裂。 备份恢复方面介绍一个我们的特殊场景,虽然 Redis 是一个缓存,但我们发现不少的业务同学会把它当做一个 KVDB 来使用,在某些情况下会造成数据的丢失。 所以我们做了一个 Redis 实时备份功能,启动一个进程伪装成 Redis 的 Slave 实时获取数据,再放到后端的 KV 存储里,例如 ScyllaDB,如果要恢复就可以从 ScyllaDB 里把数据拉出来。 我们在用 Redis 时最大的痛点就是它对网络的延迟或抖动非常敏感。如有抖动造成 Redis Master 超时,会由 Sentinel 重新选出一个新的节点成为 Master,再把该节点上的数据同步到所有 Slave 上,此过程中数据会放在 Master 节点的 Buffer 里,如果写入的 QPS 很高会造成 Buffer 满溢。如果 Buffer 满后 RDB 文件还没有拷贝过去,重建过程就会失败。 基于这种情况,我们对 Redis 告警做了自动化优化,如有大量 master - slave 重建失败,我们会动态调整一些参数,例如把 Buffer 临时调大等, 此外我们还做了 Redis 集群的自动扩缩容功能。 我们在做 Redis 开发时如果是 Java 语言都会用到 Jedis。用 Jedis 访问客户端分片的 Redis 集群,如果某个分片发生了故障或者 failover,Jedis 就会对所有后端的分片重建连接。如果某一分片发生问题,整个 Redis 的访问性能和 QPS 会大幅降低。针对这个情况我们优化了 Jedis,如果某个分片发生故障,就只针对这个分片进行重建。 在业务访问 Redis 时我们会对 Master 绑定一个读写域名,多个从库绑定读域名。但如果我们进行 Master failover,会将读写域名从某旧 Master 解绑,再绑定到新 Master 节点上。 DNS 本身有一个超时时间,所以数据库做完 failover 后业务程序里没有立刻获取到新的 Master 节点的 IP的话,有可能还会连到原来的机器上,造成访问失败。 我们的解决方法是把 DNS 的 TTL 缩短,但对 DNS 服务又会造成很大的压力,所以我们在 SDK 上提供 Redis 的名字服务 RNS,RNS 从 Sentinel 里获取集群的拓扑和拓扑的变化情况,如果集群 failover,Sentinel 会接到通知,客户端就可以通过 RNS 来获取新的 Master 节点的 IP 地址。我们去掉域名,通过 IP 地址来访问整个集群,屏蔽了 DNS 的超时,缩短了故障的恢复时间。 SDK 上还做了一些功能,例如 Load Balance 以及故障检测,比如某个节点延时较高的话会被临时熔断等。 客户端分片的方式会造成 Redis 的扩容非常痛苦,如果客户端已经进行了一定量的分片,之后再增加就会非常艰难。 Redis 在 3.0 版本后会提供 Redis Cluster,因为功能受限在爱奇艺应用的不是很多,例如不支持显示跨 DC 部署和访问,读写只在主库上等。 我们某些业务场景下会使用 Redis 集群,例如数据库访问只发生在本 DC,我们会在 DC 内部进行 Cluster 部署。 但有些业务在使用的过程中还是想做 failover,如果集群故障可以切换到其他集群。根据这种情况我们做了一个 Proxy,读写都通过它来进行。写入数据时 Proxy 会做一个旁路,把新增的数据写在 Kafka 里,后台启用同步程序再把 Kafka 里的数据同步到其他集群,但存在一些限制,比如我们没有做冲突检测,所以集群间数据需要业务的同学做单元化。线上环境的Redis Cluster 集群间场景跨 DC 同步 需要 50 毫秒左右的时间。 2、Couchbase在爱奇艺的使用 Redis 虽然提供 Cluster 这种部署方式,但存在一些问题。所以数据量较大的时候(经验是 160G),就不推荐 Redis 了,而是采用另一种存储方式 Couchbase。 Couchbase 在国内互联网公司用的比较少,一开始我们是把他当做一个 Memcached 来使用的,即纯粹的缓存系统。 但其实它性能还是比较强大的,是一个分布式高性能的 KV 系统,支持多种存储引擎 (bucket)。第一种是 Memcached bucket,使用方式和 Memcached 一样为 KV 存储,不支持数据持久化也没有数据副本,如果节点故障会丢失数据; 第二种是 Couchbase bucket,支持数据持久化,使用 Json 写入,有副本,我们一般会在线上配置两个副本,如果新加节点会对数据进行 rebalance,爱奇艺使用的一般是 Couchbase bucket 这种配置。 Couchbase 数据的分布如下图,数据写入时在客户端上会先进行一次哈希运算,运算完后会定位 Key 在哪一个 vBucket (相当于数据库里的某个分片)。之后客户端会根据 Cluster Map 发送信息至对应的服务端,客户端的 Cluster Map 保存的是 vBucket 和服务器的映射关系,在服务端数据迁移的过程中客户端的 Cluster Map 映射关系会动态更新,因此客户端对于服务端的 failover 操作不需要做特殊处理,但可能在 rebalance 过程中会有短暂的超时,导致的告警对业务影响不大。 Couchbase 在爱奇艺应用比较早,2012 年还没有 Redis Cluster 的时候就开始使用了。集群管理使用 erlang 语言开发,最大功能是进行集群间的复制,提供多种复制方式:单向、双向、星型、环式、链式等。 爱奇艺从最初的 1.8 版本使用到如今的 5.0 版本,正在调研的 6.0,中间也遇到了很多坑,例如 NTP 时间配置出错会导致崩溃,如果每个集群对外 XDCR 并发过高导致不稳定,同步方向变更会导致数据丢失等等,我们通过运维和一些外部工具来进行规避。 Couchbase 的集群是独立集群,集群间的数据同步通过 XDCR,我们一般配置为双向同步。对于业务来说,如果 Cluster 1 写入, Cluster 2 不写入,正常情况下客户端会写 Cluster 1。如果 Cluster 1 有故障,我们提供了一个 Java SDK,可以在配置中心把写入更改到 Cluster 2,把原来到 Cluster 1 的连接逐步断掉再与Cluster 2 新建连接。这种集群 failover 的过程对于客户端来说是相对透明和无感的。 3、爱奇艺自研数据库HiKV的使用 Couchbase 虽然性能非常高,并且数据的存储可以超过内存。但是,如果数据量超过内存 75% 这个阈值,性能就会下降地特别快。在爱奇艺,我们会把数据量控制在可用内存的范围之内,当做内存数据库使用。但是它的成本非常高,所以我们后面又开发了一个新的数据库—— HiKV。 开发 HiKV 的目的是为了把一些对性能要求没那么高的 Couchbase 应用迁移到 HiKV 上。HiKV 基于开源系统 ScyllaDB,主要使用了其分布式数据库的管理功能,增加了单机存储引擎 HiKV。 ScyllaDB 比较吸引人的是它宣称性能高于 Cassandra 十倍,又完全兼容 Cassandra 接口,设计基本一致,可以视为 C++ 版 Cassandra 系统。 ScyllaDB 性能的提升主要是使用了一些新的技术框架,例如 C++ 异步框架 seastar,主要原理是在j每台物理机的核上会 attach 一个应用线程,每个核上有自己独立的内存、网络、IO 资源,核与核之间没有数据共享但可以通信,其最大的好处是内存访问无锁,没有冲突过程。 当一个数据读或写到达 ScyllaDB 的 server 时,会按照哈希算法来判断请求的 Key 是否是该线程需要处理的,如果是则本线程处理,否则会转发到对应线程上去。 除此之外,它还支持多副本、多数据中心、多写多活,功能比较强大。 在爱奇艺,我们基于 SSD 做了一个 KV 存储引擎。Key 放在内存里,Value 放在盘上的文件里,我们在读和写文件时,只需要在内存索引里定位,再进行一次盘的 IO 开销就可以把数据读出来,相比 ScyllaDB 原本基于 LSM Tree 的存储引擎方式对 IO 的开销较少。 索引数据全部放在内存中,如果索引长度较长会限制单机可存储的数据量,于是我们通过开发定长的内存分布器,对于比较长的 Key 做摘要缩短长度至 20 字节,采用红黑树索引,限制每条记录在内存里的索引长度至为 64 字节。内存数据要定期做 checkpoint,客户端要做限流、熔断等。 HiKV 目前在爱奇艺应用范围比较大,截至目前已经替换了 30% 的 Couchbase,有效地降低了存储成本。 4、爱奇艺的数据库运维管理 爱奇艺数据库种类较多,如何高效地运维和管理这些数据库也是经历了不同的阶段。 最初我们通过 DBA 写脚本的方式管理,如果脚本出问题就找 DBA,导致了 DBA 特别忙碌。 第二个阶段我们考虑让大家自己去查问题的答案,于是在内部构建了一个私有云,通过 Web 的方式展示数据库运行状态,让业务的同学可以自己去申请集群,一些简单的操作也可以通过自服务平台实现,解放了 DBA。一些需要人工处理的大型运维操作经常会造成一些人为故障,敲错参数造成数据丢失等。 于是在第三个阶段我们把运维操作 Web 化,通过网页点击可以进行 90% 的操作。 第四个阶段让经验丰富的 DBA 把自身经验变成一些工具,比如有业务同学说 MySQL master-slave 延时了,DBA 会通过一系列操作排查问题。现在我们把这些操作串起来形成一套工具,出问题时业务的同学可以自己通过网页上的一键诊断工具去排查,自助进行处理。 除此之外我们还会定期做预警检查,对业务集群里潜在的问题进行预警报告;开发智能客服,回答问题;通过监控的数据对实例打标签,进行削峰填谷地智能调度,提高资源利用率。 三、不同场景下数据库选型建议 1、实用数据库选型树 最后来说一些具体数据库选型建议。这是 DBA 和业务一起,通过经验得出来的一些结论。 对于关系型数据库的选型来说,可以从数据量和扩展性两个维度考虑,再根据数据库有没有冷备、要不要使用 Toku 存储引擎,要不要使用 Proxy 等等进行抉择。 NoSQL 也是什么情况下使用 master-slave,什么情况下使用客户端分片、集群、Couchbase、HiKV 等,我们内部自服务平台上都有这个选型树信息。 2、一些思考 ① 需求 我们在选型时先思考需求,判断需求是否真实。 你可以从数据量、QPS、延时等方面考虑需求,但这些都是真实需求吗?是否可以通过其他方式把这个需求消耗掉,例如在数据量大的情况下可以先做数据编码或者压缩,数据量可能就降下来了。 不要把所有需求都推到数据库层面,它其实是一个兜底的系统。 ② 选择 第二个思考的点是对于某个数据库系统或是某个技术选型我们应该考虑什么?是因为热门吗?还是因为技术上比较先进?但是不是能真正地解决你的问题?如果你数据量不是很大的话就不需要选择可以存储大数据量的系统。 ③ 放弃 第三是放弃,当你放弃一个系统时真的是因为不好用吗?还是没有用好?放弃一个东西很难,但在放弃时最好有一个充分的理由,包括实测的结果。 ④ 自研 第四是自研,在需要自己开发数据库时可以参考和使用一些成熟的产品,但不要盲目自研。 ⑤ 开源 最后是开源,要有拥抱开源的态度。

茶什i 2019-12-27 14:17:56 0 浏览量 回答数 0

问题

【精品问答】带你进入数据库领域

谙忆 2020-04-07 20:45:48 12 浏览量 回答数 1

回答

本文介绍如何使用弹性伸缩、消息服务和函数计算,将弹性扩张时创建的ECS实例自动添加到Redis实例的白名单。 前提条件 使用本教程进行操作前,请确保您已经注册了阿里云账号。如还未注册,请先完成账号注册。 已经开通云数据库Redis、消息服务、弹性伸缩和函数计算。 背景信息 使用弹性伸缩时,伸缩组可以关联负载均衡实例和云数据库RDS实例,但是暂时不能关联云数据库Redis实例。如果您将业务数据存储在Redis实例上,会需要配置伸缩组内的ECS实例加入Redis实例的访问白名单。等待ECS实例创建完成后再逐个手动添加至Redis实例白名单不仅费时费力,也容易出现失误,在维护大量实例时成本较高。 针对这种情况,您可以在伸缩组中创建生命周期挂钩,生命周期挂钩在弹性扩张时会自动向指定的MNS主题发送消息,然后通过函数计算中的MNS主题触发器,触发执行上传的代码,自动将ECS实例添加到Redis实例的白名单。 说明 请在相同地域创建消息服务主题和函数计算服务,相同区域内的产品内网可以互通。 自动化管理实践-添加ECS实例到Redis白名单流程 本文以Java语言的形式给出示例代码,您可以根据业务需求,将此类最佳实践扩展到其它语言。 操作步骤 执行以下操作自动将伸缩组ECS实例添加到Redis实例白名单: 步骤一:创建Redis实例 步骤二:创建MNS主题和MNS队列 步骤三:创建伸缩组和生命周期挂钩 步骤四:创建服务和函数 步骤一:创建Redis实例 登录云数据库Redis控制台。 创建一台Redis实例。 具体操作请参见创建Redis实例,用于为自动创建的ECS实例提供数据库服务。 查看Redis实例的白名单,确定执行代码前的白名单状态。 自动化管理实践-查看Redis实例白名单 步骤二:创建MNS主题和MNS队列 登录消息服务控制台。 创建一个MNS主题。 用作执行函数的触发器,本示例主题的名称为fc-trigger。自动化管理实践-创建MNS主题消息 创建一个MNS队列。 用作函数执行结果的接收器,本示例队列的名称为fc-callback。示例代码中通过QUEUE_NAME指定该队列,发送包含函数执行结果的消息。自动化管理实践-创建MNS队列消息 步骤三:创建伸缩组和生命周期挂钩 登录弹性伸缩控制台。 创建一个伸缩组。 具体操作请参见创建伸缩组或者使用实例启动模板创建伸缩组。 创建一个生命周期挂钩。 具体操作请参见创建生命周期挂钩。 适用的伸缩活动类型配置为弹性扩张活动,用于通知弹性扩张事件。 通知方式配置为MNS主题,与MNS队列相比,主题可以通知多个订阅者,执行多种操作。 MNS主题配置为fc-trigger,用于在自动创建的ECS实例进入加入挂起中状态时执行代码,将ECS实例添加到云数据库Redis的白名单。 根据需要配置其它选项。 步骤四:创建服务和函数 登录函数计算控制台。 新建一个服务。 具体操作请参见创建服务,用于承载需要执行的函数,本示例服务的名称为as-hook-mns-fc-redis。自动化管理实践-创建函数计算服务 在服务下新建函数,订阅MNS主题并上传代码。 具体操作请参见新建函数。 在函数模板页面中,选择空白函数。 在触发器配置页面中,选择MNS 主题触发器,然后根据需要配置其它选项。 自动化管理实践-配置函数触发器 在基础管理配置页面中,所在服务配置为as-hook-mns-fc-redis,函数入口配置为fc.Example::handleRequest,然后根据需要配置其它选项。 函数入口由代码决定,请根据实际情况配置。 本文示例采用上传jar包,实现将自动创建的ECS实例添加到云数据库Redis的白名单。有关编程语言说明,请参见函数计算Java编程说明。 自动化管理实践-配置函数基础信息自动化管理实践-配置函数基础信息-函数入口 在权限配置页面中,根据需要授予函数访问其它资源的权限,并授予消息服务调用函数的权限。 说明 建议遵循权限最小化原则,仅授予必需的权限,防范潜在风险。 自动化管理实践-配置权限-函数计算操作其它资源自动化管理实践-配置权限-调用函数 在信息核对页面中,核对函数信息和触发器信息,然后单击创建。 执行效果 配置完成后,执行效果如下: 在满足弹性扩张的条件时,伸缩组触发伸缩活动,自动创建ECS实例。 生命周期挂钩挂起伸缩活动,同时发送消息到MNS主题。 函数计算中,MNS主题触发器触发函数执行过程,并将消息内容作为输入信息(包括ECS实例的ID等信息),执行Java代码。 代码执行时,会通过接口获取ECS实例的私网IP,然后将私网IP添加到Redis实例的白名单(default 分组)。 代码执行结果会发送到MNS队列fc-callback,您可以在消息服务控制台查看结果详情。查看消息内容中success为true,即表明ECS实例成功添加到了Redis实例的白名单。自动化管理实践-查看执行效果 您还可以继续消费MNS队列中的消息,比如获取success、LifecycleHookId和LifecycleActionToken,编程提前结束生命周期挂钩。 上述最佳实践供您参考,您也在其它场景下通过多款产品实现自动化管理,从而更加灵活地管理伸缩组内的资源。 示例代码 示例代码仅供参考,请结合具体业务进行测试改造。主要功能涉及四个java文件,通过Maven管理,目录结构如下: 自动化管理实践-Jar包结构 Maven依赖如下: 4.0.0 com.aliyun.fc.wujin demo 1.0-SNAPSHOT com.aliyun aliyun-java-sdk-ecs 4.10.1 com.aliyun.fc.runtime fc-java-core 1.0.0 com.aliyun aliyun-java-sdk-core 3.2.6 com.aliyun aliyun-java-sdk-r-kvstore 2.0.3 com.alibaba fastjson 1.2.25 org.springframework spring-context 4.2.5.RELEASE org.apache.httpcomponents httpclient 4.5.2 org.apache.commons com.springsource.org.apache.commons.lang 2.6.0 com.aliyun.mns aliyun-sdk-mns 1.1.8.4 maven-assembly-plugin 3.1.0 jar-with-dependencies false make-assembly package single org.apache.maven.plugins maven-compiler-plugin 1.8 1.8 Example.java代码如下: package fc; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import com.aliyun.fc.runtime.Context; import com.aliyun.fc.runtime.StreamRequestHandler; import com.aliyun.mns.client.CloudAccount; import com.aliyun.mns.client.CloudQueue; import com.aliyun.mns.client.MNSClient; import com.aliyun.mns.model.Message; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.ecs.model.v20140526.DescribeInstancesRequest; import com.aliyuncs.ecs.model.v20140526.DescribeInstancesResponse; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.profile.IClientProfile; import com.aliyuncs.r_kvstore.model.v20150101.DescribeSecurityIpsRequest; import com.aliyuncs.r_kvstore.model.v20150101.DescribeSecurityIpsResponse; import com.aliyuncs.r_kvstore.model.v20150101.ModifySecurityIpsRequest; import model.FCResult; import model.HookModel; import model.MnsMessageModel; import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang.StringUtils; import org.springframework.util.CollectionUtils; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Example implements StreamRequestHandler { /** * 专有网络类型,此参数不用变 */ private static final String VPC_NETWORK = "vpc"; private static final String CHAR_SET = "UTF-8"; /** * 接收input数组大小,4096通常够用 */ private static final Integer MAX_BYTE_LENGTH = 4096; /** * REDIS 白名单默认分组 */ private static final String DEFAULT_SECURITY_GROUP_NAME = "default"; /** * REDIS 修改白名单的模式 */ private static final String MODIFY_MODE_APPEND = "Append"; /** * MNS 客户端发送消息地址 */ private static final String MNS_END_POINT = "http://%s.mns.%s.aliyuncs.com/"; /** * 待添加的REDIS实例ID,根据个人情况替换 */ private static final String REDIS_ID = ""; /** * 接收本次函数计算执行结果的队列名称,根据个人情况替换 */ private static final String QUEUE_NAME = "wujin-fc-callback"; /** * 阿里云账号UID,根据跟人情况替换 */ private static final Long USER_ID = 1111111111111111111L; /** * 伸缩组 MNS FC 所属的region,根据个人情况替换 */ private static final String REGION_ID = "cn-hangzhou"; @Override public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) { FCResult result = new FCResult(); String akId = context.getExecutionCredentials().getAccessKeyId(); String akSecret = context.getExecutionCredentials().getAccessKeySecret(); String securityToken = context.getExecutionCredentials().getSecurityToken(); try { //获取MNS触发函数计算时输入的内容 String input = readInput(inputStream); MnsMessageModel mnsMessageModel = JSON.parseObject(input, new TypeReference<MnsMessageModel>() { }); if (mnsMessageModel == null) { result.setSuccess(false); result.setMessage("mnsMessageModel is null"); sendMns(akId, akSecret, securityToken, result.toString()); return; } HookModel contentModel = mnsMessageModel.getContent(); if (contentModel == null) { result.setSuccess(false); result.setMessage("contentModel is null"); sendMns(akId, akSecret, securityToken, result.toString()); return; } IAcsClient client = buildClient(akId, akSecret, securityToken); //获取本次伸缩活动对应实例的私网IP List<String> privateIps = getInstancesPrivateIps(contentModel.getInstanceIds(), client); if (CollectionUtils.isEmpty(privateIps)) { result.setSuccess(false); result.setMessage("privateIps is empty"); sendMns(akId, akSecret, securityToken, result.toString()); return; } List<String> needAppendIps = filterPrivateIpsForAppend(privateIps, client); if (!CollectionUtils.isEmpty(needAppendIps)) { modifySecurityIps(client, needAppendIps); result.setLifecycleHookId(contentModel.getLifecycleHookId()); result.setLifecycleActionToken(contentModel.getLifecycleActionToken()); sendMns(akId, akSecret, securityToken, result.toString()); } } catch (Exception ex) { result.setSuccess(false); result.setMessage(ex.getMessage()); sendMns(akId, akSecret, securityToken, result.toString()); } } /** * 构建请求 ECS Redis 接口客户端 * * @param akId * @param akSecret * @param securityToken * @return */ private IAcsClient buildClient(String akId, String akSecret, String securityToken) { IClientProfile clientProfile = DefaultProfile.getProfile(REGION_ID, akId, akSecret, securityToken); return new DefaultAcsClient(clientProfile); } /** * 将执行结果发送消息到MNS * * @param ak * @param aks * @param securityToken * @param msg */ private void sendMns(String ak, String aks, String securityToken, String msg) { MNSClient client = null; try { CloudAccount account = new CloudAccount(ak, aks, String.format(MNS_END_POINT, USER_ID, REGION_ID), securityToken); client = account.getMNSClient(); CloudQueue queue = client.getQueueRef(QUEUE_NAME); Message message = new Message(); message.setMessageBody(msg); queue.putMessage(message); } finally { if (client != null) { client.close(); } } } /** * 过滤出需要添加到redis的私网IP * * @param privateIps 过滤以前的私网IP * @param client * @return * @throws ClientException */ private List<String> filterPrivateIpsForAppend(List<String> privateIps, IAcsClient client) throws ClientException { List<String> needAppendIps = new ArrayList<>(); if (CollectionUtils.isEmpty(privateIps)) { return needAppendIps; } DescribeSecurityIpsRequest request = new DescribeSecurityIpsRequest(); request.setInstanceId(REDIS_ID); DescribeSecurityIpsResponse response = client.getAcsResponse(request); List<DescribeSecurityIpsResponse.SecurityIpGroup> securityIpGroups = response .getSecurityIpGroups(); if (CollectionUtils.isEmpty(securityIpGroups)) { return privateIps; } for (DescribeSecurityIpsResponse.SecurityIpGroup securityIpGroup : securityIpGroups) { if (!securityIpGroup.getSecurityIpGroupName().equals(DEFAULT_SECURITY_GROUP_NAME)) { continue; } String securityIps = securityIpGroup.getSecurityIpList(); if (securityIps == null) { continue; } String[] securityIpList = securityIps.split(","); List<String> existIps = Arrays.asList(securityIpList); if (CollectionUtils.isEmpty(existIps)) { continue; } for (String ip : privateIps) { if (!existIps.contains(ip)) { needAppendIps.add(ip); } } } return privateIps; } /** * 修改REDIS实例DEFAULT分组私网IP白名单 * * @param client * @param needAppendIps * @throws ClientException */ private void modifySecurityIps(IAcsClient client, List<String> needAppendIps) throws ClientException { if (CollectionUtils.isEmpty(needAppendIps)) { return; } ModifySecurityIpsRequest request = new ModifySecurityIpsRequest(); request.setInstanceId(REDIS_ID); String ip = StringUtils.join(needAppendIps.toArray(), ","); request.setSecurityIps(ip); request.setSecurityIpGroupName(DEFAULT_SECURITY_GROUP_NAME); request.setModifyMode(MODIFY_MODE_APPEND); client.getAcsResponse(request); } /** * 获取输入,并base64解码 * * @param inputStream * @return * @throws IOException */ private String readInput(InputStream inputStream) throws IOException { try { byte[] bytes = new byte[MAX_BYTE_LENGTH]; int tmp; int len = 0; //循环读取所有内容 while ((tmp = inputStream.read()) != -1 && len < MAX_BYTE_LENGTH) { bytes[len] = (byte) tmp; len++; } inputStream.close(); byte[] act = new byte[len]; System.arraycopy(bytes, 0, act, 0, len); return new String(Base64.decodeBase64(act), CHAR_SET); } finally { inputStream.close(); } } /** * 获取实例列表对应的私网IP,并限制每次请求实例数量不超过100 * * @param instanceIds 实例列表 * @param client 请求客户端 * @return * @throws Exception */ public List<String> getInstancesPrivateIps(List<String> instanceIds, IAcsClient client) throws Exception { List<String> privateIps = new ArrayList<>(); if (CollectionUtils.isEmpty(instanceIds)) { return privateIps; } int size = instanceIds.size(); int queryNumberPerTime = 100; int batchCount = (int) Math.ceil((float) size / (float) queryNumberPerTime); //support 100 instance for (int i = 1; i <= batchCount; i++) { int fromIndex = queryNumberPerTime * (i - 1); int toIndex = Math.min(queryNumberPerTime * i, size); List<String> subList = instanceIds.subList(fromIndex, toIndex); DescribeInstancesRequest request = new DescribeInstancesRequest(); request.setInstanceIds(JSON.toJSONString(subList)); DescribeInstancesResponse response = client.getAcsResponse(request); List<DescribeInstancesResponse.Instance> instances = response.getInstances(); if (CollectionUtils.isEmpty(instances)) { continue; } for (DescribeInstancesResponse.Instance instance : instances) { String privateIp = getPrivateIp(instance); if (privateIp != null) { privateIps.add(privateIp); } } } return privateIps; } /** * 从 DescribeInstancesResponse.Instance 中解析出私网 IP * * @param instance DescribeInstancesResponse.Instance */ private String getPrivateIp(DescribeInstancesResponse.Instance instance) { String privateIp = null; if (VPC_NETWORK.equalsIgnoreCase(instance.getInstanceNetworkType())) { DescribeInstancesResponse.Instance.VpcAttributes vpcAttributes = instance .getVpcAttributes(); if (vpcAttributes != null) { List<String> privateIpAddress = vpcAttributes.getPrivateIpAddress(); if (!CollectionUtils.isEmpty(privateIpAddress)) { privateIp = privateIpAddress.get(0); } } } else { List<String> innerIpAddress = instance.getInnerIpAddress(); if (!CollectionUtils.isEmpty(innerIpAddress)) { privateIp = innerIpAddress.get(0); } } return privateIp; } } FCResult.java代码如下: package model; import com.alibaba.fastjson.JSON; public class FCResult { private boolean success = true; private String lifecycleHookId; private String lifecycleActionToken; private String message; public boolean isSuccess() { return success; } public void setSuccess(boolean success) { this.success = success; } public String getLifecycleHookId() { return lifecycleHookId; } public void setLifecycleHookId(String lifecycleHookId) { this.lifecycleHookId = lifecycleHookId; } public String getLifecycleActionToken() { return lifecycleActionToken; } public void setLifecycleActionToken(String lifecycleActionToken) { this.lifecycleActionToken = lifecycleActionToken; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } @Override public String toString() { return JSON.toJSONString(this); } } HookModel.java代码如下: package model; import java.util.List; public class HookModel { private String lifecycleHookId; private String lifecycleActionToken; private String lifecycleHookName; private String scalingGroupId; private String scalingGroupName; private String lifecycleTransition; private String defaultResult; private String requestId; private String scalingActivityId; private List<String> instanceIds; public String getLifecycleHookId() { return lifecycleHookId; } public void setLifecycleHookId(String lifecycleHookId) { this.lifecycleHookId = lifecycleHookId; } public String getLifecycleActionToken() { return lifecycleActionToken; } public void setLifecycleActionToken(String lifecycleActionToken) { this.lifecycleActionToken = lifecycleActionToken; } public String getLifecycleHookName() { return lifecycleHookName; } public void setLifecycleHookName(String lifecycleHookName) { this.lifecycleHookName = lifecycleHookName; } public String getScalingGroupId() { return scalingGroupId; } public void setScalingGroupId(String scalingGroupId) { this.scalingGroupId = scalingGroupId; } public String getScalingGroupName() { return scalingGroupName; } public void setScalingGroupName(String scalingGroupName) { this.scalingGroupName = scalingGroupName; } public String getLifecycleTransition() { return lifecycleTransition; } public void setLifecycleTransition(String lifecycleTransition) { this.lifecycleTransition = lifecycleTransition; } public String getDefaultResult() { return defaultResult; } public void setDefaultResult(String defaultResult) { this.defaultResult = defaultResult; } public String getRequestId() { return requestId; } public void setRequestId(String requestId) { this.requestId = requestId; } public String getScalingActivityId() { return scalingActivityId; } public void setScalingActivityId(String scalingActivityId) { this.scalingActivityId = scalingActivityId; } public List<String> getInstanceIds() { return instanceIds; } public void setInstanceIds(List<String> instanceIds) { this.instanceIds = instanceIds; } } MnsMessageModel.java代码如下: package model; public class MnsMessageModel { private String userId; private String regionId; private String resourceArn; private HookModel content; public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getRegionId() { return regionId; } public void setRegionId(String regionId) { this.regionId = regionId; } public String getResourceArn() { return resourceArn; } public void setResourceArn(String resourceArn) { this.resourceArn = resourceArn; } public HookModel getContent() { return content; } public void setContent(HookModel content) { this.content = content; } }

1934890530796658 2020-03-22 13:32:03 0 浏览量 回答数 0

问题

通过自动重连方式解决RDS闪断问题

nono20011908 2019-12-01 21:07:16 27529 浏览量 回答数 1

问题

词汇表是什么样的?(S-V)

轩墨 2019-12-01 22:06:08 2089 浏览量 回答数 0

问题

MaxCompute百问集锦(持续更新20171011)

隐林 2019-12-01 20:19:23 38430 浏览量 回答数 18

问题

【精品问答】Java技术1000问(1)

问问小秘 2019-12-01 21:57:43 37578 浏览量 回答数 11

回答

2014年12月第2周 1)SLB植入cookie和SLB重写cookie有什么区别? cookie植入,表示直接由SLB系统来分配和管理对客户端进行的cookie植入操作,用户在进行配置时 需要指定会话保持的超时时间; cookie重写,表示SLB系统会根据用户自定义cookie名称来分配和管理对客户端进行的cookie植入操 作,便于用户识别和区分自定义的cookie名称 http://help.aliyun.com/doc/view/13510025.html?spm=0.0.0.0.vwbsGF 2)SLB有没有对外提供API接口,因为我想做到用程序自动去控制SLB的操作? SLB api您可以参考http://help.aliyun.com/view/13621674.html? spm=5176.7114037.1996646101.1.9RoTFM&pos=1 3)使用slb怎么实现数据的单向同步和双向同步? 单向同步可以使用rsync,双向同步的话rsync需要借用别的服务来实现,如unison+inotify。 4)slb的vip是否可以实现远程登录? slb 的vip无法实现远程登录。 5)slb的带宽是所有后端ECS服务器的带宽总和吗? 不是,使您购买的slb实例带宽。 6)slb健康检查机制是什么? 用户开启健康检查功能后,当后端某个ECS健康检查出现问题时会将请求转发到其他健康检查正常的 ECS上,而当该ECS恢复正常运行时,SLB会将其自动恢复到对外或对内的服务中。 针对7层(HTTP协议)服务,SLB系统的健康检查机制为:默认通过SLB的后端系统来向该ECS应用服务 器配置的缺省首页发起http head请求(缺省通过在服务监听配置中指定的后端ECS端口进行访问), 返回200 OK后将视为后端ECS运行正常,否则视为后端ECS运行异常。如果用户用来进行健康检查的页 面并不是应用服务器的缺省首页,那么需要用户指定相应的URI。如果用户对http head请求限定了 host字段的参数,那么需要用户指定相应的URL。用户也可以通过设定健康检查的频率、健康阈值和 不健康阈值来更好的控制健康检查功能。 针对4层(TCP协议)服务,SLB系统的健康检查机制为:默认通过在服务监听配置中指定的后端ECS端 口发起访问请求,如果端口访问正常则视为后端ECS运行正常,否则视为后端ECS运行异常。 当用户后端ECS健康检查异常后,SLB系统会将该ECS的转发权重设置为0,从而确保新的连接不会再被 转发到该ECS上,而已经建立的连接的请求却不会被直接断掉。 针对可能引起健康检查异常的排查思路点击这里查看。 关于健康检查的参数配置,提供如下参考建议: 响应超时时间:5秒 健康检查间隔:2秒 不健康阈值:3 健康阈值:3 7)权重设置为0怎么办? 权重为0的服务器将无法提供服务。 8)健康检查异常的排查思路? 参考http://help.aliyun.com/doc/view/13510029.html?spm=0.0.0.0.Oa9Ezv ------------------------- 12月份第3周1)轮询与最小连接数方式的区别是什么?当前SLB支持轮询和最小连接数2种模式的转发规则。“轮询模式”会将外部和内部的访问请求依序分发给后端ECS进行处理,而“最小连接数模式”会将外部和内部的访问请求分发给当前连接数最小的一台后端ECS进行处理。2)SLB支持redis的主备?目前我们的SLB不支持主备模式(冷备),只支持"轮询"和"最小连接数"两种负载模式。关于SLB的原理您可以参阅如下博文:http://blog.aliyun.com/149 基于ECS的redis搭建,您可以参阅论坛中其它用户的分享案例:http://bbs.aliyun.com/read/161389.html3)负载均衡的多台服务器之间文件会不会自动同步?slb是不会自动同步的,需要您自行配置。4)四层和七层检查的区别是什么?如果是4层(TCP)配置,健康检查只是简单的TCP握手,不会真正去访问您的业务。但对于7层(HTTP)配置,会发HTTP请求(类似于正常访问),并根据返回状态码判断服务状态(2XX表示服务正常)。5)我有多个slb,之前一个slb由于被攻击被黑洞给屏蔽了外部请求,是否可以在slb 并屏蔽后 能够自动将请求分发到另外的slb?由于攻击导致屏蔽外部请求的话,slb没有自动切换的方法的。6)目前slb是否可以设置黑名单?暂不支持。7)我的slb实例控制台显示是停止,为什么?需要给监听的端口设置带宽才能正常。  8)我使用了 SLB那么ESC 需要购买带宽吗?不需要的。但如需要管理ECS,则可购买少些的带宽如1M来管理。9)slb变更计费方式需要多久才能生效?变更和计费将在第二日零点后生效。10)私网SLB的使用,是如何收费的呢?私网slb是不收取费用的。 ------------------------- 12月第4周1)最近用slb后打开网页老出现503 和504错误?一般都是从ECS获取站点信息等异常导致的。您首先先确保源站都可以正常的访问。2)slb检查时突然发现SLB监听错误,怎么回事?配置的健康检查的域名为空,检查的路径是/index.html,目前查看服务器中只有站点c绑定了空主机头,且站点目录下有index.html,而此站点是停止状态,现已帮您启用,查看服务器的健康检查状态已经正常。3)我想使用slb搭建一个负载均衡,后端使用windows服务器,想咨询一下后端服务器是否需要进行什么特别配置呢?另外使用了slb后,后端还能否得到用户的真实IP地址呢,要不要进行什么特殊配置才可以得到后端用户的真实IP。后端服务器的操作系统和web环境最好保持一致,硬件配置上没有什么特别的,4层tcp是可以直接获得前端用户访问的真实地址的,7层http需要在后端web服务端设置一下,参考http://help.aliyun.com/view/13502961.html?spm=5176.7114037.1996646101.1.oRpnOM&pos=14)slb支持https吗?slb您可以通过TCP协议配置443端口的方式来实现,但是安全证书需要保存在您的后端ECS上。5)健康检查后续是否提供多个域名?健康检查只支持一个域名。6)我想关闭负载均衡的健康检查,请问如何配置?4层tcp是无法关闭健康检查的,7层http可以在控制台关闭。健康检查是不会消耗您服务器的资源的,因为slb都是通过内网ip来进行健康检查。7)如何在BLS上 限制单个IP 禁止访问 我的网站呢?SLB暂时不支持设置屏蔽用户端IP。 ------------------------- Re:Re负载均衡SLB常见咨询问题(持续连载) 引用第2楼517449116于2014-12-17 15:54发表的 Re负载均衡SLB常见咨询问题(持续连载) : 如果开启健康检查,健康检查异常的话,是不是就不会给这个异常的ECS分发? [url=http://bbs.aliyun.com/job.php?action=topost&tid=188736&pid=596806][/url] 异常的话不会在分发。 ------------------------- 2015年1月第1周1)有2台ECS起名叫A和B做SLB,A权重设的100 B权重设的0.请问.当A死机时,SLB是否会转到权重是0的B上?如果有一台设置为0,永远都不会有请求转发到此服务器上,即使权重100的宕机也不会转发到0权重的。2)会话保持的选择?开启会话保持功能后,SLB会把来自同一客户端的访问请求分发到同一台后端ECS上进行处理。针对7层(HTTP协议)服务,SLB系统是基于cookie的会话保持。针对4层(TCP协议)服务,SLB系统是基于IP地址的会话保持。3)用nagios或zabbix监控网络带宽,是否可以监控 slb的流量?nagios或zabbix,cacti是要要被监控端安装snmp或者相关agent ,slb不支持安装这些,所以无法通过这条监控软件进行监控。您可以在slb的控制台里面进行查看流量等相关信息。4)用了负载均衡后升级带宽,是不是只用在负载上面升级就可以了,ECS是不是不用在升级了?SLB与后端服务器是经过内网通信,所以如果业务量增加,您对SLB的带宽调整就行,不需要对服务器ECS进行带宽的升级。 ------------------------- 2015年1月第2周 1)SLB到期之后,会对SLB有关联的云主机怎么处理?云主机还没到期的前提下  我想把网站域名解析到SLB上 如果SLB到期了 会影响到我的网站服务么? 云服务器是不会有什么影响的,会自动又变成单独的云服务器可以供您使用的。但是如果您的域名是解析到SLB上,那么会影响到您的站点访问的。服务器上不会有其他的问题感谢您的支持。 2)当SLB 状态为停止的时候 还计算费用吗?停止后公网slb会收取实例费用。SLB价格总览参考:http://help.aliyun.com/view/11108234_13502923.html?spm=0.0.0.0.kBLsVA 3)做了SLB负载均衡,四层和7层负载均衡是否都走slb带宽? 都走slb带宽。 4)我想 移除 slb下的ecs(用作其他用途),请问在移除的时候是否会影响被负载到这台 ecs上的服务的使用 ,也是说slb这是是怎么处理的? 您可以将要移除的主机的权重更改为0 ,这样默认就不会在分发到权重为0的主机上,这个时候您可以移除该主机。但要确保您的另外一台服务器可以承受所有的访问。 5)SLB实例如何释放? 您需要登录管理控制台点击负载均衡。查询您之前创建的实例在哪个节点下,然后释放您的实例。 6)SLB按照小时的带宽计费, 是否需要每小时调整?比如我可否按照一个比较高的上限, 比如3G,然后每个小时按照该小时的峰值进行独立计费呢?   在一个自然日内,限制用户变更计费方式的次数为1次,变更计费方式将在第二日零点后生效;比如用户在今天5月5日的10:00提交了变更计费方式,那么该变配申请将在明天5月6日00:00后生效。http://help.aliyun.com/view/13502923.html?spm=5176.7114037.1996646101.3.67L5dm&pos=2;SLB目前最大带宽是1000Mbps 7)SLB可以限制每个ip的访问频率吗?(工单1F684MN)slb不支持这样配置的。 8)为什么我设置SLB健康检查间隔为5S,但却每秒都有很多请求?因为用于健康检查的服务ip不止一个,每秒中都会有不同的内网ip进行健康检查,健康检查是通过内网方式,不会消耗您后端服务器的资源,您可以将健康检查间隔阈值跳大些,这样监测频率会降低很多。 ------------------------- Re:负载均衡SLB常见咨询问题(持续连载至2015年1月第3周) 2015年1月第3周 1.发现很多100.97.0.0/16 的ip段扫描,给我服务器带来很大压力,怎么办? 100.97.0.0/16 是我们slb的健康检查服务ip段,如果给服务器带来较大压力,请调整健康检查的设置;健康检查的话 1)调低检查频率 2)设置检查静态文件,而不是默认首页或者动态文件 3)设置一个不记录日志的virtualhost,专门用于健康检查。 2)SLB里的带宽 和后面对应服务器的带宽有什么关联关系?比如SLB我设置了带宽为10M, 但是我后 面2台服务器购买的带宽都只有2M, 这种情况带宽以哪个为准? 如果您设置的是常规7层slb负载均衡,那么网站访问所使用的带宽,都将通过slb而不需要消耗云服 务器的带宽,但是云服务器本身的系统更新,以及您更新网站等等也是需要带宽的,因此您保留2M 即可。 3)采用流量计费方式的话带宽是否没有限制? SLB按流量计费最大的带宽是1G。 4)请问我如何获得一个外网SLB期所对应的内网IP呢?比如现在我有一个外网SLB下挂了一个ECS, 而ECS的iptables里我想做一些配置,针对来自于这个SLB的请求做一个判断,我需要知道这个外网 SLB的内网IP。 目前SLB与后端通过如下地址段进行交互: 10.158.0.0/16 10.159.0.0/16 100.97.0.0/16 您可以针对上述地址段做相关配置。 5)如何确保SLB后端的多台ECS之间的数据同步呢? 目前,有很多类似的工具可以实现服务器之间的数据同步,比如:rsync。具体使用及选择,还请通 过其他途径获得更多的介绍资料及指导信息。您也可以将您的ECS配置成无状态的应用服务器,而数 据和文件统一存放在RDS和OSS服务上。 ------------------------- 2015年1月第4周1.为什么我的SLB实例突然消失了?请检查您的SLB服务是否设置了自动释放时间导致。2.我想关掉负载均衡,怎么操作?您直接登录到阿里云管理控制台——slb负载均衡——实例中查询创建的slb服务,后方有“释放”的按钮,您直接释放即可。3. 我现在有两个阿里账号里面都有ECS,我能不能在一个slb里面配置不同阿里云账户下的ECS?目前只能将同一账户下的服务器添加到SLB中,无法跨账户添加。4.ECS做负载均衡需要用户做额外的配置吗?可以参考http://help.aliyun.com/knowledge_detail.htm?knowledgeId=5973987。5. 云服务器上做数据库负载均衡如何实现,需要购买什么产品 ?文件服务器能否做负载均衡,比如10台文件服务器,包括读写这种的  ?1)数据库集群,用slb理论上是可以做的,但是如果您需要集群级别的数据库,建议使用我们的RDS。2)文件服务器也可以负载均衡,使用slb在均衡,保持会话,但是有一个问题是后端文件同步的,需要您自行同步,如 rsync。6.看SLB的说明是支持ddos的防护的,请问下,SLB的防护的峰值是多少,超过峰值黑洞时间是多少?这个与slb所在地区有关,和ecs的防御阀值是一样的,黑洞时间也是2.5小时。7. slb第七层是基于haproxy还是nginx还是tengine实现的?使用tengine实现的。8.7层和4层 SLB的超时时间是多少?7层超时时间是60s,4层超时时间是900s。9.负载均衡健康检查请求数量太多,怎么回事?因为slb前端机器是一组机器,所以健康检查请求较多,请您不要担心,集群内的每台服务都会对您的健康按照您设定的频率去做健康检查:您可以按照上述方法去优化您的健康检查项,看似请求量很大,但是对您资源消耗很少的,有2个建议给您:1)扩大健康检查的频率2)将检查页面配置为静态页面。这样请求消耗的资源会节省。10. SLB配置中的最小连接数是基于什么样判断?SLB会自动判断 当前ECS 的established 来判断是否转发。 ------------------------- 2015年2月第1周1)我想了解下SLB按流量计费是不是每小时需要扣0.02元?按量付费,国内节点配置费用是按照0.02/小时。流量单独计费。按带宽计费:采取按小时计费,以日结算(运行未满一日,按照当日实际使用小时数*当日开通的最高带宽的天价格/24)。如果您使用SLB实例的时间不足一小时,按一小时收费。2)请问健康检查发的什么请求? head 还是 get?head请求。3)SLB最大连接数如何来设置?目前暂不支持设置最大连接数限制。4)SLB 后端有两个服务器HA1和HA2,为什么我将HA1的权重设置成0,SLB的健康检查就有告警呢?slb四层的话,只要权重设置为0,那么健康检查就是显示异常。 ------------------------- 2015年2月第3周1)负载均衡SLB的实例防攻击防御是多少?我们有云盾的防御黑洞策略,比如以杭州节点的slb,其最高防御的流量阈值为5G,当最大流量超过5G,您的slb vip则会被加入到黑洞中,触发黑洞会使ecs或者slb正常使用中断2.5小时,这个您可以通过云盾管理控制台查看到这个说明。2) 我其他机房的服务器能添加到你们的负载均衡SLB中吗?不可以的,slb使用的是内网和后端的ECS互联,无法直接添加非阿里云主机的服务器,且slb后端的ecs需要使用同一节点的主机。3)负载均衡服务支持的最大负载均衡实例数目多少?总体峰值可支持每秒新建链接数大约多少?SLB对于后端服务器的数目是没有限制的。对于总体峰值每秒新建连接数是没有限制的。但是因为SLB前端是云盾服务,所以最大值取决于云盾中您配置的请求数。您可以查看云盾看到具体的值。4)SLB按量计费为什么需要设置带宽峰值?如果不设置带宽峰值,遇到攻击等情况,可能流量打的非常高的,带宽流量峰值您可以在slb控制台设置。5)在SLB控制面板看到的流入流量,要比后端服务器的eth0的income流量小很多, 请问slb的流入流量是否应该等于后端服务器的内网网卡入流量吗?不等于的,后端的eth0包括了slb的流量,还有其他的流量,包括ecs直接的内网通信等。slb只做转发,不处理请求的,slb通过内网转发到ecs。6)SLB中的月账单 是指我们拥有所有的 SLB 实例的计费呢,还是单独的某个 SLB 的计费?月账单是指您不同类型产品,截止当前日期内月内消费计费额度的,是所有SLB产品的。您也可以通过账单明细进行查询具体信息的。 ------------------------- 2014年2月第4周1)10.159.63.55,这个内网ip,总是恶意访问我们网站?SLB系统除了会通过系统服务器的内网IP将来自外部的访问请求转到后端ECS上之外,还会对ECS进行健康检查(前提是您已经开启了这一功能)和对您的SLB服务进行可用性监控,这些访问的来源都是由SLB系统发起的,具体包含的IP地址段是:杭州、青岛、北京、深圳节点SLB系统IP地址段:10.159.0.0/16,10.158.0.0/16和100.97.0.0/16,为了确保您对外服务的可用性,请确保对上述地址的访问配置放行规则。2)slb计费方式变更需要多久,业务会受到影响么?变更计费方式与变更配置说明1、支持用户在按使用流量和按公网带宽2种计费方式间切换;2、支持按固定带宽方式计费的用户灵活变更带宽配置;3、在一个自然日内,限制用户变更计费方式的次数为1次,变更计费方式将在第二日零点后生效;比如:用户在今天5月5日的10:00提交了变更计费方式,那么该变配申请将在明天5月6日00:00后生效。4、按固定带宽方式计费变更带宽配置即时生效,带宽计费取自然日内用户开通的最高带宽。5、对客户业务不会造成影响;3)负载均衡能将我的外部非阿里云服务器和ECS服务器放到一块?目前负载均衡SLB仅支持阿里云ECS,无法支持外部非阿里云服务器。4)slb是否有连接数限制,需要大量终端一直与平台保持长连接,阿里云能提多少长连接?SLB没有并发连接数限制的,slb是转发请求不做处理,实际连接数还要跟您后端的处理能力有关。 ------------------------- 2015年3月第1周1)调整权重会对SLB已经有的正常连接有影响吗?目前调整权重会对调整权重的这台主机已有的连接产生影响,会有连接卡主,卡住时间由健康检查配置的时间决定。2)slb是否支持UDP协议?目前SLB暂不支持UDP协议。3)现在TCP四层负载均衡的出口带宽受ECS机器的出口带宽限制吗?slb和ECS之间走的是内网流量,带宽是不受限制的。4)如果没有外网ip, 是否可以用slb的4层转发 ?没有带宽4层SLB也是可以使用的。 ------------------------- Re:负载均衡SLB常见咨询问题(持续连载至2015年3月第1周) 2015年3月第2周 1)SLB变更计费方式并支付成功后无法添加配置? SLB在一个自然日内,限制用户变更计费方式的次数为1次,变更计费方式将在第二日零点后生效查看您今天变更过一 次计费方式,开始时间:2015-03-09 00:00:00。原按使用流量计费,在2015-03-09 00:00:00后变更为按固定带宽计 费,带宽峰值: 2Mbps。同时在您新的计费方式生效之前,您是无法对该SLB进行修改配置的。 2)我的账户怎么欠费¥7.88,这是怎么回事? 查看您有使用负载均衡slb业务,在slb产品的账单欠费,请您登陆用户中心-消费记录-账单明细中查看 记录。 3)如何屏蔽健康检查探测的日志记录? 关闭或者屏蔽对test.php访问日志的方式: 在站点配置文件中添加内容: location ~ /test.php { access_log off; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } 注: 1、对test.php的location必须要放置在对php|php5处理前,否则会因为先被进行全局匹配导致无法生效。 2、还可以用另一种方案实现: a、在后端服务器中单独为用于健康检查的页面建立一个站点; b、关闭这个站点的日志记录: location ~ .*\.(php|php5)?$ { access_log off; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } 3、如果检查页面是其他格式,比如test.html,可以采用如下方式进行屏蔽: location ~ /test.html { access_log off; } 4.我想问下SLB的固定带宽,10M是不是上行和下行最大都能达到10M? 固定带宽指的是下行带宽最大达到10M,上行带宽没有限制。上行带宽指的是SLB的入流量(上行),就是进入SLB的 流量。带宽指的是SLB的出流量(下行),就是SLB对外发生给客户端的流量。 5.一般配置SLB的时候有个权重0到100,是如何选择数值的? 权重需要您根据后端机器的配置进行选择比如AB两台机器性能一致就分别设置50,这样请求就会在这两台机器上轮询 ,不同权重决定请求分发的分配。 ------------------------- 2015年3月第3周1)公网的SLB和ECS之间的流量是否收费?不收费。2) 想做SLB+两台ECS,附件OSS,程序Discuz。但是不知道如何实现?slb要求后端的两台ecs数据是一致的,为了保持数据的一致性,建议共享存数和数据,静态文件放置到oss里,数据库文件走自己搭建的主从或者,连接同一台rds。3)按流量计算是否需要设置峰值?按流量计费不需要设置峰值的。4)如何建一个子帐号来管理负载均衡SLB?子账户无法管理负载均衡服务。

qilu 2019-12-02 01:15:34 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站