搭建 MySQL 双主集群涉及多个配置步骤,以及对于可能出现的问题的理解和解决。下面将详细说明搭建过程的每个步骤。

前提条件

  1. 环境准备:准备两台服务器(物理或虚拟),并确保它们可以互相通信(例如,通过内部网络)。
  2. 软件准备:在两台服务器上安装相同版本的 MySQL。建议使用官方稳定版。
  3. 备份:在生产环境中操作时,请务必备份所有重要数据。

搭建过程

1. 修改配置文件

服务器A(master1)配置

[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-do-db = your_database_name
sync_binlog = 1
binlog_format = mixed
relay_log = relay-bin
relay_log_index = relay-bin.index
auto_increment_increment = 2
auto_increment_offset = 1 # 为复制设置监听IP和端口(如果非默认3306端口)
# bind-address = your_server_ip
# port = your_port_number

服务器B(master2)配置

[mysqld]
server-id = 2
log-bin = mysql-bin
binlog-do-db = your_database_name
sync_binlog = 1
binlog_format = mixed
relay_log = relay-bin
relay_log_index = relay-bin.index
auto_increment_increment = 2
auto_increment_offset = 2 # 为复制设置监听IP和端口(如果非默认3306端口)
# bind-address = your_server_ip
# port = your_port_number

请替换 your_database_name 为你需要复制的数据库名称,如果需要复制多个数据库,可以使用多个 binlog-do-db 配置项,或者使用 replicate-do-db 在 SLAVE 端进行过滤。

注意:在实际部署时,根据网络安全和性能需要,可以调整监听IP和端口。

2. 创建复制用户

在两个服务器上的 MySQL 命令行执行以下 SQL 命令来创建一个专门用于复制的用户。

GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%' IDENTIFIED BY 'strong_password';
FLUSH PRIVILEGES;

确保替换 'replication_user' 为你希望使用的复制用户名,并设置 'strong_password' 为强密码。

3. 锁定表并获取二进制日志位置

在服务器A上执行

FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

记录下返回的 FilePosition 值。

在服务器B上也执行同样的步骤,但记录服务器B的值时不要忘记先在服务器A上执行 UNLOCK TABLES; 命令解锁表。

4. 配置复制

在服务器B上设置复制服务器A的数据

CHANGE MASTER TO
MASTER_HOST='master1_ip_address',
MASTER_USER='replication_user',
MASTER_PASSWORD='strong_password',
MASTER_LOG_FILE='master1_binlog_file',
MASTER_LOG_POS=master1_binlog_position;

'master1_ip_address' 替换为服务器A的IP地址,'strong_password' 替换为之前设置的密码,以及 'master1_binlog_file'master1_binlog_position 分别替换为在服务器A上执行 SHOW MASTER STATUS; 命令后获取的文件名和位置。

在服务器A上执行相同操作来设置服务器B的数据

5. 启动复制

在两台服务器上分别执行:

sql复制代码

START SLAVE;

6. 检查复制状态

在两台服务器上执行以下命令检查复制状态:

sql复制代码

SHOW SLAVE STATUS \G;

确认以下两个字段的值为 Yes

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

如果不是 Yes,则查看 Last_Error 字段的错误信息,根据提示解决相应的问题。

7. 安装并配置 keepalived

在每台服务器上安装 keepalived,并编辑其配置文件(通常是 /etc/keepalived/keepalived.conf),设置虚拟 IP 地址、优先级和检查脚本等。

例如:

! Configuration File for keepalived  

global_defs {
notification_email {
admin@yourdomain.com
}
notification_email_from keepalived@yourdomain.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
} vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.124.151.23
}
}

在另一台服务器上,你需要将 state 设置为 BACKUP,并相应地调整 priority

确保 interface 指定了正确的网络接口,virtual_ipaddress 指定了你要使用的虚拟 IP 地址。

8. 启动 keepalived

在两台服务器上分别启动 keepalived 服务。

9. 测试故障转移

模拟一台服务器故障,检查 keepalived 是否能够成功将虚拟 IP 地址漂移到另一台服务器上,并且 MySQL 服务仍然可用。

测试双主复制

在两个 MySQL 服务器上创建或更新数据库中的数据,并验证这些更改是否成功复制到了另一台服务器上。

故障转移和监控

对于双主复制集群,需要考虑故障转移策略以及使用工具进行监控。你可以使用 MHA (Master High Availability Manager) 或其他类似工具来实现自动故障转移。同时,定期监控两台服务器的复制状态和健康状况非常重要,可以使用 Percona Monitoring and Management (PMM) 或自定义的监控脚本来完成这个任务。

注意

  • 数据一致性:务必确保在开始搭建之前两个节点的数据是一致的。
  • 自增长ID:设置 auto_increment_incrementauto_increment_offset 可以避免 ID 冲突。
  • 冲突解决:在实际操作中可能会遇到复制冲突,例如,在两个主节点上同时修改同一行数据。你需要为这种情况设置解决策略。
  • 安全性:复制用户需要足够的安全保护,包括限制访问主机和使用强密码。
  • 网络延迟:网络延迟可能会导致数据复制延迟,监控并确保网络连接质量是良好的实践。
  • 备份策略:双主复制不应该替代数据备份。你应该实施一个稳健的备份和恢复策略来保护数据。

