File tree Expand file tree Collapse file tree 5 files changed +8
-8
lines changed Expand file tree Collapse file tree 5 files changed +8
-8
lines changed Original file line number Diff line number Diff line change 1
1
# 12 部署与维护
2
2
到目前为止,我们前面已经介绍了如何开发程序、调试程序以及测试程序,正如人们常说的:开发最后的10%需要花费90%的时间,所以这一章我们将强调这最后的10%部分,要真正成为让人信任并使用的优秀应用,需要考虑到一些细节,以上所说的10%就是指这些小细节。
3
3
4
- 本章我们将通过四个小节来介绍这些小细节的处理,第一小节介绍如何在生产服务上记录程序产生的日志,如何记录日志,第二小节介绍发生错误时我们的程序如何处理,如何保证尽量少的影响到用户的访问,第三小节介绍如何来部署Go的独立程序,由于目前Go程序还无法像C那样写成daemon,那么我们如何管理这样的进程程序后台运行呢?第四小节讲介绍应用数据的备份和恢复,尽量保证应用在奔溃的情况能够保持数据的完整性 。
4
+ 本章我们将通过四个小节来介绍这些小细节的处理,第一小节介绍如何在生产服务上记录程序产生的日志,如何记录日志,第二小节介绍发生错误时我们的程序如何处理,如何保证尽量少的影响到用户的访问,第三小节介绍如何来部署Go的独立程序,由于目前Go程序还无法像C那样写成daemon,那么我们如何管理这样的进程程序后台运行呢?第四小节将介绍应用数据的备份和恢复,尽量保证应用在崩溃的情况能够保持数据的完整性 。
5
5
## 目录
6
6
![ ] ( images/navi12.png?raw=true )
7
7
Original file line number Diff line number Diff line change 1
1
# 12.1 应用日志
2
- 我们期望开发的Web应用程序能够把整个程序运行过程中出现的各种事件一一记录下来,Go语言中提供了一个简易的log包,我们使用该包可以方便的实现日志记录的功能,这些日志都是基本的给予fmt包的打印再结合panic之类的一些函数来处理我们一般的打印抛出错误之类的。如果我们想把我们的应用日志保存到文件,然后又能够结合日志实现很多复杂的功能,编写过Java或者C++的读者应该都使用过log4j和log4cpp之类的日志工具,Go目前标准包就如前面介绍的只是包含了一个简单的包,但是目前第三方开发的一个日志系统实现了很强大的日志功能,` https://github.com/cihub/seelog ` ,接下来我们介绍如何该日志系统来实现我们应用的日志功能 。
2
+ 我们期望开发的Web应用程序能够把整个程序运行过程中出现的各种事件一一记录下来,Go语言中提供了一个简易的log包,我们使用该包可以方便的实现日志记录的功能,这些日志都是基本的给予fmt包的打印再结合panic之类的一些函数来处理我们一般的打印抛出错误之类的。如果我们想把我们的应用日志保存到文件,然后又能够结合日志实现很多复杂的功能,编写过Java或者C++的读者应该都使用过log4j和log4cpp之类的日志工具,Go目前标准包就如前面介绍的只是包含了一个简单的包,但是目前第三方开发的一个日志系统实现了很强大的日志功能,` https://github.com/cihub/seelog ` ,接下来我们介绍如何通过该日志系统来实现我们应用的日志功能 。
3
3
4
4
## seelog介绍
5
5
seelog是用Go语言实现的一个日志系统,它提供了一些简单的函数来实现复杂的日志分配、过滤和格式化。主要有如下特性:
Original file line number Diff line number Diff line change 20
20
21
21
- 通知访问用户出现错误了:不论出现的是一个系统错误还是用户错误,用户都应当知道Web应用出了问题,用户的这次请求无法正确的完成了。例如用户的错误请求我们显示一个统一的错误页面(404.html),出现系统错误我们通过自定义的错误页面显示系统暂时不可用之类的错误页面(error.html)
22
22
- 记录错误:系统出错错误时,一般就是我们调用函数的时候返回err不为nil的情况下,使用前面小节介绍的日志系统记录到日志文件,如果是一些致命错误通过邮件通知系统管理员,例如一般404之类的错误不需要发送邮件,只需要记录到日志系统。
23
- - 回滚当前的请求操作:如果一个用户请求过程中出现了一个服务器错误,那么已完成的操作需要回滚。下面来看一个例子:一个系统讲用户递交的表单保存到数据库 ,并将这个数据递交到一个第三方服务器,但是第三方服务器挂了,这就导致一个错误,那么先前存储到数据库的表单数据应该删除(应告知无效),而且应该通知用户系统出现错误了。
23
+ - 回滚当前的请求操作:如果一个用户请求过程中出现了一个服务器错误,那么已完成的操作需要回滚。下面来看一个例子:一个系统将用户递交的表单保存到数据库 ,并将这个数据递交到一个第三方服务器,但是第三方服务器挂了,这就导致一个错误,那么先前存储到数据库的表单数据应该删除(应告知无效),而且应该通知用户系统出现错误了。
24
24
- 保证现有程序可运行可服务:我们知道没有人能保证程序一定能够一直正常的运行着,万一哪一天程序崩溃了,那么我们就需要记录错误,然后立刻让程序重新运行起来,让程序继续提供服务,然后再通知系统管理员,通过日志等找出问题。
25
25
26
26
## 如何处理错误
Original file line number Diff line number Diff line change 109
109
## Supervisord
110
110
上面已经介绍了Go目前是有两种方案来实现他的daemon,但是官方本身还不支持这一块,所以还是建议大家采用第三方成熟工具来管理我们的应用程序,这里我给大家介绍一款目前使用比较广泛的进程管理软件:Supervisord。Supervisord是用Python实现的一款非常实用的进程管理工具。supervisord会帮你把管理的应用程序转成daemon程序,而且可以方便的通过命令开启、关闭、重启等操作,而且它管理的进程一旦崩溃会自动重启,这样就可以保证程序执行中断后的情况下有自我修复的功能。
111
111
112
- > 我前面在应用中踩过一个坑,就是因为所有的应用程序都是由Supervisord父进程生出来的,那么当你修改了操作系统的文件描述符之后,别忘记重启Supervisord,光重启下面的应用程序没用。当初我就是系统安装好之后就先装了Supervisord,然后开始部署程序,修改文件描述符,重启程序,以为文件描述符已经是100000了,其实Supervisord这个时候还是默认的1024个,导致他管理的进程所有的描述符也是1024.开放之后压力一上来系统就开发报文件描述符用光了 ,查了很久才找到这个坑。
112
+ > 我前面在应用中踩过一个坑,就是因为所有的应用程序都是由Supervisord父进程生出来的,那么当你修改了操作系统的文件描述符之后,别忘记重启Supervisord,光重启下面的应用程序没用。当初我就是系统安装好之后就先装了Supervisord,然后开始部署程序,修改文件描述符,重启程序,以为文件描述符已经是100000了,其实Supervisord这个时候还是默认的1024个,导致他管理的进程所有的描述符也是1024.开放之后压力一上来系统就开始报文件描述符用光了 ,查了很久才找到这个坑。
113
113
114
114
### Supervisord安装
115
115
Supervisord可以通过` sudo easy_install supervisor ` 安装,当然也可以通过Supervisord官网下载后解压并转到源码所在的文件夹下执行` setup.py install ` 来安装。
Original file line number Diff line number Diff line change @@ -19,7 +19,7 @@ rysnc的官方网站:http://rsync.samba.org/ 可以从上面获取最新版本
19
19
20
20
tar xvf rsync-xxx.tar.gz
21
21
cd rsync-xxx
22
- ./configure --prefix=/usr ;make ;make install 注:在用源码包编译安装之前,您得安装gcc等编译开具才行 ;
22
+ ./configure --prefix=/usr ;make ;make install 注:在用源码包编译安装之前,您得安装gcc等编译工具才行 ;
23
23
24
24
### rsync配置
25
25
rsync主要有以下三个配置文件rsyncd.conf(主配置文件)、rsyncd.secrets(密码文件)、rsyncd.motd(rysnc服务器信息)。
@@ -149,9 +149,9 @@ rsync主要有以下三个配置文件rsyncd.conf(主配置文件)、rsyncd.secr
149
149
00 00 * * * /root/mysql_backup.sh
150
150
151
151
## MySQL恢复
152
- 前面介绍MySQL备份分为热备份和冷备份,热备份主要是目的是为了能够实时的恢复 ,例如应用服务器出现了硬盘故障,那么我们可以通过修改配置文件把数据库的读取和写入改成slave,这样就可以尽量少时间的中断服务。
152
+ 前面介绍MySQL备份分为热备份和冷备份,热备份主要的目的是为了能够实时的恢复 ,例如应用服务器出现了硬盘故障,那么我们可以通过修改配置文件把数据库的读取和写入改成slave,这样就可以尽量少时间的中断服务。
153
153
154
- 但是有时候我们需要通过冷备份的SQL会进行数据恢复 ,既然有了数据库的备份,就可以通过命令导入:
154
+ 但是有时候我们需要通过冷备份的SQL来进行数据恢复 ,既然有了数据库的备份,就可以通过命令导入:
155
155
156
156
mysql -u username -p databse < backup.sql
157
157
@@ -163,7 +163,7 @@ redis是目前我们使用最多的NoSQL,它的备份也分为两种:热备
163
163
## redis恢复
164
164
redis的恢复分为热备份恢复和冷备份恢复,热备份恢复的目的和方法同MySQL的恢复一样,只要修改应用的相应的数据库连接即可。
165
165
166
- 但是有时候我们需要根据冷备份来恢复数据,redis的冷备份恢复其实就是只要把保存的数据库文件copy到redis的编译目录 ,然后启动redis就可以了,redis在启动的时候会自动加载数据库文件到内存中,启动的速度根据数据库的文件大小来决定。
166
+ 但是有时候我们需要根据冷备份来恢复数据,redis的冷备份恢复其实就是只要把保存的数据库文件copy到redis的工作目录 ,然后启动redis就可以了,redis在启动的时候会自动加载数据库文件到内存中,启动的速度根据数据库的文件大小来决定。
167
167
168
168
## 小结
169
169
本小节介绍了我们的应用部分的备份和恢复,即如何做好灾备,包括文件的备份、数据库的备份。同时也介绍了使用rsync同步不同系统的文件,MySQL数据库和redis数据库的备份和恢复,希望通过本小节的介绍,能够给作为开发的你对于线上产品的灾备方案提供一个参考方案。
You can’t perform that action at this time.
0 commit comments