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

news2024/11/28 19:04:09

一、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.coloradmin.cn/o/1530111.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WiFi是可以连接网络,但是在Pixel 手机上就连接提示受阻,无法上网-解决方法

1&#xff0c;通过USB连接手机&#xff0c;然后通过adb命令执行 adb shell settings delete global captive_portal_mode adb shell settings put global captive_portal_mode 0 adb shell settings get global captive_portal_mode adb shell settings delete global capti…

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

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

【鸿蒙系统】 ---Harmony 鸿蒙编译构建指导(一)

&#x1f48c; 所属专栏&#xff1a;【鸿蒙系统】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢…

基于Lealfet.js展示Turf.js生成的平滑曲线实践

目录 前言 一、问题的由来 1、创建网页框架 2、创建map对象 3、构建点位&#xff0c;生成路线 二、Turf.js平滑曲线改造 1、官网方法介绍 2、0.4弯曲度曲线 3、0.85弯曲度曲线 4、0.1度弯曲曲线 5、综合对比 总结 前言 在很多的关于路线的gis应用中&#xff0c;我们…

使用甘特图实现高效时间规划

甘特图虽然看似简单,却蕴含着规划时间的奥秘。它将复杂的工序分解成逻辑严密的任务链条,每个短小的条形图块都清晰地道出一个任务的起始、持续和终止。就像指挥家挥舞手中的棒,每个动作都精确拍着节奏,确保各个乐手分工合作、行云流水。择一个好用的甘特图制作工具,会让你事半功…

web前端之不一样的下拉菜单、不选中第一个元素的样式效果、伪类排除第一个元素、符号选择器、hover、not、first、child

MENU 效果图htmlcssJShtmlcss 效果图 htmlcssJS html <nav><ul><li class"navli"><h4>HTML5</h4><ul class"ulson"><li class"lison">HTML5</li></ul></li><li class"na…

论文解读—— 基于边缘梯度方向插值和 Zernike 矩的亚像素边缘检测

论文&#xff1a;《 Subpixel edge detection based on edge gradient directional interpolation and Zernike moment》 地址&#xff1a; http://www.dpi-proceedings.com/index.php/dtcse/article/view/24488 摘要 在本文中&#xff0c;我们提出了一种基于边缘梯度方向插值…

【双指针】算法例题

目录 二、双指针 25. 验证回文数 ① 26. 判断子序列 ① 27. 两数之和II - 输入有序数组 ② 28. 盛最多水的容器 ② 29. 三数之和 ② 二、双指针 25. 验证回文数 ① 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一…

奥特曼剧透GPT-5,将在高级推理功能上实现重大进步

奥特曼&#xff1a;“GPT-5的能力提升幅度将超乎人们的想象...” 自 Claude 3 发布以来&#xff0c;外界对 GPT-5 的期待越来越强。毕竟Claude 3已经全面超越了 GPT-4&#xff0c;成为迄今为止最强大模型。 而且距离 GPT-4 发布已经过去了整整一年时间&#xff0c;2023年3月1…

Nebula Graph-01-Nebula Graph简介和安装以及客户端连接

前言 NoSQL 数据库 图数据库并不是可以克服关系型数据库缺点的唯一替代方案。现在市面上还有很多非关系型数据库的产品&#xff0c;这些产品都可以叫做 NoSQL。NoSQL 一词最早于上世纪 90 年代末提出&#xff0c;可以解释为“非 SQL” 或“不仅是 SQL”&#xff0c;具体解释要…

服务器版本命令查看

1、# uname &#xff0d;a &#xff08;Linux查看版本当前操作系统内核信息&#xff09; 2、# cat /proc/version &#xff08;Linux查看当前操作系统版本信息&#xff09; 3、# cat /etc/issue 或 cat /etc/redhat-release &#xff08;Linux查看版本当前操作系统发行版信息&…

python车辆故障管理系统的设计与实现flask-django-nodejs-php

随着时代的进步&#xff0c;信息科技的不断发展。人类的不断研究、开发&#xff0c;互联网时代已经来临。人们消费的水平也在不断的提高&#xff0c;车辆维修从无到有&#xff0c;慢慢的步入人们的生活&#xff0c;快速的发展&#xff0c;成为新型的消费。网络发展前景无限&…

计算机视觉综述

历史发展 计算机视觉是通过分析、研究让计算机的智能化达到类似人类的双眼“看”的一门科学。更直接地说&#xff0c;计算机视觉就是让摄像机、电脑这些科技设备成为计算机的“眼睛”&#xff0c;让其可以拥有人类的双眼所具有的分割、分类、识别、跟踪、判别决策等功能。   …

卷积神经网络五:GoogleNet

在2014年的ImageNet图像识别大赛中&#xff0c;一个名叫GoogleNet的网络架构大放异彩。GoogleNet使用了一种叫作Inception的结构。其实GoogleNet本质上就是一种Inception网络&#xff0c;而一个Inception网络又是由多个Inception模块和少量的汇聚层堆叠而成。 Inception模块 …

HTML_CSS学习:超链接、列表、表格、表格常用属性

一、超链接_唤起指定应用 1.相关代码 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>超链接_唤起指定应用</title> </head> <body><a href"tel:10010">电话联…

docker入门(四)—— docker常用命令详解

docker 常用命令 基本命令 # 查看 docker 版本 docker version # 查看一些 docker 的详细信息 docker info 帮助命令&#xff08;–help&#xff09;&#xff0c;linux必须要会看帮助文档 docker --help[rootiZbp15293q8kgzhur7n6kvZ /]# docker --helpUsage: docker [OPTI…

dockerfile文件编写

文章目录 dockerfile是什么Dockerfile常用指令1. FROM2. MAINTAINER3. WORKDIR4.COPY5.ADD6.ENV7.RUN8.CMD9.ENTRYPOINT dockerfile是什么 Dockerfile是一个文本配置文件&#xff0c;用于自动化构建Docker镜像。 Dockerfile是由一系列命令和参数构成的脚本&#xff0c;它指导D…

在Ubuntu20.04(原为cuda12.0, gcc9.几版本和g++9.几版本)下先安装cuda9.0后再配置gcc-5环境

因为自己对Linux相关操作不是很熟悉&#xff0c;所以因为之前的代码报错之后决定要安cuda9.0&#xff0c;于是先安装了cuda9.0。里面用到的一些链接&#xff0c;链接文件夹时直接去copy它的路径&#xff0c;就不那么容易错了。 今天运行程序之后发现gcc环境不太匹配cuda9.0&am…

杰发科技AC7801——Keil编译的Hex大小如何计算

编译结果是Keil里面前三个数据的总和&#xff1a; 即CodeRoDataRWData的总和。 通过ATCLinkTool工具查看内存&#xff0c;发现最后一个字节正好是5328 注意读内存数据时候需要强转成32位&#xff0c;加1000的 增加1024的地址只需要加256即可

【Unity投屏总结】投屏方案总结

【背景】 想方便自己在VR中工作&#xff0c;打算做一个能够挂多个屏幕的远程控制VR桌面。研究下来发现细分场景有很多&#xff0c;有点鱼和熊掌不可兼得的意味&#xff0c;细分如下。 【投屏场景与解决方案】 希望多人能够同时观看我的屏幕&#xff0c;也就是一屏投多屏&…