首页> 标签> Go
"Go"
共 12672 条结果
全部 问答 文章 公开课 课程 电子书 技术圈 体验
Kubernetes 服务接入 Istio
Kubernetes 服务接入 IstioIstio 在设计之初,主要面向 Kubernetes 当中的服务。但是在实际场景中,依旧有不少服务部署在 VM 上,Istio 想成为 Service Mesh 事实上的标准,毫无疑问需要支持 VM 部署的服务。Istio1.6 新增了 WorkloadEntry 自定义资源,通过该资源为 VM 提供了一流的支持。Istio1.7 增加了安全引导 VM 中运行的服务的身份的功能。最后,Istio 1.7 增加了 Sidecar 的安装包,以支持 CentOS/Red Hat 和现有的 Debian/Ubuntu。Istio1.8 新增了智能 DNS 代理,它是由 Go 编写的 Istio sidecar 代理,sidecar 上的 Istio agent 将附带一个由 Istiod 动态编程的缓存 DNS 代理。来自应用程序的 DNS 查询会被 pod 或 VM 中的 Istio 代理透明地拦截和服务,该代理会智能地响应 DNS 查询请求,可以实现虚拟机到服务网格的无缝多集群访问。并且 Istio1.8 新增了 WorkloadGroup 自定义资源,该资源是描述部署在 VM 上的服务实例的集合,旨在模仿现有的用于 Kubernetes 工作负载的 Sidecar 注入和 Deployment 规范模型,以引导 Istio 代理。通过 WorkloadGroup 方式, 实现 VM 实例自动注册的功能目前处于 pre-alpha 状态WorkloadEntryWorkloadEntry 用来描述非 Pod 的端点,将 VM 纳入 mesh 中。此时 VM 成为像 Pod 一样的一等公民,可以配置 MUTUAL_TLS。要创建一个 WorkloadEntry 并将其附加到 ServiceEntry,执行以下操作:apiVersion: networking.istio.io/v1alpha3kind: WorkloadEntrymetadata: name: vm1 namespace: ns1spec: address: 1.1.1.1 labels: app: foo instance-id: vm-78ad2 class: vm---apiVersion: networking.istio.io/v1alpha3kind: ServiceEntrymetadata: name: svc1 namespace: ns1spec: hosts: - svc1.internal.com ports: - number: 80 name: http protocol: HTTP resolution: STATIC workloadSelector: labels: app: foo这将创建一个包含一组标签和地址的新 WorkloadEntry,以及一个使用 WorkloadSelector 选择带有所需标签的所有端点的 ServiceEntry,在这种情况下,包括为 VM 创建的 WorkloadEntry。请注意,ServiceEntry 可以使用相同的选择器引用 Pod 和 WorkloadEntries。现在,Istio 可以对 VM 和 Pod 进行相同的处理,而不必将它们分开。VM 自动注册WorkloadGroup 主要用于 WorkloadEntry 自动注册,该功能在实际场景中比较实用。事实上我们部署在 VM 当中的服务,一般都会配置自动伸缩,这就要求我们的服务必须可以自动注册到 mesh 中。如何实现自动注册那?首先我们需要做一些准备工作:在安装 istiod 的时候,启用自动注册的功能。$ istioctl install --set values.pilot.env.PILOT_ENABLE_WORKLOAD_ENTRY_AUTOREGISTRATION=true部署一个 east-west gateway。用于暴露 istiod 服务,从而可以让 VM 上的 Sidecar 可以和 istiod 通信。然后我们创建如下的 WorkloadGroup:apiVersion: networking.istio.io/v1alpha3kind: WorkloadGroupmetadata: name: python-http namespace: vmspec: metadata: annotations: {} labels: app: python-http template: ports: {} serviceAccount: my-vm这样我们在每个 vm 上 python-http 实例启动后,都会自动在 mesh 中创建一个 WorkloadEntry。而创建的 WorkloadEntry,包含了 VM 实例的 ip 和元数据。此时我们就可以创建一个 ServiceEntry,通过标签选择器选择我们的 WorkloadEntry。然后 mesh 中的其他服务就可以通过 ServiceEntry 中的 hosts, 对我们的 python-http 服务进行访问。apiVersion: networking.istio.io/v1beta1kind: ServiceEntrymetadata: name: vm-workload-svc namespace: vmspec: hosts: - vmservice.example.com location: MESH_INTERNAL ports: - number: 80 name: http protocol: HTTP targetPort: 9090 resolution: STATIC workloadSelector: labels: app: python-http关于 VM 详细的安装步骤,参考官方文档。智能 DNS其实完成 VM 自动注册,并不能通过主机名实现虚拟机到服务网格的无缝访问。例如,如果我们在 VM 上部署 Istio sidecar 代理,我们将无法通过主机名(例如 httpbin.default.svc.cluster.local)访问网格和 Kubernetes 集群中服务。此时我们需要智能 DNS。在 Istio 1.8 中,Sidecar 现在具有一个 DNS 代理,该代理缓存网格中的端点和 ServiceEntry 资源创建的端点。通过 Iptables 规则,拦截 dns 请求到 sidecar 本地 dns server,在缓存中可以解析的主机名,则直接返回解析结果,如果找不到,它将作为普通 DNS 代理委派给系统 DNS。这样 vm 上的服务可以通过主机名访问 mesh 中的服务。智能 DNS 默认没有启用,我们在安装 istio 的时候,可以通过如下参数启用该功能:--set meshConfig.defaultConfig.proxyMetadata.ISTIO_META_DNS_CAPTURE=true总结当 VM 连接到 Istio 控制平面时,它通过“东西向网关”进行连接。该网关实际上只是一个专门为网格内部流量指定的 Istio 网关,现在,东西向网关已经是 Istio 1.8 中的推荐部署。一旦从 VM Sidecar 到 Istio 控制平面建立了连接,便会创建适当的 WorkloadEntry 资源,并使 VM Sidecar 可以解析集群中的所有服务。从 VM 上部署服务可以直接访问 httpbin.default.svc.cluster.local。DNS 名称由代理解析,并通过“东西方网关”路由到网格中的适当服务。
文章
缓存  ·  Kubernetes  ·  网络协议  ·  安全  ·  Ubuntu  ·  Linux  ·  Go  ·  Perl  ·  容器
2022-08-11
go的函数计算,想通过替换bootstrap方式进行发版,请问怎么进行替换?
go的函数计算,想通过替换bootstrap方式进行发版,请问怎么进行替换? 我上传了一个bootstrap2,提示上传成功后,不知道上传到哪里去了
问答
前端开发  ·  Serverless  ·  Go
2022-08-11
Go-Excelize API源码阅读(一)——NewFile()
### Go-Excelize API源码阅读(一)——NewFile()开源摘星计划(WeOpen Star) 是由腾源会 2022 年推出的全新项目,旨在为开源人提供成长激励,为开源项目提供成长支持,助力开发者更好地了解开源,更快地跨越鸿沟,参与到开源的具体贡献与实践中。不管你是开源萌新,还是希望更深度参与开源贡献的老兵,跟随“开源摘星计划”开启你的开源之旅,从一篇学习笔记、到一段代码的提交,不断挖掘自己的潜能,最终成长为开源社区的“闪亮之星”。我们将同你一起,探索更多的可能性!项目地址: WeOpen-Star:https://github.com/weopenprojects/WeOpen-Star#### 一、Go-Excelize简介Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准。可以使用它来读取、写入由 Microsoft Excel™ 2007 及以上版本创建的电子表格文档。支持 XLAM / XLSM / XLSX / XLTM / XLTX 等多种文档格式,高度兼容带有样式、图片(表)、透视表、切片器等复杂组件的文档,并提供流式读写 API,用于处理包含大规模数据的工作簿。可应用于各类报表平台、云计算、边缘计算等系统。使用本类库要求使用的 Go 语言为 1.15 或更高版本。#### 二、NewFile()该API的功能是利用默认的模板创建新的 Excel 工作薄,新创建的工作簿中会默认包含一个名为 Sheet1 的工作表。```func NewFile() *File { f := newFile() f.Pkg.Store("_rels/.rels", []byte(xml.Header+templateRels)) f.Pkg.Store(defaultXMLPathDocPropsApp, []byte(xml.Header+templateDocpropsApp)) f.Pkg.Store(defaultXMLPathDocPropsCore, []byte(xml.Header+templateDocpropsCore)) f.Pkg.Store("xl/_rels/workbook.xml.rels", []byte(xml.Header+templateWorkbookRels)) f.Pkg.Store("xl/theme/theme1.xml", []byte(xml.Header+templateTheme)) f.Pkg.Store("xl/worksheets/sheet1.xml", []byte(xml.Header+templateSheet)) f.Pkg.Store(defaultXMLPathStyles, []byte(xml.Header+templateStyles)) f.Pkg.Store(defaultXMLPathWorkbook, []byte(xml.Header+templateWorkbook)) f.Pkg.Store(defaultXMLPathContentTypes, []byte(xml.Header+templateContentTypes)) f.SheetCount = 1 f.CalcChain = f.calcChainReader() f.Comments = make(map[string]*xlsxComments) f.ContentTypes = f.contentTypesReader() f.Drawings = sync.Map{} f.Styles = f.stylesReader() f.DecodeVMLDrawing = make(map[string]*decodeVmlDrawing) f.VMLDrawing = make(map[string]*vmlDrawing) f.WorkBook = f.workbookReader() f.Relationships = sync.Map{} f.Relationships.Store("xl/_rels/workbook.xml.rels", f.relsReader("xl/_rels/workbook.xml.rels")) f.sheetMap["Sheet1"] = "xl/worksheets/sheet1.xml" ws, _ := f.workSheetReader("Sheet1") f.Sheet.Store("xl/worksheets/sheet1.xml", ws) f.Theme = f.themeReader() return f}````f.Pkg`是`file`结构体的一个成员,定义要填充的电子表格文件结构。```type File struct { ...省略其他... Pkg              sync.Map}````func (m *Map) Store(key, value any)`是将值存入`Map`之中。接下来,SheetCount是表格的数量。默认是一个Sheet1,所以初始数量是1.CalcChain是有calcChainReader()计算的,该函数解析defaultXMLPathCalcChain配置中的文件生成一个xlsxCalcChain类型的数据,程序中读取的文件地址是xl/calcChain.xml。xlsxCalcChain直接映射calcChain元素。这个元素代表了计算链的根。Comments新建一个`map[string]*xlsxComments`。ContentTypes由contentTypesReader创建,contentTypesReader提供了一个函数来获取反序列化后的[Content_Types].xml文件结构的指针。`f.Relationships`和`f.Drawings = sync.Map{}`是创建一个并发状况下的Map。同样的,`Styles`由f.stylesReader()创建,提供了一个函数来获取反序列化后的`xl/styles.xml`文件结构的指针。f.WorkBook也差不多。VMLDrawing 、DecodeVMLDrawing都是创建map。接下来是sheet1的相关创建操作。#### 三、结语这里是老岳,这是Go语言相关源码的解读第一篇,我会不断努力,给大家带来更多类似的文章,恳请大家不吝赐教。
文章
XML  ·  边缘计算  ·  BI  ·  API  ·  Go  ·  云计算  ·  开发者  ·  数据格式
2022-08-11
开发指南—DAL语句—SQL限流
创建限流规则语法CREATE CCL_RULE [ IF NOT EXISTS ] `ccl_rule_name` ON `database`.`table` TO '<usename>'@'<host>' FOR { UPDATE | SELECT | INSERT | DELETE } [ filter_options ] with_options filter_options: [ FILTER BY KEYWORD(‘KEYWORD1’, ’KEYWORD2’,…) ] [ FILTER BY TEMPLATE(‘template_id’) ] with_options: WITH MAX_CONCURRENCY = value1 [ , WAIT_QUEUE_SIZE = value2 ] [ , WAIT_TIMEOUT = value3 ] [ ,FAST_MATCH = { 0 , 1 }]表 1. 参数说明参数是否必选说明限流规则匹配参数`ccl_rule_name`必选限流规则的名称。说明 为避免名称与SQL关键字冲突,建议在规则名称前后各加一个反引号(`)`database`.`table`必选数据库和数据表的名称,支持使用星号(*)表示任意匹配。说明 为避免名称与SQL关键字冲突,建议在库表名称前后各加一个反引号(`)。'<usename>'@'<host>'必选账号名称。其中Host部分支持用百分号(%)来表示任意匹配。UPDATE | SELECT | INSERT | DELETE必选SQL语句类型。当前支持UPDATE、SELECT、INSERT和DELETE类型。说明 每条限流规则仅支持传入一种类型的SQL语句。[ filter_options ]可选过滤条件,支持包括如下两种条件:关键词(KEYWORD):查看限流规则时,关键词列表会在查询结果中被转化为["kwd1","kw2","kw3"...]的字符串形式,最多支持512个字符。说明若关键字是SQL语句中的参数值,匹配时大小写敏感。若关键字是SQL语句中的其他词,匹配时大小写不敏感。模版(TEMPLATE):模版编号是SQL日志中的sql_code值,该值是参数化后的SQL语句(SQL模版)以16进制表示的哈希值。您可以通过SHOW FULL PROCESSLIST和EXPLAIN命令查看模版编号。限流规则行为控制参数 with_options必选WITH选项中支持如下4个参数来控制限流规则的行为:MAX_CONCURRENCY:匹配到该限流规则的SQL语句的最大并发度,超过后进入等待队列。取值范围:[0~231 - 1],默认值为0。WAIT_QUEUE_SIZE:超过并发度后的最大等待队列长度。当等待队列长度超过该值后,SQL语句将报错。在队列中的语句仍然占用了线程资源,排队过多时也可能导致内存耗尽。取值范围:[0~231 - 1],默认值为0。WAIT_TIMEOUT:SQL语句在等待队列中的最长等待时间,超过该等待时间后,SQL语句将报错。取值范围:[0~231 - 1],单位为秒,默认值为600。FAST_MATCH:是否开启Cache来加速匹配。开启后,PolarDB-X 2.0会将模版编号作为Cache key的一部分,匹配结果作为value进行缓存,来加速匹配速度。取值范围:0表示关闭,1表示开启,默认开启。说明创建限流规则时,需从上述4个行为控制参数中至少选择一个传入。当MAX_CONCURRENCY为默认值(0)时,可能会使匹配到的所有SQL返回错误。此时,建议您显式指定该参数为非0的值。PolarDB-X 2.0是分布式云原生数据库,计算层由多个节点组成,因此每个节点的并发度之和是整个实例的并发数最大值。在负载不均衡的情况下,整个实例的受限制SQL并发数可能无法达到最大并发数。说明 仅当一个SQL语句满足所有的匹配参数条件时,才会根据该规则的WITH选项进行限流。限流结果一条SQL匹配到该规则后,根据限流规则中WITH选项里配置的参数,会出现如下几种结果:RUN(可运行)若并发度还未达到最大并发度(即MAX_CONCURRENCY参数值),该SQL正常执行不会被限流。WAIT(等待中)若并发度已经达到最大并发度,但等待队列长度还未达到最大长度(即WAIT_QUEUE_SIZE参数值),该SQL进入等待状态,直到进入可运行(RUN)状态,或者等待超时(WAIT_TIMEOUT)状态。您可以通过如下命令查看由于匹配到限流规则而等待的SQL语句:mysql> SHOW FULL PROCESSLIST;返回结果示例如下:+----+---------------+-----------------+----------+-------------------------------+------+-------+-----------------------+-----------------+| ID | USER | HOST | DB | COMMAND | TIME | STATE | INFO | SQL_TEMPLATE_ID |+----+---------------+-----------------+----------+-------------------------------+------+-------+-----------------------+-----------------+| 2 | polardbx_root | *...*:62787 | polardbx | Query | 0 | | show full processlist | NULL || 1 | polardbx_root | *...*:62775 | polardbx | Query(Waiting-selectrulereal) | 12 | | select 1 | 9037e5e2 |+----+---------------+-----------------+----------+-------------------------------+------+-------+-----------------------+-----------------+2 rows in set (0.08 sec)从上述查询结果可以看出:SQL语句select 1由于限流规则selectrulereal而处于等待(Waiting)状态。WAIT_TIMEOUT(等待超时)SQL语句进入等待状态后,当等待时间超过最长等待时间(即WAIT_TIMEOUT参数值)时,该语句将会返回错误。例如,设置了一条最长等待时间为10秒的限流规则,执行SELECT sleep(11)语句时会因为等待超时而报错,示例如下:ERROR 3009 (HY000): 11a07e23fd800000[polardbx]Exceeding the max concurrency 0 of ccl rule selectrulereal after waiting for 10060 msKILL(结束)并发度和等待队列长度均已经达到最大值,客户端将收到提示超过最大并发度的报错,报错信息中会包含匹配上的限流规则的名称。例如,在并发度和等待队列长度均已经达到最大值后执行SELECT 1;命令,会出现如下报错:ERROR 3009 (HY000): 11a07c4425c00000[polardbx]Exceeding the max concurrency 0 of ccl rule selectrulereal上述结果表示:该SQL语句SELECT 1;由于超出了限流规则selectrulereal设置的最大并发度而执行失败。示例假设需要创建一条名为selectrule的规则,用于限制由'ccltest'@'%'用户发起的,包含cclmatched关键字的,且对任意表执行SELECT操作的SQL语句,同时将最大并发度设置为10。规则创建语句如下:CREATE CCL_RULE IF NOT EXISTS `selectrule` ON . TO 'ccltest'@'%'FOR SELECTFILTER BY KEYWORD('cclmatched')WITH MAX_CONCURRENCY=10;查看限流规则语法查看指定限流规则语法如下:SHOW CCL_RULE `ccl_rule_name1` [, `ccl_rule_name2` ]查看所有限流规则语法如下:SHOW CCL_RULES示例使用如下命令查看当前数据库下所有的限流规则:mysql> SHOW CCL_RULES \G返回结果如下: 1. row ** NO.: 1 RULE_NAME: selectrulereal RUNNING: 2 WAITING: 29 KILLED: 0 MATCH_HIT_CACHE: 21374 TOTAL_MATCH: 21406 ACTIVE_NODE_COUNT: 2MAX_CONCURRENCY_PER_NODE: 1WAIT_QUEUE_SIZE_PER_NODE: 100 WAIT_TIMEOUT: 600 FAST_MATCH: 1 SQL_TYPE: SELECT USER: ccltest@% TABLE: . KEYWORDS: ["SELECT"] TEMPLATEID: NULL CREATED_TIME: 2020-11-26 17:04:08表 2. 参数说明参数说明NO.匹配优先级,数字越小,优先级越高。RULE_NAME限流规则名称。RUNNING匹配到该限流规则且正常执行的SQL语句数量。WAITING匹配到该限流规则且正在等待队列里的查询数量。KILLED匹配到该限流规则且被KILL的SQL语句数量。MATCH_HIT_CACHE匹配到该限流规则且命中Cache的SQL语句数量。TOTAL_MATCH匹配到该限流规则的总次数。ACTIVE_NODE_COUNT计算层中启用了SQL限流的节点数。MAX_CONCURRENCY_PER_NODE每个计算节点的并发度。WAIT_QUEUE_SIZE_PER_NODE每个计算节点上等待队列的最大长度。WAIT_TIMEOUTSQL语句在等待队列的最大等待时间。FAST_MATCH是否启动缓存加速匹配速度。SQL_TYPESQL语句类型。USER用户名。TABLE数据库表。KEYWORDS关键词列表。TEMPLATEIDSQL模版的编号。CREATED_TIME创建时间(本地时间),格式为yyyy-MM-dd HH:mm:ss。删除限流规则说明 被删除的限流规则会立即失效,此时该规则下等待队列中的SQL语句全部会被正常执行。删除指定限流规则:DROP CCL_RULE [ IF EXISTS ] `ccl_rule_name1` [, `ccl_rule_name2`, ...]删除所有限流规则:CLEAR CCL_RULES慢SQL限流一键开启按语句类型分,默认为SELECT类型,相同语句类型的命令,有更新作用。语法结构如下:SLOW_SQL_CCL GO [ SQL_TYPE [MAX_CONCURRENCY] [SLOW_SQL_TIME] [MAX_CCL_RULE]]SQL_TYPE取值:ALL,SELECT,UPDATE,INSERT,默认为SELECT。MAX_CONCURRENCY默认值为CPU核数的一半。SLOW_SQL_TIME默认值为系统参数SLOW_SQL_TIME的值。MAX_CCL_RULE的默认值为1000。动作:遍历整个实例的session,识别出该语句类型慢SQL的TemlateId。创建针对慢SQL的限流触发器,名称为:_SYSTEM_SLOW_SQL_CCL_TRIGGER_{SQL_TYPE}_。传递慢SQL的TemplateId给限流触发器,由限流触发器创建限流规则。Kill所有该语句类型的慢TemplateId查询。一键关闭删除由SLOW_SQL_CCL创建的限流触发器,连带着会删除由限流触发器创建的限流规则。语法结构如下:SLOW_SQL_CCL BACK查看限流情况。语法结构如下:SLOW_SQL_CCL SHOWplan_cache和ccl_rules里以模版ID作为join key的一次inner join。如何干预慢SQL的阈值?设置SLOW_SQL_CCL GO中的语法。在一键开启SQL限流之前,设置用户变量slow_sql_time。如下:set @slow_sql_time=2000;slow_sql_ccl go;在控制台上设置系统参数SLOW_SQL_TIME。说明 后面的设置方式会被前面的设置方式所覆盖。
文章
SQL  ·  缓存  ·  Cloud Native  ·  Go  ·  数据库
2022-08-11
安装nvm
这边建议使用,go语言写的nvm-windowsurl: https://github.com/coreybutler/nvm-windows记住,exe启动选择的时候,都选自己喜欢的D盘或者别的盘的目录确认环境变量后,用管理员权限启动nvm,nvm proxy设置好代理,install node和use node最后,node -v检查
文章
Go  ·  内存技术
2022-08-10
Docker 前沿概述
什么是Docker?Docker是基于Go语言实现的开源容器项目。Docker是一个为开发者和系统管理员提供的开发,部署和运行的容器应用程序。Linux使用容器开发应用程序的这种方式称为容器化。Docker项目已加入Linux基金会,并遵循Apache2.0 协议,全部开源代码再http://github.com/docker 项目仓库进行维护。Docker的基本概念Docker中包括三个基本概念:容器(Container)、镜像(Image)、仓库(Repository)容器(Container) -- 镜像运行时的实体先来看看容器较为官方的解释:容器就是将软件打包成基本单元,用来开发、交付和部署。容器镜像是轻量的、可执行的软件包 ,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置。容器化软件是基于Linux和Windows的应用,在任何环境中都能够始终如一地运行。容器赋予了软件独立性,使其免受外在环境差异(例如,开发和预演环境的差异)的影响,从而有助于减少团队间在相同环境上运行不同软件时的冲突。镜像(Image) -- 一个特殊的文件系统Docker中的Image镜像相当于是一个文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数。镜像可以基于Dockerfile构建,Dockerfile是一个描述文件,里面包含若干条命令,每条命令都会对基础文件系统创建新的层次结构。用户可以通过编写Dockerfile创建新的镜像,也可以直接从类似github的Docker Hub上下载镜像使用。仓库(Repository) -- 集中存放镜像文件的地方如果你使用过 git 和 github 就很容易理解Docker的仓库概念。Docker仓库相当于一个 github 上的代码库。Docker 仓库是用来包含镜像的位置,Docker提供一个注册服务器(Registry)来保存多个仓库,每个仓库又可以包含多个镜像。它们的范围大小依次是 仓库 > 镜像 > 容器下面再来说说虚拟机前面说到,容器在Linux上本机运行,并与其他容器共享主机的内核。它运行一个独立的进程,不占用任何其他可执行文件的内存,使其轻量级。相比之下,虚拟机运行一个完整的客户操作系统,通过虚拟机管理程序对主机资源进行虚拟访问。通常,VM提供的环境比大多数应用程序需要的资源更多。下面这幅图很好的表述了这一点容器和虚拟机的比较这或许也就能解释 Docker 如此流行的原因Docker容器很快,启动和停止可以在秒级实现,这相比传统的虚拟机方式(数分钟)要快得多;Docker容器对系统资源需求很少,一台主机可以运行数千个Docker容器;Docker通过类似Git设计理念的操作来方便用户获取、分发和更新应用镜像,存储复用,增量更新;Docker通过Dockerfile支持灵活的自动化创新和部署机制,以提高工作效率,并标准化流程。下图是Docker容器技术与传统虚拟机技术的比较:特性容器虚拟机启动速度秒级分钟级性能接近原生较弱内存代价很小较多硬盘使用一般为MB一般为GB运行密度单机支持上千个容器一般为几十个隔离性安全隔离完全隔离迁移性优秀一般Docker 解决了什么样的问题一项技术或者软件的流行都是为了解决某种问题应用而生的,那么话说回来了,Docker解决了什么问题呢?组织有序:如果没有Docker,一台机器就可能像是一个装满垃圾的抽屉,应用程序依赖各种资源,一些应用程序依赖各种代码库,语音,图像等。这种依赖关系很像分布式各个系统的调用网一样混乱不堪,如果用一张图来表示一下,就像是下面这样但是Docker解决了这个问题,应用程序的各种依赖和环境都直接部署在Docker的容器中,起到隔离一切的目 的,就像是下图所示的这样提高可移植性:另一个软件的问题是,应用程序的依赖不仅只是资源的依赖,还有可能是系统环境的依赖,操作系统之间的移植性一直是软件用户的一个主要问题。虽然Linux和OS X之间可能会有某种兼容性,但是在Windows环境下开发的软件移植到Linux会很困难。Docker解决了这一点,因为Docker可运行在原生的Linux环境下,在OS X和Windows环境中通过单独的虚拟机也可以运行。这种新的移植性在几个方面有助于用户使用:第一,它将软件以前无法使用的地方彻底解锁。第二,它可以在任何系统上运行相同的软件。第三,软件维护人员可以集中精力在单一平台和一套依赖关系中编写他们的软件,这节省了大量的时间。保护你的机器:Docker就像是物理的牢房,容器里的任何东西只能访问它内部的东西。容器限制了一个程序对其他程序带来的影响范围、可访问的数据和系统资源的影响范围。下图说明了容器内部运行和外部运行软件的区别下面就开始你的Docker搭建之旅吧!!!准备你的docker环境我为你准备了下面四种环境的docker安装教程,你可以根据教程来实现安装Ununtu Docker安装:https://www.runoob.com/docker/ubuntu-docker-install.htmlCentOS Docker安装:https://www.runoob.com/docker/centos-docker-install.htmlWindows Docker安装:https://www.runoob.com/docker/windows-docker-install.htmlMacOS Docker安装:https://www.runoob.com/docker/macos-docker-install.html测试Docker 版本安装完成后,运行docker --version 确保你的系统已经支持了docker运行docker info(没有 - )以查看有关Docker安装的更多详细信息:等等测试Docker 安装测试你的安装工作通过运行一个简单的docker 映像,hello-world:列出来你机器上下载的hello-world 映像列出显示其消息后退出的hello-world容器(由图像生成)。如果它仍在运行,则不需要--all选项:回顾和备忘单列出Docker CLI 命令dockerdocker container --help显示docker version 和 infodocker --versiondocker versiondocker info执行docker图像docker run hello-world列出docker 映像docker image ls列出docker容器docker container lsdocker container ls --alldocker container ls -aq </div>
文章
存储  ·  安全  ·  Linux  ·  Go  ·  开发工具  ·  git  ·  开发者  ·  Docker  ·  Windows  ·  容器
2022-08-10
iLogtail社区版开发者指南 - 快速搭建编译和开发环境
iLogtail是阿里云日志服务(SLS)团队自研的可观测数据采集Agent,拥有的轻量级、高性能、自动化配置等诸多生产级别特性,可以署于物理机、虚拟机、Kubernetes等多种环境中来采集遥测数据。iLogtail在阿里云上服务了数万家客户主机和容器的可观测性采集工作,在阿里巴巴集团的核心产品线,如淘宝、天猫、支付宝、菜鸟、高德地图等也是默认的日志、监控、Trace等多种可观测数据的采集工具。目前iLogtail已有千万级的安装量,每天采集数十PB的可观测数据,广泛应用于线上监控、问题分析/定位、运营分析、安全分析等多种场景,在实战中验证了其强大的性能和稳定性。在当今云原生的时代,我们坚信开源才是iLogtail最优的发展策略,也是释放其最大价值的方法。因此,我们决定将iLogtail开源,期望同众多开发者一起将iLogtail打造成世界一流的可观测数据采集器。背景想尝鲜最新版iLogtail代码提供的功能?想测试刚给iLogtail添加的代码?如何将iLogtail的开源代码转变为可执行程序是很多小伙伴关心的问题。本文将详细描述iLogtail的编译方法,并利用提供的开发镜像,详细描述如何构建一个高效开发iLogtail的环境。编译进程结构iLogtail为了支持插件系统,引入了 libPluginAdaptor 和 libPluginBase(以下简称 adaptor 和 base)这两个动态库,它们与 iLogtail 之间的关系如下:iLogtail 动态依赖于这两个动态库(即 binary 中不依赖),在初始化时,iLogtail 会尝试使用动态库接口(如 dlopen)动态加载它们,获取所需的符号。Adaptor 充当一个中间层,iLogtail 和 base 均依赖它,iLogtail 向 adaptor 注册回调,adpator 将这些回调记录下来以接口的形式暴露给 base 使用。Base 是插件系统的主体,它包含插件系统所必须的采集、处理、聚合以及输出(向 iLogtail 递交可以视为其中一种)等功能。因此,完整的iLogtail包含ilogtail、libPluginAdaptor.so 和 libPluginBase.so 3个二进制文件。目录结构iLogtail的大致目录结构如下:. ├── core # C++核心代码 │ ├── plugin │ │ └── LogtailPluginAdapter.cpp # PluginAdapter代码 │ ├── CMakeLists.txt # C++项目描述文件 │ └── ilogtail.cpp # C++主函数 ├── plugins # Go插件代码 ├── go.mod # Go项目描述文件 ├── docker # 辅助编译的镜像描述目录 ├── scripts # 辅助编译的脚本目录 └── Makefile # 编译描述文件core目录包含了iLogtail C++核心代码,ilogtail.cpp是其主函数入口文件,plugin/LogtailPluginAdapter.cpp是PluginAdapter的代码文件。C++项目使用CMake描述,CMakeLists.txt是总入口,各子目录中还有CMakeLists.txt描述子目录下的编译目标。顶层目录.本身就是一个Go项目,该项目为iLogtail插件,go.mod为其描述文件。插件代码主体在plugins目录。docker目录和scripts目录分别为辅助编译的镜像描述目录和脚本目录。Makefile为整个iLogtail的编译描述文件,对编译命令进行了封装。编译目标Makefile中描述了整个项目的所有编译目标,主要的包括:目标描述core仅编译C++核心plugin仅编译Go插件all编译完整iLogtaildist打包发行docker制作iLogtail镜像vendor更新插件依赖plugin_local本地编译Go插件这些目标的编译都依赖Docker,因此编译前请确保Docker已经安装,并且具备访问权限。使用make <target>命令编译所选目标,如果需要指定生成的版本号则在编译命令前加上VERSION环境变量,如:VERSION=1.1.1 make dist编译完整iLogtail编译完整iLogtail的命令是make all,由于all是默认的编译目标,因此也可以直接make。该命令首先清理output目录,然后调用./scripts/gen_build_scripts.sh脚本生成编译用的脚本和镜像描述保存到./gen目录,调用 docker 制作镜像,制作的过程即镜像内的编译过程,最后将镜像内的编译结果复制到output目录。./output ├── ilogtail (主程序) ├── libPluginAdapter.so(插件接口) ├── libPluginBase.h └── libPluginBase.so (插件lib)编译iLogtail镜像制作镜像的命令是make docker。制作的过程是将iLogtail发行版的tar包安装到base镜像中,因此依赖本地的ilogtail-<VERSION>.tar.gz文件,已发行的版本可以从iLogtail发布记录下载,本地最新代码则可以通过make dist生成。制作的镜像默认名称为aliyun/ilogtail,可以DOCKER_REPOSITORY环境变量覆盖,Tag则必须与iLogtail包的版本相同,可以通过环境变量VERSION指定,例如:$ VERSION=1.1.1 make dist $ VERSION=1.1.1 make docker docker image list REPOSITORY TAG IMAGE ID CREATED SIZE aliyun/ilogtail 1.1.1 c7977eb7dcc1 2 minutes ago 764MB开发环境使用上述make命令编译虽然简单,但不适合开发环境使用,因为开发过程中需要不断进行编译调试,重复全量编译的速度太慢。由于iLogtail的C++核心对编译环境有特定要求,并且依赖了诸多第三方库(详见编译依赖),为了简化编译流程iLogtail提供了包含预编译依赖库的开开发镜像辅助编译。开发镜像概览开发镜像的地址在sls-registry.cn-beijing.cr.aliyuncs.com/sls-microservices/ilogtail-build-linux-amd64,可通过下面命令获取。docker pull sls-registry.cn-beijing.cr.aliyuncs.com/sls-microservices/ilogtail-build-linux-amd64开发镜像预先安装了gcc和go编译器,更新了git,为了代码风格统一安装了clang-format、go-tools,为了便于调试也安装了gdb、go-delve等工具。为方便国内开发者,预先设置了GOPROXY="https://goproxy.cn,direct"。$ gcc --version gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44) $ go version go version go1.16.15 linux/amd64 $ git --version git version 2.29.3C++核心的编译依赖在/opt/logtail/deps/目录下,该路径是CMakeLists.txt的DEFAULT_DEPS_ROOT(可以查看./core/dependencies.cmake找到修改路径的变量)。$ ls /opt/logtail/deps/ bin include lib lib64 share ssl如果需要安装更多工具或编译依赖,可以在开发镜像上镜像叠加,制作自定义的开发镜像。from sls-registry.cn-beijing.cr.aliyuncs.com/sls-microservices/ilogtail-build-linux-amd64 RUN yum -y install ... RUN go install ...使用VS Code构建开发环境VS Code通过Remote Development插件可以实现远程开发、在镜像中开发,甚至远程+镜像中开发,在镜像中开发的功能为iLogtail创建一致的,可移植的开发环境创造了可能。1. 安装插件在VS Code的Marketplace中搜索“Remote Development”安装插件。2. 创建镜像开发环境配置在iLogtail代码库的顶层目录创建.devcontainer目录,并在里面创建devcontainer.json文件,文件的内容如下:{ "image": "sls-registry.cn-beijing.cr.aliyuncs.com/sls-microservices/ilogtail-build-linux-amd64:latest", "customizations": { "vscode": { "extensions": [ "golang.Go", "ms-vscode.cpptools-extension-pack", "DavidAnson.vscode-markdownlint", "redhat.vscode-yaml" ] } } }其中,image指定了ilogtail的开发镜像地址,customizations.vscode.extensions指定了开发环境的插件。部分插件介绍如下,开发者也可以按照自己的习惯进行修改,欢迎讨论。插件名用途golang.GoGo开发必备插件ms-vscode.cpptools-extension-packC++开发必备插件DavidAnson.vscode-markdownlintMarkdown代码风格检查redhat.vscode-yamlYAML语言支持3. 在容器中打开代码库使用Shift + Command + P(Mac)或Ctrl + Shift + P(Win)打开命令面板,输入reopen,选择Remote-Containers: Reopen in Container。或者若出现如下图提示,则可以直接点击在容器中重新打开。首次打开时会比较慢,因为要下载编译镜像并安装插件,后面再次打开时速度会很快。按照提示进行镜像Build。完成上述步骤后,我们已经可以使用VS Code进行代码编辑,并在其中进行代码编译。注:如果以前拉取过编译镜像,可能需要触发Remote-Containers: Rebuild Container Without Cache重新构建。4. 在容器中进行编译打开新Terminal(找不到的可以在命令面板中打Terminal,选择新开一个)编译Go插件make vendor # 若需要更新插件依赖库 make plugin_local # 每次更新插件代码后从这里开始如果只是对插件代码进行了修改,则只需要执行最后一行命令即可增量编译。编译C++代码mkdir -p core/build # 若之前没有建过 cd core/build cmake .. # 若增删文件,修改CMakeLists.txt后需要重新执行 make -sj$(nproc) # 每次更新core代码后从这里开始如果只是对core代码进行了修改,则只需要执行最后一行命令即可增量编译。默认的编译选项代码可能被优化,若需要Debug建议修改CMAKE_BUILD_TYPE开关。替换上述第2行为cmake -D CMAKE_BUILD_TYPE=Debug ..同理,若需要明确需要代码优化,则将上面的Debug改为Release。默认的编译开关没有打开UT,如果需要编译UT,需要增加BUILD_LOGTAIL_UT开关。替换上述第2行为cmake -DBUILD_LOGTAIL_UT=ON ..制作镜像目前不支持,没有安装docker,请直接在主机上进行编译。5. 获取编译产出由于VS Code是直接将代码库目录挂载到镜像内的,因此主机上可以直接访问镜像内的编译产出。目前,镜像使用的是root用户权限,因此在主机上可能需要执行sudo chown -R $USER .来修复一下权限。可以将C++核心的构建结果拷贝到./output目录组装出完整的构建结果。cp -a ./core/build/ilogtail ./outputcp -a ./core/build/plugin/libPluginAdapter.so ./output最终组装的./output目录的结构如下./output ├── ilogtail (主程序) ├── libPluginAdapter.so(插件接口) ├── libPluginBase.h └── libPluginBase.so (插件lib)直接使用镜像编译如果不方便使用VS Code,也可以通过Docker手动挂载代码库目录的方式,启动编译镜像进入编译。1. 启动容器在代码库根目录执行docker run --name ilogtail-build -d \ -v `pwd`:/src -w /src \ sls-registry.cn-beijing.cr.aliyuncs.com/sls-microservices/ilogtail-build-linux-amd64:latest \ bash -c "sleep infinity"2. 进入容器docker exec -it ilogtail-build bash3. 在容器中编译与VS Code的“4. 在镜像中进行编译”操作步骤相同。使用编译产出在主机上,编译的后的产出可以直接替换对应的文件使用。而对于容器场景,虽然在编译镜像内没有制作镜像能力,但通过下面的方法可以在不制作新镜像的情况下实现快速测试。1. 修改官方镜像entrypoint基于官方镜像包进行调试,首先用bash覆盖官方镜像的entrypoint,避免杀死ilogtail后容器直接退出。docker:指定CMDdocker run -it --name docker_ilogtail -v /:/logtail_host:ro -v /var/run:/var/run aliyun/ilogtail:<VERSION> bashk8s:用command覆盖entrypoint command: - sleep - 'infinity' # 删除livenessProbe,要不然会因为探测不到端口重启2. 将自己编的二进制文件、so,替换到容器里由于ilogtail容器挂载了主机目录,因此将需要替换掉文件放到主机目录上容器内就能访问。# 将开发机上编译的so scp到container所在node上 scp libPluginBase.so <user>@<node>:/home/<user>主机的根路径在ilogtail容器中位于/logtail_host,找到对应目录进行copy即可。cp /logtail_host/home/<user>/libPluginBase.so /usr/local/ilogtail总结至此,我们已经介绍了iLogtail的编译方法,并通过iLogtail的编译镜像 + VS Code搭建了一套统一的开发环境,在这个环境中我们可以实现增量编译提高开发效率。如果对目前的构建方式感到不满意,欢迎到iLogtail的GitHub论坛(https://github.com/alibaba/ilogtail/discussions)发帖提问,或者直接给我们提PR,让我们一起将iLogtail建设得更美好。关于iLogtailiLogtail作为阿里云SLS提供的可观测数据采集器,可以运行在服务器、容器、K8s、嵌入式等多种环境,支持采集数百种可观测数据(日志、监控、Trace、事件等),已经有千万级的安装量。目前,iLogtail已正式开源,欢迎使用及参与共建。GitHub: https://github.com/alibaba/ilogtail社区版文档:https://ilogtail.gitbook.io/ilogtail-docs/about/readme企业版官网:https://help.aliyun.com/document_detail/65018.html
文章
监控  ·  Kubernetes  ·  Cloud Native  ·  编译器  ·  Go  ·  定位技术  ·  C++  ·  开发者  ·  Docker  ·  容器
2022-08-10
jQuery 编程 | jQuery 动画
一、动画jQuery提供了一些列的动画基本方法,同时也提供了自定动画方案.animate()。.show()当提供一个 duration(持续时间)参数,.show()成为一个动画方法。.show()方法将为匹配元素的宽度,高度,以及不透明度,同时进行动画操作。持续时间是以毫秒为单位的,数值越大,动画越慢,不是越快。字符串 'fast' 和 'slow' 分别代表200和600毫秒的延时。出了上述时间,还可以自定时间,接受毫秒为参数jQuery默认只提供两个缓冲效果:调用 swing, 在一个恒定的速度进行;调用 linear. 更多的缓动函数要使用的插件$("button").click(function () { $("p").show("slow");});复制代码.hide()$("#hidr").click(function () { $("div").hide(1000);});复制代码.fadeIn()通过淡入的方式显示匹配元素。$(document.body).click(function () { $("div:hidden:first").fadeIn("slow");});复制代码.fadeOut()通过淡出的方式显示匹配元素。$("p").fadeOut("slow");复制代码.animate()$("#go").click(function(){ $("#block").animate({width: "70%", opacity: 0.4, marginLeft: "0.6in", fontSize: "3em", borderWidth: "10px"}, 1500 );});复制代码.slideDown()用滑动动画显示一个匹配元素。$("div").slideDown("slow");复制代码.slideUp()$(document.body).click(function () {if ($("div:first").is(":hidden")) { $("div").show("slow"); } else { $("div").slideUp(); }});复制代码.delay()设置一个延时来推迟执行队列中后续的项。$("div.first").slideUp(300).delay(800).fadeIn(400);复制代码.clearQueue()从列队中移除所有未执行的项。$("#start").click(function () {$("div").slideUp(300).delay(800).fadeIn(400);})$("#stop").click(function () { var myDiv = $("div"); myDiv.clearQueue(); myDiv.stop();});复制代码.fadeTo()调整匹配元素的透明度。透明度的值为:0~1$(this).fadeTo("fast", Math.random());
文章
JavaScript  ·  Go
2022-08-10
数据库治理利器:动态读写分离
作者:十眠背景在分布式系统架构中,业务的流量都是端到端的。每个请求都会经过很多层处理,比如从入口网关再到 Web Server 再到服务之间的调用,再到服务访问缓存或 DB 等存储。对于我们的系统来说,数据库是非常重要的一块。因此无论是在稳定性的治理上,还是在开发提效等场景下,数据库相关的治理能力都是我们系统所需具备的能力。下面总结了微服务访问数据库层时,在数据库治理中的常见的一些场景与能力。OpenSergo 领域中关于数据库治理的概览本文将介绍 MSE 服务治理最近推出数据库治理利器:无侵入实现数据库访问的读写分离能力。什么是读写分离?读写分离也就是将数据库拆分为主库和从库,即主库负责处理事务性的增删改操作,从库负责处理查询操作的数据库架构。为什么要读写分离?稳定性一个大客户的请求过来,查询数据库返回上万条几百 M 的数据,数据库的 CPU 直接打满。不知道大家是否遇到过类似的问题。性能在业务处理过程中,如果对数据库的读操作远多于写操作,同时业务上对于数据查询结果的实时性要求不高(例如可以容忍秒级的延迟),那么在做系统性能优化时就可以考虑引入读写分离的方案,只读库可以承担主库的压力,有效提升微服务应用的性能。规模增长随着业务增长,到了一定规模之后再扩容,但很多都卡在扩容这一步,极大的限制了应对市场变化的速度,其中数据库的扩容是最难的,目前常见的数据库扩容方式有以下几种方式:垂直升级分库分表读写分离 垂直升级需要中断服务且高可用方面不及其它几种方式,分库分表在分区键的选择上会是个难点,SQL 使用上会有诸多限制,同时对业务的改造也是非常大的工作量。相对来说读写分离是对业务的侵入最低也最容易实现扩容方案。根据经验大多数应用的读写比都在 5:1 以上,有些场景甚至大量的高于 10:1,在对数据库有少量写请求,但有大量读请求的应用场景下,单个实例可能无法承受读取压力,甚至对业务产生影响。综上所述数据库读写分离方案可以满足阿里云上大多数公司的稳定性治理、性能提升以及数据库扩容的需求。读写分离常见方案目前业界流行的读写分离方案,通常都是基于上述主从模式的数据库架构。读写分离的实现方案多数是通过引入 odp、mycat 等数据访问代理产品,通过其读写分离功能来帮助实现读写分离。引入数据访问代理的好处是源程序不需要做任何改动就可以实现读写分离,坏处是由于多了一层中间件做中转代理,性能上会有所下降,数据访问代理也容易成为性能瓶颈。ShardingSphere 读写分离方案[1](摘自 shardingsphere 官网)ShardingSphere[2] 的读写分离主要依赖内核的相关功能。包括解析引擎和路由引擎。解析引擎将用户的 SQL 转化为 ShardingSphere 可以识别的 Statement 信息,路由引擎根据 SQL 的读写类型以及事务的状态来做 SQL 的路由。如下图所示,ShardingSphere 识别到读操作和写操作,分别会路由至不同的数据库实例。MSE 数据库读写分离能力MSE 提供了一种动态数据流量治理的方案,您可以在不需要修改任何业务代码的情况下,实现数据库的读写分离能力。下面介绍 MSE 基于 Mysql 数据存储通过的读写分离能力。前提条件应用接入 MSE部署 Demo 应用 在阿里云容器服务中部署 A、B、C 三个应用,并且将应用均接入 MSE 服务治理[3],用于增加具备数据库治理能力的 Agent。创建 RDS 只读实例[4] 我们需要创建 RDS 只读实例,利用只读实例满足大量的数据库读取需求,增加应用的吞吐量。配置读写分离规则我们需要配置以下环境变量来额外开启/配置数据库的读写分离能力 我们可以通过控制台配置弱读请求的规则或者指定某些接口为弱读请求apiVersion: database.opensergo.io/v1alpha1 kind: AccessControlRule metadata: name: read-only-control-rule labels: app: foo spec: selector: app: foo target: - resource: path: '/getLocation' controlStrategies: weak: true上述 OpenSergo 标准的规则表示 /getLocation 接口的请求为弱读请求。我们针对一些大数据量查询、对延时不太敏感的业务请求可以配置为 weak 类型SQL 洞察如上只需轻松的两步我们就实现了数据库的读写分离能力。基于数据库读写分离能力,配合 MSE 数据库治理的 SQL 洞察我们可以快速定位 RT 过大的查询请求,帮助我们进一步分析 SQL 对我们数据库稳定性的影响。我可以观察应用和资源 API 维度的 SQL 请求实时数据(细化至秒级),同时 MSE 还提供了 SQL 的 topN 列表,我们可以一眼看出 RT 高,查询返回值数据量大的 SQL 语句。总结本文详细描述了 MSE 即将推出的数据库治理能力矩阵中关于动态读写分离能力的介绍。通过 MSE 提供的 SQL 洞察能力,结合我们对业务的理解,我们可以快速定位划分接口请求为弱请求。将对主库性能以及稳定性影响大的读操作,分流至 RDS 只读库,可以有效降低主库的读写压力,进一步提升微服务应用的稳定性。我们从应用的视角出发,抽象了我们在访问以及使用数据库时的一些常见场景以及对应的治理能力,整理了我们在稳定性治理、性能优化、提效等方面的实战经验。对于每一个后端应用来说,数据库无疑是重中之重,我们希望通过我们的数据库治理能力,可以帮助到大家更好地使用数据库服务。最后提一下服务治理的标准 OpenSergo:Q:OpenSergo[5] 是什么A:OpenSergo 是一套开放、通用的、面向分布式服务架构、覆盖全链路异构化生态的服务治理标准,基于业界服务治理场景与实践形成服务治理通用标准。OpenSergo 最大特点就是以统一一套配置/DSL/协议定义服务治理规则,面向多语言异构化架构,做到全链路生态覆盖。无论微服务的语言是 Java, Go, Node.js 或其它语言,无论是标准微服务或 Mesh 接入,从网关到微服务,从数据库到缓存,从服务注册发现到配置,开发者都可以通过同一套 OpenSergo CRD 标准配置针对每一层进行统一的治理管控,而无需关注各框架、语言的差异点,降低异构化、全链路服务治理管控的复杂度OpenSergo 也会在 9 月推出数据库治理相关的标准,会进一步抽象与标准化数据库治理相关的能力。目前 OpenSergo 社区正在联合各个社区进行进一步的合作,通过社区来一起讨论与定义统一的服务治理标准。当前社区也在联合 bilibili、字节跳动等企业一起共建标准,也欢迎感兴趣的开发者、社区与企业一起加入到 OpenSergo 服务治理标准共建中。欢迎大家加入 OpenSergo 社区交流群(钉钉群)进行讨论:34826335参考链接:[1] ShardingSphere 读写分离方案:https://shardingsphere.apache.org/document/current/cn/features/readwrite-splitting/[2] ShardingSphere:https://shardingsphere.apache.org/document/current/en/overview/[3] 接入 MSE 服务治理:https://help.aliyun.com/document_detail/425896.html[4] 创建 RDS 只读实例:https://help.aliyun.com/document_detail/26136.html[5] OpenSergo:https://opensergo.io/zh-cn/
文章
SQL  ·  存储  ·  缓存  ·  关系型数据库  ·  Go  ·  数据库  ·  开发者  ·  微服务  ·  RDS  ·  容器
2022-08-10
大型分布式存储方案MinIO介绍,看完你就懂了!
1、MinIO是什么?官方解释:MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。2、MinIO有哪些优势?2.1 开发文档全面MinIO作为一款基于Golang 编程语言开发的一款高性能的分布式式存储方案的开源项目,有十分完善的官方文档。。官网文档地址:https://docs.min.io/cn/2.2 高性能MinIO号称是目前速度最快的对象存储服务器。在标准硬件上,对象存储的读/写速度最高可以高达183 GB/s和171 GB/s。对象存储可以作为主存储层,用来处理Spark、Presto、TensorFlow、H2O.ai等各种复杂工作负载以及成为Hadoop HDFS的替代品。MinIO用作云原生应用程序的主要存储,和传统对象存储相比,云原生应用程序需要更高的吞吐量和更低的延迟。而这些都是MinIO能够达成的性能指标。2.3 支持全面目前MinIO支持市面主流的开发语言并且可以通过SDK快速集成快速集成使用。2.4 AWS S3标准兼容亚马逊云的 S3 API(接口协议) 是在全球范围内达到共识的对象存储的协议,是全世界内大家都认可的标准。MinIO 在很早的时候就采用了 S3 兼容协议,并且MinIO 是第一个支持 S3 Select 的产品. MinIO对其兼容性的全面性感到自豪, 并且得到了 750多个组织的认同, 包括Microsoft Azure使用MinIO的S3网关 - 这一指标超过其他同类产品的总和。2.5 安装部署非常简单MinIO安装部署非常简单。MinIO简单特性减少了出错的机会,节约了安装部署的时间,提供了可靠性,同时简单性又是性能的基础。Linux环境下只需下载一个二进制文件然后执行,即可在几分钟内完成安装和配置MinIO。配置选项和变体的数量保持在最低限度,这样让失败的配置概率降低到几乎接近于0的水平。MinIO升级是通过一个简单命令完成的,这个命令可以无中断的完成MinIO的升级工作,并且不需要停机即可完成升级操作,大大降低总使用和运维成本。2.6 开放全部源代码 + 企业级支持MinIO 基于Apache V2 license 100% 开放源代码 。这就意味着 MinIO的用户能够自动的、无限制、自由免费使用和集成MinIO、自由的创新和创造、 自由的去修改、自由的再次发行新的版本和软件. 确实, MinIO 强有力的支持和驱动了很多世界500强的企业。此外,其部署的多样性和专业性提供了其他软件无法比拟的优势。2.7 容器化集成方便MinIO提供了与k8s、etcd、docker等主流容器化技术深度集成方案。2.8 管理界面的支持MinIO服务安装后,可以直接通过浏览器登录系统,完成文件夹、文件的管理。非常方便使用。3、MinIO安装3.1 Linux下安装MinIO# 下载安装包wget https://dl.min.io/server/minio/release/linux-amd64/minio#运行命令chmod +x minio#启动 ./minio server /usr/software/minio/data# 后台进程启动nohup ./minio server /usr/software/minio/data > /usr/software/minio/minio.log 2>&1 &3.2 Widows下安装MinIO1、直接安装启动下载安装包下载地址:https://dl.minio.io/server/minio/release/windows-amd64/minio.exe管理员身份启用cmd窗口,然后定位到minio.exe文件夹执行如下命令:.\minio.exe server D:\file\minio说明:D:\file\minio 为存储文件的目录2、后台服务安装下载地址:https://github.com/winsw/winsw/releases将WinSW.exe复制到自己指定的目录,重命名为minio-server.exe同目录下创建minio-server.xml。特别注意,xml和exe必须同名然后配置minio-server.xml文件,内容如下:<service> <id>minio-server</id> <name>minio-server</name> <description>minio文件存储服务/description> <!-- 可设置环境变量 --> <env name="HOME" value="%BASE%"/> <executable>%BASE%\minio.exe</executable> <arguments>server "%BASE%\data"</arguments> <!-- <logmode>rotate</logmode> --> <logpath>%BASE%\logs</logpath> <log mode="roll-by-size-time"> <sizeThreshold>10240</sizeThreshold> <pattern>yyyyMMdd</pattern> <autoRollAtTime>00:00:00</autoRollAtTime> <zipOlderThanNumDays>5</zipOlderThanNumDays> <zipDateFormat>yyyyMMdd</zipDateFormat> </log></service>使用cmd命令 minio-server.exe install 安装服务安装完后,去服务中启动服务。启动成功就可以正常使用minio啦可以使用 minio-server.exe uninstall 来卸载服务安装成功后,浏览器登录访问http://127.0.0.1:9000如果浏览器出现如下界面,表示安装成功。然后使用默认登录名和密码 均为 minioadmin。为了安全考虑后期可再去修改。注意:默认情况下,MinIO 使用端口9000来侦听传入的连接。如果你的平台默认阻止了该端口,则需要启用对该端口的访问。以上是分享内容,感谢阅读,欢迎收藏、点赞、转发。您的支持是我最大的创作动力,有问题可以留言大家共同进步,后续为写一下如何集成到Java、C\#项目中去!
文章
存储  ·  分布式计算  ·  Kubernetes  ·  Cloud Native  ·  JavaScript  ·  Linux  ·  Go  ·  Apache  ·  对象存储  ·  容器
2022-08-09
1 2 3 4 5 6 7 8 9
...
20
跳转至:
阿里云云原生
7306 人关注 | 3963 讨论 | 1649 内容
+ 订阅
  • 解析 RocketMQ 业务消息——“事务消息”
  • 我们总结了 3 大使用建议,并首次公开 Nacos 3.0 规划图 | Nacos 开源 4 周年
  • RocketMQ 消息集成:多类型业务消息——定时消息
查看更多 >
阿里云存储服务
192201 人关注 | 557 讨论 | 1180 内容
+ 订阅
  • 今天的应用架构,正处在一个不可测的阶段
  • 数据洞察(2):描述性数据分析在日志场景的落地
  • 如何写出高性能的SQL Join: join实现和最佳实践
查看更多 >
开发与运维
5310 人关注 | 127479 讨论 | 212228 内容
+ 订阅
  • kubernetes 常见架构图
  • kubernetes 日常命令
  • kubernetes 灰度发布
查看更多 >
云原生
230979 人关注 | 10254 讨论 | 31612 内容
+ 订阅
  • kubernetes 常见架构图
  • kubernetes 日常命令
  • kubernetes 灰度发布
查看更多 >
大数据
185127 人关注 | 24545 讨论 | 59658 内容
+ 订阅
  • kubernetes 日常命令
  • Kubernetes web 网站无法访问
  • Kubernetes YAML 编写 讲解
查看更多 >