---------------------
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参数,否则双主中的另外一台非从主写数据从不会更新。
发表评论