MYSQL复制之异步复制

---------------------

MySQL复制技术之异步复制

----------------------------------

 

复制有2种技术:默认是异步复制

* 异步复制:主库的DDL、DML的语句执行完成,写了二进制日志后,从库才能复制。

* 半同步复制:主库在执行DDL、DML语句时,先发送到从库上执行,且从库执行完成后,主库才执行。

 

1、异步复制搭建方法

复制技术至少要有两台服务器,1主1从,且主从数据库版本必须一致,因为每个版本的功能存在差异,为了避免不必要的故障。

1主多从就是将从多做几台。

 

(1)、准备两台主机,配置好静态IP,且两台主机IP能互通,将主从两台机器的主机名配置好,并写进/etc/hosts文件里,编译安装好5.6版本数据库

 

主服务器:Master    ip:10.1.1.10

从服务器:Slave     ip:10.1.1.20

 

(2)、在主库上,授权一个复制使用的帐号,只授予super,replication slave权限,这里创建一个qy用户,可以从10.1.1.20这个IP上进行连接

 

mysql> grant super,replication slave on *.* to 'qy'@'10.1.1.20' identified by '123';
mysql> flush privileges;


 

(3)、在主数据库服务器上修改配置文件/usr/local/mysql56/etc/my.cnf,开启二进制日志,并设置复制架构的id

在/usr/local/mysql56/etc/my.cnf中加上下面参数

log-bin=master-bin.log
server-id=1         #此ID值在复制的整个架构中,每个节点必须唯一


重启数据库生效

 

(4)、在主库上,设置表锁,是为了确保主数据库上没有任何操作。

 

mysql> flush tables with read lock;


 

(5)、将主库上当前二进制日志名和pos值打印出来,这个是为了在从数据库上启动复制以后,指定从这个点开始进行数据的复制。(pos值类似at值)

 

mysql> show master status;
+------------------+-----------------+------------------+-----------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+-----------------+------------------+-----------------------+
| master-bin.000001 |     120 |              |                  |
+------------------+-----------------+------------------+-----------------------+


 

(6)、现在主数据库上已经将表锁定,停止新的数据插入,这时我们生成一个备份到从数据库上,为了保证主从数据的一致性。备份的方法有很多种,这里先用我们之前教过的方法:

 

# tar cvf data.tar /data/mysql56
# scp –r ./data.tar 10.1.1.20:/data


 

(7)、来到从服务器上,将主数据库上的备份恢复到从数据库上,因为是打包的,只需要解压即可

 

# tar xf /data/data.tar -C /data/mysql56
# mv /data/mysql56/mysql56/* /data/mysql56/   #  --根据实际情况自己修改
# rm -rf /data/mysql56/mysql56/         #             --根据实际情况自己修改


 

# vim /data/auto.cnf   --修改里面的uuid值,随便改一两个数字即可

 

(8)、修改从数据库配置文件/usr/local/mysql56/etc/my.cnf,增加server-id参数,此ID值必须唯一,不能和其它服务器相同

在/usr/local/mysql56/etc/my.cnf文件的[mysqld]标签下加入以下参数

 

server-id=2


重启生效

 

(9)、在从数据库上配置连接主数据库配置,指定复制使用的账号/密码,主服务器的ip、端口、以及日志文件及pos位置等

 

mysql> change master to                       --配置从服务器连接主服务器

    -> master_user='qy',                      --主服务器建立复制的帐号

    -> master_password='123',         --密码

    -> master_host='10.1.1.10',               --主服务器IP

    -> master_port=3308,                      --端口,注:不能加引号

    -> master_log_file='master-bin.000001',  --主库上面查到的文件名

    -> master_log_pos=120;            --主库上面查到的位置号

 

(10)、配置好后,从数据库上启动slave进程,让从数据库的I/O和SQL线程生效

 

mysql> start slave;


              

错误1:

ERROR 1200 (HY000): The server is not configured as slave; fix in config file or with CHANGE MASTER TO

mysql> reset slave all;               --清空slave

 

错误2:

Slave_SQL_Running: No

mysql> change master to master_log_file='master-bin.000001',master_log_pos=984;

 

(11)、这时在从服务器上执行: show slave status\G

mysql> show slave status\G


