look321 发表于 2018-12-30 11:33:41

Nginx负载均衡+MySQL双机+MFS+Keepalived+Discuz程序实现高可用集群

  Nginx负载均衡+MySQL双机+MFS+Keepalived+Discuz程序实现高可用集群
  结构图如下:
http://blog.运维网.com/attachment/201311/155712712.jpg
  IP规划如下:
  主 Nginx 192.168.1.230 主机名 Lvs-Master
  从 Nginx 192.168.1.231 主机名 Lvs-Backup
  WEB节点1 192.168.1.232 主机名 WebNode1
  WEB节点2 192.168.1.233 主机名 WebNode2
  WEB节点3 192.168.1.234 主机名 WebNode3
  MFS元数据服务器 192.168.1.235 主机名 mfsmaster
  MFS节点1 192.168.1.232 和WEB节点1同一台机器
  MFS节点2 192.168.1.233 和WEB节点2同一台机器
  MFS节点3 192.168.1.233 和WEB节点3同一台机器
  主MYSQL 192.168.1.232和WEB节点1同一台机器
  从MYSQL 192.168.1.233和WEB节点2同一台机器
  NGINX VIP 192.168.1.238
  MYSQL VIP 192.168.1.239
  共6台机器 全部采用CENTOS 6.4 64位系统,最小化安装附加开发包 选中GCC 有些软件要编译安装 系统安装完成后 我们开始安装主NGINX如下:
  (主 Nginx 192.168.1.230)
wget http://nginx.org/download/nginx-1.4.3.tar.gz  
tarxvzf nginx-1.4.3.tar.gz
  
cdnginx-1.4.3
  
groupadd www
  
useraddwww -g www -s /sbin/nologin
  
./configure--prefix=/usr/local/nginx--user=www --group=www --with-http_stub_status_module --with-http_ssl_module --with-pcre=/usr/local
  
make&&makeinstall
  安装之前请先确定是否安装了PCRE NGINX需要PCRE的支持
  如果没有安装 用下面命令安装
yum installpcre-devel pcre-static  如果make出现如下错误
make-f objs/Makefile  
make: Entering directory `/root/nginx-1.4.3'
  
cd/usr/local\
  && if[ -f Makefile ]; thenmakedistclean; fi\
  && CC="cc"CFLAGS="-O2 -fomit-frame-pointer -pipe "\
  ./configure--disable-shared
  
/bin/sh: line 2: ./configure: No such fileor directory
  
make: *** Error 127
  
make: Leaving directory `/root/nginx-1.4.3'
  
make: *** Error 2
  编辑objs/Makefile
  删除 ./configure --disable-shared 这一行 继续make
  又出现错误如下:
# make  
make-f objs/Makefile
  
make: Entering directory `/root/nginx-1.4.3'
  
cd/usr/local\
  && if[ -f Makefile ]; thenmakedistclean; fi\
  && CC="cc"CFLAGS="-O2 -fomit-frame-pointer -pipe "\
  
cc -c -pipe-O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g-I src/core-I src/event-I src/event/modules-I src/os/unix-I /usr/local-I objs \
  -o objs/src/core/nginx.o \
  src/core/nginx.c
  
In fileincluded from src/core/ngx_core.h:63,
  from src/core/nginx.c:9:
  
src/core/ngx_regex.h:15:18: error: pcre.h: No such fileor directory
  
In fileincluded from src/core/ngx_core.h:63,
  from src/core/nginx.c:9:
  
src/core/ngx_regex.h:24: error: expected specifier-qualifier-list before
  
make: *** Error 1
  
make: Leaving directory `/root/nginx-1.4.3'
  
make: *** Error 2
  确认PCRE安装 然后
mkdir-p /usr/local/.libs  
cp/usr/lib64/libpcre.a /usr/local/libpcre.a
  
cp/usr/lib64/libpcre.a /usr/local/libpcre.la
  
cp/usr/lib64/libpcre.a /usr/local/.libs/libpcre.a
  
cp/usr/lib64/libpcre.a /usr/local/.libs/libpcre.l
  然后再次make后正常
  然后修改NGINX的配置文件 在安装目录下 /usr/local/nginx/conf/nginx.conf 修改前请先备份源文件
  配置文件如下
user www www;  
worker_processes 4;
  
pid logs/nginx.pid;
  
worker_rlimit_nofile 65535;
  
events{
  
use epoll;
  
worker_connections 65535;
  
}
  
http{
  include       mime.types;
  default_type application/octet-stream;
  server_names_hash_bucket_size 128;
  client_header_buffer_size 32k;
  large_client_header_buffers 4 32k;
  client_max_body_size 8m;
  sendfile on;
  tcp_nopush on;
  keepalive_timeout 60;
  tcp_nodelay on;
  fastcgi_connect_timeout 300;
  fastcgi_send_timeout 300;
  fastcgi_read_timeout 300;
  fastcgi_buffer_size 64k;
  fastcgi_buffers 4 64k;
  fastcgi_busy_buffers_size 128k;
  fastcgi_temp_file_write_size 128k;
  gzipon;gzip_min_length 1k;
  gzip_buffers 4 16k;
  gzip_http_version 1.0;
  gzip_comp_level 2;
  gzip_types text/plainapplication/x-javascripttext/cssapplication/xml;
  gzip_vary on;
  
log_format access '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" $http_x_forwarded_for';
  upstream backend{
  #ip_hash #负载均衡策略IP哈希 默认为轮训 IP哈希可以在一段时间内把请求发给同一个节点 解决SESSION的问题 本例是轮询方式
  server 192.168.1.232:80 weight=1 max_fails=2 fail_timeout=60s;# 权值是1访问失败最大2次 并保持60秒内不能访问
  server 192.168.1.233:80 weight=1 max_fails=2 fail_timeout=60s;
  server 192.168.1.234:80 weight=1 max_fails=2 fail_timeout=60s;
  }
  
server {
  listen 80;
  server_name www.abc.com;
  location / {
  root /user/local/nginx/html;
  index index.php index.htm index.html;
  proxy_redirect off;
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_pass http://backend;
  }
  
location /nginx{
  access_log on;
  auth_basic "NginxStatus";
  auth_basic_user_file /usr/local/nginx/htpasswd;
  
}
  access_log off;
  }
  }
  然后测试配置文件是否正确 /usr/local/nginx/sbin/nginx -t
