专注技术分享,点击上方 蓝字 关注我吧

最近公司业务量有点大,服务器I/O访问频率过高,之前单节点MySQL有点扛不住压力了,于是我找老板又搞了一台服务器,准备上MySQL的主从复制和读写分离,做多库的存储,提高单个机器的性能,老板欣然同意!

最重要的是,在搭建MySQL读写分离期间,有了这篇水文,很快啊,希望读者大大们耗子尾汁,多多点赞,谢谢朋友们!

主从复制

在业务复杂的系统中,有这么一个情景,有一句sql语句「需要锁表」,导致「暂时不能使用读的服务」,那么就很影响运行中的业务。

使用「主从复制」「让主库负责写,从库负责读」,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作。

另外,可以做数据的热备份。

再一个,像我们的业务,业务量上来了,需要「做架构的扩展」,做多库的存储,「降低磁盘I/O访问的频率」,提高单个机器的I/O性能。

什么是主从复制

MySQL 主从复制是指「数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点」

MySQL 默认采用「异步复制方式」,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表。

MySQL主从复制原理

  1. 「master服务器将数据的改变记录二进制binlog日志」。当master上的数据发生改变时,则将其改变写入二进制日志中;
  2. 「slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变」,如果发生改变,则开始一个I/O Thread请求master二进制事件;
  3. 同时「主节点为每个I/O线程启动一个dump线程」,用于向其发送二进制事件,并「保存至从节点本地的中继日志中」,从节点将启动「SQL线程」从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后I/O Thread和SQL Thread将进入睡眠状态,等待下一次被唤醒。

也就是说:

  • 「从库」会生成两个线程,一个「I/O线程」,一个「SQL线程」
  • 「I/O线程会去请求主库的binlog」,并将得到的binlog写到本地的「relay-log」(中继日志)文件中;
  • 「主库」会生成一个「log dump线程」,用来「给从库I/O线程传binlog」
  • 「SQL线程会读取relay log文件中的日志」,并解析成sql语句逐一执行。

MySQL主从复制形式

一主一从

一个主节点,一个从节点,简单方便,稍后我们就搭建这种一主一从的主从复制模式。


主主复制

主主复制:「互为主从」

  • 容易产生的问题:数据不一致;因此慎用
  • 考虑要点:自动增长id

一个节点id使用奇数:

auto_increment_offset=1auto_increment_increment=2

另一个主节点id使用偶数:

auto_increment_offset=2auto_increment_increment=2

一主多从

常用于「扩展系统读取性能」,因为「读是在从库读取」的。


多主一从

从MySQL 5.7版本开始支持,也叫「多源复制」,数据流向是从多个主库同步数据到一个从库:


多应用于:

  • 数据汇总,可将多个主数据库同步汇总到一个从数据库中,方便数据统计分析。
  • 读写分离,从库只用于查询,提高数据库整体性能。

级联复制

在主从复制的基础上,主从之间存在一个级联复制的从服务器,当级联复制的主机复制了主服务器的数据,「级联复制主机充当为主服务器,从服务器复制级联复制主机的数据及二进制日志数据」

「Tip」:中间级联复制的主机无法将二进制日志传递到其他从服务器上,因此需要加上log_slave_updates选项,「目的是为了将主服务器的二进制日志文件能写入到从服务器上」


搭建一主一从主从复制环境

1. 主机规划

序号 主机名称 IP地址 虚拟机OS MySQL
1 mysql-master 192.168.2.158 CnetOS 7.8 5.7
2 mysql-slave 192.168.2.159 CnetOS 7.8 5.7

2. 安装MySQL

还未安装的,直接参考:

如何在CentOS7下快速安装MySQL5.7

CV操作就行了。

3. 两台MySQL服务器创建数据库

两台主机均执行:

mysql> create database laogong;

该数据库用来指定同步的数据库名称。

4. 配置Master

4.1 配置主节点

「mysql-master」节点下配置 「/etc/my.cnf」 ,在[mysqld]模块下添加如下内容:

log-bin=master-binbinlog-format=ROWserver-id=1binlog-do-db=laogong

「log-bin」:定义二进制文件名称。

