July 21, 2020
MySQL DBA利器innodb_ruby
"innodb_ruby简介 innodb_ruby是一款用ruby写的用来分析 innodb 物理文件的专业DBA工具,可以通过这款工具来窥探innodb内部的一些结构。 注意不要在生产环境中使用此工具,以避对线上服务造成影响。官方网址 https://rubygems.org/gems/innodb_ruby。\n注意如果(Linux)平台安装中遇到错误一般情况是由于缺少依赖库造成的,可以先安装 sudo apt-get install libxslt1-dev libxml2-dev 相关库。\n命令语法 在执行以下命令时,建议切换到MySQL 的 datadir 目录里。\nsxf@ubuntu:~$ innodb_space --help Usage: innodb_space \u0026lt;options\u0026gt; \u0026lt;mode\u0026gt; innodb_space \u0026lt;选项\u0026gt; \u0026lt;模式\u0026gt; 命令主要分 options 和 mode 两大部分。 Invocation examples: innodb_space -s ibdata1 [-T tname [-I …"
June 6, 2020
利用jenkins+github实现应用的自动部署及回滚
"对于jenkins的介绍这里不再详细写了,此教程只是为了让大家对部署和回滚原理有所了解。\n一、创建项目 点击左侧的“New Item”,输入项目名称,如 rollback-demo。\n选中 ” 丢弃旧的构建(Discard old builds)”项,在“策略(Strategy” 选择”Log Rotation“, 并输入保留的最大构建个数。\n二、常规配置 设置参数,点击”Add Parameter“,依次选择 “Choice Parameter” 和 “String Parameter“这两,填写如下\n这里的Name 项为参数名称,用户在操作的时候,会在deploy 和 rollback 两个值中选择一项。\n三、源码管理 我们这里选择Git.并填写github.com上的项目地址,记得设置认证 Credentials。构建分支直接使用默认的 */master 即可以了。查看代码浏览器选择 githubweb,并填写项目的github地址。\n四、构建触发事件 选择 “GitHub hook trigger for GITScm polling”,表示使用github webhook来触 …"
May 27, 2020
golang中几种对goroutine的控制方法
"我们先看一段代码\nfunc listen() { ticker := time.NewTicker(time.Second) for { select { case \u0026lt;-ticker.C: fmt.Println(time.Now()) } } } func main() { go listen() time.Sleep(time.Second * 5) fmt.Println(\u0026#34;main exit\u0026#34;) } 非常简单的一个goroutine用法,想必每个gopher都看过的。\n不过在实际生产中,我们几乎看不到这种用法的的身影,原因很简单,我们无法实现对goroutine的控制,而一般业务中我们需要根据不同情况对goroutine进行各种操作。\n要实现对goroutine的控制,一般有以下两种。\n一、手动发送goroutine控制信号 这里我们发送一个退出goroutine的信号。\n// listen 利用只读chan控制goroutine的退出 func listen(ch \u0026lt;-chan bool) { ticker := …"
May 3, 2020
Golang遍历切片删除元素引起恐慌问题
"删除一个切片的部分元素, 告知切片操作:Golang遍历切片恐慌时删除元素\n问题描述 代码( 演示代码):\npackage main import ( \u0026#34;fmt\u0026#34; ) func main() { slice := []int{1, 2, 3, 4, 5, 6, 7, 8, 9} for i, value := range slice { if value%3 == 0 { // remove 3, 6, 9 slice = append(slice[:i], slice[i+1:]...) } } fmt.Printf(\u0026#34;%v\u0026#34;, slice) } 运行结果\npanic: runtime error: slice bounds out of range [8:6] goroutine 1 [running]: main.main() /tmp/sandbox2635969259/prog.go:11 +0x212 Program exited. 解决办法: 以下是网友想到的几种办法"
April 30, 2020
Golang中select用法导致CPU占用100%的问题分析
"上一节( golang中有关select的几个知识点)中介绍了一些对于select{}的一些用法,今天介绍一下有关select在 for语句 中由于使用不当引起的CPU占用100% 的案例。\n先看代码\npackage main import ( \u0026#34;fmt\u0026#34; \u0026#34;time\u0026#34; ) func main() { ch := make(chan int, 10) // 读取chan go func() { for { select { case i := \u0026lt;-ch: // 只读取15次chan fmt.Println(i) default: // 读取15次chan以后的操作一直在这个空语句无任何IO操作的default条件里死循环,无法出让P,以保证一个GPM关系。 // 而如果无default条件的话,则系统当读取完15次chan后,当前goroutine会发生 chan IO 阻塞, Go调度器根据GPM的调度关系,会将当前执行关系中的G切换出去,再从LRQ队列中取一个新的G,重新组成一个GPM继续执行,以实现合理利用计算机资源,提高GO的高并发性能 } …"
April 21, 2020
基于 GitHub Actions 实现 Golang 项目的自动构建部署
"前几天 GitHub官网宣布 GitHub 的所有核心功能对所有人都免费开放,不得不说自从微软收购了GitHub后,确实带来了一些很大的改变。\n以前有些项目考虑到协作关系的原因,虽然放在github上面,但对于一些项目的持续构建和部署一般是通过自行抢建Travis CI、jenkins等系统来实现。虽然去年推出了Actions用来代替它类三方系统,但感觉着还是不方便,必须有些核心功能无法使用,此消息的发布很有可能将这种格局打破。\n本篇教程将介绍使用github的系列产品来实现项目的发布,构建,测试和部署,当然这仅仅是一个非常小的示例,有些地方后期可能会有更好的瞿恩方案。\nGitHub Actions 是一款持续集成工具,包括clone代码,代码构建,程序测试和项目发布等一系列操作。更多内容参考:\n如果你对CI/CD不了解的话,建议先找些文档看看。\n项目源文件见\nGitHub Actions 术语 GitHub Actions 相关的术语。\n(1)workflow (工作流程):持续集成一次运行的过程,就是一个 workflow。\n(2)job (任务):一个 workflow 由一个或 …"
March 28, 2020
k8s中的Service与Ingress
"集群中的服务要想向外提供服务,就不得不提到Service和Ingress。 下面我们就介绍一下两者的区别和关系。\nService 必须了解的一点是对 Service 的访问只有在 Kubernetes 集群内有效,而在集群之外是无效的。\nService可以看作是一组提供相同服务的Pod对外的访问接口。借助Service,应用可以方便地实现服务发现和负载均衡。对于Service 的工作原理请参考\n当需要从集群外部访问k8s里的服务的时候,方式有四种:ClusterIP(默认)、NodePort、LoadBalancer、ExternalName 。\n下面我们介绍一下这几种方式的区别\n一、ClusterIP 该方式是指通过集群的内部 IP 暴露服务,但此服务只能够在集群内部可以访问,这种方式也是默认的 ServiceType。\n我们先看一下最简单的Service定义\napiVersion: v1 kind: Service metadata: name: hostnames spec: selector: app: hostnames ports: - name: default …"
March 28, 2020
mac下利用minikube安装Kubernetes环境
"本机为mac环境,安装有brew工具,所以为了方便这里直接使用brew来安装minikube工具。同时本机已经安装过VirtualBox虚拟机软件。\nminikube是一款专门用来创建k8s 集群的工具。\n一、安装minikube 参考 , 在安装minkube之前建议先了解一下minikube需要的环境。\n先安装一个虚拟化管理系统,如果还未安装,则在 HyperKit、VirtualBox 或 VMware Fusion 三个中任选一个即可,这里我选择了VirtualBox。 如果你想使用hyperkit的话,可以直接执行 brew install hyperkit 即可。\n对于支持的driver_name有效值参考, 目前docker尚处于实现阶段。\n$ brew install minikube 查看版本号\n$ minikube version minikube version: v1.8.2 commit: eb13446e786c9ef70cb0a9f85a633194e62396a1\n安装kubectl命令行工具\n$ brew install kubectl 二、启 …"
March 27, 2020
Golang中的限速器 time/rate
"在高并发的系统中,限流已作为必不可少的功能,而常见的限流算法有:计数器、滑动窗口、令牌桶、漏斗(漏桶)。其中滑动窗口算法、令牌桶和漏斗算法应用最为广泛。\n常见限流算法 这里不再对 计数器算法 和 滑动窗口 算法一一介绍,有兴趣的同学可以参考其它相关文章。\n漏斗算法 漏斗算法很容易理解,它就像有一个漏斗容器一样,漏斗上面一直往容器里倒水(请求),漏斗下方以固定速率一直流出(消费)。如果漏斗容器满的情况下,再倒入的水就会溢出,此时表示新的请求将被丢弃。可以看到这种算法在应对大的突发流量时,会造成部分请求弃用丢失。\n可以看出漏斗算法能强行限制数据的传输速率。漏斗算法\n令牌桶算法 从某种意义上来说,令牌算法是对漏斗算法的一种改进。对于很多应用场景来说,除了要求能够限制数据的平均传输速率外,还要求允许某种程度的突发情况。这时候漏桶算法可能就不合适了,令牌桶算法更为适合。\n令牌桶算法是指一个固定大小的桶,可以存放的令牌的最大个数也是固定的。此算法以一种固定速率不断的往桶中存放令牌,而每次请求调用前必须先从桶中获取令牌才可以。否则进行拒绝或等待,直到获取到有效令牌为止。如果桶内的令牌数量已达到桶的最 …"
March 19, 2020
Golang中的两个定时器 ticker 和 timer
"Golang中time包有两个定时器,分别为 ticker 和 timer。两者都可以实现定时功能,但各自都有自己的使用场景。\nTicker定时器 package main import ( \u0026#34;fmt\u0026#34; \u0026#34;time\u0026#34; ) func main() { // Ticker 包含一个通道字段C,每隔时间段 d 就向该通道发送当时系统时间。 // 它会调整时间间隔或者丢弃 tick 信息以适应反应慢的接收者。 // 如果d \u0026lt;= 0会触发panic。关闭该 Ticker 可以释放相关资源。 ticker1 := time.NewTicker(5 * time.Second) // 一定要调用Stop(),回收资源 defer ticker1.Stop() go func(t *time.Ticker) { for { // 每5秒中从chan t.C 中读取一次 \u0026lt;-t.C fmt.Println(\u0026#34;Ticker:\u0026#34;, time.Now().Format(\u0026#34;2006-01-02 15:04:05\u0026#34;)) } …"