# /usr/local/nginx/sbin/nginx -t  
nginx: the configuration file/usr/local/nginx/conf/nginx.conf syntax is ok
  
nginx: configuration file/usr/local/nginx/conf/nginx.conf testis successful
  出现如上 证明配置文件无误
  然后再从NGINX(从 Nginx 192.168.1.231)也进行如上安装NGINX
  下面我们再主NGINX安装keepalived实现高可用性
wget http://www.keepalived.org/software/keepalived-1.2.9.tar.gz  
tarxvzf keepalived-1.2.9
  
cdkeepalived-1.2.9
  
./configure--prefix=/usr/local/keepalived
  注意
  Use IPVS Framework: Yes
  IPVS sync daemon support : Yes
  IPVS use libnl   : No
  Use VRRP Framework: Yes
  Use VRRP VMAC   : Yes
  这样
  然后make&&make install
cp/usr/local/keepalived/etc/rc.d/init.d/keepalived/etc/rc.d/init.d/  
cp/usr/local/keepalived/etc/sysconfig/keepalived/etc/sysconfig/
  
mkdir/etc/keepalived
  
cp/usr/local/keepalived/sbin/keepalived/usr/sbin/
  在/etc/keepalived/目录下新建keepalived.conf
  配置如下:
! Configuration File forkeepalived  global_defs {
  notification_email {
  xxx@126.com
  }
  notification_email_from xxx@126.com
  smtp_server smtp.126.com
  smtp_connect_timeout 30
  router_id NGINX_LOAD
  }
  vrrp_instance VI_1 {
  state MASTER #主NGINX
  interface eth0 #通讯网卡接口
  virtual_router_id 51
  mcast_src_ip 192.168.1.230 #主NGINXip地址
  priority 100
  advert_int 1
  authentication {
  auth_type PASS
  auth_pass 1111
  }
  virtual_ipaddress {
  192.168.1.238#虚拟IP地址
  }
  }
  然后启动 service keepalived start
  现在配置从NGINX的keepalived 安装方法同上面一样,下面贴出配置文件
! Configuration File forkeepalived  global_defs {
  notification_email {
  xxx@126.com
  }
  notification_email_from xxx@126.com
  smtp_server smtp.126.com
  smtp_connect_timeout 30
  router_id NGINX_LOAD
  }
  vrrp_instance VI_1 {
  state BACKUP
  interface eth0
  virtual_router_id 51
  mcast_src_ip 192.168.1.231#从NGINX的IP地址也就是本机IP地址
  priority 99 #要小于主NGINX的值
  advert_int 1
  authentication {
  auth_type PASS
  auth_pass 1111
  }
  virtual_ipaddress {
  192.168.1.238 #虚拟IP地址
  
}
  }
  service keepalived start
  针对Nginx+Keepalived,编写nginx监控脚本nginx_pid.sh,此脚本思路其实也很简单,即放置在后台一直监控nginx进程;如进程消失,尝试重启nginx,如是失败则立即停掉本机的keepalived服务,让另一台负载均衡器接手 #此脚本参考运维网 作者抚琴煮酒
# cat /root/nginx.sh  
#!/bin/bash
  
while:
  
do
  
nginxpid=`ps-C nginx --no-header | wc-l`
  
if[ $nginxpid -eq0 ];then
  
/usr/local/nginx/sbin/nginx
  
sleep5
  
nginxpid=`ps-C nginx --no-header | wc-l`
  
if[ $nginxpid -eq0 ];then
  
/etc/init.d/keepalivedstop
  
fi
  
fi
  
sleep5
  
done
  
#
  然后让此脚本再后台运行
nohup/bin/bash /root/nginx_pid.sh &,高可用在两台机都运行这个脚本最后写入启动文件启动时自动启动.  至此负载均衡双机装完
  下面是安装3台WEB服务器 配置环境 mysql+nginx+php+php-fpm 要支持GD库
  3台安装步骤都一样
  如下
  Nginx跟前面的安装一样 不过配置文件稍有变化 现在贴出配置文件
userwww www;  
worker_processes4;
  
error_loglogs/error.log;
  
pid logs/nginx.pid;
  
worker_rlimit_nofile 65535;
  
events{
  
use epoll;
  
worker_connections 65535;
  
}
  
