nginx代理mogilefs集群实现

一、实验拓扑

wKioL1luC16hE02UAAiBhIXJvbc458.jpg

二、实验环境

wKiom1luB12zEV1MAAAJPEp6Dj0556.png

三、实验步骤

1.节点部署
	192.168.0.3 node1 [Nginx,Tracker,Storage,Mariadb]
	192.168.0.4 node2 [Tracker,Storage]
	192.168.0.5 node3 [Tracker,Storage]

2.初始化工作
	配置好三台服务器IP,hosts文件等网络环境,时间同步以及以下的rpm包安装
	注:以下操作在三个节点都执行	
	#下载rpm包(附件有提供)
		MogileFS-Server-2.46-2.el7.centos.noarch.rpm
		MogileFS-Server-mogilefsd-2.46-2.el7.centos.noarch.rpm
		MogileFS-Server-mogstored-2.46-2.el7.centos.noarch.rpm
		MogileFS-Utils-2.19-1.el7.centos.noarch.rpm
		perl-Danga-Socket-1.61-1.el6.rf.noarch.rpm
		perl-MogileFS-Client-1.14-1.el7.centos.noarch.rpm
		perl-Perlbal-1.78-1.el6.noarch.rpm	
	#安装依赖环境
		yum install perl-Net-Netmask perl-IO-stringy perl-Sys-Syslog perl-IO-AIO -y	
	#安装rpm包
		yum install *.rpm -y

3.node1节点部署mariadb,mogilefsd,mogstored
	3.1.node1部署Mariadb
		yum install mariadb-server -y
		vim /etc/my.cnf.d/server.cnf
		[mysqld]
		skip_name_resolve=1
		innodb_file_per_table = 1		
		
		#启动mariadb
		systemctl start mariadb	
			
		#连接mysql,进行以下操作
		mysql
		GRANT ALL ON *.* TO 'root'@'192.168.0.%' IDENTIFIED BY 'rootpass';
		GRANT ALL ON mogilefs.* TO 'moguser'@'192.168.0.%' IDENTIFIED BY 'moguserpass';
		CREATE DATABASE mogilefs;
		FLUSH PRIVILEGES;
		quit		
		
		#设定mogilefs数据库,生成数据表
		mogdbsetup --dbhost=192.168.0.3 --dbuser=moguser --dbpass=moguserpass  --dbname=mogilefs --dbrootpass=rootpass		
	
		#连接mysql,查看数据库是否生成
		mysql -u root -h192.168.0.3 -prootpass
		MariaDB [(none)]> use mogilefs;
		Reading table information for completion of table and column names
		You can turn off this feature to get a quicker startup with -A

		Database changed
		MariaDB [mogilefs]> SHOW TABLES;
		+----------------------+
		| Tables_in_mogilefs   |
		+----------------------+
		| checksum             |
		| class                |
		| device               |
		| domain               |
		| file                 |
		| file_on              |
		| file_on_corrupt      |
		| file_to_delete       |
		| file_to_delete2      |
		| file_to_delete_later |
		| file_to_queue        |
		| file_to_replicate    |
		| fsck_log             |
		| host                 |
		| server_settings      |
		| tempfile             |
		| unreachable_fids     |
		+----------------------+
		17 rows in set (0.00 sec)

	3.2node1配置mogilefsd
		vim /etc/mogilefs/mogilefsd.conf
		db_dsn = DBI:mysql:mogilefs:host=192.168.0.3
		db_user = moguser
		db_pass = moguserpass
		listen = 0.0.0.0:7001

	3.3启动mogilefsd
		[root@master ~]# service mogilefsd start 
		Starting mogilefsd (via systemctl):                        [  OK  ]
		[root@master ~]# ss -tln
		State       Recv-Q Send-Q Local Address:Port               Peer Address:Port              
		LISTEN      0      50        *:3306                  *:*                  
		LISTEN      0      128       *:22                    *:*                  
		LISTEN      0      128       *:7001                  *:*                  
		LISTEN      0      100    127.0.0.1:25                    *:*                  
		LISTEN      0      128      :::22                   :::*                  
		LISTEN      0      100     ::1:25                   :::*  
	
	3.4配置storage(推荐所有节点都配置)		
	
	    #创建存放文件的目录
		mkdir /data/mogilefs/dev1 -pv
		mkdir: created directory ‘/data’
		mkdir: created directory ‘/data/mogilefs’
		mkdir: created directory ‘/data/mogilefs/dev1’

		vim /etc/mogilefs/mogstored.conf 
			maxconns = 10000
			httplisten = 0.0.0.0:7500
			mgmtlisten = 0.0.0.0:7501
			docroot = /data/mogilefs/			
	    #修改目录的权限
		chown mogilefs.mogilefs /data/mogilefs/ -R		
	    
	    #启动mogstored
		[root@master ~]#  service mogstored start
		Starting mogstored (via systemctl):                        [  OK  ]