「binlog-format」:二进制日志格式,有「row」「statement」「mixed」三种格式。

  • 「row」:把改变的内容复制过去,而不是把命令在从服务器上执行一遍。
  • 「statement」:在主服务器上执行的SQL语句,在从服务器上执行同样的语句。「MySQL默认采用基于语句的复制,效率比较高」
  • 「mixed」:默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。

「server-id」:服务器的id,各节点的id必须不一样。

「binlog-do-db」:要同步的数据库名称。

4.2 授权从服务器登录主服务器

--授权操作set global validate_password_policy=0;set global validate_password_length=1;grant replication slave on *.* to 'root'@'%' identified by '123456';--刷新权限flush privileges;

5. 配置Slave

「mysql-slave」节点配置 /etc/my.cnf ,在 [mysqld] 模块下添加:

log-bin=slave-binbinlog-format=ROWserver-id=2

6. 重启Master,查看状态

mysql> show master status;+-------------------+----------+--------------+------------------+-------------------+| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+-------------------+----------+--------------+------------------+-------------------+| master-bin.000001 |      154 | laogong      |                  |                   |+-------------------+----------+--------------+------------------+-------------------+

7. 重启Slave并进行相关配置

mysql> change master to master_host='192.168.2.158',master_user='root',master_password='123456',master_port=3306,master_log_file='master-bin.000001',master_log_pos=154;mysql> start slave;mysql> show slave status\G

查看slave状态时,可以看到有报错信息:

Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.

这个报错是因为我偷懒,在master主机安装好MySQL以后,我直接克隆的一台slave主机,导致auto.cnf文件中保存的UUID是重复的。

解决方法很简单,停掉slave的mysql实例,删除其 datadir 文件夹下的的 auto.cnf 文件,再启动备库实例,此时备库就会产生一个新的 auto.cnf 文件,也就会生成和master的mysql服务不一样的UUID

此时再查看slave状态:

show slave status\G

就OK了。

8. 验证

在主库创建一个table:

mysql> use laogong;Database changedmysql> create table xblzer(id int,name varchar(20));Query OK, 0 rows affected (0.05 sec)

从库读取:

mysql> use laogong;Reading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -A

Database changedmysql> show tables;+-------------------+| Tables_in_laogong |+-------------------+| xblzer            |+-------------------+1 row in set (0.00 sec)

再在主库添加1条记录:

mysql> insert into xblzer values(1, 'laowang');

在从库查看:

mysql> select * from xblzer;+------+---------+| id   | name    |+------+---------+|    1 | laowang |+------+---------+1 row in set (0.00 sec)

这样,MySQL一主一从的主从复制架构就搭建起来了。

那么,为了减轻每台MySQL主机的访问压力,还可以对MySQL进行读写分离,实际上,主从复制和读写分离一般就是联合使用的。我们实际生产环境使用的是sharding-jdbc来实现的读写分离。

还有其他的像「mycat」「amoeba」等中间件也可以做读写分离,下次有机会再撸「MySQL数据库的读写分离」,本次导航就到此为止,下次再肝。。。



首发公众号 「行百里er」 ,欢迎老铁们关注阅读指正。代码仓库 「GitHub」 github.com/xblzer/JavaJourney

往期推荐

MySQL调优之查询优化

MySQL通过索引优化-这里可能有你不知道的索引优化细节(二)

MySQL通过索引优化-这里可能有你不知道的索引优化细节(一)

MySQL优化必备之执行计划explain,索引基本知识,索引数据结构推演

将优化考虑在最前面-MySQL数据库设计优化:范式与反范式,主键,字符集,存储引擎

结合案例说明MySQL的数据类型如何优化

捅破窗户纸-入门MySQL调优之性能监控

