简单介绍

随着互联网络应用的发展,大规模海量级数据存储对于一个企业越来越重要,组织机构依赖于数据库来运行各种重要的业务,几小时甚至几分钟的宕机,都会造成不可估量的损失,因此保证数据库的高可用是所有组织机构优先考虑的事情,对于想要在竞争中立于不败之地的企业来说,构建高可用的数据存储至关重要。

这里提供了一种在中小型企业应用中数据库搭建的廉价解决方案,在不购买高额的高性能的服务器前提下,利用现有的资源,进行整合配置以完成。用于为企业提供数据库的高效率、高安全、低故障的服务。总体说来,实现MySQL的高可用集群,在后台创建多个MySQL服务器节点,当某一个节点遇到故障后,能在最短时间内定位,并自动切换到别的正常节点上,从而不影响用户的使用,也使企业自己内部数据存取和修改等操作能够正常的进行,将损失降到最低,也给后期的维护提供了很大方便。

至于数据库前端的APP这里就不再介绍了。

通过创建一个NFS服务器,来实现数据的共享存储。用户可以用同一个IP地址来访问数据库,这个IP地址被称为VIP,多个MySQL节点利用这个VIP向用户提供服务,用户自己并不知道是具体的哪一个MySQL节点提供的服务,各个MySQL节点将用户操作所产生的数据存放到NFS服务器上。当其中的一个MySQL节点出现故障后,别的节点会使自己成为主节点,并抢占VIP,且将NFS服务器的共享目录挂载至自己的某个目录下,继续向用户提供服务,而这个过程对于用户来说是透明的,从而实现MySQL的高可用功能。

233733151.png%5C%22

  用户远程访问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

2:在MySQL1和MySQL2上实现双机互信

在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


3:在NFS Server上通过建立逻辑卷共享数据

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 –j –L MYDATA /dev/myvg/mydata
[root@NFS ~]# mkdir /mydata
[root@NFS ~]#vim /etc/fstab   //添加如下内容
LABEL=MYDATA            /mydata                 ext3    defaults         0 0
[root@NFS ~]#mount –a   //重新挂载一下


将/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/

试一下能否在共享目录中创建文件:

000153828.jpg%5C%22

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,这里不再重复。


5:验证NFS Server的共享存储

由于用户创建的数据都是存放在NFSServer上,所以在一台mysql服务器上创建的文件在另一台服务器上也应改能够看到,以实现数据同步,这里验证一下。

在节点node1上打开mysql服务并创建数据库,查看在节点node2上是否能够看到:

在节点node1上创建数据库db1:

001029537.jpg%5C%22


在节点node2上查看db1是否已经存在:

001057370.jpg%5C%22

数据库db1存在,说明数据库共享存储成功。

同样,在node2上创建数据库,在node1上也应该能够看到,方法同上。