拓扑图如下:

打造有冗余能力的存储系统_第1张图片

双主模型数据库:

          dataserver1.9527du.com(192.168.60.22)
	  dataserver2.9527du.com(192.168.60.88)

负责调度数据库的haproxy

          haproxy.9527du.com(192.168.60.130)

分布式存储节点:

          mogilefs1.9527du.com(192.168.60.129)
	  mogilefs2.9527du.com(192.168.60.128)

负责调度tracker的nginx

          nginx.9527du.com(192.168.60.40)

在haproxy.9527du.com和nginx.9527du.com 这两台主机,安装keepalived,把keepalived做成双主工作模型。

流动IP为:

          192.168.60.130(haproxy使用)
          192.168.60.40(nginx使用)

正常情况下,192.168.60.130地址配置在,haproxy.9527du.com该主机上。

            192.168.60.40地址配置在,nginx.9527du.com主机上。

当其中的一台主机菪机,另一台主机就处于master状态,VIP就会在处于master状态的主机配置上并启动相应的服务,这样就解决了两个调度节点的单点故障问题。

调度原理:

        当客户端想获取存在分布式文件系统上的图片时,客户端就向nginx发送请求(nginx监听在80端口),nginx把请求交给mogilefs模块处理,根据调度算法把请求分发给tracker,tracker(mogilefsd)就会访问数据库获取获取请求的数据的元数据,向haproxy(haproxy监听在3306端口)发送访问数据库的请求。haproxy根据调度算法会把tracker的连接数据库的请求分发到上游服务器backup server.

       使用多个tracker调度(mogilefsd)节点来调度mogstored,并使用nginx进行调度tracker,保证了tracker的冗余。

       把两台数据库搭建成双主工作模型,并使用haproxy进行调度,保证了存储文件元数据的数据库不会成为单点问题处在。

这样我们的分布式文件存储系统就有了很好的冗余。


一、安装数据库

使用的数据库软件为:

               mariadb-5.5.36-linux-i686.tar.gz

<一>、在server1.9527du.com(192.168.60.22)这台主机安装数据库软件;

1、为初始化数据做准备工作

(1)、添加初始化数据库使用到的mysql用户

说明:为了安全方面的考虑,建议添加一个系统用户mysql

[root@dataserver1 /]# useradd -r  -s /sbin/nologin mysql
[root@dataserver1 /]# id mysql
uid=102(mysql) gid=104(mysql) groups=104(mysql)

(2)、创建数据目录,并把数据目录的属主属组修改为:mysql

[root@dataserver1 /]# mkdir -pv  /mydata/mysql
[root@dataserver1 mydata]# chown mysql:mysql ./mysql/
[root@dataserver1 mydata]# ll -d ./mysql/
drwxr-xr-x 2 mysql mysql 4096 Sep 30 14:23 ./mysql/

(3)、把数据库软件解压到指定目录下

[root@dataserver1 admin]# tar -xf mariadb-5.5.36-linux-i686.tar.gz -C /usr/local/

(4)、为了维护方便,建议不要直接修改目录名称,创建一个软链接

[root@dataserver1 admin]# cd /usr/local/
[root@dataserver1 local]# ln -sv mariadb-5.5.36-linux-i686 mysql
create symbolic link `mysql' to `mariadb-5.5.36-linux-i686'
[root@dataserver1 local]# ll mysql
lrwxrwxrwx 1 root root 25 Sep 30 14:30 mysql -> mariadb-5.5.36-linux-i686

(5)、由于初始化数据库,要以mysql的身份执行一些脚本来完成数据库的初始化,所以最好把解压后的数据库软件的属主修改为mysql

[root@dataserver1 local]# cd mysql/
[root@dataserver1 mysql]# chown mysql:mysql -R ./*
[root@dataserver1 mysql]# ll ./
total 216
drwxr-xr-x  2 mysql mysql   4096 Sep 30 14:29 bin
-rw-r--r--  1 mysql mysql  17987 Feb 24  2014 COPYING
-rw-r--r--  1 mysql mysql  26545 Feb 24  2014 COPYING.LESSER
drwxr-xr-x  3 mysql mysql   4096 Sep 30 14:29 data
drwxr-xr-x  2 mysql mysql   4096 Sep 30 14:29 docs
drwxr-xr-x  3 mysql mysql   4096 Sep 30 14:29 include
-rw-r--r--  1 mysql mysql   8694 Feb 24  2014 INSTALL-BINARY
drwxr-xr-x  3 mysql mysql   4096 Sep 30 14:29 lib
...

2、初始化数据库

因为,指定数据库的数据目录的位置和初始化数据库的用户

[root@dataserver1 mysql]# ./scripts/mysql_install_db  --datadir=/mydata/mysql/   --user=mysql
Installing MariaDB/MySQL system tables in '/mydata/mysql/' ...
OK
Filling help tables...
OK
......

说明:

    从上述输出信息,数据库已经初始化成功。

3、为启动数据库做准备工作;

(1)、按照需要为数据库提供配置文件

[root@dataserver1 mysql]# cp support-files/my-large.cnf /etc/my.cnf

(2)、修改my.cnf,指定初始化数据库时,给的数据目录路径。

[root@dataserver1 mysql]# vim /etc/my.cnf
thread_concurrency = 2
datadir = /mydata/mysql/

(3)、提供LSB风格的启动脚本

[root@dataserver1 mysql]# cp support-files/mysql.server /etc/init.d/mysqld
[root@dataserver1 mysql]# chmod u+x /etc/init.d/mysqld
[root@dataserver1 mysql]# ll /etc/init.d/mysqld
-rwxr-xr-x 1 root root 11844 Sep 30 14:40 /etc/init.d/mysqld

4、启动数据库并测试

(1)、启动数据库服务

[root@dataserver1 mysql]# service mysqld start
Starting MySQL...                                          [  OK  ]

(2)、连接数据

[root@dataserver1 mysql]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
。。。。。。
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.00 sec)

说明:

   从上述信息,得知数据库已经安装成功


5、授权访问数据库

由于,初始化数据库会默认创建很多用户,且这些用户都是没有密码的。

所以,删除不需要的用户,给保留的用户添加密码

(1)、安装数据库时,默认创建的用户

mysql> select user,host,password from mysql.user;
+------+------------------------+----------+
| user | host                   | password |
+------+------------------------+----------+
| root | localhost              |          |
| root | dataserver1.9527du.com |          |
| root | 127.0.0.1              |          |
| root | ::1                    |          |
|      | localhost              |          |
|      | dataserver1.9527du.com |          |
+------+------------------------+----------+
6 rows in set (0.00 sec)

(2)、删除不需要有用户

mysql> drop user 'root'@'dataserver1.9527du.com';
mysql> drop user 'root'@'::1';
mysql> drop user ''@'localhost';
mysql> drop user ''@'dataserver1.9527du.com';

(3)、给用户添加密码

mysql> set password for 'root'@'localhost' = password('root');
Query OK, 0 rows affected (0.00 sec)

mysql> set password for 'root'@'127.0.0.1' = password('root');
Query OK, 0 rows affected (0.00 sec)

mysql> grant all on *.* to 'admin'@'%.%.%.%' identified by 'admin';
Query OK, 0 rows affected (0.00 sec)

mysql> flush  privileges;
Query OK, 0 rows affected (0.00 sec)

