随着应用的数据越来越多,mysql的压力也越来越大。所以就有了配置主从数据库的想法,主库用来写入数据,从库用来读取数据,大大减小了主库的压力。
数据库高可用架构分为
一、主从复制的原理
主从复制涉及到三个线程:主库生成一个 log dump 线程,用来给从库 i/o线程传binlog;从库生成两个线程,一个I/O线程,一个SQL线程;i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;
二、可能出现的问题及解决方案
mysql主从复制存在的问题:
- 主库宕机后,数据可能丢失
- 从库只有一个sql Thread,主库写压力大,复制很可能延时
解决方法:
- 半同步复制---解决数据丢失的问题
- 并行复制----解决从库复制延迟的问题
半同步复制:
5.5集成到mysql,以插件的形式存在,需要单独安装
确保事务提交后binlog至少传输到一个从库
不保证从库应用完这个事务的binlog
性能有一定的降低,响应时间会更长
网络异常或从库宕机,卡主主库,直到超时或从库恢复
并行复制:
社区版5.6中新增
并行是指从库多线程apply binlog
库级别并行应用binlog,同一个库数据更改还是串行的(5.7版并行复制基于事务组)
设置sql线程数为10
set global slave_parallel_workers=10;
三、举个栗子
实践1:一主多从复制实战
1、环境准备
centos 系统服务器2台、一台用户做Mysql 主服务器,1台用于做Mysql 从服务器,配置好yum 源、 防火墙关闭、关闭selinux、各节点时钟服务同步。
机器名称 | IP配置 | 服务角色 | 备注 |
---|---|---|---|
master | 192.168.179.128 | 主数据库 | 二进制日志 |
slave1 | 192.168.179.129 | 从数据库 | 中继日志 |
2、master节点配置
① 修改mysql主配置文件
vim /etc/my.cnf
server-id=1 #配置server-id,让主服务器有唯一ID号
log-bin=mysql-bin #打开Mysql日志,日志格式为二进制
skip-name-resolve #关闭名称解析,(非必须)
启动mysql:systemctl start mariadb
② 创建并授权slave mysql 用的复制帐号
mysql> CREATE USER 'slave'@'192.168.179.129' IDENTIFIED BY 'slave';#创建用户
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'192.168.179.129';#分配权限
mysql>flush privileges; #刷新权限
分析:在Master的数据库中建立一个备份帐户:每个slave使用标准的MySQL用户名和密码连接master。进行复制操作的用户会授予REPLICATION SLAVE权限。
③ 查看主服务器状态
在Master的数据库执行show master status,查看主服务器二进制日志状态,位置号
show master status;
3、slave节点配置
① 修改配置文件
vim /etc/my.cnf;指定唯一的servr ID,设置只读权限
server-id=2 #配置server-id,让从服务器有唯一ID号
relay_log = mysql-relay-bin #打开Mysql日志,日志格式为二进制
read_only = 1 #设置只读权限
log_bin = mysql-bin #开启从服务器二进制日志,(非必须)
log_slave_updates = 1 #使得更新的数据写进二进制日志中
systemctl start mariadb 开启服务
② 启动从服务器复制线程
mysql>change master to master_host='192.168.179.128', master_user='slave', master_password='slave', master_log_file='mysql-bin.000002', master_log_pos=2285;
mysql>start slave;
③ 查看从服务器状态
可使用SHOW SLAVE STATUS\G查看从服务器状态
Slave_IO_Running: Yes #IO线程正常运行
Slave_SQL_Running: Yes #SQL线程正常运行
4、测试
在主上创建一个slave库,从库上也自动生成了一个表
