基于nginx+swoole+phalcon+atlas实现的高性能负载均衡集群系列之构建篇

Posted chrnote

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于nginx+swoole+phalcon+atlas实现的高性能负载均衡集群系列之构建篇相关的知识,希望对你有一定的参考价值。

 一、简介

  php一直诟病于性能,可对开发者如此友好的语言为什么不能登上大雅之堂? 于是php一线开发者站了出来。

先有鸟哥优化php引擎,又有rango大神开源swoole。至此,基于php7+swoole的php代码的性能已经超过了静态编译的go语言。

技术分享图片

  注: 1、图片截取自 https://wiki.swoole.com/wiki/page/508.html 

  

  框架作为协同开发规范和开发效率的保证,不得不被引入到日常开发中,可一旦加上了框架这层封装,势必影响php接口的整体性能。

  当下流行的php框架laravel,确实解决了很多规范和开发效率问题;但是臃肿的架构和用php去实现的封装,让他的性能表现不佳。

  针对这种情况,本架构选择c扩展框架phalcon作为开发框架,让框架带来的性能损耗,降到最小。

  本博文系列旨在介绍该架构的配置实现、性能优化、扩展性探讨、稳定性保障、安全性保证,后续会逐篇推出【性能优化篇】【扩展性探讨】【稳定性保障】【安全性保证】。

 二、配置细节

服务器:2台阿里云centos服务器(内存2G以上,mysql5.7最低支持2G内存)

web服务器: nginx(用权重做反向代理,因为服务器性能有可能不对等,为方便调整,故而用这种方式)

      swoole(代替php-fpm做php解析服务。由于swoole做php解析服务是异步非阻塞的,所以性能得到很大提升)

数据存储:   mysql5.7

        atlas(mysql读写分离传输中间件)

        redis

        pika(redis集群传输中间件)

php框架: phalcon

三、开始构建

1、安装nginx

先安装依赖
yum -y install pcre-devel openssl openssl-devel

开始安装
wget http://nginx.org/download/nginx-1.14.0.tar.gz
tar -xvf nginx-1.14.0.tar.gz
cd nginx-1.14.0
./configure
make && make install

2、安装mysql5.7

先卸载centos7中自带的mariadb
rpm -qa|grep mariadb //查询出来已安装的mariadb
rpm -qa | grep -i mysql // 查询已安装的mysql
rpm -e --nodeps 文件名 //卸载mariadb和mysql,文件名为上述命令查询出来的文件 安装依赖 yum -y install libaio.so.1 libgcc_s.so.1 libstdc++.so.6 yum -y update libstdc++-4.4.7-4.el6.x86_64 yum -y search libaio # 检索相关信息 yum -y install libaio # 安装依赖包 yum -y install net-tools 开始安装 mkdir mysql_bundle wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.22-1.el7.x86_64.rpm-bundle.tar tar -xvf mysql-5.7.22-1.el7.x86_64.rpm-bundle.tar -C mysql_bundle
cd mysql_bundle
/
rpm -ivh mysql-community-common-5.7.22-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.22-1.el7.x86_64.rpm
rpm -ivh mysql-community-devel-5.7.22-1.el7.x86_64.rpm
rpm -ivh mysql-community-embedded-5.7.22-1.el7.x86_64.rpm
rpm -e mysql-community-embedded-5.7.22-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.22-1.el7.x86_64.rpm

初始化mysql
mysqld --initialize --user=mysql

初始化完成后在mysqld.log文件末尾会有随机密码,一会登陆时候用

cat /var/log/mysqld.log
技术分享图片

启动mysql
systemctl start mysqld.service

首次登录mysql
mysql -uroot -pVjhOm8FJqs=2

  修改root密码

  msql>alter user ‘root‘@‘localhost‘ identified by ‘root‘;

  mysql>use mysql;

  msyql>update user set user.Host=‘%‘ where user.User=‘root‘;

 

  mysql>flush privileges;

  mysql>quit

 至此,mysql告一段落

 3、安装php7.2.5

安装依赖
yum -y install openssl install openssl-devel curl curl-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel pcre pcre-devel libxslt libxslt-devel bzip2 bzip2-devel

wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz
tar -zxvf libiconv-1.13.1.tar.gz
cd libiconv-1.13.1
./configure --prefix=/usr/local/libiconv
make
make install

开始安装
wget http://cn2.php.net/distributions/php-7.2.5.tar.gz
tar -xvf php-7.2.5.tar.gz
cd php-7.2.5
./configure --with-iconv=/usr/local/libiconv --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --enable-fpm
make && make install

安装成功后:
php --ini
技术分享图片

找到php.ini.development的位置:
技术分享图片

将php.ini.development cp到对应位置:
cp /home/install/php-7.2.5/php.ini-development /usr/local/lib/php.ini
由于我们不使用php-fpm做php解析服务,所以就不安装php-fpm了

 4、安装swoole

安装依赖
yum -y install m4 autoconf

开始安装
wget https://codeload.github.com/swoole/swoole-src/tar.gz/v2.1.3
tar -xvf v2.1.3
cd swoole-src-2.1.3/
phpize
./configure
make && make install

vim /usr/local/lib/php.ini
在尾部添加 extension=swoole.so

保存后,运行
php -m
技术分享图片
确保swoole出现在列表中,表示成功

5、安装phalcon

