①复制概述:
-- 概念:让一台服务器的数据与其他服务器保持同步。
复制通常不会增加主库的开销,主要是启用二进制日志带来的开销,每个备库也会对主库增加一些负载(例如网络I/O开销)
一主库多备库,造成一些浪费,含大量不必要重复
-- 复制解决的问题:数据分布、负载均衡(通过mysql复制可将读操作分布到多个服务器上)、备份(但不是真的备份技术)、高可用性和故障切换、Mysql升级测试。
-- 复制如何工作:
主库数据
更新到
二进制日志文件
->
备库通过I/O线程
复制主库日志并写入中继日志
->
备库读取中继日志并
重放
数据库
②配置复制:
-- 创建账号:
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TOrepl@'119.29.155.%' IDENTIFIED BY 'password';
注:以上创建一
账号repl(
仅允许对应ip访问并且授予了
slave(用于复制)与
client(用于切换主备)权限)
-- 配置主库和备库:
首先在主库my.cnf文件(我的在/etc/my.cnf)增加或修改如下:
log_bin = mysql-bin
server_id = 10
然后
SHOW MASTER STATUS测试如下:
注:server_id设置为10是为了不重复(默认为1) ----重启下mysql(server mysqld restart)
备库上增加或修改my.cnf如下:
server_id = 2
relay_log = /usr/local/mysql/mysql-relay-bin
log_slave_updates = 1
注:relay_log指定
中继日志的命名和位置(该文件夹需
权限,先给个777吧),log_slave_updates允许备库将
重放日志也记录在备库二进制日志文件,read_only仅
允许用户在备库
读取 ----重启下mysql(server mysqld restart)
-- 启动复制:告诉备库如何
连接到主库并
重放其二进制日志
该步不需要修改my.cnf而是采用
CHANGE MASTER TO语句(在
备库执行)
CHANGE MASTER TO MASTER_HOST='119.29.37.xx',
MASTER_USER='repl',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000007',
MASTER_LOG_POS=0;
参数说明:MASTER_LOG_POS=0日志
从头开始读,
MASTER_USER为前面创建的
用户,
MASTER_HOST为主库
主机,
MASTER_LOG_FILE为
配置主库测试时的FILE
然后使用
SHOW SLAVE STATUS 检查复制是否正确执行
注:Slave_IO_State、Slave_IO_Running、Slave_SQL_Running显示当前备库复制
尚未运行。
然后
START SLAVE 开始复制
再次用
SHOW SLAVE STATUS 查看发现备库复制是否运行
然后
SHOW PROCESSLIST\G 查看主库和备库是否连接成功。
-- 从另一个服务器开始配置:假设
主备库刚安装好且都是
默认配置,此时两台
数据一致,并且二进制日志为新,但是如果是安装好主库安装另一备库就会出现问题。
解决思路:须先将数据同步到新增备库(冷备份(先关闭数据库)、热备份、使用mysqldump、快照等)
-- 推荐的复制配置:
sync_binlog:sync_binlog=1 开启时Mysql每次在提交事务前会将
二进制日志同步到磁盘上,保证服务器
崩溃时不会丢失事件。
如果使用
InnoDB,下列强烈推荐使用:
innodb_flush_logs_at_trx_commit
innodb_support_xa=1
innodb_safe+binnlog
在mysql5.5中不介意
fsync开销可开启如下防止不刷新到磁盘
sync_master_info = 1
sync_relay_log = 1
sync_relay_log_info = 1
③复制的原理:
赋值有两种方式:基于语句复制和基于行复制
-- 基于行/语句哪种更优:
基于语句优点:兼容小细节,sql语句结构可有所差异
基于语句确定:对于特殊情况如触发器或者存储过程等不支持
基于行优点:可处理高级用法(如触发器),减少锁的使用,有利于某些数据恢复,占用更少CPU,报错不存在记录。
基于行缺点:语句无在日志记录,难以判断那些sql更新过程,像黑盒子,很难知道问题所在
-- 发送复制文件到其他备库;
log_slave_updates可让备库变成其他服务器主库
注:服务器ID可打破无限循环---server_id
-- 复制过滤器:复制过滤允许你
仅复制服务器上一
部分的数据(不过不好用),容易造成主备
不同步或出错。
注:更多复制拓扑深入请了解高性能mysql