monit 配置 监控启动 nginx php mysql redis mongodb 单台服务器永不宕机

安装参考:

http://linuxjcq.blog.51cto.com/3042600/717843

启动:monit -Ic /etc/monitrc &
crontab -e
*/600 * * * * /usr/local/bin/monit -Ic /etc/monitrc &
conf 配置:
—————nginx php mysql redis mongodb 配置 完美OK——————–
# nginx
check process nginx with pidfile /usr/local/nginx/logs/nginx.pid
start program = “/usr/local/nginx/sbin/nginx”
stop program = “/usr/bin/killall nginx”
if failed host 127.0.0.1 port 80 then restart
if cpu is greater than 40% for 2 cycles then alert
if cpu > 60% for 5 cycles then restart
if 10 restarts within 10 cycles then timeout
# php5-fpm
check process php-fpm with pidfile /var/run/php-fpm.pid
start program = “/usr/local/php5.3/sbin/php-fpm”
stop program = “/usr/bin/killall php-fpm”
if failed port 9000 then restart
if cpu is greater than 40% for 2 cycles then alert
if cpu > 60% for 5 cycles then restart
if 10 restarts within 10 cycles then timeout# php5-fpm binary.
check file php5-fpm-tcp_bin with path /usr/local/php5.3/sbin/php-fpm
if 10 restarts within 10 cycles then timeout
if failed checksum then unmonitor
if failed permission 755 then unmonitor
if failed uid root then unmonitor
if failed gid root then unmonitor
alert root@localhost# Test the init scripts.
check file php5-fpm-tcp_init with path /usr/local/php5.3/sbin/php-fpm
if failed checksum then unmonitor
if failed permission 755 then unmonitor
if failed uid root then unmonitor
if failed gid root then unmonitor
alert root@localhost
# mysql
check process mysql with pidfile /var/lib/mysql/localhost.localdomain.pid
group database
start program = “/sbin/service mysql start”
stop program = “/sbin/service mysql stop”
if failed port 8306 then restart
if 3 restarts within 10 cycles then timeout
# redis
check process redis with pidfile /var/run/redis.pid
start program = “/usr/local/redis/redis-server /usr/local/redis/redis.conf”
stop program = “/usr/bin/killall redis-server”
if failed host 127.0.0.1 port 6379 then restart
if cpu is greater than 40% for 2 cycles then alert
if cpu > 60% for 5 cycles then restart
if 10 restarts within 10 cycles then timeout
# mongodb
check process mongod with pidfile /usr/local/mongodb/data/mongod.lock
start program = “/usr/local/mongodb/bin/mongod –dbpath=/usr/local/mongodb/data/”
stop program = “/usr/bin/killall mongod”
if failed port 27017 protocol http and request “/” with timeout 10 seconds then restart
if 10 restarts within 10 cycles then timeout
—————-end——————-
/usr/local/mmonit/bin/mmonit -c /usr/local/mmonit/conf/server.xml -t
/usr/local/mmonit/bin/mmonit -c /usr/local/mmonit/conf/server.xml start
monit  -t
killall monit
monit -Ic /etc/monitrc &
telinit q
ps aux |grep monit
kill -1 1
ps aux |grep redis-server
killall redis-server
ll /var/run/redis.pid
/usr/local/redis/redis-server /usr/local/redis/redis.conf &
ps aux |grep php-fpm
killall php-fpm
/usr/local/php5.3/sbin/php-fpm
ps aux |grep mongod
killall mongod
/usr/local/mongodb/bin/mongod –dbpath=/usr/local/mongodb/data/ &
set mmonit http://monit:monit@142.4.48.50:8080/collector
set nginx port 80 and
    use address 142.4.48.50
    allow localhost
    allow 142.4.48.50
  location /monit/ {
        rewrite ^/monit/(.*) /$1 break;
        proxy_ignore_client_abort on;
        proxy_pass   http://192.168.1.10:2812; 
        proxy_redirect  http://192.168.1.10:2812/monit; 
    }

# include /etc/monit.d/*
# mysql
check process mysqld with pidfile /var/lib/mysql/localhost.localdomain.pid
  group database
  start program = “/etc/init.d/mysql start”
  stop program = “/etc/init.d/mysql stop”
  if failed host 127.0.0.1 port 8306 then restart
  if 5 restarts within 5 cycles then timeout
