文章目录
一、mysql级联复制
这里我们使用三台虚拟机来做这个实验:
所谓级联复制是指采用A(B的master)->B(A的slave,C的master)->C(B的slave)
方式复制
在此次实验中A对应server1,B对应server2,C对应server3
1.复制server2上的mysql到server3的指定目录下
cd /usr/local/
scp -r mysql/ server3:/usr/local/
scp /etc/my.cnf server3:/etc/
scp /etc/init.d/mysqld server3:/etc/init.d/
2.在server3上创建mysql用户并初始化、安装,编辑/etc/my.cnf文件,设置环境变量
[root@server3 local]# cd mysql/data/
[root@server3 data]# pwd
/usr/local/mysql/data
[root@server3 data]# rm -rf *
[root@server3 ~]# useradd -M -d /usr/local/mysql/data/ -s /sbin/nologin mysql
[root@server3 ~]# vim .bash_profile
[root@server3 ~]# source .bash_profile
[root@server3 ~]# mysqld --initialize --user=mysql
[root@server3 ~]# /etc/init.d/mysqld start
[root@server3 ~]# mysql_secure_installation
[root@server3 ~]# cat /etc/my.cnf
[mysqld]
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/data/mysql.sock
symbolic-links=0
3.备份数据库中已有的文件并导入server3数据库中
由于进行主从复制之前必须要保证数据库中的文件同步,因此需要先把之前在server1和server2上做主从复制时创建的数据表导入到
server3数据库
中以达到初始数据同步的目的
之前在server1数据库中创建数据表并添加数据的步骤:
mysql> create database westos;
Query OK, 1 row affected (0.00 sec)
mysql> show database;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'database' at line 1
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| westos |
+--------------------+
5 rows in set (0.00 sec)
mysql> use westos;
Database changed
mysql> show tables;
Empty set (0.00 sec)
mysql> create table user_tb(
-> username varchar(25) not null,
-> password varchar(50) not null);
Query OK, 0 rows affected (0.03 sec)
mysql> insert into user_tb values ('user1','1111');
Query OK, 1 row affected (0.01 sec)
mysql> insert into user_tb values ('user2','2222');
Query OK, 1 row affected (0.01 sec)
mysql> exit
[root@server1 etc]# mysqldump -uroot -pwestos westos > dump.db %dump server1数据库中的数据
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@server1 etc]# mv dump.db /root/
[root@server1 ~]# scp dump.db server3: %将dump出的数据复制到server3中
在server3上导入server1上的备份数据:
[root@server3 ~]# mysqladmin create westos -pwestos
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
[root@server3 ~]# mysql -pwestos westos < dump.db
mysql: [Warning] Using a password on the command line interface can be insecure.
4.在server2上编辑/etc/my.cnf并重启mysql
[root@server2 data]# cat /etc/my.cnf
[mysqld]
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/data/mysql.sock
symbolic-links=0
server-id=2 %下面两行是新增的
log-slave-updates %从库回放主库的二进制日志后,会把所做的事情重新写入到自己的二进制日志中去,供自己的从库去复制回放
log-bin=mysql-bin %主库的二进制日志
关于log-slave-updates参数的详细解释可参考下面的链接:https://www.cnblogs.com/lit10050528/p/4156755.html.
5.在server2上授权
[root@server2 data]# mysql -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.31-log Source distribution
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> grant replication slave on *.* to repl@'%' identified by 'westos'; %授权
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 437 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql> exit
6.在server3上作slave设置,开启slave
mysql> change master to master_host='172.25.0.2', master_user='repl', master_password='westos', master_log_file='mysql-bin.000001', master_log_pos=437;
mysql> start slave;
7.在server1数据库中添加新的内容,看server3上是否同步
主从复制机制:
主库中的I/O线程
负责记录主库二进制日志,从库中的I/O线程复杂将主库中的二进制日志复制到本地,之后由replication机制的SQL线程
读取relay-log
而执行二进制日志中的SQL语句,从而达到复制的目的,这个过程称为回放
二、设置使用gtid进行复制
Gtid采用了新的复制协议,旧协议是,首先从服务器上在一个特定的偏移量位置连接到主服务器上一个给定的二进制日志文件,然后主服务器再从给定的连接点开始发送所有的事件。
新协议有所不同,支持以全局统一事务ID (GTID)
为基础的复制。当在主库上提交事务或者被从库应用时,可以定位和追踪每一个事务。GTID复制是以全部事务为基础
,使得检查主从一致性变得非常简单。如果所有主库上提交的事务也同样提交到从库上,一致性就得到了保证。
相关原理参考链接:https://segmentfault.com/a/1190000014322393.
1.配置
每个结点上:
vim /etc/my.cnf: %添加下述内容并重启mysql
gtid_mode=ON
enforce-gtid-consistency=ON
server2上:
mysql -pwestos
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)
mysql> change master to MASTER_HOST = '172.25.1.1', MASTER_USER = 'repl', MASTER_PASSWORD = 'westos', MASTER_AUTO_POSITION = 1;
server3上:
[root@server3 ~]# mysql -pwestos
mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)
mysql> change master to MASTER_HOST = '172.25.1.2', MASTER_USER = 'repl', MASTER_PASSWORD = 'westos',
MASTER_AUTO_POSITION = 1;
server1上在mysql数据库中添加内容,server2和server3上自动同步
2.测试
三、半同步复制
传统的复制模式属于异步复制,主库只管发送二进制日志,而不关心从库是否收到,这种复制方式虽然能够保证复制的速度很快,但无法保证主从数据的一致性,这在生产环境中是不可取的。而半同步方式是指当主库发送二进制日志到从库中时,从库
收到数据并存储到relay-log之后会发送一个ack确认
给master,这样就保证了主从数据的一致性
1.半同步复制下的两种模式
2.配置
server1master上安装插件:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
每个副本上安装插件:
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
server1上:
SET GLOBAL rpl_semi_sync_master_enabled = 1
#SET GLOBAL rpl_semi_sync_master_timeout = N %设置最大超时时间,默认为10秒,我们可以不用更改
副本端:
SET GLOBAL rpl_semi_sync_slave_enabled = 1
STOP SLAVE IO_THREAD; %重启IO线程
START SLAVE IO_THREAD;
再把server2上的I/O线程开启后server2和server3上又能同步server1上的数据,这就是半同步复制方式的优点:能够保证主从数据的一致性