生产环境drbd+heartbeat+mysql(mysql一主多从)部署安装
一、环境准备:
1.1 网卡及IP资源
名称 |
接口 |
IP |
用途 |
Master(主) |
eth0(自管) |
172.20.28.41 |
外网管理IP,用于WAN数据转发 |
eth1(受管) |
192.168.10.41 |
用于mysql服务间的心跳连接(直连)和数据同步 |
|
vip(绑定在eth0网卡上) |
10.1.6.41 |
用于提供对外mysql数据库服务VIP(漂移IP) |
|
Slave(备) |
eth0(自管) |
172.20.28.42 |
外网管理IP,用于WAN数据转发 |
eth1(受管) |
192.168.10.42 |
用于mysql服务间的心跳连接(直连) |
|
vip(绑定在eth0网卡上) |
10.1.6.42 |
用于提供对外mysql数据库服务VIP(漂移IP) |
小结:
1、在配置网卡的时候,需要明确各个网址的作用。
2、两台服务器eth1网卡配置参数
[root@i-e0zg6o7f network-scripts]# cat ifcfg-eth1 DEVICE=eth1 TYPE=Ethernet IPADDR=192.168.10.41 BOOTPROTO=static NETMASK=255.255.255.0 ONBOOT=yes NM_CONTROLLED=yes HWADDR=52:54:52:95:E6:AD |
[root@i-ylibhc7r network-scripts]# cat ifcfg-eth1 DEVICE=eth1 TYPE=Ethernet IPADDR=192.168.10.42 BOOTPROTO=static NETMASK=255.255.255.0 ONBOOT=yes NM_CONTROLLED=yes HWADDR=52:54:98:2F:B1:45 |
3、由于此处配置是在生产环境,路由是直连的,所以不需要配置eth1的路由。
[root@i-e0zg6o7f network-scripts]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 172.20.28.1 0.0.0.0 UG 0 0 0 eth0 172.20.28.0 0.0.0.0 255.255.255.0 U 1 0 0 eth0 192.168.10.0 0.0.0.0 255.255.255.0 U 1 0 0 eth1 |
[root@i-ylibhc7r network-scripts]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 172.20.28.1 0.0.0.0 UG 0 0 0 eth0 172.20.28.0 0.0.0.0 255.255.255.0 U 1 0 0 eth0 192.168.10.0 0.0.0.0 255.255.255.0 U 1 0 0 eth1 |
补充:如果是测试环境则需要手动添加路由:
[root@data-master network-scripts]# route add -host 192.168.10.42 dev eth1
[root@data-slave network-scripts]# route add -host 192.168.10.41 dev eth1
4、两台服务器上添加vip
[root@data-master ha.d]# ip addr add 10.1.6.41/24 dev eth0
[root@data-slave ha.d]# ip addr add 10.1.6.42/24 dev eth0
小结:详情请参考网址:http://www.jianshu.com/p/d9a0a4d82047
1.2 主机hosts及硬盘规划
[root@data-master ha.d]# cat /etc/hosts 192.168.10.41 data-master 192.168.10.42 data-slave |
[root@data-slave ha.d]# cat /etc/hosts 192.168.10.41 data-master 192.168.10.42 data-slave |
小结:
1、此处配置的IP是eth1网卡的IP,此网卡的作用是mysq服务器间的心跳连接和drbd数据同步。
2、检查两个节点是否通畅。
1.3 单主热备模式架构图
小结:此处借鉴了老男孩老师的架构图,特别感谢老师!
二、分别在两台服务器上部署安装heartbeat(快速安装文档)
2.1 下载安装
[root@data-master~]#wget http://mirrors.sohu.com/fedora-epel/6/x86_64/epel-release-6-8.noarch.rpm
[root@data-master~]#rpm -ivh epel-release-6-8.noarch.rpm
[root@data-slave ~]# yum install heartbeat -y
2.2 拷贝配置文件
[root@data-master ~]# cp /usr/share/doc/heartbeat-3.0.4/{ha.cf,authkeys,haresources} /etc/ha.d/
[root@data-master ~]# ll /etc/ha.d/
total 44
-rw-r--r-- 1 root root 645 Dec 1 10:21 authkeys
-rw-r--r-- 1 root root 10502 Dec 1 10:21 ha.cf
-rwxr-xr-x 1 root root 745 Dec 3 2013 harc
-rw-r--r-- 1 root root 5905 Dec 1 10:21 haresources
drwxr-xr-x 2 root root 4096 Dec 1 10:18 rc.d
-rw-r--r-- 1 root root 692 Dec 3 2013 README.config
drwxr-xr-x 2 root root 4096 Dec 1 10:18 resource.d
-rw-r--r-- 1 root root 2082 Mar 24 2017 shellfuncs
2.3 修改heartbeat配置文件(两台服务上的这三个文件全部要一样)
[root@data-master ha.d]# cat ha.cf
#the start by zhangjunchao
debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility local1
keepalive 2
deadtime 30
warntime 10
initdead 60
udpport 694
mcast eth0 225.0.0.1 694 1 0
auto_failback on
node data-master
node data-master
crm no
[root@data-master ha.d]# (echo -ne auth 1 "\n" 1 sha1 ; dd if=/dev/urandom bs=512 count=1 | openssl md5) >/etc/ha.d/authkeys
1+0 records in
1+0 records out
512 bytes (512 B) copied, 3.9232e-05 s, 13.1 MB/s
[root@data-master ha.d]# cat /etc/ha.d/authkeys
auth 1
1 sha1(stdin)= 54d87827a906472acc453f9b6f3d08d9
总结:删掉(stdin)= 这一部分。
[root@data-master ha.d]# chmod 600 authkeys
[root@data-slave ha.d]# cat /etc/ha.d/haresources
#zhangjunchao services
data-master IPaddr::10.1.6.41/24/eth0 #此处的IP是VIP,提供对外mysql服务的IP。
2.4 分别在两端启动heartbeat服务
[root@data-master ha.d]# /etc/init.d/heartbeat start
[root@data-master ha.d]# chkconfig heartbeat off #建议开机不要启动heartbeat,避免问题。
三、分别在两端部署安装drbd
3.1 分别在两台服务器上准备两块磁盘(/dev/sdb)
分区(两个去,一个是存储数据,一个是meta磁盘储存drbd状态信息的,不能格式化) |
Device Boot Start End Blocks Id System /dev/sdb1 1 1025 1049584 83 Linux /dev/sdb2 1026 10240 9436160 83 Linux |
刷新磁盘,通知内核 |
[root@data-master ~]# partx /dev/sdb # 1: 32- 2099199 ( 2099168 sectors, 1074 MB) # 2: 2099200- 20971519 ( 18872320 sectors, 9662 MB) # 3: 0- -1 ( 0 sectors, 0 MB) # 4: 0- -1 ( 0 sectors, 0 MB) |
[root@data-master ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
└─sda1 8:1 0 20G 0 part /
sdb 8:16 0 10G 0 disk
├─sdb1 8:17 0 1G 0 part
└─sdb2 8:18 0 9G 0 part
sdc 8:32 0 4G 0 disk [SWAP]
3.2 下载安装drbd的yum源
[root@data-master ~]# wget http://www.elrepo.org/elrepo-release-6-8.el6.elrepo.noarch.rpm
--2017-12-01 11:54:24-- http://www.elrepo.org/elrepo-release-6-8.el6.elrepo.noarch.rpm
Resolving www.elrepo.org... 69.195.83.87
Connecting to www.elrepo.org|69.195.83.87|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 7796 (7.6K) [application/x-rpm]
Saving to: “elrepo-release-6-8.el6.elrepo.noarch.rpm”
100%[===================================================================================================================================================>] 7,796 --.-K/s in 0s
2017-12-01 11:54:27 (540 MB/s) - “elrepo-release-6-8.el6.elrepo.noarch.rpm” saved [7796/7796]
[root@data-master ~]# rpm -ivh elrepo-release-6-8.el6.elrepo.noarch.rpm
Preparing... ########################################### [100%]
1:elrepo-release ########################################### [100%]
3.3 安装drbd软件
[root@data-master ~]# yum install drbd kmod-drbd84 -y
3.4 加载内核模块
[root@data-master ~]# modprobe drbd
[root@data-master ~]# lsmod | grep drbd
drbd 319501 0
lru_cache 8465 1 drbd
libcrc32c 1388 1 drbd
[root@data-master ~]# echo "modprobe drbd" >> /etc/rc.local #添加至开机启动
小结:如果当前系统的内核版本低于3.0,建议升级内核,升级方式详情参考我的文档。http://blog.csdn.net/m0_37814112/article/details/78675550
3.5 编辑drbd配置文件
[root@data-master drbd.d]# vi /etc/drbd.conf
global {
usage-count no;
}
common {
syncer {
rate 20M;
verify-alg crc32c;
}
}
resource data {
protocol C;
disk {
on-io-error detach;
}
on data-master {
device /dev/drbd0;
disk /dev/sdb2;
address 192.168.10.41:7788;
meta-disk /dev/sdb1[0];
}
on data-slave {
device /dev/drbd0;
disk /dev/sdb2;
address 192.168.10.42:7788;
meta-disk /dev/sdb1[0];
}
}
3.6 初始化drbd
[root@data-master drbd.d]# drbdadm create-md data
initializing activity log
NOT initializing bitmap
Writing meta data...
New drbd meta data block successfully created.
3.7 启动drbd
[root@data-master drbd.d]# drbdadm up data
[root@data-master drbd.d]# cat /proc/drbd
version: 8.4.5 (api:1/proto:86-101)
srcversion: E5B188AA2E7FBFC9F82CDB4
0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:9435904
[root@data-slave drbd.d]# drbdadm up data
[root@data-slave drbd.d]# cat /proc/drbd
version: 8.4.5 (api:1/proto:86-101)
srcversion: E5B188AA2E7FBFC9F82CDB4
0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:9435904
小结:出现上述,则表明启动成功,因为现在是无主的状态,所以两边都是从的状态。
3.8 设置主,同步数据到对端
[root@data-master drbd.d]# drbdadm -- --overwrite-data-of-peer primary data
[root@data-master drbd.d]# cat /proc/drbd
version: 8.4.5 (api:1/proto:86-101)
srcversion: E5B188AA2E7FBFC9F82CDB4
0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
ns:90620 nr:0 dw:0 dr:91284 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:9345540
[>....................] sync'ed: 1.0% (9124/9212)M
finish: 0:05:08 speed: 30,204 (30,204) K/sec
小结:
1、这一步操作,在主的一端设置,不需要在两端同时设置为主,那样会冲突导致drbd报错。
2、过几分钟在检查drbd的状态,因为两端同步是需要时间的。
3、drbd详细参数解释详情请参考我的文档drbd状态信息详解。
[root@data-slave drbd.d]# cat /proc/drbd
version: 8.4.5 (api:1/proto:86-101)
srcversion: E5B188AA2E7FBFC9F82CDB4
0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
ns:0 nr:9436160 dw:9436160 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
3.9 分别在两端创建一个data目录
补充说明:
1、这个data目录是放置数据库的目录
2、mysql用二进制安装。
[root@data-master ~]# mkdir /data
[root@data-slave ~]# mkdir /data
3.10 格式化drbd0(备节点不用格式化)
[root@data-master ~]# mkfs.ext4 /dev/drbd0
3.11 检查master端和slave端数据是否同步
Master:在主的节点上的/data目录创建多个文件
Slave:在备的节点上先停掉drbd服务:drbdadm down data #这个data是drbd.conf配置文件里面定义的data,资源名称
mount /dev/sdb2 /data
检查/data目录是否有相同多的文件
3.12 错误问题总结
a、脑裂解决方法:
[root@data-slave ~]# cat /proc/drbd
version: 8.4.5 (api:1/proto:86-101)
srcversion: E5B188AA2E7FBFC9F82CDB4
0: cs:WFconnected ro:Secondary/Unknown ds:UpToDate/DupToDate C r-----
ns:0 nr:44 dw:44 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
解决:
1、在备节点slave操作:
[root@data-slave ~]# modprobe drbd
[root@data-slave ~]# lsmod | grep drbd
drbd 319501 3
lru_cache 8465 1 drbd
libcrc32c 1388 1 drbd
[root@data-slave ~]# drbdadm secondary data
[root@data-slave ~]# drbdadm up data
[root@data-slave ~]# drbdadm disconnect data
[root@data-slave ~]# drbdadm -- --discard-my-data connect data
2、在主节点master上,通过cat /proc/drbd查看状态,如果不是WFConnection状态,就需要手动drbdadm connect data
b、无法卸载/data目录
[root@data-slave data]# umount /data
umount: /data: device is busy.
(In some cases useful info about processes that use
the device is found by lsof(8) or fuser(1))
解决:
[root@data-slave data]# fuser -v /data
USER PID ACCESS COMMAND
/data: root 22677 ..c.. bash
[root@data-slave data]# kill -9 22677
[root@data-slave ~]# umount /data
小结:通过杀pid的方式强行关闭。
四、主节点配合heartbeat调试drbd服务配置,同时拷贝一份到备节点
分别在两个节点先停掉heartbeat服务
[root@data-slave ~]# /etc/init.d/heartbeat stop
Stopping High-Availability services: Done.
[root@data-master resource.d]# cat /etc/ha.d/haresources
#zhangjunchao services
data-master IPaddr::10.1.6.41/24/eth0 drbddisk::data Filesystem::/dev/drbd0::/data::ext4
分别在两个节点启动heartbeat服务
[root@data-slave ~]# /etc/init.d/heartbeat start
Starting High-Availability services: INFO: Resource is stopped
Done.
查看drbd状态信息,看是否自动执行
/usr/lib/ocf/resource.d//heartbeat/IPaddr(IPaddr_10.1.6.41)[29139]: 2017/12/01_14:26:21 INFO: Success
ResourceManager(default)[29015]: 2017/12/01_14:26:21 info: Running /etc/ha.d/resource.d/drbddisk data start
/usr/lib/ocf/resource.d//heartbeat/Filesystem(Filesystem_/dev/drbd0)[29292]: 2017/12/01_14:26:21 INFO: Resource is stopped
ResourceManager(default)[29015]: 2017/12/01_14:26:21 info: Running /etc/ha.d/resource.d/Filesystem /dev/drbd0 /data ext4 start
Filesystem(Filesystem_/dev/drbd0)[29380]: 2017/12/01_14:26:21 INFO: Running start for /dev/drbd0 on /data
/usr/lib/ocf/resource.d//heartbeat/Filesystem(Filesystem_/dev/drbd0)[29372]: 2017/12/01_14:26:21 INFO: Success
Dec 01 14:26:21 data-master heartbeat: [28825]: info: remote resource transition completed.
小结:从上述状态信息查看分析heartbeat自动执行脚本。
停掉主节点的heartbeat服务,看备节点是否能自动接管
停掉前:
[root@data-master resource.d]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 20G 1.3G 18G 7% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
/dev/drbd0 8.8G 59M 8.3G 1% /data
停掉后:
[root@data-master resource.d]# /etc/init.d/heartbeat stop
Stopping High-Availability services: Done.
[root@data-master resource.d]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 20G 1.3G 18G 7% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
小结:这是发现/data目录已经卸载了。
查看备节点:
接管前:
[root@data-slave ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 20G 1.3G 18G 7% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
接管后
[root@data-slave ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 20G 1.3G 18G 7% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
/dev/drbd0 8.8G 59M 8.3G 1% /data
小结:这是发现备节点已经接管了drbd服务。
启动主节点的heartbeat服务,看是否能从备节点处重新接管drbd服务
[root@data-master resource.d]# /etc/init.d/heartbeat start
Starting High-Availability services: INFO: Resource is stopped
Done.
[root@data-master resource.d]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 20G 1.3G 18G 7% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
/dev/drbd0 8.8G 59M 8.3G 1% /data
小结:主节点从备节点接管服务,测试正常。
五、安装mysql服务
172.20.28.41 |
Master(主节点) |
Mysql(active mysql-master) |
172.20.28.42 |
Slave(备用节点) |
Mysql(inactive mysql-master) |
172.20.28.43 |
从数据库(主从复制的从库) |
Mysql(active-salve) |
补充说明:
1、mysql服务建议用二进制包安装,且放在同步目录/data目录下。
2、由于heartbeat和drbd都分别状态172.20.28.41和172.20.28.42这两台服务器上,为了实现mysql服务的高可用,在两个节点上(主机点和备用节点)分别安装mysql服务。
3、当172.20.28.41的heartbeat服务停止,备用heartbeat节点接管vip,为了实现mysql服务备用节点的mysql主库和172.20.28.43上的从库的数据一致,在做主从同步的时候,在主节点的mysql上,授权复制用户,授权的IP为VIP,这样才能保证,当主节点挂了的时候,备用节点接管时,能保证备用节点的数据和从库的数据一致。
4、172.20.28.41和172.20.28.43这两台服务器做主从同步,在主节点上授权复制用户,命令如下所示:
mysql> grant replication slave on *.* to 'tomcat'@'10.1.6.%' identified by 'tomcat'; #这里的10.1.6.%是vip的网段
mysql> flush privileges;
5、mysql二进制安装及主从复制的过程,在这里我就记录了,详情可参考我的文档http://blog.csdn.net/m0_37814112/article/details/78606593
六、测试主节点和备节点的高可用切换
1、先分别停掉主节点和备节点的heartbeat服务。 /etc/init.d/heartbeat stop
2、修改/etc/ha.d/haresources文件,具体修改内容如下:
[root@data-master ~]# cat /etc/ha.d/haresources
#zhangjunchao services
data-master IPaddr::10.1.6.41/24/eth0 drbddisk::data Filesystem::/dev/drbd0::/data::ext4mysqld #这里的mysqld是脚本
3、将mysqld脚本拷贝至/etc/init.d/下或者/etc/ha.d/resource.d/目录下,同时给予执行权限。
4、在主节点端停止heartbeat服务,在备节点上查看:1、vip是漂移到备节点2、/data目录是否挂载到备节点;3、cat /proc/drbd备节点的信息是否正常;4、mysql服务是否正常启动
七、当主节点宕机,备节点接管mysql服务,测试备节点的mysql服务是否同从库的数据一致
补充说明:简单的说,当mysql-active这台挂了,mysql-inactive接管mysql服务,与mysql-slave数据是否同步。
1、重点说明,要实现备节点mysql服务和从库数据一致,前提是主节点的vip要漂移过来。
2、要测试数据是否一致,在备节点上创建文件,查看从库是否有这几个文件,如果有,则数据一致。
八、总结
1、此次文档的编写,首先非常感谢老男孩老师,感谢老师的视频,讲的非常好。
2、重在思想,重在总结,重在态度,重在方法,这也将是我运维之路前行的目标。
3、在生产环境部署,要先规划好服务器、IP资源分配、软件版本及部署节点,做到心中有数。
4、Mysql高可用的方案不仅仅是这个,还有很多,后面我会根据的自己的总结,慢慢分享。