热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MySQL主从架构的实现

nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd

正文

一主一从

 

1.1 环境准备:

  CentOS系统服务器2台、 一台用户做MySQL主服务器, 一台用于做MySQL从服务器, 配置好yum源、 防火墙关闭、 各节点时钟服务同步、 各节点之间可以通过主机名互相通信。

1.2 准备步骤:

1)iptables -F && setenforce 清空防火墙策略,关闭selinux
2)拿两台服务器都使用yum方式安装Mysql服务, 要求版本一致
3)分别启动两台服务器mysql服务, 确保服务正常
  架构图:
#

 

1.3 实现步骤:

 

1.3.1 配置master主服务器

  对master进行配置,包括打开二进制日志,指定唯一的servr ID。例如,在配置文件加入如下值

    server-id=1      //配置server-id,让主服务器有唯一ID号
    log-bin=mysql-bin  //打开Mysql日志,日志格式为二进制
    skip-name-resolve  //关闭名称解析,(非必须)

#

 

1.3.2 创建复制帐号

  在 Master 的数据库中建立一个备份帐户:每个 slave 使用标准的 MySQL 用户名和密码连接 master 。进行复制操作的用户会授予 REPLICATION SLAVE 权限。

    MariaDB [(none)]> grant replication slave,replication client on *.* to slave@'192.168.%.%' identified by 'keer';

 

1.3.3 查看主服务器状态

  在 Master 的数据库执行 show master status,查看主服务器二进制日志状态及位置号。
#

 

1.3.4 配置slave从服务器

  对 slave 进行配置,打开中继日志,指定唯一的 servr ID,设置只读权限。在配置文件加入如下值:

    server-id=2                 //配置server-id,让从服务器有唯一ID号
    relay_log = mysql-relay-bin //打开Mysql日志,日志格式为二进制
    read_Only= 1               //设置只读权限
    log_bin = mysql-bin         //开启从服务器二进制日志
    log_slave_updates = 1       //使得更新的数据写进二进制日志中

#

 

1.3.5 启动从服务器复制线程

  让 slave 连接 master ,并开始重做 master 二进制日志中的事件。

MariaDB [(none)]> change master to master_host='192.168.37.111', 
   >master_user='slave', 
   >master_password='keer', 
   >master_log_file='mysql-bin.000001', 
   >master_log_pos=413;

  执行start slave;,来启动复制线程。
  

 

1.3.6 查看从服务器状态

  可使用SHOW SLAVE STATUS\G;查看从服务器状态,如下所示,也可用show processlist \G;查看当前复制状态:

    Slave_IO_Running: Yes       //IO线程正常运行
    Slave_SQL_Running: Yes      //SQL线程正常运行

#

 

1.3.7 测试

1)测试主从同步
  我们在 master 服务器上创建一个数据库,再使用该数据库创建一个表,添加一条记录,来看一看 slave 服务器有没有同步成功。
  首先,我们先来查看一下两个服务器上有什么数据库:
  master:
#
  slave:
#
  现在,我们在主服务器上创建一个数据库“keer”:
#
  然后,我们来看看从服务器是否已经更新:
#
  我们可以看出,数据库已经同步,接下来,我们就来创建表,并在表中插入一条记录:
#
  然后,我们来看看从服务器是否更新:
#

2)测试只读属性  
  我们在从服务器上设置了只读,所以我们来试试看能不能插入数据:
#
  这就很尴尬了,为什么我们设置只读还是可以插入数据呢?这要如何解决呢?
  因为我们登录的时候使用的是root超级用户,这个大变态是不受只读设置影响的,所以,我们还是可以往里面去插入数据,当然,如果我们换成其他的普通用户就不会出现这样的问题了。
  解决方式也很简单,我们只需要把表锁起来就可以了:

MariaDB [keer]> flush tables with read lock;

  进行锁表操作以后,我们再来插入一条数据:
#
  这样的话,即使我们是超级用户登录进来的,也不能再插入数据了。这样会安全很多。但是,有利就有弊,这样的话,我们的主从就不能实时同步了,因为我们的主从同步是通过把主上的 sql 语句放在从上再执行一遍来实现的,可是我们锁表的话,sql 语句就不能执行了。想要同步方法也很简单,直接把表解锁就可以了。
  我们在主上插入一条数据:
#
  此时,我们的从上就要解表以后才能实现同步:
#

 

1.4 扩展——实现一主多从

 

1.4.1 需求分析

  当我们的服务器运行一段时间后,流量变得越来越多,这时,一主一从能够实现的高可用性和负载均衡不能满足我们的需求,我们就要选择再添加一台从服务器。
  可是现在我们的 master 已经运行很久了,我们也需要对新安装的 slave 进行数据同步,甚至它没有 master 的数据。
  此时,有几种方法可以使 slave 从另一个服务开始,例如,从 master 拷贝数据,从另一个 slave 克隆,从最近的备份开始一个 slave 。为了加快 slave 与 master 同步,可用以下方式先进行数据同步:

(1)master的某个时刻的数据快照;
(2)数据库的备份数据;
(3)master的二进制日志文件。

  架构图:
#

  接下来,我们就来实现一下这个过程:

 

1.4.2 具体实现过程

1)对 master 进行完全备份

[root@master ~]# mkdir /backup
[root@master ~]# mysqldump --all-database > /backup/mysql-backup-`date +%F-%T`-all.sql

照例查看一下主的二进制日志状态及位置号。
#

2)把完全备份的数据发到新增的从上

[root@master ~]# scp /backup/mysql-backup-2017-11-21-10\:28\:29-all.sql @192.168.37.133:~
root@192.168.37.133's password: 
mysql-backup-2017-11-21-10:28:29-all.sql                                                           100%  504KB 503.9KB/s   00:00 

3)把这个完全备份导入从的数据库:
#

4)查看从是否恢复成功:
#
#
  我们来查看一下从的二进制日志状态及位置号:
#
  我们的数据已经恢复成功

5)设置主从
接下来就是按照上述步,对该从服务器进行设置就好:

[root@slave2 ~]# vim /etc/my.cnf
    [mysqld]
    server-id = 3
    relay-log = mysql-relay-bin
    read-Only= 1
    log-bin = mysql-bin
    log-slave-updates = 1

  
  然后,我们就来设置从服务器:

[root@slave2 ~]# mysql -uroot -p
Enter password: 
MariaDB [(none)]> change master to master_host='192.168.37.111', 
   >master_user='slave', 
   >master_password='keer', 
   >master_log_file='mysql-bin.000001', 
   >master_log_pos=330;
MariaDB [(none)]> start slave;

  然后我们来查看一下从服务器的状态:
#

6)测试
  设置完毕,我们来测试一下,当主上有操作时,从上是否更新:
#
#
  至此,我们就完成了一主两从。如果有需要,我们还可以继续添加从服务器。

 

1.5 扩展——实现半同步复制

 

1.5.1 三种复制方式

1)同步复制
  指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。需要有超时时间。
2)异步复制
  MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主如果crash掉了,此时主上已经提交的事务可能并没有传到从上,如果此时,强行将从提升为主,可能导致新主上的数据不完整。
3)半同步复制
  介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。

 

1.5.2 实现半同步复制

  半同步复制是基于特定的模块来实现。不过非常 nice 的一点就是,在我们的 mariadb5.5 以上的版本默认是带有这个模块的。
  如果我们的 centos7 上安装了 mariadb ,我们就可以进入目录去查看一下:

[root@master ~]# cd /usr/lib64/mysql/plugin/

#
  找到我们的模块后,我们就可以通过命令来安装,然后进行简单配置即可使用了。下面就是具体方法:
master 服务器上:

MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';
MariaDB [(none)]> SET GLOBAL rpl_semi_sync_master_enabled=ON;

#

slave 服务器上:

MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';
MariaDB [(none)]> SET GLOBAL rpl_semi_sync_slave_enabled = ON ;
MariaDB [(none)]> stop slave;   
MariaDB [(none)]> start slave;

#
#
  现在,我们的半同步复制就开启了,我们可以来查看一下日志:

[root@slave ~]# tail -200 /var/log/mariadb/mariadb.log 

  从日志里也可以看出我们的半同步复制已经开启。
#


  以上,实验一完成。

更多详情见请继续阅读下一页的精彩内容: 2017-11/149008p2.htm


推荐阅读
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Windows7 64位系统安装PLSQL Developer的步骤和注意事项
    本文介绍了在Windows7 64位系统上安装PLSQL Developer的步骤和注意事项。首先下载并安装PLSQL Developer,注意不要安装在默认目录下。然后下载Windows 32位的oracle instant client,并解压到指定路径。最后,按照自己的喜好对解压后的文件进行命名和压缩。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 解决.net项目中未注册“microsoft.ACE.oledb.12.0”提供程序的方法
    在开发.net项目中,通过microsoft.ACE.oledb读取excel文件信息时,报错“未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序”。本文提供了解决这个问题的方法,包括错误描述和代码示例。通过注册提供程序和修改连接字符串,可以成功读取excel文件信息。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的步骤和方法
    本文介绍了在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的详细步骤和方法。首先需要下载最新的Java SE Development Kit 9发行版,然后按照给出的Shell命令行方式进行安装。详细的步骤和方法请参考正文内容。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • Linux下安装依赖包版本高解决方法
    本文介绍了在Linux系统下,当已安装的依赖包版本高于需要安装的依赖包版本时,解决方法包括欺骗安装程序和修改相关配置文件等操作。针对不同情况,提供了不同的解决方案。 ... [详细]
author-avatar
社会逼我爱上Money_717
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有