基于heartbeat v1、V2实现mysql的高可用

  1. 云栖社区>
  2. 博客>
  3. 正文

基于heartbeat v1、V2实现mysql的高可用

余二五 2017-11-15 16:46:00 浏览1060
展开阅读全文

一、heartbeat v1简介

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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
heartbeat v1的架构是:heartbeat + haresource 来实现高可用的。heartbeat 
作为message layer层,haresource作为CRM管理资源,RA可以有LSB,OSF,heartbeat legacy提供。
 
######################################1、Heartbeat的控制信息:
“心跳”信息: (也称为状态信息)仅150 bytes大小的广播、组播或多播数据包。可为以每个节点配
置其向其它节点通报“心跳”信息的频率,以及其它节点上的heartbeat进程为了确认主节点出节点出
现了运行等错误之前的等待时间。 
 
集群变动事务(transition)信息:ip-request和ip-request-rest是相对较常见的两种集群变动信息
,它们在节点间需要进行资源迁移时为不同节点上heartbeat进程间会话传递信息。比如,当修复了主
节点并且使其重新“上线”后,主节点会使用ip-request要求备用节点释放其此前从因主节点故障而
从主节点那里接管的资源。此时,备用节点则关闭服务并使用ip-request-resp通知主节点其已经不再
占用此前接管的资源。主接点收到ip-request-resp后就会重新启动服务。 
 
重传请求:在某集群节点发现其从其它节点接收到的heartbeat控制信息“失序”(heartbeat进程使
用序列号来确保数据包在传输过程中没有被丢弃或
出现错误)时,会要求对方重新传送此控制信息。 Heartbeat一般每一秒发送一次重传请求,以避免洪泛。 
 
上面三种控制信息均基于UDP协议进行传送,可以在/etc/ha.d/ha.cf中指定其使用的UDP端口或者多播
地址(使用以太网连接的情况下)。 
 
此外,除了使用“序列号/确认”机制来确保控制信息的可靠传输外,Heartbeat还会使用MD5或SHA1为
每个数据包进行签名以确保传输中的控制信息的安全性。
 
######################################2、Heartbeat的配置文件:
/etc/ha.d/ha.cf  定义位于不同节点上的heartbeat进程间如何进行通信;
/etc/ha.d/haresources  定义对某个资源来说哪个服务器是主节点,
      以及哪个节点应该拥有客户端访问资源时的目标IP地址。
/etc/ha.d/authkeys 定义Heartbeat包在通信过程中如何进行加密。
 
当ha.cf或authkeys文件发生改变时,需要重新加载它们就可以使用之生效;
而如果haresource文件发生了改变,则只能重启heartbeat服务方可使之生效。
 
尽管Heartbeat并不要求主从节点间进行时钟同步,但它们彼此间的时间差距不能超过1分钟,
 否则一些配置为高可用的服务可能会出异常。
 
Heartbeat当前也不监控其所控制的资源的状态,比如它们是否正在运行,是否运行良好以
及是否可供客户端访问等。要想监控这些资源,要使用额外的Mon软件包来实现。
 
######################################3、ha.cf配置文件部分参数详解:
autojoin    none    #集群中的节点不会自动加入
logfile /var/log/ha-log    #指名heartbaet的日志存放位置
keepalive 2    #指定心跳使用间隔时间为2秒(即每两秒钟在eth1上发送一次广播)
deadtime 30    #指定备用节点在30秒内没有收到主节点的心跳信号后,则立即接管主节点的服
                务资源
warntime 10    #指定心跳延迟的时间为十秒。当10秒钟内备份节点不能接收到主节点的心跳
          信号时,就会往日志中写入一个警告日志,但此时不会切换服务
initdead 120   #在某些系统上,系统启动或重启之后需要经过一段时间网络才能正常工作,
         该选项用于解决这种情况产生的时间间隔。取值至少为deadtime的两倍。
udpport 694    #设置广播通信使用的端口,694为默认使用的端口号。
baud    19200   #设置串行通信的波特率       
#bcast   eth0    # Linux  指明心跳使用以太网广播方式,并且是在eth0接口上进行广播。
#mcast eth0 225.0.0.1 694 1 0  #采用网卡eth0的Udp多播来组织心跳,一般在备用节点不止一台
时使用。Bcast、ucast和mcast分别代表广播、单播和多播,是组织心跳的三种方式,任选其一即可。
#ucast eth0 192.168.1.2   #采用网卡eth0的udp单播来组织心跳,后面跟的IP地址应为双机对方的IP
 地址