# nginx
check process nginx with pidfile /usr/local/nginx/logs/nginx.pid
  start program = “/usr/local/nginx/sbin/nginx”
  stop program = “/usr/bin/killall nginx”
  if failed host 127.0.0.1 port 80 then restart
  if cpu is greater than 40% for 2 cycles then alert
  if cpu > 60% for 5 cycles then restart
  if 10 restarts within 10 cycles then timeout
# redis
check process redis with pidfile /var/run/redis.pid
  start program = “/usr/local/redis/redis-server /usr/local/redis/redis.conf”
  stop program = “/usr/bin/killall redis-server”
  if 10 restarts within 10 cycles then timeout
check file dump.rdb with path /usr/local/redis/dump.rdb
  if size > 100 MB then alert
# php5-fpm
check process php-fpm with pidfile /var/run/php-fpm.pid
  start program = “/usr/local/php5.3/sbin/php-fpm”
  stop program = “/usr/bin/killall php-fpm”
  if failed host 127.0.0.1 port 9000 then restart
  if cpu is greater than 40% for 2 cycles then alert
  if cpu > 60% for 5 cycles then restart
  if 10 restarts within 10 cycles then timeout
# php5-fpm binary.
check file php5-fpm-tcp_bin with path /usr/local/php5.3/sbin/php-fpm
  if 10 restarts within 10 cycles then timeout
  if failed checksum then unmonitor
  if failed permission 755 then unmonitor
  if failed uid root then unmonitor
  if failed gid root then unmonitor
  alert root@localhost
# Test the init scripts.
check file php5-fpm-tcp_init with path /usr/local/php5.3/sbin/php-fpm
  if failed checksum then unmonitor
  if failed permission 755 then unmonitor
  if failed uid root then unmonitor
  if failed gid root then unmonitor
  alert root@localhost
# mysql
check process mysqld with pidfile /var/lib/mysql/localhost.localdomain.pid
  group database
  start program = “/sbin/service mysql start”
  stop program = “/sbin/service mysql stop”
  if failed host 127.0.0.1 port 8306 then restart
  if 2 restarts within 6 cycles then timeout
# mongodb
check process mongod with pidfile /usr/local/mongodb/data/mongod.lock
  start program = “/usr/local/mongodb/bin/mongod –dbpath=/usr/local/mongodb/data/”
  stop program = “/usr/bin/killall mongod”
  if failed port 27017 protocol http and request “/” with timeout 10 seconds then restart
  if 10 restarts within 10 cycles then timeout
#mongodb
check process mongod with pidfile “/usr/local/mongodb/data/mongod.lock”
  start program = “/usr/local/mongodb/bin/mongod –dbpath=/usr/local/mongodb/data/”
  stop program = “/usr/bin/killall  mongod”
  if failed port 27017 protocol http and request “/” with timeout 10 seconds then restart
  if 5 restarts within 5 cycles then timeout
# tomcat
check process tomcat with pidfile /var/run/tomcat/tomcat.pid
  start program = “/etc/init.d/tomcat start”
  as uid solr gid solr
  stop program = “/etc/init.d/tomcat stop”
  as uid solr gid solr
  if failed port 8080 then alert
  if failed port 8080 for 5 cycles then restart
set mmonit http://monit:monit@142.4.48.50:8080/collector
set httpd port 12112 and
    use address 142.4.48.50 //monit主机的IP
    allow localhost
    allow 142.4.48.50 //mmonit主机的IP

Cobar 实施步骤

三、实施步骤
3)下载Cobar压缩文件并解压,进入conf目录可以看到schema.xml, rule.xml, server.xml等相关的配置文件
#wget http://code.alibabatech.com/mvn/releases/com/alibaba/cobar/cobar-server/1.2.4/cobar-server-1.2.4.tar.gz
# tar -zxf cobar-server-1.2.4.tar.gz
# cd cobar-server-1.2.4
#可以看到bin,conf,lib,logs四个目录
4)schema.xml配置如下(注:schema.xml包含MySQL的IP、端口、用户名、密码等配置,您需要按照注释替换为您的MySQL信息)
<?xml version=”1.0″ encoding=”UTF-8″?>
 <!DOCTYPE cobar:schema SYSTEM “schema.dtd”>
