主从形式:一主一从,主主复制,联级复制,一主多从--扩展系统读取性能,多主一从--5.7开始支持
用途:实时灾备的故障切换,读写分离,备份
主从原理:
主:log dump线程传binlog;
从:i/o线程接受读取binlog,并写入relay log文件,sql线程从relay log 文件中读取binlog并持久化
问题及解决:
主库宕机后,数据丢失---->半同步复制
主库写压力大,因从库只有一个sql 线程来持久化,复制可能延迟---->并行复制
半同步复制原理:
事务在主库写完binlog后需要从库返回一个已接受,才放回给客户端;
5.5集成到mysql,以插件的形式存在,需要单独安装
确保事务提交后binlog至少传输到一个从库
不保证从库应用完成这个事务的binlog
性能有一定的降低
网络异常或从库宕机,卡主库,直到超时或从库恢复
并行复制原理:
从库多线程apply binlog
在社区5.6中新增
库级别并行应用binlog,同一个库数据更改还是串行的
5.7版本并行复制基于事务组
部分数据复制
联级复制(常用)
A->B->C
B中添加参数log_slave_updates
B将把A的binlog记录到自己的binlog日志中
复制的监控
show slave status
复制出错处理
常见:1062(主键冲突),1032(记录不存在),1007(已创建数据库)
解决:手动处理,跳过复制错误:set global sql_slave_skip_counter=1
或者可以选择忽略这些错误 slave-skip-errors=1062,1032,1007
mysql主从复制是mysql高可用性,高性能(负载均衡)的基础
简单,灵活,部署方式多样,可以根据不同业务场景部署不同复制结构
复制过程中应该时刻监控复制状态,复制出错或延时可能给系统造成影响
mysql主从复制目前也存在一些问题,可以根据需要部署复制增强功能
主从实践:
主从复制要求mysql版本一致
1、修改主服务器master
vi /etc/my.cnf
[mysqld]
log-bin=mysql-bin //[必须]启用二进制日志
server-id=222 //[必须]服务器唯一ID,默认是1,一般取IP最后一段
2、修改从服务器slave
vi /etc/my.cnf
[mysqld]
log-bin=mysql-bin //[不是必须]启用二进制日志
server-id=226 //[必须]服务器唯一ID,默认是1,一般取IP最后一段
然后重启两台服务器的mysql
3、配置主服务器
mysql>GRANT REPLICATION SLAVE ON *.* to 'fangxslave'@'100.168.50.211' identified by 'fangxslave';
# 一般不用root帐号,主从用户用具体IP代替,加强安全。
mysql>show master status; #查询日志节点
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 | 308 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
注:执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化
4、配置从服务器
mysql>change master to master_host='100.168.50.203',master_user='fangxslave',master_password='fangxslave',master_log_file=' mysql-bin.000004',master_log_pos=308; #注意不要断开,308数字前后无单引号。
Mysql>start slave; 启动从服务器复制功能
如果有报错为ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository
使用reset slave可解决
5、检查复制状态
从服务器操作show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.2.222 //主服务器地址
Master_User: fangxslave //授权帐户名,尽量避免使用root
Master_Port: 3306 //数据库端口,部分版本没有此行
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 600 //#同步读取二进制日志的位置,大于等于Exec_Master_Log_Pos
Relay_Log_File: ddte-relay-bin.000003
Relay_Log_Pos: 251
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes //此状态必须YES
Slave_SQL_Running: Yes //此状态必须YES
......
注:Slave_IO及Slave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误)。
以上操作过程,主从服务器配置完成。