一、主从复制
原理:
- 主从复制一共有三个进程,从库生成两个线程,一个I/O线程,一个SQL线程;
- i/o线程去请求主库的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;
- 主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;
- SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致
###mysql的主从复制,基于pos的
首先得到一个mysql包
6 tar xf mysql-5.7.17-1.el6.x86_64.rpm-bundle.tar
7 ls
8 rpm -qa | grep mysql ##查看你虚拟机有什么关于mysql的包
yum install mysql-community-client-5.7.17-1.el6.x86_64.rpm mysql-community-common-5.7.17-1.el6.x86_64.rpm mysql-community-libs-5.7.17-1.el6.x86_64.rpm mysql-community-libs-compat-5.7.17-1.el6.x86_64.rpm mysql-community-server-5.7.17-1.el6.x86_64.rpm
19 scp mysql-community-client-5.7.17-1.el6.x86_64.rpm mysql-community-common-5.7.17-1.el6.x86_64.rpm mysql-community-libs-5.7.17-1.el6.x86_64.rpm mysql-community-libs-compat-5.7.17-1.el6.x86_64.rpm mysql-community-server-5.7.17-1.el6.x86_64.rpm server2/3: ##复制给server2/3
20 vim /etc/my.cnf
在最后面加 server-id=1 log-bin=mysql-bin
23 /etc/init.d/mysqld start
30 grep password /var/log/mysqld.log ##获取初始密码
43 mysql -p ##可以进去,但不能show databases;
44 mysql_secure_installation ##进行数据库初始化,首先写初始密码,在改新密码,新密码必须是大小写加数字加特殊字符,不改超户,其他为yes
45 mysql -p
show databases;
show master status; ##显示主的状态
grant replication slave on *.* to repl@'%' identified by 'Wb@123456'; ##给slave授权
在server2里面做
首先切换到所有包的位置
yum install *
mysql -h 172.25.17.1 -u repl -p ##验证是否可以登上去
show databases; ###看不到数据库
46 vim /etc/my.cnf
server-id=2
47 /etc/init.d/mysqld start
grep password /var/log/mysqld.log ##截取密码
mysql_secure_installation
mysql -p
show slave status\G; ##什么都没有
change master tom master_host='172.25.17.1',master_user='repl',master_password='Wb@123456',master_log_file='mysql-bin.000004',master_log_pos=710; ##数据从show master status;中获得
start slave; ##开启slaves
show slave status\G; ##i/o 异步复制 myl 线程都是yes;
测试:
在master里面增加个库和表
create database wubian;
use wubian;
create table usertb( username varchar(10) not null,
password varchar(10) not null);
insert into usertb values('user1','111');
select * from usertb; ##显现有没有进去
在slave里面做
show databases;
use wubian; ##数据库有同步过来
show tables;
select * from usertb; ##观看数据有没有同步过来
###基于gtid同步
在server1里面做;
vim /etc/my.cnf
继续在最后里面加
gtid_mode=ON
enforce-gtid-consistency=true
/etc/init.d/mydqld restart
在server2里面做
vim /etc/my.cnf
继续在最后里面加
gtid_mode=ON
enforce-gtid-consistency=true
/etc/init.d/mydqld restart
在server2里面做
stop slave;
change master to master_host='172.25.17.1',master_user='repl',master_password='Wb@123456',MASTER_AUTO_POSITION = 1;
start slave;
show slave status\G; ##i/o sql 都为yes;
测试:
在master里面增加个库和表
use wubian;
insert into usertb values('user2','222');
insert into usertb values('user3','333');
select * from usertb; ##显现有没有进去
在slave里面做
show databases;
use wubian; ##数据库有同步过来
show tables;
select * from usertb; ##观看数据有没有同步过来
use mysql;
select * from gtid_executed; ##有两行数据,因为我们在做gtid的时候,插入了两个信息
show processlist; ##显示进程
####并行复制
在slave端
mysql -p
use mysql;
select * from slave_master_info; ##什么都不显示,因为没有线程
vim /etc/my.cnf
在最地下加
server-id=2
gtid_mode=ON
enforce-gtid-consistency=true
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=16 ##开启16个线程
master_info_repository=TABLE
relay_log_info_repository=TABLE ##用表的形式保存数据
relay_log_recovery=ON
/etc/init.d/mysqld restart
mysql -p
show processlist; ##是否有16个线程