当前位置: 首页 > 图灵资讯 > 技术篇> mysql主从架构的实现

mysql主从架构的实现

来源:图灵教育
时间:2023-05-30 09:27:19

 

 

 

阅读文本大约需要20分钟。

1.1 环境准备:

  centos系统服务器2台, 用户制作Mysql主服务器, Mysql服务器用于制作, 配置yum源, 关闭防火墙, 同步每个节点的时钟服务, 每个节点都可以通过主机名相互通信

1.2 准备步骤:

1)iptables -F && setenforce 清空防火墙策略,关闭selinux

2)用yum安装两台服务器的Mysql服务, 要求相同的版本

3)启动两台服务器mysql服务, 确保服务正常

  架构图:

mysql主从架构的实现_java

1.3 实现步骤:1.3.1 master主服务器配置

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

 

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

 

mysql主从架构的实现_java_02

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,检查主服务器二进制日志的状态和位置号。

mysql主从架构的实现_数据库_03

1.3.4 服务器配置slave

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

 

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

 

mysql主从架构的实现_redis_04

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线程正常运行

 

mysql主从架构的实现_mysql_05

1.3.7 测试

1)测试主从同步

  我们在 master 在服务器上创建一个数据库,然后使用该数据库创建一个表,添加一个记录 slave 服务器同步成功吗?

  首先,让我们检查两个服务器上的数据库:

  master:

mysql主从架构的实现_linux_06

 

  slave:

  现在,我们在主服务器上创建了一个数据库keer”:

mysql主从架构的实现_redis_08

 

  然后,让我们看看服务器是否已经更新:

mysql主从架构的实现_redis_09

 

  我们可以看到数据库已经同步了。接下来,我们将创建一个表,并在表中插入一个记录:

mysql主从架构的实现_数据库_10

 

  然后,让我们看看服务器是否更新:

mysql主从架构的实现_数据库_11

2)测试只读属性  

  我们在服务器上设置了只读,所以让我们试着看看是否可以插入数据:

mysql主从架构的实现_java_12

 

  这很尴尬。为什么我们设置只读还是可以插入数据?如何解决这个问题?

  因为我们在登录时使用它root对于超级用户来说,这种大变态不受阅读设置的影响。因此,我们仍然可以将数据插入其中。当然,如果我们用其他普通用户代替,就不会有这样的问题。

  解决方案也很简单,我们只需要锁上手表:

 

MariaDB [keer]> flush tables with read lock;

 

  锁表操作完成后,我们将再次插入数据:

mysql主从架构的实现_linux_13

 

  在这种情况下,即使我们是超级用户登录,我们也不能再插入数据了。这样会安全得多。然而,有利有弊。在这种情况下,我们的主从不能实时同步,因为我们的主从通过主从同步 sql 把句子从上面再执行一遍来实现,但是我们锁表的话,sql 句子不能执行。同步方法也很简单,可以直接解锁表。

  我们在主上插入一个数据:

mysql主从架构的实现_java_14

 

  此时,我们必须从上面解释表格,才能实现同步:

mysql主从架构的实现_mysql_15

1.4 扩展-实现一主多从1.4.4.1 需求分析

  当我们的服务器运行一段时间后,流量变得越来越多。此时,我们必须选择添加另一个服务器,以实现高可用性和负载平衡不能满足我们的需求。  但是现在我们的 master 它已经运行了很长时间,我们也需要新安装 slave 数据同步,甚至没有 master 的数据。  在这个时候,有几种方法可以制造它 slave 例如,从另一项服务开始, master 从另一个复制数据 slave 克隆,从最近的备份开始 slave 。为了加快 slave 与 master 数据同步可以通过以下方式进行:

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

  架构图:

mysql主从架构的实现_mysql_16

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

1.4.2 具体实现过程

1)对 master 完全备份

 

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

 

像往常一样,检查主二进制日志的状态和位置号。

mysql主从架构的实现_数据库_17

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)将此完全备份导入从数据库:

mysql主从架构的实现_redis_18

4)检查恢复是否成功:

mysql主从架构的实现_java_19

 

mysql主从架构的实现_redis_20

 

  让我们来看看二进制日志的状态和位置号:

mysql主从架构的实现_数据库_21

 

  我们的数据已经成功恢复

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 -pEnter 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;

 

  然后我们来看看服务器的状态:

mysql主从架构的实现_java_22

6)测试

  设置完成后,我们来测试一下,当主上有操作时,是否从上更新:

mysql主从架构的实现_linux_23

 

mysql主从架构的实现_java_24

 

  到目前为止,我们已经完成了一主两从。如有必要,我们可以继续添加服务器。

1.5 扩展-半同步复制1.5.1 三种复制方法

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

1.5.2 半同步复制

  基于特定模块实现半同步复制。但是非常 nice 有一点是,在我们身上 mariadb5.5 默认情况下,上述版本有该模块。  如果我们的 centos7 上安装了 mariadb ,我们可以进入目录查看:

 

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

 

mysql主从架构的实现_linux_25

 

  在找到我们的模块后,我们可以通过命令进行安装,然后进行简单的配置。具体方法如下:

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;

 

mysql主从架构的实现_mysql_26

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;

 

mysql主从架构的实现_数据库_27

 

mysql主从架构的实现_redis_28

 

  现在,我们的半同步复制已经开始,我们可以查看日志:

 

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

 

  从日志中也可以看出,我们的半同步复制已经打开。

mysql主从架构的实现_数据库_29