文档章节

基于keepalived搭建mysql双主高可用

j
 java_龙
发布于 11/29 17:10
字数 1421
阅读 2172
收藏 148

目录

  • 概述
  • 环境准备
  • keepalived搭建
  • mysql搭建
  • mysql双主搭建
  • mysql双主高可用搭建

概述

    传统(不借助中间件)的数据库主从搭建,如果主节点挂掉了,从节点只能读取无法写入,只能把人肉去恢复故障,既不想引用中间件也不想人肉恢复故障,可以折中选择双主方案,本文将介绍通过keepalived搭建mysql双主方案。

    本例中vip为:172.16.0.169,  两台mysql实例服务器ip分别为:172.16.0.1和172.16.0.2

转帖请注明来源: https://my.oschina.net/u/2342969/blog/2963153

环境准备

  1. 最小化安装centos7
  2. mysql-5.7.23
  3. keepalived 1.4.5
  4. 虚拟ip(下文简称vip):172.16.0.169

keepalived搭建

    点击查看keepalived搭建教程,博主亲自操作过来的,如有疑问欢迎随时私信或者评论

mysql单机搭建

    点击查看mysql搭建教程,博主亲自操作过来的,如有疑问欢迎随时私信或者评论

双主搭建

    本方案仅限两台均是全新安装的mysql,如果是旧mysql实例和新mysql实例改为双主,在新mysql实例中记得导入旧mysql实例的数据,另外可能同步复制还会报异常,自行解决一下。

环境安装检查

  1. 两台mysql实例均可以访问
  2. keepalived可以正常漂移

数据库配置更改

#vim /etc/my.cnf

    进入mysql配置修改一下配置:

  1. server-id 两台mysql要不一样,一般是ip最后一位。注意命名规范不要加下划线/中横线/点等特殊符号
  2. #skip_slave_start = 1  注释掉这个配置

创建复制账号

mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'172.16.0.%' identified by 'repl_password';
mysql> flush privileges;
mysql> select @@server_id;

两台mysql分别执行以上语句,语句解析:

  1. 创建mysql复制账号
  2. repl_user: 复制权限账号的用户名,可自行更改
  3. 172.16.0.%: 此处使用的通配符,也可以写固定ip,可同步的mysql实例ip
  4. repl_password: 复制权限账号的密码,自行更改
  5. select @@server_id; 查询出的结果一定要不一样

配置互为主备   

mysql> CHANGE MASTER TO MASTER_HOST="对方ip", MASTER_USER="repl_user", MASTER_PASSWORD="repl_password", MASTER_PORT=3316, MASTER_AUTO_POSITION = 1;
mysql> start slave;
mysql> show slave status\G;

两台mysql分别执行以上sql,语句解析:

  1. 互相设置对方为主节点,自己为备节点
  2. MASTER_HOST:对方ip
  3. MASTER_USER:对方复制权限账号用户名,即上一步设置的用户名
  4. MASTER_PASSWORD:对方复制权限账号密码,即上一步设置的密码
  5. MASTER_PORT:对方mysql实例的端口, 如果开了防火墙一定要记得打开端口
  6. show slave status\G; 注意查看Slave_IO_Running 和 Slave_SQL_Running 状态如果有一个为no 就代表配置失败

检查点:

  1. Master_Host: 是否是对方ip
  2. Master_User: 是否是对方的复制账号的用户名
  3. Master_Port: 是否是对方mysql实例的端口号
  4. Last_SQL_Errno:最近sql错误条数,正常情况为0
  5. Last_SQL_Error:最新sql错误详细信息,正常情况为空

如果有异常,根据异常信息解决掉问题后,执行一下命令

mysql> stop slave;
mysql> reset master;

两台mysql分别执行以上命令,再执行一下上一步的配置。

验证

  1. 在任意一台mysql创建数据库,另一台也会同步到
  2. 在任意一台mysql创建表,另一台也会同步到
  3. 在任意一台mysql表中插入数据,另一台也会同步到

双主高可用

修改keepalived配置

# vim /etc/keepalived/keepalived.conf

配置内容如下:

! Configuration File for keepalived
global_defs {
router_id MYSQL-1 ## 名称自定义,两台机器需要不一样
}

vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 60
priority 100    # 两台机器需要一个大一个小,数值大的先启动,哪台先启动vip会先在哪台机器
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
172.16.0.169    # 填写自己的vip
}
}