(4)、修改后,数据库的用户列表

mysql> select user,host,password from mysql.user;
+-------+-----------+-------------------------------------------+
| user  | host      | password                                  |
+-------+-----------+-------------------------------------------+
| root  | localhost | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
| root  | 127.0.0.1 | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
| admin | %.%.%.%   | *4ACFE3202A5FF5CF467898FC58AAB1D615029441 |
+-------+-----------+-------------------------------------------+
3 rows in set (0.00 sec)

<二>、在dataserver2.9527du.com(192.168.60.88)主机也是一样安装配置。

。。。。。。



二、把dataserver1.9527du.com和dataserver2.9527du.com两台主机的数据库配置成双主工作模型。

说明:  

    在 MariaDB数据的主主复制模型中。两个节点都要启动二进制日志和中继日志。
    因为双主模型的复制架构,两个节点都可读可写。

<一>、修改两台主机的/etc/my.cnf配置文件

1、修改dataserver2.9527du.com(192.168.60.88)的配置文件

binlog_format=mixed      --------> 二进制日志使用混合模式
log-bin=server2-bin      --------> 启动二进制日志
relay-log=server2-relay  --------> 启动中继日志
server-id = 12           --------> 注意:两台主机的server-id要求不一样。会了避免循环复制。
auto-increment-offset = 2    -------> 设置自动增长时的偏移量
auto-increment-increment = 2  ------> 每次增长2

说明:

    有些表使用了自动增长字段,为了避免重复复制来错误的。


2、修改dataserver1.9527du.com(192.168.60.22)的配置文件

log-bin=server1-bin
binlog_format=mixed
relay-log=server1-relay
server-id = 11
auto-increment-offset = 1
auto-increment-increment = 2

<二>、把两台服务器配置成双主工作模型。

其实双主模型就是两台主机互为主从。

1、所dataserver1.9527du.com当做主(master)服务器,dataserver2.9527du.com当做从(slave)服务器

(1)、查看dataserver1.9527du.com 的二进制日志的位置

mysql> show master status;
+--------------------+----------+--------------+------------------+
| File               | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| server1-bin.000001 |      245 |              |                  |
+--------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

(2)、在dataserver2.9527du.com 主机配置复制的各种参数

mysql> change master to master_host='192.168.60.22',master_user='rep',master_password='rep',master_log_file='server1-bin.000001',master_log_pos=245;
Query OK, 0 rows affected (0.01 sec)

参数说明:

       master_host             主服务器的地址
       master_user             连接到主服务器,且有: REPLICATION SLAVE 和 REPLICATION CLIENT 权限的用户。
       master_password         连接到主服务器的密码
       master_log_file         指定从那个二进制日志开始复制
       master_log_pos          指定从二进制日志的那个事件开始复制

(3)、启动slave前查看从服务器的状态,是否报错

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State:
                  Master_Host: 192.168.60.22
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: server1-bin.000001
          Read_Master_Log_Pos: 245
               Relay_Log_File: server2-relay.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: server1-bin.000001
             Slave_IO_Running: No   
            Slave_SQL_Running: No
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 245
              Relay_Log_Space: 245
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0 
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 0
1 row in set (0.00 sec)

(4)、启动复制操作

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

说明:

   执行上述指令,就会同时启动:IO_THREAD、SQL_THREAD 两个复制工作线程。也可以使用分别启动/停止某个线程。

   mysql> start|stop slave  IO_THREAD|SQL_THREAD

(5)、查看从服务器的运行状况状况

主要是查看两个复制工作线程。

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.60.22
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: server1-bin.000001
          Read_Master_Log_Pos: 245
               Relay_Log_File: server2-relay.000002
                Relay_Log_Pos: 531
        Relay_Master_Log_File: server1-bin.000001
             Slave_IO_Running: Yes  ---->负责到主服务器请求二进制日志事件的IO线程也没有错误
            Slave_SQL_Running: Yes  ----> 在本地负责应用中继日志中的事件的线程也没有问题
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 245
              Relay_Log_Space: 823
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 11
1 row in set (0.00 sec)

2、所dataserver2.9527du.com当做主(master)服务器,dataserver1.9527du.com当做从(slave)服务器

(1)、查看dataserver1.9527du.com 的二进制日志的位置

mysql> show master status;
+--------------------+----------+--------------+------------------+
| File               | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| server2-bin.000001 |      337 |              |                  |
+--------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

(2)、在dataserver1.9527du.com 主机配置复制的各种参数

mysql> change master to master_host='192.168.60.88',master_user='rep',master_password='rep',master_log_file='server2-bin.000001',master_log_pos=337;
Query OK, 0 rows affected (0.02 sec)

(3)、启动slave前查看从服务器的状态,是否报错

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State:
                  Master_Host: 192.168.60.88
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: server2-bin.000001
          Read_Master_Log_Pos: 337
               Relay_Log_File: server1-relay.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: server2-bin.000001
             Slave_IO_Running: No
            Slave_SQL_Running: No
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 337
              Relay_Log_Space: 245
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 0
1 row in set (0.00 sec)

(4)、启动复制操作

mysql> start slave;
Query OK, 0 rows affected (0.01 sec)

(5)、查看从服务器的运行状况状况

主要是查看两个复制工作线程。

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.60.88
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: server2-bin.000001
          Read_Master_Log_Pos: 337
               Relay_Log_File: server1-relay.000002
                Relay_Log_Pos: 531
        Relay_Master_Log_File: server2-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 337
              Relay_Log_Space: 823
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 12
1 row in set (0.00 sec)

<三>、测试双主模型的数据库是否工作OK?

1、查看两台数据库的所拥有的数据库是否一样的?

(1)、查看server1.9627du.com(192.168.60.22)主机有那些数据库

[root@dataserver1 mysql]# hostname; mysql -uroot -h127.0.0.1 -p
dataserver1.9527du.com
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
。。。。。。
mysql> create  database testdb;
Query OK, 1 row affected (0.01 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| testdb             |
+--------------------+
5 rows in set (0.00 sec)

(2)、查看server2.9627du.com(192.168.60.88)主机有那些数据库

[root@dataserver2 mysql]# hostname; mysql -uroot -h127.0.0.1 -p
dataserver2.9527du.com
Enter password:
。。。。。。
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| testdb             |
+--------------------+
5 rows in set (0.00 sec)

说明:

   从上述结果来看,两台数据库服务器所拥有的数据库都是一样的。


2、测试删除数据库两台主机的数据是否能够同步

(1)、在dataserver2.9527du.com 主机删除 testdb 数据库。

mysql> drop database testdb;
Query OK, 0 rows affected (0.01 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.00 sec)

(2)、在:server1.9627du.com(192.168.60.22)查看是否还有:testdb数据库

[root@dataserver1 mysql]# mysql -uroot -h127.0.0.1 -p
Enter password:
。。。。。。
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.00 sec)

说明:

   数据库的主从架构已经搭建成功。


三、配置:haproxy负载均衡两台MariDB服务器

haproxy接收连接数据库的请求,按照调度算法把用户请求分发到后端数据库服务器。

由于客户端与数据库服务器交互使用的协议是mysql协议(应用层协议),而不是http协议。所以要修改haproxy的工作模型为:TCP。

1、配置文件如下:

defaults
    mode                    tcp   ------> 指定haproxy工作在tcp模型
    log                     global
    #option                  httplog
    option                  dontlognull
    #option http-server-close
    #option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

