1. 程式人生 > >基於nginx+swoole+phalcon+atlas實現的高性能負載均衡集群系列之【構建篇】

基於nginx+swoole+phalcon+atlas實現的高性能負載均衡集群系列之【構建篇】

p12 adb 列表 服務器性能 nodeps devel unit tcl aio

一、簡介

  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實現的高性能負載均衡集群系列之【構建篇】