正文
go语言守护进程 go语言锁机制
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
Supervisor与Logrotate
在golang的gin项目中使用supervisor守护进程,用子进程配置将标准输出日志转移到指定目录下,然后使用阿里云的日志服务将标准输出日志转移到线上做一些分析和预警。
项目上线之后一切正常,可是周日夜里三点左右阿里云的日志服务采集不到日志,一顿pv为0的告警过来,赶紧打开电脑,线上服务正常,松一口气,supervisor状态也正常,观察了一会业务数据正常就安然入睡了,心想可能是因为配置项有缺陷吧,回头好好整整supervisor的配置再观察一波。
早上起来打开服务器,cd /var/log/supervisor/,发现存在两个日志文件,分别是xxxx.log-20201223和xxxx.log,xxxx.log的大小为0,xxxx.log-20201223还在继续写入请求日志,权限问题?chmod 777之后发现新的文件还是不写入日志,重启 supervisor之后发现日志能正常写入了。。。一开始怀疑是supervisor日志切割备份有问题,将配置stdout日志文件大小的stdout_logfile_maxbytes配置项,默认 50MB改成0,代表无限大,stdout日志文件备份数的stdout_logfile_backups配置项,默认10改为0,代表不备份,重启supervisor,心想不切割总不会再出现切割之后不往新文件写内容的问题了,真乃明智之选。:)
一周过去,0pv的告警如期而至,虽然不影响线上业务,如鲠在喉让我久久不能释怀。全网翻,百度谷歌,中文英文,去github上翻issue等等,看到一个历史issue1090,Better support for logrotate,感觉和日志转储相关,于是查了下logrotate相关资料,logrotate程序是一个日志文件管理工具。用于分割日志文件,删除旧的日志文件,并创建新的日志文件,起到“转储”作用。centos系统默认安装,于是找到对应的配置文件,果不其然里面就有supervisor,默认配置如下:
/var/log/supervisor/*.log {
missingok
weekly
notifempty
nocompress
},看到weekly感觉离这个问题的答案不远了,于是去查找linux的logrotate往旧文件写入的问题,在一篇logrotate writing to old app.log.1 instead of app.log的文章中找到需要配置参数copytruncate,是用于还在打开中的日志文件,把当前日志备份并截断;是先拷贝再清空的方式,拷贝和清空之间有一个时间差,可能会丢失部分日志数据。增加完配置之后,为了快速验证结果,修改weekly为daily,第二天日志正常切割了,新的文件也正常写入了标准日志。至此问题解决。
linux的logrotate对于运维来说可能是常识,作为开发刚接触运维,只能慢慢积累了,工作之余看看相关的运维知识,尽量少采坑。
如何通俗解释Docker是什么?
通俗解释docker就是集装箱。
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
一个完整的Docker有以下几个部分组成:
DockerClient客户端。
Docker Daemon守护进程。
Docker Image镜像。
DockerContainer容器。
在docker的网站上提到了docker的典型场景:
Automating the packaging and deployment of applications(使应用的打包与部署自动化)。
Creation of lightweight, private PAAS environments(创建轻量、私密的PAAS环境)。
Automated testing and continuous integration/deployment(实现自动化测试和持续的集成/部署)。
Deploying and scaling web apps, databases and backend services(部署与扩展webapp、数据库和后台服务)。
Consul简介及环境搭建
Consul是由HashiCorp基于Go语言开发go语言守护进程的支持多数据中心go语言守护进程的分布式高可用服务发布和注册软件, 采用Raft算法保持服务的一致性, 且支持健康检查.
和Eureka的侵入式服务中心不同的是, Consul是以独立的软件形式运行, 对项目侵入性小, 更方便部署.
上图为多机房数据中心部署, 每个数据中心至少三台Consul, 一台LEADER, 另外的两台是FOLLOWER.
代理是Consul集群上每个成员的守护进程, 它是由consul agent命令开始运行. 代理能够以客户端或服务器模式运行. 由于所有节点都必须运行代理, 所以将节点引用为客户端或服务器更为简单, 但还有其go语言守护进程他实例的代理. 所有代理可以运行DNS或HTTP接口, 并负责运行检查和保持服务同步.
客户端可以将所有RPC请求转发到服务器的代理. 客户端是相对无状态的. 客户端执行的唯一后台活动是LANgossip池. 它消耗最小的资源开销和少量的网络带宽.
服务器端是具有扩展的功能的代理, 它主要参与维护集群状态, 响应RPC查询, 与其go语言守护进程他数据中心交换WAN gossip, 以及向leader节点或远程数据中心转发查询.
虽然数据中心的定义似乎很明显, 但仍有一些细微的细节必须考虑. 比如说, 在EC2中, 多个可用中心 (EC2和AZ是AWS里的概念, 不了解的话可以去看看AWS文档) 是否应该被认为是一个单个的数据中心呢? go语言守护进程我们将一个数据中心定义为一个私有, 低延迟和高带宽的网络环境, 这不包括通过公共互联网的通信. 但是为了我们的目的, 单个EC2区域内的多个可用区域将被视为单个数据中心的一部分.
在我们的文档中, "一致性"的意思是对于被选举出的leader以及事物的顺序的认同. 因为这些事件被应用到有限状态机上, 我们对一致性的定义又暗含了复制备份的状态机的一致性.
consul是建立在Serf之上的, 它提供了一个完整的gossip协议, 用在很多地方. Serf提供了成员管理, 故障检测和事件广播的功能. Gossip的节点到节点之间的通信使用了UDP协议.
指在同一局域网或数据中心的节点上的LAN Gossip池. Client到Server会通过Lan Gossip, 所有的节点都在Gossip pool中
指包含服务器的WAN Gossip池, 这些服务器在不同的数据中心, 通过网络进行通信.
以开发模式启动: consul agent -dev, 如果需要Web界面的话加-ui即可, 集群的LAN服务默认启动在8301端口上, WAN服务默认启动在8302端口上, Web服务默认端口是8500, DNS服务默认端口是8600, gRPC服务默认端口是8502
默认是以server角色启动的, 启动后用consul members可以查看服务下的节点信息, 或者通过HTTP接口请求 也可以看到节点信息数据以json形式返回.
使用dig命令可以查看consul中DNS服务的一些信息, 命令如: dig @127.0.0.1 -p 8600 nodeName
一般情况下consul会在启动时通过参数的形式进行配置, 但这样子比较麻烦, 我们通过在/etc/consul.d目录下来新建配置文件的形式, 在每次启动时加载配置文件来进行启动.
consul的配置信息可以在 查看, 其中部分选项如下:
按照惯例, 我们将配置文件放在/etc/consul.d/目录下, 分别在几个机器上创建该目录. 在以bootstrap模式启动的server1上, 我们创建/etc/consul.d/bootstrap和/etc/consul.d/server目录, 在server2和server3上我们创建/etc/consul.d/server目录, 在agent上, 我们创建/etc/consul.d/agent目录.
server1的bootstrap目录下的配置文件config.json如下:
其他两台服务器中server目录下的配置文件config.json如下:
代理服务器中agent目录下的config.json如下:
这样, 首先启动server1上的consul: consul agent -config-dir /etc/consul.d/bootstrap, 然后依次启动server2, server3上的consul:consul agent -config-dir /etc/consul.d/server. 这样, 三个consul server就组成了一个cluster. 此时server1上的consul运行在bootstrap状态下. 可以在不与server2以及server3商议的情况下直接执行决议, 此时我们终结server1上运行的consul, 并执行consul agent -config-dir /etc/consul.d/server, 让server1以普通server的身份重新加入cluster. 最后启动agent模式 consul agent -config-dir /etc/consul.d/agent.
** 注意: encrypt可以使用consul keygen命令来生成, 所有服务器上需要配置一样, 如果因为哪里配置错误导致启动失败, 修改后还报失败的话, 可以尝试删除$data_dir/serf/local.keyring后重新启动 **
在需要部署服务的机器上同样创建/etc/consul.d/, 然后把不同的服务分开不同的目录, 或者就直接在此目录下创建json配置文件, 如: web1.json, web2.json等.
然后再通过consul agent指定配置文件的方式启动服务, 可以直接在配置文件中指定要注册的服务, 也可以在启动后使用consul join命令来主动注册服务, 这样再次登录到web管理界面就可以发现我们新建的服务了.
Q: 什么是bootstrap模式?
A: 使用该模式启动的server端会自动把自己选择为leader, 在搭建集群时为了方便会预先设置一台服务器为bootstrap启动
如何使用Go语言是操作Docker
Docker 提供了一个与 Docker 守护进程交互的 API (称为Docker Engine API),我们可以使用官方提供的 Go 语言的 SDK 进行构建和扩展 Docker 应用程序和解决方案。
转自:
整理:地鼠文档
通过下面的命令就可以安装 SDK 了:
该部分会介绍如何使用 Golang + Docker API 进行管理本地的 Docker。
第一个例子将展示如何运行容器,相当于 docker run docker.io/library/alpine echo "hello world" :
还可以在后台运行容器,相当于 docker run -d bfirsh/reticulate-splines :
列出正在运行的容器,就像使用 docker ps 一样:
如果是 docker ps -a ,我们可以通过修改 types.ContainerListOptions 中的 All 属性达到这个目的:
通过上面的例子,我们可以获取容器的列表,所以在这个案例中,我们可以去停止所有正在运行的容器。
通过指定容器的 ID,我们可以获取对应 ID 的容器的日志:
获取本地所有的镜像,相当于 docker image ls 或 docker images :
拉取指定镜像,相当于 docker pull alpine :
除了公开的镜像,我们平时还会用到一些私有镜像,可以是 DockerHub 上私有镜像,也可以是自托管的镜像仓库,比如 harbor 。这个时候,我们需要提供对应的凭证才可以拉取镜像。
值得注意的是:在使用 Docker API 的 Go SDK 时,凭证是以明文的方式进行传输的,所以如果是自建的镜像仓库,请务必使用 HTTPS !
我们可以将一个已有的容器通过 commit 保存成一个镜像:
当然,除了可以管理本地的 Docker , 我们同样也可以通过使用 Golang + Docker API 管理远程的 Docker 。
默认 Docker 是通过非网络的 Unix 套接字运行的,只能够进行本地通信( /var/run/docker.sock ),是不能够直接远程连接 Docker 的。
我们需要编辑配置文件 /etc/docker/daemon.json ,并修改以下内容(把 192.168.59.3 改成你自己的 IP 地址),然后重启 Docker :
创建 client 的时候需要指定远程 Docker 的地址,这样就可以像管理本地 Docker 一样管理远程的 Docker 了:
现在已经有很多可以管理 Docker 的产品,它们便是这样进行实现的,比如: portainer 。
如何运行一个golang程序为守护进程
您好,很高兴为您解答。
安装daemonize
安装git环境
yum install git -y
获取daemonize
git clone git://github.com/bmc/daemonize.git
安装daemonize
cd daemonize
./configure
make make install
查看是否安装
daemonize -v
通过daemonize执行golang守护进程
需要打包golang程序为可执行文件(go build),并通过daemonize来执行它来实现守护进程,如:
daemonize -p /var/run/myapp.pid -l /var/lock/subsys/myapp -u nobody /path/to/myapp
如若满意,请点击右侧【采纳答案】,如若还有问题,请点击【追问】
希望我的回答对您有所帮助,望采纳!
~ O(∩_∩)O~
关于go语言守护进程和go语言锁机制的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。