1.概念
- 指一台服务器充当主数据库服务器,另一台或多台服务器充当从数据库服务器
- 主服务器中的数据自动复制到从服务器中
- 即就是主数据库做什么,从数据库做什么
2.主从复制工作原理
- Master数据库只要发生变化,立马记录到Binary log日志文件中
- Slave数据库启动一个I/O thread连接Master数据库,请求Master变化的二进制日志
- Slave I/O获取到的二进制日志,保存到自己的Relay log日志文件中
- Slave有一个SQL thread定期检查Realy log是否变化,变化就更新数据
3.使用mysql主从的原因
- 实现服务器的负载均衡
- 通过复制实现数据的异地备份
- 提高数据库系统的可用性
4.主从复制的原理(position)
- 异步复制(主从复制)master节点不会关心slave节点的状态,只需要写自己的数据即可
- 能不能完成复制看slave节点的io线程和sql线程是否开启
- mysql的主从配置又叫replication,AB复制,基于binlog二进制日志
- 主数据库必须开启binlog二进制日志才能进行复制
- mysql的主从复制(异步复制)(基于position)把一个事件拆开来复制
- 并不是以一个完整的事件为单位来进行复制
主库开启binlog日志(设置log-bin参数)
主从server-id不同
从库服务器能连同主库
master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
从库生成两个线程,一个i/o线程,一个SQL线程,i/o线程去请求主库的binlog,sql线程进行日志回放来复制
slave将master的binary log events拷贝到它的中继日志(relay log);
slave重做中继日志中的事件,将更改应用到自己的数据上。
- 注意:
- 一开始两个mysql必须一模一样,否则会报错 master自己做自己的,写在自己的日志里
- slave能否同步成功取决于IO线程,和SQL线程回放日志 IO通过联系master拿到master的二进制日志,SQL回放日志
- slave节点的数据总比master节点的数据慢
5.实验步骤
实验环境:
- master节点:number1,ip为172.25.254.1
- slave节点:number2,ip为172.25.254.2
- 测试:真机,ip为172.25.254.76
配置master节点(number1上)
- 在官网上下载mysql的包
mysql-5.7.25-1.el7.x86_64.rpm-bundle.tar
tar xf mysql-5.7.25-1.el7.x86_64.rpm-bundle.tar
#解压- 安装所需要的rpm包
yum install mysql-community-client-5.7.25-1.el7.x86_64.rpm
mysql-community-common-5.7.25-1.el7.x86_64.rpm
mysql-community-libs-5.7.25-1.el7.x86_64.rpm
mysql-community-libs-compat-5.7.25-1.el7.x86_64.rpm
mysql-community-server-5.7.25-1.el7.x86_64.rpm -y
vim /etc/my.cnf
# 编辑文件- 编辑内容为:(在文件最后写入)
log-bin=mysql-bin #开启二进制日志
server-id=1 #主库server-id需要比从库小,用来区分主机与从机
systemctl start mysqld
#开启服务cat /var/log/mysqld.log | grep password
#查看原始密码DUsjnO(nN6j!
#为原始密码- 开启服务之后生成了一个临时密码,使用临时密码进行数据库安全初始化
mysql_secure_installation
#安全初始化- 设定新密码时:密码大于8位,数字+大小写英文+特殊字符
- 因为该数据库版本开启了密码检测系统,简单密码会报错
- 第一处直接回车,其他输入y
mysql -p
#登录数据库CREATE USER 'wang'@'172.25.254.%' IDENTIFIED BY 'WMZdys12*';
#创建从库连接的用户,可以使用此用户远程登录数据库GRANT REPLICATION SLAVE ON *.* TO 'wang'@'172.25.254.%';
#授权为可以复制master节点数据的slave节点flush privileges;
#刷新show master status;
#查看master节点的状态
REPLICATION:表示复制的权限
*.* :表示对所有库的所有表都授权
wang:用户名
‘172.25.254.%’ : 授权172.25.254网段的所有数据库节点都可以同步(复制)
在主机上测试主节点是否设置好:
mysql -h 172.25.254.1 -uwang -pWMZdys12*
#登录数据库
配置slave节点(number2上)
tar xf mysql-5.7.25-1.el7.x86_64.rpm-bundle.tar
#解压- 安装所需要的rpm包
yum install mysql-community-client-5.7.25-1.el7.x86_64.rpm
mysql-community-common-5.7.25-1.el7.x86_64.rpm
mysql-community-libs-5.7.25-1.el7.x86_64.rpm
mysql-community-libs-compat-5.7.25-1.el7.x86_64.rpm
mysql-community-server-5.7.25-1.el7.x86_64.rpm -y
vim /etc/my.cnf
# 编辑文件- 编辑内容为(在最后写):
server-id=2
systemctl start mysqld
#开启服务cat /var/log/mysqld.log | grep password
#查看原始密码- 原始密码为:
U;1#:DikqftU
mysql_secure_installation
#安全初始化
mysql -p
#登录数据库- 配置主库信息:
CHANGE MASTER TO MASTER_HOST='172.25.254.1',
#主库的ip地址MASTER_USER='wang',
#主库的用户MASTER_PASSWORD='WMZdys12*',
#主库的密码MASTER_LOG_FILE='mysql-bin.000002',
#主库的日志文件MASTER_LOG_POS=1325;
#主库的状态码- 日志文件和状态码可以在主库中查看
start slave;
#开启从库show slave status\G;
#查看从库状态- 可以看到的当前两个进程都是yes,表示主库和从库的数据一致
- 开启成功,IQ SQL线程都开启才能正常复制
- 可以看到在number1主机上有刚刚的日志文件
测试
在主库上创建新的数据库
在从库上查看是否复制
6.主从辅助复制gtid的原理
- GTID复制不像传统的复制方式(异步复制、半同步复制)需要找到binlog(MASTER_LOG_FILE)和POS点(MASTER_LOG_POS)
- 只需要知道master的IP、端口、账号、密码即可
- 因为复制是自动的,MySQL会通过内部机制GTID自动找点同步
- 和基于position的主从复制的不同之处在于:它是以一整个事件为单位进行复制的
- server-id:服务器身份id,在初始化MySQL时,会自动生成一个server-id并写到数据目录的auto.cnf文件中,
- 官方不建议修改,并且server-id跟GTID有密切关系,并且对于任意一个数据库节点,server-id是唯一的
- GTID:全局事务标识符,使用这个功能时,内次事务提交都会在binlog里生成一个唯一的标识符,
- 它由UUID和事务ID组成,首次提交的事务为1,第二次为2,第三次为3,以此类推
- 开启GTID,无需找到binlog和POS点,直接change master to master_auto_postion=1即可,它会自动寻找同步
原理步骤:
在master上一个事务提交,并写入binlog里
binlog日志发送到slave,slave接收并写入中继日志里,slave读取到这个GTID,并设置gtid_next的值。
例如set @@session。gtid_next=’=fbd841f9-5590-11e8-b819-000c29e6461e’;
然后告诉slave接下来的事务必须使用GTID,并写入它自己的binlog里
slave检查并确认这个GTID没有被使用,如果没有被使用,那么开始执行这个事务并写入自己的binlog里
由于gtid_next的值不为空,slave不会尝试去生成一个新的gtid而是通过主从同步来获取GTID
7.实验步骤
配置master节点(number1上)
vim /etc/my.cnf
#编辑文件- 编辑内容为(在最后加入):
gtid_mode=ON #打开gtid模式
enforce-gtid-consistency=true
systemctl restart mysqld
#重启数据库
use mysql;
select * from gtid_executed;
# 发现是空的
cd /var/lib/mysql
mysqlbinlog mysql-bin.000002
#可以看出完成一个事件需要很多步
配置slave节点(number2上)
vim /etc/my.cnf
#编辑文件- 编辑内容为(在最后加入):
gtid_mode=ON #打开gtid模式
enforce-gtid-consistency=true
systemctl restart mysqld
#重启数据库
mysql -p
#登录数据库stop slave;
#关闭slave- 配置主库信息:
change master to master_host ='172.25.254.1',
#主库的ip地址master_user='wang',
#主库的用户master_password='WMZdys12*',
#主库的密码master_auto_position=1;
#设定为自动start slave;
#开启slaveshow slave status\G;
#查看从库状态- 可以看到的当前两个进程都是yes,表示主库和从库的数据一致
测试
在主库上添加数据
在从库上查看