准备

 1. 双主 master1 192.168.199.49
master2 192.168.199.50
VIP 192.168.199.52 //虚拟IP
2.环境 master:nginx + php + mysql + keepalived
VIP:只要和master在一个局域网内即可。
3. 服务器之间网络通畅,可以互相ping通。
4. 2个服务器的mysql版本要一致。数据库密码一致
5. 防火墙增加允许组播和允许VRRP(虚拟路由器冗余协)通信,这样主服务器在故障恢复后才能抢回资源
-A INPUT -s 182.148.15.0/24 -d 224.0.0.18 -j ACCEPT
-A INPUT -s 182.148.15.0/24 -p vrrp -j ACCEPT
重启生效:service iptables reload

配置服务器

 服务器1:

 在my.cnf文件的[mysqld]配置区域添加下面内容:
log-bin=mysql-bin #记录二进制文件
binlog_format=mixed #mysql默认采用的二进制格式
server-id = 2 #服务号,必须是唯一的,一般取IP的后8位
expire_logs_days = 10 #binlog过期清理时间 binlog-do-db = db1 #需要服务的数据库。
#replicate-ignore-db = db3,mysql,test,information_schema,performance_schema,transfer_new #不需要复制的数据库
#replicate-wild-ignore-table=garbage.% #有问题可以尝试使用此项配置
sync_binlog = 1 #表示binlog日志在每1次写入后与硬盘同步,设置1最安全也最慢
auto-increment-increment = 2 #服务器个数
auto-increment-offset = 2 #自增偏移量,如果有2台,则一台设置1,另一台设置2
slave-skip-errors = all #从库复制时跳过所有的错误
服务器2: log-bin=mysql-bin
binlog_format=mixed
server-id = 1
expire_logs_days = 10
binlog-do-db = db1
#replicate-ignore-db = db3,mysql,test,information_schema,performance_schema,transfer_new
#replicate-wild-ignore-table=garbage.% #有问题可以尝试使用此项配置
sync_binlog = 1
auto-increment-increment = 2
auto-increment-offset = 1
slave-skip-errors = all

2台服务器都重启mysql服务:

 service mysql restart

同步配置(2台服务器分别执行)

 给对方授权复制权限

 //对方服务器60.205.182.26允许复制本服务器数据库,用户名repl 密码ocnt-123
mysql> grant replication slave,replication client on *.* to repl@'60.205.182.26' identified by "ocnt-123";
//生效
mysql> flush privileges;
//锁定表
mysql> flush tables with read lock;

同步数据

 1.锁定表
mysql> flush tables with read lock;
2.同步数据,可使用navicat

同步操作(2台服务器分别执行)

 //查看各自服务器当前二进制日志文件名称和记录位置
mysql> show master status; <!-----------------------服务器1同步------------------------------------>
//解锁表
mysql> unlock tables;
//停止slave
mysql> slave stop;
//开始同步: IP、用户名和密码为服务器2刚才grant授权配置的,日志文件和pos值得位置通过服务器2 show master status查看得来
mysql> change master to master_host='101.200.63.35',master_user='repl',master_password='',master_log_file='mysql-bin.000016',master_log_pos=363;
//开启slave
mysql> start slave; <!-----------------------服务器2同步------------------------------------>
//解锁表
mysql> unlock tables;
//停止slave
mysql> slave stop;
<!--开始同步-->
change master to master_host='60.205.182.26',master_user='repl',master_password='',master_log_file='mysql-bin.000028',master_log_pos=107;
<!--开启slave-->
mysql> start slave;

查看同步状态,如下出现两个“Yes”,表明同步成功!(Slave_IO_Running和Slave_SQL_Running)

 mysql> show slave status \G;

配置到此处就完成了双主热备。

keepalived故障自动切换配置

 master1:192.168.199.49  主机1
