主要从事Linux,云原生架构改造,服务网格,ELK,python,golang等相关技术。
分类: Mysql/postgreSQL
2015-05-05 07:31:20
原文地址:MySQL复制原理和简单配置(5.6.20) 作者:maycn
为了保证应用24小时提供服务,那么我们需要做2件事情,系统数据的备份和冗余。备份可以将数据恢复到崩溃之前的状态,而冗余则是保证在一个或多个节点停止服务的情况下,应用仍能提供服务。
这里说的复制,就是指MySQL复制主节点(master)的所有数据改变到从节点(slave),并应用改变的数据,与主节点数据保存一致。通常复制就是为了给master创建一个可靠的副本。
MySQL复制,有什么特点呢?
(1) 数据分布 (Data distribution ),数据可以分布在不同的数据中心。
(2) 负载平衡(load balancing),可以分配查询,降低主服务器压力。
(3) 备份(Backups) ,复制本身就是一种master的备份。
(4) 高可用性和容错行 High availability and failover,当master宕机后,slave可以接管master的任务,同时具有及时纠正错误,挽回数据的容错率。
从MySQL5.0开始,MySQL默认采用日志复制,效率非常高,可靠性也非常高,前提是主从,一开始是完全相同的数据。当无法保证精准复制时,MySQL会基于行的复制。
MySQL的复制准确的说,是异步的,不是同步复制的。事务首先在主节点提交,然后复制给从节点,并在从节点上应用。这意味着主节点和从节点可能并不一致,如果主节点一直在更新,那么从节点始终是落后与主节点的。
异步复制优点在于,比同步复制更快,扩展性更好,占用系统资源更少。
同步复制则需要master等待所有的slave的写都完成后,才能提交,导致写的速度大大降低,同时需要额外的同步机制来保证一致性,但却有额外的通信消息传递,增加了网络数据量。
搭建一个主从复制,大致看看是一个什么样的效果,一主一从,最简单的开始。
节点 |
IP |
角色 |
服务ID |
Vm11.xxxx.com |
192.168.1.231 |
master |
1 |
Vm22.xxxx.com |
192.168.1.232 |
slave |
2 |
这里需要涉及到二进制日志,后面来详细说明,本次主要说明复制过程。
第一步:配置master。首先需要开启二进制日志,配置好server-id,然后启动MySQL,如下所示几行添加到/etc/my.cnf文件中:
log-bin=master-bin 二进制日志文件名称格式。
log-bin-index=master-bin.index 二进制日志的索引文件名
server-id=1 server id用于标示主从。
一般情况下log-bin默认是hostname-bin。Hostname的值来自pid-file选项,但是这样也会有问题,主机名修改之后,binlog日志文件名也会随之改变,索引文件还是可以读取到正确的值。
当不给log-bin-index值的时候,默认与binlog文件基本名相同,索引文件随主机名改变而改变,当你重启了服务器之后,索引文件就找不到日志文件了,认为不存在了。
接下来,需要创建一个复制用的用户。例如:
mysql> change master to
-> master_host='vm11.qq.com',
-> master_port=3306,
-> master_user='repl_user',
-> master_password='mysql';
Query OK, 0 rows affected, 2 warnings (0.04 sec)
注意:最好在同步之前,主从两边的数据库是一样的,因为master在没有开启二进制日志之前的所有操作都不会同步过去到slave的。
我们这里在master没有开启二进制日志之前,先建立了一个库test,slave肯定同步不过去,这时候master删除这个库。然后再次新建test的时候,出现了问题。
这是master的,看看slave的。
这里没有同步过去,看看什么问题。
错误:1008,test库不存在,drop database test语句执行不了,所以slave_sql_running状态变成了NO。生产环境很容易忽略,出现这样的问题。
CHANGE MASTER TO MASTER_HOST='vm11.qq.com',
MASTER_USER='repl_user',
MASTER_PASSWORD='mysql',
MASTER_LOG_FILE='master-bin.000001',
MASTER_LOG_POS=756;
Start slave;从新的位置从新同步,前面的忽略。
3.2.2 二进制日志
3.2.3 复制工作原理
1.基于语句复制
2.基于行的复制
3.2.4 推荐复制配置
3.2.5 复制延迟
优化主库高代价操作
备库并行写入
3.2.6 半同步和复制心跳