http {
  include       mime.types;
  default_typeapplication/octet-stream;
  log_formatmain'$remote_addr - $remote_user [$time_local] "$request" '
  '$status $body_bytes_sent "$http_referer" '
  '"$http_user_agent" "$http_x_forwarded_for"';
  access_log off;
  server_names_hash_bucket_size 128;
  client_header_buffer_size 32k;
  large_client_header_buffers 4 32k;
  client_max_body_size 8m;
  sendfile on;
  tcp_nopush on;
  keepalive_timeout 65;
  tcp_nodelay on;
  fastcgi_connect_timeout 300;
  fastcgi_send_timeout 300;
  fastcgi_read_timeout 300;
  fastcgi_buffer_size 128k;
  fastcgi_buffers 2 256k;
  fastcgi_busy_buffers_size 256k;
  fastcgi_temp_file_write_size 256k;
  gzipon;
  gzip_min_length 1k;
  gzip_buffers 4 16k;
  gzip_http_version 1.0;
  gzip_comp_level 2;
  gzip_types text/plainapplication/x-javascripttext/cssapplication/xml;
  gzip_vary on;
  server {
  listen       80;
  server_name192.168.1.232;
  charset gbk;
  access_loglogs/host.access.logmain;
  location / {
  root   /webapp;
  indexindex.php index.html index.htm;
  }
  location ~ \.php$ {
  root         /webapp;
  fastcgi_pass   127.0.0.1:9000;
  fastcgi_indexindex.php;
  #fastcgi_paramSCRIPT_FILENAME/scripts$fastcgi_script_name;
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  include      fastcgi_params;
  }
  }
  
}
  下面安装MYSQL
wget http://downloads.mysql.com/archives/get/file/mysql-5.6.2-m5.tar.gz  
tarxvzf mysql-5.6.2-m5.tar.gz
  cd mysql-5.6.2-m5
  注意MYSQL5.6.2要用CMAKE配置
yum installcmake  
ldconfig
  
groupadd mysql
  
useraddmysql -g mysql -s /sbin/nologin
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql-DMYSQL_DATADIR=/usr/local/mysql/db-DWITH_ZLIB=system -DMYSQL_UNIX_ADDR=/tmp/mysqld.sock -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=gbk -DDEFAULT_COLLATION=gbk_chinese_ci -DMYSQL_USER=mysql  然后make&&make install
  进入/usr/local/mysql目录
cpsupport-files/my-medium.cnf /etc/my.cnf  
my.cnf内容如下:
  

  
#password       = your_password
  
port            = 3306
  
socket          = /tmp/mysqld.sock
  

  
port            = 3306
  
socket          = /tmp/mysqld.sock
  
skip-external-locking
  
key_buffer_size = 16M
  
max_allowed_packet = 1M
  
table_open_cache = 64
  
sort_buffer_size = 512K
  
net_buffer_length = 8K
  
read_buffer_size = 256K
  
read_rnd_buffer_size = 512K
  
myisam_sort_buffer_size = 8M
  
skip-name-resolve
  
skip-grant-tables
  
#skip-networking
  
log-bin=mysql-bin
  
binlog_format=mixed
  
server-id       = 10
  
#log-bin=mysql-bin
  

  
quick
  
max_allowed_packet = 128M
  

  
no-auto-rehash
  

  
key_buffer_size = 20M
  
sort_buffer_size = 20M
  
read_buffer = 2M
  
write_buffer = 2M
  

  
interactive-timeout
  注意两点:
  在两台MySQL服务器上开启bin-log日志,默认是开启的!
  另外一台服务器节点的server-id设置为20,本来设置为10
cd/usr/local/mysql  
执行 ./scripts/mysql_install_db--user=mysql
  
chownmysql:mysql /usr/local/mysql
  
cpsupport-files/mysql.server /usr/local/mysql/mysqld
  
./mysqldstart
  
/usr/local/mysql/bin/mysql
  修改ROOT密码
updatemysql.usersetpassword=PASSWORD("1234567") whereuser="root";  
flush privileges;
  到此MYSQL安装完成 再从MYSQL主机上(192.168.1.233)也根据上面的方法安装
  授权 再主MYSQL机器上 执行如下MYSQL语句
GRANTREPLICATION SLAVE ON*.* TO'root'@'192.168.1.%'IDENTIFIED BY'123456';  
然后再执行 SHOW MASTER STATUS;
  
mysql> show master status;
  
+------------------+----------+--------------+------------------+
  
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
  
+------------------+----------+--------------+------------------+
  
| mysql-bin.000005 |      448 |            |                  |
  
+------------------+----------+--------------+------------------+
  
1 row inset(0.00 sec)
  
mysql>
  然后再从MYSQL机MYSQL上执行 也就是192.168.1.233的机器上执行
CHANGE MASTER TOMASTER_HOST='192.168.1.232',MASTER_USER='root',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000005',MASTER_LOG_POS=448;  start slave;
  然后执行 show slave status\G;
Slave_IO_Running: Yes  
Slave_SQL_Running: Yes
  看到这两项如果都为Yes 说明已经配置成功
  然后在从机器给主机授权 在再主MYSQL做同样的操作 注意要修改IP地址
  直到两边的上面两项都为YES就证明OK了
  现在进行主从测试 现在主MYSQL上面新建个数据库
  然后再登陆从MYSQL上面看看是否同步过来
  然后再反过来测试
  下面安装keepalived 上面有安装方法这里就不在叙述 主从MYSQL都要安装
  主MYSQL机上配置文件如下:
! Configuration File forkeepalived  
global_defs {
  notification_email {
  xxx@qq.com
  }
  notification_email_from xxx@qq.com
  smtp_server smtp.qq.com
  smtp_connect_timeout 30
  router_id MYSQL_HA
  
}
  
vrrp_instance VI_1 {
  state BACKUP
  interface eth0
  virtual_router_id 100
  priority 100
  advert_int 1
  nopreempt
  authentication {
  auth_type PASS
  auth_pass 1111
  }
  virtual_ipaddress {
  192.168.1.239
  }
  
}
  