master2:192.168.199.50 主机2 备份
VIP:192.168.199.52 虚拟IP
### 2台服务器安装keepalived [root@localhost ]#yum install -y openssl-devel
[root@localhost src]#cd /usr/local/src/
[root@localhost src]# wget http://www.keepalived.org/software/keepalived-1.3.5.tar.gz
[root@localhost src]# tar -zvxf keepalived-1.3.5.tar.gz
[root@localhost src]# cd keepalived-1.3.5
[root@localhost keepalived-1.3.5]# ./configure --prefix=/usr/local/keepalived
[root@localhost keepalived-1.3.5]# make && make install [root@localhost keepalived-1.3.5]# cp /usr/local/src/keepalived-1.3.5/keepalived/etc/init.d/keepalived /etc/rc.d/init.d/
[root@localhost keepalived-1.3.5]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@localhost keepalived-1.3.5]# mkdir /etc/keepalived/
[root@localhost keepalived-1.3.5]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
[root@localhost keepalived-1.3.5]# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
[root@localhost keepalived-1.3.5]# echo "/etc/init.d/keepalived start" >> /etc/rc.local

master1服务器配置

 [root@master1 ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@master1 ~]# vim /etc/keepalived/keepalived.conf #删除所有内容,重新配置如下 ! Configuration File for keepalived
global_defs {
notification_email {
412140451@qq.com
} notification_email_from 412140451@qq.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id MASTER-HA
} vrrp_script chk_mysql_port { #检测mysql服务是否在运行
script "/opt/chk_mysql.sh" #这里通过脚本监测
interval 3 #脚本执行间隔,每3s检测一次
weight -5 #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
fall 2 #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
rise 1 #检测1次成功就算成功。但不修改优先级
} vrrp_instance VI_1 {
state MASTER
interface eth0 #指定虚拟ip的网卡接口
mcast_src_ip 192.168.199.49 #本机master的 IP地址
virtual_router_id 100 #路由器标识,MASTER和BACKUP必须是一致的
priority 100 #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级。这样MASTER故障恢复后,就可以将VIP资源再次抢回来
advert_int 1
authentication { #加密协议
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.199.52 #虚拟IP地址 VIP
} track_script {
chk_mysql_port
}
}

master2服务器配置 修改 mcast_src_ip priority

 global_defs {
notification_email {
412140451@qq.com
} notification_email_from 412140451@qq.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id MASTER-HA
} vrrp_script chk_mysql_port {
script "/opt/chk_mysql.sh"
interval 3
weight -5
fall 2
rise 1
} vrrp_instance VI_1 {
state BACKUP
interface eth0
mcast_src_ip 192.168.199.50
virtual_router_id 100
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.199.52
} track_script {
chk_mysql_port
}
}

2个服务器都编写检测切换mysql脚本

 KeepAlived做心跳检测,如果Master的MySQL服务挂了(3306端口挂了),那么它就会选择自杀。Slave的KeepAlived通过心跳检测发现这个情况,就会将VIP的请求接管
vim /opt/chk_mysql.sh #!/bin/bash
CHECK_TIME=3 #Mysql
host='localhost'
port=''
user='root'
password='ocnt-123'
mysqlclient="mysql" #mysql is working MYSQL_OK is 1 , mysql down MYSQL_OK is 0
function check_mysql_helth (){
#NEW=$MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p${MYSQL_PASSWORD} -e "show status;" >/dev/null 2>&1
$mysqlclient --host=$host --port=$port --user=$user --password=$password -e "show databases;" > /dev/null 2>&1 if [ $? == 0 ]
then
MYSQL_OK=1
else
MYSQL_OK=0
fi
# echo $MYSQL_OK
return $MYSQL_OK
} while [ $CHECK_TIME -ne 0 ]
do
let "CHECK_TIME -= 1"
check_mysql_helth
if [ $MYSQL_OK == 1 ] ; then
CHECK_TIME=0
exit 0
fi
if [ $MYSQL_OK -eq 0 ] && [ $CHECK_TIME -eq 0 ]
then
pkill keepalived
exit 1
fi
sleep 1
done

赋权限

 chmod 755 /opt/chk_mysql.sh

启动服务

 关闭防火墙
service iptables stop
启动服务
/etc/init.d/keepalived start

数据库测试

 使用局域网内的客户端连接VIP
mysql -h192.168.199.52 -uroot -pocnt-123
测试是否可用

故障切换检测

 默认情况下,vip是在master1上的。使用"ip addr"命令查看vip切换情况
