主从形式:一主一从,主主复制,联级复制,一主多从--扩展系统读取性能,多主一从--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均属错误)。
以上操作过程,主从服务器配置完成。