文章目录
主从复制
MySQL主从复制是一种数据库复制技术,它允许一个MySQL数据库服务器将数据更新操作(增删改)自动复制到一个或多个其他从数据库服务器。这种技术可以提高数据库的可用性、扩展性和性能。
实现原理
主从复制的基本原理可以分为以下几个步骤:
- 主服务器将数据更新操作记录在二进制日志(Binary Log)中。二进制日志包括两种类型:
语句式日志(Statement-Based Logging):记录执行的SQL语句。
行式日志(Row-Based Logging):记录实际发生的数据变更。 - 从服务器定期从主服务器获取二进制日志。从服务器通过一个名为I/O线程的后台进程连接到主服务器,请求二进制日志的更新。主服务器将更新发送给从服务器。
- 从服务器将获取到的二进制日志记录在中继日志(Relay Log)中。中继日志是从服务器上的一个临时存储区域,用于存储从主服务器获取到的二进制日志,以便SQL线程可以顺序地执行它们。
- 从服务器通过一个名为SQL线程的后台进程将中继日志中的数据更新操作重放到从服务器的数据库中。SQL线程会根据中继日志中的记录,执行相应的数据更新操作,以保持从服务器数据库的一致性。
主从复制的优点
- 负载均衡:通过将读操作分散到从服务器上,可以减轻主服务器的负担,提高整体性能。
- 数据备份:从服务器可以作为主服务器的备份,当主服务器出现故障时,可以快速切换到从服务器。
- 扩展性:当数据量增大时,可以通过增加从服务器来提高数据库的处理能力。
主从复制的分类
- 全同步复制:这种模式下,主服务器在提交事务之前,需要等待所有从服务器都确认已经接收到并完成了数据更改。
- 异步复制:在这种模式下,主服务器将数据更改写入二进制日志,并立即返回成功给客户端。然后,从服务器异步地读取主服务器的二进制日志,并将其应用于自身的数据库中。由于是异步的,所以从服务器可能会有一定的延迟。
- 半同步复制:这是复制模式主要用于提高数据可靠性。在这种模式下,主服务器将数据更改写入二进制日志,并等待至少一个从服务器确认已经接收到数据更改,然后返回成功给客户端。从服务器接收到数据后,将其应用于自身的数据库。半同步复制相比异步复制,减少了数据丢失的可能性。
实现1主3从的架构
我准备了1个本地服务器和3个云服务器,其中一台云服务器作为主库,其他三台作为从库。
节点 | 角色 | IP |
---|---|---|
节点1 | 主服务器 | 123.207.5.157 |
节点2 | 从服务器 | 121.37.212.191 |
节点3 | 从服务器 | 8.134.195.226 |
节点4 | 从服务器 | 192.168.1.2 |
(1)主节点执行,配置主服务器节点1的配置文件:
启用二进制日志,并设置唯一的服务器ID。
vim /etc/my.cnf
添加以下内容
server-id=9 #要求每个服务器的id都不一样
log-bin=master-a-bin #日志文件名称
binlog-format=ROW #二进制日志格式,有row,statement,mixed三种类型,主从的配置需要一致
binlog-do-db=shop-seckill #需要同步的数据库名称
创建3个用于复制的用户,并授予复制权限。
create user 'root'@'121.37.212.191' identified by '密码';
create user 'root'@'8.134.195.226' identified by '密码';
create user 'root'@'192.168.1.2' identified by '密码';
grant replication slave on *.* to 'root'@'121.37.212.191' ;
grant replication slave on *.* to 'root'@'8.134.195.226' ;
grant replication slave on *.* to 'root'@'192.168.1.2' ;
重启MySQL服务
service mysql start
(2)从节点执行,在3个从节点都要执行,配置从服务器(节点2,3和节点4一样的操作,只需要server-id都不一样即可):
修改my.cnf配置文件,设置唯一的服务器ID和主服务器的信息。
vim /etc/my.cnf
添加以下内容
[mysqld]
basedir=/usr/local/mysql8
datadir=/usr/local/mysql8/data
socket=/tmp/mysql.sock
character-set-server=utf8
default_authentication_plugin=mysql_native_password
port=3306
log-bin=slave-a-bin
binlog-format=ROW
server-id=4 #这里需要保证每个服务器的server-id都不一样
重启MySQL服务
service mysql start
(3)主节点执行,查看主节点的binlog文件名以及偏移量的位置
show master status;
从节点需要知道复制主节点的哪个文件名以及具体位置,所以需要记录主节点的binlog文件名以及偏移量的位置
(4)从节点执行,在3个从节点都要执行,从节点指定主服务器信息
change master to master_host='123.207.5.157',master_user='账户名',master_password='密码',master_log_file='master-a-bin.000001',master_log_pos=13694;
注意
:master_host 是主节点ip地址,master_user 和 master_password主节点的账号和密码,master_log_file 和master_log_pos 是步骤(3)查询出来的File文件名和Position偏移量位置。
启动从节点
start slave;
查看从节点状态
show slave status \G;
Slave_IO_Running 线程和 Slave_SQL_Running线程都为YES说明主从复制配置成功。
(5)主节点查看从节点的个数,有三个从节点
SELECT HOST FROM information_schema.processlist WHERE COMMAND = 'Binlog Dump';
这个查询语句会返回当前连接到主服务器的从服务器的IP地址。COMMAND列的值为Binlog Dump表示该连接是从服务器与主服务器之间的复制连接。
或者直接查看从节点server-id
show slave hosts;
验证主从复制
(1)在主节点上创建数据库shop-sekcill
(2)导入sql运行文件,就是一些创建表的sql语句
(3)从节点查看数据库,sql语句执行成功,说明主从同步完成。