corosync+heartbeat+mysql+nfs實現mysql高可用

簡單介紹

隨着互聯網絡應用的發展,大規模海量級數據存儲對於一個企業越來越重要,組織機構依賴於數據庫來運行各種重要的業務,幾小時甚至幾分鐘的宕機,都會造成不可估量的損失,因此保證數據庫的高可用是所有組織機構優先考慮的事情,對於想要在競爭中立於不敗之地的企業來說,構建高可用的數據存儲至關重要。

這裏提供了一種在中小型企業應用中數據庫搭建的廉價解決方案,在不購買高額的高性能的服務器前提下,利用現有的資源,進行整合配置以完成。用於爲企業提供數據庫的高效率、高安全、低故障的服務。總體說來,實現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地址,MySQL1IP地址爲172.16.100.11MySQL2主機的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:MySQL1MySQL2上實現雙機互信

在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 various programs
#that require network functionality will fail.
127.0.0.1localhost.localdomain localhost
172.16.100.11node1.sange.com   node1
172.16.100.12node2.sange.com   node2

在MySQL2上配置IP地址所對應的主機名和別名:

1
2
3
4
5
6
[root@node2 ~]#vim/etc/hosts
#Do not remove the following line, or various programs
#that require network functionality will fail.
127.0.0.1localhost.localdomain localhost
172.16.100.11node1.sange.com   node1
172.16.100.12node2.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 forthisdisk issetto 15665.
There isnothing wrong withthat, but thisislarger than 1024,
and could incertain 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/2FDISK)
Command (m forhelp): n      //新建一個磁盤
Command action
e   extended
p   primary partition (1-4)
e          //擴展分區
Selected partition 4
First cylinder (5359-15665, default5359):
Using defaultvalue 5359
Last cylinder or +size or +sizeM or +sizeK (5359-15665, default15665):
Using defaultvalue 15665
Command (m forhelp): n
First cylinder (5359-15665, default5359):
Using defaultvalue 5359
Last cylinder or +size or +sizeM or +sizeK (5359-15665, default15665): +20G        //大小爲20G
Command (m forhelp): P       // 顯示磁盤分區
Disk /dev/sda: 128.8GB, 128849018880bytes
255heads, 63sectors/track, 15665cylinders
Units = cylinders of 16065* 512= 8225280bytes
Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           11310439183Linux
/dev/sda2              145235419457158e  Linux LVM
/dev/sda3            52365358987997+  83Linux
/dev/sda4            53591566582790977+   5Extended
/dev/sda5            535977911954304183Linux
Command (m forhelp): T      //設定磁盤類型
Partition number (1-5): 5
Hex code (type L to list codes): 8e    //創建LVM時的專用格式
Changed system type of partition 5to 8e (Linux LVM)
Command (m forhelp): w   //保存新建的磁盤分區
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed witherror 16: Device or resource busy.
The kernel still uses the old table.
The newtable 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   100wz--n- 18.64G 18.64G
vg0    140wz--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        00
[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 306mysql
[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,這裏不再重複。


5:驗證NFS Server的共享存儲

由於用戶創建的數據都是存放在NFSServer上,所以在一臺mysql服務器上創建的文件在另一臺服務器上也應改能夠看到,以實現數據同步,這裏驗證一下。

在節點node1上打開mysql服務並創建數據庫,查看在節點node2上是否能夠看到:

在節點node1上創建數據庫db1:


在節點node2上查看db1是否已經存在:

數據庫db1存在,說明數據庫共享存儲成功。

同樣,在node2上創建數據庫,在node1上也應該能夠看到,方法同上。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章