virtual_server 192.168.1.239 3306 {
  delay_loop 2
  lb_algo wrr
  lb_kind DR
  persistence_timeout 60
  protocol TCP
  real_server 192.168.1.232 3306 {
  weight 3
  notify_down /root/sh/mysql.sh
  TCP_CHECK {
  connect_timeout 10
  nb_get_retry 3
  delay_before_retry 3
  connect_port 3306
  }
  }
  
}
  从主机MYSQL上的keepalived 配置文件如下:
! Configuration File forkeepalived  
global_defs {
  notification_email {
  xxx@qq.com
  }
  notification_email_from xxx@qq.com
  smtp_server smtp.qq.com
  smtp_connect_timeout 30
  router_id MYSQL_HA
  
}
  
vrrp_instance VI_1 {
  state BACKUP
  interface eth1
  virtual_router_id 100
  priority 90
  advert_int 1
  nopreempt
  authentication {
  auth_type PASS
  auth_pass 1111
  }
  virtual_ipaddress {
  192.168.1.239
  }
  
}
  
virtual_server 192.168.1.239 3306 {
  delay_loop 2
  lb_algo wrr
  lb_kind DR
  persistence_timeout 60
  protocol TCP
  real_server 192.168.1.233 3306 {
  weight 3
  notify_down /root/sh/mysql.sh
  TCP_CHECK {
  connect_timeout 10
  nb_get_retry 3
  delay_before_retry 3
  connect_port 3306
  }
  }
  
}
  主备配置文件注意几点:
  1).router_id 两边必须相同
  2).state 两边都为BACKUP
  3).virtual_router_id 两边必须相同
  4).priority 主节点的值必须大于从节点的值
  5).nopreempt 不抢占,只在priority高的节点(即主节点)上设置
  6).real_server 只需要本机的IP,不需要其它节点的!
  7).notify_down 作用是监测到当mysql停止工作时自动关闭本机的keepalived的脚本,实现故障转移
  在主从上都创建当mysql停止工作时自动关闭本机的keepalived的脚本:
cat/root/sh/mysql.sh  
#!/bin/bash
  
MYSQL=/usr/local/mysql/bin/mysql
  
MYSQL_HOST=localhost
  
MYSQL_USER=root
  
MYSQL_PASSWORD="admin"
  
CHECK_TIME=3
  
#mysql is working MYSQL_OK is 0 , mysql down MYSQL_OK is 1
  
MYSQL_OK=1
  
functioncheck_mysql_helth (){
  
$MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p $MYSQL_PASSWORD -e "show status;"> /dev/null2>&1
  
if[ $? = 0 ] ;then
  
MYSQL_OK=0
  
else
  
MYSQL_OK=1
  
fi
  
return$MYSQL_OK
  
}
  
while[ $CHECK_TIME -ne0 ]
  
do
  
let"CHECK_TIME -= 1"
  
check_mysql_helth
  
if[ $MYSQL_OK = 0 ] ; then
  
CHECK_TIME=0
  
exit0
  
fi
  
if[ $MYSQL_OK -eq1 ] && [ $CHECK_TIME -eq1 ]
  
then
  
/etc/init.d/keepalivedstop
  
exit1
  
fi
  
sleep1
  
done
  然后再主从机器上分别启动keepalived
  查看主VIP
# ip addr  
1: lo:mtu 16436 qdisc noqueue state UNKNOWN
  link/loopback00:00:00:00:00:00 brd 00:00:00:00:00:00
  inet 127.0.0.1/8scope host lo
  inet6 ::1/128scope host
  valid_lft forever preferred_lft forever
  
2: eth1:mtu 1500 qdisc pfifo_fast state UP qlen 1000
  link/ether00:0c:29:92:f9:8c brd ff:ff:ff:ff:ff:ff
  inet 192.168.1.233/24brd 192.168.1.255 scope global eth1
  inet 192.168.1.239/32scope global eth1
  inet6 fe80::20c:29ff:fe92:f98c/64scope link
  valid_lft forever preferred_lft forever
  我们看到 192.168.1.239 MYSQL服务关闭
/usr/local/mysql/mysqld stop  关闭后我们在从MYSQL上查看
# ip addr  
1: lo:mtu 16436 qdisc noqueue state UNKNOWN
  link/loopback00:00:00:00:00:00 brd 00:00:00:00:00:00
  inet 127.0.0.1/8scope host lo
  inet6 ::1/128scope host
  valid_lft forever preferred_lft forever
  
2: eth1:mtu 1500 qdisc pfifo_fast state UP qlen 1000
  link/ether00:0c:29:92:f9:8c brd ff:ff:ff:ff:ff:ff
  inet 192.168.1.233/24brd 192.168.1.255 scope global eth1
  inet 192.168.1.239/32scope global eth1
  inet6 fe80::20c:29ff:fe92:f98c/64scope link
  valid_lft forever preferred_lft forever
  
#
  可以看到已经接管MYSQL的VIP了
  下面安装PHP
wget http://us3.php.net/get/php-5.5.6.tar.gz/from/cn2.php.net/mirror  
tarxvzf php-5.5.6.tar.gz
  
cdphp-5.5.6#安装之前先安装如下几个软件
  
yum installlibvpx libvpx-devel gd gd-devel freetype freetype-devel jpeg jpeg-devel libpng-devel
  
