Nginx负载均衡+MySQL双机+MFS+Keepalived+Discuz程序实现高可用集群
结构图如下:
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
转载于:https://blog.51cto.com/flyingzf/1328551