MySQL主主复制+Keepalived 打造高可用MySQL集群

2023-11-13

转载地址:http://www.linuxidc.com/Linux/2014-09/106570.htm


为了响应公司需求,打造出更安全的mysql集群,能够实现mysql故障后切换,研究了几天终于有了成果,一起分享一下。

首先介绍一下这套集群方案实现的功能

1、mysql服务器故障后自动转移,修好后自动切回

2、mysql服务故障自动转移,修好后自动切回

3、可以实现在几秒钟内转移

以下内容均是实验环境,请根据实际情况修改响应参数

生产环境MySQL主主同步主键冲突处理 http://www.linuxidc.com/Linux/2013-07/86890.htm

MySQL + KeepAlived + LVS 单点写入主主同步高可用架构实验 http://www.linuxidc.com/Linux/2013-05/84002.htm

MySQL 主主同步配置 http://www.linuxidc.com/Linux/2013-05/83815.htm

CentOS 6.3下MySQL主从复制笔记 http://www.linuxidc.com/Linux/2013-06/85983.htm

Linux下的MySQL主主复制 http://www.linuxidc.com/Linux/2013-10/91683.htm

实验环境

mysql1 ip:10.1.1.20

mysql2  ip:10.1.1.21

mysql vip:10.1.1.25

三台机器均安装centos 6.5 32位(虚拟机环境)

实验开始!!!

一、安装mysql,并打造主主同步。

相信主从同步大家都会做,一样的道理,主主同步就是两台机器互为主的关系,在任何一台机器上写入都会同步。

安装mysql的过程不解释,yum就好啦

配置主主同步

1.配置 /etc/my.cnf

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

user=mysql

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0

log-bin=binlog  #开启binlog功能

log-bin-index=binlog.index

sync_binlog=0

server_id = 1    #两台机器不能重复,一个1 一个2 就好

 

[mysqld_safe]

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid


2.分别在两台机器上配置同步账号

10.1.1.20机器上:

[root@localhost ~]# mysql

Welcome to the MySQL monitor. Commands end with; or \g.

Your MySQL connection id is 2

Server version: 5.0.77-log Sourcedistribution

 

Type 'help;' or '\h' for help. Type '\c' toclear the buffer.

 

mysql> GRANT replication slave ON *.* TO'ab'@'%' identified by '123';

Query OK, 0 rows affected (0.00 sec)

 

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

10.1.1.21机器上:

[root@localhost ~]# mysql

Welcome to the MySQL monitor. Commands end with; or \g.

Your MySQL connection id is 2

Server version: 5.0.77-log Sourcedistribution

 

Type 'help;' or '\h' for help. Type '\c' toclear the buffer.

 

mysql> GRANT replication slave ON *.* TO'ab'@'%' identified by '123';

Query OK, 0 rows affected (0.00 sec)

 

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)


注:由于本文是实验环境下编写,所以没考虑任何安全性问题,同步账号也是最高权限,请根据实际情况设置响应权限!!

3.设置同步

10.1.1.20机器上:

mysql> flush tables with read lock;

mysql> show master status;

+---------------+----------+--------------+------------------+

| File | Position | Binlog_Do_DB |Binlog_Ignore_DB |

+---------------+----------+--------------+------------------+

| binlog.000003 | 365 | | |

+---------------+----------+--------------+------------------+

1 row in set (0.03 sec)

mysql> unlock tables;

Query OK, 0 rows affected (0.03 sec)

10.1.1.21机器上:

mysql> change master tomaster_host='10.1.1.20', master_port=3306, master_user='ab',master_password='123', master_log_file='binlog.000003',master_log_pos=365;

Query OK, 0 rows affected (0.06 sec)

mysql> start slave;

Query OK, 0 rows affected (0.00 sec)

mysql> show slave status \G  #执行这命令后 注意观察下面这两个参数,必须要都是yes才行

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

同样的 反过来做相同操作

