怎么掌握MySQL复制架构


怎么掌握mysql复制架构

一主多从复制架构

在实际应用中,MySQL复制的架构模式大多数都是将一个Master复制到一个或多个Sl*e。

在主库读取请求压力非常大的场景下,可以通过配置一主多从复制架构实现读写分离,把大量的对实时性要求不是特别高的读请求通过负载均衡分部到多个从库上(对于实时性要求很高的读请求可以让从主库去读),降低主库的读取压力,如下图所示。

怎么掌握MySQL复制架构

缺点:

  • master不能停机,停机就不能接收写请求

  • sl*e过多会出现延迟

由于master需要进行常规维护停机了,那么必须要把一个sl*e提成master,选哪一个是一个问题?

某一个sl*e提成master了,就存在当前master和之前的master数据不一致的情况,并且之前master并没有保存当前master节点的binlog文件和pos位置。

多主复制架构

多主复制架构解决了一主多从复制架构中master的单点故障问题。

怎么掌握MySQL复制架构

可以配合一个第三方的工具,比如keepalived轻松做到IP的漂移,这样master停机维护也不会影响写操作。

级联复制架构

一主多从中如果sl*e过多,会导致主库的I/O压力和网络压力会随着从库的增加而增长,因为每个从库都会在主库上有一个独立的BINLOG Dump线程来发送事件,而级联复制架构解决了一主多从场景下的,主库额外的I/O和网络压力。

如下图所示。

怎么掌握MySQL复制架构

对比一主多从的架构,级联复制仅仅是从主库Master复制到少量的从库,其他从库再从这少量的从库中复制数据,这样就减轻了主库Master的压力。

当然也有缺点:MySQL的传统复制是异步的,级联复制场景下主库的数据是经历两次复制才到达其他从库中,期间的延迟要比一主多从复制场景下只经历一次复制的还大。

通过在二级从库上选择BLACKHOLE表引擎,可以降低级联复制的延迟。顾名思义,BLACKHOLE引擎是一个“黑洞”引擎,写入BLACKHOLE表的数据并不会写会到磁盘上,BLACKHOLE表永远都是空表,INSERT、UPDATE、DELETE操作仅仅在BINLOG中记录事件。

下面演示下BLACKHOLE引擎:

mysql> CREATE TABLE `user` (
    -> `id` int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> `name` varchar(255) NOT NULL DEFAULT '',
    -> `age` tinyint unsigned NOT NULL DEFAULT 0
    -> )ENGINE=BLACKHOLE charset=utf8mb4;Query OK, 0 rows affected (0.00 sec)mysql> INSERT INTO `user` (`name`,`age`) values("itbsl", "26");Query OK, 1 row affected (0.00 sec)mysql> select * from user;Empty set (0.00 sec)

可以看到,存储引擎为BLACKHOLE的user表里没有数据。

多主与级联复制结合架构

结合多主与级联复制架构,这样解决了单点master的问题,解决了sl*e级联延迟的问题。

怎么掌握MySQL复制架构

多主复制架构的搭建

主机规划:

Mootion Mootion

Mootion是一个革命性的3D动画创作平台,利用AI技术来简化和加速3D动画的制作过程。

Mootion 232 查看详情 Mootion
  • master1:docker,端口3314

  • master2:docker,端口3315

master1的配置

配置文件my.cnf:

$ cat /home/mysql/docker-data/3315/conf/my.cnf
[mysqld]
character_set_server=utf8
init_connect='SET NAMES utf8'

symbolic-links=0

lower_case_table_names=1
server-id=1403314
log-bin=mysql-bin
binlog-format=ROW
auto_increment_increment=2 # 几个主库,这里就配几
auto_increment_offset=1 # 每个主库的偏移量需要不一致
gtid_mode=ON
enforce-gtid-consistency=true
binlog-do-db=order      # 要同步的数据库

启动docker:

$ docker run --name mysql3314 -p 3314:3306 --privileged=true -ti -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=order -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -v /home/mysql/docker-data/3314/conf:/etc/mysql/conf.d -v /home/mysql/docker-data/3314/data/:/var/lib/mysql -v /home/mysql/docker-data/3314/logs/:/var/log/mysql -d mysql:5.7

添加用于复制的用户并授权:

mysql> GRANT REPLICATION SL*E,FILE,REPLICATION CLIENT ON *.* TO 'repluser'@'%' IDENTIFIED BY '123456';
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)

开启同步master1(这里的user来自master2):

mysql> change master to master_host='172.23.252.98',master_port=3315,master_user='repluser',master_password='123456',master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.03 sec)

mysql> start sl*e;
Query OK, 0 rows affected (0.00 sec)

master2的配置

master2的配置与master1类似。

主要区别在于my.cnf中有一个属性需要不一致:

auto_increment_offset=2 # 每个主库的偏移量需要不一致

测试:

在master2创建表,并添加数据:

mysql> create table t_order(id int primary key auto_increment, name varchar(20));
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t_order(name) values("A");
Query OK, 1 row affected (0.01 sec)

mysql> insert into t_order(name) values("B");
Query OK, 1 row affected (0.00 sec)

mysql> select * from t_order;
+----+------+
| id | name |
+----+------+
|  2 | A    |
|  4 | B    |
+----+------+
2 rows in set (0.00 sec)

可以发现master2中id的步长为2,且从2开始自增。

然后在master1查询数据,并添加:

mysql> select * from t_order;
+----+------+
| id | name |
+----+------+
|  2 | A    |
|  4 | B    |
+----+------+
2 rows in set (0.00 sec)

mysql> insert into t_order(name) values("E");
Query OK, 1 row affected (0.00 sec)

mysql> select * from t_order;
+----+------+
| id | name |
+----+------+
|  2 | A    |
|  4 | B    |
|  5 | E    |
+----+------+
3 rows in set (0.00 sec)

可以发现master1中id的步长为2,且从1开始自增,再去master2中查询能发现id为5的数据,说明主主复制配置没有问题。

为什么两个主中id自增的偏移量要不一致呢?当两个主同时接受到插入请求时就能保证id不冲突,其实这样只能保证插入数据不冲突,无法保证删除和修改导致的数据不一致。

所以在实际的应用场景中,只能暴露一个主给客户端才能保证数据的一致性。

MySQL高可用的搭建

怎么掌握MySQL复制架构

这里借助keepalived来对上面的多主复制架构改造来实现MySQL的高可用。

keepalived的安装:

$ sudo apt-get install -y keepalived

keepalived.conf

$ cat /etc/keepalived/keepalived3314.conf! Configuration File for keepalived#简单的头部,这里主要可以做邮件通知报警等的设置,此处就暂不配置了;global_defs {
        #notificationd LVS_DEVEL}#预先定义一个脚本,方便后面调用,也可以定义多个,方便选择;vrrp_script chk_haproxy {
    script "/etc/keepalived/chkmysql.sh"  #具体脚本路径
    interval 2  #脚本循环运行间隔}#VRRP虚拟路由冗余协议配置vrrp_instance VI_1 {   #VI_1 是自定义的名称;
    state BACKUP    #MASTER表示是一台主设备,BACKUP表示为备用设备【我们这里因为设置为开启不抢占,所以都设置为备用】
    nopreempt      #开启不抢占
    interface eth0   #指定VIP需要绑定的物理网卡
    virtual_router_id 11   #VRID虚拟路由标识,也叫做分组名称,该组内的设备需要相同
    priority 130   #定义这台设备的优先级 1-254;开启了不抢占,所以此处优先级必须高于另一台

    advert_int 1   #生存检测时的组播信息发送间隔,组内一致
    authentication {    #设置验证信息,组内一致
        auth_type PASS   #有PASS 和 AH 两种,常用 PASS
        auth_pass asd    #密码
    }
    virtual_ipaddress {
        172.23.252.200    #指定VIP地址,组内一致,可以设置多个IP
    }
    track_script {    #使用在这个域中使用预先定义的脚本,上面定义的
        chk_haproxy    }

    #notify_backup "/etc/init.d/haproxy restart"   #表示当切换到backup状态时,要执行的脚本
    #notify_fault "/etc/init.d/haproxy stop"     #故障时执行的脚本}

/etc/keepalived/chkmysql.sh

