Mysql主从复制
master将改变记录到二进制日志中binlog,slave将master的binlog拷贝到自己的中继日志中,然后执行一遍sql语句就达到同步了
一个服务器当主库,另一个或多个服务器当从库,主库会把对数据库的修改操作(新增 删除
修改)记录在binlog日志中,从库连接主库获取主库的binlog,并记录在中继日志relay-log中,然后从上次记住的位置起执行SQL语句,一旦遇到错误则停止同步
Mysql主从复制的实现原理图
MySQL之间数据复制的基础是二进制日志文件(binary log file)。一台MySQL数据库一旦启用二进制日志后,其作为master,它的数据库中所有操作都会以“事件”的方式记录在二进制日志中,其他数据库作为slave通过一个I/O线程与主服务器保持通信,并监控master的二进制日志文件的变化,如果发现master二进制日志文件发生变化,则会把变化复制到自己的中继日志中,然后slave的一个SQL线程会把相关的“事件”执行到自己的数据库中,以此实现从数据库和主数据库的一致性,也就实现了主从复制。
一·主从服务器的安装包
[root@server1(2) ~]# ls
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
[root@server1(2) ~]# yum install -y *.rpm
二·主数据库master修改
1·修改配置文件
[root@server1 ~]# vim /etc/my.cnf ##添加以下内容
server-id=1 #设置serverid,这是mysql主从复制是一个很重要的标识
log-bin=mysql-bin #启动二进制日志系统
[root@server1 ~]# /etc/init.d/mysqld start ##开启服务
2·更改密码
[root@server1 ~]# grep password /var/log/mysqld.log ##过滤密码,查看原始密码
[root@server1 ~]# mysql_secure_installation ##更改密码
# 设置新密码时,必须含有大小写字母,特殊字符和数字,不少于8个字符
3·登陆mysql
主服务器授权
[root@server1 ~]# mysql -uroot -p
mysql> grant replication slave on *.* to repl@'172.25.41.%' identified by 'Redhat!123'; ##授权
mysql> show databases; ##显示
mysql> show master status; ##查看状态
三·从服务器slave修改
1.修改配置文件
[root@server2 ~]# vim /etc/my.cnf ##添加以下内容
server-id=2 #设置serverid
[root@server2 ~]# /etc/init.d/mysqld start ##开启服务
2从服务器授权
[root@server2 ~]# mysql -p
mysql> change master to master_host='172.25.71.1', master_user='repl', master_password='Redhat!123', master_log_file='mysql-bin.000003', master_log_pos=1003;
mysql> start slave; #启动slave同步进程
mysql> show slave status\G; #查看状态
四·同步复制
1.普通主从服务器复制
[root@server1 ~]# mysql -p ##在主服务器建立用户
mysql> create database test; ##建立库
mysql> use test ## 进入库
mysql> create table userlist (
-> username varchar(15) not null,
-> password varchar(25) not null);
mysql> desc userlist;
mysql> insert into userlist values ('user1','123'); ##添加用户
mysql> insert into userlist values ('user2','456');
mysql> insert into userlist values ('user3','789');
在从服务器查看
[root@server2 ~]# mysql -p
mysql> use test
mysql> select * from userlist;
2.gtid主从复制
(1)主从服务器修改配置文件
[root@server1(2) ~]# vim /etc/my.cnf ##添加以下内容
gtid_mode=ON
enforce-gtid-consistency=true
[root@server1(2) ~]# /etc/init.d/mysqld restart
(2)主服务器
[root@server1 ~]# mysql -p
mysql> show master status; #查看状态
(3)从服务器
[root@server2 ~]# mysql -p
mysql> stop slave; #停止slave同步进程
mysql> change master to master_host='172.25.41.1', master_user='repl', master_password='Redhat!123', MASTER_AUTO_POSITION=1;
mysql> start slave; #启动slave同步进程
mysql> show slave status\G; ##查看状态
(4)测试
主服务器删除用户:
[root@server1 ~]# mysql -p
mysql> use test
mysql> show tables;
mysql> delete from userlist where username='user3';
从服务器查看:
[root@server2 ~]# mysql -p
mysql> use test
mysql> select * from userlist;
五·一主两从:(既可以做从也可以做主)
server1:master
server2:master,slave
server3:slave
[root@server1 ~]# mysqldump -pRedhat\!123 test > test.sql
[root@server1 ~]# scp test.sql server3:
[root@server3 ~]# vim test.sql
create database test;
use test;
[root@server3 ~]# /etc/init.d/mysqld restart
[root@server3 ~]# mysql -p test < test.sql
[root@server3 ~]# mysql -p
mysql> change master to master_host='172.25.41.2', master_user='repl', master_password='Redhat!123', master_auto_position=1;
mysql> start slave;
mysql> show slave status\G;
[root@server2 ~]# vim /etc/my.cnf ##添加以下内容
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=16
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log_recovery=ON
[root@server2 ~]# /etc/init.d/mysqld restart
六·半同步复制
1.主服务器设置【server1】
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; #安装插件
mysql> show global variables like '%semi%'; #环境变量
+------------------------------------+-------+
| Variable_name | Value |
+------------------------------------+-------+
| rpl_semi_sync_master_enabled | OFF | (是否启动半同步功能)
| rpl_semi_sync_master_timeout | 10000 | (连接从节点的超时时间)
| rpl_semi_sync_master_trace_level | 32 |(是否检测半同步从节点上线)
| rpl_semi_sync_master_wait_no_slave | ON |
+------------------------------------+-------+
mysql> set global rpl_semi_sync_master_enabled=1;
mysql> set global rpl_semi_sync_master_timeout=2000;
2.从服务器设置【server2】
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
mysql> set global rpl_semi_sync_slave_enabled=1;
mysql> show global variables like '%semi%';
mysql> STOP SLAVE IO_THREAD;
mysql> START SLAVE IO_THREAD;
3.在主服务器验证半同步
mysql> show global status like '%semi%';
重启从上的IO线程
mysql> STOP SLAVE IO_THREAD;
mysql> START SLAVE IO_THREAD;
如果没有重启,则默认还是异步复制,重启后,slave会在master上注册为半同步复制的slave角色。
当我们在server1删除user2.在server2查看:
4.从服务器配置
mysql> delete from userlist where username='user2';
主服务器查看:
测试:
(1)
在server1建立用户
在server2查看
在server3从服务查看同步
(1)
在server2 关闭IO
mysql> STOP SLAVE IO_THREAD;
在server1建立用户
mysql> insert into userlist values ('user6','444');
在server3查看不到建立的用户
在server2打开IO,才会看到
mysql> START SLAVE IO_THREAD;
server3查看