listen stats                 ---------> 配置haproxy的状态页
    mode http                ---------> 设置haproxy的工作模型为http不从默认继承。
    bind 0.0.0.0:8888
    stats enable
    stats uri /haproxyadmin?stats
    stats realm  Haproxy\ Statistics
    stats auth   admin:admin
    stats admin if TRUE
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend  mysql   
    bind   *:3306                                    ------> haproxy 监听的端口和地址。
    mode   tcp                                       ------> 设置haproxy的工作模型
    default_backend             mysqlserver          ------> 调用定义的backup server服务器组。

#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend mysqlserver                                      -------> 定义backup server 服务器组
    balance         leastconn bash-type consistent       -------> 定义调度方法。使用laeastconn调度方法,非常适合mysql数据库服务这种长连接。
                                                         -------> 为了提供后端数据库服务器的缓存命中率和不因为某台数据库服务器故障而导致缓存全部失效使用“一致性哈唏”。指定hash-type 为:consistent
    server  dbsrv1  192.168.60.22:3306 check port 3306   -------> 配置 backup server是什么
    server  dbsrv2  192.168.60.88:3306 check port 3306

2、启动

(1)、启动haproxy服务

[root@haproxy haproxy]# service haproxy start
Starting haproxy:                                          [  OK  ]

(2)、查看 haproxy的监听端口

[root@haproxy haproxy]# netstat -anptl | grep haproxy
tcp        0      0 0.0.0.0:8888                0.0.0.0:*                   LISTEN      3115/haproxy   -----> haproxy的管理接口
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      3115/haproxy

3、从远程访问haproxy代理,创建数据库,是否能够调度双主模型的数据库服务器

(1)、从远程连接数据库,地址指向:haproxy代理监听的地址

D:\>mysql -uadmin -h192.168.60.130 -p
Enter password: *****
Welcome to the MySQL monitor.  Commands end with ; or \g.
。。。。。。
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.00 sec)

说明: 

   从上述可以看出,haproxy已经能够正确代理,两台MariDB数据库服务器了。


(2)、测试创建数据库

mysql> create database testdb;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| testdb             |
+--------------------+
5 rows in set (0.00 sec)

查看两台数据库服务器

[root@dataserver2 ~]# hostname;mysql -uroot -h127.0.0.1 -p  -e 'show databases;'
dataserver2.9527du.com
Enter password:
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| testdb             |
+--------------------+
[root@dataserver1 mysql]# hostname; mysql -uroot -h127.0.0.1 -p -e 'show databases;';
dataserver1.9527du.com
Enter password:
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| testdb             |
+--------------------+

说明:

   Haproxy已经能够调度两台数据库服务器了,且两台数据库也能够保持数据的同步。


(3)、测试删除数据库:

D:\>mysql -uadmin -h192.168.60.130 -p
Enter password: *****
Welcome to the MySQL monitor.  Commands end with ; or \g.
。。。。。。
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement

mysql> drop database testdb;
Query OK, 0 rows affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.00 sec)

查看两台 MariDB 数据库服务器

[root@dataserver1 mysql]# hostname; mysql -uroot -h127.0.0.1 -p -e 'show databases;';
dataserver1.9527du.com
Enter password:
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
[root@dataserver2 ~]# hostname;mysql -uroot -h127.0.0.1 -p  -e 'show databases;'
dataserver2.9527du.com
Enter password:
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+

说明:

    从上述测试得出结论,haproxy 负载均衡数据库已经搭建成功!!!


四、配置分布式文件系统mogilefs

mogilefs分布式文件系统是有主控节点(tracker)的。

     当存储数据时,使用mogilefs的客户端向主控节点(tracker)发起存储数据的请求,主控节点就会检索数据库,查看Storage Nodes节点的未使用空间信息,tracker就会告诉客户端应该把数据存储在Storage Nodes的哪个位置,客户端再去连接Storage Nodes进行数据的存储。

这就是mogilefs分布式文件系统存储数据的简单流程。

     当mogilefs客户端取数据时,首先客户端向tracker发起获取数据的请求,tracker就去查数据库,因为数据的元数据(如:某文件存储在Storage Node的那个位置)是存储在数据库的。tracker查询到文件的存储位置就把这些信息,发送给客户端。客户端再去联系 Storage Nodes 取数据的。


MogileFS(是perl语言开发的) 的组件:

      1、Tracker: Mogilefsd进程,其实它就是一个调度器。
             其实现的功能包括:Replication,Deletion,Query,Monitor等等;
      2、Storage Nodes:
             mogstored 进程;文件实际存储的位置.
      3、MySQL 节点:用户于为tracker存储元数据信息;存储mogilefs的名称空间及文件名;

提供两个Tracker节点,从而实现调度器的冗余。

<一>、配置 Storage Nodes

1、在mogilefs1.9527du.com(192.168.60.129)主机配置 Storage Node,也就是配置mogstored 进程的工作特征。

说明:

    mogilefs对存储空间没有要求。可以是文件可以是分区等。这里使用分区

(1)、准备好配置分布式文件系统所需要的存储空间。

创建挂载点

[root@mogilefs1 ~]# mkdir /mogilefs

编辑/etc/fstab配置文件,实现开机自动挂载/dev/sda3分区

[root@mogilefs1 ~]# vim /etc/fstab
/dev/sda3               /mogilefs               ext4    defaults        0 0

挂载测试

[root@mogilefs1 ~]# mount -a
[root@mogilefs1 ~]# mount | grep sda3
/dev/sda3 on /mogilefs type ext4 (rw)

查看大小

[root@mogilefs1 ~]# df -h | grep sda3
/dev/sda3            1019M   34M  934M   4% /mogilefs

(2)、设置 Mogstored 的存储目录

说明:

    当往mogilefs分布式存储中存储数据时,负责存储数据的进程是:mogstored ,而该进程的属主是:mogilefs.根据linux的文件访问控制模型,mogstored进程的属主要有存储空间的读写权限才可以存储数据的。所以要修改存储空间的属主属组为:mogilefs.

创建存储目录

[root@mogilefs1 ~]# mkdir -pv /mogilefs/mogdata/dev1

修改目录的属主属组都为:mogilefs

[root@mogilefs1 ~]# chown -R mogilefs:mogilefs /mogilefs/mogdata/
[root@mogilefs1 ~]# ll /mogilefs/
total 20
drwx------ 2 root     root     16384 Oct  1 10:13 lost+found
drwxr-xr-x 2 mogilefs mogilefs  4096 Oct  1 10:20 mogdata

(3)、提供mogstored工作的配置文件如下

[root@mogilefs1 ~]# vim /etc/mogilefs/mogstored.conf
maxconns = 10000
httplisten = 0.0.0.0:7500  ----> 可以通过浏览器访问存储节点的文件
mgmtlisten = 0.0.0.0:7501  ----> mogstored 监听的地址
docroot = /mogilefs/mogdata   -----> 存储设备的根位置。

2、在mogilefs2.9527du.com(192.168.60.128)主机配置 Storage Node,也就是配置mogstored 进程的工作特征。

(1)、准备好配置分布式文件系统所需要的存储空间。

创建挂载点

[root@mogilefs2wq ~]# mkdir /mogilefs

编辑/etc/fstab配置文件,实现开机自动挂载/dev/sda3分区