<cobar:schema xmlns:cobar=”http://cobar.alibaba.com/”>
 <!– schema定义 –> <schema name=”dbtest” dataNode=”dnTest1″>
   <table name=”tb2″ dataNode=”dnTest2,dnTest3″ rule=”rule1″ /> </schema>
  <!– 数据节点定义,数据节点由数据源和其他一些参数组织而成。–>
<dataNode name=”dnTest1″>
<property name=”dataSource”><dataSourceRef>dsTest[0]</dataSourceRef> </property>
</dataNode>
<dataNode name=”dnTest2″>
<property name=”dataSource”><dataSourceRef>dsTest[1]</dataSourceRef> </property>
</dataNode>
<dataNode name=”dnTest3″><property name=”dataSource”> <dataSourceRef>dsTest[2]</dataSourceRef></property>
</dataNode>
<!– 数据源定义,数据源是一个具体的后端数据连接的表示。–>
<dataSource name=”dsTest” type=”mysql”>
<property name=”location”>
<location> 192.168.202.83:3306/dbsdtv1</location>
<!–注意:替换为您的MySQL IP和Port–> <location>192.168.202.84:3306/dbsdtv2</location>
<!–注意:替换为您的MySQL IP和Port–> <location>192.168.202.85:3306/dbsdtv3</location>
<!–注意:替换为您的MySQL IP和Port–>
 </property>
 <property name=”user”>root</property>
 <!–注意:替换为您的MySQL用户名–>
<property name=”password”>123abc</property> <!–注意:替换为您的MySQL密码–> <property name=”sqlMode”>STRICT_TRANS_TABLES</property> </dataSource> </cobar:schema>
5)rule.xml配置如下(本文仅以数字类型的id字段作为拆分字段,将数据拆分到两个库中)
<?xml version=”1.0″ encoding=”UTF-8″?> <!DOCTYPE cobar:rule SYSTEM “rule.dtd”> <cobar:rule xmlns:cobar=”http://cobar.alibaba.com/”>
<!– 路由规则定义,定义什么表,什么字段,采用什么路由算法。–>
<tableRule name=”rule1″>
<rule>
      <columns>id</columns>
      <algorithm><![CDATA[ func1(${id})]]></algorithm>
</rule>
</tableRule>
<!– 路由函数定义,应用在路由规则的算法定义中,路由函数可以自定义扩展。–>
 <function name=”func1″ class=”com.alibaba.cobar.route.function.PartitionByLong”> <property name=”partitionCount”>2</property>
<!—配置需要分发到几个分区上(服务器)–>
<property name=”partitionLength”>512</property>
<!- -分发数据的长度 –>
  </function>
 </cobar:rule>
6)server.xml配置如下
<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE cobar:server SYSTEM “server.dtd”>
 <cobar:server xmlns:cobar=”http://cobar.alibaba.com/”>
<!–定义Cobar用户名,密码–>
<user name=”test”>
<property name=”password”>test</property>
<property name=”schemas”>dbtest</property>
 </user>
 </cobar:server>
启动和使用Cobar
./startup.sh #Cobar进程名为CobarStartup
#使用lsof –i :8066查看进程是否存在如果存在该进程则证明cobar以正常启动
#一般情况下首次启动会报错这时需要调整startup.sh脚本中的xss参数,将该参数调大一些。
· 如何访问Cobar
访问Cobar同访问MySQL的方式相同,常用访问方式如下(注意:本文将Cobar部署在10.0.0.11这台机器上,否则请替换为您的Cobar所在IP,其他信息不变)
mysql -h10.0.0.11 -utest -ptest -P8066 -Ddbtest
#JDBC(建议5.1以上的mysql driver版本) Class.forName(“com.mysql.jdbc.Driver”); Connection conn = DriverManager.getConnection(“jdbc:mysql:// 10.0.0.11:8066/dbtest”, “test”, “test”); ……
测试与验证Cobar功能
mysql>insert into tb1 (id, gmt) values (1, now()); #向表tb1插入一条数据
mysql>insert into tb2 (id, val) values (1, “part1”); #向表tb2插入一条数据
mysql>insert into tb2 (id, val) values (2, “part1”), (513, “part2”);
#向表tb2同时插入多条数据
#此次根据rule.xml的设计规则id小于512的均插入分区1.大于512的插入分区2(服务器2)
mysql>select * from tb1; #查询表tb1,验证数据被成功插入
mysql>select * from tb2; #查询tb2,验证数据被成功插入
查看后端MySQL数据库dbsdtv1,dbsdtv2和dbsdtv3#验证数据分布在不同的库中

 

