基于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
初始化mysqlmysqld
--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!