基於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 && makeinstall
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
初始化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!
基於nginx+swoole+phalcon+atlas實現的高性能負載均衡集群系列之【構建篇】