解密微软的架构师之路

http://www.programmer.com.cn/864/

——专访Windows HPC Server 架构师徐明强

Windows HPC Server架构师徐明强

Windows HPC Server架构师徐明强

文 / 白苗

若是说起架构师,几乎所有的开发人员都知道的一个伟大架构师来自微软,他就是比尔•盖。这个20世纪最伟大的技术天才有太多的传奇。对于架构师这个群体,他同样产生了非同小可的作用。作为一个企业的大老板,他是第一个给自己冠之以“首席架构师”头衔的人。也正因如此,整个IT领域才开始不断涌现出架构师这个并不算新的职业。为了追寻微软的架构师文化,我们采访了微Windows HPC Server架构师徐明强博士,邀请他为我们解密微软的架构师之路。

 

微软架构师定义

对微软内部的架构师的定义,Windows HPC Server架构师徐明强博士是这么描述的:“微架构师的职责定义主要在两个方面。一是要负责整个项目中技术活动和工程过程,进行领导和协调。二是要负责理解系统本身的业务需求,并且创建合理完善的一个系统体系架构。进一步的细化则可以展开来谈。”

“通常架构师要确立每一个构架视图的整体架构,比如说视图的详细结构、元素的分组以及实现主要分组之间的接口描述。因此和其他角色对比,架构设计师的见解是用在广度,不是在深度,这样才能确保架构师在技术活动中起到领导的作用。第二方面,对于业务需求来说,架构师要负责通过软件架构来决定主要的技术选型。典型的工作包括系统需求设计,实现和部署的视图以及测试等等。”

三种架构师

这种通用的解释如果难于理解,那么是不是会有更具体的实施方法?像微软这样庞大的软件开发组织结构里,架构师会根据产品团队,工作职能进行进一步划分。随后,徐明强开始介绍微软架构师的分类。

“如果要理解微软的架构师职能划分,就需要先了解微软的产品部门划分。通常在微软内部的产品组,有三个更小一级的分组,一是项目经理组,二是开发组,三则是测试组。”

“项目经理组主要是负责业务的需求定义,产品规格书撰写。而开发组则主要负责软件的实现,以满足项目经理所定义的需求规格书。测试团队的主要任务则是确保软件产品交付的质量。不同的分组,有不同的职能划分。因此,我们看做是有项目经理架构师,开发架构师和测试架构师几种基本类型。”

“不同的架构师职能大相径庭,比如项目经理架构师,更侧重于业务上的需要。从这个意义上看,你就会发现不同架构师的区别。由于项目经理主要是看用户的需求,对整个系统性能提出要求,对工作品质提出要求,同时还要确认在用户应用场景,产品是否可以有效地被系统支撑,因此它具备了非常不同的职能。”

“而开发组的架构师比较侧重于技术,尽管某些问题上会与项目经理架构师重叠,但更多时候分工还是非常明确的。技术架构师的一大职能是技术选型,比如在产品中选择使用什么技术,比如数据库要采用哪种规格的SQL server, 比如数据库的模式(schema)应该怎么样设计。当然,这里也包括.NET组件的选择等,这些是开发组架构师所关注的。

“从测试方面看,测试架构师则关注测试系统对架构的设计的帮助,包括如何自动化测试,或更有效的手工测试等。比如说HPC Server 测试组的架构师的工作,由于涉及到很复杂的分布式的系统,就需要做可扩展性测试,计算资源分配的测试,包括测试方法的设计等。”

协同工作,准确分工

这么多不同的架构师,如何协调工作,这是很多人马上会想到的问题。尤其是在面临冲突的时候如何解决,关系到每一项工作是否能顺利推进。关于这个问题,徐博士给我们举了个例子。

