基于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 -ivh mysql-community-client-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!

转载于:https://www.cnblogs.com/chrnote/p/8965910.html

SwooleDistributed 是swoole分布式系统的实现,他提供了一套基于swoole扩展的分布式通讯框架。结构图:SwooleDistributed 不仅提供了分布式搭建的必要设施,还提供了4大组件帮助你提高编写代码的效率,你既可以部署成单机模式也可以搭配dispatch模块构建集群系统。有别于传统的MVC架构,SwooleDistributed 主要应对的是rpc服务或者是通讯服务,也就是说MVC中的View模块是没有实际意义的,所以在SwooleDistributed 中仅存在Model和Controller,另外为了方便开发我们额外添加了2个组件分别是Task和Timer。Task组件主要是处理异步任务,由于Task的设计结构简单只适合用于辅助swoole的worker进程,处理简单并不复杂的异步操作,如果你将他作为复杂耗时并且频繁调用的组件那是不可取的。Timer是封装好的定时器,他和Task组件关系密切,你可以通过Timer进行定时任务。目前提供便利的还有异步的Redis连接池,你可以方便简单的使用redis异步服务而不用担心连接池的问题,我们已经优雅的解决了。但值得注意的是所有的异步服务都只允许在worker进程中调用,task进程只能调用同步服务。未来将要实现的:1.异步的mysql服务,建立管理mysql连接池。2.mysql语法构建器,帮助快速构建mysql语句。3.Job服务组件的开发,结合消息队列系统实现分布式的异步任务。安装须知:php 7.0  2.需要使用最新版的swoole,请通过github下载编译swoole,1.8.7在php7.0下存在bug不建议使用  3.需要redis支持,安装redis扩展  swoole编译时选择异步redis选项  4.需要composer支持,安装composer,运行composer install安装依赖  5.如需集群自行搭建LVS  运行:php start_swoole_server.php start    启动swoole server服务器  2.php start_swoole_dispatch.php start    启动swoole dispatch服务器  3.单独启动swoole server不具备分布式特性,一台物理机只允许启动一个swoole server  4.swoole dispatch服务器可以和swoole server放在一个物理机上,一台物理机只允许启动一个swoole dispatch  5.可以启动多台swoole server和多台swoole dispatch搭建分布式系统(至少1台LVS,2台swoole server,1台swoole dispatch,1个redis)  6.单独启动swoole server可作为单机服务器。  7.修改config目录下配置,改为你自己的配置。  8.swoole server与swoole dispatch 必须在同一个网段。swoole dispatch无需配置,swoole server会自动发现  9.swoole server与swoole dispatch 都支持动态弹性部署,随时热插拔。swoole dispatch上线后30秒内被swoole server发现并建立连接  10.内置controller,model,task 3大模块  11.swoole server与swoole dispatch都被设计成无状态服务器,所有的信息共享都通过redis  12.最新版采用了异步redis进行数据存储,通过开启一个新的redis连接池进程,利用addProcess和sendMessage技术进行结果分发,优雅解决异步问题。  13.注意taskproxy为单例,不要变成成员变量使用,用到时load 标签:通讯框架
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值