linux复盘:keepalived+mysql双主构建高可用数据库
2018-02-05 23:05
281 查看
关于MySQL-HA,目前有多种解决方案,比如heartbeat、drbd、mmm、共享存储,但是它们各有优缺点。heartbeat、drbd配置较为复杂,需要自己写脚本才能实现MySQL自动切换,对于不会脚本语言的人来说,这无疑是一种脑裂问题;对于mmm,生产环境中很少有人用,且mmm管理端需要单独运行一台服务器上,要是想实现高可用,就得对mmm管理端做HA,这样无疑又增加了硬件开支;对于共享存储,MySQL数据还是放在本地较为安全,存储设备毕竟存在单点隐患。
使用MySQL双master+keepalived是一种非常好的解决方案,在MySQL-HA环境 中,MySQL互为主从关系,这样就保证了两台MySQL数据的一致性,然后用keepalived实现虚拟IP,通过keepalived自带的服务监 控功能来实现MySQL故障时自动切换。
第一步关闭防火墙:
第二步mysql双主配置:
两台MySQL均如要开启binlog日志功能,开启方法:在MySQL配置文件[MySQLd]段中加上log-bin=MySQL-bin选项 两台MySQL的server-ID不能一样,默认情况下两台MySQL的serverID都是1,需将其中一台修改为2即可
重要参数:
log-slave-updates = true #将复制事件写入binlog,一台服务器做主库又做从库此选项必须要开启
重启两台server的mysql服务:
将192.168.230.130设为192.168.230.152的主服务器:
将192.168.230.152设为192.168.230.130的主服务器:
在Mysql-Master1上操作:
在Mysql-Master2上操作:
以上把双主做完了下来搞keepalived:
192.168.230.130服务器上keepalived安装及配置 安装keepalived
当然安装推荐源码包安装,或者懒了就yum直接安装
然后配置130的keepalived:
编写检测服务down后所要执行的脚本(添加/usr/local/keepalived/mysql.sh)
启动keepalived
192.168.230.152上keepalived安装及配置 安装keepalived,安装方法参照192.168.230.130的安装方法 配置keepalived 这台配置和上面基本一样,但有三个地方不同:优先级为90、无抢占设置、real_server为本机IP
编写检测服务down后所要执行的脚本(添加/usr/local/keepalived/mysql.sh)
然后还是杀掉mysql的脚本:
启动keepalived
好了配置完了,测试
如果服务器宕机,Keepalived服务肯定回停止工作,所以在此通过开/关Keepalived来模拟宕机状态:
宕机前:
master服务器宕机后:
此时vip到了152机器上,此时有backup服务器接管master服务器对外提供服务。
恢复master服务器Keepalived服务,此时VIP并没有回到master服务器上,原因是master在进行Keepalived的时候加入了参数nopreemt。
注意:原因是nopreemt不抢占,只在优先级高的机器上设置即可,优先级低的机器不设置 ,咱们给130这个优先级高的设置不抢占资源,所以vip停留在152上提供服务
使用MySQL双master+keepalived是一种非常好的解决方案,在MySQL-HA环境 中,MySQL互为主从关系,这样就保证了两台MySQL数据的一致性,然后用keepalived实现虚拟IP,通过keepalived自带的服务监 控功能来实现MySQL故障时自动切换。
机器ip及版本: MySQL-VIP 192.168.230.200 MySQL-master1 192.168.230.130 MySQL-master2 192.168.230.152 OS版本:CentOS 7.3 MySQL版本:5.6 Keepalived版本:1.2.7
第一步关闭防火墙:
selinux永久关闭 vi /etc/selinux/config selinux修改此处为disabled,reboot重启生效 关闭firewalld: systemctl disable firewalled 先暂停,不让开机启动 systemctl stop firewalld 关闭服务 关闭iptables: systemctl disable iptables systemctl stop iptables
第二步mysql双主配置:
两台MySQL均如要开启binlog日志功能,开启方法:在MySQL配置文件[MySQLd]段中加上log-bin=MySQL-bin选项 两台MySQL的server-ID不能一样,默认情况下两台MySQL的serverID都是1,需将其中一台修改为2即可
Master1配置: vim /etc/my.cnf [mysqld] datadir = /data/mysql socket = /tmp/mysql.sock server_id = 1 #指定server-id,必须保证主从服务器的server-id不同 auto_increment_increment = 2 #设置主键单次增量 auto_increment_offset = 1 #设置单次增量中主键的偏移量 log-bin = mysql-bin #创建主从需要开启log-bin日志文件 log-slave-updates #把更新的日志写到二进制文件(binlog)中
master2配置: vim /etc/my.cnf [mysqld] datadir = /data/mysql socket = /tmp/mysql.sock server_id = 2 #指定server-id,必须保证主从服务器的server-id不同 auto_increment_increment = 2 #设置主键单次增量 auto_increment_offset = 2 #设置单次增量中主键的偏移量 log-bin = mysql-bin #创建主从需要开启log-bin日志文件 log-slave-updates #把更新的日志写到二进制文件(binlog)中
重要参数:
log-slave-updates = true #将复制事件写入binlog,一台服务器做主库又做从库此选项必须要开启
重启两台server的mysql服务:
/etc/init.d/mysqld restart
将192.168.230.130设为192.168.230.152的主服务器:
mysql -uroot mysql> grant replication slave on *.* to 'repl'@'192.168.230.152' identified by 'zhangduanya'; mysql> flush privileges;
将192.168.230.152设为192.168.230.130的主服务器:
mysql -uroot mysql> grant replication slave on *.* to 'repl'@'192.168.230.130' identified by 'zhangduanya'; mysql> flush privileges;
在Mysql-Master1上操作:
mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000003 | 421 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec) mysql> change master to master_host='192.168.230.152',master_port=3306,master_user='repl',master_password='zhangduanya',master_log_file='mysql-bin.000002',master_log_pos=120; Query OK, 0 rows affected, 2 warnings (0.01 sec) mysql> start slave; Query OK, 0 rows affected (0.01 sec) mysql> show slave status\G yes yes
在Mysql-Master2上操作:
mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000002 | 120 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec) mysql> change master to master_host='192.168.230.130',master_port=3306,master_user='repl',master_password='zhangduanya',master_log_file='mysql-bin.000003',master_log_poos=421; Query OK, 0 rows affected, 2 warnings (0.06 sec) mysql> start slave; Query OK, 0 rows affected (0.00 sec) mysql> show slave status\G yes yes ##注意如果开始就启动了start slave,在操作同步的时候需要先停止它,stop slave
以上把双主做完了下来搞keepalived:
192.168.230.130服务器上keepalived安装及配置 安装keepalived
当然安装推荐源码包安装,或者懒了就yum直接安装
yum install -y keepalived 或者 yum install -y pcre-devel openssl-devel popt-devel #安装依赖包 cd /usr/local/src wget http://www.keepalived.org/software/keepalived-1.2.7.tar.gz tar -zxvf keepalived-1.2.7.tar.gz cd ./keepalived-1.2.7 ./configure --prefix=/usr/local/keepalived make && make install echo $? cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ chmod +x /etc/init.d/keepalived chkconfig --add keepalived chkconfig keepalived on cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ mkdir /etc/keepalived/ cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/ cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
然后配置130的keepalived:
vi /etc/keepalived/keepalived.conf vi /etc/keepalived/keepalived.conf #写入以下内容 ! Configuration File forkeepalived global_defs { notification_email { test@sina.com } notification_email_from admin@admin.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id MYSQL_HA #标识,双主相同 } vrrp_instance VI_1 { state BACKUP #两台都设置BACKUP interface ens33 virtual_router_id 51 #主备相同 priority 100 #优先级,另一台改为90 advert_int 1 nopreempt #不抢占,只在优先级高的机器上设置即可,优先级低的机器不设置 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.230.200 } } virtual_server 192.168.230.200 3306 { delay_loop 2 #每个2秒检查一次real_server状态 lb_algo wrr #LVS算法 lb_kind DR #LVS模式 persistence_timeout 60 #会话保持时间 protocol TCP real_server 192.168.230.130 3306 { weight 3 notify_down /usr/local/keepalived/mysql.sh #检测到服务down后执行的脚本 TCP_CHECK { connect_timeout 10 #连接超时时间 nb_get_retry 3 #重连次数 delay_before_retry 3 #重连间隔时间 connect_port 3306 #健康检查端口 } } }
编写检测服务down后所要执行的脚本(添加/usr/local/keepalived/mysql.sh)
vim /usr/local/keepalived/mysql.sh #!/bin/bash pkill keepalived sleep 10 /etc/init.d/keepalived start >/dev/null ---------- # chmod +x /usr/local/keepalived/mysql.sh 注:此脚本是上面配置文件notify_down选项所用到的,keepalived使用notify_down选项来检查real_server 的服务状态,当发现real_server服务故障时,便触发此脚本;我们可以看到,脚本就一个命令,通过pkill keepalived强制杀死keepalived进程,从而实现了MySQL故障自动转移。另外,我们不用担心两个MySQL会同时提供数据更新操作, 因为每台MySQL上的keepalived的配置里面只有本机MySQL的IP+VIP,而不是两台MySQL的IP+VIP。
启动keepalived
/etc/init.d/keepalived start
192.168.230.152上keepalived安装及配置 安装keepalived,安装方法参照192.168.230.130的安装方法 配置keepalived 这台配置和上面基本一样,但有三个地方不同:优先级为90、无抢占设置、real_server为本机IP
vi /etc/keepalived/keepalived.conf vi /etc/keepalived/keepalived.conf #写入以下内容 ! Configuration File forkeepalived global_defs { notification_email { test@sina.com } notification_email_from admin@admin.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id MYSQL_HA #标识,双主相同 } vrrp_instance VI_1 { state BACKUP #两台都设置BACKUP interface ens33 virtual_router_id 51 #主备相同 priority 90 #优先级,此处应改为90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.230.200 } } virtual_server 192.168.230.200 3306 { delay_loop 2 #每个2秒检查一次real_server状态 lb_algo wrr #LVS算法 lb_kind DR #LVS模式 persistence_timeout 60 #会话保持时间 protocol TCP real_server 192.168.230.152 3306 { weight 3 notify_down /usr/local/keepalived/mysql.sh #检测到服务down后执行的脚本 TCP_CHECK { connect_timeout 10 #连接超时时间 nb_get_retry 3 #重连次数 delay_before_retry 3 #重连间隔时间 connect_port 3306 #健康检查端口 } } }
编写检测服务down后所要执行的脚本(添加/usr/local/keepalived/mysql.sh)
然后还是杀掉mysql的脚本:
vim /usr/local/keepalived/mysql.sh #!/bin/bash pkill keepalived sleep 10 /etc/init.d/keepalived start >/dev/null ---------- # chmod +x /usr/local/keepalived/mysql.sh
启动keepalived
/etc/init.d/keepalived start
好了配置完了,测试
如果服务器宕机,Keepalived服务肯定回停止工作,所以在此通过开/关Keepalived来模拟宕机状态:
宕机前:
查看master服务器IP状态: ip add 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:8a:1b:5c brd ff:ff:ff:ff:ff:ff inet 192.168.230.130/24 brd 192.168.8.255 scope global ens33 valid_lft forever preferred_lft forever inet 192.168.230.200/32 scope global ens33 valid_lft forever preferred_lft forever inet6 fe80::65d2:adc:20d3:8c74/64 scope link valid_lft forever preferred_lft forever 查看backup服务器IP状态: ip add 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:af:b7:9f brd ff:ff:ff:ff:ff:ff inet 192.168.230.152/24 brd 192.168.8.255 scope global ens33 valid_lft forever preferred_lft forever inet6 fe80::76c1:b882:4f26:608c/64 scope link valid_lft forever preferred_lft forever 说明: 此时VIP在master服务器上,说明有master对外提供服务。 vip也绑定在master这台机器上
master服务器宕机后:
此时vip到了152机器上,此时有backup服务器接管master服务器对外提供服务。
恢复master服务器Keepalived服务,此时VIP并没有回到master服务器上,原因是master在进行Keepalived的时候加入了参数nopreemt。
注意:原因是nopreemt不抢占,只在优先级高的机器上设置即可,优先级低的机器不设置 ,咱们给130这个优先级高的设置不抢占资源,所以vip停留在152上提供服务
相关文章推荐
- Linux下keepalived+Mysql主主同步实现数据库高可用实践
- 在linux下构建基于LVM的裸设备数据库
- Centos下使用LVS+Keepalived构建高可用linux集群
- 在Red Hat Linux5下构建LAMP网站服务平台之安装phpMyAdmin数据库管理套件
- linux复盘:keepalived+lvs实现高可用负载均衡
- Linux的企业-Redis数据库、缓存和哨兵Sentinal、Redis高可用
- 在 Django 中构建 mysql 数据库支持的 Web 应用程序(linux )
- 构建Oracle高可用环境HA rac:企业级高可用数据库架构、实战与经验总结
- 构建高可用、可扩展、分布式 Linux 操作系统课程目录
- 构建Oracle高可用环境HA rac:企业级高可用数据库架构、实战与经验总结
- Centos下使用LVS+Keepalived构建高可用linux集群
- Windows 下使用 Vagrant 构建 Linux 开发环境,实测可用
- linux复盘:expect构建文件分发系统
- Linux数据库网络开发平台构建备忘录
- CentOS7+MySQL/MariaDB+Galera+HAProxy+Keepalived构建高可用数据库集群
- Linux+Informix后台数据库系统安装配置
- linux 添加数据库用户
- excel数据通过构建sql语句导入到数据库中
- Linux负载均衡专题(个人心得和笔记按照下面的步骤就能建立可用的集群)
- linux中jenkins+tomcat 构建时间和服务器不同步