4.node2、node3节点部署mogstored操作
	4.1node2操作
    	[root@slave ~]# mkdir /data/mogilefs/dev2 -pv
		mkdir: created directory ‘/data’
		mkdir: created directory ‘/data/mogilefs’
		mkdir: created directory ‘/data/mogilefs/dev2’

		vim /etc/mogilefs/mogstored.conf 
		maxconns = 10000
		httplisten = 0.0.0.0:7500
		mgmtlisten = 0.0.0.0:7501
		docroot = /data/mogilefs/		
		
		#修改目录的权限
		chown mogilefs.mogilefs /data/mogilefs/ -R		
		
		#启动mogstored
		[root@slave ~]# service mogstored start
		Starting mogstored (via systemctl):                        [  OK  ]

	4.2node3操作
		[root@localhost ~]# mkdir /data/mogilefs/dev3 -pv
		mkdir: created directory ‘/data’
		mkdir: created directory ‘/data/mogilefs’
		mkdir: created directory ‘/data/mogilefs/dev3’

		vim /etc/mogilefs/mogstored.conf 
			maxconns = 10000
			httplisten = 0.0.0.0:7500
			mgmtlisten = 0.0.0.0:7501
			docroot = /data/mogilefs		
		
		#修改目录的权限
		chown mogilefs.mogilefs /data/mogilefs/ -R		
		
		#启动mogstored
		[root@localhost ~]# service mogstored start
		Starting mogstored (via systemctl):                        [  OK  ]

5.node1配置操作
	5.1.配置mogilefsd		
	    #添加主机
		mogadm --trackers=192.168.0.3:7001 host add node1 --ip=192.168.0.3  --status=alive

		mogadm --trackers=192.168.0.3:7001 host add node2 --ip=192.168.0.4  --status=alive

		mogadm --trackers=192.168.0.3:7001 host add node3 --ip=192.168.0.5  --status=alive	
	
	    #查看主机状态
		[root@master ~]# mogadm host list 
			node1 [1]: alive
			  IP:       192.168.0.3:7500

			node2 [2]: alive
			  IP:       192.168.0.4:7500

			node3 [3]: alive
			  IP:       192.168.0.5:7500		
			  
			  
	    #查看设备(设备为空)
			mogadm device list

			node1 [1]: alive
                            used(G)    free(G)   total(G)  weight(%)

			node2 [2]: alive
			    used(G)    free(G)   total(G)  weight(%)

			node3 [3]: alive
			    used(G)    free(G)   total(G)  weight(%)		
	    #添加设备
			mogadm device add node1 1 
			mogadm device add node2 2 
			mogadm device add node3 3  

	    #再次查看设备
			[root@master ~]# mogadm device list
			node1 [1]: alive
			                    used(G)    free(G)   total(G)  weight(%)
			   dev1:   alive      1.389      8.602      9.990        100

			node2 [2]: alive
			                    used(G)    free(G)   total(G)  weight(%)
			   dev2:   alive      1.254      8.736      9.990        100

			node3 [3]: alive
			                    used(G)    free(G)   total(G)  weight(%)
			   dev3:   alive      1.150      8.840      9.990        100		
	    #查看设备的状态
			[root@master ~]# mogadm check
			Checking trackers...
			  127.0.0.1:7001 ... OK

			Checking hosts...
			  [ 1] node1 ... OK
			  [ 2] node2 ... OK
			  [ 3] node3 ... OK

			Checking devices...
			  host device         size(G)    used(G)    free(G)   use%   ob state   I/O%
			  ---- ------------ ---------- ---------- ---------- ------ ---------- -----
			  [ 1] dev1             9.990      1.389      8.601  13.91%  writeable   N/A
			  [ 2] dev2             9.990      1.254      8.736  12.56%  writeable   N/A
			  [ 3] dev3             9.990      1.151      8.840  11.52%  writeable   N/A
			  ---- ------------ ---------- ---------- ---------- ------
			             total:    29.971      3.795     26.176  12.66%		
			             
		#查看域(目前为空)
			[root@master ~]# mogadm domain list
			 domain               class                mindevcount   replpolicy   hashtype
			-------------------- -------------------- ------------- ------------ -------    
			         
		#创建域

			[root@master ~]# mogadm domain add p_w_picpaths
			[root@master ~]#  mogadm domain add files
			[root@master ~]#  mogadm domain list
			 domain               class                mindevcount   replpolicy   hashtype
			-------------------- -------------------- ------------- ------------ -------
			 files                default                   2        MultipleHosts() NONE   

			 p_w_picpaths               default                   2        MultipleHosts() NONE   


		#查看类
			[root@master ~]# mogadm class list  
			 domain               class                mindevcount   replpolicy   hashtype
			-------------------- -------------------- ------------- ------------ -------
			 files                default                   2        MultipleHosts() NONE   

			 p_w_picpaths               default                   2        MultipleHosts() NONE   

		#在p_w_picpaths域中添加一个类jpeg
			[root@master ~]# mogadm class add p_w_picpaths jpeg --mindevcount=2 --replpolicy="MultipleHosts(2)"

		#再次查看类
			[root@master ~]#  mogadm class  list
			 domain               class                mindevcount   replpolicy   hashtype
			-------------------- -------------------- ------------- ------------ -------
			 files                default                   2        MultipleHosts() NONE   

			 p_w_picpaths               default                   2        MultipleHosts() NONE   
			 p_w_picpaths               jpeg                      2        MultipleHosts(2) NONE   