*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 10.1.1.10             --主库IP地址

                  Master_User: qy                    --主库上用于主从复制的用户账号

                  Master_Port: 3308                  --主库MySQL端口

                Connect_Retry: 60                    --重新连接时间

              Master_Log_File: master-bin.000001     --从库I/O线程当前读取主库Binlog文件名

          Read_Master_Log_Pos: 120                   --从库I/O线程读取主库Binlog的位置

               Relay_Log_File: mysql56-relay-bin.000001      --SQL线程正在应用的Relay log

                Relay_Log_Pos: 372                   --SQL线程正在应用Relay log的位置

        Relay_Master_Log_File: master-bin.000001     --SQL线程正在应用的Relay log对应的Binlog

             Slave_IO_Running: Yes    --I/O线程YES

            Slave_SQL_Running: Yes    --SQL线程YES

              Replicate_Do_DB:

          Replicate_Ignore_DB:

           Replicate_Do_Table:

       Replicate_Ignore_Table:

      Replicate_Wild_Do_Table:

  Replicate_Wild_Ignore_Table:

                   Last_Errno: 0

                   Last_Error:

                 Skip_Counter: 0

          Exec_Master_Log_Pos: 493            --中继日志Relay log中Relay_Log_Pos位置对应与主Binlog的位置

              Relay_Log_Space: 547

              Until_Condition: None

               Until_Log_File:

                Until_Log_Pos: 0

           Master_SSL_Allowed: No

           Master_SSL_CA_File:

           Master_SSL_CA_Path:

              Master_SSL_Cert:

            Master_SSL_Cipher:

               Master_SSL_Key:

        Seconds_Behind_Master: 0

Master_SSL_Verify_Server_Cert: No

                Last_IO_Errno: 0

                Last_IO_Error:

               Last_SQL_Errno: 0

               Last_SQL_Error:

  Replicate_Ignore_Server_Ids:

             Master_Server_Id: 1

                  Master_UUID: 83caeab7-6dbb-11e6-9e67-000c294d8ca6

             Master_Info_File: /data/mysql56/master.info

                    SQL_Delay: 0

          SQL_Remaining_Delay: NULL

      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it

           Master_Retry_Count: 86400

                  Master_Bind:

      Last_IO_Error_Timestamp:

     Last_SQL_Error_Timestamp:

  

   此时slave已经连接上master,并开始接受并执行日志了

 

(12)、来到主数据库上,将表解锁,并创建库、表、并插入数据进行测试,观察从数据库上是否有同步

 

mysql> unlock tables;  --解除主服务器表锁

 

mysql> create database abc;
mysql> create table abc.aa(id int(1),name char(20));
mysql> insert into abc.aa values(1,"主库插入测试1");


 

(13)、来到从数据库上进行检查(12)步所创建的库、表和数据是否同步了过

mysql> show databases;
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| abc                |
+--------------------+
4 rows in set (0.00 sec)
 
 
mysql> select * from abc.aa;
+----+----------------+
| id |    name        |
+----+----------------+
|  1 | 主库插入测试1  |
+----+----------------+
1 rows in set (0.00 sec)


 

 

至此,1主1从搭建完毕。在复制架构中,只有主写的数据,从会复制,而从服务器写的数据,主是不会复制的。

 

 

2、多级复制架构

在1主1从或多从架构中,只有主服务器是开启二进制日志的,是用来向从数据库发送数据的,如果将1主多从改成级联多级复制时,此时就要在中间的服务器上开户binlog和log-slave-updates参数

 

log-slave-updates参数是用来配置从库上的更新操作是否写进二制日志,默认是不打开的,但从库同时也作为其它服务器的主库时,搭建一个多级链式的复制,那么就需要打开这个参数,这个参数要和binlog参数一起使用。

 

在/usr/local/mysql56/etc/my.cnf配置文件里的[mysqld]标签下加入以下参数

 

log-slave-updates=1
log-bin=slave2-bin


 

3、双主架构

双主架构,就是把1主1从架构,反过来做一遍,两台服务器都是对方的主,也都是对方的从,这样两台服务器上的数据库任何一方在写数据时,另一方都会有相同的数据。

 

 

4、双主多从架构

双方1从或多从架构,就是把双主和级联结合起来。例如双主一从,需要在从的主上开启log-slave-updates=1参数,否则双主中的另外一台非从主写数据从不会更新。

 

 

 

 

 


最后编辑于:2021/01/16作者: admin

发表评论