Mysql主从复制(GTID),一主两从

复制原理:

Mysql中有一种日志叫做bin日志(二进制日志)。这个日志会记录下所有修改了数据库的SQL语句(insert,update,delete,ALTER TABLE,grant等等)。
主从复制的原理其实就是把主服务器上的BIN日志复制到从服务器上执行一遍,这样从服务器上的数据就和主服务器上的数据相同了。

MySQL 支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引 以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。 从服务器接收从那时起发生的任何更新,然后封
锁并等待主服务器通知新的更新。

复制过程:

  1. 主节点必须启用二进制日志,记录任何修改数据库数据的事件。
  2. 从节点开启一个线程(I/O Thread)把自己扮演成mysql的客户端,通过mysql协议,请求主节点的二进制日志文件中的事件
  3. 主节点启动一个线程(dump Thread),检查自己二进制日志中的事件,跟对方请求的位置对比,如果不带请求位置参数,则主节点就会从第一个日志文件中的第一个事件一个一个发送给从节点。
  4. 从节点接收到主节点发送过来的数据把它放置到中继日志(Relay log)文件中。并记录该次请求到主节点的具哪个二进制日志文件的哪个位置。
  5. 从节点启动另外一个线程(sql Thread ),把replaylog中的事件读取出来,并在本地再执行一次。

复制特点:

  1. 异步复制:主节点中一个用户请求一个写操作时,主接点不需要把写的数据在本地操作完成同时发送给从服务器并等待从服务器反馈写入完成,在响应用 户,主机点只需要把写入操作在本地完成,就响应用户。但是,从节点中的数据有可能会落后主服务,可以使用(很多软件来检查是否落后)
  2. 主从数据不一致。

单向复制有利于健壮性、速度和系统管理:
1. 主服务器/从服务器设置增加了健壮性。主服务器出现问题时,你可以切换到从服务器作为备份,
2. 通过在主服务器和从服务器之间切分处理客户查询的负荷,可以得到更好的客户响应时间。SELECT 查询可以发送到从服务器以降低主服务器的查询处理负荷。但修改数据的语句仍然应发送到主服务器,以便主服务器和从服务器保持同步。如果非更新查询为主,该负载均衡策略很有效,但一般是更新查询。
3. 使用复制的另一个好处是可以使用一个从服务器执行备份,而不会干扰主服务器。在备份过程中主服务器可以继续处理更新。

注意:当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突!

一.主从复制配置过程

主节点:172.25.0.121(master)

从节点:172.25.0.122(slave)

所需的安装包:

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

mysql-community-common-5.7.17-1.el6.x86_64.rpm

mysql-community-client-5.7.17-1.el6.x86_64.rpm


master上:

1.安装mysql

[root@server5 ~]# yum install * -y

[root@server5 ~]# /etc/init.d/mysqld start       #开启数据库

[root@server5 ~]# grep password /var/log/mysqld.log     ##查看初始密码

Mysql主从复制(GTID),一主两从_第1张图片

 [root@server5 ~]# mysql_secure_installation               # 修改密码

Enter password for user root:                                         #输入初始化密码

New password:                                                                #输入新密码(字母大小写,数字,字符,大于8位!)

Re-enter new password:

Change the password for root ? ((Press y|Y for Yes, any other key for No) :

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y           #删除匿名

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y          #不允许root远程登陆

Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y            #测试数据库并访问

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y                    #重新加载数据表

2.修改主配置文件

[root@server5 ~]# vim /etc/my.cnf

[root@server5 ~]# /etc/init.d/mysqld restart

server-id=5      #服务器Id

log-bin=mysql-bin       ##开启二进制日志

3.配置数据库

[root@server5 ~]# mysql -p

Enter password:                 #输入设置的新密码

mysql> grant replication slave on *.* to user@'172.25.0.%' identified by 'Westos+123';   #建立用户并授权

mysql> show master status;       #查看主库master的状态

Mysql主从复制(GTID),一主两从_第2张图片

 

slave上:

1.安装mysql并设置密码

[root@server6 ~]# yum install  *.rpm -y

[root@server6 ~]# /etc/init.d/mysqld start

[root@server6 ~]# grep password /var/log/mysqld.log

[root@server6 ~]# mysql_secure_installation

2.修改主配置文件

[root@server6 ~]# vim /etc/my.cnf

3.配置数据库

[root@server6 ~]# mysql -p

Enter password:                            #输入新密码

mysql>change master to master_host='172.25.0.121',master_user='user',master_password='Westos+123',master_log_file='mysql-bin.000001',master_log_pos=446;            #从库上建立用户并授权

mysql> start slave ;                      #开启从库

mysql> show slave status\G;          #查看从库状态

Mysql主从复制(GTID),一主两从_第3张图片

当看到Slave_IO_Running: Yes以及Slave_SQL_Running: Yes,则表示slave库已经正常运行了
当出现Slave_IO_Running: Connecting的提示时,说明主库和从库没有连接上,有以下三点原因:
1.网络问题:检查网络连接是否能够连接上
2.密码或POS号错误:查看pos号和主库的号是否对应
3.防火墙的问题:查看主库防火墙的策略,数据库是否拒绝外来连接,然后做相应的改动

 

主从测试

(1)主库:

mysql> show databases;

mysql> create database westos;

mysql> use westos;

mysql> create table usertable(
        -> username varchar(11) not null,
        -> password varchar(11) not null);

mysql> desc userlist;

mysql> insert into usertable values('user1','111');

mysql> insert into usertable values('user2','123');

(2)从库:

mysql> show databases;

Mysql主从复制(GTID),一主两从_第4张图片

mysql> use westos;

mysql> show tables;

Mysql主从复制(GTID),一主两从_第5张图片

mysql> select * from  usertable;

Mysql主从复制(GTID),一主两从_第6张图片

可以在slave从库上看到在master主库上建立的库和表信息。

 

GTID主从复制

1.在master主库和slave从库修改配置文件

[root@server5 ~]# vim /etc/my.cnf

gtid_mode=ON
enforce-gtid-consistency=true

Mysql主从复制(GTID),一主两从_第7张图片

[root@server5 ~]# /etc/init.d/mysqld restart

2.查看主库masterf数据

mysql> show master status;

Mysql主从复制(GTID),一主两从_第8张图片

master_log_file和master_log_pos都会发生改变。

3.配置从数据库

mysql> stop slave;

mysql> change master to master_host='172.25.0.121',master_user='user',master_password='Westos+123',master_auto_position = 1;

mysql> start slave;

mysql> show slave status\G;

Mysql主从复制(GTID),一主两从_第9张图片

Mysql主从复制(GTID),一主两从_第10张图片

4.测试:
主库中:

mysql> show databases;

mysql> use westos;

mysql> select * from usertable;

mysql> delete from usertable where username='user2';

mysql> select * from usertable;

Mysql主从复制(GTID),一主两从_第11张图片

从库中:

mysql> show databases;

mysql> use westos;

mysql> select * from usertable;

Mysql主从复制(GTID),一主两从_第12张图片

 

一主两从:

server5:主master

server6:次master,slave

server7:slave

1.server7中安装数据库,同上设置

[root@server7 ~]# yum install *.rpm   -y

[root@server7 ~]# vim /etc/my.cnf

[root@server7 ~]# /etc/init.d/mysqld start

[root@server7 ~]# grep password /var/log/mysqld.log

修改密码:[root@server7 ~]# mysql_secure_installation

2.将server6设为从master

[root@server6 ~]# vim /etc/my.cnf

Mysql主从复制(GTID),一主两从_第13张图片

[root@server6 ~]# /etc/init.d/mysqld restart

[root@server6 ~]# mysqldump -p westos > westos.sql

[root@server6 ~]# scp westos.sql 172.25.0.123:/root

[root@server6 ~]# mysql -p

mysql> show slave status\G;           #查看是否还是两个YES

mysql> grant replication slave on *.* to user1@'172.25.0.%' identified by 'Westos+123';     #master上建立用户并授权

mysql> show master status;

Mysql主从复制(GTID),一主两从_第14张图片

3:server7中

[root@server7 ~]# vim westos.sql

[root@server7 ~]# mysql -p < westos.sql

[root@server7 ~]# mysql -p

mysql> change master to master_host='172.25.0.122',master_user='user1',master_password='Westos+123',master_auto_position = 1;

mysql> start slave;

mysql> show slave status\G;

Mysql主从复制(GTID),一主两从_第15张图片

 

测试 :server5中添加信息

[root@server5 ~]# mysql -p

mysql> insert into westos.usertable values('tom','111');

server6/7中查看:

mysql> select * from westos.usertable;

Mysql主从复制(GTID),一主两从_第16张图片

Mysql主从复制(GTID),一主两从_第17张图片

server6/7中成功复制了主mater的信息。

你可能感兴趣的:(Mysql主从复制(GTID),一主两从)