./configure--prefix=/usr/local/php--enable-fastcgi --enable-force-cgi-redirect --with-mcrypt --enable-mbstring --disable-pdo --with-curl --disable-debug --disable-rpath --enable-inline-optimization --with-bz2 --with-zlib --enable-sockets --enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex --with-mhash --enable-zip --with-pcre-regex --with-mysql=/usr/local/mysql--with-gd --with-jpeg-dir=/usr--with-png-dir=/usr--with-freetype-dir=/usr--with-xpm-dir=/usr--with-gettext --enable-fpm
  如果配置过程中出现如下错误:
configure: error: mcrypt.h not found. Please reinstall libmcrypt.  则下载libmcrypt安装
wget ftp://mcrypt.hellug.gr/pub/crypto/mcrypt/libmcrypt/libmcrypt-2.5.7.tar.gz  
tar xvzf libmcrypt-2.5.7.tar.gz
  
cd libmcrypt-2.5.7
  
./configure
  
make&&make install
  再次进行配置
  又发生如下错误
configure: error: Don't know how to define struct flock on this system, set --enable-opcache=no  解决方法如下:
vi /etc/ld.so.conf.d/local.conf  添加 /usr/local/lib
  退出保存
  改完后记得ldconfig
  再次配置就没有问题了
make&make install  安装完成后复制安装目录下的一个文件
cp php.ini-production /usr/local/php/lib/php.ini  下面启动PHP-FPM
cd /usr/local/php/etc  
cp php-fpm.conf.default php-fpm.conf
  
/usr/local/php/sbin/php-fpm
  这样就启动了php-fpm
  OK 3台WEB节点 前两台装PHP+NGINX+MYSQL 后一台只装PHP+NGINX
  3台全部安装完成后
  下面开始安装MFS文件系统
  安装MFS请按照官方的安装方法进行 安装时请注意 因我们MFSCHUNKSERVER 和客户端是安装在一台服务器上的
  所有 再安装MFSCHUNKSERVER的时候请打开--enable-mfsmount 这个客户端挂在功能
  MFS所有的安装都完成后 就可以进行安装DISCUZ系统 这里不在叙述 但注意安装DISCUZ的时候 MYSQL的IP地址要填写VIP虚拟IP地址
  以下是MFS抄录官方的安装方法
  MooseFS
  分布式文件系统安装向导
  Micha? Borychowski
  MooseFS Support Manager
  contact@moosefs.org
  March 2010
  Gemius SA
  翻译 Translated by:田逸 (sery@163.com)
  北京 Beijing
  May 2010
  2
  MooseFS 安装向导
  概述 Overview
  下面我们以 step-by-step 的方式,介绍在 linux 平台安装 MooseFS 文件系统的基本过程。我们
  假定您将以 mfs 用户和 mfs 组来运行 MooseFS。同时,我们推荐使用 FHS(文件系统层次结构标
  准 Filesystem Hierarchy Standard)兼容路径,并且把归档文件 mfs-1.6.15.tar.gz 放置在
  /usr/src 目录里。本文旨在向读者介绍怎样在多个专用服务器安装 MooseFS 分布式文件系
  统以及在单个服务器安装 Moosefs 文件系统用于测试这样的场景。
  最新的 MooseFS 稳定发行版本可以从 http://sourceforge.net/projects/moosefs/ 取得,在安装
  MooseFS 系统客户端时,应当确保系统已经安装了正确的 fuse 版本,如果没有 fuse 被安装,
  您可以从 http://sourceforge.net/projects/fuse/下载并安装它。
  在专用服务器安装 MooseFS 基本步骤
  我们假定使用的主机 ip 地址分配如下:
  ? 主控服务器 Master server: 192.168.1.1
  ? 主控备份服务器 Metalogger server: 192.168.1.2
  ? 存储块服务器 Chunk servers: 192.168.1.101 and 192.168.1.102
  ? 客户端主机 (clients): 192.168.2.x
  主控服务器 Master server 安装
  当我们安装主控服务器时,在配置过程中(./configure),可以取消安装 chunk server
  (--disable-mfschunkserver)以及 MooseFS 客户端(--disable-mfsmount). 安装
  主控服务器 master 的具体步骤为:
  1、添加 mfs 组
#groupadd mfs  2、新增系统用户 mfs
#useradd -g mfs mfs  3、切换目录
#cd /usr/src  4、解包归档文件
#tar -zxvf mfs-1.6.15.tar.gz  5、进入安装目录
#cd mfs-1.6.15  6、配置
#./configure --prefix=/usr --sysconfdir=/etc \  
--localstatedir=/var/lib --with-default-user=mfs \
  
--with-default-group=mfs --disable-mfschunkserver --disable-mfsmount
  7、编译并安装
#make  
#make install
  成功安装 master 以后,系统会在/etc 目录自动生成样例配置文件,这些样例文件是以.dist
  后缀命名。这里我们将借用这些样例文件作为 MooseFS 主控服务器的目标配置文件:
  4
  1、切换目录
#cd /etc  2、复制样例文件,以得到 master 所需的配置文件
#cp mfsmaster.cfg.dist mfsmaster.cfg  
#cp mfsmetalogger.cfg.dist mfsmetalogger.cfg
  
#cp mfsexports.cfg.dist mfsexports.cfg
  如果我们打算更改这些配置文件中的某些项目的值,则需要打开特定配置文件相关文本行前的
  注释,然后修改跟随其后的值。因为被注释掉的行,即是 MooseFS 内置的缺省值。
  Mfsmaster.cfg 配置文件包含主控服务器 master 相关的设置,在这里我们暂时不打算对其
  进行修改。如果你想知道关于该配置文件更多的信息,请查看它的手册页(使用命令 man
  mfsmaster.cfg)。
  配置文件 mfsexports.cfg 指定那些客户端主机可以远程挂接 MooseFS 文件系统,以及授予
  挂接客户端什么样的访问权限。例如,我们指定只有 192.168.2.x 网段的主机可以以读写模式
  访问 MooseFS 的整个共享结构资源(/)。在配置文件 mfsexports.cfg 文件的第一行,先
  取消注释,然后把星号(*)改成 192.168.2.0/24,以便我们可以得到下面的文本行:
192.168.2.0/24            /    rw,alldirs,maproot=0  二进制文件 metadata 和文本文件 changelog 将被保存在目录/var/lib/mfs,这是因为我们安
  装过程的 configure 步骤使用了选项 --localstatedir=/var/lib 。首次安装 master 时,会自
  动生成一个名为 metadata.mfs.empty 的元数据文件 metadata,该文件是空的。MooseFS
  master 运必须有文件 metadata.mfs,这个文件是从 metadata.mfs.empty 改名而来:
  1、切换目录
#cd /var/lib/mfs  2、重命名文件
#cpmetadata.mfs.empty metadata.mfs  [译者注]MooseFS master 运行以后,metadata.mfs 文件大小将发生变化,肯定不会是
  空文件了。
  修改/etc/hosts 文件,以绑定主机名 mfsmaster 与 ip 地址 192.168.1.1:
  192.168.1.1 mfsmaster
  这个时候,我们可以试着运行 master 服务(服务将以安装配置 configure 指定的用户运行,这
  我们的案例里,它是 mfs):
#/usr/sbin/mfsmaster start  在一个生产环境里,我们应当设置自动启动脚本,以便操作系统重新启动时,MooseFS master
  也能自动运行。
  为了监控 MooseFS 当前运行状态,我们可以运行 CGI 监控服务,这样就可以用浏览器查看整个
  MooseFS 的运行情况:
#/usr/sbin/mfscgiserv  现在,我们在浏览器地址栏输入 http://192.168.1.1:9425 即可查看 master 的运行情况(这个时
  候,是不能看见 chunk server 的数据)。
  5
  备份服务器 Backup server (metalogger) 安装
  用来安装 metalogger 的主机,在性能上应该比 master 强大(至少有更多的内存)。一旦主控
  服务器 master 失效,只要导入 changelogs 到元数据文件,备份服务器 metalogger 将能接替发生
  故障的 master,行使管理服务器的职能(更多细节请参看 http://www.moosefs.org/minihowtos.html#redundant-master)。
  备份服务器 Metalogger 安装跟主控服务器 master 安装非常类似。其安装命令如下:
  1、 创建组 mfs
#groupadd mfs  2、创建用户 mfs
#useradd -g mfs mfs  3、切换目录
#cd /usr/src  4、解包归档文件
#tar -zxvf mfs-1.6.15.tar.gz  5、切换目录
#cd mfs-1.6.15  6、配置
#./configure --prefix=/usr --sysconfdir=/etc \  
--localstatedir=/var/lib --with-default-user=mfs \
  
--with-default-group=mfs --disable-mfschunkserver --disable-mfsmount
  7、编译及安装
  #make
  #make install
  8、产生配置文件
#cd /etc  
#cp mfsmetalogger.cfg.dist mfsmetalogger.cfg
  类似地,修改/etc/hosts 文件,增加下面的行:
  192.168.1.1 mfsmaster
  现在,我们来试着运行备份服务 mfsmetaloger:
#/usr/sbin/mfsmetalogger start  在一个生产环境里,我们应当设置自动启动脚本,以便操作系统重新启动时,MooseFS
  mfsmetalogger 服务也能自动运行。
  存储块服务器 Chunk servers 安装
  在每个 chunk server 主机上执行下面的命令:
#groupadd mfs  
#useradd -g mfs mfs
  
#cd /usr/src
  
#tar -zxvf mfs-1.6.15.tar.gz
  
#cd mfs-1.6.15
  
6
  
#./configure --prefix=/usr --sysconfdir=/etc \
  
--localstatedir=/var/lib --with-default-user=mfs \
  
--with-default-group=mfs --disable-mfsmaster
  
#make
  
#make install
  准备 chunk server 服务所需的配置文件:
#cd /etc/  
#cpmfschunkserver.cfg.dist mfschunkserver.cfg
  
#cpmfshdd.cfg.dist mfshdd.cfg
  为了测试这个安装,我们保留 mfschunkserver.cfg 文件不做任何改动;如果读者想了解
  配置文件 mfschunkserver.cfg 更详细的信息,请查看手册页 (man
  mfschunkserver.cfg)。
  在配置文件 mfshdd.cfg 中,我们给出了用于客户端挂接 MooseFS 分布式文件系统根分区所
  使用的共享空间位置。建议在 chunk server 上划分单独的空间给 MooseFS 使用,这样做的好处
  是便于管理剩余空间。此处我们假定要使用两个共享点/mnt/mfschunks1 和
  /mnt/mfschunks2,为此,我们在 mfshdd.cfg 加入下面的文本行:
/mnt/mfschunks1  
/mnt/mfschunks2
  在启动 chunk server 前,需确保用户 mfs 有权限读写将要被挂接的分区(因为 chunk server 运
  行时要在此创建一个.lock 的文件):
#chown -R mfs:mfs /mnt/mfschunks1  
#chown -R mfs:mfs /mnt/mfschunks2
  类似地,修改/etc/hosts 文件,增加下面的行:
  192.168.1.1 mfsmaster
  开始启动 chunk server:
#/usr/sbin/mfschunkserver start  现在再通过浏览器访问 http://192.168.1.1:9425/ 应该可以看见这个 MooseFS 系统的全部信息,
  包括主控 master 和存储服务 chunkserver 。
  客户端 Users’ computers 安装
  为了挂接基于 MooseFS 分布式文件,客户端主机必须安装 FUSE 软件包( fuse 版本号至少
  2.6,推荐使用版本号大于 2.7.2 的 fuse)。如果系统没有安装 fuse,你必须手动对其进行安装。
  一种常见的安装方式是从源码进行编译安装-我们可以从 http://sourceforge.net/projects/fuse/取
  得安装源码:
#cd /usr/src  
#tar -zxvf fuse-2.8.3.tar.gz
  
#cd fuse-2.8.3
  
#./configure
  
#make
  
#make install
  安装客户端软件 mfsmount 的步骤:
#cd /usr/src  
7
  
#tar -zxvf mfs-1.6.15.tar.gz
  
#cd mfs-1.6.15
  
#./configure --prefix=/usr --sysconfdir=/etc \
  
--localstatedir=/var/lib --with-default-user=mfs \
  
--with-default-group=mfs --disable-mfsmaster \
  
--disable-mfschunkserver
  
#make
  
#make install
  修改文件/etc/hosts ,增加如下的文本行:
  192.168.1.1 mfsmaster
  假定客户端的挂接点是/mnt/mfs,我们将以下面的指令来使用 MooseFS 分布式共享文件系统:
  1、 创建挂接点
#mkdir -p /mnt/mfs  2、开始挂接操作
#/usr/bin/mfsmount /mnt/mfs -H mfsmaster  执行命令 df –h | grep mfs 检查分区情况,可能的输出如下:
/storage/mfschunks/mfschunks1  
2.0G 69M 1.9G 4% /mnt/mfschunks1
  
/storage/mfschunks/mfschunks2
  
2.0G 69M 1.9G 4% /mnt/mfschunks2
  
mfs#mfsmaster:9421   3.2G 0 3.2G 0% /mnt/mfs
  安装 MooseFS 在同一个主机
  如果为测试目的,可以把 MooseFS 安装在同一个物理主机上。在这里,我们不推荐您把备份服
  务也安装在这个主机上。同样,我们假定主机的 ip 地址为 192.168.1.1。
  为了挂接基于 MooseFS 分布式文件,客户端主机必须安装 FUSE 软件包( fuse 版本号至少
  2.6,推荐使用版本号大于 2.7.2 的 fuse)。如果系统没有安装 fuse,你必须手动对其进行安装。
  一种常见的安装方式是从源码进行编译安装-我们可以从 http://sourceforge.net/projects/fuse/取
  得安装源码:
#cd /usr/src  
#tar -zxvf fuse-2.8.3.tar.gz
  
#cd fuse-2.8.3
  
#./configure
  
#make
  
#make install
  
安装 MooseFS:
  
#groupadd mfs
  
#useradd -g mfs mfs
  
#cd /usr/src
  
#tar -zxvf mfs-1.6.15.tar.gz
  
#cd mfs-1.6.15
  
#./configure --prefix=/usr --sysconfdir=/etc \
  
--localstatedir=/var/lib --with-default-user=mfs \
  
--with-default-group=mfs
  
8
  
#make
  
#make install
  MooseFS chunk 以独占方式使用专门磁盘分区是非常必要的--这样做的好处是便于管理剩余空
  间。MooseFS 并不考虑其剩余空间能被另作他用。如果没有单独创建文件系统的条件,可以在
  文件中创建一个文件系统。为了完成测试,我们准备两个 2GB 的文件(文件位于目录
  /storage/mfschunks),并在其上创建文件系统。把他们格式化为 ext3,分别挂接在
  /mnt/mfschunks1 和/mnt/mfschunks2。以下是具体操作步骤:
  一、挂接第一个文件系统
  1、创建目录
  #mkdir -p /storage/mfschunks
  2、创建镜像文件 mfschunks1
#dd if=/dev/zero of=/storage/mfschunks/mfschunks1 bs=1024 count=1\  
seek=$((2*1024*1024-1))
  3、创建文件系统
#mkfs -t ext3 /storage/mfschunks/mfschunks1  4、创建挂接点
#mkdir -p /mnt/mfschunks1  5、挂接文件系统
#mount -t ext3 -o loop /storage/mfschunks/mfschunks1\  
/mnt/mfschunks1
  二、挂接第二个文件系统
  1、创建第二个镜像文件
#dd if=/dev/zero of=/storage/mfschunks/mfschunks2 bs=1024 count=1\  
seek=$((2*1024*1024-1))
  2、创建文件系统
#mkfs -t ext3 /storage/mfschunks/mfschunks2  3、创建挂接点
#mkdir -p /mnt/mfschunks2  4、挂接文件系统
#mount -t ext3 -o loop /storage/mfschunks/mfschunks2 \  
/mnt/mfschunks2
  在启动 chunk server 前,需确保用户 mfs 有权限读写将要被挂接的分区(因为 chunk server 运
  行时要在此创建一个.lock 的文件):
#chown -R mfs:mfs /mnt/mfschunks1  
#chown -R mfs:mfs /mnt/mfschunks2
  /etc 目录自动生成样例配置文件,这些样例文件是以.dist 后缀命名。这里我们将借用这些
  样例文件作为 MooseFS 的目标配置文件:
#cd /etc  
#cp mfsexports.cfg.dist mfsexports.cfg
  
#cp mfsmaster.cfg.dist mfsmaster.cfg
  
#cp mfschunkserver.cfg.dist mfschunkserver.cfg
  
#cp mfshdd.cfg.dist mfshdd.cfg
  mfsexports.cfg 与 mfsmaster.cfg 为主控服务 master 配置文件,
  mfschunkserver.cfg 与 mfshdd.cfg 为 chunk server 配置文件.
  9
  配置文件 mfsexports.cfg 指定那些客户端主机可以远程挂接 MooseFS 文件系统,以及授予
  挂接客户端什么样的访问权限。例如,我们指定只有 192.168.2.x 网段的主机可以以读写模式
  访问 MooseFS 的整个共享结构资源(/)。在配置文件 mfsexports.cfg 文件的第一行,先
  取消注释,然后把星号(*)改成 192.168.1.0/24,以便我们可以得到下面的文本行:
  192.168.1.0/24   / rw,alldirs,maproot=0
  修改配置文件 mfshdd.cfg ,使其内容为:
/mnt/mfschunks1  
/mnt/mfschunks2
  作为测试的例子,我们不打算修改 mfsmaster.cfg 和 mfschunkserver.cfg 配置文件的
  其他选项。
  二进制文件 metadata 和文本文件 changelog 将被保存在目录/var/lib/mfs,这是因为我们安
  装过程的 configure 步骤使用了选项 --localstatedir=/var/lib 。首次安装 master 时,会自
  动生成一个名为 metadata.mfs.empty 的元数据文件 metadata,该文件是空的。MooseFS
  master 运必须有文件 metadata.mfs,这个文件是从 metadata.mfs.empty 改名而来:
#cd /var/lib/mfs  
#cpmetadata.mfs.empty metadata.mfs
  修改文件/etc/hosts,新增如下的文本行:
  192.168.1.1 mfsmaster
  运行 master server, CGI 监控以及 chunk server:
#/usr/sbin/mfsmaster start  
#/usr/sbin/mfscgiserv
  
#/usr/sbin/mfschunkserver start
  MooseFS 当前运行状态可以在浏览器中地址栏输入 http://192.168.1.1:9425/ 获得。
  挂接 MooseFS 文件系统到挂接点 /mnt/mfs :
  1、建立挂接点
#mkdir -p /mnt/mfs  2、挂接操作
#/usr/bin/mfsmount /mnt/mfs -H mfsmaster  3、查看挂接情况
# df -h | grep mfs:  
/storage/mfschunks/mfschunks1
  
2.0G 69M 1.9G 4% /mnt/mfschunks1
  
/storage/mfschunks/mfschunks2
  
2.0G 69M 1.9G 4% /mnt/mfschunks2
  
mfs#mfsmaster:9421   3.2G 0 3.2G 0% /mnt/mfs
  10
  MooseFS 基础用法
  在 MooseFS 挂接点下创建目录 folder1, 在该目录,我们将以一个副本的方式存放文件 (设置
  goal=1):
#mkdir -p /mnt/mfs/folder1  再在挂接点创建第 2 个目录 folder2, 在该目录,我们将以两个个副本的方式存放文件(设置
  goal=2):