“比如我负责HPC Server 产品的规格说明书,那么开发组就会强调是否有充裕时间实现各个组件,而测试组将会根据规格说明书来考虑,这个组件所实现的功能是否严格满足规格要求。开发组会有很好的意愿来完成产品开发,但如何衡量是否完成却是一个问题。从我们的角度看,首先就是应用的场景。例如在一份需求说明文档中,如果你能描述为什么有这个需求,且写得非常清楚,那么开发就能准确地知道他们需要做的工作是什么。如果有一套非常清楚的目录,告诉用户如何使用产品,那么当这个系统做出来以后,每一步都应该考虑到用户在每一个阶段有什么样的知识背景能够完成下去。只要应用场景的故事清楚,文档自然也能够清楚。”

“当然,不同的工作也会有不同的优先级。这同样是项目经理架构师需要定义清楚的。技术架构师的主要精力,会放在具体选择哪个组件实现。这对于技术架构师来说,是非常有把握的。因此我们可以看到,产品需求定义得越细、需求的优先级定义得越好,说明项目经理架构师很好地完成了自己的工作,对于开发架构师的衡量,则是采用什么技术以及何种组件/架构提高了开发效率。”

“另外一方面是测试,项目经理的架构师同样需要与测试架构师协同工作。功能的每一个方面在需求中表现得越细致,各方面的系统指标越清晰,就越可以帮助测试架构师更好地完成其工作。牵涉到可扩展性、可延时等细节性能的指标,是测试架构师的优势,他们知道怎样才能处理好这些事情,但它们希望看到明确的指标。”

团队成长

多数公司里,架构师都是宝贝。而很多程序员,也确实梦想自己能成为一名软件架构师。但架构师的数量总是有限,多少人可以成为架构师?架构师的团队是如何成长起来的?徐博士用亲身经历讲述了HPC团队的发展历程。

“根据产品开发周期,不同的团队会有不同的配置。我在HPC产品组经历了两个多,近三个版本,所以有一点体会。在HPC第一版的时候,基本上我们的产品会分三个主要的组件,每个主要组件会有一个小团队。当时包括作业调度系统、管理系统和消息传递界面(MPI),基本上每个组件都有一个架构师。尽管有的一开始没有架构师的头衔。 当时大概是一个架构师和三个开发人员和三个测试人员协同战。”

“主要原因在于项目一开始,团队并没有考虑如何定义架构,这里包括技术选型等,很多时候架构师会考虑这些事情,此时不会严格按照前面说的不同角色分工。到了后期的版本,产品问世,用户需求喷涌而出的时候,项目管理架构师角色就开始明晰化了。尽管主要的工作是在第一个版本上增加功能,但各个部门都会开始聘用更多的开发人员和测试人员,同时管理人员也会增多。”

架构师的核心能力

为了让开发者逐渐成为架构师,基础的能力还是需要具备的。“我觉得架构师必须学会的第一件事情就懂得如何进行权衡。因为我们面对的都是相互矛盾的一些设计要素和限制,但事实却要求你在这些相互矛盾的要素限制和约束条件之间取得非常巧妙的平衡。”徐博士感叹道。

“架构师必须足够成熟。因为他们往往需要在无法获得完整信息的情况下,迅速领会问题,根据经验做出审慎判断。其实微软内部有能力要求,能把一张比较模糊的图片清晰化。这里我想归纳四个方面。首先是在专题领域的经验和对微软软件开发工程的经验。第二个就是判断力、决定能力和领导力,推动各个团队的技术进展,并且能在压力下作出关键性的决策,然后将开发贯彻到底,而且要提高效率。架构师有权在技术上作出决定,在大家意见不一致的时候,他要能给出自己的一个意见。第三则是善于沟通。这其中首先就是赢得他人的信任。只有这样,才可以对他们进行说服,而后进行指导。微软架构师跟其他的合作的人没有直接的上下级关系,所以不能靠命令进行指导,所以必须要靠赢得其他人的赞同。第四点,是通常说的抽象思维和分析的能力。具体思维的人可能比较注重细节,但往往也会将问题复杂化,使头绪增多而无法收敛。 抽象思维可以帮架构师地从大量信息、系统文件中,看出一些规律来,而且找出与之相关的方面,归纳关键问题,表述模糊的概念并将其变成相关各方能够理解的项目构件。”

“最后,我认为无论是什么样的架构师都要具备一定的商业头脑,业务的知识要充分把握,因为对业务把握能够带来一个拥抱变化的能力,而且可以在设计的时候留出一点扩展的余地,适应将来可能来临的需求变化。”