6.上传文件/图片测试	
        #在linu主机中找几张图片
	find / -name "*.jpg" -exec cp {} /tmp/ \;	
	
	#上传图片(图片格式写错了,囧)
	mogupload --tracker=192.168.0.3:7001 --domain=p_w_picpaths --key='1.gpg' --file='/tmp/morning.jpg' --class=jpeg	
	
	#上传图片
	mogupload --tracker=192.168.0.3:7001 --domain=p_w_picpaths --key='1.jpg' --file='/tmp/day.jpg' --class=jpeg	
	
	#查看图片的信息
	[root@master tmp]# mogfileinfo --tracker=192.168.0.3:7001 --domain=p_w_picpaths --key='1.jpg' 
	- file: 1.jpg
	     class:                 jpeg
	  devcount:                    1
	    domain:               p_w_picpaths
	       fid:                    3
	       key:                1.jpg
	    length:               961243
	 - http://192.168.0.3:7500/dev1/0/000/000/0000000003.fid

	 [root@master tmp]# mogfileinfo --tracker=192.168.0.3:7001 --domain=p_w_picpaths --key='1.gpg' 
	- file: 1.gpg
	     class:                 jpeg
	  devcount:                    1
	    domain:               p_w_picpaths
	       fid:                    2
	       key:                1.gpg
	    length:               980265
	 - 
	 
	#上传文件
	mogupload --trackers=192.168.0.3 --domain=files --key='/fstab.txt' --file=/etc/fstab 

	#查看文件
	[root@master tmp]# mogfileinfo --trackers=192.168.0.3 --domain=files --key='/fstab.txt'
	- file: /fstab.txt
	     class:              default
	  devcount:                    1
	    domain:                files
	       fid:                    4
	       key:           /fstab.txt
	    length:                  595
	 - 
	 
	  #访问测试(在浏览器中输入)
	  http://192.168.0.3:7500/dev1/0/000/000/0000000003.fid
	  http://192.168.0.5:7500/dev3/0/000/000/0000000002.fid	

wKioL1luB1nyeUmOAAMR9jJ_I3U043.png

wKioL1luB1vg3M0IAAMwF6CSD6M530.png

wKiom1luB1vAgc_oAABrssq5hXI599.png