#mkdir -p /mnt/mfs/folder2  使用命令 mfssetgoal –r 设定目录里文件的副本数:
  1、副本数为 1
#mfssetgoal -r 1 /mnt/mfs/folder1  
/mnt/mfs/folder1:
  
inodes with goal changed: 0
  
inodes with goal not changed:    1
  
inodes with permission denied: 0
  2、副本数为 2
#mfssetgoal -r 2 /mnt/mfs/folder2  
/mnt/mfs/folder2:
  
inodes with goal changed: 0
  
inodes with goal not changed: 1
  
inodes with permission denied:   0
  拷贝同一个文件到两个目录:
cp /usr/src/mfs-1.6.15.tar.gz /mnt/mfs/folder1  
cp /usr/src/mfs-1.6.15.tar.gz /mnt/mfs/folder2
  命令 mfschunkfile 用来检查给定的文件以多少副本数来存储。对应目录 folder1 来说,
  有一个副本存储在一个 chunk 里:
#mfscheckfile /mnt/mfs/folder1/mfs-1.6.15.tar.gz  
/mnt/mfs/folder1/mfs-1.6.15.tar.gz:
  
1 copies: 1 chunks
  而在目录 folder2 中,文件 mfs-1.6.15.tar.gz 是以两个副本保存的:
#mfscheckfile /mnt/mfs/folder2/mfs-1.6.15.tar.gz  
/mnt/mfs/folder2/mfs-1.6.15.tar.gz:
  
2 copies: 1 chunks
  附加信息。当所有的组件被安装到同一个物理主机的时候,即便设定了 goal=2 来到达保存两个
  副本的目的,但你可能看到的只是一个副本而已—这是合理的,尽管有两个磁盘,但它只是一
  个 chunk server 啊!
  更多关于 MooseFS 命令的使用方法,可以在这里找到:
  http://www.moosefs.org/reference-guide.html#using-moosefs
  我们推荐你阅读 FAQ 页面内容:
  http://www.moosefs.org/moosefs-faq.html
  11
  停止 MooseFS
  为了安全停止 MooseFS 集群,建议执行如下的步骤:
  ? 在所有客户端用 Unmount 命令先卸载文件系统(本例将是: umount /mnt/mfs)
  ? 停止 chunk server 进程: /usr/sbin/mfschunkserver stop
  ? 停止 metalogger 进程: /usr/sbin/mfsmetalogger stop
  ? 停止主控 master server 进程: /usr/sbin/mfsmaster stop


页: [1]
查看完整版本: Nginx负载均衡+MySQL双机+MFS+Keepalived+Discuz程序实现高可用集群