MySQL 搭建双主复制服务 并 通过 HAProxy 负载均衡

一、MySQL 搭建双主复制高可用服务

在数据库管理中,数据的备份和同步是至关重要的环节,而双主复制(Dual Master Replication)作为一种高可用性和数据同步的解决方案,通过让两个数据库实例同时充当主服务器和从服务器,MySQL双主复制可以实现数据的双向同步,为数据库系统提供了更灵活和可靠的解决方案。即使其中一个主服务器发生故障,另一个主服务器仍然可以继续提供服务,确保系统的稳定性和可用性。这种数据同步方式不仅可以加强数据的备份与恢复能力,还可以提高系统的扩展性,适用于需要高度数据一致性和容错性的场景。

本文将介绍MySQL双主复制的配置过程,整体实现架构如下:

在这里插入图片描述

主机规划:

ip规划
172.19.222.20MySQL1
172.19.222.82MySQL2
172.19.222.84Haproxy

二、MySQL1 部署

mysql 的部署这里采用 docker + docker-compose 的方式快速实现,主要关注点在于配置文件:

首先编写 my.cnf 文件,写入如下内容:

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

# 主从同步
server-id = 1
log-bin = mysql-bin
sync_binlog = 1
binlog_checksum = none
binlog_format = mixed
auto-increment-increment = 2
auto-increment-offset = 1
slave-skip-errors = all
event_scheduler = 1
max_allowed_packet = 64M

# Custom config should go here
!includedir /etc/mysql/conf.d/

其中主从复制的参数解释如下:

  • server-id = 1:指定MySQL实例的唯一标识ID,用于在主从复制中区分不同的MySQL实例。

  • log-bin = mysql-bin:启用binlog日志,并指定binlog文件的前缀名为mysql-bin。binlog用于记录所有的数据更改操作,以便主从服务器之间进行数据同步。

  • sync_binlog = 1:表示每次事务提交时都将强制把binlog缓冲区的内容写入磁盘,确保binlog日志及时持久化,提高数据安全性。

  • binlog_checksum = none:设置binlog文件的校验方式为none,表示不对binlog文件进行校验和验证。

  • binlog_format = mixed:指定binlog日志的格式为mixed,即混合模式,根据具体情况自动选择使用statement或row格式记录数据变更。

  • auto-increment-increment = 2:设置自增长字段的增量值为2,用于在主从复制中避免自增字段冲突。

  • auto-increment-offset = 1:设置自增长字段的偏移量为1,用于在主从复制中避免自增字段冲突。

  • slave-skip-errors = all:当从服务器在执行SQL线程时发生错误时,跳过所有错误继续执行,这可能会导致数据不一致,谨慎使用。

  • event_scheduler = 1:启用Event Scheduler,用于执行预定的事件任务。

  • max_allowed_packet = 64M:设置最大允许的数据包大小为64MB,用于控制单个数据库请求或查询的数据包大小限制。

编写 docker-compose.yml 文件:

version: '2.0'

services:         
  mysql:
    restart: always
    image: mysql:8.0.20
    container_name: mysql
    volumes:
      - ./data:/var/lib/mysql
      - ./my.cnf:/etc/mysql/my.cnf
    command:
      --lower_case_table_names=1
      --character-set-server=utf8
      --sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=root123
      - TZ=Asia/Shanghai 

启动服务:

docker-compose up -d

下面使用客户端工具连接该数据库:

在这里插入图片描述

查看当前 master 状态:

show master status;

在这里插入图片描述
注意这里查询出来的 FilePosition 下面主从复制时会用到。

创建用于主从复制的用户:

CREATE USER 'replica'@'%' IDENTIFIED WITH mysql_native_password BY 'replica123';
GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%';
FLUSH PRIVILEGES;

在这里插入图片描述

三、MySQL2 部署

同样编写 my.cnf 文件,写入如下内容:

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

# 主从同步
server-id = 2
log-bin = mysql-bin
sync_binlog = 1
binlog_checksum = none
binlog_format = mixed
auto-increment-increment = 2
auto-increment-offset = 2
slave-skip-errors = all
event_scheduler = 1
max_allowed_packet = 64M