ip addr
查找
inet 192.168.199.49/32 scope global eth0 //这个32位子网掩码的vip地址表示该资源目前还在master1机器上,而master2机器上没有
同时查看 tail -f /var/log/message 会发现
Dec 13 17:52:38 localhost Keepalived_vrrp[65545]: VRRP_Instance(VI_1) Entering MASTER STATE
Dec 13 17:52:38 localhost Keepalived_vrrp[65545]: VRRP_Instance(VI_1) setting protocol VIPs.
Dec 13 17:52:38 localhost Keepalived_vrrp[65545]: Sending gratuitous ARP on eth0 for 192.168.199.51 关掉master1的mysql服务
service mysql stop
查看 master1的日志 tail -f /var/log/message 会发现
Dec 13 18:52:44 localhost Keepalived_vrrp[65545]: Stopped
Dec 13 18:52:44 localhost Keepalived[65542]: Stopped Keepalived v1.3.5 (03/19,2017), git commit v1.3.5-6-g6fa32f2 查看master2的日志
Dec 13 18:52:45 localhost Keepalived_vrrp[28451]: VRRP_Instance(VI_1) Transition to MASTER STATE
Dec 13 18:52:46 localhost Keepalived_vrrp[28451]: VRRP_Instance(VI_1) Entering MASTER STATE
Dec 13 18:52:46 localhost Keepalived_vrrp[28451]: VRRP_Instance(VI_1) setting protocol VIPs.
Dec 13 18:52:46 localhost Keepalived_vrrp[28451]: Sending gratuitous ARP on eth0 for 192.168.199.51 此时就已经转移到master2上,
恢复master1 的mysql服务
service mysql start
恢复master1 的keepalive
/etc/init.d/keepalived start 查看master1的日志
Dec 13 18:54:41 localhost Keepalived_vrrp[71002]: VRRP_Instance(VI_1) Transition to MASTER STATE
Dec 13 18:54:42 localhost Keepalived_vrrp[71002]: VRRP_Instance(VI_1) Entering MASTER STATE
Dec 13 18:54:42 localhost Keepalived_vrrp[71002]: VRRP_Instance(VI_1) setting protocol VIPs.
Dec 13 18:54:42 localhost Keepalived_vrrp[71002]: Sending gratuitous ARP on eth0 for 192.168.199.51 查看master2的日志
Dec 13 18:54:41 localhost Keepalived_vrrp[28451]: VRRP_Instance(VI_1) Received advert with higher priority 100, ours 90
Dec 13 18:54:41 localhost Keepalived_vrrp[28451]: VRRP_Instance(VI_1) Entering BACKUP STATE
Dec 13 18:54:41 localhost Keepalived_vrrp[28451]: VRRP_Instance(VI_1) removing protocol VIPs. 说明服务已经转移到master2上了。
至此完成

完成

其它:删除主从复制

 mysql> stop slave;
mysql> slave reset;
mysql> reset master;

keepalived

 启动
/etc/init.d/keepalived start

异常解决办法

 如果不能正常复制,查看状态
sql> show slave status \G;
然后可以看到错误信息,一般情况下,重启一下slave就好了
sql> stop slave;

