服务器集群使用过程中遇到的一些问题
自己参与开发的项目,在测试环境只有一台服务器,每次部署的时候只需要部署
单台服务器。可是生产环境则不一样,生产环境部署了10台左右的应用服务,跑起来
的效果和单台服务器不太一样。就好比开展工作的时候,对于重要的工作,一个人
可以做,五个人,十个人也可以同时做。这时就需要管理人员合理地去分配任务,
让大家一起高效地完全一件工作。
问题一:定时任务执行频率过高。
单台服务器执行某一个定时任务可能是1分钟执行一次,可是多台服务器同时在跑,
那理论上1分钟就可以执行6次。由于项目中没有独立的定时任务项目,因此使用了
很多的定时执行任务在连续不断地运行。单台服务器设置这些定时任务的频率,在生产
上面就不可行,如何解决这个问题呢?
解决方案:首先是增大执行的时间间隔,比如以前是1分钟执行一次,现在改为两分钟
或者三分钟执行一次。这样修改之后,还可能出现多台服务器在同一时间执行定时任务的
情况,因此就需要在进一步的优化。每次执行完一次任务之后,向缓存中添加一个最新
执行的时间。当某一台服务器再次执行定时任务的时候,从缓存当中取出最近一次的执行
时间,然后计算和当前时间的差值,如果小于指定的时间比如说2分钟,则不执行。如果
大于指定时间2分钟,则执行。这样就可以很好地解决高频率执行定时任务的问题。
问题二:某些服务配置的实例过多。
比如项目启动的时候,配置MQ消费的实例数,还有其他多线程任务的实例个数。单台
服务器可能配置三四个或者是20个不等。可是当多台服务器在跑的时候,就不能使用原有
的方式,比如20*8=160个实例,这样会大大地降低服务器的性能,虽然是多台也会降低性能。
那么怎么解决呢?
解决方案:调整每一台服务器中某些服务的初始化实例个数。比如将原有实例个数为20的修改
为3个,这样3*8=24个实例。并且这24个实例是分散在8台服务器上面的,处理的效率也会比
单台配置20个实例高很多。
问题三:数据库性能跟不上。
项目上线之后,还没有大规模的使用,在早高峰的时候一个接口的请求量预估在15W到20W。
除了用户的请求之外,还有高频率的数据库写操作,因为服务器在消费MQ的消息,高峰期时每
个小时约有几十万的数据写入表中,给数据库服务器造成了很大的压力。那么如何解决这个问题呢?
解决方案:终极方案是切换数据库,项目中有主从数据库,就类似于备用数据库。最终经过排查,
主库的服务器存在问题,因此切换到备用数据库,服务器的压力小很多。其次是减少和数据库的
交互次数,做各种优化,比如能从缓存中取数据,就不从数据库中拿。能操作两次数据库就搞定
的功能,决不操作三次数据库。这就涉及到多方面的性能优化问题,需要遇到问题的时候具体分析,
然后制定合适的应对方案。
系统开发是一个非常复杂的过程,在这个过程中会遇到各种各样想象不到的困难和问题,但是
解决问题的方式也是多种多样。而且有些解决方案是不能复用的,需要具体问题具体分析。这就
非常考验一个开发人员解决实际问题的能力,而且需要快速拿出可行的解决方案。在项目开发
设计的时候,就开始考虑各种性能问题,会让后面少走很多弯路。