auto_failback on   #用来定义当主节点恢复后,是否将服务自动切回,heartbeat的两台主机
  分别为主节点和备份节点。主节点在正常情况下占用资源并运行所有的服务,遇到故障时把资源交
  给备份节点并由备份节点运行服务。在该选项设为on的情况下,一旦主节点恢复运行,则自动获取
  资源并取代备份节点,如果该选项设置为off,那么当主节点恢复后,将变为备份节点,而原来的备
  份节点成为主节点
#stonith baytech /etc/ha.d/conf/stonith.baytech   # stonith的主要作用是使出现问题的节点从集
  环境中脱离,进而释放集群资源,避免两个节点争用一个资源的情形发生。保证共享数据的安全性
  和完整性。
#watchdog /dev/watchdog    #该选项是可选配置,是通过Heartbeat来监控系统的运行状态。使用该特
   性,需要在内核中载入"softdog"内核模块,用来生成实际的设备文件,如果系统中没有这个内核
   模块,就需要指定此模块,重新编译内核。编译完成输入"insmod softdog"加载该模块。然后输入
   "grep misc /proc/devices"(应为10),输入"cat /proc/misc |grep watchdog"(应为130)。最后
   ,生成设备文件:"mknod /dev/watchdog c 10 130" 。即可使用此功能
node node2.example.com  #主节点主机名,可以通过命令“uname –n”查看。
node node3.example.com  #备用节点主机名
ping 172.16.0.1    #选择ping的节点,ping 节点选择的越好,HA集群就越强壮,可以选择固定的路由
  器作为ping节点,但是最好不要选择集群中的成员作为ping节点,ping节点仅仅用来测试网络连接
#ping_group group1 192.168.12.120 192.168.12.23  #类似于ping  ping一组ip地址
apiauth pingd  gid=haclient uid=hacluster
respawn hacluster /usr/local/ha/lib/heartbeat/pingd -m 100 -d 5s 
  #该选项是可选配置,列出与heartbeat一起启动和关闭的进程,该进程一般是和heartbeat集成的插
  件,这些进程遇到故障可以自动重新启动。最常用的进程是pingd,此进程用于检测和监控网卡
  状态,需要配合ping语句指定的ping node来检测网络的连通性。其中hacluster表示启动pingd
  进程的身份。
 
#下面的配置是关键,也就是激活crm管理,开始使用v2 style格式
# crm respawn   
#注意,还可以使用crm yes的写法,但这样写的话,如果后面的cib.xml配置有问题
#会导致heartbeat直接重启该服务器,所以,测试时建议使用respawn的写法
 
#下面是对传输的数据进行压缩,是可选项
compression     bz2
compression_threshold 2
 
 
####################################4、haresources配置文件介绍
主从节点上的/etc/ra.d/raresource文件必须完全相同。文件每行通常包含以下组成部分:
1、服务器名字:指正常情况下资源运行的那个节点(即主节点),后跟一个空格或tab;
  这里指定的名字必须跟某个节点上的命令"uname -n"的返回值相同;
2、IP别名(即额外的IP地址,可选):在启动资源之前添加至系统的附加IP地址,
  后跟空格或tab;IP地址后面通常会跟一个子网掩码和广播地址,彼此间用“/”隔开;
3、资源脚本:即用来启动或停止资源的脚本,位于/etc/init.d/或/etc/ha.d/resourcd.d目录中;
  如果需要传递参数给资源脚本,脚本和参数之间需要用两个冒号分隔,多个参数时彼此间也需要用两个冒号分隔;如果有
多个资源脚本,彼此间也需要使用空格隔开;
 
格式如下:
primary-server [IPaddress[/mask/interface/broadcast]]  resource1[::arg1::arg2]  \
resource2[::arg1::arg2]
  
例如:
node2.example.com 172.16.10.20/16/eth0/172.16.255.255 \
Filesystem::172.16.10.9:/mysqldata::/var/lib/mysql::nfs mysqld
 
######################################5、authkeys配置文件介绍
auth 1  # 指明认证类型
1 md5 6c781b5034b1f6b9379b # 指明对应的认证类型和随机字符串
 
 
######################################6、补充资料:组播IP地址
组播IP地址用于标识一个IP组播组。IANA(internet assigned number authority)把D类地址
  空间分配给IP组播,其范围是从224.0.0.0到239.255.255.255。如下图所示(二进制表示),
  IP组播地址前四位均为1110八位组⑴ 八位组⑵ 八位组⑶ 八位组⑷1110
   
XXXX XXXXXXXX XXXXXXXX XXXXXXXX组播组可以是永久的也可以是临时的。组播组地址中,
  有一部分由官方分配的,称为永久组播组。永久组播组保持不变的是它的ip地址,组中的成
  员构成可以发生变化。永久组播组中成员的数量都可以是任意的,甚至可以为零。那些没有
  保留下来供永久组播组使用的ip组播地址,可以被临时组播组利用。
