服务器上安装了 mongodb 数据库,为防止 mongodb 异常关闭,影响正常业务处理。需要使用 monit 监控 mongodb, 配置如下,比较简单。
在 /etc/monit/conf.d 增加 mongod 配置文件,内容如下即可:
1 2 3 4 5 6 7 |
|
增加完了,运行 sudo monit reload 重新加载配置文件即可。
服务器上安装了 mongodb 数据库,为防止 mongodb 异常关闭,影响正常业务处理。需要使用 monit 监控 mongodb, 配置如下,比较简单。
在 /etc/monit/conf.d 增加 mongod 配置文件,内容如下即可:
1 2 3 4 5 6 7 |
|
增加完了,运行 sudo monit reload 重新加载配置文件即可。
在 golang 里面大家应该都知道是 go 关键字调用一个函数,就开启了个线程。 如果一个循环,每个里面都调用 go 函数,那就会可能启动很多个线程, 如果想控制固定线程数来处理业务,该怎么写呢?
写过 golang 多线程的应该都知道,多线程之间可以通过管道通信协作,作为通信的数据。 我们可以通过 sync.WaitGroup 和管道配合来达到控制多线程的线程数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
|
上面这个代码控制了 5 (MAX_THREADS) 个线程,你可以修改成 2 和 10 看下效果。
sync.WaitGroup 是一个线程控制组, 它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine 执行完成。
它一共有 3 个方法,Add(),Done(),Wait()。
Add - 设置需要阻塞的线程数 Done - 代表单线程已经执行完毕 Wait - 等待所有线程执行完毕的阻塞方法
通过它就可以控制多少个消费者同时在处理了,而不是生成无限多个消费者。
一般我们使用 v2ray 服务器,都是直接连接到这个服务器上,进行数据代理转发。就是常用的 客户端 => v2ray 服务器 模式, 其实可以 客户端 => v2ray 中转服务器1 => v2ray 中转服务器2 => v2ray 服务器, 可以设置 N 个服务器,但设置太多一定会影响访问速度,所以不宜设置太多。 本文仅限技术交流之用,大家请勿非法滥用。
我们来看看如何配置 v2ray 中转服务器。
我推荐使用 docker 安装启动,非常简单, 中转服务器和目标服务器都需要安装。
1
|
|
我这边是一个 v2ray 中转服务器的配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
|
v2ray 服务器的配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
|
如果对客户端开放的是 10086 端口, 上面配置中的 yyy 为 8122, xxx_1 为 20180, yyy_2 为 8123
1
|
|
1
|
|
Monit是一个跨平台的用来监控Unix/linux系统(比如Linux、BSD、OSX、Solaris)的工具。Monit特别易于安装,而且非常轻量级(只有500KB大小),并且不依赖任何第三方程序、插件或者库。
Monit可以监控服务器进程状态、HTTP/TCP状态码、服务器资源变化、文件系统变动等等,根据这些变化,可以设定邮件报警、重启进程或服务。易于安装、轻量级的实现以及强大的功能,让Monit成为一个理想的后备监控工具。
1 2 3 4 5 6 7 8 9 10 11 |
|
Rake Task 是 Rails 执行后台任务一个工具,可以执行一些定时或者轮询的后台任务。
1 2 3 4 5 6 |
|
习惯了使用 rbenv 管理 Ruby 版本,现在使用 golang 了。就想使用上了 goenv 来方便管理 golang 版本。 我使用的是 fish shell,这边记录下如何设置 goenv 在 fish shell 环境下。
mac 用户
1
|
|
或者
1
|
|
1
|
|
添加以下配置:
1 2 3 4 |
|
大功告成, 重开一个 shell 窗口,将自动加载 goenv。你可以随意安装 golang 版本了。
1 2 |
|
由于项目需要公司主页需要使用 Wordpress,但是后台管理还是使用的 Rails 程序。 所以需要 nginx 修改配置才能达到效果。
Wordpress 是配置在 http://abc.com/www 子路径下。需要在 Rails 的主页处理的时候,自动跳转至此 URL。 wordpress 的服务器文件是放在 /home/deploy/apps/abc_home/www 下面。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
|
由于经常开发 Rails 应用,也常常部署到 Ubuntu 服务器上,所以我就整理了 一篇比较完整的部署配置步骤,供大家以及自己以后参考。
以 root 用户身份登入 ubuntu 系统,然后执行下面的命令增加具有 sudo 权限的 deploy 用户。
1 2 3 4 5 |
|
这一步是为了以后你自己本地使用 cap 部署代码准备的,这样的话,每次部署无需输入密码。
1 2 3 4 5 |
|
Ruby 安装的时候会需要用到一些系统的依赖库,所以提前装好。
1 2 3 4 |
|
我这里使用的是 Rbenv 安装 Ruby, 我这里使用的是 2.3.1。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
我使用 Nginx + passenger 来运行 Rails 应用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
安装 postgres 的时候,需要注意将 pg_hba.conf 里面的配置改成 md5。
1 2 3 4 5 6 7 8 9 10 |
|
我是把代码放到 /home/deploy/apps/ 下面的,这里可以随意改动,不需要按照我这个配置。
1 2 3 4 5 6 7 8 |
|
服务器配置完成后,本地需要使用 capistrano 来自动部署代码,下面自己本机电脑上的操作。
Gemfile
1 2 3 4 5 6 7 8 |
|
bundle 完成之后, 运行 bundle exec cap install 会生成默认的 Capfile, deploy.rb 和 config/deploy 目录下的各个环境的配置文件。
Capfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
config/deploy.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
|
config/deploy/production.rb
1
|
|
这个时候,在本地运行下面的命令,代码会自动部署到服务器上的 /home/deploy/apps/blog 目录
1
|
|
将这个应用配置到 nginx 里面,然后删除默认的配置,重启 nginx 即可。设置的域名确保 A 地址指向你的服务器了。 至此,一个 Rails 应用部署配置完成了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
当你在开发中遇到这样一种场景,需要收集单个设备的数据信息,这个这个设备每隔 10 秒就会发一次数据 到 Rails 服务器,服务器需要把每次来的数据收集起来,以便以后数据分析使用,但这个设备会很多,几千, 几万,甚至几十万都是有可能的。
那一个设备的一天的数据量就是 10 * 60 * 60 * 24 = 864000 条,一年的就是 3 个亿,如果 1 万个设备的话, 就是 1 万亿条数据,看起来数据量有点恐怖,如果放在单表里面,势必随着数据量的增大,查询,插入等数据操作 的性能都会受到很大影响。
这个时候,有什么好的方法可以解决这个问题呢? 我当时正好使用的是 PostgresSQL,于是查了些资料,很多人 推荐表分区来解决此问题,那让我们来看看如何使用这一特性吧。
在 PG 里面就是一个主表,会有很多的子表继承主表,字段和主表一样。一般都是建立一个主表,里面是空,然后每个分区都去继承它。无论何时,都应保证主表里面是空的。
PostgresSQL 分区是把逻辑上的一个大表分割成物理上的几块。分区不仅能带来性能的提升,还能带来管理和维护上的方便。
表在多大情况下才考虑分区呢? PostgresSQL官方给出的建议是:当表本身大小超过了机器物理内存的实际大小时(the size of the table should exceed the physical memory of the database server),可以考虑分区。
因为本人使用的是 Rails 4.2 所以 Gemfile 配置如下, partitioned 是分区的主 gem, activerecord-redshift-adapter 是 partitioned 依赖的 gem ,为了兼容 rails 4 设置的版本。
1 2 |
|
因为我需要以 created_at 字段按月分区,所以需要继承 Partitioned::ByMonthlyTimeField 类。
1 2 3 4 5 6 7 8 9 10 11 |
|
如果你想指定哪张表使用此分区规则,只需要这个表的 model 继承 PartitionedByCreatedAtMonthly, 而不是继承 ActiveRecord::Base。
1 2 |
|
使用 migration 来提前创建分区表,这时候数据库会新建这样的分区表:”device_logs_partitions”.“p201607”, “device_logs_partitions”.“p201608”, “device_logs_partitions”.“p201609”…
1 2 3 4 5 6 7 8 9 10 11 12 |
|
上面的配置完成后,运行 rake db:migrate,使用 DeviceLog 模型创建一条记录,你会发现创建的数据会根据 created_at 的值自动创建到对应的分区表里面去。
1 2 |
|
会看到如下的插入 SQL
1
|
|
因为所有数据都到分区表了,所以 gem 的作者不建议直接使用 DeviceLog.find 方法,取而代之的是下面的查询方法, 这样的话只会在分区表里面查询。
1 2 3 |
|
至此基本分区表用法就是这样,这个 gem 其实还提供其他的分区规则,具体用法类似:
1 2 3 4 5 6 |
|
这个 gem 确实比自己在 PG 里面设定分区规则要方便很多,有类似需求的可以尝试使用下。
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中, 然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
最近有项目需要打包快速部署到不同的服务器的需要,如果和以前一样,从安装 Ruby 开始,然后数据库,依赖的一些库(node), nginx 配置等,一步一步搞的话,又慢又麻烦, 于是就想尝试使用 Docker 部署看看。
这里就不解释 Docker 的一些基本教程和使用方法了,需要学习的可以去 https://www.gitbook.com/book/yeasy/docker_practice/ 看看。 未完待续…
对于大型项目代码来说,Rails 5 增加了一个迅捷开发模式。
正如我们所知道的,在开发(development)模式时,如果代码发生了变化, 当一个请求到来时, Rails 会重新加载整个程序。这样做的方法已经发展了很多年。
很长一段时间的 Rails 简单地在每一个请求无条件地重新加载。
Rails 的 3.2 改善了这个处理,增加了文件系统监视器,通过遍历代码树的请求检查每个文件的修改时间(mtimes)。
这棵树的遍历,是每个请求才会发生,而不是显示每个页面视图都会做。尤其是遍历应用的每个 assets 文件,虽然遍历整个应用程序树一次可能不会花很多时间,但取决于你 assets 文件的数量和代码规模。
Rails 5 是增加了一个事件驱动的文件监视系统。当有新的文件变化的操作系统调用 Rails 的异步处理来设置标志。当收到请求时,该标志会被设定。
这个监视器默认是关闭的,应用程序可以在 Gemfile 增加如下配置:
1 2 3 |
|
在 Linux 和 Mac OS X 安装没有什么特别依赖,但是在 BSD 和 Windows 安装的话,需要安装些依赖。
即使事件驱动监视器被启用,Rails Console 里想加载新的代码,仍然需要手动 reload, 因为如果后台自动改变已经实例化的对象会让人感到惊讶。
相比遍历整个应用程序树,这个监视系统会加快开发模式里的请求 Response 速度,特别是对于大型项目来说。