转自:晓叹星沉 https://my.oschina.net/blueSky4Java/blog/1572905mysql
摘要: 随着项目的发展,为了提升程序的性能,数据库层面或多或少的会用到HA、读写分离、集群等功能,在选型时能够考虑使用现成的云服务,或者一些高可用软件,亦或是利用一些开源软件实现上述功能。这次将针对上述功能分篇幅进行整理,内容涉及HA、读写分离、集群,以期使用时达到快速部署之效果。web
Keepalived的做用是检测服务器的状态,若是有一台web服务器宕机,或工做出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除。其使用 VRRP(Virtual Router Redundancy Protocol)虚拟路由冗余协议,能够经过在一个路由器组(一个VRRP组)之间共享一个虚拟IP(VIP), 即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个MASTER和多个BACKUP 。当master宕掉后, 根据VRRP的优先级来选举一个BACKUP当MASTER,及时将业务切换到其它设备,从而保持通信的连续性和可靠性 。sql
Mysql HA的实现原理(此处以两台为例),两台Mysql主主复制,使数据时刻保持一致,同时使用两个keepalived监听各自机器上的Mysql,当Mysql服务停掉后,执行脚本关掉keepalived服务,由另外一台机器的keepalived接替。数据库
实现此功能须要两个步骤:服务器
环境信息:网络
master:192.168.102.129(CentOS6.8,hostname为master)oop
slave:192.168.102.130(CentOS6.8,hostname为salve)性能
VIP:192.168.102.128测试
(1)修改mysql配置文件,开启二进制文件.net
master的my.cnf
[mysqld] server_id = 1 #服务id,保证两台mysql惟一,不重复便可 log-bin = mysql-bin #开启二进制日志 relay-log = mysql-relay-bin replicate-wild-ignore-table=mysql.% #配置不须要复制的库 replicate-wild-ignore-table=test.% replicate-wild-ignore-table=information_schema.%
slave的my.cnf
[mysqld] server_id = 2 log-bin = mysql-bin relay-log = mysql-relay-bin replicate-wild-ignore-table=mysql.% replicate-wild-ignore-table=test.% replicate-wild-ignore-table=information_schema.%
配置完成后,重启两个mysql。
(2)配置主主复制
链接mysql,使用show master status查看master和slave两个mysql的二进制文件名称和位置
master(192.168.102.129)以下:
slave(192.168.102.130)以下:
根据上述file和position互相配置主从
master(192.168.102.129)以下:
change master to master_host='192.168.102.130', master_user='root',master_password='123456',master_port=3306,master_log_file='mysql- bin.000002',master_log_pos=472; start slave;
slave(192.168.102.130)以下:
change master to master_host='192.168.102.129', master_user='root',master_password='123456',master_port=3306,master_log_file='mysql- bin.000002',master_log_pos=724; start slave;
(3)测试验证是否同步
链接master,在jz.test中添加记录m1
链接salve,在jz.test中添加记录s1,结果以下
(1)keepalived安装
使用yum能够直接安装yum install keepalived
网络不容许的状况下能够下载tar或rpm进行离线安装。本文使用yum直接安装,安装过程再也不赘述。
(2)keepalived配置
配置keepalived.conf文件
[root@master ~]# vi /etc/keepalived/keepalived.conf
master配置
! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_instance VI_1 { state BACKUP #master和slave都设置为BACKUP, interface eth0 virtual_router_id 51 priority 100 #master和slave设置不一样值,启动时会将priority大的设置为master advert_int 1 nopreempt #设置为不抢占模式,仅master配置。当master挂掉后,slave当选为master,恢复后再也不切换 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.102.128 #虚拟ip } } virtual_server 192.168.102.128 3306 { delay_loop 2 #轮训real_server时间间隔,此处设为2秒 lb_algo rr lb_kind NAT nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP real_server 192.168.102.129 3306 { weight 1 notify_down /usr/local/mysql/checkMysql.sh #mysql挂掉时执行的脚本,需具有执行权限 TCP_CHECK { connect_timeout 10 bingto 192.168.102.128 nb_get_retry 3 delay_before_retry 3 connect_port 3306 } } }
slave配置
! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.102.128 } } virtual_server 192.168.102.128 3306 { delay_loop 2 lb_algo rr lb_kind NAT nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP real_server 192.168.102.130 3306 { weight 1 notify_down /usr/local/mysql/checkMysql.sh TCP_CHECK { connect_timeout 10 bingto 192.168.102.128 nb_get_retry 3 delay_before_retry 3 connect_port 3306 } } }
在/usr/local/mysql/下增长checkMysql.sh,脚本以下(留意脚本权限,需具有执行权限):
pkill keepalived
keepalived加入开机启动
chkconfig keepalived on
(3)测试keepalived是否生效
启动master和slave的mysql、keepalived,
链接192.168.102.128的数据库,查询hostname,此时vip在master机器上
停掉master的mysql服务(service mysql stop)后,vip飘到了slave上。
经过上述配置可初步实现数据库的高可用性,在Mysql服务出问题时实现自动切换,但在实际应用中应考虑服务宕掉时,应实现邮件通知功能,文中还没有涉及,后期实现后再作更新。此外Mysql之间出现数据不一样步问题,也要谨慎处理,暂停数据同步功能,将数据处理后,方可从新开启同步。
© 著做权归做者全部