virtual_server 172.16.0.169 3316 {  # 填写自己的vip 和mysql端口
delay_loop 2
#lb_algo rr
#lb_kind DR
persistence_timeout 60
protocol TCP
real_server 172.16.0.1 3316 { # 填写mysql服务器真实ip 和mysql端口
weight 3
notify_down /etc/keepalived/checkmysql.sh  # 检查mysql是否存活脚本,根据脚本位置自行填写
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3316  # mysql的端口号
}
}
}

注意: 上面配置注释的部分,两台机器根据实际情况修改,配置文件中的注释一定要去掉,以免出现奇怪问题

编写mysql监测脚本

#vim  /etc/keepalived/checkmysql.sh

脚本内容如下:

#!/bin/sh
datetime=`date +20\%y\%m\%d_\%H\%M\%S`
isok=$(/usr/local/mysql/bin/mysql -h localhost -u数据库账号 -p数据库密码 -P数据库端口 -S /tmp/mysql3316.sock 2>/dev/null  -e 'select 1' |sed -n '2p')
function error_query(){
systemctl stop keepalived
echo $datetime  >> /etc/keepalived/keepalived.log
echo "mysql down, keepalived 切换" >> /etc/keepalived/keepalived.log
}
echo "isok: $isok"  >> /etc/keepalived/keepalived.log
if [ "$isok" != "1" ]
then
error_query
fi

注意:根据实际情况调整脚本中的中文部分

给脚本赋权限:

# chmod +x /etc/keepalived/*.sh

验证

    一定要先阅读博文[centos7 下源码安装keepalived踩坑记],根据这篇博文中"操作keepalived"章节操作keepalived

  1. 两台服务器分别启动keepalived, 注意先启动keepalived配置中priority 数值大的
  2. 停掉vip所在机器的mysql实例,查看另外一台机器ip是否有vip了

两台机器记得交叉验证,以免有问题, 如果不能正常漂移,请认真检查操作步骤,是否和本文一致

© 著作权归作者所有

共有 人打赏支持
j
粉丝 68
博文 95
码字总数 135141
作品 0
成都
程序员
私信 提问
加载中

评论(9)

j
java_龙

引用来自“java_龙”的评论

引用来自“红薯比我帅”的评论

很少有公司会用主主吧,, 而且Keepalive 同一时间VIP也只会绑定一台机,如果主主同步通道挂了,没发现的话,两边数据同步会很麻烦的。

@红薯比我帅 我们当时考虑运维简单,请问还有合适的方案吗?

引用来自“红薯比我帅”的评论

oracle rac

引用来自“红薯比我帅”的评论

mysql 负载中间件,mycat、360的Atlas
嗯 mycat 和 atlas也是目前流行的中间件,我太懒了,因为中间件还要考虑高可用性😂
红薯比我帅
红薯比我帅

引用来自“java_龙”的评论

引用来自“红薯比我帅”的评论

很少有公司会用主主吧,, 而且Keepalive 同一时间VIP也只会绑定一台机,如果主主同步通道挂了,没发现的话,两边数据同步会很麻烦的。

@红薯比我帅 我们当时考虑运维简单,请问还有合适的方案吗?

引用来自“红薯比我帅”的评论

oracle rac
mysql 负载中间件,mycat、360的Atlas
红薯比我帅
红薯比我帅

引用来自“java_龙”的评论

引用来自“红薯比我帅”的评论

很少有公司会用主主吧,, 而且Keepalive 同一时间VIP也只会绑定一台机,如果主主同步通道挂了,没发现的话,两边数据同步会很麻烦的。

@红薯比我帅 我们当时考虑运维简单,请问还有合适的方案吗?
oracle rac
j
java_龙

引用来自“红薯比我帅”的评论

很少有公司会用主主吧,, 而且Keepalive 同一时间VIP也只会绑定一台机,如果主主同步通道挂了,没发现的话,两边数据同步会很麻烦的。

@红薯比我帅 我们当时考虑运维简单,请问还有合适的方案吗?
红薯比我帅
红薯比我帅
很少有公司会用主主吧,, 而且Keepalive 同一时间VIP也只会绑定一台机,如果主主同步通道挂了,没发现的话,两边数据同步会很麻烦的。
j
java_龙

引用来自“王洪旭”的评论