10.1.1.21机器上:

mysql> flush tables with read lock;

mysql> show master status;

+---------------+----------+--------------+------------------+

| File | Position | Binlog_Do_DB |Binlog_Ignore_DB |

+---------------+----------+--------------+------------------+

| binlog.000004 | 207 | | |

+---------------+----------+--------------+------------------+

1 row in set (0.03 sec)

mysql> unlock tables;

Query OK, 0 rows affected (0.03 sec)

10.1.1.20机器上:

 

mysql> change master tomaster_host='10.1.1.21', master_port=3306, master_user='ab',master_password='123', master_log_file='binlog.000004',master_log_pos=207;

Query OK, 0 rows affected (0.06 sec)

mysql> start slave;

Query OK, 0 rows affected (0.00 sec)

mysql> show slave status \G  #执行这命令后 注意观察下面这两个参数,必须要都是yes才行

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

介此,主主同步打造完成,可以简单测试一下,分别在两个机器上写数据 看看会不会同步到另一台机器上

PS:如果报错  Slave_IO_Running: NO  可以检查同步的账号是否创建正常!

二、安装keepalived 并设置监控

keepalived是安装在两台MySQL服务器上的

首先安装keepalived 过程不解释就正常解压安装就好

安装后配置 vim /etc/keepalived/keepalived.conf 内容如下

10.1.1.20的配置文件

! 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 127.0.0.1

  smtp_connect_timeout 30

  router_id LVS_DEVEL

}

 

vrrp_instance VI_1 {

  state backup      #两台配置此处均是BACKUP

  interface eth0

  virtual_router_id 51

  priority 100      #优先级,另一台改为90 

  advert_int 1

  nopreempt          #不抢占,只在优先级高的机器上设置即可,优先级低的机器不设置

  authentication {

      auth_type PASS

      auth_pass 1111

  }

  virtual_ipaddress {

      10.1.1.25

  }

}

 

virtual_server 10.1.1.25 3306 {

  delay_loop 6

  lb_algo wrr

  lb_kind DR

  persistence_timeout 50        #会话保持时间 

  protocol TCP

 

real_server 10.1.1.20 3306 {

      weight 3

      notify_down /tmp/nimei.sh    #检测到mysql服务挂了就执行这个脚本(脚本要自己写哈)

      TCP_CHECK {

      connect_timeout 10        #连接超时时间

      nb_get_retry 3            #重连次数 

      delay_before_retry 3      #重连间隔时间

      connect_port 3306        #健康检查端口 

        }

      }

}


10.1.1.21 的配置文件

! 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 127.0.0.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 {

      10.1.1.25

  }

}

 