224.0.0.0~224.0.0.255为预留的组播地址(永久组地址),地址224.0.0.0保留不做分配,其它地址
  供路由协议使用。
224.0.1.0~238.255.255.255为用户可用的组播地址(临时组地址),全网范围内有效。
239.0.0.0~239.255.255.255为本地管理组播地址,仅在特定的本地范围内有效。常用的预留组播地
  址列表如下:
224.0.0.0 基准地址(保留)
224.0.0.1 所有主机的地址
224.0.0.2 所有组播路由器的地址
224.0.0.3 不分配
224.0.0.4dvmrp(Distance Vector Multicast Routing Protocol,距离矢量组播路由协议)路由器
224.0.0.5 ospf(Open Shortest Path First,开放最短路径优先)路由器
224.0.0.6 ospf dr(Designated Router,指定路由器)
224.0.0.7 st (Shared Tree,共享树)路由器
224.0.0.8 st主机
224.0.0.9 rip-2路由器
224.0.0.10 Eigrp(Enhanced Interior Gateway Routing Protocol,增强网关内部路由线路协议)路
   由器 224.0.0.11 活动代理
224.0.0.12 dhcp服务器/中继代理
224.0.0.13 所有pim (Protocol Independent Multicast,协议无关组播)路由器
224.0.0.14 rsvp (Resource Reservation Protocol,资源预留协议)封装
224.0.0.15 所有cbt 路由器
224.0.0.16 指定sbm(Subnetwork Bandwidth Management,子网带宽管理)
224.0.0.17 所有sbms
224.0.0.18 vrrp(Virtual Router Redundancy Protocol,虚拟路由器冗余协议)
239.255.255.255 SSDP协议使用

二、heartbeat v1 + nfs 实现对mysql的高可用

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
43
44
45
46
47
#########################在172.16.10.9上:
#################提供nfs服务
一、安装nfs管理工具
yum install nfs-utils -y
 
二、创建共享目录并共享
mkdir /mysqldata
# vim /etc/exports 添加以下内容:
/mysqldata/ 172.16.0.0/16(rw,no_root_squash)
 
setfacl -m u:26:rwx /mysqldata (uid=26是使用rpm方式安装的mysql时的mysql用户的uid)
 
# 注意:上面的 no_root_squash 选项是为了在安装 mysql 时方便,安装完成后,应去掉此选项。
 
三、启动nfs服务
/etc/init.d/nfs start
 
############################################配置主节点和备节点
第一步:设置主机名
#########################在172.16.10.22上:
# vim /etc/sysconfig/netwoek中的HOSTNAME:
HOSTNAME=node2.example.com
#########################在172.16.10.33上:
# vim /etc/sysconfig/netwoek中的HOSTNAME:
HOSTNAME=node3.example.com
 
第二步:设置主机名解析
#########################在172.16.10.22上:
# vim /etc/hosts文件,添加:
172.16.10.22 node2.example.com node2
172.16.10.33 node3.example.com node3
#########################在172.16.10.33上:
# vim /etc/hosts文件,添加:
172.16.10.22 node2.example.com node2
172.16.10.33 node3.example.com node3
 
第三步:实现 node2 和 node3 之间基于ssh秘钥认证
#########################在172.16.10.22上:
ssh-keygen -t rsa -P ''
ssh-copy-id -i ~/.ssh/id_rsa.pub node3.example.com
#########################在172.16.10.33上:
ssh-keygen -t rsa -P ''
ssh-copy-id -i ~/.ssh/id_rsa.pub node2.example.com
 
第四步:node2 和 node3 之间实现时间同步
1、可以使用相同的时间服务器来同步时间
2、可以手动设置是时间同步

验证以上配置结果:

2

3

上面的配置正确的话,可以继续进行如下配置:

1
2
3
4
5
6
7
8
9
10
11
第一步:安装 mysql 服务,并配置
#########################在172.16.10.22上:
yum install mysql mysql-server
mount -t nfs 172.16.10.9:/mysqldata /var/lib/mysql
chown -R mysql.mysql /var/lib/mysql
# 启动 mysql 并初始化 mysql,设置用户密码等
/etc/init.d/mysqld start
#########################在172.16.10.33上:
yum install mysql mysql-server
mount -t nfs 172.16.10.9:/mysqldata /var/lib/mysql
/etc/init.d/mysqld start

验证以上配置结果:

4

5

注意:以上结果在测试时,mysqld服务只能在一个节点上启动。当然,这里需要授权给远程用户172.16.10.20的权限。完成这些配置后,可以继续进行以下配置。

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
第一步:安装heartbeat之前的工作
#########################在172.16.10.22,172.16.10.33上:
mysql>GRANT ALL ON *.* TO root@'172.16.10.20' IDENTIFIED BY 'guoting';
/etc/init.d/mysqld stop
umount /var/lib/mysql
chkconfig mysqld off
 
