Mysql主从同步

大多数人都很清楚,在高并发的时候,如果所有的数据库操作都只通过一台数据库来操作,那数据库很大程度可能出现宕机,而宕机就有可能导致数据丢失,造成不良后果。所以在并发量高的情况下一般会使用主从同步来实现读写分离。本篇文章主要就是围绕主从同步实现读写分离这个主题去讲解。我们其实在Redis专题中也有提到过主从同步的概念,现在我们可以先看下主从同步和读写分离的具体概念。

概念

  • 主从同步:其实主从同步和Redis系列讲到的主从同步比较类似,在多个服务器部署Mysql服务,将其中一台Mysql服务设置为主数据库,其他的Mysql服务设置为从数据库,然后主从同步保证主从数据库数据的一致性。
  • 读写分离:实现主从同步后,主数据库负责所有主动写操作,从数据库负责所有主动读操作。实现读写分离,减轻主数据库的负载,提高数据库并发量的稳定性,但是这里需要注意一点:为了保证主从数据库数据的一致性,从数据库还会进行被动写操作。

Mysql安装

首先,我们在两台centos 7.6的机器上分别安装Mysql服务,这里顺带提一下Centos 7如何使用yum安装Mysql

1. 下载mysql的yum repository包

wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm

2. 使用yum命令安装yum repository包

yum -y install mysql57-community-release-el7-10.noarch.rpm

3. 安装Mysql服务

yum -y install mysql-community-server

4. 启动Mysql服务并且查看Mysql运行状态

systemctl start  mysqld.service && systemctl status mysqld.service

5. 从日志中提取Mysql登录随机密码

grep "password" /var/log/mysqld.log

6. 登录mysql

mysql -uroot -p 随机密码

7. Mysql默认安装validate_password插件,所以对密码要求是必须同时包含大小字母,特殊字符和数字,我们可以先关闭validate_password验证修改mysql密码

set global validate_password_policy=0;
set global validate_password_length=1;
set global validate_password_mixed_case_count=2;
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';

8. 开启远程登录并刷新权限。

use mysql;
grant all privileges  on *.* to root@'%' identified by "123456";
flush privileges;

在两台centos上成功安装Mysql服务后,接下来进入正题,部署主从同步,实现主从数据库数据的复制,不过需要注意一点:在进行主从复制时,所有需要复制数据的数据表所有更新操作必须在主数据库中进行,否则可能导致主数据库表更新和从数据库表更新导致数据冲突出现不一致。我们已经准备好两个centos服务器,现在我准备采用一主一从的方式实现主从同步:

ip:49.235.28.88  /*设置成主数据库*/
ip:49.232.154.38  /*设置成从数据库*/

主从同步配置思路

  • 主数据库开启二进制日志存储bin-log,并且授权从数据库查看这个二进制日志。
  • 从服务器配置server_id和开启relay_log,并且指定对应的主数据库的信息进行关联。
  • 主从数据库必须都存在要同步的数据库。
  • 配置完成后,在主数据库写入数据,测试从数据库是否可以成功查询。

配置主数据库

打开/etc/my.cnf配置文件,在[mysqld]节点下进行binlog二进制日志的配置,一般来说binlog有以下几个配置参数:

  • server-id:唯一标识,随便取。但是在5.7版本如果不配置server-id重启服务会报错,算是mysql存在的一个bugid范围1~2^32-1。
  • log-bin:配置二进制日志文件名称。
  • binlog_do_db:需要复制的数据库的名称,这个参数可以重复配置,用于同时同步多个数据库。
  • binlog_ignore_db:不需要复制的数据库名称,设置该参数则对应的数据库更新记录不会保存到binlog中,也就不会同步到从数据库中。
  • sync_binlog:设置同步二进制日志到磁盘的频率。
  • binlog_format:mysql复制模式,有SBRRBRMBR三种可选模式。
  • expire_logs_days:binlog清理时间
  • max_binlog_size:binlog每个文件的大小

一般情况下我们在binlog_do_dbbinlog_ignore_db两个参数之间只需要二选一进行配置。接下来我们通过实例将49.235.28.88配置成主数据库:

接着登录mysql,创建从数据库root用户权限,然后重启mysql服务并登录查看主数据库的状态:

配置从数据库

打开/etc/my.cnf配置文件,在[mysqld]节点下进行relay_log配置:

重启服务并登录,然后关联主数据库,然后启动slave并查看状态。如果可以查看到Slave_IO_Running以及Slave_SQL_Running都为Yes,则表示从数据库配置成功。slave_io是负责将主数据库的binlog日志文件copy到从数据库的relay_log文件中,slave_sql是依次执行relay_log文件里的sql语句,执行被动写操作,实现与主数据库数据的一致性。

测试主从同步

首先,进入主数据库,插入一条数据:

然后进入从数据库查看数据是否存在:

可以看到我们主数据库更新的数据可以同步到从数据库中,实现主从数据库数据同步。主从同步实现之后我们就可以在这个基础上实现数据库读写分离,减轻主数据库的负载。下一篇将着重介绍Mysql的读写分离。

本文分享自微信公众号 - 程序猿周先森(zhanyue_org)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序猿讲故事

利用Sharding-Jdbc实现分表

你们团队使用SpringMVC+Spring+JPA框架,快速开发了一个NB的系统,上线后客户订单跟雪花一样纷沓而来。

9430
来自专栏Java小白成长之路

第32次文章:手写SORM框架(二)

在上周,我们将整个SORM的框架结构梳理了一下,本周开始对整个框架的每个细节步骤进行相关的填充。目前还没有把整个框架全部搭建起来,只完成了一小部分,这周我们就对...

7430
来自专栏Java小白成长之路

第31次文章:手写SORM框架(一)

在上周的末尾,我们介绍了ORM框架,将数据库和Java程序中的数据类型进行关联。这周我们进入SORM框架深入探究,最后手写一个SORM框架。作者也是第一次学习,...

9020
来自专栏Java小白成长之路

第30次文章:文本大对象+ORM

本周主要介绍JDBC中的两个文本大对象CLOB和BLOB,并根据前面在JDBC中编程的分析,封装了一个连接数据库和关闭流操作的工具类JDBCUtil。最后涉及了...

8120
来自专栏python语言学习

mysql 安装与基本管理

8920
来自专栏python语言学习

django后台管理系统(admin)的简单使用

6620
来自专栏python语言学习

django 数据库建表流程,与表结构

7830
来自专栏python语言学习

初识数据库管理系统

10130
来自专栏python语言学习

初始SQL语句 简单使用

7020
来自专栏Java小白成长之路

第33次文章:SORM框架(三)

本周将SORM框架的基本功能已经全部填充起来了,形成了SORM框架的1.0版本,有兴趣的同学可以通过下面的链接获取源码哟!下周将进入SORM框架的升级阶段,在现...

5020

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励