MySQL 双主集群搭建的更多相关文章

  1. Linux下MySQL/MariaDB Galera集群搭建过程【转】

    MariaDB介绍 MariaDB是开源社区维护的一个MySQL分支,由MySQL的创始人Michael Widenius主导开发,采用GPL授权许可证. MariaDB的目的是完全兼容MySQL,包 ...

  2. MySQL之PXC集群搭建

    一.PXC 介绍 1.1 PXC 简介 PXC 是一套 MySQL 高可用集群解决方案,与传统的基于主从复制模式的集群架构相比 PXC 最突出特点就是解决了诟病已久的数据复制延迟问题,基本上可以达到实 ...

  3. Mysql Innodb cluster集群搭建

    之前搭建过一个Mysql Ndb cluster集群,但是mysql版本是5.7的,看到官网上mysql8的还是开发者版本,所以尝试搭建下mysql Innodb cluster集群. MySQL的高 ...

  4. MySQL优化之——集群搭建步骤具体解释

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46833179 1 概述 MySQL Cluster 是MySQL 适合于分布式计算 ...

  5. RocketMQ4.7.1双主双从集群搭建

    导读 上一集我们已经学会了SpringBoot整合RocketMQ点我直达,今天我们来搭建双主双从高性能MQ服务集群. 简介 主从架构 Broker角色,Master提供读写,Slave只支持读,Co ...

  6. Linux下MySQL/MariaDB Galera集群搭建过程

    MariaDB介绍 MariaDB是开源社区维护的一个MySQL分支,由MySQL的创始人Michael Widenius主导开发,采用GPL授权许可证. MariaDB的目的是完全兼容MySQL,包 ...

  7. springboot+mysql实现quartz集群搭建

    一.基本概念 Quartz核心的概念:scheduler任务调度.Job任务.Trigger触发器.JobDetail任务细节. scheduler任务调度: 是最核心的概念,需要把JobDetail ...

  8. MySQL集群系列1:2台机器搭建双主集群

    先配置静态IP 2台机器mysql密码一样,最好在同一局域网内,最好在mysql刚安装时就配置好,后面有数据了不好同步. 本文实现了2台机器mysql数据同步成功: 配置my.cnf 先关闭防火墙 s ...

  9. MySQL集群系列2:通过keepalived实现双主集群读写分离

    在上一节基础上,通过添加keepalived实现读写分离. 首先关闭防火墙 安装keepalived keepalived 2台机器都要安装 rpm .el6.x86_64/ 注意上面要替换成你的内核 ...

  10. 转mysql复制主从集群搭建

    最近搭了个主从复制,中间出了点小问题,排查搞定,记录下来 1环境:虚拟机:OS:centos6.5Linux host2 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 ...

随机推荐

  1. 14.2 Socket 反向远程命令行

    在本节,我们将继续深入探讨套接字通信技术,并介绍一种常见的用法,实现反向远程命令执行功能.对于安全从业者而言,经常需要在远程主机上执行命令并获取执行结果.本节将介绍如何利用 _popen() 函数来启 ...

  2. P7167 [eJOI2020 Day1] Fountain 题解

    题目链接:Fountain 很不错的基础算法组合题:单调栈+倍增 首先考虑到一个事实,就是下面第一个比当前半径大的位置会成为移动的第一次落脚点,抽象下就是下面出现的第一次比自身大的半径,这个问题显然可 ...

  3. DBGRIDEH 底部多列 发现

    1.设置底部行数 2.点击footers 单独对每一行进行设置 3.单独对这两行 进行设置 5.看下辅助 所以用的时候可以这样用:WeiTopTradeShow.FieldColumns['top_x ...

  4. MySQL的执行流程和执行顺序

    MySQL执行过程以及顺序 前言:MySQL在我们的开发中基本每天都要面对的,作为开发中的数据的来源,MySQL承担者存储数据和读写数据的职责.因为学习和了解MySQL是至关重要的,那么当我们在客户端 ...

  5. Power BI 10 DAY

    Power BI 上下文 筛选上下文只管筛选,行上下文只管迭代,两者互不干涉,各司其职 计算列操作会自动创建行上下文 度量值不会自动创建行上下文,需要人为使用迭代函数进行行上下文的创建 (迭代函数本身 ...

  6. JS leetcode 至少是其他数字的两倍的最大数 解答思路分析

    壹 ❀ 引 刷leetcode的第二天,那么今天做的也是一道难度为简单的题目至少是其他数字的两倍的最大数,老规矩,先说说我的实现思路后,再来分析优质答案,原题如下: 在一个给定的数组nums中,总是存 ...

  7. 使用clipboard插件结合layui实现的一键复制按钮

    说明 之前开发了个基金分析的网页,主要是方便几个朋友买卖基金做个参考.这里面基金代码是存储在浏览器cookie中的,也就是说假如我换了浏览器就没法查了,最方便的就是一键复制代码粘贴到另外一个浏览器中一 ...

  8. F - Subarrays题解

    F - Subarrays 题意:给你一个序列,问这个序列里有多少个子串的和能被k整除. 思路:求前缀和,然后每个位置对k取模,模数相等的位置之间,是一个满足条件的字串. 因为求的是前缀和,所以取模后 ...

  9. Linux Ubuntu 遇到的一些问题

    Ubuntu 国内下载地址:https://mirrors.tuna.tsinghua.edu.cn/# 1. 安装一些常用的软件时,需要下载 amd.deb 类型的包,并使用下面命令安装 sudo ...

  10. win32- GetMessage的使用

    BOOL bRet; while( (bRet = GetMessage( &msg, hWnd, 0, 0 )) != 0) { if (bRet == -1) { // handle th ...