[root@mogilefs2wq ~]# vim /etc/fstab
/dev/sda3               /mogilefs               ext4    defaults        0 0

挂载测试

root@mogilefs2wq ~]# mount -a
[root@mogilefs2wq ~]# mount | grep sda3
/dev/sda3 on /mogilefs type ext4 (rw)

查看大小

[root@mogilefs2wq ~]# df -h | grep sda3
/dev/sda3                 1019M   34M  934M   4% /mogilefs

创建存储目录

[root@mogilefs2wq ~]# mkdir /mogilefs/mogdata/dev2

修改目录的属主属组都为:mogilefs

[root@mogilefs2wq ~]# chown mogilefs:mogilefs /mogilefs/mogdata/
[root@mogilefs2wq ~]# ll /mogilefs/
total 20
drwx------ 2 root     root     16384 Oct  1 10:19 lost+found
drwxr-xr-x 2 mogilefs mogilefs  4096 Oct  1 10:23 mogdata

(3)、提供mogstored工作的配置文件如下

[root@mogilefs2wq ~]# vim  /etc/mogilefs/mogstored.conf
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501    ----> mogstored 监听的地址
docroot = /mogilefs/mogdata  -----> 存储设备的根位置。

<二>、配置调度器(tracker)也就是:mogilefsd 进程的工作特征并初化Mogilefsd存储元数据所需要的数据库。

1、在两个节点:mogilefs1.9527du.com和mogilefs2.9527du.com设置:mogilefsd进程的工作特征如下所述:

[root@mogilefs1 ~]# vim /etc/mogilefs/mogilefsd.conf
db_dsn = DBI:mysql:mogilefs:host=192.168.60.130  
#           数据库类型:所使用的数据库:host=数据库服务器所在的主机IP地址
db_user = moguser  -------> 连接数据库使用的用户
db_pass = moguser  -------> 连接数据库使用的密码
# IP:PORT to listen on for mogilefs client requests
listen = 0.0.0.0:7001   -----> 监听的地址和端口。

2、初始化mogilefsd进程所需要保存文件元数据的表。

(1)、设置mogilefsd使用的数据库用户并授权

连接数据库

[root@haproxy /]# hostname ; mysql -uroot -h192.168.60.130 -p
haproxy.9527du.com
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
。。。。
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

创建数据库,用来保存存储在modilefs分布式文件系统的文件元数据的。

mysql> create database mogilefs;

授权

mysql> grant all on mogilefs.* to 'moguser'@'192.168.60.%' identified by 'moguser';
Query OK, 0 rows affected (0.01 sec)

刷新授权表让它立即生效

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

(2)、初始化mogilefsd使用的表

说明:前面已经使用haproxy负载均衡两台数据库服务器了。这里就可以直接连接到haproxy调度器,实现初始化工作。

[root@mogilefs1wq ~]# mogdbsetup --dbhost=192.168.60.130 --dbname=mogilefs --dbrootuser=root --dbrootpass=root --dbuser=moguser --dbpass=moguser --type=MySQL

This will attempt to setup or upgrade your MogileFS database.
It won't destroy existing data.
Run with --help for more information.  Run with --yes to shut up these prompts.

Continue? [N/y]: y

Create/Upgrade database name 'mogilefs'? [Y/n]: y

Grant all privileges to user 'moguser', connecting from anywhere, to the mogilefs database 'mogilefs'? [Y/n]: y

说明:

   已经完成初始化,mogilefsd进程所需要表。


3、启动测试

启动mogilefsd进程

[root@mogilefs1 /]# service mogilefsd start
Starting mogilefsd                                         [  OK  ]

查看调度器tracker监听的端口

