介绍
MySQL一主多从,可以保证数据库集群高可用,由于是多从,所以挂掉一个从库对集群没影响;如果挂了一个主库我们可以把从库转换成主库,但是由于网络延迟问题主从角色切换会造成数据丢失,为了解决这个问题,解决主机单节点运行使用heartbeat做主节点高可用,主为了保证2个主节点数据同步可以使用drbd做主节点数据同步。
多主可以使用lvs来实现,如果是多主多从需要Mysql+DRBD+heartbeat来实现,架构如下(拷贝老男孩的一张架构图):
注意事项:
1.db-1-2热备主,跟db-1-1通过heartbeat做高可用,brdb做数据同步;
2.正常情况下,db-1-1对外提供写,从对外提供读;
3.mysql slave可以做一个lb,通过vip跟db-1-1做数据同步;
4.web server提供读写分离机制,读分发到mysql slave,写分发到db-1-1;
5.db-1-1、db-1-2数据同步使用专有链路,heartbeat也必须使用专有链路,也可以使用串口线来完成,不建议使用同一链路。
db-1-1故障之后,有db-1-2接管vip及数据库资源;
mysql slave由于是使用vip跟主库同步,所以故障发生之后可以自动跟db-1-2做数据同步;
部署
Mysql支持多实例,drbd也支持多分区同步。如果节点流量比较大可以使用网卡绑定。
我们可以把mysql数据库和数据文件创建在/data目录,这样两个主节点都可以同步共享。
网卡及地址规划:
主库
node1:
eth0 10.37.2.100 //管理地址
eth1 192.168.52.106//心跳线
vip 10.37.2.240 //vip
node2:
eth0 10.37.2.111
eth1 192.168.52.103
vip 10.37.2.241
从库
slave1
eth0 10.37.2.160
eth1 192.168.52.160
slave2
eth0 10.37.2.170
eth1 192.168.52.170
主库每台机器至少两块硬盘,容量大小一致。
两台主库安装drbd和heartbeat,安装步骤及配置请参考前三个博客。
heartbeat管理drbd
安装完成之后,heartbeat我们还需要做一个配置,由heartbeat管理drbd。
两个主节点创建/data目录
mkdir -p /data
主节点格式化drbd0
mkfs -t ext3 /dev/drbd0
主节点挂载
mount /dev/drbd0 /data
heartbeat禁止系统自启动
[root@node1 data]# chkconfig heartbeat off
vi /etc/ha.d/haresources (注意不要换行,两个主节点都需要配置)
##heartbeat drbd配置
node1 IPaddr::10.37.2.240/24/eth0 drbddisk::data Filesystem::/dev/drbd0::/data::ext3
##把drbd0设备以ext3方式挂载到/data 上。
##heartbeat nfs 配置
node1 IPaddr::10.37.2.240/24/eth0 drbddisk::data Filesystem::/dev/drbd0::/data::ext3 rsdata
启动heartbeat,查看vip和drbd是否正常启动.
[root@node1 /]# /etc/init.d/heartbeat start
Starting High-Availability services: INFO: Resource is stopped
INFO: Resource is stopped
Done.
[root@node1 data]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 00:0c:29:50:f0:77 brd ff:ff:ff:ff:ff:ff
inet 10.37.2.100/24 brd 10.37.2.255 scope global eth0
inet 10.37.2.240/24 brd 10.37.2.255 scope global secondary eth0
inet6 fe80::20c:29ff:fe50:f077/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 00:0c:29:50:f0:81 brd ff:ff:ff:ff:ff:ff
inet 192.168.52.100/24 brd 192.168.52.255 scope global eth1
inet6 fe80::20c:29ff:fe50:f081/64 scope link
valid_lft forever preferred_lft forever
[root@node1 data]# cat /proc/drbd
version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 74402fecf24da8e5438171ee8c19e28627e1c98a build by root@node1, 2017-08-30 11:34:17
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:12 nr:8 dw:172 dr:8549339 al:3 bm:526 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
[root@node1 data]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_ams-lv_root
36G 5.1G 29G 15% /
tmpfs 1.6G 224K 1.6G 1% /dev/shm
/dev/sda1 477M 32M 420M 8% /boot
/dev/sr0 4.4G 4.4G 0 100% /media/CentOS_6.6_Final
/dev/sr0 4.4G 4.4G 0 100% /mnt
/dev/drbd0 15G 166M 14G 2% /data
heartbeat启动日志:
ep 01 11:31:27 node1 heartbeat: [24937]: info: Pacemaker support: false
Sep 01 11:31:27 node1 heartbeat: [24937]: WARN: Logging daemon is disabled --enabling logging daemon is recommended
Sep 01 11:31:27 node1 heartbeat: [24937]: info: **************************
Sep 01 11:31:27 node1 heartbeat: [24937]: info: Configuration validated. Starting heartbeat 3.0.4
Sep 01 11:31:27 node1 heartbeat: [24938]: info: heartbeat: version 3.0.4
Sep 01 11:31:27 node1 heartbeat: [24938]: info: Heartbeat generation: 1503900466
Sep 01 11:31:27 node1 heartbeat: [24938]: info: glib: UDP Broadcast heartbeat started on port 694 (694) interface eth1
Sep 01 11:31:27 node1 heartbeat: [24938]: info: glib: UDP Broadcast heartbeat closed on port 694 interface eth1 - Status: 1
Sep 01 11:31:27 node1 heartbeat: [24938]: info: glib: ucast: write socket priority set to IPTOS_LOWDELAY on eth0
Sep 01 11:31:27 node1 heartbeat: [24938]: info: glib: ucast: bound send socket to device: eth0
Sep 01 11:31:27 node1 heartbeat: [24938]: info: glib: ucast: set SO_REUSEPORT(w)
Sep 01 11:31:27 node1 heartbeat: [24938]: info: glib: ucast: bound receive socket to device: eth0
Sep 01 11:31:27 node1 heartbeat: [24938]: info: glib: ucast: set SO_REUSEPORT(w)
Sep 01 11:31:27 node1 heartbeat: [24938]: info: glib: ucast: started on port 694 interface eth0 to 192.168.52.103
Sep 01 11:31:27 node1 heartbeat: [24938]: info: glib: ping heartbeat started.
Sep 01 11:31:28 node1 heartbeat: [24938]: info: G_main_add_TriggerHandler: Added signal manual handler
Sep 01 11:31:28 node1 heartbeat: [24938]: info: G_main_add_TriggerHandler: Added signal manual handler
Sep 01 11:31:28 node1 heartbeat: [24938]: info: G_main_add_SignalHandler: Added signal handler for signal 17
Sep 01 11:31:28 node1 heartbeat: [24938]: info: Local status now set to: 'up'
Sep 01 11:31:28 node1 heartbeat: [24938]: info: Link node1:eth1 up.
Sep 01 11:32:26 node1 heartbeat: [24938]: info: Link node2:eth1 up.
Sep 01 11:32:26 node1 heartbeat: [24938]: info: Status update for node node2: status up
harc(default)[24951]: 2017/09/01_11:32:26 info: Running /etc/ha.d//rc.d/status status
Sep 01 11:33:28 node1 heartbeat: [24938]: WARN: node 192.168.52.103: is dead
harc(default)[24971]: 2017/09/01_11:33:28 info: Running /etc/ha.d//rc.d/status status
Sep 01 11:33:29 node1 heartbeat: [24938]: info: Comm_now_up(): updating status to active
Sep 01 11:33:29 node1 heartbeat: [24938]: info: Local status now set to: 'active'
Sep 01 11:34:27 node1 heartbeat: [24938]: info: Status update for node node2: status active
harc(default)[25001]: 2017/09/01_11:34:27 info: Running /etc/ha.d//rc.d/status status
Sep 01 11:34:37 node1 heartbeat: [24938]: info: remote resource transition completed.
Sep 01 11:34:37 node1 heartbeat: [24938]: info: remote resource transition completed.
Sep 01 11:34:37 node1 heartbeat: [24938]: info: Initial resource acquisition complete (T_RESOURCES(us))
/usr/lib/ocf/resource.d//heartbeat/IPaddr(IPaddr_10.37.2.240)[25055]: 2017/09/01_11:34:37 INFO: Resource is stopped
Sep 01 11:34:37 node1 heartbeat: [25019]: info: Local Resource acquisition completed.
harc(default)[25136]: 2017/09/01_11:34:37 info: Running /etc/ha.d//rc.d/ip-request-resp ip-request-resp
ip-request-resp(default)[25136]: 2017/09/01_11:34:37 received ip-request-resp IPaddr::10.37.2.240/24/eth0 OK yes
ResourceManager(default)[25159]: 2017/09/01_11:34:37 info: Acquiring resource group: node1 IPaddr::10.37.2.240/24/eth0 drbddisk::data Filesystem::/dev/drbd0::/data::ext3
/usr/lib/ocf/resource.d//heartbeat/IPaddr(IPaddr_10.37.2<