$ cat /etc/keepalived/chkmysql.s.sh#!/bin/bashmysql -uroot -proot -P 3314 -e "show status;" > /dev/null 2>&1if [ $? == 0 ];then
        echo "$host mysql login successfully"
        exit 0else
        echo "$host login failed"
        killall keepalived        exit 2fi

以上就是怎么掌握MySQL复制架构的详细内容,更多请关注其它相关文章!


# 镜像  # 低价网站建设新闻  # 平湖网站快速优化  # 品牌产品推广营销策略  # 代刷网站推广链接轰炸  # 网站建设什么行业  # 乐伊网站seo优化  # 新时代劳动教育网站建设  # 设置为  # 偏移量  # 所示  # 负载均衡  # 解决了  # 单点  # 是一个  # 多个  # 级联  # MySQL  # seo+分析对手网站  # 专业网站优化推广方法  # 合肥推广营销型网站优化 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 房产|直播|视频号怎么认证开通?|直播|需要什么资质?  《环球网校》设置报考省市方法  曝《丝之歌》DLC有望开发!开发商还有神秘新企划  《三国:谋定天下》平民全阶段通用阵容  《地下城堡4:骑士与破碎编年史》墓穴挑战125攻略  如何在vscode中关闭it环境  如何在mysql中比较InnoDB和MyISAM区别  Yandex浏览器官方入口_Yandex搜索引擎中文版  苹果电脑如何快速截图并编辑 苹果电脑截屏标注快捷操作  如何发挥新媒体矩阵作用?新媒体矩阵怎么搭建?  CodeIgniter 3 中基于 MySQL 数据高效生成动态图表教程  PHP实现等比数列:构建数组元素基于前一个值递增的方法  《漫蛙manwa2》防走失网页版链接2025  电脑开不了机怎么办 电脑无法开机的解决方法  Golang如何使用crypto/md5生成哈希_Golang MD5哈希生成方法  手机自动关机是怎么回事?如何修复?手机异常关机的原因排查与修复技巧  抖音号升级成企业资质怎么弄?有什么好处?  Golang如何操作指针参数_Go pointer参数传递规则  如何通过settings.json个性化您的VS Code体验  苹果17 Pro如何启用分屏浏览_iPhone 17 Pro分屏浏览设置步骤  京东物流快递破损了怎么办_京东快递破损理赔流程  冬季去哪个城市旅游更有可能观测到极光  win11讲述人怎么关闭 Win11屏幕朗读辅助功能禁用方法【技巧】  嘴唇干裂起皮怎么办 唇部护理与预防干裂的方法【详解】  使用 J*aScript 随机化 CSS Grid 布局中的元素顺序  Golang中的rune与byte类型区别是什么_Golang字符与字节处理详解  firefox火狐浏览器最新官网主页_ firefox火狐浏览器平台入口直达官方链接  win11关机几秒又自己开机 Win11关机自动重启问题修复  个人所得税办理入口 个人所得税综合所得年度汇算入口  《海豚家》注销账号方法  《狐友》联系客服方法  深入理解随机递归函数的确定性:内部节点、叶节点与时间复杂度分析  TikTok搜索结果不显示怎么办 TikTok搜索刷新与优化方法  QQ邮箱官方登录页_腾讯出品安全稳定的邮箱服务  《百度畅听版》关闭兴趣推荐方法  优化长HTML属性值:SonarQube警告与实用策略  Go语言中方法与接收器:指针和值类型的调用机制详解  快手极速版在线体验区 快手极速版网页体验入口  VB表达式书写规则解析  小米手机截图后如何查看历史_小米手机截图历史记录查看方法  J*aScript模块加载器_RequireJS原理分析  漫蛙app官方版手机正版入口-漫蛙漫画manwa在线漫画正版入口  sf漫画官网登录入口直达_sf漫画官方正版网址  如何在CSS中实现盒模型多列间距_grid-gap与padding结合  Keras中Convolution2D层及其核心辅助层详解  外媒评《燕云十六声》DIY载具新玩法:很像《塞尔达传说王国之泪》!  第五人格PC版怎么避免被封号_第五人格PC版防封号注意事项  利用Flexbox实现图片元素的二维布局:2x2网格排列指南  《幻兽帕鲁》手游帕鲁捕捉技巧分享  路由器DNS怎么设置最快 优化DNS提升上网速度教程 

 2023-05-30

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.