- 准备两台centos主机192.168.2.11(主库)和192.168.2.12(从库)
- 两台主机安装mysql,并设置字符集为utf8
show variables like '%char%';该命令显示数据库字符集为拉丁
vim /etc/my.cnf
最后添加如下配置并重启mysql
character_set_server=utf8 - 主库设置
vim /etc/my.cnf添加如下内容
重启mysql,登录mysql添加账号(该账号具有复制权限)
grant replication slave on *.* to 'hanlf'@'%' identified by '123456';
执行show master status查看记下file和position,从库设置主库的时候需要用到
mysql> show master status; - 从库设置
vim /etc/my.cnf添加如下内容
server-id=12
重启mysql,登录mysql执行下面命令
change master to master_host='192.168.2.11',master_port=3306,master_user='hanlf',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=437;
查看从库信息
show slave status\G;
start slave;
show processlist; - 主从复制作用
- 数据热备:作为后备数据库,主库故障后切换到从库;
- 提升IO性能:IO访问频率高,单机无法满足,此时做多库存储,有效降低磁盘IO频率,提高单机IO性能;
- 读写分离:使数据库支持更大的并发,主库负责写,从库负责读;
- 什么是主从复制
MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表。
主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库,主数据库一般是准实时的业务数据库。在最常用的mysql数据库中,支持单项、异步赋值。在赋值过程中,一个服务器充当主服务器,而另外一台服务器充当从服务器;此时主服务器会将更新信息写入到一个特定的二进制文件中。
并会维护文件的一个索引用来跟踪日志循环。这个日志可以记录并发送到从服务器的更新中去。当一台从服务器连接到主服务器时,从服务器会通知主服务器从服务器的日志文件中读取最后一次成功更新的位置。然后从服务器会接收从哪个时刻起发生的任何更新,然后锁住并等到主服务器通知新的更新。 - mysql主从形式
- 一主一从
- 主主复制
- 一主多从
- 多主一从
- 级联复制
- 主从复制原理
- master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中;
- slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/OThread请求master二进制事件;
- 同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后I/OThread和SQLThread将进入睡眠状态,等待下一次被唤醒。
- 也就是说
- 从库会生成两个线程,一个I/O线程,一个SQL线程;
- I/O线程会去请求主库的binlog,并将得到的binlog写到本地的relay-log(中继日志)文件中;
- 主库会生成一个log dump线程,用来给从库I/O线程传binlog;
- SQL线程,会读取relay log文件中的日志,并解析成sql语句逐一执行;
- 注意点
- master将操作语句记录到binlog日志中,然后授予slave远程连接的权限(master一定要开启binlog二进制日志功能;通常为了数据安全考虑,slave也开启binlog功能)。
- slave开启两个线程:IO线程和SQL线程。其中:IO线程负责读取master的binlog内容到中继日志relay log里;SQL线程负责从relay log日志里读出binlog内容,并更新到slave的数据库里,这样就能保证slave数据和master数据保持一致了。
- Mysql复制至少需要两个Mysql的服务,当然Mysql服务可以分布在不同的服务器上,也可以在一台服务器上启动多个服务。
- Mysql复制最好确保master和slave服务器上的Mysql版本相同(如果不能满足版本一致,那么要保证master主节点的版本低于slave从节点的版本)。
- master和slave两节点间时间需同步。
- 具体过程
- 从数据库执行change master to 命令(主数据库的连接信息+复制的起点)
- 从数据库会将以上信息,记录到master.info文件
- 从数据库执行 start slave 命令,立即开启SLAVE_IO_THREAD 和SLAVE_SQL_THREAD这两个线程
- 从数据库 SLAVE_SQL_THREAD,读取master.info文件中的信息获取到IP,PORT,User,Pass,binlog的位置信息
- 从数据库SLAVE_IO_THREAD请求连接主数据库,主数据库专门提供一个SLAVE_IO_THREAD,负责和SLAVE_SQL_THREAD交互
- SLAVE_IO_THREAD根据binlog的位置信息,请求主数据库新的binlog
- 主数据库通过Binlog_DUMP_Thread将最新的binlog,通过网络TP给从数据库的SALVE_IO_THREAD
- SLAVE_IO_THREAD接收到新的binlog日志,存储到TCP/IP缓存,立即返回ACK给主库,并更新master.info
- SLAVE_IO_THREAD将TCP/IP缓存中数据,转储到磁盘relaylog中.
- SLAVE_SQL_THREAD读取relay.info中的信息,获取到上次已经应用过的relaylog的位置信息
- SLAVE_SQL_THREAD会按照上次的位置点回放最新的relaylog,再次更新relay.info信息
- 从数据库会自动purge应用过relay进行定期清理
- 一旦主从复制构建成功,主数据库当中发生了新的变化,都会通过 slave_dump_THREAD发送信号给SLAVE_IO_THREAD,增强了主从复制的实时性.
mysql主从复制
于 2022-02-03 23:00:50 首次发布