第二步:安装heartbeat v1版本软件
#########################在172.16.10.22,172.16.10.33上:
yum install perl-TimeDate net-snmp-libs libnet PyXML    # 注意:libnet是在epel仓库中的,需要实现配置好。也可以手动编译,下载地址:http://search.cpan.org/dist/libnet/
rpm -ivh heartbeat-2.1.4-12.el6.x86_64.rpm heartbeat-pils-2.1.4-12.el6.x86_64.rpm heartbeat-stonith-2.1.4-12.el6.x86_64.rpm # 这是由heartbeat 自己制作的rpm包
 
第三步:配置heartbeat
#########################在172.16.10.22
cp /usr/share/doc/heartbeat-2.1.4/{ha.cf,haresources,authkeys} /etc/ha.d/
 
# vim /etc/ha.d/ha.cf 修改以下内容:
mcast eth0 226.10.10.10 694 1 0 
auto_failback on
node    node2.example.com
node    node3.example.com
ping 172.16.0.1
 
# vim /etc/ha.d/haresources 添加以下内容:
node2.example.com 172.16.10.20/16/eth0/172.16.255.255  \
Filesystem::172.16.10.9:/mysqldata::/var/lib/mysql::nfs mysqld
 
# vim /etc/ha.d/authkeys 添加以下内容:
auth 1
1 md5 6c781b5034b1f6b9379b
 
chmod 600 /etc/ha.d/authkeys
 
#########################在172.16.10.33
scp -p node2.example.com:/etc/ha.d/{ha.cf,haresources,authkeys} /etc/ha.d
 
第四步:启动服务
#########################在172.16.10.22
/etc/init.d/heartbeat start;ssh node3 '/etc/init.d/heartbeat start'

验证以上结果:

6

7

8

此时模拟,主节点出现故障:

9

此时,从节点可以正常接管资源,用户可以正常访问。

10

11

此时,如果主节点重新上线,主节点会接管现有资源。(auto_failback on的缘由)

wKiom1QQQC_R3kC9AAF_oz5Hl1k926.jpg

三、heartbeat v2 + nfs 实现对mysql的高可用

实验拓扑图和上面一致。

1
2
3
4
5
6
7
8
9
10
11
12
第一步:修改ha.cf配置文件
#########################在172.16.10.22上:
crm on
scp /etc/ha.d/ha.cf node3:/etc/ha.d/
 
第二步:修改ha.cf配置文件
#########################在172.16.10.22、172.16.10.33上:
rpm -ivh rpm -ivh heartbeat2/heartbeat-gui-2.1.4-12.el6.x86_64.rpm 
 
第三步:启动heartbeat服务
#########################在172.16.10.22、172.16.10.33上:
/etc/init.d/heartbeat start

配置完成后,可以验证结果:

wKioL1QR0CeA7uGBAAGGilyztW4405.jpg

以上结果正确后,可以继续以下实验:

1
2
3
4
5
6
第一步:在主节点上设置ha_gui图形化管理接口的密码
# 默认登陆账号是 hacluster 本地账号
passwd hacluster
 
第二步:启动图形化接口工具配置
hb_gui &

图形化管理接口界面:

wKioL1QR2VuBLK00AAFomHfkDIw015.jpg

添加组资源:

wKiom1QR2UzCJgpIAAEWldTqZPE630.jpg

wKioL1QR2VzyIcR2AAEYvTcYeeM701.jpg

在组中添加vip,storage,mysqld资源:

wKiom1QR2U3D8iJ0AAK7YXXpx-Y781.jpg

wKioL1QR2V6CQrO2AAJOZPYlh1M207.jpg

wKiom1QR2U-SzutlAAKyEz-gnjk092.jpg

wKiom1QR2VCgjzExAAHbYaVZfHg060.jpg

客户端测试:

wKioL1QR2WDzipLVAAGhqapKKkE164.jpg

实现资源迁移:

wKiom1QR2VKQ8xpTAAG_B7odRo8833.jpg

wKioL1QR2WKRU_X9AAEPsjiuDmo656.jpg

wKiom1QR2VOyE0vIAAF0-RqXVf8395.jpg

wKioL1QR2WOyFKCFAAFmRYGIU1Y333.jpg

当然,这里也可以使用资源约束来定义资源的粘性,启动顺序等。

至此,配置已全部完成。


以上内容是自己对知识的理解,如有偏差,欢迎指正。










本文转自 羊木狼 51CTO博客,原文链接:http://blog.51cto.com/guoting/1550818,如需转载请自行联系原作者

网友评论

登录后评论
0/500
评论
余二五
+ 关注