简单介绍
随着互联网络应用的发展,大规模海量级数据存储对于一个企业越来越重要,组织机构依赖于数据库来运行各种重要的业务,几小时甚至几分钟的宕机,都会造成不可估量的损失,因此保证数据库的高可用是所有组织机构优先考虑的事情,对于想要在竞争中立于不败之地的企业来说,构建高可用的数据存储至关重要。
这里提供了一种在中小型企业应用中数据库搭建的廉价解决方案,在不购买高额的高性能的服务器前提下,利用现有的资源,进行整合配置以完成。用于为企业提供数据库的高效率、高安全、低故障的服务。总体说来,实现MySQL的高可用集群,在后台创建多个MySQL服务器节点,当某一个节点遇到故障后,能在最短时间内定位,并自动切换到别的正常节点上,从而不影响用户的使用,也使企业自己内部数据存取和修改等操作能够正常的进行,将损失降到最低,也给后期的维护提供了很大方便。
至于数据库前端的APP这里就不再介绍了。
通过创建一个NFS服务器,来实现数据的共享存储。用户可以用同一个IP地址来访问数据库,这个IP地址被称为VIP,多个MySQL节点利用这个VIP向用户提供服务,用户自己并不知道是具体的哪一个MySQL节点提供的服务,各个MySQL节点将用户操作所产生的数据存放到NFS服务器上。当其中的一个MySQL节点出现故障后,别的节点会使自己成为主节点,并抢占VIP,且将NFS服务器的共享目录挂载至自己的某个目录下,继续向用户提供服务,而这个过程对于用户来说是透明的,从而实现MySQL的高可用功能。
用户远程访问MySQL服务,在访问时使用VIP:http://www.01chengde.cn进行访问,用户的访问操作被分配到MySQL1或者MySQL2上,操作所产生的数据存储在NFS Server上,在NFS Server服务器上创建一个共享存储,用于存储数据,并且挂载在对外提供服务的MySQL服务器上。两个MySQL服务器都有自己的实际的IP地址,MySQL1的IP地址为172.16.100.11,MySQL2主机的IP地址为172.16.100.12。向外提供服务的服务器向用户显示的则是VIP,如果这个服务器出现宕机等故障时,另外一台服务器会争夺VIP,且将NFS Server的共享存储挂载在自己的目录下,继续对外提供服务,这一过程对用户来说是透明的,此过程通过corosync来实现。上面过程中一台服务器出现故障后,另一台服务器会自动检测到,而这个检测个过程是通过heartbeat来实现,在两台服务器之间使用一根心跳线连接起来,它们时时刻刻传递心跳信息,当一台服务器出现故障后,另一台服务器能够马上检测到,然后切换状态,使自己成为对外提供服务的服务器。
实现过程
1:配置主机名和IP地址
为NFS Server服务器和两台MySQL服务器配置主机名和IP地址,以便对外提供服务,本项目中NFS Server的IP地址为http://dy.01chengde.cn,主机名为NFS。主机一的IP地址为172.16.100.11,主机名为node1.sange.com。主机二的IP地址为172.16.100.12,主机名为http://www.jingjingdianying.com。现在进行如下配置:
1.在NFS Server上配置主机名和IP地址:
1
2
3
4
5
6
7
8
|
[root@NFS ~]
# hsotname NFS
[root@NFS ~]
# vim/etc/sysconfig/network
NETWORKING=
yes
HOSTNAME=NFS
[root@NFS ~]
# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
IPADDR=172.16.100.1
ONBOOT=
yes
|
2.在MySQL1上配置主机名和IP地址:
1
2
3
4
5
6
7
8
9
|
[root@node1 ~]
# hostname node1.sange.com
[root@node1 ~]
#vim/etc/sysconfig/network
NETWORKING=
yes
HOSTNAME=node1.sange.com
[root@node1 ~]
# vim/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
ONBOOT=
yes
IPADDR=172.16.100.11
|
3.在MySQL2上配置主机名和IP地址:
1
2
3
4
5
6
7
8
9
|
[root@node2 ~]# hostnamenode2.sange.com
[root@node2 ~]# vim/etc/sysconfig/network
NETWORKING=yes
HOSTNAME=node2.sange.com
[root@node2 ~]#vim/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=
static
IPADDR=
172.16
.
100.12
ONBOOT=yes
|
在MySQL1和MySQL2之间建立双机互信,在一台主机上生成公钥和私钥,并将产生的公钥和私钥送到另一台主机上即可。建立双机互信后,在两台机器之间进行文件备份、执行命令等操作时,省去输入密码的过程,为后面的安装程序、配置服务提供很多方便。
在MySQL1上配置IP地址所对应的主机名和别名,其中node1为node1.sange.com的别名,node2为node2.sange.com的别名,在项目实现的过程中,可以直接使用node1和node2来代替主机名,这样会提供很多方便。
在MySQL1上配置IP地址所对应的主机名和别名:
[root@node1 ~]# vim/etc/hosts
1
2
3
4
5
|
#Do not remove the following line, or
var
ious programs
#that require network functionality will fail.
127.0
.
0.1
localhost.localdomain localhost
172.16
.
100.11
node1.sange.com node1
172.16
.
100.12
node2.sange.com node2
|
在MySQL2上配置IP地址所对应的主机名和别名:
1
2
3
4
5
6
|
[root@node2 ~]#vim/etc/hosts
#Do not remove the following line, or
var
ious programs
#that require network functionality will fail.
127.0
.
0.1
localhost.localdomain localhost
172.16
.
100.11
node1.sange.com node1
172.16
.
100.12
node2.sange.com node2
|
实现双机互信:
在node1上生成密钥:
1
|
[root@node1~]# ssh-keygen -t rsa
|
将密钥复制到node2上去:
1
|
[root@node1 ~]#ssh-copy-id-i .ssh/id_rsa.pub root@
172.16
.
100.12
|
在node2上生成密钥:
1
|
[root@node2~]#ssh-keygen -t rsa
|
将密钥复制到node1上去:
1
|
[root@node2 ~]#ssh-copy-id-i .ssh/id_rsa.pub root@
172.16
.
100.11
|
NFS Server提供共享存储的功能,将用户操作所产生的数据存储下来,然后挂载至对外提供MySQL的主机上(node1或node2)。而提供共享存储的介质有很多种,可以是一块硬盘,也可以是一个磁盘。这里建立一个逻辑卷来存储数据,方便以后的管理和扩充,先建立一个大小为20G的磁盘分区,用于建立逻辑卷,然后再建立一个大小为10G的逻辑卷。
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
[root@NFS ~]# fdisk /dev/sda
//对磁盘分区
The number of cylinders
for
this
disk
is
set
to
15665
.
There
is
nothing wrong
with
that, but
this
is
larger than
1024
,
and could
in
certain setups cause problems
with
:
1
) software that runs at boot time (e.g., old versions of LILO)
2
) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/
2
FDISK)
Command (m
for
help): n
//新建一个磁盘
Command action
e extended
p primary partition (
1
-
4
)
e
//扩展分区
Selected partition
4
First cylinder (
5359
-
15665
,
default
5359
):
Using
default
value
5359
Last cylinder or +size or +sizeM or +sizeK (
5359
-
15665
,
default
15665
):
Using
default
value
15665
Command (m
for
help): n
First cylinder (
5359
-
15665
,
default
5359
):
Using
default
value
5359
Last cylinder or +size or +sizeM or +sizeK (
5359
-
15665
,
default
15665
): +20G
//大小为20G
Command (m
for
help): P
// 显示磁盘分区
Disk /dev/sda:
128.8
GB,
128849018880
bytes
255
heads,
63
sectors/track,
15665
cylinders
Units = cylinders of
16065
*
512
=
8225280
bytes
Device Boot Start End Blocks Id System
/dev/sda1 *
1
13
104391
83
Linux
/dev/sda2
14
5235
41945715
8e Linux LVM
/dev/sda3
5236
5358
987997
+
83
Linux
/dev/sda4
5359
15665
82790977
+
5
Extended
/dev/sda5
5359
7791
19543041
83
Linux
Command (m
for
help): T
//设定磁盘类型
Partition number (
1
-
5
):
5
Hex code (type L to list codes): 8e
//创建LVM时的专用格式
Changed system type of partition
5
to 8e (Linux LVM)
Command (m
for
help): w
//保存新建的磁盘分区
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed
with
error
16
: Device or resource busy.
The kernel still uses the old table.
The
new
table will be used at the next reboot.
Syncing disks.
[root@NFS ~]# partprobe /dev/sda
//重新格式化一下
要建立逻辑卷,先要建立物理卷,然后建立卷组,最后才能建立逻辑卷。
[root@NFS ~]# pvcreate /dev/sda5
//创建物理卷
[root@NFS ~]# vgcreate myvg /dev/sda5
//创建卷组
[root@NFS ~]# vgs
//显示新建的卷组
VG #PV #LV #SN Attr VSize VFree
myvg
1
0
0
wz--n-
18
.64G
18
.64G
vg0
1
4
0
wz--n-
40
.00G
0
[root@NFS ~]# lvcreate -L 10G -n mydata myvg
//创建逻辑卷
[root@NFS ~]# lvs
//显示新建的卷组
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
mydata myvg -wi-a-
10
.00G
[root@NFS ~]#mke2fs �Cj �CL MYDATA /dev/myvg/mydata
[root@NFS ~]# mkdir /mydata
[root@NFS ~]#vim /etc/fstab
//添加如下内容
LABEL=MYDATA /mydata ext3 defaults
0
0
[root@NFS ~]#mount �Ca
//重新挂载一下
|
将/mydata目录通过nfs服务导出出去,由于nfs服务不识别主机名,只识别ID号,所以必须先建立用户,ID号要和mysql服务器上的mysql用户(后面创建)的ID号保持一致,这里设定ID号都为306。
先创建mysql用户:
1
2
3
4
5
6
|
[root@NFS ~]# groupadd -g
306
-r mysql
[root@NFS ~]# useradd -g mysql -r -u
306
-s /sbin/nologin mysql
将/mydata的属主和属组改为mysql:
[root@NFS ~]# chown -R mysql:mysql /mydata/
[root@NFS ~]# vim /etc/exports
//将/mydata目录导出出去,172.16.0.0网段内的用户可以读写/mydata目录中的文件。
/mydata
172.16
.
0.0
/
16
(rw,no_root_squash)
|
启动nfs服务:
1
|
[root@NFS ~]# service nfs start
|
让nfs服务开机自动启动:
1
|
[root@NFS ~]# chkconfig nfs on
|
在node1和node2上测试nfs服务提供的共享文件是否能成功应用:
在node1先创建mysql用户:
1
2
3
|
[root@node1 ~]# groupadd -r -g
306
mysql
[root@node1 ~]# useradd -g mysql -u
306
-r mysql
[root@node1 ~]# mkdir /mydata
|
将NFS Server上的/mydata目录挂载至node1的/mydata目录上
1
|
[root@node1 ~]# mount -t nfs
172.16
.
100.1
:/mydata/mydata/
|
试一下能否在共享目录中创建文件:
a文件创建成功,则说明node1能够使用NFS Server共享的目录。
node2上的测试方法与node1相同,方法同上。
4:在节点node1和节点node2上安装mysql
Mysql的安装方式可以分为rpm包安装和编译安装,编译安装可以定制自己所需要的各种服务,非常有用,这里我们使用源码编译安装的方式安装mysql。
安装的mysql版本为mysql-5.5.22-linux2.6-i686.tar.gz,可以在网站上搜索并下载。
在node1上安装mysql:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
[root@node1~]# tar xf mysql-
5.5
.
22
-linux2.
6
-i686.tar.gz -C /usr/local
[root@node1 ~]# cd /usr/local
[root@node1 local]# ln -sv mysql-
5.5
.
22
-linux2.
6
-i686 mysql
[root@node1 local]# cd mysql
[root@node1 mysql]# chown -R mysql:mysql .
[root@node1 mysql]# scripts/mysql_install_db --user=mysql --datadir=/mydata/data
[root@node1 mysql]# cp support-files/my-large.cnf /etc/my.cnf
//为mysql提供主配置文件
[root@node1 mysql]# vim /etc/my.cnf
//修改mysqld的主配置文件,添加如下两行:
thread_concurrency =
2
datadir = /mydata/data
[root@node1mysql]#cp support-files/mysql.server /etc/init.d/mysqld
// 为mysql提供sysv服务脚本
[root@node1 mysql]# vim /etc/profile
//修改PATH环境变量,让系统可以直接使用mysql的相关命令,添加如下行
PATH=$PATH:/usr/local/mysql/bin
[root@node1 mysql]# chown -R root .
//将属主重新改为root
[root@node1 mysql]# chkconfig --add mysqld
//将mysqld添加至服务列表
[root@node1 mysql]# service mysqld start
//启动mysqld服务
|
由于node1和node2上的mysqld服务为高可用服务,当一台服务器出现故障后,另一台mysql服务器会自动启动mysqld服务,所以应将mysqld服务关闭,且不让它开机自动启动,这一点非常重要。
1
2
|
[root@node1 ~]# service mysqld stop
[root@node1 ~]# chkconfig mysqld off
|
node1配置完成,node2的配置方法同node1,这里不再重复。
由于用户创建的数据都是存放在NFSServer上,所以在一台mysql服务器上创建的文件在另一台服务器上也应改能够看到,以实现数据同步,这里验证一下。
在节点node1上打开mysql服务并创建数据库,查看在节点node2上是否能够看到:
在节点node1上创建数据库db1:
在节点node2上查看db1是否已经存在:
数据库db1存在,说明数据库共享存储成功。
同样,在node2上创建数据库,在node1上也应该能够看到,方法同上。