2019独角兽企业重金招聘Python工程师标准>>>
复制的步骤:
1.在主库上开启二进制日志,把数据更改记录到二进制日志(binary log)中.
mysql会按照事物提交的顺序而非每条语句的执行顺序来记录二进制日志,在记录二进制日志后,主库会告诉存储引擎可以提交事物。
2.从库将主库上的二进制日志复制到自己的中继日志(relay log)中
从库会启动一个I/O线程,I/O线程跟主库建立一个客户端连接,然后主库上会启动一个binary dump线程,用来读取主库上的二进制日志中的事件。不会对事件进行轮询,如果该线程同步上主库,进入休眠状态,直到主库发送信号量通知其有新的事件产生才会被唤醒。
3.从库读取中继日志的事件,将其重放到从库上执行,从而时间从库数据的更新。
复制解决的问题:
1.数据库分布:可以随意停止或开始复制,并在不同的地理位置来分布数据备份,尽量保持网络环境的稳定,低延迟连接。
负载均衡:在读取操作分布到多台从服务器上,实现对密集型应用的优化。
备份:对备份来说是技术上的补充。
高可用和故障切换:避免MYSQL单点故障,设计良好的故障切换能够缩短宕机时间。
复制的方式:
statement/row/mixed
基于row复制是从mysql5.1版本加入。两种方式都是通过在主库上记录二进制日志,在从库重放日志的方式来实现异步的数据复制。大的语句可能导致从库产生几秒,甚至几分钟的延迟。
####mysql复制
(1)dump thread:当从服务器来复制时,dump会去读取二进制日志的语句并发送给从服务器
(2)io thread:在从服务器由io thread到主服务上去请求二进制日志中语句的内容。每隔一段时间就会启动,io thread到主服务器上查看二进制日志是否有变化。如果有变化则就请求传输,一条语句复制过来。
(3)SQL thread(单线程):io thread获取到之后将其存储到relay log中。一条语句一条语句执行。
Mysql复制有三个种方式:异步,同步,半同步
1)异步:主服务器的修改操作本地完成就认为完成。至于后面的事,并不理会
2)同步指定是:主服务器涉及的修改操作,要等待从服务器也完成
3)半同步:在一主多从的环境中,只等待一台从服务器同步完成操作。设置一个等待超时时间,如果超过这个时间,则降级为异步。在5.5可以使用半同步,google公司提供一个补丁。半同步如果无法在指定时间完成-->自动 降到异步模式。
####mysql复制
一.搭建一个master对应1个slave
mysql5.5复制配置
1.规划网络和主从机器
master:10.10.54.64
slave:10.10.54.67
2.master config
log-bin=master-bin
server-id=1
binlog_formate=mixed
3.slave config
log-bin=slave-bin
binlog_formate=mixed
server-id=10
必须大于主
4.在master上面创建一个复制用户并授予权限
mysql> grant replication slave on *.* to 'gyf'@'10.10.54.67' identified by 'aaa12345';
mysql> flush privileges;
//在从上测试是否能用复制用户登录
[root@gyf ~]# mysql -ugyf -paaa12345 -h10.10.54.64
5.查看master上二进制日志和position位置
mysql> show master status;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000001 | 107 | | |
+-------------------+----------+--------------+------------------+
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=107;
拓展:重置master reset master
6.备份master上的数据,把备份maste数据库还原到从库上
[root@gyf ~]# mysqldump -uroot -paaa12345 --databases employees |mysql -uroot -paaa12345 -h10.10.54.67
[root@nan86 tmp]# mysqldump -uroot -paaa12345 --master-data=2 --single-transaction --flush-logs --database employees >employees.sql
[root@gyf ~]# mysqldump -uroot -paaa12345 --databases employees |mysql -uroot -paaa12345 -h10.10.54.67
[root@gyf tmp]# mysql -uroot -paaa12345 -h10.10.54.67<employees.sql
ERROR 1130 (HY000): Host '10.10.54.64' is not allowed to connect to this MySQL server
mysql> grant all privileges on *.* to root@10.10.54.64 identified by 'aaa12345';
mysql> flush privileges;
[root@nan86 tmp]# mysql -uroot -paaa12345 -h10.10.54.67<employees.sql
7.在slave上面change master操作
mysql> change master to master_host='10.10.54.64',master_user='gyf',
master_password='aaa12345',
master_log_file='master-bin.000001',master_log_pos=107;
8.查看slave状态
确定slave上的I/O线程和SQL线程状态为YES
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.10.54.64
Master_User: gyf
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000001
Read_Master_Log_Pos: 107
Relay_Log_File: nan85-relay-bin.000004
Relay_Log_Pos: 254
Relay_Master_Log_File: master-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
//可以单独停掉某一个线程
mysql> STOP SLAVE IO_THREAD;
mysql> STOP SLAVE SQL_THREAD;
9.在slave上启动slave
mysql> start slave;
###测试
在master上
mysql> create database a ;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| a |
| employees |
| master |
| mysql |
| performance_schema |
| test |
| tt |
+--------------------+
在slave上显示
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| a |
| employees |
| master |
| mysql |
| performance_schema |
| test |
| tt |
+--------------------+
6 rows in set (0.00 sec)
在master上创建删除添加数据,在slave上都能同步。