服务高可用

作为一个web服务,保证我们的系统24小时不间断对外服务是很重要的。在CmlPHP中也尽可能的让这个过程变得简单、易操作。

web服务(即php-fpm/nginx服务)

在实际项目中通常php跟nginx是部署在同一台上的。nginx对外跟用户交互。通过fast_cgi来跟php-fpm进程组通信。所以这边把这两者统一称做web服务。在项目允许的情况下尽可能根据需要部署多台nginx/php-fpm服务通过lvs/动态dns等方式进行轮询,至少电信一台网通一台让用户的请求尽快的得到响应。同时两台以上的机器在碰到网络异常等等的情况也不至于直接对外不可用。

数据库服务

通常在项目初期数据量较小、请求不多的时候是只采用单台db服务并定期备份数据。但是随着业务的增长,单台压力上来。我们可能会加入多台从库(mysql)/副本集、分片(mongo)。在cmlphp中配置mysql读写分离的方式如下:

  1. 'default_db' => array(
  2. 'driver' => 'MySql.Pdo', //数据库驱动
  3. 'master'=>array(
  4. 'host' => '192.168.3.10', //数据库主机
  5. 'username' => 'user', //数据库用户名
  6. 'password' =>'', //数据库密码
  7. 'dbname' => 'test', //数据库名
  8. 'charset' => 'utf8mb4', //数据库编码
  9. 'tableprefix' => 'pre_', //数据表前缀
  10. ),
  11. 'slaves'=>array(
  12. array(
  13. 'host' => '192.168.3.11', //数据库主机
  14. 'username' => 'user', //数据库用户名
  15. 'password' =>'', //数据库密码
  16. 'dbname' => 'test', //数据库名
  17. 'charset' => 'utf8mb4', //数据库编码
  18. 'tableprefix' => 'pre_', //数据表前缀
  19. ),
  20. array(
  21. 'host' => '192.168.3.12', //数据库主机
  22. 'username' => 'user', //数据库用户名
  23. 'password' =>'', //数据库密码
  24. 'dbname' => 'test', //数据库名
  25. 'charset' => 'utf8mb4', //数据库编码
  26. 'tableprefix' => 'pre_', //数据表前缀
  27. )
  28. ),
  29. 'cache_expire' => 3600,//查询数据缓存时间
  30. ),

我们这边看到这边配置了一主两从。框架会自动写到主库读从库。

缓存服务

在实际开发中,我们通常会将数据持久化到数据库中。通过使用缓存的方式来加快数据的读取,提高系统的并发能力。在一般场景中我们使用单台缓存服务就足够了(使用内网通信)。但是系统负载高的时候就需要多台cache时。cmlphp中缓存服务支持多台cache。

  1. // 缓存服务器的配置
  2. 'default_cache' => array(
  3. 'on' => 1, //为1则启用,或者不启用
  4. 'driver' => 'Redis',
  5. //'driver' => 'Memcache',
  6. 'prefix' => 'd_',
  7. 'server' => array(
  8. array(
  9. 'host' => '127.0.0.1',
  10. 'port' => '6701'
  11. ),
  12. array(
  13. 'host' => '127.0.0.1',
  14. 'port' => '6702'
  15. ),
  16. ),
  17. ),

这边配置了两台cache.多台直接配上去即可。这边有一台down掉。会自动容灾到其它机器。使用memcache驱动时使用驱动自带的集群功能。使用redis时当其中一台当掉自动容灾到相应的机器。也可以配置一台back,当redis有当掉的时候则优先使用back中的机器替代配置如下。back配置项只支持redis

  1. // 缓存服务器的配置
  2. 'default_cache' => array(
  3. 'on' => 1, //为1则启用,或者不启用
  4. 'driver' => 'Redis',
  5. //'driver' => 'Memcache',
  6. 'prefix' => 'd_',
  7. 'server' => array(
  8. array(
  9. 'host' => '127.0.0.1',
  10. 'port' => '6701'
  11. ),
  12. array(
  13. 'host' => '127.0.0.1',
  14. 'port' => '6702'
  15. ),
  16. ),
  17. 'back' => array(
  18. 'host' => '127.0.0.1',
  19. 'port' => '6379'
  20. )
  21. ),

原文: http://doc.cmlphp.com/availability.html