虚拟机访问本地mysql_MySQL高可用之主从复制相关推荐

  1. 【Java从0到架构师】Redis 进阶 - 持久化(RBD、AOF)、高可用(主从复制、哨兵机制、Cluster)

    Redis 原理与实战 持久化 Redis 持久化 - RDB Redis 持久化 - AOF AOF 文件重写机制 Redis 高可用 Redis 主从复制 搭建主从复制环境 全量复制和部分复制 R ...

  2. Spark: Structured JDBC 方式访问远程的高可用HA的HIVE

    1. 背景 Spark: Structured JDBC 方式访问远程的高可用HA的HIVE,hive是看高可用的,连接信息如下 jdbc:hive2://xx.cdh1.test.dtwave.in ...

  3. 技术小白的第一篇博客 --- 虚拟机访问本地文件设置

    虚拟机访问本地文件夹 最近工作中需要使用到虚拟机在不同操作系统上测试软件,总是从服务器拷贝文件太麻烦,就找了一下虚拟机可以直接访问本地文件夹的设置方法,这里就是简单记录一下. 1.在虚拟机的设置页面中 ...

  4. Redis高可用之主从复制、哨兵、cluster集群

    一 Redis高可用 1.什么是高可用 在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务(99.9%.99.99%.99.999%等等). 高可用的计算公 ...

  5. mha mysql_mysql高可用之mha_MySQL

    mysql高可用有很多方案,如mmm,mysql cluster等,但都无法真正应用到生产环境.偶然间发现mha(master high availability),目前在mysql高可用方面是一个相 ...

  6. 2.redis高可用-持久化-主从复制-哨兵-cluster集群概述与部署,内容依旧多看完直接通透!

    文章目录 一,Redis 高可用 1.持久化 2.主从复制 3.哨兵 4.集群(cluster) 二,Redis 持久化方式 1.持久化的功能 2.持久化的方式 三, RDB 持久化 1.触发条件 2 ...

  7. MySQL MHA: 一种master高可用的主从复制解决方案

    2019独角兽企业重金招聘Python工程师标准>>> 大纲 前言 MHA的架构 环境部署 实验步骤 总结 前言 上篇文章我们实现了MySQL的主从复制, 但是我们之前就说过, 主从 ...

  8. oracle主从表分离怎么实时更新数据_高可用数据库主从复制延时的解决方案

    MySQL主从复制的延时一直是业界困扰已久的问题.延时的出现会降低主从读写分离的价值,不利于数据实时性较高的业务使用MySQL. UDB是UCloud推出的云数据库服务,上线已达六年,运营了数以万计的 ...

  9. Redis高可用:主从复制及哨兵模式

    目录 主从复制 作用 复制原理 使用的方式 哨兵模式 主从切换过程 Redis Sentinel的配置文件 参考 主从复制 主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器.前 ...

最新文章

  1. 渗透知识-HTML基础
  2. 【Spring注解驱动开发】自学java和三大框架要多久
  3. Anaconda:Anaconda安装pytorch网络连接失败记录
  4. pyflink的local模式实验记录
  5. 你们是不是对QQ总在后台莫名其妙更新一些东西很反感
  6. python中 的用法_详解python中@的用法
  7. 程序员实用小程序_我从阅读《实用程序员》中学到了什么
  8. Codeforces Round #434 (Div. 2)【A、B、C、D】
  9. linux lvm lv扩充--虚拟机,虚拟机新增磁盘后lvm下的lv扩容
  10. 微信投票时间是在服务器上的吗,如何微信设置投票,微信投票活动时间设置小技巧...
  11. Slowquery图形化显示MySQL慢日志工具
  12. 网曝悼念牌汤圆吃出创可贴(图)
  13. node.js —— express中的next( )
  14. 计算机系微电子专业大学排名,微电子专业大学排名情况一览表
  15. linux 设置django开机启动以及自动开启浏览器全屏
  16. java自定义类加载器并观察类卸载过程
  17. golang采集网络流量等系统指标
  18. 用JS实现PC端淘宝查看商品图片放大镜效果
  19. 用ul制作html表单,要利用 display属性把段落P、标题h1、表单form、列表ul和li都可以定义成行内块元素,其属性值为...
  20. 1309:【例1.6】回文数(Noip1999)

热门文章

  1. ethereumjs/ethereumjs-account-2-test
  2. linux定时任务cron配置
  3. 云上赶年集、品年味,阿里云让云上中国年“春节不打烊”
  4. Rushcrm:CRM系统怎么让企业如此青睐?
  5. Pythonipython安装注意事项
  6. Daily Scrum02 12.03
  7. forms角色验证,以普通用户身份登陆管理页面先弹出警告信息窗口
  8. php 自己封装一个调用第三方接口的函数
  9. 浅水声信道模型的建立(1)----只考虑海面海底一次散射,多亮点研究
  10. elk-Logstash