MySQL主从复制实践

失忘LHY2019-02-19 07:09:37

本文记录了一次配置MySQL主从复制的实践过程。

1.准备工作:

    MySQL服务器两台:

        主服务器(master):192.168.1.107

        从服务器(slave):192.168.1.110

2.实现过程

    (1).开启主数据库的二进制日志

        在这遇到了很多坑,网上教程都说修改/etc/mysql/my.cnf文件,只要在其中添加“log-bin=mysql-bin”就可以了,亲测之后发现不好使,重启mysql服务的时候会报错。

        经过尝试发现可以通过修改/etc/mysql/mysql.conf.d/mysqld.cnf文件:

        第一次尝试将文件中“log_bin= /var/log/mysql/mysql-bin.log”一行的注释打开,重启之后进入mysql,通过“ show variables like '%log_bin%';”命令检测,发现日志并没有打开。

第二次尝试将文件该行修改为“log_bin= mysql-bin”,重启mysql服务后检测,日志已经打开,见图:

    (2).在主服务器中创建用于从服务器访问的账号"slave_user/123456"

     “grant replication slave on *.* to 'slave_user'@'192.168.1.110' identified by '123456'

     “flush privileges

     创建完成后通过"select user,host from mysql.user;"查看是否创建成功,如下图:

   (3).查看主服务器上二进制文件名与位置

    “show master status;

    结果如下:

   (4).告知从服务器二进制文件名与位置

    在192.168.1.110服务器上执行:

    “change master to

     master_host='192.168.1.107',

     master_user='slave_user',

     master_password='123456',

     master_log_file='mysql-bin.000001',

     master_log_pos=154;”

     (从服务器需要设置和主服务器不同的service-id)

   (5).启动slave同步进程、

   在192.168.1.110服务器上执行:

   “start slave;

   至此主从复制就配置完成了。

3.测试

   在192.168.1.110服务器上执行:“show slave status;”,当看到

Slave_IO_Running和Slave_SQL_Running都为YES的时候就表示主从同步设置成功了。在这一步的时候遇到了Slave_IO_Running=Connecting的情况,经过排查,确定了是由于服务器的3306端口不能访问。使用“netstat -an|grep 3306”命令查询,结果如下:

可以知道3306端口绑定了127.0.0.1的地址,解决办法是修改mysql配置文件/etc/mysql/mysql.conf.d/mysqld.cnf,注释掉“bind-address=127.0.0.1”一行后重启服务就可以了。

   接下来在主服务器192.168.1.107上创建数据库“test”,在“test”中创建表“user”:

   “create database test;”

   “use test;”

   “create table user(id bigint auto_increment,name varchar(20),primary key(id))”

   在192.168.1.110服务器上执行:“show databases;”“show tables;”查看是否同步成功,查询结果如下图:

   主服务器上的操作都已同步到从服务器上,所以主从复制配置成功。

4.其他配置

   # 不同步哪些数据库  

   binlog-ignore-db = mysql   

  # 只同步哪些数据库,除此之外,其他不同步  

  binlog-do-db = game  

5.主从复制的原理

实现了主从复制的配置,我们了解一下主从复制的原理,看图:

(1).Master将进行的操作记录在Binary log文件中;

(2).Slave的IO线程连接到Master,请求读取指定位置之后日志;

(3).Master接收到Slave的请求后,从Binary log文件中读取相应内容返回给Slave的IO线程,同时返回的还有pos值(用于下次请求)和Binary log文件名;

(4).Slave收到Master返回的内容后写入到Relay log文件中,并记录pos值和Binary log文件名;

(5).Slave的SQL线程检测到Reply log文件变化后,解析log文件的内容,完成于Master的同步。

以上是我自己的理解,有什么不对的地方欢迎斧正。