开源世界
Jan
12
NewRelic 估计很多人都用过,但是这货非常贵,贵的一般人买不起,尤其是个人项目,可咱也要性能指标分析啊!那来自己搭建一个
你需要三个工具:
InfluxDB - Go 写的一个 Time series (不知道怎么翻译) 数据库,用于存储指标、事件、分析等数据;
Grafana - 一个纯静态的项目,用于访问 InfluxDB,自定义报表,也就是上面那个图的内容,可以自由编辑;
influxdb-ruby - InfluxDB 的 Ruby 客户端库,用来写数据
安装 InfluxDB
InfluxDB 安装非常简单
Mac
Ubuntu
然后启动就可以了,帐号默认 root 密码 root 你可以打开它的 Web Admin 界面: http://127.0.0.1:8083/ 并创建一个数据库 rails_app
Grafana 安装
由于 Grafana 是存静态的,你只需要下载源代码解压,将它部署在 Nginx 上面就可以了,或者可以用 Python 的 SimpleHTTPServer 来跑
然后打开 http://127.0.0.1:8000 就可以看到 Grafana 的界面了,剩下的事情自己摸索。
数据埋点
gem install influxdb
或 Gemfile 加入 influxdb
Rails 项目 config/initializers/influxdb.rb
然后数据就会慢慢的写入到 InfluxDB 的 rails_app 会有新表 process_action.action_controller 你可以回到 InfluxDb Admin 里面查询看看
select * from process_action.action_controller;
或者用 list series 查看所有的表
list series;
其它的选择
除了用 Grafana 来展示统计的数据外,你还可以用 facette,它也是支持 InfluxDB 的,也是一个 Go 写的 Web Server,包含 Web 界面,可以自由配置(目前看起来可用性没有 Grafana 好)。
http://facette.io
2016 更新,用了 Grafana 3.0.0
收集系统数据用 Telegraf
如何将influxdb的数据配置进grafana:
https://www.rittmanmead.com/blog/2015/02/obiee-monitoring-and-diagnostics-with-influxdb-and-grafana/
你需要三个工具:
InfluxDB - Go 写的一个 Time series (不知道怎么翻译) 数据库,用于存储指标、事件、分析等数据;
Grafana - 一个纯静态的项目,用于访问 InfluxDB,自定义报表,也就是上面那个图的内容,可以自由编辑;
influxdb-ruby - InfluxDB 的 Ruby 客户端库,用来写数据
安装 InfluxDB
InfluxDB 安装非常简单
Mac
Homebrew 就可以安装
$ brew update
$ brew install influxdb
$ brew update
$ brew install influxdb
Ubuntu
# for 64-bit systems
wget http://s3.amazonaws.com/influxdb/influxdb_latest_amd64.deb
sudo dpkg -i influxdb_latest_amd64.deb
# for 32-bit systems
wget http://s3.amazonaws.com/influxdb/influxdb_latest_i386.deb
sudo dpkg -i influxdb_latest_i386.deb
wget http://s3.amazonaws.com/influxdb/influxdb_latest_amd64.deb
sudo dpkg -i influxdb_latest_amd64.deb
# for 32-bit systems
wget http://s3.amazonaws.com/influxdb/influxdb_latest_i386.deb
sudo dpkg -i influxdb_latest_i386.deb
然后启动就可以了,帐号默认 root 密码 root 你可以打开它的 Web Admin 界面: http://127.0.0.1:8083/ 并创建一个数据库 rails_app
Grafana 安装
由于 Grafana 是存静态的,你只需要下载源代码解压,将它部署在 Nginx 上面就可以了,或者可以用 Python 的 SimpleHTTPServer 来跑
$ wget http://grafanarel.s3.amazonaws.com/grafana-1.9.1.tar.gz
$ tar zxf grafana-1.9.1.tar.gz
$ cd grafana-1.9.1
$ python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...
$ tar zxf grafana-1.9.1.tar.gz
$ cd grafana-1.9.1
$ python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...
然后打开 http://127.0.0.1:8000 就可以看到 Grafana 的界面了,剩下的事情自己摸索。
数据埋点
gem install influxdb
或 Gemfile 加入 influxdb
Rails 项目 config/initializers/influxdb.rb
然后数据就会慢慢的写入到 InfluxDB 的 rails_app 会有新表 process_action.action_controller 你可以回到 InfluxDb Admin 里面查询看看
select * from process_action.action_controller;
或者用 list series 查看所有的表
list series;
其它的选择
除了用 Grafana 来展示统计的数据外,你还可以用 facette,它也是支持 InfluxDB 的,也是一个 Go 写的 Web Server,包含 Web 界面,可以自由配置(目前看起来可用性没有 Grafana 好)。
http://facette.io
2016 更新,用了 Grafana 3.0.0
收集系统数据用 Telegraf
如何将influxdb的数据配置进grafana:
https://www.rittmanmead.com/blog/2015/02/obiee-monitoring-and-diagnostics-with-influxdb-and-grafana/
Sep
9
【注】官方已经更新了依赖的第三方包的版本,最新获取的文件编译安装会遇到之前没有遇到的问题,下面是用全新最小化安装的CentOS 6.7 来编译安装的,更新系统后是CentOS 6.8了。
CentOS 6 全新最小化安装的操作系统:
#更新系统
yum update
#相关依赖的包
yum install -y readline readline-devel libstdc++-static glibc-static perl-Module-Install.noarch
一:获取源码:
git clone --recursive https://github.com/tencent-wechat/phxsql.git (--recursive参数可以同时获得所依赖的第三方库colib,glog,leveldb,protobuf源码,和依赖库phxpaxos,phxrpc)
1.1:升级相关依赖的库及工具。
1.1.1:autoconf
下载地址:http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
1.1.2:automake
下载地址:http://ftp.gnu.org/gnu/automake/automake-1.14.tar.gz
1.1.3:cmake
下载地址:https://cmake.org/files/v3.6/cmake-3.6.1.tar.gz
1.1.4:python
下载地址:https://www.python.org/ftp/python/2.7.12/Python-2.7.12.tgz
1.1.5:gcc
下载地址:http://ftp.gnu.org/gnu/gcc/gcc-6.2.0/gcc-6.2.0.tar.gz
二、编译相关依赖
2.1:colib
cd /home/phxsql/third_party/colib
make
2.2:glog
cd /home/phxsql/third_party/glog
./configure CXXFLAGS=-fPIC --prefix=/home/phxsql/third_party/glog
make
make install
2.3:leveldb
/home/phxsql/third_party/leveldb
make
mkdir lib
cp libleveldb.* ./lib
2.4:protobuf
cd /home/phxsql/third_party/protobuf
./autogen.sh
./configure CXXFLAGS=-fPIC --prefix=/home/phxsql/third_party/protobuf
make
make install
#执行autogen.sh的时候curl报超时的问题:
autogen.sh 文件的第34行gmock的下载地址是https://googlemock.googlecode.com/files/gmock-1.7.0.zip,这个地址在国内正常是访问不了的,所以在执行./autogen.sh的时候会报curl超时,翻出墙外之后这个地址也不能下载,404,应该不会是忘了上传了吧。
解决办法1:
修改autogen.sh文件第34行的下载地址,把https://googlemock.googlecode.com/files/gmock-1.7.0.zip 改为wget http://www.zhanghaijun.com/soft/gmock-1.7.0.zip,这个我已经把两个包都下载了,打包好了。
解决办法2:
项目地址:https://github.com/google/googlemock
项目地址:https://github.com/google/googletest
wget https://github.com/google/googlemock/archive/release-1.7.0.zip
unzip -q release-1.7.0.zip
rm release-1.7.0.zip
mv googlemock-release-1.7.0 gmock
wget https://github.com/google/googletest/archive/release-1.7.0.zip
unzip -q release-1.7.0.zip
rm release-1.7.0.zip
mv googletest-release-1.7.0 gmock/gtest
解决办法三:
wget http://www.zhanghaijun.com/soft/gmock-1.7.0.zip
unzip gmock-1.7.0.zip
mv gmock-1.7.0 gmock
2.5:phxrpc
cd /home/phxsql/third_party/phxrpc
mv third_party/protobuf third_party/bak_protobuf
ln -sf /home/phxsql/third_party/protobuf /home/phxsql/third_party/phxrpc/third_party/protobuf
make
2.6:phxpaxos
三、编译安装PHXSQL
3.1:生成安装包
[root@localhost phxsql]# make package
creating package phxsql-0.8.0.tar.gz...
生成的压缩包名称为:phxsql-0.8.0.tar.gz,把它拷贝到其他机器上就可以部署了。
四、部署测试
把安装包拷贝到其他测试的机器上,解压,本文目录为/home/phxsql
创建mysql用户
useradd -d /home/datacenter -s /sbin/nologin mysql
mkdir /home/phxsql/etc
cd /home/phxsql/tools
把director_operator.py文件第26行中的chown user:mysql 修改为chown mysql:mysql
#因为前面测试的时候已经用三台虚拟机搭过一个集群了,这次就把这台机器加入到之前部署的集群中
[root@localhost sbin]# ./phxbinlogsvr_tools_phxrpc -f AddMember -h192.168.1.241 -p17000 -m 192.168.1.243
get master 192.168.1.241 expire time 1473413135
AddMember 192.168.1.243 done
#初始化PhxSQL
mkdir /home/datacenter
/usr/local/python27/bin/python2.7 install.py -i"192.168.1.243" -p 54321 -g 6000 -y 11111 -P 17000 -a 8001 -f /home/datacenter/
#备份集群中其他机器的percona数据
/home/phxsql/percona.src/bin/mysqldump --set-gtid-purged=off -h 192.168.1.186 -P11111 -u root --all-databases >/home/all.sql
#kill掉新加入机器的phxbinlogsvr进程
ps axf|grep phxbinlogsvr|grep -v grep|awk '{print $1}'|xargs kill
#通过本地端口登录新加机器的percona
/home/phxsql/percona.src/bin/mysql -h 127.0.0.1 -P11111 -u root
#登录之后执行以下操作
set GLOBAL super_read_only = 0; set GLOBAL read_only = 0;
#导入其他机器备份出的percona数据
/home/phxsql/percona.src/bin/mysql -h 127.0.0.1 -P11111 -u root < /home/all.sql
#启动phxbinlogsvr
nohup /home/phxsql/sbin/phxbinlogsvr_phxrpc &
之前的测试的集群由3台变成4台了
[root@localhost sbin]# ./phxbinlogsvr_tools_phxrpc -f GetMemberList -h"192.168.1.186" -p 17000
get master 192.168.1.241 expire time 1473416759
ip 192.168.1.186 port 17000
ip 192.168.1.180 port 17000
ip 192.168.1.241 port 17000
ip 192.168.1.243 port 17000
#查看复制状态,如果都是YES就可以测试了。
/home/phxsql/percona.src/bin/mysql -h 127.0.0.1 -P11111 -u root -e "show slave status\G;"
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
#测试
./test_phxsql.sh 54321 192.168.1.186 192.168.1.180 192.168.1.241 192.168.1.243
【附】:已编译版本下载:http://pan.baidu.com/s/1c1PgDQK 提取密码: dhxm,MD5:ffcebea7eebf51b2b9bcd52696bd2b1f
CentOS 6 全新最小化安装的操作系统:
yum install -y patch make gcc gcc-c++ gcc-g77 flex bison file libtool libtool-libs autoconf kernel-devel kernel-headers libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel libevent libevent-devel ncurses ncurses-devel curl curl-devel libidn libidn-devel openssl openssl-devel vim-minimal nano fonts-chinese gettext gettext-devel gmp-devel unzip automake libxslt libxslt-devel wget tar libcurl libcurl-devel libcap diffutils ca-certificates net-tools libc-client-devel psmisc libXpm-devel git git-core c-ares-devel libicu-devel libzip libzip-devel perl perl-devel python python-devel
#更新系统
yum update
#相关依赖的包
yum install -y readline readline-devel libstdc++-static glibc-static perl-Module-Install.noarch
一:获取源码:
git clone --recursive https://github.com/tencent-wechat/phxsql.git (--recursive参数可以同时获得所依赖的第三方库colib,glog,leveldb,protobuf源码,和依赖库phxpaxos,phxrpc)
1.1:升级相关依赖的库及工具。
1.1.1:autoconf
下载地址:http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
tar xzvf autoconf-2.69.tar.gz
cd autoconf-2.69
./configure --prefix=/usr/local/autoconf-2.69
make && make install
mv /usr/bin/autoconf /usr/bin/bak_autoconf
mv /usr/bin/autoheader /usr/bin/bak_autoheader
mv /usr/bin/autom4te /usr/bin/bak_autom4te
mv /usr/bin/autoreconf /usr/bin/bak_autoreconf
mv /usr/bin/autoscan /usr/bin/bak_autoscan
mv /usr/bin/autoupdate /usr/bin/bak_autoupdate
ln -sf /usr/local/autoconf-2.69/bin/autoconf /usr/bin/autoconf
ln -sf /usr/local/autoconf-2.69/bin/autoheader /usr/bin/autoheader
ln -sf /usr/local/autoconf-2.69/bin/autom4te /usr/bin/autom4te
ln -sf /usr/local/autoconf-2.69/bin/autoreconf /usr/bin/autoreconf
ln -sf /usr/local/autoconf-2.69/bin/autoscan /usr/bin/autoscan
ln -sf /usr/local/autoconf-2.69/bin/autoupdate /usr/bin/autoupdate
cd autoconf-2.69
./configure --prefix=/usr/local/autoconf-2.69
make && make install
mv /usr/bin/autoconf /usr/bin/bak_autoconf
mv /usr/bin/autoheader /usr/bin/bak_autoheader
mv /usr/bin/autom4te /usr/bin/bak_autom4te
mv /usr/bin/autoreconf /usr/bin/bak_autoreconf
mv /usr/bin/autoscan /usr/bin/bak_autoscan
mv /usr/bin/autoupdate /usr/bin/bak_autoupdate
ln -sf /usr/local/autoconf-2.69/bin/autoconf /usr/bin/autoconf
ln -sf /usr/local/autoconf-2.69/bin/autoheader /usr/bin/autoheader
ln -sf /usr/local/autoconf-2.69/bin/autom4te /usr/bin/autom4te
ln -sf /usr/local/autoconf-2.69/bin/autoreconf /usr/bin/autoreconf
ln -sf /usr/local/autoconf-2.69/bin/autoscan /usr/bin/autoscan
ln -sf /usr/local/autoconf-2.69/bin/autoupdate /usr/bin/autoupdate
1.1.2:automake
下载地址:http://ftp.gnu.org/gnu/automake/automake-1.14.tar.gz
tar xzvf automake-1.14.tar.gz
cd automake-1.14
./configure --prefix=/usr/local/automake-1.14
make && make install
ln -sf /usr/local/automake-1.14/bin/aclocal-1.14 /usr/bin/aclocal-1.14
ln -sf /usr/local/automake-1.14/bin/automake-1.14 /usr/bin/automake-1.14
ln -sf /usr/local/automake-1.14/bin/aclocal-1.14 /usr/bin/aclocal-1.14
mkdir /usr/share/automake-1.14
ln -sf /usr/local/automake-1.14/share/automake-1.14/test-driver /usr/share/automake-1.14/test-driver
cd automake-1.14
./configure --prefix=/usr/local/automake-1.14
make && make install
ln -sf /usr/local/automake-1.14/bin/aclocal-1.14 /usr/bin/aclocal-1.14
ln -sf /usr/local/automake-1.14/bin/automake-1.14 /usr/bin/automake-1.14
ln -sf /usr/local/automake-1.14/bin/aclocal-1.14 /usr/bin/aclocal-1.14
mkdir /usr/share/automake-1.14
ln -sf /usr/local/automake-1.14/share/automake-1.14/test-driver /usr/share/automake-1.14/test-driver
1.1.3:cmake
下载地址:https://cmake.org/files/v3.6/cmake-3.6.1.tar.gz
tar xzvf cmake-3.6.1.tar.gz
cd cmake-3.6.1
./configure
make && make install
cd cmake-3.6.1
./configure
make && make install
1.1.4:python
下载地址:https://www.python.org/ftp/python/2.7.12/Python-2.7.12.tgz
tar xzvf Python-2.7.12.tgz
cd Python-2.7.12
./configure --prefix=/usr/local/python27
make && make install
cd Python-2.7.12
./configure --prefix=/usr/local/python27
make && make install
1.1.5:gcc
下载地址:http://ftp.gnu.org/gnu/gcc/gcc-6.2.0/gcc-6.2.0.tar.gz
tar xzvf gcc-6.2.0.tar.gz
cd gcc-6.2.0/
./contrib/download_prerequisites
cd ..
mkdir gcc-build-6.2.0
cd gcc-build-6.2.0/
../gcc-6.2.0/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
make -j4 (-j4参数根据自己的cpu核心数来设置,这样编译的速度会快点,其实加了编译的时间也很长的)
make install
ls /usr/local/bin | grep gcc
update-alternatives --install /usr/bin/gcc gcc /usr/local/bin/x86_64-pc-linux-gnu-gcc-6.2.0 40 (优先使用6.2.0版本的gcc)
执行以上操作之后使用 gcc --version 就可以看见当前使用的gcc版本是gcc (GCC) 6.2.0的新版本了。
cp ./x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.22 /usr/lib64/
删除原来低版本的软链:rm -rf /usr/lib64/libstdc++.so.6
创建新版本的软链:ln -sf /usr/lib64/libstdc++.so.6.0.22 /usr/lib64/libstdc++.so.6
cd gcc-6.2.0/
./contrib/download_prerequisites
cd ..
mkdir gcc-build-6.2.0
cd gcc-build-6.2.0/
../gcc-6.2.0/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
make -j4 (-j4参数根据自己的cpu核心数来设置,这样编译的速度会快点,其实加了编译的时间也很长的)
make install
ls /usr/local/bin | grep gcc
update-alternatives --install /usr/bin/gcc gcc /usr/local/bin/x86_64-pc-linux-gnu-gcc-6.2.0 40 (优先使用6.2.0版本的gcc)
执行以上操作之后使用 gcc --version 就可以看见当前使用的gcc版本是gcc (GCC) 6.2.0的新版本了。
cp ./x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.22 /usr/lib64/
删除原来低版本的软链:rm -rf /usr/lib64/libstdc++.so.6
创建新版本的软链:ln -sf /usr/lib64/libstdc++.so.6.0.22 /usr/lib64/libstdc++.so.6
二、编译相关依赖
2.1:colib
cd /home/phxsql/third_party/colib
make
2.2:glog
cd /home/phxsql/third_party/glog
./configure CXXFLAGS=-fPIC --prefix=/home/phxsql/third_party/glog
make
make install
2.3:leveldb
/home/phxsql/third_party/leveldb
make
mkdir lib
cp libleveldb.* ./lib
2.4:protobuf
cd /home/phxsql/third_party/protobuf
./autogen.sh
./configure CXXFLAGS=-fPIC --prefix=/home/phxsql/third_party/protobuf
make
make install
#执行autogen.sh的时候curl报超时的问题:
autogen.sh 文件的第34行gmock的下载地址是https://googlemock.googlecode.com/files/gmock-1.7.0.zip,这个地址在国内正常是访问不了的,所以在执行./autogen.sh的时候会报curl超时,翻出墙外之后这个地址也不能下载,404,应该不会是忘了上传了吧。
解决办法1:
修改autogen.sh文件第34行的下载地址,把https://googlemock.googlecode.com/files/gmock-1.7.0.zip 改为wget http://www.zhanghaijun.com/soft/gmock-1.7.0.zip,这个我已经把两个包都下载了,打包好了。
解决办法2:
项目地址:https://github.com/google/googlemock
项目地址:https://github.com/google/googletest
wget https://github.com/google/googlemock/archive/release-1.7.0.zip
unzip -q release-1.7.0.zip
rm release-1.7.0.zip
mv googlemock-release-1.7.0 gmock
wget https://github.com/google/googletest/archive/release-1.7.0.zip
unzip -q release-1.7.0.zip
rm release-1.7.0.zip
mv googletest-release-1.7.0 gmock/gtest
解决办法三:
wget http://www.zhanghaijun.com/soft/gmock-1.7.0.zip
unzip gmock-1.7.0.zip
mv gmock-1.7.0 gmock
2.5:phxrpc
cd /home/phxsql/third_party/phxrpc
mv third_party/protobuf third_party/bak_protobuf
ln -sf /home/phxsql/third_party/protobuf /home/phxsql/third_party/phxrpc/third_party/protobuf
make
2.6:phxpaxos
cd /home/phxsql/third_party/phxpaxos
mv third_party/protobuf third_party/bak_protobuf
mv third_party/leveldb third_party/bak_leveldb
mv third_party/glog third_party/bak_glog
ln -sf /home/phxsql/third_party/protobuf /home/phxsql/third_party/phxpaxos/third_party/protobuf
ln -sf /home/phxsql/third_party/leveldb /home/phxsql/third_party/phxpaxos/third_party/leveldb
ln -sf /home/phxsql/third_party/glog /home/phxsql/third_party/phxpaxos/third_party/glog
./autoinstall.sh
make
make install
cd plugin
make
make install
mv third_party/protobuf third_party/bak_protobuf
mv third_party/leveldb third_party/bak_leveldb
mv third_party/glog third_party/bak_glog
ln -sf /home/phxsql/third_party/protobuf /home/phxsql/third_party/phxpaxos/third_party/protobuf
ln -sf /home/phxsql/third_party/leveldb /home/phxsql/third_party/phxpaxos/third_party/leveldb
ln -sf /home/phxsql/third_party/glog /home/phxsql/third_party/phxpaxos/third_party/glog
./autoinstall.sh
make
make install
cd plugin
make
make install
三、编译安装PHXSQL
cd /home/phxsql
wget https://www.percona.com/downloads/Percona-Server-5.6/Percona-Server-5.6.31-77.0/source/tarball/percona-server-5.6.31-77.0.tar.gz
tar xzvf percona-server-5.6.31-77.0.tar.gz
mv percona-server-5.6.31-77.0 percona
sh autoinstall.sh
make
make install
wget https://www.percona.com/downloads/Percona-Server-5.6/Percona-Server-5.6.31-77.0/source/tarball/percona-server-5.6.31-77.0.tar.gz
tar xzvf percona-server-5.6.31-77.0.tar.gz
mv percona-server-5.6.31-77.0 percona
sh autoinstall.sh
make
make install
3.1:生成安装包
[root@localhost phxsql]# make package
creating package phxsql-0.8.0.tar.gz...
生成的压缩包名称为:phxsql-0.8.0.tar.gz,把它拷贝到其他机器上就可以部署了。
四、部署测试
把安装包拷贝到其他测试的机器上,解压,本文目录为/home/phxsql
创建mysql用户
useradd -d /home/datacenter -s /sbin/nologin mysql
mkdir /home/phxsql/etc
cd /home/phxsql/tools
把director_operator.py文件第26行中的chown user:mysql 修改为chown mysql:mysql
#因为前面测试的时候已经用三台虚拟机搭过一个集群了,这次就把这台机器加入到之前部署的集群中
[root@localhost sbin]# ./phxbinlogsvr_tools_phxrpc -f AddMember -h192.168.1.241 -p17000 -m 192.168.1.243
get master 192.168.1.241 expire time 1473413135
AddMember 192.168.1.243 done
#初始化PhxSQL
mkdir /home/datacenter
/usr/local/python27/bin/python2.7 install.py -i"192.168.1.243" -p 54321 -g 6000 -y 11111 -P 17000 -a 8001 -f /home/datacenter/
#备份集群中其他机器的percona数据
/home/phxsql/percona.src/bin/mysqldump --set-gtid-purged=off -h 192.168.1.186 -P11111 -u root --all-databases >/home/all.sql
#kill掉新加入机器的phxbinlogsvr进程
ps axf|grep phxbinlogsvr|grep -v grep|awk '{print $1}'|xargs kill
#通过本地端口登录新加机器的percona
/home/phxsql/percona.src/bin/mysql -h 127.0.0.1 -P11111 -u root
#登录之后执行以下操作
set GLOBAL super_read_only = 0; set GLOBAL read_only = 0;
#导入其他机器备份出的percona数据
/home/phxsql/percona.src/bin/mysql -h 127.0.0.1 -P11111 -u root < /home/all.sql
#启动phxbinlogsvr
nohup /home/phxsql/sbin/phxbinlogsvr_phxrpc &
之前的测试的集群由3台变成4台了
[root@localhost sbin]# ./phxbinlogsvr_tools_phxrpc -f GetMemberList -h"192.168.1.186" -p 17000
get master 192.168.1.241 expire time 1473416759
ip 192.168.1.186 port 17000
ip 192.168.1.180 port 17000
ip 192.168.1.241 port 17000
ip 192.168.1.243 port 17000
#查看复制状态,如果都是YES就可以测试了。
/home/phxsql/percona.src/bin/mysql -h 127.0.0.1 -P11111 -u root -e "show slave status\G;"
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
#测试
./test_phxsql.sh 54321 192.168.1.186 192.168.1.180 192.168.1.241 192.168.1.243
【附】:已编译版本下载:http://pan.baidu.com/s/1c1PgDQK 提取密码: dhxm,MD5:ffcebea7eebf51b2b9bcd52696bd2b1f
Sep
8
官方更新了第三方库的版本之后,编译方法和可能遇到的错误和本文部分内容不一样了,全新安装的朋友请看【CentOS下PhxSQL编译安装第2版】
注:仅测试在CentOS release 6.7 和 CentOS Linux release 7.2.1511下编译通过,本文以用户使用较多的CentOS 6 操作系统为例,centos 7 的差别是不需要升级autoconf、automake、gcc和python的版本,其他操作系统的用户请参考官方提供的中文详细编译手册:https://github.com/tencent-wechat/phxsql/wiki/%E4%B8%AD%E6%96%87%E8%AF%A6%E7%BB%86%E7%BC%96%E8%AF%91%E6%89%8B%E5%86%8C
一、准备工作
1.1:相关项目地址:
https://github.com/tencent-wechat/phxsql
https://github.com/google/glog
https://github.com/google/googlemock
https://github.com/google/leveldb
https://github.com/tencent-wechat/phxpaxos
https://github.com/tencent-wechat/phxrpc
https://github.com/tencent-wechat/libco
https://github.com/google/protobuf
1.2:获取源码:
git clone --recursive https://github.com/tencent-wechat/phxsql.git (--recursive参数可以同时获得所依赖的第三方库colib,glog,leveldb,protobuf源码,和依赖库phxpaxos,phxrpc)
1.3:编译前的准备工作,由于centos自带或者使用yum安装的工具软件版本都比较低,所以要升级相关依赖的库及工具。
1.3.1:
yum install readline readline-devel libstdc++-static glibc-static perl-Module-Install.noarch -y
1.3.2:autoconf
下载地址:http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
1.3.3:automake
下载地址:http://ftp.gnu.org/gnu/automake/automake-1.14.tar.gz
1.3.4:cmake
下载地址:https://cmake.org/files/v3.6/cmake-3.6.1.tar.gz
1.3.5:python
下载地址:https://www.python.org/ftp/python/2.7.12/Python-2.7.12.tgz
1.3.6:gcc
下载地址:http://ftp.gnu.org/gnu/gcc/gcc-4.9.4/gcc-4.9.4.tar.gz
####################################################################
1.3.7:boost (此步可忽略)
官网:http://www.boost.org/
下载地址:https://sourceforge.net/projects/boost/files/boost/1.61.0/
tar xzvf boost_1_61_0.tar.gz
cd boost_1_61_0
./bootstrap.sh --prefix=/usr/local/boost
./b2
./b2 install
echo /usr/local/boost/lib >/etc/ld.so.conf.d/boost.conf
ldconfig
####################################################################
二、编译相关依赖
三、编译安装PHXSQL
四、部署测试
把安装包拷贝到其他测试的机器上,解压,本文目录全部为/home/phxsql
创建mysql用户
useradd -d /home/datacenter -s /sbin/nologin mysql
mkdir /home/phxsql/etc
cd /home/phxsql/tools
把director_operator.py文件第26行中的chown user:mysql 修改为chown mysql:mysql
把binary_installer.py文件第35行中的 cd %s/percona.src; ./scripts/mysql_install_db --defaults-file=%s/etc/my.cnf 修改为:cd %spercona.src; ./scripts/mysql_install_db --defaults-file=%setc/my.cnf
测试部署是用的三台虚拟机:
python install.py -i"192.168.1.186" -p 54321 -g 6000 -y 11111 -P 17000 -a 8001 -f /home/datacenter/
python install.py -i"192.168.1.180" -p 54321 -g 6000 -y 11111 -P 17000 -a 8001 -f /home/datacenter/
/usr/local/python27/bin/python2.7 install.py -i"192.168.1.241" -p 54321 -g 6000 -y 11111 -P 17000 -a 8001 -f /home/datacenter/
在任意一台机器上执行
cd /home/phxsql/sbin/
./phxbinlogsvr_tools_phxrpc -f InitBinlogSvrMaster -h"192.168.1.186,192.168.1.180,192.168.1.241" -p 17000 (集群初始化完成之后就可以使用了。)
./phxbinlogsvr_tools_phxrpc -f GetMemberList -h"192.168.1.186" -p 17000
get master 192.168.1.241 expire time 1473313474
ip 192.168.1.186 port 17000
ip 192.168.1.180 port 17000
ip 192.168.1.241 port 17000
登录数据库:
/home/phxsql/percona.src/bin/mysql -uroot -h"192.168.1.186" -P54321
#获取master信息:
./phxbinlogsvr_tools_phxrpc -f GetMasterInfoFromGlobal -h 192.168.1.186 -p 17000
get master 192.168.1.241 expire time 1473314016
修改管理帐号及密码:
./phxbinlogsvr_tools_phxrpc -f SetMySqlAdminInfo -h 192.168.1.180 -p 17000 -u root -d "" -U zhj -D zhj2016
get master 192.168.1.241 expire time 1473313844
SetMySqlAdminInfo admin username root -> new admin username zhj
用官方提供的测试工具测试:
cd /home/phxsql/tools/
chmod +x test_phxsql.sh
./test_phxsql.sh 54321 192.168.1.186 192.168.1.180 192.168.1.241
sysbench 简单测试:
注:仅测试在CentOS release 6.7 和 CentOS Linux release 7.2.1511下编译通过,本文以用户使用较多的CentOS 6 操作系统为例,centos 7 的差别是不需要升级autoconf、automake、gcc和python的版本,其他操作系统的用户请参考官方提供的中文详细编译手册:https://github.com/tencent-wechat/phxsql/wiki/%E4%B8%AD%E6%96%87%E8%AF%A6%E7%BB%86%E7%BC%96%E8%AF%91%E6%89%8B%E5%86%8C
一、准备工作
1.1:相关项目地址:
https://github.com/tencent-wechat/phxsql
https://github.com/google/glog
https://github.com/google/googlemock
https://github.com/google/leveldb
https://github.com/tencent-wechat/phxpaxos
https://github.com/tencent-wechat/phxrpc
https://github.com/tencent-wechat/libco
https://github.com/google/protobuf
1.2:获取源码:
git clone --recursive https://github.com/tencent-wechat/phxsql.git (--recursive参数可以同时获得所依赖的第三方库colib,glog,leveldb,protobuf源码,和依赖库phxpaxos,phxrpc)
1.3:编译前的准备工作,由于centos自带或者使用yum安装的工具软件版本都比较低,所以要升级相关依赖的库及工具。
1.3.1:
yum install readline readline-devel libstdc++-static glibc-static perl-Module-Install.noarch -y
1.3.2:autoconf
下载地址:http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
tar xzvf autoconf-2.69.tar.gz
cd autoconf-2.69
./configure --prefix=/usr/local/autoconf-2.69
make && make install
mv /usr/bin/autoconf /usr/bin/bak_autoconf
mv /usr/bin/autoheader /usr/bin/bak_autoheader
mv /usr/bin/autom4te /usr/bin/bak_autom4te
mv /usr/bin/autoreconf /usr/bin/bak_autoreconf
mv /usr/bin/autoscan /usr/bin/bak_autoscan
mv /usr/bin/autoupdate /usr/bin/bak_autoupdate
ln -sf /usr/local/autoconf-2.69/bin/autoconf /usr/bin/autoconf
ln -sf /usr/local/autoconf-2.69/bin/autoheader /usr/bin/autoheader
ln -sf /usr/local/autoconf-2.69/bin/autom4te /usr/bin/autom4te
ln -sf /usr/local/autoconf-2.69/bin/autoreconf /usr/bin/autoreconf
ln -sf /usr/local/autoconf-2.69/bin/autoscan /usr/bin/autoscan
ln -sf /usr/local/autoconf-2.69/bin/autoupdate /usr/bin/autoupdate
cd autoconf-2.69
./configure --prefix=/usr/local/autoconf-2.69
make && make install
mv /usr/bin/autoconf /usr/bin/bak_autoconf
mv /usr/bin/autoheader /usr/bin/bak_autoheader
mv /usr/bin/autom4te /usr/bin/bak_autom4te
mv /usr/bin/autoreconf /usr/bin/bak_autoreconf
mv /usr/bin/autoscan /usr/bin/bak_autoscan
mv /usr/bin/autoupdate /usr/bin/bak_autoupdate
ln -sf /usr/local/autoconf-2.69/bin/autoconf /usr/bin/autoconf
ln -sf /usr/local/autoconf-2.69/bin/autoheader /usr/bin/autoheader
ln -sf /usr/local/autoconf-2.69/bin/autom4te /usr/bin/autom4te
ln -sf /usr/local/autoconf-2.69/bin/autoreconf /usr/bin/autoreconf
ln -sf /usr/local/autoconf-2.69/bin/autoscan /usr/bin/autoscan
ln -sf /usr/local/autoconf-2.69/bin/autoupdate /usr/bin/autoupdate
1.3.3:automake
下载地址:http://ftp.gnu.org/gnu/automake/automake-1.14.tar.gz
tar xzvf automake-1.14.tar.gz
cd automake-1.14
./configure --prefix=/usr/local/automake-1.14
make && make install
ln -sf /usr/local/automake-1.14/bin/aclocal-1.14 /usr/bin/aclocal-1.14
ln -sf /usr/local/automake-1.14/bin/automake-1.14 /usr/bin/automake-1.14
ln -sf /usr/local/automake-1.14/bin/aclocal-1.14 /usr/bin/aclocal-1.14
mkdir /usr/share/automake-1.14
ln -sf /usr/local/automake-1.14/share/automake-1.14/test-driver /usr/share/automake-1.14/test-driver
cd automake-1.14
./configure --prefix=/usr/local/automake-1.14
make && make install
ln -sf /usr/local/automake-1.14/bin/aclocal-1.14 /usr/bin/aclocal-1.14
ln -sf /usr/local/automake-1.14/bin/automake-1.14 /usr/bin/automake-1.14
ln -sf /usr/local/automake-1.14/bin/aclocal-1.14 /usr/bin/aclocal-1.14
mkdir /usr/share/automake-1.14
ln -sf /usr/local/automake-1.14/share/automake-1.14/test-driver /usr/share/automake-1.14/test-driver
1.3.4:cmake
下载地址:https://cmake.org/files/v3.6/cmake-3.6.1.tar.gz
tar xzvf cmake-3.6.1.tar.gz
cd cmake-3.6.1
./configure
make && make install
cd cmake-3.6.1
./configure
make && make install
1.3.5:python
下载地址:https://www.python.org/ftp/python/2.7.12/Python-2.7.12.tgz
tar xzvf Python-2.7.12.tgz
cd Python-2.7.12
./configure --prefix=/usr/local/python27
make && make install
cd Python-2.7.12
./configure --prefix=/usr/local/python27
make && make install
1.3.6:gcc
下载地址:http://ftp.gnu.org/gnu/gcc/gcc-4.9.4/gcc-4.9.4.tar.gz
tar xzvf gcc-4.9.4.tar.gz
cd gcc-4.9.4
./contrib/download_prerequisites
cd ..
mkdir gcc-build-4.9.4
cd gcc-build-4.9.4
../gcc-4.9.4/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
make -j4 (-j4参数根据自己的cpu核心数来设置,这样编译的速度会快点,其实加了编译的时间也很长的)
make install
ls /usr/local/bin | grep gcc
update-alternatives --install /usr/bin/gcc gcc /usr/local/bin/x86_64-unknown-linux-gnu-gcc-4.9.4 40 (优先使用4.9.4版本的gcc)
使用 gcc --version 就可以看见当前使用的gcc版本是刚才编译的新版本了。
cp gcc-build-4.9.4/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.20 /usr/lib64/
删除原来低版本的软链:rm -rf /usr/lib64/libstdc++.so.6
创建新版本的软链:ln -sf /usr/lib64/libstdc++.so.6.0.20 /usr/lib64/libstdc++.so.6
cd gcc-4.9.4
./contrib/download_prerequisites
cd ..
mkdir gcc-build-4.9.4
cd gcc-build-4.9.4
../gcc-4.9.4/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
make -j4 (-j4参数根据自己的cpu核心数来设置,这样编译的速度会快点,其实加了编译的时间也很长的)
make install
ls /usr/local/bin | grep gcc
update-alternatives --install /usr/bin/gcc gcc /usr/local/bin/x86_64-unknown-linux-gnu-gcc-4.9.4 40 (优先使用4.9.4版本的gcc)
使用 gcc --version 就可以看见当前使用的gcc版本是刚才编译的新版本了。
cp gcc-build-4.9.4/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.20 /usr/lib64/
删除原来低版本的软链:rm -rf /usr/lib64/libstdc++.so.6
创建新版本的软链:ln -sf /usr/lib64/libstdc++.so.6.0.20 /usr/lib64/libstdc++.so.6
####################################################################
1.3.7:boost (此步可忽略)
官网:http://www.boost.org/
下载地址:https://sourceforge.net/projects/boost/files/boost/1.61.0/
tar xzvf boost_1_61_0.tar.gz
cd boost_1_61_0
./bootstrap.sh --prefix=/usr/local/boost
./b2
./b2 install
echo /usr/local/boost/lib >/etc/ld.so.conf.d/boost.conf
ldconfig
####################################################################
二、编译相关依赖
2.1:colib
cd /home/phxsql/third_party/colib
make
2.2:glog
cd /home/phxsql/third_party/glog
mkdir build && cd build
export CXXFLAGS="-fPIC" && cmake .. -DCMAKE_INSTALL_PREFIX=/home/phxsql/third_party/glog && make VERBOSE=1
make
make install
2.3:leveldb
/home/phxsql/third_party/leveldb
make
mkdir lib
cp -ar out-shared lib/
cp -ar out-static lib/
2.4:protobuf
cd /home/phxsql/third_party/protobuf
./autogen.sh
./configure CXXFLAGS=-fPIC --prefix=/home/phxsql/third_party/protobuf
make
make install
2.5:phxrpc
cd /home/phxsql/third_party/phxrpc
mv third_party/protobuf third_party/bak_protobuf
ln -sf /home/phxsql/third_party/protobuf /home/phxsql/third_party/phxrpc/third_party/protobuf
ln -sf /usr/local/boost/include/boost /home/phxsql/third_party/phxrpc/boost
make
make boost (如果前面boost忽略,此步略过)
2.6:phxpaxos
cd /home/phxsql/third_party/phxpaxos
mv third_party/protobuf third_party/bak_protobuf
mv third_party/leveldb third_party/bak_leveldb
mv third_party/glog third_party/bak_glog
ln -sf /home/phxsql/third_party/protobuf /home/phxsql/third_party/phxpaxos/third_party/protobuf
ln -sf /home/phxsql/third_party/leveldb /home/phxsql/third_party/phxpaxos/third_party/leveldb
ln -sf /home/phxsql/third_party/glog /home/phxsql/third_party/phxpaxos/third_party/glog
./autoinstall.sh
make
make install
cd plugin
make
make install
cd /home/phxsql/third_party/colib
make
2.2:glog
cd /home/phxsql/third_party/glog
mkdir build && cd build
export CXXFLAGS="-fPIC" && cmake .. -DCMAKE_INSTALL_PREFIX=/home/phxsql/third_party/glog && make VERBOSE=1
make
make install
2.3:leveldb
/home/phxsql/third_party/leveldb
make
mkdir lib
cp -ar out-shared lib/
cp -ar out-static lib/
2.4:protobuf
cd /home/phxsql/third_party/protobuf
./autogen.sh
./configure CXXFLAGS=-fPIC --prefix=/home/phxsql/third_party/protobuf
make
make install
2.5:phxrpc
cd /home/phxsql/third_party/phxrpc
mv third_party/protobuf third_party/bak_protobuf
ln -sf /home/phxsql/third_party/protobuf /home/phxsql/third_party/phxrpc/third_party/protobuf
ln -sf /usr/local/boost/include/boost /home/phxsql/third_party/phxrpc/boost
make
make boost (如果前面boost忽略,此步略过)
2.6:phxpaxos
cd /home/phxsql/third_party/phxpaxos
mv third_party/protobuf third_party/bak_protobuf
mv third_party/leveldb third_party/bak_leveldb
mv third_party/glog third_party/bak_glog
ln -sf /home/phxsql/third_party/protobuf /home/phxsql/third_party/phxpaxos/third_party/protobuf
ln -sf /home/phxsql/third_party/leveldb /home/phxsql/third_party/phxpaxos/third_party/leveldb
ln -sf /home/phxsql/third_party/glog /home/phxsql/third_party/phxpaxos/third_party/glog
./autoinstall.sh
make
make install
cd plugin
make
make install
三、编译安装PHXSQL
cd /home/phxsql
wget https://www.percona.com/downloads/Percona-Server-5.6/Percona-Server-5.6.31-77.0/source/tarball/percona-server-5.6.31-77.0.tar.gz
tar xzvf percona-server-5.6.31-77.0.tar.gz
mv percona-server-5.6.31-77.0 percona
sh autoinstall.sh
make
make install
3.1:生成安装包
make package
生成的压缩包名称为:phxsql-0.8.0.tar.gz
wget https://www.percona.com/downloads/Percona-Server-5.6/Percona-Server-5.6.31-77.0/source/tarball/percona-server-5.6.31-77.0.tar.gz
tar xzvf percona-server-5.6.31-77.0.tar.gz
mv percona-server-5.6.31-77.0 percona
sh autoinstall.sh
make
make install
3.1:生成安装包
make package
生成的压缩包名称为:phxsql-0.8.0.tar.gz
四、部署测试
把安装包拷贝到其他测试的机器上,解压,本文目录全部为/home/phxsql
创建mysql用户
useradd -d /home/datacenter -s /sbin/nologin mysql
mkdir /home/phxsql/etc
cd /home/phxsql/tools
把director_operator.py文件第26行中的chown user:mysql 修改为chown mysql:mysql
把binary_installer.py文件第35行中的 cd %s/percona.src; ./scripts/mysql_install_db --defaults-file=%s/etc/my.cnf 修改为:cd %spercona.src; ./scripts/mysql_install_db --defaults-file=%setc/my.cnf
测试部署是用的三台虚拟机:
python install.py -i"192.168.1.186" -p 54321 -g 6000 -y 11111 -P 17000 -a 8001 -f /home/datacenter/
python install.py -i"192.168.1.180" -p 54321 -g 6000 -y 11111 -P 17000 -a 8001 -f /home/datacenter/
/usr/local/python27/bin/python2.7 install.py -i"192.168.1.241" -p 54321 -g 6000 -y 11111 -P 17000 -a 8001 -f /home/datacenter/
在任意一台机器上执行
cd /home/phxsql/sbin/
./phxbinlogsvr_tools_phxrpc -f InitBinlogSvrMaster -h"192.168.1.186,192.168.1.180,192.168.1.241" -p 17000 (集群初始化完成之后就可以使用了。)
./phxbinlogsvr_tools_phxrpc -f GetMemberList -h"192.168.1.186" -p 17000
get master 192.168.1.241 expire time 1473313474
ip 192.168.1.186 port 17000
ip 192.168.1.180 port 17000
ip 192.168.1.241 port 17000
登录数据库:
/home/phxsql/percona.src/bin/mysql -uroot -h"192.168.1.186" -P54321
#获取master信息:
./phxbinlogsvr_tools_phxrpc -f GetMasterInfoFromGlobal -h 192.168.1.186 -p 17000
get master 192.168.1.241 expire time 1473314016
修改管理帐号及密码:
./phxbinlogsvr_tools_phxrpc -f SetMySqlAdminInfo -h 192.168.1.180 -p 17000 -u root -d "" -U zhj -D zhj2016
get master 192.168.1.241 expire time 1473313844
SetMySqlAdminInfo admin username root -> new admin username zhj
用官方提供的测试工具测试:
cd /home/phxsql/tools/
chmod +x test_phxsql.sh
./test_phxsql.sh 54321 192.168.1.186 192.168.1.180 192.168.1.241
sysbench 简单测试:
Jun
26
今天,Citrix 宣布 XenServer 全面开源,并发布了 XenServer.org 网站。首先我想提醒大家的是尽管 XenServer 之前是基于开源软件构建,包括 Xen hypervisor、Linux 内核和 CentOS Linux 发行版以及用户工具,但多数的 XenServer 组件并不开源。
现在 Citrix 决定全面开源 XenServer 解决方案,包括之前未开源的 XenServer 所有组件。
源码可通过 https://github.com/xenserver 下载。
---------------------------------------------------------------------------------------------------------------------------
XenServer 的详细介绍:
Citrix XenServer是一种全面而易于管理的服务器虚拟化平台,基于强大的 Xen Hypervisor 程序之上。Xen技术被广泛看作是业界部署最快速、最安全的虚拟化软件技术,XenServer 可高效地管理Windows® 和 Linux® 虚拟服务器而设计的,实现经济高效的服务器整合和业务连续性。什么是服务器虚拟化?服务器虚拟化是一种经过实践验证的技术,它允许多台虚拟机在 单一物理服务器上运行。每台虚拟机与其它虚拟机完全隔离开来,并通过系统管理程序(hypervisor)的软件层与基础主机分离开。这样,每台 虚拟机 就能够运行不同的操作系统和应用。由于这些虚拟机与基础主机相分离,所以虚拟机也可以从一台物理服务器移动到另一台而不中断运行,即实时迁移。这些属性正 在改变企业实施虚拟计算的方式。服务器虚拟化和数据中心自动化的最佳选择XenServer是在云计算环境中经验证的企业级虚拟化平台,为企业提供创建和管理虚拟基础架构所需的所有功能。深得很多要求严格的企业信赖,广泛使用于运行最关键的应用,已被最大规模的云计算环境所采用。利用思杰的免费服务器虚拟化软件构建虚拟基础架构,或通过高级版整合任何规模的企业。
•削减成本。通过减少数据中心所需的物理服务器数量,企业可以节约电力和冷却成本。
•提高IT灵活性和效率。通过动态地调整容量,优化虚拟机布局并自动完成重复性管理任务,客户可以轻松适应不断变化的数据中心和计算需求。
•提高性能和用户生产率。通过实现“零停机”维护、自动从硬件故障中恢复并在发生灾难时提供故障切换功能,最终用户可确保在任何情况下都可访问关键任务应用。
现在 Citrix 决定全面开源 XenServer 解决方案,包括之前未开源的 XenServer 所有组件。
源码可通过 https://github.com/xenserver 下载。
---------------------------------------------------------------------------------------------------------------------------
XenServer 的详细介绍:
Citrix XenServer是一种全面而易于管理的服务器虚拟化平台,基于强大的 Xen Hypervisor 程序之上。Xen技术被广泛看作是业界部署最快速、最安全的虚拟化软件技术,XenServer 可高效地管理Windows® 和 Linux® 虚拟服务器而设计的,实现经济高效的服务器整合和业务连续性。什么是服务器虚拟化?服务器虚拟化是一种经过实践验证的技术,它允许多台虚拟机在 单一物理服务器上运行。每台虚拟机与其它虚拟机完全隔离开来,并通过系统管理程序(hypervisor)的软件层与基础主机分离开。这样,每台 虚拟机 就能够运行不同的操作系统和应用。由于这些虚拟机与基础主机相分离,所以虚拟机也可以从一台物理服务器移动到另一台而不中断运行,即实时迁移。这些属性正 在改变企业实施虚拟计算的方式。服务器虚拟化和数据中心自动化的最佳选择XenServer是在云计算环境中经验证的企业级虚拟化平台,为企业提供创建和管理虚拟基础架构所需的所有功能。深得很多要求严格的企业信赖,广泛使用于运行最关键的应用,已被最大规模的云计算环境所采用。利用思杰的免费服务器虚拟化软件构建虚拟基础架构,或通过高级版整合任何规模的企业。
•削减成本。通过减少数据中心所需的物理服务器数量,企业可以节约电力和冷却成本。
•提高IT灵活性和效率。通过动态地调整容量,优化虚拟机布局并自动完成重复性管理任务,客户可以轻松适应不断变化的数据中心和计算需求。
•提高性能和用户生产率。通过实现“零停机”维护、自动从硬件故障中恢复并在发生灾难时提供故障切换功能,最终用户可确保在任何情况下都可访问关键任务应用。
May
20
我管理服务器太多了,不可能每时每刻都登录到上面查看服务器状况,于是写了一个“服务器监控系统 ServMon V1.0”。其原理是用shell脚本定时抓取被监控服务器上信息,再用curl POST到监控机的PHP接口程序上,由PHP接口程序对信息进行分析,如果存在异常,则发送报警邮件给管理员。
下午,ServMon V1.0 已经在sina播客服务器上部署,以下为ServMon的删节版内容,只监控磁盘分区使用率和Swap交换空间两项:
1、被监控端服务器的shell脚本(Linux)
(1)、发送磁盘分区使用率给监控端接口http://192.168.0.28/servmon/interface.php的脚本
磁盘分区使用率监控报警邮件示例图:
(2)、发送Swap交换空间使用率给监控端接口http://192.168.0.28/servmon/interface.php的脚本
/usr/local/servmon/bin/swapstat_send
Swap交换空间使用率监控报警邮件示例图:
(3)、计划任务:每30分钟将磁盘分区使用率发送给监控端接口,每10分钟将Swap交换空间使用率发送给监控端接口。
/etc/cron.d/servmon
2、监控端服务器配置(Linux)
(1)、启动sendmail
/usr/sbin/sendmail -bd -q30m
-b:指定Sendmail在后台运行,并且监听端口25的请求。
-d:指定Sendmail以Daemon方式运行(守护进程)。
-q:当Sendmail无法将邮件成功地发送到目的地时,它会将邮件保存在队列里。该参数指定邮件在队列里保存的时间。其中的30m表示保留30分钟。
(2)、修改php.ini的[mail function]部分为以下内容,然后重启Apache,使PHP能够使用mail()函数发送电子邮件
(4)、在MySQL上创建一个数据库servmon,然后在该数据库中执行以下SQL语句创建表:
备注:这张表是PHP接口程序用来记录发送磁盘分区报警邮件的时间,避免在一段时间内重复发送大量报警邮件的,其实完全可以用Session、文本文件来代替它。这里之所以用MySQL数据库,是因为PHP接口中还将增加一些需要记录信息到数据库的监控模块,所以就统一用数据库了。)
(3)、PHP接口程序
http://192.168.0.28/servmon/interface.php
/**
*********************************************************************
* Copyright (c) 2007, 回忆未来[张宴]
* All rights reserved.
*
* 文件名称: interface.php
* 摘 要: 服务器监控系统ServMon接口程序
* 描 述:
* 作 者: 张宴 新浪UC:103500 博客:blog.s135.com
* 版 本: 1.0
* 时 间: 2007-08-03
*********************************************************************
*/
//------------------配置信息------------------
$password = "yourpassword";//设置数据传输验证密码
$mysql_server = "127.0.0.1:3306";//MySQL服务器地址及端口,例如localhost:3306
$mysql_db = "servmon";//MySQL数据库名
$mysql_username = "root";//MySQL帐号
$mysql_password = "";//MySQL密码
$disk_max = "90";//磁盘分区使用百分比超过此值,则报警。默认为90%
$disk_sendmail_interval = "43200";//如果同一台服务器连续报警,设置每隔多少秒发送一次报警邮件。默认为43200秒,即12小时。
$swap_max = "50";//Swap交换空间使用百分比超过此值,则报警。默认为50%
$email = "[email protected]";//管理员邮箱
//--------------------------------------------
//密码验证
if (htmlspecialchars($_POST["password"]) != $password)
{
echo "数据传输验证密码错误!\n";
exit();
}
//磁盘分区报警(分区使用率超过90%后会发邮件报警)
if (htmlspecialchars($_POST["menu"]) == "diskstat")
{
$is_send_mail = "0";//是否发邮件,0为不发邮件
$date = htmlspecialchars($_POST["date"]);
$ip = htmlspecialchars($_POST["ip"]);
$data = htmlspecialchars($_POST["data"]);
$subject = "[系统监控]_磁盘分区空间不足_" . $ip;
$message = "服务器监控系统 ServMon V1.0\r\n";
$message = $message . "-------------------------------------------------------\r\n";
$message = $message . "报警服务器:" . $ip . "\r\n";
$message = $message . "-------------------------------------------------------\r\n";
$message = $message . "报警时间:" . $date . "\r\n";
$message = $message . "-------------------------------------------------------\r\n";
$message = $message . "报警内容:\r\n";
$headers = 'From: ServMon' . "\r\n" .
'Reply-To: ServMon' . "\r\n" . 'X-Mailer: PHP/' . phpversion();
$arr1 = explode(";", $data);
foreach ($arr1 as $key1 => $value1)
{
$arr2 = explode(":", $value1);
if ($arr2[0] != "" && $arr2[1] != "" && $arr2[1] >= $disk_max)
{
$message = $message . "●磁盘分区 " . $arr2[0] . " 空间不足(空间使用率达到" . $arr2[1] . "%)\r\n";
$is_send_mail = "1";//是否发邮件,1为发送邮件
}
}
if ($is_send_mail == "1")
{
$connect = mysql_connect($mysql_server, $mysql_username, $mysql_password);
$select = mysql_select_db($mysql_db, $connect);
$select_result = mysql_query("SELECT date FROM tb_diskstat WHERE ip='" . $ip .
"' LIMIT 1");
$rs = mysql_fetch_array($select_result);
$interval = date("U") - $rs["date"];
if ($interval >= $disk_sendmail_interval)
{
if (mail($email, $subject, $message, $headers))
{
echo "已成功发送报警邮件!\n";
}
else
{
echo "发送报警邮件失败!\n";
}
$insert_result = mysql_query("REPLACE INTO tb_diskstat (ip, date) VALUES ('" . $ip .
"', '" . date("U") . "');");
}
else
{
if ($disk_sendmail_interval >= 3600)
{
$disk_sendmail_interval_text = $disk_sendmail_interval / 3600 . "小时";
}
else
{
$disk_sendmail_interval_text = $disk_sendmail_interval . "秒";
}
echo "已发送过报警邮件," . $disk_sendmail_interval_text . "内不再重复发送!\n";
}
}
else
{
echo "磁盘分区空间足够,无须发送报警邮件!\n";
}
exit();
}
//Swap交换空间报警(Swap交换空间使用率超过60%后会发邮件报警)
if (htmlspecialchars($_POST["menu"]) == "swapstat")
{
$is_send_mail = "0";//是否发邮件,0为不发邮件
$date = htmlspecialchars($_POST["date"]);
$ip = htmlspecialchars($_POST["ip"]);
list($total, $used, $free) = split(":", htmlspecialchars($_POST["data"]));
$percentage = round($used / $total * 100, 0);
$subject = "[系统监控]_Swap交换空间使用率高达" . $percentage . "%_" . $ip;
$message = "服务器监控系统 ServMon V1.0\r\n";
$message = $message . "-------------------------------------------------------\r\n";
$message = $message . "报警服务器:" . $ip . "\r\n";
$message = $message . "-------------------------------------------------------\r\n";
$message = $message . "报警时间:" . $date . "\r\n";
$message = $message . "-------------------------------------------------------\r\n";
$message = $message . "报警内容:\r\n";
$headers = 'From: ServMon' . "\r\n" .
'Reply-To: ServMon' . "\r\n" . 'X-Mailer: PHP/' . phpversion();
$arr1 = explode(";", $data);
foreach ($arr1 as $key1 => $value1)
{
$arr2 = explode(":", $value1);
if ($arr2[0] != "" && $arr2[1] != "" && $arr2[1] >= $disk_max)
{
$message = $message . "●磁盘分区 " . $arr2[0] . " 空间不足(空间使用率达到" . $arr2[1] . "%)\r\n";
$is_send_mail = "1";//是否发邮件,1为发送邮件
}
}
if ($percentage >= $swap_max)
{
$message = $message . "●Swap交换空间使用率高达" . $percentage . "%,若继续增加到100%可能会导致服务器死机。\r\n";
$message = $message . "●Swap交换空间总量:" . $total . " MB\r\n";
$message = $message . "●Swap交换空间使用:" . $used . " MB\r\n";
$message = $message . "●Swap交换空间剩余:" . $free . " MB\r\n";
$is_send_mail = "1";//是否发邮件,1为发送邮件
}
if ($is_send_mail == "1")
{
if (mail($email, $subject, $message, $headers))
{
echo "已成功发送报警邮件!\n";
}
else
{
echo "发送报警邮件失败!\n";
}
}
else
{
echo "Swap交换空间使用率不高,无须发送报警邮件!\n";
}
exit();
}
?>
文章来源:http://blog.s135.com/post/276/
下午,ServMon V1.0 已经在sina播客服务器上部署,以下为ServMon的删节版内容,只监控磁盘分区使用率和Swap交换空间两项:
1、被监控端服务器的shell脚本(Linux)
(1)、发送磁盘分区使用率给监控端接口http://192.168.0.28/servmon/interface.php的脚本
引用
/usr/local/servmon/bin/diskstat_send
#!/bin/sh
LANG=zh_cn
disk=$(/bin/df -kP | grep / | awk -F ' ' ' {print $6":"$5}' | awk -F '%' ' {print $1}' | tr -s '\n' ';')
today=$(date -d "today" +"%Y-%m-%d_%H:%M:%S")
ip=$(/sbin/ifconfig | grep "inet addr" | grep -v "127.0.0.1" | awk '{print $2;}' | awk -F':' '{print $2;}' | tr -s '\n' ';')
/usr/bin/curl -d menu=diskstat -d password=$2 -d date=$today -d ip=$ip -d data=$disk $1
#!/bin/sh
LANG=zh_cn
disk=$(/bin/df -kP | grep / | awk -F ' ' ' {print $6":"$5}' | awk -F '%' ' {print $1}' | tr -s '\n' ';')
today=$(date -d "today" +"%Y-%m-%d_%H:%M:%S")
ip=$(/sbin/ifconfig | grep "inet addr" | grep -v "127.0.0.1" | awk '{print $2;}' | awk -F':' '{print $2;}' | tr -s '\n' ';')
/usr/bin/curl -d menu=diskstat -d password=$2 -d date=$today -d ip=$ip -d data=$disk $1
磁盘分区使用率监控报警邮件示例图:
(2)、发送Swap交换空间使用率给监控端接口http://192.168.0.28/servmon/interface.php的脚本
/usr/local/servmon/bin/swapstat_send
引用
#!/bin/sh
LANG=zh_cn
data=$(/usr/bin/free -m | grep Swap | awk '{print $2":"$3":"$4}')
today=$(date -d "today" +"%Y-%m-%d_%H:%M:%S")
ip=$(/sbin/ifconfig | grep "inet addr" | grep -v "127.0.0.1" | awk '{print $2;}' | awk -F':' '{print $2;}' | tr -s '\n' ';')
/usr/bin/curl -d menu=swapstat -d password=$2 -d date=$today -d ip=$ip -d data=$data $1
LANG=zh_cn
data=$(/usr/bin/free -m | grep Swap | awk '{print $2":"$3":"$4}')
today=$(date -d "today" +"%Y-%m-%d_%H:%M:%S")
ip=$(/sbin/ifconfig | grep "inet addr" | grep -v "127.0.0.1" | awk '{print $2;}' | awk -F':' '{print $2;}' | tr -s '\n' ';')
/usr/bin/curl -d menu=swapstat -d password=$2 -d date=$today -d ip=$ip -d data=$data $1
Swap交换空间使用率监控报警邮件示例图:
(3)、计划任务:每30分钟将磁盘分区使用率发送给监控端接口,每10分钟将Swap交换空间使用率发送给监控端接口。
/etc/cron.d/servmon
引用
0-30/30 * * * * root /bin/sh /usr/local/servmon/bin/diskstat_send http://192.168.0.28/servmon/interface.php yourpassword
0-50/10 * * * * root /bin/sh /usr/local/servmon/bin/swapstat_send http://192.168.0.28/servmon/interface.php yourpassword
0-50/10 * * * * root /bin/sh /usr/local/servmon/bin/swapstat_send http://192.168.0.28/servmon/interface.php yourpassword
2、监控端服务器配置(Linux)
(1)、启动sendmail
/usr/sbin/sendmail -bd -q30m
-b:指定Sendmail在后台运行,并且监听端口25的请求。
-d:指定Sendmail以Daemon方式运行(守护进程)。
-q:当Sendmail无法将邮件成功地发送到目的地时,它会将邮件保存在队列里。该参数指定邮件在队列里保存的时间。其中的30m表示保留30分钟。
(2)、修改php.ini的[mail function]部分为以下内容,然后重启Apache,使PHP能够使用mail()函数发送电子邮件
引用
[mail function]
; For Win32 only.
;SMTP = localhost
;smtp_port = 25
; For Win32 only.
;sendmail_from = [email protected]
; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
sendmail_path = /usr/sbin/sendmail -t -i
; For Win32 only.
;SMTP = localhost
;smtp_port = 25
; For Win32 only.
;sendmail_from = [email protected]
; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
sendmail_path = /usr/sbin/sendmail -t -i
(4)、在MySQL上创建一个数据库servmon,然后在该数据库中执行以下SQL语句创建表:
引用
CREATE TABLE `tb_diskstat` (
`ip` varchar(128) NOT NULL default '',
`date` int(10) NOT NULL default '0',
UNIQUE KEY `ip` (`ip`)
) TYPE=MyISAM;
`ip` varchar(128) NOT NULL default '',
`date` int(10) NOT NULL default '0',
UNIQUE KEY `ip` (`ip`)
) TYPE=MyISAM;
备注:这张表是PHP接口程序用来记录发送磁盘分区报警邮件的时间,避免在一段时间内重复发送大量报警邮件的,其实完全可以用Session、文本文件来代替它。这里之所以用MySQL数据库,是因为PHP接口中还将增加一些需要记录信息到数据库的监控模块,所以就统一用数据库了。)
(3)、PHP接口程序
http://192.168.0.28/servmon/interface.php
引用
/**
*********************************************************************
* Copyright (c) 2007, 回忆未来[张宴]
* All rights reserved.
*
* 文件名称: interface.php
* 摘 要: 服务器监控系统ServMon接口程序
* 描 述:
* 作 者: 张宴 新浪UC:103500 博客:blog.s135.com
* 版 本: 1.0
* 时 间: 2007-08-03
*********************************************************************
*/
//------------------配置信息------------------
$password = "yourpassword";//设置数据传输验证密码
$mysql_server = "127.0.0.1:3306";//MySQL服务器地址及端口,例如localhost:3306
$mysql_db = "servmon";//MySQL数据库名
$mysql_username = "root";//MySQL帐号
$mysql_password = "";//MySQL密码
$disk_max = "90";//磁盘分区使用百分比超过此值,则报警。默认为90%
$disk_sendmail_interval = "43200";//如果同一台服务器连续报警,设置每隔多少秒发送一次报警邮件。默认为43200秒,即12小时。
$swap_max = "50";//Swap交换空间使用百分比超过此值,则报警。默认为50%
$email = "[email protected]";//管理员邮箱
//--------------------------------------------
//密码验证
if (htmlspecialchars($_POST["password"]) != $password)
{
echo "数据传输验证密码错误!\n";
exit();
}
//磁盘分区报警(分区使用率超过90%后会发邮件报警)
if (htmlspecialchars($_POST["menu"]) == "diskstat")
{
$is_send_mail = "0";//是否发邮件,0为不发邮件
$date = htmlspecialchars($_POST["date"]);
$ip = htmlspecialchars($_POST["ip"]);
$data = htmlspecialchars($_POST["data"]);
$subject = "[系统监控]_磁盘分区空间不足_" . $ip;
$message = "服务器监控系统 ServMon V1.0\r\n";
$message = $message . "-------------------------------------------------------\r\n";
$message = $message . "报警服务器:" . $ip . "\r\n";
$message = $message . "-------------------------------------------------------\r\n";
$message = $message . "报警时间:" . $date . "\r\n";
$message = $message . "-------------------------------------------------------\r\n";
$message = $message . "报警内容:\r\n";
$headers = 'From: ServMon
'Reply-To: ServMon
$arr1 = explode(";", $data);
foreach ($arr1 as $key1 => $value1)
{
$arr2 = explode(":", $value1);
if ($arr2[0] != "" && $arr2[1] != "" && $arr2[1] >= $disk_max)
{
$message = $message . "●磁盘分区 " . $arr2[0] . " 空间不足(空间使用率达到" . $arr2[1] . "%)\r\n";
$is_send_mail = "1";//是否发邮件,1为发送邮件
}
}
if ($is_send_mail == "1")
{
$connect = mysql_connect($mysql_server, $mysql_username, $mysql_password);
$select = mysql_select_db($mysql_db, $connect);
$select_result = mysql_query("SELECT date FROM tb_diskstat WHERE ip='" . $ip .
"' LIMIT 1");
$rs = mysql_fetch_array($select_result);
$interval = date("U") - $rs["date"];
if ($interval >= $disk_sendmail_interval)
{
if (mail($email, $subject, $message, $headers))
{
echo "已成功发送报警邮件!\n";
}
else
{
echo "发送报警邮件失败!\n";
}
$insert_result = mysql_query("REPLACE INTO tb_diskstat (ip, date) VALUES ('" . $ip .
"', '" . date("U") . "');");
}
else
{
if ($disk_sendmail_interval >= 3600)
{
$disk_sendmail_interval_text = $disk_sendmail_interval / 3600 . "小时";
}
else
{
$disk_sendmail_interval_text = $disk_sendmail_interval . "秒";
}
echo "已发送过报警邮件," . $disk_sendmail_interval_text . "内不再重复发送!\n";
}
}
else
{
echo "磁盘分区空间足够,无须发送报警邮件!\n";
}
exit();
}
//Swap交换空间报警(Swap交换空间使用率超过60%后会发邮件报警)
if (htmlspecialchars($_POST["menu"]) == "swapstat")
{
$is_send_mail = "0";//是否发邮件,0为不发邮件
$date = htmlspecialchars($_POST["date"]);
$ip = htmlspecialchars($_POST["ip"]);
list($total, $used, $free) = split(":", htmlspecialchars($_POST["data"]));
$percentage = round($used / $total * 100, 0);
$subject = "[系统监控]_Swap交换空间使用率高达" . $percentage . "%_" . $ip;
$message = "服务器监控系统 ServMon V1.0\r\n";
$message = $message . "-------------------------------------------------------\r\n";
$message = $message . "报警服务器:" . $ip . "\r\n";
$message = $message . "-------------------------------------------------------\r\n";
$message = $message . "报警时间:" . $date . "\r\n";
$message = $message . "-------------------------------------------------------\r\n";
$message = $message . "报警内容:\r\n";
$headers = 'From: ServMon
'Reply-To: ServMon
$arr1 = explode(";", $data);
foreach ($arr1 as $key1 => $value1)
{
$arr2 = explode(":", $value1);
if ($arr2[0] != "" && $arr2[1] != "" && $arr2[1] >= $disk_max)
{
$message = $message . "●磁盘分区 " . $arr2[0] . " 空间不足(空间使用率达到" . $arr2[1] . "%)\r\n";
$is_send_mail = "1";//是否发邮件,1为发送邮件
}
}
if ($percentage >= $swap_max)
{
$message = $message . "●Swap交换空间使用率高达" . $percentage . "%,若继续增加到100%可能会导致服务器死机。\r\n";
$message = $message . "●Swap交换空间总量:" . $total . " MB\r\n";
$message = $message . "●Swap交换空间使用:" . $used . " MB\r\n";
$message = $message . "●Swap交换空间剩余:" . $free . " MB\r\n";
$is_send_mail = "1";//是否发邮件,1为发送邮件
}
if ($is_send_mail == "1")
{
if (mail($email, $subject, $message, $headers))
{
echo "已成功发送报警邮件!\n";
}
else
{
echo "发送报警邮件失败!\n";
}
}
else
{
echo "Swap交换空间使用率不高,无须发送报警邮件!\n";
}
exit();
}
?>
文章来源:http://blog.s135.com/post/276/