git下载实在太慢了
技术分享图片
选择最新版,下载zip版

安装sr和rz
yum install lrzsz

然后通过rz上传到服务器中

unzip cphalcon-3.3.2.zip
cd cphalcon-3.3.2/build/

安装依赖
yum -y install re2c

开始安装
./install

安装成功后
vim /usr/local/lib/php.ini
在尾部添加 extension=phalcon.so
技术分享图片
php -m
的列表中有phalcon,表示成功

6、安装phpredis扩展

技术分享图片

https://github.com/phpredis/phpredis/tree/4.0.2

从tag选择最新稳定版

下载,并上传到服务器解压

unzip phpredis-4.0.2.zip

cd phpredis-4.0.2

phpize
./configure
make && make install
vim /usr/local/lib/php.ini
在最后一行添加 extension=redis.so
php -m 列表中有redis,表明安装成功
技术分享图片

 7、安装atlas

访问:https://github.com/Qihoo360/Atlas/releases
下载atlas
技术分享图片
上传到服务器后
rpm -ivh Atlas-sharding_1.0.1-el6.x86_64.rpm
通过:/usr/local/mysql-proxy/bin/encrypt root
技术分享图片
获得加密串:DAJnl8cVzy8=

vim /usr/local/mysql-proxy/conf/test.cnf
将mysql帐号 和 加密串写入test.cnf
技术分享图片

开启atlas
/usr/local/mysql-proxy/bin/mysql-proxyd test start

尝试是否正常
mysql -uroot -proot -P1234
  技术分享图片

mysql -h127.0.0.1 -uuser -p12345678 -P2345
 技术分享图片
在另外一台主机上安装同样版本的mysql,且root密码也设置成一样的
 

 8、安装redis并配置集群

安装依赖

wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz  

tar -xvf tcl8.6.1-src.tar.gz

cd  tcl8.6.1/unix

./configure  

make && make install

  开始安装

tar -xvf redis-4.0.9.tar.gz
cd redis-4.0.9
make
make install

至此redis安装完毕,下面安装redis集群

安装依赖
yum -y install ruby ruby-devel rubygems rpm-build 

  yum install centos-release-scl-rh    //会在/etc/yum.repos.d/目录下多出一个CentOS-SCLo-scl-rh.repo源

  yum install rh-ruby23  -y    //直接yum安装即可  

  scl  enable  rh-ruby23 bash    //必要一步

  ruby -v    //查看安装版本 如果版本>=2.2表示成功

gem install redis

 设置redis.conf

  参照:https://www.cnblogs.com/yuanermen/p/5717885.html

  创建redis节点

     测试我们选择2台服务器,分别为:192.168.1.237,192.168.1.238.每分服务器有3个节点。

  我先在192.168.1.237创建3个节点:

技术分享图片
  cd /usr/local/
  mkdir redis_cluster  //创建集群目录
  mkdir 7000 7001 7002  //分别代表三个节点    其对应端口 7000 7001 7002
 //创建7000节点为例,拷贝到7000目录
 cp /usr/local/redis-3.2.1/redis.conf  ./redis_cluster/7000/   
 //拷贝到7001目录
 cp /usr/local/redis-3.2.1/redis.conf  ./redis_cluster/7001/   
 //拷贝到7002目录
 cp /usr/local/redis-3.2.1/redis.conf  ./redis_cluster/7002/   
技术分享图片

   分别对7001,7002、7003文件夹中的3个文件修改对应的配置

技术分享图片
daemonize    on                          //redis后台运行
pidfile  /var/run/redis_7000.pid          //pidfile文件对应7000,7002,7003
port  7000                                //端口7000,7002,7003
cluster-enabled  yes                      //开启集群  把注释#去掉
cluster-config-file  nodes_7000.conf      //集群的配置  配置文件首次启动自动生成 7000,7001,7002
cluster-node-timeout  5000                //请求超时  设置5秒够了
bind 0.0.0.0                  // 让redis可以被集群管理器访问
技术分享图片

   在192.168.1.238创建3个节点:对应的端口改为7003,7004,7005.配置对应的改一下就可以了。

/usr/local/bin/redis-server /usr/local/redis_cluster/7000/redis.conf &
/usr/local/bin/redis-server /usr/local/redis_cluster/7001/redis.conf &
/usr/local/bin/redis-server /usr/local/redis_cluster/7002/redis.conf &

/usr/local/bin/redis-server /usr/local/redis_cluster/7003/redis.conf &
/usr/local/bin/redis-server /usr/local/redis_cluster/7004/redis.conf &
/usr/local/bin/redis-server /usr/local/redis_cluster/7005/redis.conf &

/home/install/redis-4.0.9/src/redis-trib.rb create --replicas 1 47.106.151.23:7000 47.106.151.23:7001 47.106.151.23:7002 119.23.234.210:7003 119.23.234.210:7004 119.23.234.210:7005

ok!




















































































以上是关于基于nginx+swoole+phalcon+atlas实现的高性能负载均衡集群系列之构建篇的主要内容,如果未能解决你的问题,请参考以下文章

使用swoole框架还用 nginx吗

框架中集成swoole扩展怎么使用

如何在linux下安装phalcon框架php版本的扩展

phalcon + nginx 混合模式配置

谢烟客-----LNP之PHP C 扩展 (Phalcon)

swoole 怎么在nginx下运行