# Custom config should go here
!includedir /etc/mysql/conf.d/

配置和MySQL1差不多,主要注意 server-idauto-increment-offset 的区别。

编写 docker-compose.yml 文件:

version: '2.0'

services:         
  mysql:
    restart: always
    image: mysql:8.0.20
    container_name: mysql
    volumes:
      - ./data:/var/lib/mysql
      - ./my.cnf:/etc/mysql/my.cnf
    command:
      --lower_case_table_names=1
      --character-set-server=utf8
      --sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=root123
      - TZ=Asia/Shanghai 

启动服务:

docker-compose up -d

下面使用客户端工具连接该数据库:

在这里插入图片描述

查看当前 master 状态:

show master status;

在这里插入图片描述

同样这里查询出来的 FilePosition 下面主从复制时会用到。

创建用于主从复制的用户:

CREATE USER 'replica'@'%' IDENTIFIED WITH mysql_native_password BY 'replica123';
GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%';
FLUSH PRIVILEGES;

在这里插入图片描述

四、配置主主复制

MySQL 1 同步 MySQL 2

MySQL1 中执行 :

change master to master_host='172.19.222.82',master_user='replica',master_password='replica123',master_log_file='mysql-bin.000003',master_log_pos=152;

在这里插入图片描述

注意:其中 master_log_filemaster_log_pos 是上面部署 MySQL 2show master status; 查询的结果。

启动同步进程:

start slave;

在这里插入图片描述

查看同步状态:

show slave status\G

在这里插入图片描述
看到 Slave_IO_RunningSlave_SQL_Running 都为 Yes 则表示启动成功。

MySQL 2 同步 MySQL 1

MySQL 2 中执行 :

change master to master_host='172.19.222.20',master_user='replica',master_password='replica123',master_log_file='mysql-bin.000003',master_log_pos=811;

在这里插入图片描述

其中 master_log_filemaster_log_pos 是上面部署 MySQL 1show master status; 查询的结果。

启动同步进程:

start slave;

在这里插入图片描述

查看同步状态:

show slave status\G

在这里插入图片描述

同样观察 Slave_IO_RunningSlave_SQL_Running 都为 Yes 则表示启动成功。

五、测试主主复制

首先在 MySQL1 中创建数据库 testdb:

create database testdb;

在这里插入图片描述

然后在 MySQL 2 中查看数据库:

show databases;

在这里插入图片描述
可以正常查到 MySQL 1 中创建的数据库。

然后在 MySQL 2 中创建测试表:

use testdb;

create table `test` (
  `id` int not null auto_increment,
  `name` varchar(255) default null,
  primary key (`id`)
) engine=InnoDB default charset=utf8mb4 collate=utf8mb4_0900_ai_ci;

在这里插入图片描述

接着在 MySQL 1 中查看表:

use testdb;

show tables;

在这里插入图片描述
可以正常看到 MySQL 2 创建的表。

然后在 MySQL 1 中写入一条测试数据:

insert into test(name) values('小明');

在这里插入图片描述
然后到 MySQL 2 中查看表数据:

select * from test;

在这里插入图片描述
可以正常查到 MySQL 1 写入的数据。

六、配置 HAProxy 负载 MySQL 服务

经过上面测试已经证明主主复制功能正常,数据无论写在哪个数据库上都能同步给另外一台,下面通过 HAProxy 负载均衡代理 MySQL 1MySQL 2 ,对外提供统一的入口。

下载 HAProxy

yum install -y haproxy

覆盖修改 /etc/haproxy/haproxy.cfg 配制文件,注意修改 backend mysql-apiserver 下的两个 MySQLip

cat > /etc/haproxy/haproxy.cfg << EOF
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
    # to have these messages end up in /var/log/haproxy.log you will
    # need to:
    # 1) configure syslog to accept network log events.  This is done
    #    by adding the '-r' option to the SYSLOGD_OPTIONS in
    #    /etc/sysconfig/syslog
    # 2) configure local2 events to go to the /var/log/haproxy.log
    #   file. A line like the following can be added to
    #   /etc/sysconfig/syslog
    #
    #    local2.*                       /var/log/haproxy.log
    #
    log         127.0.0.1 local2
    
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon 
       
    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------  
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000
#---------------------------------------------------------------------
# mysql apiserver frontend which proxys to the backends
#--------------------------------------------------------------------- 
frontend mysql-apiserver
    mode                 tcp
    bind                 *:3306
    option               tcplog
    default_backend      mysql-apiserver    
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend mysql-apiserver
    mode        tcp
    balance     roundrobin
    server      master1   172.19.222.20:3306 check
    server      master2   172.19.222.82:3306 check