(ps:可以看出,访问的地址实在反人类,其实我们可以通过加入其他的模块解决这种办法,在下面会介绍这个模块)

	#删除文件
		mogdelete --tracker=192.168.0.3:7001 --domain=p_w_picpaths --key='1.jpg' 
		mogdelete --tracker=192.168.0.3:7001 --domain=p_w_picpaths --key='1.gpg' 
		mogdelete --tracker=192.168.0.3:7001 --domain=files --key='/fstab.txt'


7.配置nginx
	nginx 的mogilefs模块的官方文档地址:http://www.grid.net.ru/nginx/mogilefs.en.html

	#下载nginx_mogilefs模块
	wget http://www.grid.net.ru/nginx/download/nginx_mogilefs_module-1.0.4.tar.gz

	tar xvf nginx_mogilefs_module-1.0.4.tar.gz 
	mv nginx_mogilefs_module-1.0.4 /usr/local/	cd /usr/local/src
	wget 
	 
	#安装nginx依赖环境包
	yum install -y gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
	useradd -r nginx
	tar xvf nginx-1.10.3.tar.gz 
	cd nginx-1.10.3

	#编译安装
	./configure --with-pcre  --user=nginx --group=nginx  --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module  --with-http_realip_module --add-module=/usr/local/nginx_mogilefs_module-1.0.4

	make && make install

	#编译之后出现报错
	make[1]: *** [objs/addon/nginx_mogilefs_module-1.0.4/ngx_http_mogilefs_module.o] Error 1
	make[1]: Leaving directory `/usr/local/src/nginx-1.10.3'
	make: *** [build] Error 2

	解决办法:
		vim  objs/Makefile		
		#把-Werror删除掉

	#再次安装,成功
	make && make install

	#配置nginx环境变量
	vi /etc/profile.d/nginx.sh
	export PATH="$PATH:/usr/local/nginx/sbin"

	#重新加载
	. /etc/profile.d/nginx.sh

	#查看环境变量
	[root@master ~]# echo $PATH
	/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/nginx/sbin
 
	#接下来,编辑nginx配置文件	
	cd /usr/local/nginx/conf/
	vi nginx.conf
	#加入的配置段
	upstream trackers {
        server 192.168.0.3:7001 weight=1;
        server 192.168.0.4:7001 weight=1;
        server 192.168.0.5:7001 weight=1;
        check interval=1000 rise=2 fall=5 timeout=1000;
	}


	   location /p_w_picpaths/ {
            mogilefs_tracker trackers;
            mogilefs_domain p_w_picpaths;
            mogilefs_methods GET;
            mogilefs_noverify on;

                mogilefs_pass {
                proxy_pass $mogilefs_path;
                proxy_hide_header Content-type;
                proxy_buffering off;
                }
	    }


	#检查并启动nginx
	nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
	nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
	[root@master conf]# nginx 

	#上传图片
	mogupload --trackers=192.168.0.3 --domain=p_w_picpaths --key='1.jpg' --file='/tmp/day.jpg' --class=jpeg

	#浏览器访问测试
	http://192.168.0.3/p_w_picpaths/1.jpg

wKioL1luB1yx0gSPAAMtaTU0ijA337.png

8.将三个节点都配置成tracker	

    #将mogilefsd.conf文件拷贝到其他的节点
	[root@master conf]# scp /etc/mogilefs/mogilefsd.conf node2:/etc/mogilefs/
	mogilefsd.conf                                            100% 1465     1.4KB/s   00:00 
	   
	[root@master conf]# scp /etc/mogilefs/mogilefsd.conf node3:/etc/mogilefs/
	root@node3's password: 
	mogilefsd.conf                                            100% 1465     1.4KB/s   00:00    

	#启动node2、node3的mogilefsd
	[root@slave ~]# service mogilefsd start
	Starting mogilefsd (via systemctl):                        [  OK  ]

	[root@localhost ~]# service mogilefsd start
	Starting mogilefsd (via systemctl):                        [  OK  ]	
	
	#测试是否成为tracker
	[root@master conf]# moglistkeys --trackers=192.168.0.3:7001 --domain=p_w_picpaths 
	1.jpg
	[root@master conf]# moglistkeys --trackers=192.168.0.4:7001 --domain=p_w_picpaths 
	1.jpg
	[root@master conf]# moglistkeys --trackers=192.168.0.5:7001 --domain=p_w_picpaths 
	1.jpg

	三个节点都可以查看内容列表,由此证明三个节点都是tracker。