11 Mysql之配置双主热备+keeepalived.md的更多相关文章

  1. Mysql之配置双主热备+keeepalived.md

    准备 1 1. 双主 master1 192.168.199.49 2 master2 192.168.199.50 3 VIP 192.168.199.52 //虚拟IP 4 2.环境 master ...

  2. Mysql + keepalived 实现双主热备读写分离【转】

    Mysql + keepalived 实现双主热备读写分离 2013年6月16日frankwong发表评论阅读评论   架构图 系统:CentOS6.4_X86_64软件版本:Mysql-5.6.12 ...

  3. Mysql主从复制,双主热备

    Mysql主从复制: 主从复制: 主机准备工作: 开启bin.Log 注意:server-id  是唯一的值 重启mysql:service mysql restart 查看是否开启成功: 查看当前状 ...

  4. 高可用Mysql架构_Mysql主从复制、Mysql双主热备、Mysql双主双从、Mysql读写分离(Mycat中间件)、Mysql分库分表架构(Mycat中间件)的演变

    [Mysql主从复制]解决的问题数据分布:比如一共150台机器,分别往电信.网通.移动各放50台,这样无论在哪个网络访问都很快.其次按照地域,比如国内国外,北方南方,这样地域性访问解决了.负载均衡:M ...

  5. Mysql+Keepalived双主热备高可用操作记录

    我们通常说的双机热备是指两台机器都在运行,但并不是两台机器都同时在提供服务.当提供服务的一台出现故障的时候,另外一台会马上自动接管并且提供服务,而且切换的时间非常短.MySQL双主复制,即互为Mast ...

  6. Mysql双主热备+LVS+Keepalived高可用操作记录

    MySQL复制能够保证数据的冗余的同时可以做读写分离来分担系统压力,如果是主主复制还可以很好的避免主节点的单点故障.然而MySQL主主复制存在一些问题无法满足我们的实际需要:未提供统一访问入口来实现负 ...

  7. MySQL双主热备问题处理

    1. Slave_IO_Running: No mysql> show slave status\G *************************** 1. row *********** ...

  8. keepalived+mysql双主热备

    这里使用keepalived实现mysql的双主热备高可用 实验环境: 主机名 IP 系统版本 软件版本 master 192.168.199.6/vip:192.168.199.111 Rhel7. ...

  9. mysql双主热备

    先搭建mysql主从模式,主从请参考mysql 主从笔记 然后在在配置文件里添加如下配置 1 log_slave_updates= #双主热备的关键参数.默认情况下从节点从主节点中同步过来的修改事件是 ...

随机推荐

  1. PM2工作原理

    PM2工作原理 要理解pm2就要理解god和santan的关系,god和santan的关系就相当于盖娅和黑底斯在pm2中的01世界中,每一行代码每一个字节都安静的工作god就是Daemon进程 守护进 ...

  2. [eclipse]如何修改Eclipse编辑器的字体

    步骤如下, 菜单->"Window"->“Preference”->“General”->“Appearance”->“Colors & Fo ...

  3. mysql 存储过程中使用动态sql语句

    Mysql 5.0 以后,支持了动态sql语句,我们可以通过传递不同的参数得到我们想要的值 这里介绍两种在存储过程中的动态sql: set sql = (预处理的sql语句,可以是用concat拼接的 ...

  4. DOM解析和SAX解析对比

    原理: 一次性加载xml文档,不适合大容量的文件读取 原理: 加载一点,读取一点,处理一点.适合大容量文件的读取 DOM解析可以任意进行增删改成 SAX解析只能读取 DOM解析任意读取任何位置的数据, ...

  5. jenkins凭证与新建任务

    一.凭证介绍 有许多第三方网站和应用程序可以与 Jenkins 进行交互,例如程序代码仓库,云存储系统和服务等. 此类应用程序的系统管理员可以在应用程序中配置凭证以专供 Jenkins 使用.通常通过 ...

  6. Java实现批量下载选中文件功能

    1.在action中定义变量 ? 1 2 3 4 5 6 private List<String> downLoadPaths = new ArrayList<String>( ...

  7. ModelAndView及页面转发

    1.ModelAndView springMVC中返回值如果是ModelAndView,则其既包含模型数据信息,也包含视图信息. 在处理方法中可以使用ModelAndView对象的方法添加模型数据:a ...

  8. JavaScript DOM 编程艺术(第二版) 初读学习笔记

    这本书留给我的印象就是结构.表现和行为层的分离,以及书后面部分一直在强调的最佳实践原则:平稳退化,逐步增强,向后兼容以及性能考虑. 要注意这不是一本JavaScript入门书籍~ 2.1 准备工作 用 ...

  9. appium+python等待方式使用

    背景: 首先,由于一个网速和手机性能以及服务器反应时间等等的原因,不可能导致我们点击了某一个元素之后,它所要链接的页面马上弹出来可以进行下一步操作.所以我们需要一种等待方式,直至链接的页面跳出来之后再 ...

  10. vs2017 开发.NetCore部署docker

    一.环境 操作系统:windows 10 64bit 开发环境:vs2017 部署环境:docker  — windows 二.准备 安装docker: 见:https://www.cnblogs.c ...