互相设置为从节点这个方法,您是自己摸索的还是参考的官方资料?
我这边用的最多的就是Galera方案,虽然理论上支持多主,但实际应用还是会定一个主节点优先连接。
Galera集群是现在成熟的多主方案, 我们从业务承受量/ 运维难度和开发维护量考量, 选用了互为主备了, 在线上运行稳定
j
java_龙

引用来自“aruis”的评论

难道是我理解错了?你这个不应该叫故障转移高可用么? 双主的话,就是两个主节点均支持写入。
应该是我标题有歧义.. 这属于互为主备, 当时想做成双主同时写,有个主键自增问题,增加维护量,就选用了这种互为主备😅
王洪旭
王洪旭
互相设置为从节点这个方法,您是自己摸索的还是参考的官方资料?
我这边用的最多的就是Galera方案,虽然理论上支持多主,但实际应用还是会定一个主节点优先连接。
aruis
aruis
难道是我理解错了?你这个不应该叫故障转移高可用么? 双主的话,就是两个主节点均支持写入。
服务器集群之keepalived配置高可用(资料)

Linux集群概述 • 根据功能划分为两大类:高可用和负载均衡 • 高可用集群通常为两台服务器,一台工作,另外一台作为冗余,当提供服务的机器宕机,冗余将接替继续提供服务 • 实现高可用的开...

寰宇01
05/24
0
0
企业中MySQL高可用集群架构三部曲之MM+keepalived

各位老铁们,老张与大家又见面了。看到各位在博客里面给我的留言和访问量的情况,我很是欣慰,也谢谢大家对我的认可。我写这些博客,就是想把自己对于MySQL数据库的一些看法和自己平时的实战...

superZS
06/26
0
0
postgresql 高可用集群搭建资料

多种方案,含zookeeper方案 :PostgreSQL 流行 HA 方案 1. 自己实现高可用集群 有实例 有讲解!postgresql 高可用集群搭建 :PostgreSQLHAwithprimarystandby_2vip 2. pgpool 实现高可用集群...

刘阳0292
2017/10/12
0
0
Nginx(haproxy)+keepalived+Tomcat双主高可用负载均衡

周末的时候一个正在学Linux的朋友问我,高可用怎么玩?我和他微信了将近三个小时,把Nginx和haproxy双主高可用教给他了,今天突然想把这个给写进博客里,供给那些正在学习Linux系统的朋友们,...

ImproveMyself
07/31
0
0
MySQL共享存储主备模式利用Keepalived实现双机高可用

简单介绍 先简单说下MySQL主从复制与keepalived模式和MySQL共享存储与Keepalived模式 MySQL共享存储主备模式不同于MySQL主主复制模式,MySQL主主是利用MySQL自带的replication复制技术实现两...

HMLinux
2017/01/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

python机器学习及实践学习笔记1-如何打开ipynb后缀文件

python机器学习及实践学习笔记1-如何打开ipynb后缀文件 2017年02月22日 14:58:08 hustzhoutian 阅读数:45365更多 个人分类: 深度学习 需要安装ipython notebook,如果你已经安装Anaconda软...

linjin200
15分钟前
2
0
关于在vim中的查找和替换

1,查找 在normal模式下按下/即可进入查找模式,输入要查找的字符串并按下回车。 Vim会跳转到第一个匹配。按下n查找下一个,按下N查找上一个。 Vim查找支持正则表达式,例如/vim$匹配行尾的"...

休辞醉倒
20分钟前
1
0
in_array的坑

PHP in_array的坑 ps: 应该是弱类型语言的坑 php文档 顾名思义,in_array就是查找一个值是否在数组里面。 问题 事故现场 一个sql注入的测试代码如下: $type = $_GET['type'];$types = [2,3,...

o0无忧亦无怖
20分钟前
18
1
Yarn(包管理器) 的基本用法

Yarn是一个快速、可靠、安全的依赖管理工具,是npm的代替品。 Yarn对你的代码来说是一个包管理工具,你可以通过它使用全世界开发者的代码,或者分享自己的代码。 安装Yarn: 操作系统不同,安...

帝子兮
21分钟前
1
0
阿里云HBase全新发布X-Pack NoSQL数据库再上新台阶

一、八年双十一,造就国内最大最专业HBase技术团队 阿里巴巴集团早在2010开始研究并把HBase投入生产环境使用,从最初的淘宝历史交易记录,到蚂蚁安全风控数据存储。持续8年的投入,历经8年双...

阿里云官方博客
21分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部