virtual_server 10.1.1.25 3306 {

  delay_loop 6

  lb_algo wrr

  lb_kind DR

  persistence_timeout 50

  protocol TCP

 

real_server 10.1.1.21 3306 {

      weight 3

      notify_down /tmp/nimei.sh

      TCP_CHECK {

      connect_timeout 10

      nb_get_retry 3

      delay_before_retry 3

      connect_port 3306

          }

      }

编写监控mysql服务是否挂了的脚本,按照上面配置文件的位置编写脚本。

vim /tmp/nimei.sh

#!/bin/sh 

pkill keepalived

脚本很简单啊 就一句,目的是当keepalived检测到mysql服务挂了之后触发这个脚本,杀死keepalived进程,让另一台机器接管

好 修改后启动keeplived服务

介此整个集群搭建完成

三、测试

找一台机器用虚拟ip连接mysql

[root@localhost html]# mysql -uab  -h 10.1.1.25 -p123

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 736

Server version: 5.1.66-log Source distribution

 

Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.

 

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

这样成功连上了,然后你可以任意关闭某台机器,或者某台机器的mysql服务,看看还能不能连上!!

谢谢!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL主主复制+Keepalived 打造高可用MySQL集群 的相关文章

  • MySQL - 从表中删除空值行

    我有一张桌子 user 有超过 60 列 其中一列的名称是 用户名 我想删除其中的行username字段为空或NULL 我怎样才能做到这一点 谢谢你 Try this DELETE FROM user WHERE username IS N
  • 使用 cfchart 标签在单个饼图中显示多个查询的数据

    请考虑以下代码 现在我的代码中有以下代码 cfm页面内的 tag DataSource xx xx x xx Name of the database sgemail Name of the relevant column event vc
  • MySQL 将 ÅäÖ 视为 AAO?

    这两个查询给了我完全相同的结果 select from topics where name Harligt select from topics where name H rligt 这怎么可能 看起来mysql在搜索时会将 翻译成aao
  • Mysql获取特定表的最后一个id

    我必须从特定的插入表中获取最后的插入 ID 可以说我有这个代码 INSERT INTO blahblah test1 test 2 VALUES test1 test2 INSERT INTO blahblah2 test1 test 2
  • CakePHP - 获取上次运行的查询

    我想获取 CakePHP 运行的最后一个查询 我无法在 core php 中打开调试 也无法在本地运行代码 我需要一种方法来获取最后一个 sql 查询并将其记录到错误日志中而不影响实时站点 该查询失败但正在运行 像这样的事情会很棒 this
  • INNER JOIN 后从多个表获取最大日期

    我有以下两个表 table 1 ID HOTEL ID NAME 1 100 xyz 2 101 pqr 3 102 abc table 2 ID BOOKING ID DEPARTURE DATE AMOUNT 1 1 2013 04 1
  • MySQL 帮助:如何查找客户的所有订单,直到价格 <= 20 且状态='未付款'

    我认为通过提供以下示例可以更好地理解我的问题 我有一个包含以下数据的表 orderid Price username paymentstatus 1 10 john unpaid 2 10 john unpaid 4 10 john unp
  • 日志中每天的每周活跃用户数

    我想知道是否有人可以帮助我使用一些 SQL 来返回两天或更长时间内登录到数据库表的唯一用户数量 让我们使用 7 天作为参考 我的日志表在每一行中包含时间戳 ts 和 user id 表示该用户当时的活动 以下查询返回此日志中的每日活跃用户数
  • MySQL 跨表计数(*) 查询帮助

    SELECT name COUNT AS count FROM t1 t2 WHERE t2 id t1 id GROUP BY t2 id 我想从 t1 获取名称以及 t2 中 id 与 t1 相同的行数 到目前为止我已经得到了上面的内容
  • Laravel Schema Builder 改变存储引擎

    我正在尝试更改表并将其存储引擎更改为InnoDb 当我跑步时php artisan migrate它完成且没有错误 然而 当我检查 Sequel Pro 中的存储引擎时 没有任何变化 public function up Schema ta
  • 使用数据库进行日志记录

    大多数日志似乎都是纯文本形式 而不是放入 MySQL 其他类型的数据库中 这是否有原因 在我看来 将它们放入数据库将使分析变得非常非常容易 但这会以牺牲速度还是其他什么为代价 我不太关心可移植性 显然你会有数据库连接的文本日志 我能想到两大
  • 对于相同的查询,MySQL Workbench 比 Python 快得多

    MySQL Workbench 中的以下查询需要 0 156 秒才能完成 SELECT date time minute price id FROM minute prices WHERE contract id 673 AND TIMES
  • 退出 PHP 脚本后终止或停止 MySQL 查询

    我在工作中运行一个统计服务器 由于运行的查询量很大 该服务器有时会变得非常慢 我们的营销团队使用它作为主要统计工具 团队中的某些人有时会在脚本结束之前退出脚本 通过关闭浏览器或选项卡 同时 SQL 查询继续执行 当有人关闭或离开 PHP 脚
  • MySQL 最佳实践:SELECT 子递归尽可能提高性能?

    我想选择一个根项目及其子项 使其性能尽可能高 我更喜欢使用嵌套集模型 但这次表结构遵循邻接模型 有关嵌套集和邻接模型的更多信息 http mikehillyer com articles managing hierarchical data
  • Postgresql 的 SQL_NO_CACHE?

    MySQL 关键字是否有等效的 postgresqlSQL NO CACHE 或 SQL Serverdbcc drop clean buffers 即您可以简单地将其包含在 SQL 语句中或作为脚本的一部分吗 UPDATE 这个问题 查看
  • 我应该定义索引(A)和索引(B),还是索引(A,B),或者两者都定义?

    在我的表中 我有两个密切相关的列 A 和 B 我应该考虑哪些因素来决定是否创建 索引 A 和索引 B 索引 A B 以上两者 如果我 仅使用类似的查询where A 5 and B 10 并且从不喜欢where A 5 也可以使用类似的查询
  • 拉拉维尔; “SQLSTATE[HY000] [2002] 连接被拒绝”

    我在 OSX 主机上设置了 homestead 2 0 并使用 Sequel Pro 我可以进行迁移并确认数据已在Sequel Pro中迁移 因此看起来数据库连接没有问题 但是 一旦我尝试从 Laravel 4 2 应用程序获取数据 它就无
  • 如何比较行内的重叠值?

    我似乎对这个 SQL 查询有问题 SELECT FROM appts WHERE timeStart gt timeStart AND timeEnd lt timeEnd AND dayappt boatdate 时间格式为军用时间 物流
  • 删除重复的行并需要在mysql中保留所有行中的一个[重复]

    这个问题在这里已经有答案了 我想删除基于两列的重复行 但需要保留所有行 1 行 重复行可以多于两行 例如 ID NAME PHONE 1 NIL 1234 2 NIL 1234 3 NIL 1234 4 MES 5989 我想从上面 3 行
  • 使用 md5 加密的 PHP 和 Mysql 查询出现问题

    我使用普通的 php mysql 插入查询并使用 md5 加密密码 这是插入查询 sql mysql query INSERT INTO user username password role approved values usernam

随机推荐

  • vue3中采用pinia集中管理数据

    Pinia 起始于 2019 年 11 月左右的一次实验 其目的是设计一个拥有组合式 API 的 Vue 状态管理库 从那时起 我们就倾向于同时支持 Vue 2 和 Vue 3 并且不强制要求开发者使用组合式 API 下载依赖 yarn a
  • go基础+面试题(持续更新中...)

    go基础 面试题 Go基础 main 变量 变量的声明 局部变量 全局变量 常量与iota 常量 string和 byte如何取舍 string与nil类型的问题 Iota编译原理 内存四区 struct结构体 函数 make与new的区别
  • globbing

    1 globbing是什么 globbing表示通配符 BASH支持文件名通配 2 globbing常用列表及使用心得 序号 符号 使用心得 1 表示任意一个字符 注意与常规的正则表达式的区别 正则中 表示可选的 2 表示任意长度任意字符
  • STM32HAL----USB模拟串口(VCP)

    想要实现的功能是 USB模拟串口收发数据 串口助手发送数据至MCU MCU接收后返回给串口助手 当初是想用标准库做这个功能的 但是因为后来了解到STM32CubeMX这个软件 在尝试之后实在是感觉 太方便了 所以 并没有使用标准库 而是直接
  • Python---函数

    PP2study5 一 函数定义 二 函数调用 三 可变对象和不可变对象的使用 四 参数传递 4 1 以下是调用函数时可使用的正式参数类型 1 必需参数 2 关键字参数 3 默认参数 4 不定长参数 4 2 return 一 函数定义 Py
  • autoReconnect及查看和连接时间有关的系统变量与通常产生的异常

    MySQL官方不推荐使用autoReconnect true 参见http bugs mysql com bug php id 5020 注意这里说的版本是3 0 14 production 需要另外找别的办法来解决超过8小时 链接断开的问
  • 【数据结构和算法】字符串操作

    作者 Linux猿 简介 CSDN博客专家 华为云享专家 Linux C C 云计算 物联网 面试 刷题 算法尽管咨询我 关注我 有问题私聊 关注专栏 数据结构和算法成神路 精讲 优质好文持续更新中 欢迎小伙伴们点赞 收藏 留言 目录 一
  • CAsyncSocket进行UDP通信

    CAsyncSocket进行UDP通信 客户端代码 CString m ServerIP CString m ClientIP int m ClientPort CString m ReceiveData UINT m ServerPort
  • 基于用户的协同过滤算法(及3种计算用户相似度的方法)

    本文参考 推荐系统实践 中基于用户的协同过滤算法内容 基于老师上课讲解 自己实现了其中的代码 了解了整个过程 UserCF算法实现 实现原理 模拟数据 两两用户之间计算 优化后的倒查表方式计算用户相似度 采用惩罚热门物品和倒查表方式计算用户
  • vue+websocket+express+mongodb实战项目(实时聊天)(一)

    vue websocket express mongodb实战项目 实时聊天 一 在原来基础上增加了多个聊天室以及发送图片 vue websocket express mongodb实战项目 实时聊天 二 http blog csdn ne
  • ARM中的程序状态寄存器(CPSR)

    31 30 29 28 27 8 7 6 5 4 3 2 1 0 N Z C V 保留 I F T M4 M3 M2 M1 M0 N Negative Less Than I IRQ disable Z Zero F FIQ disable
  • Caffe在Linux下的安装,编译,实验

    第一部分 Caffe 简介 caffe是有伯克利视觉和学习中心 BVLC 开发 作者是伯克利博士贾杨清 caffe是一个深度学习 deep learning 框架 其具有易读 快速和模块化思想 第二部分 Caffe安装与配置 2 1 配置环
  • 彻底卸载、devtools安装问题、扩展程序的使用

    目录 一 彻底卸载 MySQL Mongo数据库 二 vue devtools 三 扩展程序的使用 一 彻底卸载 MySQL Mongo数据库 停止服务1 cmd命令 net stop mysql mongo 停止服务2 如下图 这个好 控
  • ElasticSearch笔记整理(三):Java API使用与ES中文分词

    TOC pom xml 使用maven工程构建ES Java API的测试项目 其用到的依赖如下
  • Packing data with Python

    Packing data with Python 06 Apr 2016 Defining how a sequence of bytes sits in a memory buffer or on disk can be challeng
  • EasyAR 开发实例---AR礼物(简单demo)

    一个节日礼物效果 显示模型 在本次的案例中 我使用的是unity5 6 3版本 EasyAR 为2 0 用1 0的版本 在渲染那块有问题 导入SDK 到EasyAR官网 http www easyar cn view download ht
  • minitab数据处理软件

    下载地址 http www xue51 com soft 3430 html 1 介绍 Minitab软件是现代质量管理统计的领先者 全球六西格玛实施的共同语言 以无可比拟的强大功能和简易的可视化操作深受广大质量学者和统计专家的青睐 Min
  • Springboot 指定日志打印文件夹

    日志打印作为日常开发是必不可少了 SpringBoot项目中引入spring boot starter 这里面就包含了日志所需要的依赖 下面是两种方法打印日志 都很简单 亲测有效 方法一 直接在application yml中添加配置 指定
  • java 获取两个List集合的交集

    获取两个List集合的交集 可以使用Java中的retainAll方法来获取两个List的交集 假设有两个List类型的集合list1和list2 代码如下 List
  • MySQL主主复制+Keepalived 打造高可用MySQL集群

    转载地址 http www linuxidc com Linux 2014 09 106570 htm 为了响应公司需求 打造出更安全的mysql集群 能够实现mysql故障后切换 研究了几天终于有了成果 一起分享一下 首先介绍一下这套集群