root@mogilefs1 /]# netstat -anptl | grep mogilefsd
tcp        0      0 0.0.0.0:7001                0.0.0.0:*                   LISTEN      25900/mogilefsd
tcp        0      0 192.168.60.129:60212        192.168.60.130:3306         ESTABLISHED 25908/mogilefsd [de
tcp        0      0 192.168.60.129:60213        192.168.60.130:3306         ESTABLISHED 25921/mogilefsd [jo
tcp        0      0 192.168.60.129:60211        192.168.60.130:3306         ESTABLISHED 25902/mogilefsd [mo

启动mogstored进程,也就是存储节点。

[root@mogilefs1 /]# service mogstored start
Starting mogstored                                         [  OK  ]

查看存储监听的端口

[root@mogilefs1 /]# netstat -anptl | grep  mogstored
tcp        0      0 0.0.0.0:7500                0.0.0.0:*                   LISTEN      25972/mogstored
tcp        0      0 0.0.0.0:7501                0.0.0.0:*                   LISTEN      25972/mogstored

(2)、启动mogilefs2.9527du.com主机的:mogilefsd和mogstored进程:

启动mogilefsd进程

[root@mogilefs2wq ~]# service mogilefsd start
Starting mogilefsd                                         [  OK  ]

查看调度器tracker监听的端口

[root@mogilefs2wq ~]# netstat -anptl | grep mogilefs
tcp        0      0 0.0.0.0:7001                0.0.0.0:*                   LISTEN      2976/mogilefsd
tcp        0      0 192.168.60.128:46369        192.168.60.130:3306         ESTABLISHED 2984/mogilefsd [del
tcp        0      0 192.168.60.128:46367        192.168.60.130:3306         ESTABLISHED 2978/mogilefsd [mon
tcp        0      0 192.168.60.128:46368        192.168.60.130:3306         ESTABLISHED 2997/mogilefsd [job

启动mogstored进程,也就是存储节点。

[root@mogilefs2wq ~]# service mogstored start
Starting mogstored                                         [  OK  ]
[root@mogilefs2wq ~]# netstat -anptl | grep mogstored
tcp        0      0 0.0.0.0:7500                0.0.0.0:*                   LISTEN      3036/mogstored
tcp        0      0 0.0.0.0:7501                0.0.0.0:*                   LISTEN      3036/mogstored

说明:

   启动两个节点,所有工作进程都正常。

   从上面查看两个节点的:mogilefsd 进程监听的端口,也可判断:haproxy调度两台双主架构的数据库服务器都工作正常。


<三>、整合存储节点的存储资源。

也就是告诉mogilefs的控制节点(调度节点tracker)有那些存储节点(Storage Nodes),以及存储节点的存储设备。

这样,mogilefs的中心节点(mogilefsd进程)就可以调度管理这些存储节点的资源了。

1、添加主机

(1)、在nogilefs2.9527du.com节点添加存储节点主机。

[root@mogilefs2wq mogilefs]# mogadm --trackers=192.168.60.128:7001 host add mogilefs1 --ip=192.168.60.129 --status=alive
[root@mogilefs2wq mogilefs]# mogadm --trackers=192.168.60.128:7001 host add mogilefs2 --ip=192.168.60.128 --status=alive

(2)、查看添加的主机是否成功

在mogilefs2.9527du.com使用【mogadm】命令查看

[root@mogilefs2wq mogilefs]# mogadm --trackers=192.168.60.128:7001 host list
mogilefs1 [1]: alive
  IP:       192.168.60.129:7500

mogilefs2 [2]: alive
  IP:       192.168.60.128:7500

说明:

    从上面可以看出,已经成功添加。


在mogilefs1.9527du.com使用【mogadm】命令查看 

[root@mogilefs1 ~]# mogadm --trackers=192.168.60.129:7001 host list
mogilefs1 [1]: alive
  IP:       192.168.60.129:7500

mogilefs2 [2]: alive
  IP:       192.168.60.128:7500

说明:

    从上面可以看出,已经成功添加。


2、添加主机的存储到两个节点的调度器trackers(mogilefsd)上。

(1)、添加存储设备

[root@mogilefs1 ~]# mogadm --trackers=192.168.60.129:7001,192.168.60.128:7001 device add mogilefs1 1 --status=alive
[root@mogilefs1 ~]# mogadm --trackers=192.168.60.129:7001,192.168.60.128:7001 device add mogilefs2 2 --status=alive

说明:

    上面的:1  表示:dev1. 在mogstored.conf的配置文件中的根:docroot = /mogilefs/mogdata 下一定要有该目录。该目录也就是mogstord存储数据的目录。

                          

(2)、查看添加的存储是否成功

检测调度器

[root@mogilefs1 ~]# mogadm --trackers=192.168.60.129:7001,192.168.60.128:7001 check
Checking trackers...       ----------------> 检测两个调度器都OK!!!
  192.168.60.129:7001 ... OK
  192.168.60.128:7001 ... OK

Checking hosts...          -----------------> 检测两台存储节点都OK!!!
  [ 1] mogilefs1 ... OK
  [ 2] mogilefs2 ... OK

Checking devices...        -----------------> 检测两台存储节点的存储设备都OK!!!
  host device         size(G)    used(G)    free(G)   use%   ob state   I/O%
  ---- ------------ ---------- ---------- ---------- ------ ---------- -----
  [ 1] dev1             0.944      0.033      0.911   3.46%  writeable   0.0
  [ 2] dev2             0.944      0.033      0.911   3.45%  writeable   0.0
  ---- ------------ ---------- ---------- ---------- ------
             total:     1.888      0.065      1.822   3.46%

列出调度器的设备有那些

[root@mogilefs1 ~]# mogadm --trackers=192.168.60.128:7001,192.168.60.129:7001 device list
mogilefs1 [1]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev1:   alive      0.032      0.911      0.943        100

mogilefs2 [2]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev2:   alive      0.032      0.911      0.943        100

说明:

    从上述测试结果可以看出,mogilefs系统工作正常。


<四>添加域

mogilefs分布式文件系统的存储是平面化的,所以存储的文件名称是不允许同名的。

使用domain来模拟文件系统上的目录。定义名称空间,这样就可以在不同的域中文件名是可以相同的。

1、给两个调度节点(tracker)都添加同一个域(domain)。

[root@mogilefs1 ~]# mogadm --trackers=192.168.60.128:7001,192.168.60.129:7001 domain add p_w_picpaths

2、查看添加的域的信息

[root@mogilefs1 ~]# mogadm --trackers=192.168.60.128:7001,192.168.60.129:7001 domain list
 domain               class                mindevcount   replpolicy   hashtype
-------------------- -------------------- ------------- ------------ -------
 p_w_picpaths               default                   2        MultipleHosts() NONE
 域名                复制单元默认   复制单元(提供数据的冗余)     复制策略

<五>、向搭建的存储系统存储数据和下载数据测试

1、通过mogilefs1.9527du.com节点的调度器tracker上传图片

[root@mogilefs1 ~]# mogupload --trackers=192.168.60.129:7001 --domain=p_w_picpaths --key='/a.png' --file='/root/a.png'

(1)、在本节点查看

[root@mogilefs1 ~]# mogfileinfo --trackers=192.168.60.129:7001 --domain=p_w_picpaths --key='/a.png'
- file: /a.png
     class:              default
  devcount:                    2
    domain:               p_w_picpaths
       fid:                   10
       key:               /a.png
    length:               213132
 - http://192.168.60.128:7500/dev2/0/000/000/0000000010.fid
 - http://192.168.60.129:7500/dev1/0/000/000/0000000010.fid

(2)、在另一个节点查看

[root@mogilefs2 ~]# mogfileinfo --trackers=192.168.60.128:7001 --domain=p_w_picpaths --key='/a.png'
- file: /a.png
     class:              default
  devcount:                    2
    domain:               p_w_picpaths
       fid:                   10
       key:               /a.png
    length:               213132
 - http://192.168.60.128:7500/dev2/0/000/000/0000000010.fid
 - http://192.168.60.129:7500/dev1/0/000/000/0000000010.fid

说明:

    通过mogilefs1.9527du.com的调度器上传数据是没有问题的。


2、通过mogilefs2.9527du.com节点的调度器tracker上传图片

(1)、在本节点上传数据

[root@mogilefs2 ~]# mogupload --trackers=192.168.60.128 --domain=p_w_picpaths --key='/b.png' --file='/root/b.png'

(2)、在本节点查看数据。

[root@mogilefs2 ~]# mogfileinfo --trackers=192.168.60.128 --domain=p_w_picpaths --key='/b.png'
- file: /b.png
     class:              default
  devcount:                    2
    domain:               p_w_picpaths
       fid:                   12
       key:               /b.png
    length:                77339
 - http://192.168.60.128:7500/dev2/0/000/000/0000000012.fid
 - http://192.168.60.129:7500/dev1/0/000/000/0000000012.fid

(3)、在另一个节点查看

[root@mogilefs1 ~]# mogfileinfo --trackers=192.168.60.129:7001 --domain=p_w_picpaths --key='/b.png'
- file: /b.png
     class:              default
  devcount:                    2
    domain:               p_w_picpaths
       fid:                   12
       key:               /b.png
    length:                77339
 - http://192.168.60.129:7500/dev1/0/000/000/0000000012.fid
 - http://192.168.60.128:7500/dev2/0/000/000/0000000012.fid

说明:

    通过mogilefs2.9527du.com的调度器上传数据是没有问题的。


3、列出指定domain的文件

[root@mogilefs1 ~]# moglistkeys --trackers=192.168.60.129:7001,192.168.60.128:7001 --domain=p_w_picpaths  --key_prefix='/'
/a.png
/b.png

4、下载文件

(1)、联系mogilefs1.9527du.com节点的调度器tracker下载图片

[root@mogilefs1 ~]# mogfetch --trackers=192.168.60.129:7001 --domain=p_w_picpaths --key='/a.png' --file='/tmp/a.png'

查看下载的数据

[root@mogilefs1 ~]# ll /tmp/a.png
-rw-r--r-- 1 root root 213132 Oct  2 10:13 /tmp/a.png

(2)、联系mogilefs2.9527du.com节点的调度器tracker下载图片

[root@mogilefs2 ~]# mogfetch --trackers=192.168.60.128:7001 --domain=p_w_picpaths --key='/a.png' --file='/tmp/a.png'

查看下载的数据

[root@mogilefs2 ~]# ll /tmp/a.png
-rw-r--r-- 1 root root 213132 Oct  2 10:08 /tmp/a.png

说明:

    已经把mogilefs分布式文件系统存储搭建成功!!!


五、搭建NGINX负载器来负载均衡两个tracker调度器。

       我们在浏览器地址栏:http://192.168.60.129:7500/dev1/0/000/000/0000000012.fid 就可以查看该文件了。

     但是,在编写html页面链接该图片资源是很不方便的。最好,访问mogilefs分布式存储中的图片时,像访问网页一样,在后面键入:http://192.168.60.129/p_w_picpaths/a.png  就可以访问到存储在mogilefs分布式文件系统中的图片数据了。NGINX的第三方模块:

                 nginx_mogilefs_module-1.0.4.tar.gz支持这种功能。

工作原理:

       当客户端向NGINX发送请求p_w_picpaths目录下的资源时,NGINX会把请求交给:nginx_mogilefs_module 来处理。该模块会把请求:uri转化为:key.然后使用该key向调度器tracker发请求,调度器tracker(mogilefsd进程)收到请求后,会去查询数据库。从数据库中查询去nginx_mogilefs_module请求的key对应的文件file存储在存储节点的那个位置,调度器把这些信息告诉nginx_mogilefs_module模块,然后nginx_mogilefs_module就向联系存储节点,请求数据。当nginx_mogilefs_module收到存储节点响应的数据后。NGINX就把用户请求的图片响应给客户端。

1、编译NGINX让它支持nginx_mogilefs_module模块

   因为,NGINX不支持动态装卸载模块,所以要在编译时指定模块编译进来。

但是,TNGINX是支持动态装卸载模块的。这像HTTPD服务器,用于什么模块编译好使用指令装载就可以使用了。

(1)、创建运行NGINX服务进程的用户nginx,

[root@nginx admin]# useradd -r  -s /sbin/nologin nginx
[root@nginx admin]# id nginx
uid=402(nginx) gid=402(nginx) groups=402(nginx)

(2)、编译

解压

root@nginx admin]# tar -xf nginx_mogilefs_module-1.0.4.tar.gz
[root@nginx admin]# tar -xf nginx-1.6.1.tar.gz
[root@nginx admin]# cd nginx-1.6.1

配置

[root@nginx nginx-1.6.1]# ./configure \
--prefix=/usr/local/nginx-1.6 \
--sbin-path=/usr/sbin/nginx  \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/lock/subsys/nginx.lock \
--user=nginx --group=nginx \
--with-http_flv_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/tmp/nginx/client/ \
--with-pcre \
--add-module=../nginx_mogilefs_module-1.0.4  ------->使用该指令指定编译时要把nginx_mogilefs_module模块编译进来

编译安装

[root@nginx nginx-1.6.1]# make & make install

2、启动

[root@nginx ~]# service nginx start
Starting nginx:                                            [  OK  ]
[root@nginx ~]# netstat -anptl | grep nginx
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      5576/nginx

3、配置nginx调度mogilefs中的两个tracker(mogilefsd进程)

    upstream trackers {   ------> 定义上游(后端)服务器(mogilefsd)
        server 192.168.60.129:7001;
        server 192.168.60.128:7001;
    }
    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }
        location /p_w_picpath {  --------> 对用户请求的URI做访问控制,当URI以p_w_picpath打头的都由该location里的指令处理。
            mogilefs_tracker trackers; 
            mogilefs_domain p_w_picpaths;  -------> 定义域domain,当nginx_mogilefs_module模块把URI转成key后就会向treaker调度器请求p_w_picpaths域对应key的文件了。
	                             -------> 因为在mogilefs分布式文件系统中查找数据是要指定域和key.因为数据是存放在域中的。mogfileinfo --trackers=192.168.60.129:7001 --domain=p_w_picpaths --key='/b.png'
            mogilefs_methods GET PUT DELETE;  ----> 设置请求方法。
            mogilefs_pass {  ------> 调用定义的上游服务器组
                  proxy_pass $mogilefs_path;
                  proxy_hide_header Content-Type;
                  proxy_buffering off;
            }
        }
   }

4、重启动nginx

[root@nginx admin]# service nginx restart
Stopping    nginx:                                         [  OK  ]
Starting nginx:                                            [  OK  ]
[root@nginx admin]# netstat -anptl | grep nginx
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      2460/nginx

访问测试如下图:

打造有冗余能力的存储系统_第2张图片

说明:

    从上述访问可以看出,nginx调度已经搭成功


六、提供nginx负载均衡器和haproxy负载均衡器的高可用。避免存储系统存在单点故障。

分析两个调度器所涉及的资源:

(1)、负责调度两个tracker(mogiled)的NGINX调度器

     nginx 进程

     IP地址

(2)、负责高度两台数据库服务器的haproxy调度器

     mysqld 进程

     IP地址

解决方案:

       (1)、keepalived
       (2)、corosync + pacemaker

从功能都可以实现,但是keepalived比较容易实现,轻量级。且高可用的资源没有涉及到存储。

所以,这里选择keepalived实现。调度节点的高可用。

<一>、在nginx.9527du.com和haproxy.9527du.com主机都要安装上:nginx和haproxy

1、在haproxy.9527du.com 编译安装nginx并测试

(1)、编译安装NGINX

在haproxy.9527du.com 编译安装nginx,如在nginx.9527du.com(192.168.60.40)安装一样。

(2)、从nginx.9527du.com复制已经测试成功的配置文件和启动脚本到haproxy.9527du.com节点

[root@nginx admin]# scp -p /etc/init.d/nginx 192.168.60.130:/etc/init.d/
[email protected]'s password:
nginx                                         100% 2525     2.5KB/s   00:00
[root@nginx admin]# scp -p /etc/nginx/nginx.conf 192.168.60.130:/etc/nginx/
[email protected]'s password:
nginx.conf                                    100% 3089     3.0KB/s   00:00

(3)、启动

[root@haproxy ~]# service nginx start
Starting nginx:                                            [  OK  ]
[root@haproxy ~]# netstat -anptl | grep nginx
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      5854/nginx

(4)、访问测试

如下图:

打造有冗余能力的存储系统_第3张图片

说明:

    在haproxy.9527du.com(192.168.60.130)安装的nginx也可以调度两个tracker了。

2、在nginx.9527du.com(192.168.60.40)安装配置haproxy 来调度两台数据库服务器

(1)、从haproxy.9527du.com节点复制已经测试成功的配置文件到nginx.9527du.com(192.168.60.40)节点

[root@haproxy ~]# scp -p /etc/haproxy/haproxy.cfg 192.168.60.40:/etc/haproxy/
[email protected]'s password:
haproxy.cfg                                                                                        100% 2871     2.8KB/s   00:00

(2)、使用rsyslog记录haproxy产生的日志记录日志

[root@nginx ~]# vim /etc/rsyslog.conf
local2.*                                                /var/log/haproxy.log
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

(3)、启动

[root@nginx ~]# service rsyslog restart
Shutting down system logger:                               [  OK  ]
Starting system logger:                                    [  OK  ]
[root@nginx ~]# service haproxy start
Starting haproxy:                                          [  OK  ]
[root@nginx ~]# netstat -anptl | grep haproxy
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      2653/haproxy
tcp        0      0 0.0.0.0:8888                0.0.0.0:*                   LISTEN      2653/haproxy

(3)、访问测试:

访问haproxy的状态页面

打造有冗余能力的存储系统_第4张图片访问数据库

D:\>mysql -uadmin -h192.168.60.40 -p
Enter password: *****
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 156
Server version: 5.5.36-MariaDB-log MariaDB Server

。。。。。。。。
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mogilefs           |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)

说明:

   nginx.9527du.com(192.168.60.40)上的haproxy 已经能够调度数据库服务了。


<二>、在 haproxy.9527du.com(192.168.60.130)和nginx.9527du.com(192.168.60.40)配置keepalived 实现对 nginx调度器和haproxy调度器的高可用。

从而避免单点故障,导致存储瘫痪。

1、配置keepalived

(1)、分布式应用的要求,为了保证系统能够正常工作。

保证两个节点的时间是同步的

[root@nginx ~]# hostname;date;ssh 192.168.60.80 'hostname;date'
nginx.9527du.com
Thu Oct  2 12:06:15 CST 2014
haproxy.9527du.com
Thu Oct  2 12:06:39 CST 2014

(2)、配置文件如下:

[root@haproxy ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
    root@localhost
   }
   notification_email_from [email protected]
   smtp_server 192.168.60.80
   smtp_connect_timeout 30
}

vrrp_script chk_haproxy {
   script "killall -0 haproxy"
   interval 2
   weight -5
   fall 2
   rise 1
}

vrrp_script chk_nginx {
  script "killall -0 nginx"
  interval 3
  weight   -5
  fall     2
  rise     1
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 53
    priority 110
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 2222
    }
    virtual_ipaddress {
        192.168.60.130
    }
    track_script {
        chk_haproxy
        chk_nginx
    }
    notify_master "/etc/init.d/haproxy  start; /etc/init.d/nginx start"
    notify_fault "/etc/init.d/haproxy stop; /etc/init.d/nginx start"
}


