mysql主从复制原理
从库生成一个IO线程和SQL线程,IO线程用于同步主库的二进制日志数据,并保存在自己的中继日志中,主服务器上会生成一个dump线程用来传输binlog;SQL线程从中继日志中读取写入数据库
主从搭建配置
主机A,进行数据库备份,进行主服务器配置
- show table status; #查看库中所有表的信息(包括表的所用引擎)
- [root@shitouji ~]# mysqldump -uroot -p --master-data=2 --flush-logs --databases blog --single-transaction >/boot/blog.sql
- #使用--single-transaction选项时,不需要再使用 --lock-all-tables来锁定表,--single-transaction选项会自动进行锁定,在备份时,保存的文件最好是有时间格式/boot/blog`date +%F%H%M%S`.sql
- [root@shitouji ~]# scp -r blog.sql shitouji@IP:/home/shitouji/ #复制数据库
- 主服务器配置 vim /etc/my.cnf
- server-id = 1 character-set-server=utf8 #与从服务器的server-id不能一样
- 添加从服务器同步复制的用户 mysql>GRANT REPLICATION SLAVE ON *.* TO 'rep'@'从服务器ip';
主机B,进行数据还原,进行从服务器配置
- mysql -uroot -p < blog.sql
- 从服务器配置 vim /etc/my.cnf #将主服务器复制过来的配置文件进行修改并添加中继日志
- server-id = 2 character-set-server=utf8 relay-log= relay-log-bin relay-log-index = slave-relay-bin.index
- mysql> change master to master_host='主服务IP',master_user='用户',master_password='',master_log_file='mysql-bin.000030',master_log_pos=3255;
- mysql>show slave status\G; #查看从服务器状态,是否启动IO 和SQL线程
- start/stop slave; #启动/停止从服务器
- start/stop slave IO_Thread #启动/停止从服务器IO线程
- start/stop slave SQL_Thread #启动/停止从服务器SQL线程
mysql主从复制存在的问题:
- 主库宕机后,数据可能丢失
- 从库只有一个sql Thread,主库写压力大,复制很可能延时
解决方法:
- 半同步复制---解决数据丢失的问题
- 并行复制----解决从库复制延迟的问题
半同步复制,事务在主库写完binlog后需要从库返回一个已接受,才放回给客户端;
- 5.5集成到mysql,以插件的形式存在,需要单独安装
- 确保事务提交后binlog至少传输到一个从库
- 不保证从库应用完成这个事务的binlog
- 性能有一定的降低
- 网络异常或从库宕机,卡主库,直到超时或从库恢复
- 在/usr/local/mysql/lib/plugin/ 下有一个semisync_master.so/semisync_slave.so模块,用于支持半同步复制,在mariadb10.3.3版本后,已经安装该插件
- mysql>INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; 主服务器安装插件
- mysql>INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; 从服务器安装
- mysql>show global variables like '%rpl%'; 查看启用相关信息
- mysql>set global rpl_semi_sync_master_enabled/rpl_semi_sync_slave_enabled=1; 开启半同步复制