拓扑图如下:
双主模型数据库:
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'
|