vrrp_instance VI_3 {
    state BACKUP
    interface eth0
    virtual_router_id 56
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.60.40
    }
    track_script {
        chk_haproxy
        chk_nginx
    }
    notify_master "/etc/init.d/haproxy  start; /etc/init.d/nginx start"
    notify_fault "/etc/init.d/haproxy stop; /etc/init.d/nginx start"
}

(3)、复制配置文件到nginx.9527du.com节点。

[root@haproxy ~]# scp -p /etc/keepalived/keepalived.conf 192.168.60.90:/etc/keepalived/

(4)、修改nginx.9527du.com节点的配置文件,配置文件如下

[root@nginx ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
    root@localhost
   }
   notification_email_from [email protected]
   smtp_server 192.168.60.90
   smtp_connect_timeout 30
}

vrrp_script chk_haproxy {
   script "killall -0 haproxy"
   interval 2
   weight -5
   fall 2
   rise 1
}

vrrp_script chk_nginx {
  script "killall -0 nginx"
  interval 3
  weight   -5
  fall     2
  rise     1
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 53
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 2222
    }
    virtual_ipaddress {
        192.168.60.130
    }
    track_script {
        chk_haproxy
        chk_nginx
    }
    notify_master "/etc/init.d/haproxy  start; /etc/init.d/nginx start"
    notify_fault "/etc/init.d/haproxy stop; /etc/init.d/nginx start"
}


