打造有冗余能力的存储系统

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
传统型负载均衡 CLB,每月750个小时 15LCU
简介:

拓扑图如下:

wKiom1Quh_bSVVcPAAMz3Rs6kSY357.jpg

双主模型数据库:

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

负责调度数据库的haproxy

1
           haproxy.9527du.com(192.168.60.130)

分布式存储节点:

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

负责调度tracker的nginx

1
           nginx.9527du.com(192.168.60.40)

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

流动IP为:

1
2
           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进行调度,保证了存储文件元数据的数据库不会成为单点问题处在。

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


一、安装数据库

使用的数据库软件为:

1
                mariadb-5.5.36-linux-i686. tar .gz

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

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

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

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

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

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

1
2
3
4
[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)、把数据库软件解压到指定目录下

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

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

1
2
3
4
5
[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

1
2
3
4
5
6
7
8
9
10
11
12
13
[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、初始化数据库

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

1
2
3
4
5
6
[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)、按照需要为数据库提供配置文件

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

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

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

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

1
2
3
4
[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)、启动数据库服务

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

(2)、连接数据

1
2
3
4
5
6
7
8
9
10
11
12
13
[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)、安装数据库时,默认创建的用户

1
2
3
4
5
6
7
8
9
10
11
12
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)、删除不需要有用户

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

(3)、给用户添加密码

1
2
3
4
5
6
7
8
9
10
11
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)、修改后,数据库的用户列表

1
2
3
4
5
6
7
8
9
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两台主机的数据库配置成双主工作模型。

说明:  

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

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

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

1
2
3
4
5
6
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)的配置文件

1
2
3
4
5
6
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 的二进制日志的位置

1
2
3
4
5
6
7
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 主机配置复制的各种参数

1
2
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)

参数说明:

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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)、启动复制操作

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

说明:

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

   mysql> start|stop slave  IO_THREAD|SQL_THREAD

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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 的二进制日志的位置

1
2
3
4
5
6
7
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 主机配置复制的各种参数

1
2
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前查看从服务器的状态,是否报错

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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)、启动复制操作

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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)主机有那些数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[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)主机有那些数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[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 数据库。

1
2
3
4
5
6
7
8
9
10
11
12
13
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数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
[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、配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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服务

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

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

1
2
3
[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代理监听的地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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)、测试创建数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
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)

查看两台数据库服务器

1
2
3
4
5
6
7
8
9
10
11
12
[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             |
+--------------------+
1
2
3
4
5
6
7
8
9
10
11
12
[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)、测试删除数据库:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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 数据库服务器

1
2
3
4
5
6
7
8
9
10
11
[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                |
+--------------------+
1
2
3
4
5
6
7
8
9
10
11
[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
2
3
4
5
       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)、准备好配置分布式文件系统所需要的存储空间。

创建挂载点

1
[root@mogilefs1 ~] # mkdir /mogilefs

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

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

挂载测试

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

查看大小

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

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

说明:

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

创建存储目录

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

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

1
2
3
4
5
[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工作的配置文件如下

1
2
3
4
5
[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)、准备好配置分布式文件系统所需要的存储空间。

创建挂载点

1
[root@mogilefs2wq ~] # mkdir /mogilefs

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

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

挂载测试

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

查看大小

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

创建存储目录

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

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

1
2
3
4
5
[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工作的配置文件如下

1
2
3
4
5
[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进程的工作特征如下所述:

1
2
3
4
5
6
7
[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使用的数据库用户并授权

连接数据库

1
2
3
4
5
6
[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分布式文件系统的文件元数据的。

1
mysql> create database mogilefs;

授权

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

刷新授权表让它立即生效

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

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

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

1
2
3
4
5
6
7
8
9
10
11
[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进程

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

查看调度器tracker监听的端口

1
2
3
4
5
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进程,也就是存储节点。

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

查看存储监听的端口

1
2
3
[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进程

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

查看调度器tracker监听的端口

1
2
3
4
5
[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进程,也就是存储节点。

1
2
3
4
5
[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节点添加存储节点主机。

1
2
[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】命令查看

1
2
3
4
5
6
[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】命令查看 

1
2
3
4
5
6
[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)、添加存储设备

1
2
[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)、查看添加的存储是否成功

检测调度器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[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%

列出调度器的设备有那些

1
2
3
4
5
6
7
8
[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)。

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

2、查看添加的域的信息

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

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

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

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

(1)、在本节点查看

1
2
3
4
5
6
7
8
9
10
[root@mogilefs1 ~] # mogfileinfo --trackers=192.168.60.129:7001 --domain=images --key='/a.png'
file /a .png
      class:              default
   devcount:                    2
     domain:               images
        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)、在另一个节点查看

1
2
3
4
5
6
7
8
9
10
[root@mogilefs2 ~] # mogfileinfo --trackers=192.168.60.128:7001 --domain=images --key='/a.png'
file /a .png
      class:              default
   devcount:                    2
     domain:               images
        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)、在本节点上传数据

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

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

1
2
3
4
5
6
7
8
9
10
[root@mogilefs2 ~] # mogfileinfo --trackers=192.168.60.128 --domain=images --key='/b.png'