欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux上实现Mysql的主从复制(为Mycat读写分离作准备)

程序员文章站 2022-05-08 23:10:02
...

今天做不成的事,明天也不会做好。


各位同学大家好,今天给大家分享一下数据库的主从复制和读写分离。为什么我们要做这些呢:我们知道,随着项目用户并发量的增加,应用层通过各种第三方技术以及微服务架构达到了需求,但是瓶颈会卡在的数据库上;因此,我们需要对数据库进行优化,其中一种方法就是读写分离。顾名思义,读写分离就是把数据库的读和写操作分在不同的库进行;主从复制是读写分离的前提。
这篇文章,我们先介绍Mysql的主从复制,好为后面读写分离作准备。


1.描述

首先,什么叫做主从复制,即当主数据库进行数据的增删改操作时,从数据库也要进行一个同样的操作,以确保和主数据库的数据保持一致,即主从复制。今天我们来写一个一主一从的示例来实现主从复制。

2.实现

2.1 准备工作

首先我们需要准备两个mysql数据库,版本最好一致,这里我们使用Mysql5.6进行演示,主从信息如下
主数据库 Linux(Centos7.3)
从数据库 Linux(Centos7.3)

2.2 配置描述

其实主从复制的本质思想就是,从数据库通过监听主数据库的一个二进制文件,当主数据库进行数据变化时,会将变化记录在这个二进制文件中,此时从数据库因为对此文件进行了监听,所以进行了同样的同步操作。

Linux上实现Mysql的主从复制(为Mycat读写分离作准备)
二进制日志简介


主服务器: 
  1. 开启二进制日志
  2. 配置唯一的server-id
  3. 获得master二进制日志文件名及位置
从服务器: 
  1. 配置唯一的server-id
  2. 读取master二进制日志
  3. 启用slave服务

2.3 配置数据库

一、主服务器master修改

1.找到my.cnf文件

[root@VM_0_2_redhat ~]# find / -name my.cnf
/usr/local/mysql/my.cnf

2.进入vim视图模式

[root@VM_0_2_redhat ~]# vi /usr/local/mysql/my.cnf

在mysqld中添加log-bin=mysql-bin(开启二进制日志),server-id=1(设置server-id),如下图所示

Linux上实现Mysql的主从复制(为Mycat读写分离作准备)
master mysql配置完毕,我们来登录master mysql查看我们具体的二进制文件名和位置
3.重启mysql

[root@VM_0_2_redhat ~]# service mysqld restart

4.连接mysql

[root@VM_0_2_redhat ~]# mysql -u root -p 密码

5.输入mysql命令进行master状态查看(如下所示)

mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |   347653 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

二进制文件名(mysql-bin.000001)和位置(347653 )

二、从数据库slave修改

同样找到my.cnf配置文件,添加server-id
1.找到my.cnf文件

[root@VM_0_2_redhat ~]# find / -name my.cnf
/usr/local/mysql/my.cnf

2.进入vim视图模式

[root@VM_0_2_redhat ~]# vi /usr/local/mysql/my.cnf

在mysqld中添加server-id=2(设置server-id),如下图所示
Linux上实现Mysql的主从复制(为Mycat读写分离作准备)
slave mysql配置完毕,我们来登录slave mysql进行与master mysql 的关联
3.重启mysql

[root@VM_0_2_redhat ~]# service mysqld restart

4.连接mysql

[root@VM_0_2_redhat ~]# mysql -u root -p 密码

5.输入mysql命令进行主数据库绑定(如下图所示),MASTER_LOG_FILE为你的二进制文件名(可能不一样),MASTER_LOG_POS为你的位置(可能不一样)

mysql> CHANGE MASTER TO
MASTER_HOST='182.92.172.80',
MASTER_USER='root',
MASTER_PASSWORD='你的密码',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=347653 ;

6.启动slave同步进程

mysql> start slave;

7.查看状态(如下图所示,当Slave_IO_Running和Slave_SQL_Running都为YES的时候就表示主从同步设置成功了。)

mysql> show slave status\G

当然我们也可以通过stop slave命令来关闭slave同步或者更换master。
最后我们在主数据库中创建一个数据库,你会发现当你在master中创建表或者是在表中插入数据时,我们的slave都会跟着同步进行这些操作,此时你的主从复制就算是大功告成了。


最后,我们来分析一下会遇到的问题:实际上,主从复制这个过程就是从数据库监听二进制日志文件,并用相应的sql语句建库,建表,插入数据。但会有这样的问题:我们在从数据库删除了一个表,然后主数据库再去删除表,这个时候从数据库就会找不到表,错误会一直积累在slave,导致无法进行主从复制。

解决方法:

#停止同步
stop slave; 
#表示跳过一步错误,后面的数字可变
set global sql_slave_skip_counter =1;
start slave; 

之后再用mysql> show slave status\G 查看:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
ok,现在主从同步状态正常了。

但是从根源上来说,在开启主从复制之前,我们要确保从数据库的干净,尽量只有四张系统表,同时不对从库进行任何读以外的操作。

其实还有一个禁忌设定方式,可以跳过一些复制报错,因为不建议,只是拿出来说说可以这么干

#修改配置文件
vim /etc/my.cnf
[mysqld]
#跳过指定error no类型的错误
#slave-skip-errors=1062,1053,1146
#跳过所有错误
#slave-skip-errors=all
相关标签: mysql 主从复制