vrrp_instance VI_3 {
    state MASTER
    interface eth0
    virtual_router_id 56
    priority 115
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.60.40
    }
    track_script {
        chk_haproxy
        chk_nginx
    }
    notify_master "/etc/init.d/haproxy  start; /etc/init.d/nginx start"
    notify_fault "/etc/init.d/haproxy stop; /etc/init.d/nginx start"
}

2、启动keepalived

(1)、在nginx.9527du.com节点先启动keepalived服务

[root@nginx ~]# service keepalived start
Starting keepalived:                                       [  OK  ]

(2)、查看资源

查看haproxy服务是否启动

[root@nginx ~]# netstat -anptl | grep haproxy
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      2188/haproxy
tcp        0      0 0.0.0.0:8888                0.0.0.0:*                   LISTEN      2188/haproxy
tcp        0      1 192.168.60.90:43245         192.168.60.22:3306          SYN_SENT    2188/haproxy

查看nginx服务是否启动

[root@nginx ~]# netstat -anptl | grep nginx
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      2291/nginx

查看流动IP

[root@nginx ~]# ip add show | grep "[[:space:]]*inet[[:space:]]*[1][9]"
    inet 192.168.60.90/24 brd 192.168.60.255 scope global eth0
    inet 192.168.60.40/32 scope global eth0
    inet 192.168.60.130/32 scope global eth0

3、启动haproxy.9527du.com(192.168.60.80)的keepalived

(1)、远程方式启动keepalived服务

[root@nginx ~]# ssh 192.168.60.80 'service keepalived start'
Starting keepalived: [  OK  ]

(2)、查看资源

查看haproxy服务是否启动

[root@haproxy ~]# netstat -anptl | grep haproxy
tcp        0      0 0.0.0.0:8888                0.0.0.0:*                   LISTEN      2193/haproxy
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      2193/haproxy
tcp        0      1 192.168.60.132:33174        192.168.60.22:3306          SYN_SENT    2193/haproxy
tcp        0      1 192.168.60.132:45016        192.168.60.88:3306          SYN_SENT    2193/haproxy

查看nginx服务是否启动

[root@haproxy ~]# netstat -anptl | grep nginx
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      2292/nginx

查看流动IP:192.168.60.130是否配置上?

[root@haproxy ~]# ip add show | grep "[[:space:]]*inet[[:space:]]*[1][9]"
    inet 192.168.60.80/24 brd 192.168.60.255 scope global eth0
    inet 192.168.60.130/32 scope global eth0

说明:

    从上述信息得知,在两个节点启动keepalived都正常。

3、测试:

(1)、关闭haproxy.9527du.com(192.168.60.80)的keepaliced 查看VIP 192.168.60.130 是否会流转到nginx.9527du.com(192.168.60.90)

关闭keepalived服务

[root@haproxy ~]# service keepalived stop
Stopping keepalived:

查看是否放弃配置流动IP:192.168.60.130

[root@haproxy ~]# ip add show | grep "[[:space:]]*inet[[:space:]]*[1][9]"
    inet 192.168.60.80/24 brd 192.168.60.255 scope global eth0

从上述可以看出VIP已经不在了

查看nginx.9527du.com

[root@nginx ~]# ip add show | grep "[[:space:]]*inet[[:space:]]*[1][9]"
    inet 192.168.60.90/24 brd 192.168.60.255 scope global eth0
    inet 192.168.60.40/32 scope global eth0
    inet 192.168.60.130/32 scope global eth0

从上面可以看出,haproxy.9527du.com的VIP已经流转到该台主机了。

(2)、查看对haproxy和nginx服务是否影响

[root@nginx ~]# netstat -anptl | grep -e "haproxy" -e "nginx"
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      2188/haproxy
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      2291/nginx
tcp        0      0 0.0.0.0:8888                0.0.0.0:*                   LISTEN      2188/haproxy
tcp        0      1 192.168.60.90:41282         192.168.60.88:3306          SYN_SENT    2188/haproxy

说明:

   从上述可以看出,一切正常。


(3)、把haproxy.9527du.com的keepalived启动,查看VIP:192.168.60.130 是配置上。

启动

[root@haproxy ~]# service keepalived start
Starting keepalived:                                       [  OK  ]

查看流转IP

[root@haproxy ~]# ip add show | grep "[[:space:]]*inet[[:space:]]*[1][9]"
    inet 192.168.60.80/24 brd 192.168.60.255 scope global eth0
    inet 192.168.60.130/32 scope global eth0

查看haproxy和nginx服务是否正常