#---------------------------------------------------------------------
# collection haproxy statistics message
#---------------------------------------------------------------------
listen stats
    bind                 *:1080
    stats auth           admin:awesomePassword
    stats refresh        5s
    stats realm          HAProxy\ Statistics
    stats uri            /admin?stats
EOF

启动haproxy

systemctl start haproxy

设置开机自启:

systemctl enable haproxy

查看启动状态:

systemctl status haproxy

在这里插入图片描述

测试

通过 84 服务器连接 MySQL

在这里插入图片描述
查看前面创建的数据库、表、数据:

在这里插入图片描述

写入一条数据:

insert into test(name) values("小红");

分别到 MySQL 1MySQL 2查询数据:

在这里插入图片描述
在这里插入图片描述

都可以查询到数据,到此 MySQL 搭建双主复制服务 并 通过 HAProxy 负载均衡就结束了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/274648.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java 设计模式系列:行为型-状态模式

简介 状态模式&#xff08;State Pattern&#xff09;是一种行为型设计模式&#xff0c;允许一个对象在其内部状态改变时改变其行为。状态模式中类的行为是由状态决定的&#xff0c;在不同的状态下有不同的行为。 状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂…

智能合约语言(eDSL)—— 使用rust实现eDSL的原理

为理解rust变成eDSL的实现原理&#xff0c;我们需要简单了解元编程与宏的概念,元编程被描述成一种计算机程序可以将代码看待成数据的能力&#xff0c;使用元编程技术编写的程序能够像普通程序在运行时更新、替换变量那样操作更新、替换代码。宏在 Rust 语言中是一种功能&#x…

鸿蒙开发实战:【系统服务管理部件】

简介 samgr组件是OpenHarmony的核心组件&#xff0c;提供OpenHarmony系统服务启动、注册、查询等功能。 系统架构 图 1 系统服务管理系统架构图 目录 /foundation/systemabilitymgr ├── samgr │ ├── bundle.json # 部件描述及编译文件 │ ├── frameworks …

多特征变量序列预测(11) 基于Pytorch的TCN-GRU预测模型

往期精彩内容&#xff1a; 时序预测&#xff1a;LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较-CSDN博客 风速预测&#xff08;一&#xff09;数据集介绍和预处理-CSDN博客 风速预测&#xff08;二&#xff09;基于Pytorch的EMD-LSTM模型-CSDN博客 风速预测&#xff…

基于springboot+vue的智慧生活商城系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

Stability AI 3D:开创3D视觉技术新篇章,提升多视角连贯性与生成质量

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

杰发科技AC7801——Flash数据读取

0. 简介 因为需要对Flash做CRC校验&#xff0c;第一步先把flash数据读出来。 1. 代码 代码如下所示 #include "ac780x_eflash.h" #include "string.h" #define TestSize 1024 ///< 4K #define TestAddressStart 0x08000000 uint8_t Data[7000]; int…

【NLP笔记】Transformer

文章目录 基本架构EmbeddingEncoderself-attentionMulti-Attention残差连接LayerNorm DecoderMask&Cross Attention线性层&softmax损失函数 论文链接&#xff1a; Attention Is All You Need 参考文章&#xff1a; 【NLP】《Attention Is All You Need》的阅读笔记 一…

多数据源 - dynamic-datasource | 集成 HikariCP 连接池

文章目录 连接池集成简介HikariCP 连接池默认 HikariCP 配置自定义 HikariCP 配置Druid 连接池BeeCp 连接池DBCP2 连接池JNDI 数据源🗯️ 上节回顾:上一节中,实现了 dynamic-datasource 的快速入门。 👉 本节目标:在上一节的基础上,集成 HikariCP 数据库连接池并介绍原…

