准备环境 两台rpm安装好的数据库
密码提前设置好
防火墙关掉
两台主机可以ping通
mysql主从复制
主从复制的作用:
- 做备份 保证数据的安全箱
- 提高读写效率 写入数据主 读取数据从
工作原理:
- mysql主从架构部署完成之后,主节点会生成二进制日志,派生dump线程,从节点会生成中继日志 派生 i/o线程和sql线程
- 从节点的i/o会监控主节点的二进制日志,如果主节点二进制日志更新,则从节点i/o会发送数据同步的请求请求,该请求会被主节点的dump线程接收
- 主的dump线程接收到从节点的同步请求,会找到对应的二进制日志及对应的偏移量并将更新的日志信息响应给从的I/O线程
- 从的i/o线程线程获取到响应数据后将日志信息记录到中继日志中农
- 当中继日志更新后,从节点的sql线程会将中继日志的sql语句进行提取并执行,执行完后,实现主从节点数据同步
主 192.168.2.10
从 192.168.2.60
主:
[root@localhost ~]# vim /etc/my.cnf
server-id = 1
log-bin=mysql-bin #开启二进制日志
[root@localhost ~]# systemctl restart mysqld
[root@localhost ~]# mysql -uroot -p'1234.Com'
mysql> grant replication slave on *.* to "slave"@"192.168.2.%" identified by '1234.Com';
mysql> flush privileges;
mysql> show master status;
-
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000004 | 600 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
从:
[root@localhost ~]# vim /etc/my.cnf
server-id=2
relay-log=relay-bin #开启中继日志
[root@localhost ~]# systemctl restart mysqld
[root@localhost ~]# mysql -uroot -p'1234.Com'
mysql> change master to master_host='192.168.2.10',master_user='slave',master_password='1234.Com',master_log_file='mysql-bin.000004',master_log_pos=600;
Query OK, 0 rows affected, 2 warnings (0.11 sec)
mysql> start slave;
mysql> show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
报错解决
主:
mysql> grant replication slave on *.* to "slave"@"192.168.2.%" identified by '1234.Com';
Query OK, 0 rows affected, 1 warning (0.08 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
如果主重新授权 偏移量和二进制文件名会改变
从:
如果想重新接收授权 需要停止从服务 重新建立从服务
mysql> stop slave;
mysql> reset slave;
mysql> change master to master_host='192.168.2.10',master_user='slave',master_password='1234.Com',master_log_file='mysql-bin.000004',master_log_pos=1217;
mysql> start slave;
mysql> show slave status\G
主主 互为主从
主1 192.168.2.10
主2 192.168.2.60
主1做为主 主2 为从
主2为主 主1为从
-
主1
[root@localhost ~]# vim /etc/my.cnf
server-id = 1
log-bin=mysql-bin
log-slave-updates=1 #开启中继日志
auto_increment_offset=1 #从1开始自增
auto_increment_increment=2 #每次自增两个
[root@localhost ~]# systemctl restart mysqld
[root@localhost ~]# mysql -uroot -p'1234.Com'
mysql> grant replication slave on *.* to "slave"@"192.168.2.%" identified by "1234.Com";
mysql> flush privileges;
mysql> show master status\G
*************************** 1. row ***************************
File: mysql-bin.000005
Position: 610
主2:
[root@localhost ~]# vim /etc/my.cnf
server-id=2
log-bin=mysql-bin
log-slave-updates=1
auto_increment_offset=2
auto_increment_increment=2
[root@localhost ~]# systemctl restart mysqld
[root@localhost ~]# mysql -uroot -p'1234.Com'
mysql> stop slave;
mysql> reset slave;
mysql> change master to master_host='192.168.2.10',master_user='slave',master_password='1234.Com',master_log_file='mysql-bin.000005',master_log_pos=610;
mysql> start slave;
mysql> show slave status\G
mysql> grant replication slave on *.* to "slave"@"192.168.2.%" identified by "1234.Com";
mysql> flush privileges;
mysql> show master status\G
*************************** 1. row ***************************
File: mysql-bin.000004
Position: 610
主1:
mysql> change master to master_host='192.168.2.60',master_user='slave',master_password='1234.Com',master_log_file='mysql-bin.000004',master_log_pos=610;
mysql> start slave;
mysql> show slave status\G
基于ssl主从
https http+ssl
由于在主从复制当中 数据传输是明文的 所以安全性就大大降低 因此需要借助ssl加密传输数据 可以增加其安全性
https 证书
数据的证书是自带的 主从 (apache+https)
mysql5.6版本之上的
主 192.168.2.10
从 192.168.2.60
主:
[root@localhost ~]# cd /var/lib/mysql
[root@localhost mysql]# ls
需要把主的证书拷贝到从上 这样才能做主从
远程拷贝
主:
[root@localhost mysql]# scp /var/lib/mysql/ca.pem root@192.168.2.60:/var/lib/mysql #证书
#申请文件
[root@localhost mysql]# scp /var/lib/mysql/client-cert.pem root@192.168.2.60:/var/lib/mysql
#秘钥文件
[root@localhost mysql]# scp /var/lib/mysql/client-key.pem root@192.168.2.60:/var/lib/mysql
[root@localhost mysql]# vim /etc/my.cnf
server-id = 1
log-bin=mysql-bin
ssl-ca=/var/lib/mysql/ca.pem
ssl-cert=/var/lib/mysql/client-cert.pem
ssl-key=/var/lib/mysql/client-key.pem
[root@localhost mysql]# systemctl restart mysqld
[root@localhost mysql]# mysql -uroot -p'1234.Com'
mysql> grant replication slave on *.* to "slave"@"192.168.2.%" identified by "1234.Com";
mysql> flush privileges;
mysql> show master status\G
*************************** 1. row ***************************
File: mysql-bin.000006
Position: 600
从:
[root@localhost ~]# vim /etc/my.cnf
server-id=2
relay-log=relay-bin
[root@localhost ~]# systemctl restart mysqld
[root@localhost ~]# mysql -uroot -p'1234.Com'
mysql> stop slave;
mysql> reset slave;
mysql> change master to master_host='192.168.2.10',master_user='slave',master_password='1234.Com',master_log_file='mysql-bin.000006',master_log_pos=600,master_ssl=1,master_ssl_ca='/var/lib/mysql/ca.pem',master_ssl_cert='/var/lib/mysql/client-cert.pem',master_ssl_key='/var/lib/mysql/client-key.pem';
Query OK, 0 rows affected, 2 warnings (0.10 sec)
mysql> start slave;
mysql> show slave status\G
基于GTID的主从复制
GTID:global transaction identity,全局事务标识符,由mysql服务器的UUID和事务的ID号两部分组成,通过GTID可以表示一个全球唯一的事务
从MySQL 5.6.5 开始新增了一种基于 GTID 的复制方式。通过 GTID 保证了每个在主库上提交的事务在集群中有一个唯一的ID。这种方式强化了数据库的主备一致性,故障恢复以及容错能力。
GTID工作原理简单介绍
1.master更新数据的时候,会在事务前产生GTID,一同记录到binlog日志中。
2.slave端的io线程将binlog写入到本地relay log中。
3.然后SQL线程从relay log中读取GTID,设置gtid_next的值为该gtid,然后对比slave端的binlog是否有记录
4.如果有记录的话,说明该GTID的事务已经运行,slave会忽略
5.如果没有记录的话,slave就会执行该
-
主 192.168.2.10
从 192.168.2.60
主:
[root@localhost mysql]# vim /etc/my.cnf
server-id = 1
log-bin=mysql-bin
gtid-mode=on
enforce-gtid-consistency=on #启动gtid
[root@localhost mysql]# systemctl restart mysqld
[root@localhost mysql]# mysql -uroot -p'1234.Com'
grant replication slave on *.* to "slave"@"192.168.2.%" identified by "1234.Com";
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
从:
[root@localhost ~]# vim /etc/my.cnf
server-id=2
relay-log=relay-bin
gtid-mode=on
enforce-gtid-consistency=on
[root@localhost ~]# systemctl restart mysqld
[root@localhost ~]# mysql -uroot -p'1234.Com'
mysql> stop slave;
mysql> reset slave;
mysql> change master to master_host='192.168.2.10',master_user='slave',master_password='1234.Com',master_auto_position=1;
mysql> start slave;
mysql> show slave status\G
mysql基于gtid和ssl的主从