[root@haproxy ~]# netstat -anptl | grep -e "haproxy" -e "nginx"
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      2292/nginx
tcp        0      0 0.0.0.0:8888                0.0.0.0:*                   LISTEN      2193/haproxy
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      2193/haproxy
tcp        0      1 192.168.60.80:37754         192.168.60.88:3306          SYN_SENT    2193/haproxy
tcp        0      1 192.168.60.80:55891         192.168.60.22:3306          SYN_SENT    2193/haproxy

4、再测试;

(1)、关闭nginx.9527du.com(192.168.60.90)的keepaliced 查看VIP 192.168.60.40 是否会流转到haproxy.9527du.com(192.168.60.80)

关闭keepalived服务

[root@nginx ~]# service keepalived stop
Stopping keepalived:                                       [  OK  ]

查看是流动IP:192.168.60.40 是否还在

[root@nginx ~]# ip add show | grep "[[:space:]]*inet[[:space:]]*[1][9]"
    inet 192.168.60.90/24 brd 192.168.60.255 scope global eth0

查看,haproxy.9527du.com 是否配置了VIP: 192.168.60.40

[root@haproxy ~]# ip add show | grep "[[:space:]]*inet[[:space:]]*[1][9]"
    inet 192.168.60.80/24 brd 192.168.60.255 scope global eth0
    inet 192.168.60.130/32 scope global eth0
    inet 192.168.60.40/32 scope global eth0

查看对haproxy,nginx服务是否有影响

[root@haproxy ~]# netstat -anptl | grep -e "haproxy" -e "nginx"
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      2292/nginx
tcp        0      0 0.0.0.0:8888                0.0.0.0:*                   LISTEN      2193/haproxy
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      2193/haproxy
tcp        0      1 192.168.60.80:55991         192.168.60.22:3306          SYN_SENT    2193/haproxy
tcp        0      1 192.168.60.80:37854         192.168.60.88:3306          SYN_SENT    2193/haproxy

说明:

   从上述可以看出一切正常


(2)、把nginx.9527du.com的keepalived启动起

启动

[root@nginx ~]# service keepalived start
Starting keepalived:                                       [  OK  ]

查看是否配置上流动IP:192.168.60.40

[root@nginx ~]# ip add show | grep "[[:space:]]*inet[[:space:]]*[1][9]"
    inet 192.168.60.90/24 brd 192.168.60.255 scope global eth0
    inet 192.168.60.40/32 scope global eth0

查看:haproxy和nginx服务是否正常

[root@nginx ~]# netstat -anptl | grep -e "haproxy" -e "nginx"
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      2188/haproxy
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      2291/nginx
tcp        0      0 0.0.0.0:8888                0.0.0.0:*                   LISTEN      2188/haproxy
tcp        0      1 192.168.60.90:41483         192.168.60.88:3306          SYN_SENT    2188/haproxy
tcp        0      1 192.168.60.90:44135         192.168.60.22:3306          SYN_SENT    2188/haproxy

说明:

   从上述测试结果可以看出,keepalived高可用已经搭建成功


七、通过浏览访问存储在mogilefs中的图片,来测试该存储系统的冗余能力?

 1、测试数据的高可用是否成功,对获取图片数据是否影响

(1)、关闭dataserver1.9527du.com 主机的数据库服务

[root@dataserver1 ~]# service mysqld stop
Shutting down MySQL.                                       [  OK  ]
[root@dataserver1 ~]# netstat -anptl | grep mysqld

访问如下图:

打造有冗余能力的存储系统_第5张图片

说明:

    正常。

(2)、关闭dataserver2.9527du.com的数据库服务

[root@dataserver1 ~]# service mysqld start
Starting MySQL..                                           [  OK  ]
[root@dataserver2 ~]# service mysqld stop
Shutting down MySQL.                                       [  OK  ]
[root@dataserver2 ~]# netstat -anptl | grep mysqld

访问测试:

如下图。

打造有冗余能力的存储系统_第6张图片

说明:

   访问图片一切正常。

[root@dataserver2 ~]# service  mysqld start
Starting MySQL..                                           [  OK  ]

2、测试:调度器nginx和haproxy是否实现高可用

(1)、关闭nginx.9527du.com的keepalived(测试nginx调度器)

[root@nginx ~]# ip add show | grep "[[:space:]]*inet[[:space:]]*[1][9]"
    inet 192.168.60.90/24 brd 192.168.60.255 scope global eth0
    inet 192.168.60.40/32 scope global eth0
[root@nginx ~]# service keepalived stop
Stopping keepalived:                                       [  OK  ]
[root@nginx ~]# ip add show | grep "[[:space:]]*inet[[:space:]]*[1][9]"
    inet 192.168.60.90/24 brd 192.168.60.255 scope global eth0

访问测试:

如下图:

打造有冗余能力的存储系统_第7张图片

说明:

    keepalived高可用nginx节点没有问题

[root@nginx ~]# service keepalived start
Starting keepalived:                                       [  OK  ]
[root@nginx ~]# ip add show | grep "[[:space:]]*inet[[:space:]]*[1][9]"
    inet 192.168.60.90/24 brd 192.168.60.255 scope global eth0
    inet 192.168.60.40/32 scope global eth0


(2)、关闭haproxy.9527du.com 的keepalived服务(测试haproxy调度器)

[root@haproxy ~]# service keepalived stop
Stopping keepalived:                                       [  OK  ]
[root@haproxy ~]# ip add show | grep "[[:space:]]*inet[[:space:]]*[1][9]"
    inet 192.168.60.80/24 brd 192.168.60.255 scope global eth0

访问测试:

打造有冗余能力的存储系统_第8张图片

说明:

   keepalived高可用nginx节点没有问题

[root@haproxy ~]# service keepalived start
Starting keepalived:                                       [  OK  ]
[root@haproxy ~]# ip add show | grep "[[:space:]]*inet[[:space:]]*[1][9]"
    inet 192.168.60.80/24 brd 192.168.60.255 scope global eth0
    inet 192.168.60.132/24 brd 192.168.60.255 scope global eth1

3、测试mogilefs的tracker是否能够提供高可用

(1)、停止 mogilefs1.9527du.com 的mogilefsd服务

[root@mogilefs1 ~]# service mogilefsd stop
Stopping mogilefsd                                         [  OK  ]
[root@mogilefs1 ~]# netstat -anptl | grep  mogilefsd

访问测试:

如下图:

打造有冗余能力的存储系统_第9张图片

说明:

   一切正常

[root@mogilefs1 ~]# service mogilefsd start
Starting mogilefsd                                         [  OK  ]
[root@mogilefs1 ~]# netstat -anptl | grep  mogilefsd
tcp        0      0 0.0.0.0:7001                0.0.0.0:*                   LISTEN      2429/mogilefsd

(2)、测试停止 mogilefs2.9527du.com 的mogilefsd服务

[root@mogilefs2 ~]# service mogilefsd stop
Stopping mogilefsd                                         [  OK  ]
[root@mogilefs2 ~]# netstat -anptl | grep mogilefsd

访问测试:

如下图:

打造有冗余能力的存储系统_第10张图片

[root@mogilefs2 ~]# service mogilefsd start
Starting mogilefsd                                         [  OK  ]
[root@mogilefs2 ~]# netstat -anptl | grep mogilefsd
tcp        0      0 0.0.0.0:7001                0.0.0.0:*                   LISTEN      2528/mogilefsd

说明:

   一切也正常。


tracker节点的高可用也没有问题。


完成!!!