es 集群安全认证

参考文档&#xff1a;Configure security for the Elastic Stack | Elasticsearch Guide [7.17] | Elastic ES敏感信息泄露的原因 Elasticsearch在默认安装后&#xff0c;不提供任何形式的安全防护不合理的配置导致公网可以访问ES集群。比如在elasticsearch.yml文件中,server…

【SpringSecurity】十三、基于Session实现授权认证

文章目录 1、基于session的认证2、Demosession实现认证session实现授权 1、基于session的认证 流程&#xff1a; 用户认证成功后&#xff0c;服务端生成用户数据保存在session中服务端返回给客户端session id (sid&#xff09;&#xff0c;被客户端存到自己的cookie中客户端下…

C# 使用OpenCvSharp4将Bitmap合成为MP4视频的环境

环境安装步骤&#xff1a; 在VS中选中项目或者解决方案&#xff0c;鼠标右键&#xff0c;选择“管理Nuget包”&#xff0c;在浏览窗口中搜索OpenCVSharp4 1.搜索OpenCvSharp4,选择4.8.0版本&#xff0c;点击安装 2.搜索OpenCvSharp4.runtime.win,选择4.8.0版本&#xff0c;点…

O2OA红头文件流转与O2OA版式公文编辑器基本使用

O2OA开发平台在流程管理中&#xff0c;提供了符合国家党政机关公文格式标准&#xff08;GB/T 9704—2012&#xff09;的公文编辑组件&#xff0c;可以让用户在包含公文管理的项目实施过程中&#xff0c;轻松地实现标准化公文格式的在线编辑、痕迹保留、手写签批等功能。并且可以…

vue-router(v4.0) 基础3

编程式导航 除了使用 <router-link> 创建 a 标签来定义导航链接&#xff0c;我们还可以借助 router 的实例方法&#xff0c;通过编写代码来实现。导航到不同的位置 示例该方法的参数可以是一个字符串路径&#xff0c;或者一个描述地址的对象。例如&#xff1a; // 字符串…

Panasonic松下PLC如何数据采集?如何实现快速接入IIOT云平台?

在工业自动化领域&#xff0c;数据采集与远程控制是提升生产效率、优化资源配置的关键环节。对于使用Panasonic松下PLC的用户来说&#xff0c;如何实现高效、稳定的数据采集&#xff0c;并快速接入IIOT云平台&#xff0c;是摆在他们面前的重要课题。HiWoo Box工业物联网关以其强…

fs方法举例

fs.readFile() 读取文件 const fs require(node:fs) const path require(node:path) const s path.resolve(__dirname, ./hello.txt) const buf fs.readFileSync(s) console.log(buf.toString())输出的Buffer对象 用toString()方法转字符串之后 fs.appendFile() 创建新…

景联文科技:提供通用多模态数据,助力AI多模态领域实现飞跃式发展

回顾2023年&#xff0c;以ChatGPT为代表的通用人工智能大模型在全球范围内掀起了新一轮人工智能产业发展浪潮&#xff0c;我国人工智能大模型市场呈现百“模”争鸣、日新月异的迅猛发展态势。 根据大模型之家、钛媒体数据&#xff0c;2023年中国大模型市场规模达到147亿人民币&…

CMU 10-414/714: Deep Learning Systems --hw3

实现功能 在ndarray.py文件中完成一些python array操作 我们实现的NDArray底层存储就是一个一维向量&#xff0c;只不过会有一些额外的属性&#xff08;如shape、strides&#xff09;来表明这个flat array在维度上的分布。底层运算&#xff08;如加法、矩阵乘法&#xff09;都…

《优化接口设计的思路》系列:第九篇—用好缓存,让你的接口速度飞起来

一、前言 大家好&#xff01;我是sum墨&#xff0c;一个一线的底层码农&#xff0c;平时喜欢研究和思考一些技术相关的问题并整理成文&#xff0c;限于本人水平&#xff0c;如果文章和代码有表述不当之处&#xff0c;还请不吝赐教。 作为一名从业已达六年的老码农&#xff0c…

Android14音频进阶:AudioFlinger究竟如何混音?(六十三)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只…
最新文章