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


结构图如下:

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


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[1]: 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[1]: *** [/usr/local/Makefile] Error 127
make[1]: Leaving directory `/root/nginx-1.4.3'
make: *** [build] Error 2

编辑objs/Makefile

删除 ./configure --disable-shared 这一行 继续make


又出现错误如下:

[root@testnginx-1.4.3]# make
make-f objs/Makefile
make[1]: 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[1]: *** [objs/src/core/nginx.o] Error 1
make[1]: Leaving directory `/root/nginx-1.4.3'
make: *** [build] 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


[root@Lvs-Master ~]# /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服务,让另一台负载均衡器接手 #此脚本参考51CTO 作者抚琴煮酒


[root@Lvs-Backup ~]# 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
[root@Lvs-Backup ~]#


然后让此脚本再后台运行

nohup/bin/bash /root/nginx_pid.sh &,高可用在两台机都运行这个脚本  最后写入启动文件  启动时自动启动.



至此负载均衡双机装完


下面是安装3台WEB服务器 配置环境 mysql+nginx+php+php-fpm 要支持GD库


3台安装步骤都一样


如下


Nginx跟前面的安装一样 不过配置文件稍有变化 现在贴出配置文件


user  www www;
worker_processes  4;
error_log  logs/error.log;
pid logs/nginx.pid;
worker_rlimit_nofile 65535; 
events  {
use epoll;
worker_connections 65535;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    log_format  main  '$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_name  192.168.1.232;
        charset gbk;
        access_log  logs/host.access.log  main;
        location / {
            root   /webapp;
            index  index.php index.html index.htm;
        }
        location ~ \.php$ {
            root           /webapp;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            #fastcgi_param  SCRIPT_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内容如下:
[client]
#password       = your_password
port            = 3306
socket          = /tmp/mysqld.sock
[mysqld]
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
[mysqldump]
quick
max_allowed_packet = 128M
[mysql]
no-auto-rehash
[myisamchk]
key_buffer_size = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
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


[root@WebNode1]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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上查看


[root@WebNode2 /]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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
[root@WebNode2 /]#

可以看到已经接管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、重命名文件

#cp  metadata.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/
#cp  mfschunkserver.cfg.dist mfschunkserver.cfg
#cp  mfshdd.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
#cp  metadata.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