中企动力 > 头条 > mysql上云

网站性能检测评分

注:本网站页面html检测工具扫描网站中存在的基本问题,仅供参考。

mysql上云

青云分布式数据库RadonDB 深度兼容MySQL 流量视频课程

img

卢如蓉

关注

【IT168 评论】2017年12月12日,青云宣布新一代分布式关系型数据库——RadonDB正式商用(申请加入“RadonDB 免费深度试用”计划:http://t/RTGbWiq)。RadonDB将MySQL数据库与主流分布式算法相结合,不仅支持分布式事务,全面兼容MySQL,还能够实现容量与性能无限水平扩展,具备金融级数据强一致性,满足企业级核心数据库对大容量、高并发、高可靠及高可用的苛刻要求。此外,RadonDB还支持智能化自动分表、平滑扩容及自动运维,大幅减轻数据库运维压力。

▲青云QingCloud分布式关系型数据库RadonDB

对于企业用户而言,业务的日益繁杂必然会导致数据量的膨胀式发展,要求数据库具备大规模、高可靠、高性能及弹性敏捷等特性。然而单机数据库显然已经无法承载大规模结构化数据(PB 级),亟需一款新型分布式关系型数据库,以满足互联网企业对分布式数据库的高并发需求,同时助力传统企业将核心业务逐步向云端转型。

RadonDB是青云QingCloud自主研发的新一代分布式关系型数据库,具有无限水平扩展能力,性能随容量扩容而线性提升,同时具备金融级数据一致性,可跨数据中心部署,完美支撑高并发实时交易等大规模在线事务。此外,RadonDB也是一款分布式HTAP数据库,同时支持在线事务处理(OLTP)与在线分析处理(OLAP),能够大幅节约存储成本,提高业务效率。

▲ RadonDB性能测试结果

RadonDB基于MySQL实现,提供InnoDB与TokuDB双存储引擎支持,能够高度兼容MySQL的数据结构、语法、工具及客户端,确保对MySQL数据库的平滑迁移,同时兼备MySQL经长期实践验证的可靠性。RadonDB支持自动分表、自动数据压缩、在线智能扩容、故障秒级自动切换,无需人工干预,有效降低业务应用开发、部署及运维的难度和复杂度。

基于此次推出的RadonDB分布式关系型数据库服务,以及一同上线的物理主机(Bare Metal Service)和QingStor NeonSAN共享块存储,青云QingCloud再次实现了产品与解决方案的全面升级,通过统一架构支持的公有云、私有云、混合云和托管云全维度云业务形态,灵活支持企业构建兼顾敏态、稳态和混合态的“全模云”架构,同时实现全模架构的统一管理。

青云QingCloud CTO 甘泉表示,作为新一代分布式关系型数据库,RadonDB完全基于云计算的理念设计实现,既具有云架构的敏捷与弹性,也兼顾了独立性与高性能,结合QingStor NeonSAN和QingCloud物理主机服务,帮助企业以更低的 TCO 和运维投入实现预期的数据分析与存储能力。

360云平台 MySQL 服务剖析 -- MySQL 自动化在 HULK 中的实现 企业视频课程

img

艾德里安

关注

奇技指南:360私有云平台(HULK平台)管理着360公司90%以上的业务线。本文为大家介绍MySQL在360云平台中的应用。

本文源自『高效开发运维』微信群的在线分享,分享者来自360Web平台部DBA团队。本文infoQ的『高效开发运维』公众号首发,已授权转载。

摘要

1.HULK 私有云平台介绍

2.现有 MySQL 服务规模

3.MySQL 服务常用功能展示

4.各功能模块设计实现思路

5.新的计划

6.Q&A

现状 & 服务规模

说起 HULK 私有云平台大家有参加过之前我们同事分享的应该听过,360HULK 私有云平台是奇虎 360 公司内部专属私有云平台,平台涉及云计算、数据库、大数据、监控等众多技术领域。今天要分享的 MySQL 服务就是 HULK 数据库服务中的一种。

这个是 HULK 用户端的首页,而其中数据库服务又集合了 MySQL、Redis、Mongodb、Greenplum、ElasticSearch 等,今天的主角是 MySQL,MySQL 作为基础服务是 DBA 服务体系中的基石,在 HULK 云平台中,MySQL 实例数已经突破 9000+,日访问量超过 200 亿,单份数据量也已经超过了 270TB。

不知道大家跟业务或者 DBA 沟通需求通过什么途径,当年我们没有搞自动化之前,需求沟通占用很大一部分工作时间,并且资源管理、服务部署等都是体力活,往往业务从需求沟通到实例部署完成,都是小时计的,而现在,我们可以做到分钟级,下面是在使用 HULK 平台自动化前后的对比。

实现全部自动化后,业务可以随时随地自助的提交数据库申请,不受时间和外部其他因素困扰,并能快速的投入使用,极大的提高了开发效率。

各功能模块设计实现思路

下面会根据业务在 HULK 上从申请到最终下线,贯串整个流程来演示和分析下各个模块的功能和设计思路。

新建实例

先看下创建实例,目前我们实例创建做到了全自动,业务之需根据自己业务情况选择对应的套餐、部署 IDC 以及访问数据库的机器列表,即可提交任务,任务提交后自动化完成,时间视部署 IDC 情况在 30 秒到 1 分钟之间。这个是实例申请页面,业务提交完申请,只需要查看工单状态,完成后具体的数据库连接信息会邮件发送。我们底层的任务系统用的自研的 QCMD,后面有机会的话也会在这里和大家分享,本次不做过多介绍。

而要做到这样的全自动,就需要从资源分析控制上入手,怎么合理的分配资源,且能高效的利用,是重点要考虑的问题,下面是我们在做自动化中遇到和解决的几个技术点:

借鉴各个公有云的模式,我们分析了业务的各种需求类型,同时对比我们内部的数据库资源,将数据库实例归类划分为套餐,不同的套餐对应不同的数据库资源,每台服务器也有自己对应的资源总数,实例新建、扩容、下线等都会相应增删不同比例的资源。这样每台服务器理论分配的数据库实例和对应消耗的资源是可控的。

同时,我们对服务器实际消耗的资源进行动态统计分析,并对健康状态进行打分,这样进一步来控制服务器的资源使用。

自动关联监控系统比不可少,第一时间将数据库实例纳入监控体系,并且在管理员维护操作的时候可以灵活启停监控。

对机器资源统计方面我们重点监测下面 7 个点,有一个监测点的值超过了对应阈值则处于不同的状态,在创建实例自动选择机器的时候,将会按照不同的逻辑选择。

数据库架构 & 高可用

实例创建完成,下图是我们默认的数据库架构图,以双 IDC 为例,用 Atlas 作为中间层,提供读写分离,Atlas 已经开源具体可以参考:https://github/Qihoo360/Atlas 。 在 Atlas 之上用 LVS 做了一次隔离和负载均衡,其中为了高可用,每个机房的服务节点都是部署多个,避免单点故障。

当单个 Atlas 故障的时候,LVS 检测到异常会直接下线,而当单个从库故障的时候,Atlas 检测到也会下线。 这样在 Atlas 和从库单点故障的时候整个集群还能正常工作,并且不影响业务使用。但是,当主库挂掉的时候,就改我们的故障自动切换 Failover 出场了。

下图是我们主库宕机时的切换流程,我们的故障切换服务 MySQL Failover 实时监控集群状态,当发现主库宕机后,会根据选主逻辑选出新主库、补全数据、重做主从结构然后修改 Atlas 的配置,到此整个切换流程完成,MySQL Failover 重新进入监控状态。正常情况整个故障切换耗时 15s 左右。

建表改表

说完数据库结构和故障切换,按照正常操作流程业务们该建表、改表、授权、查看监控等操作了,其中授权监控这里就不多赘述了。因为我们平台默认给业务方只有对数据的增删改查权限,所以建表改表需要业务来 HULK 平台操作,针对建表,我们根据运维经验和踩坑实践,总结了 16 个检查项,这里贴出来和大家分享下。

建表语句需要符合一定标准,否则将建表失败,具体审核标准如下:

表结构是否合法;

表名、列明长度超过 16;

必须有 unsigned;

必须为 innodb;

int bigint (10) 不能小于 10;

varchar 长度小于 3000;

text 字段个数不能大于 3;

主键必须为 int 类型;

索引不能有重复;

索引个数不能大于 5 个(包括主键);

索引字段必须为 not null,并且有 default 值(除自增键外);

SQL 是否使用到索引;

审核的 SQL 不要包含非审核的表;

SQL 中不能有 *;

自增字段必须为 int 或者 bigint;

请不要使用 MySQL 预留字(Reserved Words);

下面这个是测试建表的示例。

改表我们用的是 pt-osc(pt-online-schema-change),不过我们最近也在研究 gh-ost https://github/github/gh-ost ,对 gh-ost 感兴趣的咱们也可以下来交流。

测试环境

为了方便业务测试,我们在平台上提供了测试环境,并且将测试环境和线上环境打通,业务可以直接将库表结构在线上和测试之间互导。方便业务测试和上线操作。

优化建议

优化建议我们平台上目前统计了三类:慢日志、未使用索引、char 字段,其中慢日志收集了执行超过 0.5s 的 sql 以天为单位汇总后使用 pt-query-digest 分析,并将结果展示在 HULK 平台。

未使用索引我们使用了 MySQL5.6 中 PS 库的 table_io_waits_summary_by_index_usage 表的信息,汇总分析出没有被使用到的索引,重复索引会浪费存储空间,同时对数据更新性能也有影响,在一些场景下,还会对查询优化器造成干扰,可谓百害而无一利。

我们另一个优化建议就是 char 字段优化了,好多业务在建表的时候喜欢用 char 类型,但是 char 是固定长度,申请多少就占多少空间,当存入的字符串长度不够的时候会用空格补齐,这样在非定长的字符串存储中 char 会浪费大量的存储空间,所以我们对线上的所有字段定期进行分析汇总,扫描出使用长度远小于申请长度的表和字段,以报表的方式展示给业务,方便业务及时优化,我们建议直接将 char 改为 varchar,除非存储的是定长的比如 md5 之类的字符串,否则全部建议用 varchar。varchar 是可变长度的,实际使用多少就分配多少,额外再用 1-2 字节存储长度,并且超过指定长度还可以继续写入。

数据恢复

大家关心的数据恢复来了,不知道大家有没有这个经历:不小心误操作了需要恢复数据,但是联系 DBA、沟通需求、DBA 数据恢复、业务数据确认、替换上线,这整个流程走下来可能影响已经扩大,况且有可能数据恢复的需求在半夜,这个流程可能又延长很多。出于这种场景的考虑,我们将数据恢复也做成了自动化的任务,业务可以自助随时提交恢复任务,避免沟通确认各个环节浪费宝贵的数据恢复时间。数据可以恢复到 7 天以内任意时间点。看操作流程截图:

业务之需选择需要恢复的库表,选择时间提交任务即可,视数据量大小耗费时间不一,普通的几 G 的数据表,一般分钟级就能恢复,恢复后会生成临时实例,业务去临时实例确认数据无误后就可以一键替换线上,完成数据恢复申请。

数据备份

前面大家也了解了自动数据恢复,数据恢复依赖于完善的数据备份。我们的备份系统各模块构成如下图:

备份系统特点

多维度备份

全量备份 + 增量备份(binlog),每天都会进行全量备份,同时实时进行 binlog 备份。

合理的保留策略

4, 2,2,1 策略,即保留最近 4 天每天的全量备份,最近 2 周,最近 2 月,最近 1 年的全量备份binlog 保留最近 60 天。

自动更新备份策略

策略根据当天状态动态刷新,根据从库状态(我们在从库备份),存储状态,网络状态等动态跟新备份策略。

失败检测预警

备份失败自动归类,集中处理。备份失败检测模块会将失败任务汇总,报表展示。

过期自动清理

存储管理模块会根据保留策略,清理过期的备份数据。

我们备份系统是基于 Percona XtraBackup 实现的,不过根据我们的使用场景,做了一些改进与提升:

分库分表独立备份压缩

我们备份过程中按表为单位单独备份打包压缩,以便于支持单 / 多表快速恢复

改造支持单 / 多表恢复

为了快速恢复我们修改部分备份功能,可以支持数据恢复的时候值拷贝需要恢复的数据表和 MySQL 元数据信息, 极大节省数据拷贝、解压以及数据恢复时主从数据同步时间。想象下这种场景:源数据库有 1T 数据,现在需要快速恢复一张 1G 的数据表,如果不支持单表恢复,则需要拷贝 1T 的数据并解压,这恢复时间起码好几个小时,但是支持单表恢复后,拷贝和解压的数据量只有几 G,分钟级就可以恢复。

支持数据加密和加密传输

增加了数据加密模块和加密传输模块

增加多种恢复模式

支持时间点,binlog_pos,sql 等多种恢复模式

从 DBA 和运维角度出发,还可以做一些事情来避免机器级别的故障:

关注远控报错,有问题及时迁移实例报修

监控系统日志,提前发现故障机器。有一些硬件故障不会导致立即宕机,单是个定时炸弹,这些信息会被记录到系统日志,如 message,mcelog 中,对这些日志增加监控,可以提前发现有故障隐患的机器,提前迁移数据库实例,避免宕机影响服务。

控制机器过比率,发现现在厂商对过保故障控制的特别到位,一过保,机器故障率里面飙升,所以我们也对机器的过保情况进行了统计,避免重点业务部署在已过保的机器上。

新的计划

日常操作自动化之后,业务开发效率提高同时 DBA 也可以省去之前大量的重复劳动,可以有更多的精力来提高服务质量以及研究写新的技术。以上就是我们 HULK 平台 MySQL 服务的一些设计思路和实践经验。

Q&A

Q1:未来计划的数据库的迁库操作是怎样的?是不是开发人员可以很简单地进行操作?

A1:数据迁移是想实现从自建的或者非标准的数据源将数据迁移到我们标准的平台上来,并且尽量不影响源数据库的使用。计划是做成一个通用服务,业务人员之需填写数据源和目的的相关配置即可。

Q2: 能详细说明一下 dts 实现当时么,尤其对于大数据库?

A2: DTS 还在开发中,后面有机会和大家交流。

Q3: 请问你们有做 SQL 操作日志审计吗,是如何扑获 MySQL 执行的所有 sql 语句的?

A3: 我们全量的 SQL 日志是通过 Atlas 收集汇总的,上面也有放 Atlas 的 github 连接,感兴趣的同学可以去看看。

Q4:辛苦了!测试环境和线上环境的打通是怎样做到的,Docker 吗?

A4: 我们这边在 HULK 平台上通过业务的方式来关联服务,同一个业务可以在自己的线上环境和测试环境之间做迁移,DBA 这边直接通过管理账号后台打通权限。

Q5: 请问数据库实例是安装在哪里呢, 一台物理机如何部署多个 mysql 实例?

A5: 数据库实例是部署在物理机上的,一台物理机部署多个 MySQL 实例,可以配置多个配置文件,设置不同的数据目录即可。

Q6:每天 100 多万的订单在 mysql 库上如何做,如分片,分库如果分片,分多少合适?

A6: 这个得根据实际情况来分析,现在硬件性能提升很快,不分片也能抗很大的请求,具体分片需要根据实际的数据量、访问量、瞬间并发量、机器性能等等来设计。

Q7:“其中数据库服务又集合了 MySQL、Redis、Mongodb、Greenplum、ElasticSearch 等”,请问能否介绍下各类数据库的应用情况?

A7: Redis 前面有过分享,大家可以看看历史文章;MongoDB 后面我们准备也有一起分享,先留点悬念。

《千亿级高性能 KV 存储生态圈-如何应对4000亿的日访问量?》

《大容量类 Redis 存储 -- 有关 pika 的一切》

《CRUG北京活动-Pika首秀》

Q8:如何设置主从数据库?系统升级中包括 schema chang,如何保证不宕机

A8: 主从配置这个资料挺多,我就不在这里赘述了,系统升级这个我分享前面有介绍我们的故障切换,可以重温下 [呲牙]。

Q9: 老师请教一下:我们公司的私有云只提供虚拟机,虚拟机里装 mysql 这种方式可行否?

A9:虚拟机里装 MySQL 也是 OK 的,不过需要注意的是同一宿主机的虚拟机可能会竞争公共资源等等。

Q10:老师好,多实例跑在一起,如何控制资源分配,如果某一实例资源消耗过高,影响其他实例?请教下怎么做同一个主机室上不同实例的硬件资源调的调配?

A10: 资源隔离大家可以了...

从零开始搭建腾讯云上的SpringBoot容器化应用 行业视频课程

img

颜香魔

关注

更多腾讯海量技术文章,请关注云+社区:https://cloud.tencent/developer

作者:李想

由于最近容器技术的火热,各大云计算厂商都已经提供了独立的容器服务,腾讯云也不例外。腾讯云容器服务的官方文档提供了一个基于Node.js的简单案例供大家上手,考虑到官方的文档并没有提供基于Java的上手教程,再加上容器/微服务技术在Java领域的各种衍生开源组件--如SpringCloud家族的各种神器应用极其广泛,今天有空拿一个简单的带增删改查接口功能的SpringBoot应用外接腾讯云CDB for MySQL来把玩容器服务,正好以此来演示如何从零开始在腾讯云上搭建基于SpringBoot的容器化应用。关于为啥选用SpringBoot框架,我想原因也不必多说,主要还是因为其本身就是一个为容器而生的框架,自带Tomcat服务器而且能以极简的配置构建web服务(相对于SpringMVC而言)。

这里以一个提供用户管理的微服务为例进行搭建,为了简化步骤仅考虑用户数据的增删改查功能不考虑实际业务逻辑。微服务本身基于SpringBoot框架,数据库保存在腾讯云CDB for MySQL上,同时利用Spring的JPA作为ORM框架,最终发布可以对用户数据进行增删改查的Restful接口。

1. 创建SpringBoot 项目

IntelliJ Idea默认可以创建SpringBoot应用,新建项目里面选择Spring Initializer。

创建SpringBoot项目

修改对应的名字,我们这里就叫UserProvider

项目配置

修改项目的组织架构如图所示,各部分功能如下:

Controller/UserProviderController.java: HTTP请求的监听入口,为了简化程序不再写Service层,直接调用DAO层

DAO/UserInfoDao.java: DAO层,直接使用JPA实现

Model/UserProviderApplication.java: entity层,映射到数据库,为了简化程序只定义了名字,年龄,性别几个字段

项目组织架构

代码本身不再做过多的解释,都是最基础的SpringBoot代码,大家可以从下面的地址获取代码。https://github/xianl/UserProvider

需要提到的是application.yml文件和项目根目录下的MAVEN配置文件pom.xml。

application.yml 中通过${userprovider_mysql} 来获取环境变量中配置好的数据库地址传给jdbc,后面会演示如何通过腾讯云的容器服务来传入这个参数到容器内。

server:port: 8090spring:jpa:hibernate:ddl-auto: createdatasource:url: jdbc:mysql://${userprovider_mysql}/userdbusername: springuserpassword: Test01!info:app:name: @project.artifactId@encoding: @project.build.sourceEncoding@java:source: @java.version@target: @java.version@

pom.xml 需要引入JPA和mysql的依赖包,同时加入docker-maven-plugin用于直接打包生成docker镜像。

org.springframework.bootspring-boot-starter-data-jpamysqlmysql-connector-javaorg.springframework.bootspring-boot-maven-plugincom.spotifydocker-maven-pluginuserproviderjava["java", "-jar", "/${project.build.finalName}.jar"]/${project.build.directory}${project.build.finalName}.jar

首先在本地进行调试,创建userdb数据库并赋予用户springuser对数据库的访问权限。同时需要设置本地环境变量userprovider_mysql的值为127.0.0.1。

mysql> create database userdb;Query OK, 1 row affected (0.00 sec)mysql> create user 'springuser'@'%' identified by 'Test01!';Query OK, 0 rows affected (0.00 sec)mysql> grant all on userdb.* to 'springuser'@'%';Query OK, 0 rows affected (0.00 sec)

访问本地的8090端口,调用add接口插入一条数据,再次通过Users接口可以获取之前插入的数据。表明程序本身没有问题,本地调试成功之后可以进行后续的操作。

本地调试

2. 生成docker镜像并上传到腾讯云镜像仓库

在一台安装好git+java+maven+docker的Linux主机上执行下面的命令生成docker镜像。由于我们的application.yml文件需要读取环境变量来获取数据库的地址,所以我们在打包jar包和docker镜像的时候需要指定参数-DskipTests,否则在测试的时候会报数据库连接的错误。

cd /optgit clone https://github/xianl/UserProvider.gitcd UserProvidermvn clean package docker:build -DskipTests

执行docker images 可以看到刚才生成的userprovider镜像。

[root@VM_1_13_centos ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEuserprovider latest 53cdf5acf3a4 2 hours ago 673.6 MBdocker.io/java latest d23bdf5b1b1b 11 months ago 643.1 MB

腾讯云的镜像仓库服务是包含在容器服务内而不像其他云厂商专门列出一项服务,使用前需要先开通。

开通镜像服务

通之后按照惯例先login再打tag最后上传。

[root@VM_1_13_centos UserProvider]# docker login --username=xxxxxxxxx ccr.ccs.tencentyunPassword:Login Succeeded[root@VM_1_13_centos UserProvider]# docker tag userprovider:latest ccr.ccs.tencentyun/mydocker/userimage:0.0.1[root@VM_1_13_centos UserProvider]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEccr.ccs.tencentyun/mydocker/userimage 0.0.1 53cdf5acf3a4 13 minutes ago 673.6 MBuserprovider latest 53cdf5acf3a4 13 minutes ago 673.6 MBdocker.io/java latest d23bdf5b1b1b 11 months ago 643.1 MB[root@VM_1_13_centos UserProvider]# docker push ccr.ccs.tencentyun/mydocker/userimage:0.0.1The push refers to a repository [ccr.ccs.tencentyun/mydocker/userimage]04e86a77317a: Pushed35c20f26d188: Pushedc3fe59dd9556: Pushed6ed1a81ba5b6: Pusheda3483ce177ce: Pushedce6c8756685b: Pushed30339f20ced0: Pushed0eb22bfb707d: Pusheda2ae92ffcd29: Pushed0.0.1: digest: sha256:30361f7235797976d196473374a4b16c39fe614753d1801b329be7ea55a7e6fa size: 2212

登录管理界面也能看到刚才上传的userimage镜像。

镜像列表

3. 搭建容器群集并部署服务

腾讯云上的容器集群搭建非常之简单,可以任意添加新建的节点甚至已有的CVM虚拟机。具体步骤我这里不再赘述,官方文档上写的都很清楚大家可以查看。

群集管理

同时我们在容器集群所在的VPC内部再建立一台Mysql数据库,按照之前处理本地数据库的步骤同样创建userdb数据库和用户springuser,数据库的内网地址为10.98.1.9,后面我们需要把这个地址传进容器服务里。

MySQL实例

对于k8s集群,一般来说我们可以使用kubectl来下发如下的yml文件来进行部署,yml文件中主要指定了镜像的地址,端口号以及我们需要配置的环境变量等。

---apiVersion: apps/v1beta1kind: Deploymentmetadata:name: userproviderspec:replicas: 1template:metadata:labels:app: userproviderspec:containers:- name: userproviderimage: ccr.ccs.tencentyun/mydocker/userimage:0.0.1ports:- containerPort: 8090env:- name: userprovider_mysqlvalue: 10.98.1.9---apiVersion: v1kind: Servicemetadata:name: userproviderspec:type: NodePortports:- nodePort: 30010port: 8090targetPort: 8090selector:app: userprovider

腾讯云容器服务为用户提供了更为方便的操作方法,只需在添加服务界面进行一定配置就能进行服务部署,等于是把ymal文件的配置做了可视化,减轻了用户的工作量。

注意一下环境变量的部分,我们这里指定了userprovider_mysql为我们内网数据库的地址10.98.1.9。

新建容器服务

因为我们选取了发布服务到公网,系统会自动创建LB将公网端口8080映射到容器的服务端口8090, 查看LB详情可以看到自动生成的域名。

LB详情

通过访问绑定的域名的8080端口,接口测试成功。

通过LB接口测试

总结

从上面的测试步骤可以看到,腾讯云的容器服务从最大程度上做到了人性化,用户甚至可以在完全不用登陆群集节点的情况下快速进行容器服务部署。同时腾讯云容器服务本身就是基于k8s做服务编排并兼容kubernetes标准API,又使得其通用性和易用性更强。本例提供的生成镜像的方法还是以手动为主,在客户的实际环境中如果结合Jenkins等CI/CD的工具就能够进一步提高效率和自动化程度。另外本文未提及的日志管理、监控告警功能也能为用户提供更多的便利,使开发人员将时间更多的投入在业务逻辑本身,也使运维人员能更多的把时间投入在应用本身的异常上面。

「腾讯云CDB」MySQL审计功能大揭秘 流量视频课程

img

efg222

关注

更多腾讯海量技术文章,请关注云加社区:https://cloud.tencent/developer

作者:腾讯云数据库内核团队

什么是数据库审计

对于一个仓库,如果要防盗, 常见做法是出入口全装上监控,一旦有问题了,调监控查找异常情况。对数据库来说也类似,数据库也有出入口,对所有连接出入口监控,记录下所有动作,一旦有问题了,查询历史动作,找到关键信息。如果仓库中的东西价值高,损失已经造成,监控只是事后诸葛,所以往往请专业人士在巡逻防盗,防止偷盗发生。同样数据库审计也有更专业的手段,sql阻断,在动作发生前,对动作行为分析,如果判断符合预先设置的高危动作,直接中止执行,防止对数据造成破坏。

审计定义:能够实时记录网络上的数据库活动,对数据库遭受到的风险行为进行告警,对攻击行为进行阻断

常见的审计方式

应用层审计

在应用系统中直接审计,语句还没往数据库后台发就先做了审计,不影响数据库性能,对底层用的是什么数据库也不关心,但对应用系统压力比较大,并且应用系统需要解析语句,有一定复杂度。

传输层审计

往往抓包解析实现,对上下层都没什么影响,但同样要解析语句,有一定复杂度,并且如果传输层是通过加密通讯,将无法解析。

插件审计

对于开源数据库,通常都有提供插件方式增加功能。审计可以以插件直接嵌在内核上,当然会对数据库性能有一定影响,但同样因为直接嵌在内核,很多一手信息能直接拿到,比方说上面没办法回避的语法解析就不用做,而且还能直接拿更多的运行态信息,能开发功能强大又灵活的审计功能。

内核审计

直接在内核上实现,所有功能都能实现,也能将性能影响降到最低,但是对后台稳定性会有影响,对开发人员要求高,不管是开源还是非开源数据库,都会非常慎重考虑直接在内核上支持审计。

oracle审计简介

谈到数据库审计,不能不提oracle,oracle 数据库的审计功能有10多年甚至更长的历史了,对数据库sql审计功能影响深远,几乎任何数据库审计都会参考,下面我们简单了解下oracle审计。Oracle中审计总体上可分为“标准审计”和“细粒度审计”,标准审计包含语句审计,权限审计,对象审计,细粒度审计也称为“基于政策的审计”:

审 计 类 型

说 明

语句审计

按照语句类型审计SQL语句.而不论访问何种特定的模式对象。也可以在数据库中指定一个或多个用户,针对特定的语句审计这些用户

权限审计

审计系统权限,例如GRANT。和语句审计一样,权限审计可以指定一个或多个特定的用户作为审计的目标

对象审计

审计特定模式对象上运行的特定语句(例如,DEPARTMENTS表上的UPDATE语句)。模式对象审计总是应用于数据库中的所有用户

细粒度的审计

根据访问对象的内容来审计表访问和权限。使用程序包DBMS_FGA来建立特定表上的策略

默认情况下审计是关闭的,因为开启性能影响大,需要设置一些参数打开它,审计记录结果既可以放文件也可以放系统表中。那么怎么配置需要审计的内容呢?oracle提供了一套审计配置语法来做这事,audit/noaudit,审计和取消审计,是互逆的,如下所示:

图1

图2

示例如下:

// 审计u1.t2这个表的update 不成功的语句

audit update on u1.t2 by access whenever not successful;

// 审计u1.t2这个表的update 成功的语句

audit update on u1.t2 by access whenever successful;

运算式:f+s=a 连续运行上面两个配置语句,等价审计全部

// 审计u1.t2表update全部语句,全部包括两种,成功和失败

audit update on u1.t2 by access;

// 不审计u1.t2表update成功的语句

noaudit update on u1.t2 by access whenever successful;

运算式:a-s=f 连续运行上面两个配置语句,等价只审计失败语句

a:all,全部

f:fail,失败

s:success,成功

这就是oracle审计配置语法用法,配置完成后就能审计到相应的语句,它的成功、失败、全部是存在运算关系的。如何查询比较简单,直接查询相关表就行,不再介绍。

mysql审计插件

前文提到,插件是数据库实现审计功能的常见手段,mysql上也有不少审计插件,比较有名的Macfee插件,官方audit plugin,mariadb audit plugin,Percona audit plugin。

从功能上来说,这几个插件大同小异,只是展示的审计内容和格式略有差异。从性能上来说,除了macfee插件外,其它几个性能相差不多,宣称都是15%左右影响,macfee则可能达到50%或更多。实际上,确定一个测试性能损失的标准场景是需要商榷的,跑非常简单的语句,几十万Qps,性能影响肯定大,审计性能消耗和语句量直接关联,跑OLAP查询,几秒甚至几十秒执行一个语句,审计性能影响可以说没有,所以审计性能损失得看具体场景。

从实现方式来说,这几个插件也差不太多,从thd对象中取到所需要的属性,按一定规则过滤,按某种策略存盘,以json或xml等格式展示审计结果。

mysql审计接口详细分析

从5.5开始,mysql内核中已经增加了一套的对服务器操作的审计机制的接口,添加了额外的审计流程来对我们所关心的地方进行事件捕获,如果要对服务器进行审计,只要基于这些完善一个插件即可。mysql审计接口官方第一次是提交到代码是2009年底,历史也比较悠久了,修改和增加的文件并不多,几个关键点介绍下。

在plugin.h中增加一个新的宏 MYSQL_AUDIT_PLUGIN 用来标识一类全新的插件类型:AUDIT插件

增加了一个新的头文件:plugin_audit.h,里面有审计相关的关键的结构体及一些宏定义,如下: mysql_event_general结构,query信息结构,对应非登陆相关的动作,如执行一个语句select或一个命令exit。

struct mysql_event_general{unsigned int event_subclass; //子事件类型int general_error_code; //错误码 unsigned long general_thread_id; //线程号const char *general_user; //用户名unsigned int general_user_length; //长度const char *general_command; //命令,如connect,query,shutdown等,error类型存错误,其它为nullunsigned int general_command_length;const char *general_query; //sql语句 unsigned int general_query_length;struct charset_info_st *general_charset; //字符集unsigned long long general_time; //时间戳unsigned long long general_rows; //行计数器MYSQL_LEX_STRING general_host; //来自主机,如localhostMYSQL_LEX_STRING general_sql_command; //操作类型,如selectMYSQL_LEX_STRING general_external_user; // external 用户MYSQL_LEX_STRING general_ip; //ip地址};mysql_event_connection,连接信息结构,对应登陆登出动作

struct mysql_event_connection{unsigned int event_subclass;int status; //错误码unsigned long thread_id;const char *user;unsigned int user_length;const char *priv_user;unsigned int priv_user_length;const char *external_user;unsigned int external_user_length;const char *proxy_user;unsigned int proxy_user_length;const char *host;unsigned int host_length;const char *ip;unsigned int ip_length;const char *database; //数据库名unsigned int database_length;};所有动作都可以用这两个结构来描述,但是并不是说就能满足全部需求,比方说,对general动作,我想知道语句是针对哪些表的,执行了多长时间,无法得到,对于connect动作,我想知道是什么时间发生的,无从得知,这肯定是不够的,仍需我们去继续丰富功能点。

几个关键的宏定义:

#define MYSQL_AUDIT_GENERAL_CLASS 0 //general动作#define MYSQL_AUDIT_GENERAL_LOG 0 //log时,语句execute前#define MYSQL_AUDIT_GENERAL_ERROR 1 //error时,反馈用户前 #define MYSQL_AUDIT_GENERAL_RESULT 2 //结果集返回后#define MYSQL_AUDIT_GENERAL_STATUS 3 //审计流程结束状态#define MYSQL_AUDIT_CONNECTION_CLASS 1 //connect动作#define MYSQL_AUDIT_CONNECTION_CONNECT 0 //连接#define MYSQL_AUDIT_CONNECTION_DISCONNECT 1 //断开#define MYSQL_AUDIT_CONNECTION_CHANGE_USER 2 //切换用户3. 核心功能实现代码:sql_auditc.h,sql_audit.cc,初始化,回收,以及最重要的取出thd对象有效值等一系列动作均在此完成。

在sql_auditc.h中,定义了两个内联函数和三个宏,功能是获取到thd对象中有用值,如用户名,数据库名,时间,sql内容等所需要信息,以参数的形式传给下一层接口。每个动作,都会从这里获取原始信息,会频繁调用这几个函数,所以使用了宏和内联函数来提高性能。

在sql_audit.cc中,除了审计插件初始化,回收外,最重要的功能获得操作原始信息,在这里实现了函数获得上面sql_auditc.h中通过参数形式传入的有用信息,并存入mysql_event_general和mysql_event_connection结构。

4. mysql其它一些连接、插入、解析、日志等接口也增加了审计入口函数。如mysqld.cc、sql_parse.cc等文件中函数增加了审计入口。

审计执行流程简介

登陆登出流程

#0 audit_null_notify (thd=0x7fdcc7ff6000, event_class=0, event=0x7fdd45440cb0) at /mysql56/plugin/audit_null/audit_null.c:99#1 0x0000000000683f22 in plugins_dispatch (thd=0x7fdcc7ff6000, event_subtype=<value optimized out>, ap=<value optimized out>) at /mysql56/sql/sql_audit.cc:455#2 event_class_dispatch (thd=0x7fdcc7ff6000, event_subtype=<value optimized out>, ap=<value optimized out>) at /mysql56/sql/sql_audit.cc:491#3 general_class_handler(THD *, uint, typedef __va_list_tag __va_list_tag *) (thd=0x7fdcc7ff6000, event_subtype=<value optimized out>, ap=<value optimized out>)at /mysql56/sql/sql_audit.cc:90#4 0x00000000006841b1 in mysql_audit_notify (thd=0x7fdcc7ff6000, event_class=0, event_subtype=0) at /mysql56/sql/sql_audit.cc:217#5 0x000000000063e7cb in mysql_audit_general_log (thd=0x7fdcc7ff6000, cmd=0xc76b64 "Connect", cmdlen=7, query_str=<value optimized out>, query_len=<value optimized out>)at /mysql56/sql/sql_audit.h:125#6 0x000000000063ea5a in log_command (thd=<value optimized out>, command=<value optimized out>, format=0xc6d27b "%s@%s on %s") at /mysql56/sql/log.cc:2094#7 general_log_print (thd=<value optimized out>, command=<value optimized out>, format=0xc6d27b "%s@%s on %s") at /mysql56/sql/log.cc:2122#8 0x0000000000682030 in acl_authenticate (thd=0x7fdcc7ff6000, com_change_user_pkt_len=<value optimized out>) at /mysql56/sql/sql_acl.cc:11244#9 0x00000000006a8ad0 in check_connection (thd=0x7fdcc7ff6000) at /mysql56/sql/sql_connect.cc:685#10 0x00000000006a8d97 in login_connection (thd=0x7fdcc7ff6000) at /mysql56/sql/sql_connect.cc:754#11 thd_prepare_connection (thd=0x7fdcc7ff6000) at /mysql56/sql/sql_connect.cc:914#12 0x00000000006a9119 in do_handle_one_connection (thd_arg=<value optimized out>) at /mysql56/sql/sql_connect.cc:983#13 0x00000000006a91c2 in handle_one_connection (arg=<value optimized out>) at /mysql56/sql/sql_connect.cc:906#14 0x0000000000939337 in pfs_spawn_thread (arg=0x7fdccb3be840) at /mysql56/storage/perfschema/pfs.cc:1860#15 0x00007fdd46a249d1 in start_thread () from /lib64/libpthread.so.0#16 0x00007fdd459a38fd in clone () from /lib64/libc.so.6登陆如上所示,登陆时在do_handle_one_connection 中循环等待连接,有请求过来时再到准备连接,再到权限认证检查,最在log_command中进入审计接口,准备审计相关动作。

#0 audit_null_notify (thd=0x7fdcc7eb0000, event_class=1, event=0x7fdd46ca0b40) at /mysql56/plugin/audit_null/audit_null.c:99#1 0x0000000000684402 in plugins_dispatch (thd=0x7fdcc7eb0000, event_subclass=<value optimized out>, ap=<value optimized out>) at /mysql56/sql/sql_audit.cc:455#2 event_class_dispatch (thd=0x7fdcc7eb0000, event_subclass=<value optimized out>, ap=<value optimized out>) at /mysql56/sql/sql_audit.cc:491#3 connection_class_handler(THD *, uint, typedef __va_list_tag __va_list_tag *) (thd=0x7fdcc7eb0000, event_subclass=<value optimized out>, ap=<value optimized out>)at /mysql56/sql/sql_audit.cc:114#4 0x00000000006841b1 in mysql_audit_notify (thd=0x7fdcc7eb0000, event_class=1, event_subtype=1) at /mysql56/sql/sql_audit.cc:217#5 0x000000000057bb53 in close_connection (thd=0x7fdcc7eb0000, sql_errno=0) at /mysql56/sql/mysqld.cc:2634#6 0x00000000006a90b2 in do_handle_one_connection (thd_arg=<value optimized out>) at /mysql56/sql/sql_connect.cc:996#7 0x00000000006a91c2 in handle_one_connection (arg=<value optimized out>) at /mysql56/sql/sql_connect.cc:906#8 0x0000000000939337 in pfs_spawn_thread (arg=0x7fdccb3be7a0) at /mysql56/storage/perfschema/pfs.cc:1860#9 0x00007fdd46a249d1 in start_thread () from /lib64/libpthread.so.0#10 0x00007fdd459a38fd in clone () from /lib64/libc.so.6登出时相对简单,在close_connection中增加了审计动作。

query审计流程执行前

#0 audit_null_notify (thd=0x7fdcc7ff6000, event_class=0, event=0x7fdd45440da0) at /mysql56/plugin/audit_null/audit_null.c:99#1 0x0000000000683f22 in plugins_dispatch (thd=0x7fdcc7ff6000, event_subtype=<value optimized out>, ap=<value optimized out>) at /mysql56/sql/sql_audit.cc:455#2 event_class_dispatch (thd=0x7fdcc7ff6000, event_subtype=<value optimized out>, ap=<value optimized out>) at /mysql56/sql/sql_audit.cc:491#3 general_class_handler(THD *, uint, typedef __va_list_tag __va_list_tag *) (thd=0x7fdcc7ff6000, event_subtype=<value optimized out>, ap=<value optimized out>)at /mysql56/sql/sql_audit.cc:90#4 0x00000000006841b1 in mysql_audit_notify (thd=0x7fdcc7ff6000, event_class=0, event_subtype=0) at /mysql56/sql/sql_audit.cc:217#5 0x000000000063e7cb in mysql_audit_general_log (thd=0x7fdcc7ff6000, cmd=0xc76b19 "Query", cmdlen=5, query_str=<value optimized out>, query_len=<value optimized out>)at /mysql56/sql/sql_audit.h:125#6 0x000000000063e93e in log_command (thd=0x7fdcc7ff6000, com...

阿里云服务器修改密码/怎么修改mysql/ftp密码 推广视频课程

img

wwy111

关注

    申请开通的阿里云免费主机怎么管理?默认的密码都是没有或者是随机的怎么修改呢,本经验截图给您介绍

   登陆万网/阿里云账号,进入会员中心---我的主机   如图,点击免费主机后方的管理

首次使用密码初始化对于第一次登陆使用主机会提示密码初始化,配置ftp  mysql等管理密码

账号安全设置账号安全配置有手机验证和邮箱验证,咗嚛推荐手机验证这样对于以后找回密码也有帮助

账号安全设置好之后,进入管理控制页面即可进行管理,注意右下角的 有账号密码显示

免费虚拟主机访问域名会提示一个测试页面,需要备案解析之后才能显示页面

登陆万网会员账号,点击个人中心我的主机菜单

进入个人会员中心,主机管理 可以看到购买的虚拟主机产品,点击后面的【管理】

如图,点击后面需要修改的账号密码,重置密码输入新密码即可

腾讯云推出每月12元的MySQL 5.6云数据库入门机型 营销视频课程

img

Webb

关注

腾讯云宣布推出每月12元的MySQL 5.6版数据库入门机型,从现在起到2018年6月12日以前售价都是12元。 这是腾讯为数据库团队打造的一款适用于入门、学习、培训,生产前测试、小规模业务系统的产品。同时也具备管理和扩展,主从实时热备,自动容灾、备份、恢复、监控、迁移等数据库全套功能。用不到点一份外卖的价格就可以轻松构建数据库,省去了采购设备和配置硬件与系统的麻烦。

活动时间:即日起至2018年6月12日结束。

产品定价:阶梯定价,12元/月起,购买时间越长越便宜,最低8元/月。

续费升级:续费每月也享受12元/月的活动价,升级则需按官网刊例价进行计费,续费和升级可以在控制台上完成

退费说明:由于该产品价格过低,暂不支持退费申请

数据库版本仅支持MySQL5.6 ,暂不支持版本升级。复制方式默认为异步复制。

由于是入门型规格,所以暂不支持添加只读实例、灾备实例、审计功能、半同步、强同步、多可用区部署、加密。若需要支持,可以通过升级实例规格来实现。

自建MySQL和阿里云RDS的区别 有必要使用云数据库吗? 行业视频课程

img

颜雪珊

关注

很多阿里云ECS用户都会考虑是使用ECS自建数据库还是使用阿里云的RDS云数据库,如何选择?有必要使用云数据库吗?阿里云百科网告诉你使用阿里云RDS云数据库的理由:

RDS的高可用性

RDS提供了主备双节点的实例,双节点可以在同一地域的不同可用区,MySQL实例的双节点还可以在不同地域,当主实例出现故障时可快速切换到备实例,保障了RDS的稳定性。

RDS的高安全性

RDS在数据的存取上加入了中间层,所有请求都会经过中间层,而且有SQL注入的请求都会被中间层拦截掉。在底层数据写入上,RDS采用了最高安全级别的写入,保证在主机异常掉电的情况下数据不会出现丢失。以此来保障数据库的高安全性。

阿里云RDS数据库优势

RDS运维优化

用户无需考虑数据库运维成本,企业无需配备专业的DBA数据库运维,阿里云提供监控、告警、备份、恢复、调优手段,RDS源码团队持续对MySQL进行源码优化,在标准的基准测试中性能和稳定性上都是高于社区版本的。

MySQL读写分离

读写分离适用于对数据库有少量写请求,但有大量读请求的应用场景下,阿里云MySQL 5.6高可用版或金融版可以开通读写分离功能,RDS用户无需为读写分离技术买单。

综上,阿里云RDS的优势在于为用户提供高可用性、高安全性的云数据库服务,用户不用操心数据库的运维、安全以及调优问题,企业将数据库问题交给阿里云专业的RDS团队,告别技术壁垒,花少量钱解决更多问题。

从零开始搭建腾讯云上的SpringBoot容器化应用 互联网视频课程

img

灵松

关注

更多腾讯海量技术文章,请关注云+社区:https://cloud.tencent/developer

作者:李想

由于最近容器技术的火热,各大云计算厂商都已经提供了独立的容器服务,腾讯云也不例外。腾讯云容器服务的官方文档提供了一个基于Node.js的简单案例供大家上手,考虑到官方的文档并没有提供基于Java的上手教程,再加上容器/微服务技术在Java领域的各种衍生开源组件--如SpringCloud家族的各种神器应用极其广泛,今天有空拿一个简单的带增删改查接口功能的SpringBoot应用外接腾讯云CDB for MySQL来把玩容器服务,正好以此来演示如何从零开始在腾讯云上搭建基于SpringBoot的容器化应用。关于为啥选用SpringBoot框架,我想原因也不必多说,主要还是因为其本身就是一个为容器而生的框架,自带Tomcat服务器而且能以极简的配置构建web服务(相对于SpringMVC而言)。

这里以一个提供用户管理的微服务为例进行搭建,为了简化步骤仅考虑用户数据的增删改查功能不考虑实际业务逻辑。微服务本身基于SpringBoot框架,数据库保存在腾讯云CDB for MySQL上,同时利用Spring的JPA作为ORM框架,最终发布可以对用户数据进行增删改查的Restful接口。

1. 创建SpringBoot 项目

IntelliJ Idea默认可以创建SpringBoot应用,新建项目里面选择Spring Initializer。

创建SpringBoot项目

修改对应的名字,我们这里就叫UserProvider

项目配置

修改项目的组织架构如图所示,各部分功能如下:

Controller/UserProviderController.java: HTTP请求的监听入口,为了简化程序不再写Service层,直接调用DAO层

DAO/UserInfoDao.java: DAO层,直接使用JPA实现

Model/UserProviderApplication.java: entity层,映射到数据库,为了简化程序只定义了名字,年龄,性别几个字段

项目组织架构

代码本身不再做过多的解释,都是最基础的SpringBoot代码,大家可以从下面的地址获取代码。https://github/xianl/UserProvider

需要提到的是application.yml文件和项目根目录下的MAVEN配置文件pom.xml。

application.yml 中通过${userprovider_mysql} 来获取环境变量中配置好的数据库地址传给jdbc,后面会演示如何通过腾讯云的容器服务来传入这个参数到容器内。

server:port: 8090spring:jpa:hibernate:ddl-auto: createdatasource:url: jdbc:mysql://${userprovider_mysql}/userdbusername: springuserpassword: Test01!info:app:name: @project.artifactId@encoding: @project.build.sourceEncoding@java:source: @java.version@target: @java.version@

pom.xml 需要引入JPA和mysql的依赖包,同时加入docker-maven-plugin用于直接打包生成docker镜像。

org.springframework.bootspring-boot-starter-data-jpamysqlmysql-connector-javaorg.springframework.bootspring-boot-maven-plugincom.spotifydocker-maven-pluginuserproviderjava["java", "-jar", "/${project.build.finalName}.jar"]/${project.build.directory}${project.build.finalName}.jar

首先在本地进行调试,创建userdb数据库并赋予用户springuser对数据库的访问权限。同时需要设置本地环境变量userprovider_mysql的值为127.0.0.1。

mysql> create database userdb;Query OK, 1 row affected (0.00 sec)mysql> create user 'springuser'@'%' identified by 'Test01!';Query OK, 0 rows affected (0.00 sec)mysql> grant all on userdb.* to 'springuser'@'%';Query OK, 0 rows affected (0.00 sec)

访问本地的8090端口,调用add接口插入一条数据,再次通过Users接口可以获取之前插入的数据。表明程序本身没有问题,本地调试成功之后可以进行后续的操作。

本地调试

2. 生成docker镜像并上传到腾讯云镜像仓库

在一台安装好git+java+maven+docker的Linux主机上执行下面的命令生成docker镜像。由于我们的application.yml文件需要读取环境变量来获取数据库的地址,所以我们在打包jar包和docker镜像的时候需要指定参数-DskipTests,否则在测试的时候会报数据库连接的错误。

cd /optgit clone https://github/xianl/UserProvider.gitcd UserProvidermvn clean package docker:build -DskipTests

执行docker images 可以看到刚才生成的userprovider镜像。

[root@VM_1_13_centos ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEuserprovider latest 53cdf5acf3a4 2 hours ago 673.6 MBdocker.io/java latest d23bdf5b1b1b 11 months ago 643.1 MB

腾讯云的镜像仓库服务是包含在容器服务内而不像其他云厂商专门列出一项服务,使用前需要先开通。

开通镜像服务

通之后按照惯例先login再打tag最后上传。

[root@VM_1_13_centos UserProvider]# docker login --username=xxxxxxxxx ccr.ccs.tencentyunPassword:Login Succeeded[root@VM_1_13_centos UserProvider]# docker tag userprovider:latest ccr.ccs.tencentyun/mydocker/userimage:0.0.1[root@VM_1_13_centos UserProvider]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEccr.ccs.tencentyun/mydocker/userimage 0.0.1 53cdf5acf3a4 13 minutes ago 673.6 MBuserprovider latest 53cdf5acf3a4 13 minutes ago 673.6 MBdocker.io/java latest d23bdf5b1b1b 11 months ago 643.1 MB[root@VM_1_13_centos UserProvider]# docker push ccr.ccs.tencentyun/mydocker/userimage:0.0.1The push refers to a repository [ccr.ccs.tencentyun/mydocker/userimage]04e86a77317a: Pushed35c20f26d188: Pushedc3fe59dd9556: Pushed6ed1a81ba5b6: Pusheda3483ce177ce: Pushedce6c8756685b: Pushed30339f20ced0: Pushed0eb22bfb707d: Pusheda2ae92ffcd29: Pushed0.0.1: digest: sha256:30361f7235797976d196473374a4b16c39fe614753d1801b329be7ea55a7e6fa size: 2212

登录管理界面也能看到刚才上传的userimage镜像。

镜像列表

3. 搭建容器群集并部署服务

腾讯云上的容器集群搭建非常之简单,可以任意添加新建的节点甚至已有的CVM虚拟机。具体步骤我这里不再赘述,官方文档上写的都很清楚大家可以查看。

群集管理

同时我们在容器集群所在的VPC内部再建立一台Mysql数据库,按照之前处理本地数据库的步骤同样创建userdb数据库和用户springuser,数据库的内网地址为10.98.1.9,后面我们需要把这个地址传进容器服务里。

MySQL实例

对于k8s集群,一般来说我们可以使用kubectl来下发如下的yml文件来进行部署,yml文件中主要指定了镜像的地址,端口号以及我们需要配置的环境变量等。

---apiVersion: apps/v1beta1kind: Deploymentmetadata:name: userproviderspec:replicas: 1template:metadata:labels:app: userproviderspec:containers:- name: userproviderimage: ccr.ccs.tencentyun/mydocker/userimage:0.0.1ports:- containerPort: 8090env:- name: userprovider_mysqlvalue: 10.98.1.9---apiVersion: v1kind: Servicemetadata:name: userproviderspec:type: NodePortports:- nodePort: 30010port: 8090targetPort: 8090selector:app: userprovider

腾讯云容器服务为用户提供了更为方便的操作方法,只需在添加服务界面进行一定配置就能进行服务部署,等于是把ymal文件的配置做了可视化,减轻了用户的工作量。

注意一下环境变量的部分,我们这里指定了userprovider_mysql为我们内网数据库的地址10.98.1.9。

新建容器服务

因为我们选取了发布服务到公网,系统会自动创建LB将公网端口8080映射到容器的服务端口8090, 查看LB详情可以看到自动生成的域名。

LB详情

通过访问绑定的域名的8080端口,接口测试成功。

通过LB接口测试

总结

从上面的测试步骤可以看到,腾讯云的容器服务从最大程度上做到了人性化,用户甚至可以在完全不用登陆群集节点的情况下快速进行容器服务部署。同时腾讯云容器服务本身就是基于k8s做服务编排并兼容kubernetes标准API,又使得其通用性和易用性更强。本例提供的生成镜像的方法还是以手动为主,在客户的实际环境中如果结合Jenkins等CI/CD的工具就能够进一步提高效率和自动化程度。另外本文未提及的日志管理、监控告警功能也能为用户提供更多的便利,使开发人员将时间更多的投入在业务逻辑本身,也使运维人员能更多的把时间投入在应用本身的异常上面。

img

在线咨询

建站在线咨询

img

微信咨询

扫一扫添加
动力姐姐微信

img
img

TOP