主从复制
- 主从复制的作用
- 主从复制的原理
- 一主一从架构
- 主从配置文件
- 1.主机配置
- 2.从机配置
- 3.主机建立账户并授权
- 4.从机:配置需要复制的主机
- 5.测试
- 6.停止主从同步
- binlog_format三种格式
- 双主双从架构
如何提升数据库并发能力:
在实际工作中,我们常常将 redis作为缓存与MySQL配合来使用,当有请求时,会首先从缓存中进行查找,如果存在就直接取出。不存在再访问数据库,这样就提升了读取效率,减少后端数据库的访问压力。redis的缓存架构是高并发架构中非常重要的一环。
此外,一般应用对数据库而言都是“ 读多写少”,也就说对数据库读取数据的压力比较大,有一个思路就是采用数据库集群的方案,做主从架构、进行读写分离,这样同样可以提升数据库的并发处理能力。但并不是所有的应用都需要对数据库进行主从架构的设置,毕竟设置架构本身是有成本的。
如果我们的目的在于提升数据库高并发访问的效率,那么首先考虑的是如何优化SQL和索引,这种方式简单有效;其次才是采用缓存的策略,比如使用 Redis将热点数据保存在内存数据库中,提升读取的效率;最后才是对数据库采用主从架构,进行读写分离。
主从复制的作用
-
读写分离
-
数据备份 通过主从复制将主库上的数据复制到了从库上,相当于是一种热备份机制,也就是在主库正常运行的情况下进行备份,不会影响到服务。
-
高可用性 数据备份实际上是一种冗余机制,通过这种冗余方式可以换取数据库的高可用性,也就是当服务器出现故障或宕机的情况下,可以切换到从服务器上,保证服务的正常运行。
主从复制的原理
Slave 从Master 读取binlog 来进行数据同步。
在进行主从复制时,先检查服务器是否开启二进制日志备份。默认情况下从机会执行所有主机中保存的事件,也可以通过配置,使从服务器执行特定的事件。
复制三步骤:
步骤1: Master 将写操作记录到二进制日志( binlog )。
步骤2: Slave 将Master 的binary log events拷贝到它的中继日志( relay log );
步骤3: Slave 重做中继日志中的事件,将改变应用到自己的数据库中。 MySQL复制是异步的且串行化的,而且重启后从接入点开始复制。
复制的基本原则:
每个Slave 只有一个Master
每个Slave 只能有一个唯一的服务器ID
每个Master 可以有多个Slave
一主一从架构
主从配置文件
1.主机配置
建议mysql版本一致且后台以服务运行,主从所有配置项都配置在[mysqld] 节点下,且都是小写字母。
vim /etc/my.cnf
具体参数配置如下:
#[必须]主服务器唯一ID
server-id=1
#[必须]启用二进制日志,指名路径。比如:自己本地的路径/log/mysqlbin
log-bin=mysql01-bin
#[可选] 0(默认)表示读写(主机),1表示只读(从机)
read-only=0
#设置日志文件保留的时长,单位是秒
binlog_expire_logs_seconds=6000
#控制单个二进制日志大小。此参数的最大和默认值是1GB
max_binlog_size=200M
#[可选]设置不要复制的数据库
binlog-ignore-db=test
#[可选]设置需要复制的数据库,默认全部记录。比如:binlog-do-db=mysql01_master_slave
binlog-do-db=需要复制的主数据库名字
#[可选]设置binlog格式
binlog_format=STATEMENT
修改配置文件后重启mysql服务器。systemctl restart mysql
2.从机配置
要求主从所有配置项都配置在my.cnf 的[mysqld] 栏位下,且都是小写字母。
#[必须]从服务器唯一ID
server-id=2
#[可选]启用中继日志
relay-log=mysql-relay
修改配置文件后重启mysql服务器。systemctl restart mysql
注意:主从机都关闭防火墙
service iptables stop #CentOS 6
systemctl stop firewalld.service #CentOS 7
3.主机建立账户并授权
主机建立账户,进行主从复制权限的赋值,在从机中读取。
#在主机MySQL里执行授权主从复制的命令
GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'从机器数据库IP' IDENTIFIED BY 'abc123';
#5.5,5.7
注意:如果使用的是MySQL8,需要如下的方式建立账户,并授权slave:
# 创建账户
CREATE USER 'slave1'@'%' IDENTIFIED BY '123456';
# 授予权限
GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'%';
ALTER USER 'slave1'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
flush privileges;
查询Master的状态,并记录下File和Position的值。
show master status;
注意:执行完此步骤后不要再操作主服务器MySQL,防止主服务器状态值变化。
4.从机:配置需要复制的主机
- 从机上复制主机的命令:
CHANGE MASTER TO
MASTER_HOST='主机的IP地址',
MASTER_USER='主机用户名',
MASTER_PASSWORD='主机用户名的密码',
MASTER_LOG_FILE='mysql-bin.具体数字',
MASTER_LOG_POS=具体值;
举例:
CHANGE MASTER TO
MASTER_HOST='192.168.130.4',MASTER_USER='slave1',MASTER_PASSWORD='123456',MASTER_LOG_F
ILE='mysql01-bin.000003',MASTER_LOG_POS=154;
- 启动slave同步:
start slave;
- 查看同步状态:
show slave status\G;
5.测试
主机新建数据库、表,进行插入操作
CREATE DATABASE mysql01_master_slave;
CREATE TABLE mytbl(id INT,NAME VARCHAR(16));
INSERT INTO mytbl VALUES(1, 'zhang3');
INSERT INTO mytbl VALUES(2,@@hostname);
6.停止主从同步
stop slave;
重启:start slave;
如果报错,可使用如下操作重新配置:
mysql> reset slave; #删除SLAVE数据库的relaylog日志文件,并重新启用新的relaylog文件
mysql> reset master; #删除Master中所有的binglog文件,并将日志索引文件清空,重新开始所有新的日志文件(慎用)
binlog_format三种格式
- STATEMENT模式(基于SQL语句的复制(statement-based replication, SBR))
默认格式,记录每一条修改的sql语句
优点:
- 不需要记录每一行的变化,减少了binlog日志量,文件较小
- binlog中包含了所有数据库更改信息,可以据此来审核数据库的安全等情况
- binlog可以用于实时的还原,而不仅仅用于复制
- 主从版本可以不一样,从服务器版本可以比主服务器版本高
缺点:
- 不是所有的UPDATE语句都能被复制,尤其是包含不确定操作的时候
使用以下函数的语句也无法被复制:LOAD_FILE()、UUID()、USER()、FOUND_ROWS()、SYSDATE()(除非启动时启用了 --sysdate-is-now 选项)
INSERT … SELECT 会产生比 RBR 更多的行级锁
复制需要进行全表扫描(WHERE 语句中没有使用到索引)的 UPDATE 时,需要比 RBR 请求更多的行级锁
对于有 AUTO_INCREMENT 字段的 InnoDB表而言,INSERT 语句会阻塞其他 INSERT 语句
对于一些复杂的语句,在从服务器上的耗资源情况会更严重,而 RBR 模式下,只会对那个发生变化的记录产生影响
执行复杂语句如果出错的话,会消耗更多资源
数据表必须几乎和主服务器保持一致才行,否则可能会导致复制出错
- ROW模式(基于行的复制(row-based replication, RBR))
假如执行了一个update操作,有100条记录发生变化,statement模式只会记录这一条sql语句,而row模式则记录了这100条记录的变化,具体用哪条sql语句写的,就不得而知。
不记录每条sql语句的上下文信息,仅记录哪条数据被修改了,修改成什么样了。
优点:
- 任何情况都可以被复制,这对复制来说是最安全可靠的。(比如:不会出现某些特定情况下的存储过程、function、trigger的调用和触发无法被正确复制的问题)
- 多数情况下,从服务器上的表如果有主键的话,复制就会快了很多复制以下几种语句时的行锁更少:INSERT … SELECT、包含AUTO_INCREMENT 字段的 INSERT、
- 没有附带条件或者并没有修改很多记录的 UPDATE 或 DELETE 语句
- 执行 INSERT,UPDATE,DELETE 语句时锁更少
- 从服务器上采用多线程来执行复制成为可能
缺点:
- binlog 大了很多
- 复杂的回滚时 binlog 中会包含大量的数据
- 主服务器上执行 UPDATE 语句时,所有发生变化的记录都会写到 binlog 中,而 SBR 只会写一次,这会导致频繁发生 binlog 的并发写问题
- 无法从 binlog 中看到都复制了些什么语句
- MIXED模式(混合模式复制(mixed-based replication, MBR))
Mixed格式,实际上就是Statement与Row的结合。
在Mixed模式下,一般的语句修改使用statment格式保存binlog。如一些函数,statement无法完成主从复制的操作,则采用row格式保存binlog。
MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种。