MySQL主从(MySQL replication),主要用于MySQL的实时备份或者读写分离。
MySQL主从的原理非常简单,总结一下:
(1)每个主从仅可以设置一个主。
(2)主在执行SQL之后,记录二进制log文件(bin-log)
(3)从连接主,并获取主的bin-log,存于本地relay-log,并从上次执行的位置起执行SQL,一旦遇到错误则停止同步。
mysql主从配置replication,又叫A,B复制,保证主从数据同步
A --> change data --> bin_log -transfer --> B --> repl_log -->change data
从这几条replication原理来看,可以有这些推论:
(1)主从间的数据库不是实时同步,就算网络连接正常,也存在瞬间,主从数据不一致。
(2)如果主从的网络断开,从会在网络正常后,批量同步。
(3)如果对从进行修改数据,那么很可能从在执行主的bin-log时出现错误而停止同步,这是个很危险的操作。所以一般情况下,非常小心的修改从上的数据。
(4)一个衍生的配置是双主,即互为主从配置,只要双方的修改不冲突,可以工作良好。
(5)如果需要多主的话,可以用环形配置,这样任何一个节点的修改都可以同步到所有节点。
(6)可-以应用在读写分离的场景,用以降低单台MySQL的I/O
(7)可以是一主多从,也可以是相互主从(主主)
注意事项:
1、server-id必须唯一,一般使用ip的后三位
2、从库Slave_IO_Running:NO 可能原因:帐号无权限操作
3、Can't execute the query because you have a conflicting read lock,解锁下即可 unlock tables;
4、一般只有更新不频繁的数据或者对实时性要求不高的数据可以通过从服务器查询, 实时性要求高的数据仍然需要从主数据库获得
5、修改完主从服务器的配置需要重启mysql:service mysqld restart
vim /etc/my.cnf
[mysqld]
validate_password_policy=0
validate_password_length=6
server_id=51
log-bin=master51
binlog_format="mixed"
用户授权:给从库添加连接时使用的用户名
mysql> grant replication slave on *.* to repluser@"192.168.4.52" identified by "123456";
查看正在使用的binlog日志信息。
mysql> show master status;
vim /etc/my.cnf
[mysqld]
server_id=52
validate_password_policy=0
validate_password_length=6
保存,重启服务。
管理员登录数据库
show slave status;
change master to master_host="192.168.4.51",master_user="repluser",master_password="123456",master_log_file="日志名",master_log_pos=主库偏移量;
start slave;
show slave status\G; (出现Slave_IO_Running: Yes Slave_SQL_Running: Yes 就行了)
查看是否允许动态加载模块(默认允许)
show variables like "have_dynamic_loading";
永久启用半同步复制 vim /etc/my.cnf
主库的配置:plugin-load = rpl_semi_sync_master=semisync_master.so
rpl_semi_sync_master_enabled=1
从库的配置:plugin-load = rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=1
在高可用架构下,master 和 slave 需同时启动,以便在切换后能继续使用半同步复制
plugin-load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl_semi_sync_master_enabled=1
rpl_semi_sync_slave_enabled=1