主从复制是MySQL本身自带的一个功能,不需要额外的第三方软件就可以实现。
主从复制可实现:数据备份、故障转移、MySQL集群、高可用、读写分离等功能
主从复制的好处:
(1)数据更安全:做了数据冗余,不会因为单台服务器的宕机而丢失数据
(2)性能大大提升:一主多从,不同用户从不同数据库读取,性能提升
(3)扩展性更优:流量增大时,可以方便的增加从服务器,不影响系统使用
(4)负载均衡:一主多从相当于分担了主机任务,做了负载均衡。
主从复制的缺点:
主从机制是一样的:
mysql主从的实现是,mysql master被使用后,其中master后台IO线程会写Binlog;slave有一个Relay Log线程同步binlog日志,同时有另一个Extractor线程会读取相应的Binlog,在Slave进行相应的同样的操作。
对于主从正常执行,相应的延迟几乎是不存在的。但是在高QPS下,主从同步却出现了比较明显的延迟情况。在PPT介绍中,当master QPS达到1万左右时,Slave重做的QPS却只有2000左右,因此所谓的瓶颈其实是在Binlog日志在slave重做这块。而此处实现是单线程的,因此改进的方法此处用多线程实现。
主从复制实现原理:
把主服务器上的binLog日志(记录数据的增删改和授权等写操作行为)复制到从服务器上执行一遍,这样从服务器上的数据就和主服务器上的数据相同了。
mysql的安装和配置在lamp的第一篇,感兴趣可以去看看:
一. 主从复制
server1为master端:
在westos数据库中添加user_tb这个表:
将server1中的数据库导入:
为了方便slave复制server1二进制文件到slave(server2)执行,做复制之前:主从的base需要相同
在server1安装rsync:
配置/etc/my.cnf文件:
在salve端配置:
在.bsah_profile文件添加mysql路径:
然后初始化mysql:
添加mysql用户:
在server2的mysql中也要添加westos库 ,再将server1中库的数据导入:
在server2中:
mysql -pwestos
看slave端的IO 和 SQL 状态均为yes 才为服务成功!!
查看一下已经同步过来:
二. GTID复制
server1:
将server1的配置文件复制给server3:
在server2中:
在server3中:
三. 半同步复制
先停掉server2 io_thread:
然后在server1中的表中插入成绩:
查看server2中能否同步数据:
在server2中开启slave io:
在server1中:
在server2中再次查看:
四. 组复制
多主模式
server1-3配置大体相同
vim /etc/my.cnf
上图address后的server以及第一行的server-id都要和文件所在主机保持一致:
server1:
mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
mysql> START GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
server2 server3 相同
mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';
mysql> START GROUP_REPLICATION;
在server1:
mysql> SELECT * FROM performance_schema.replication_group_members; ##查询组状态
建立数据库看信息同步:
在server1中:
mysql> create database test;
mysql> USE test;
mysql> create table t1 (c1 INT PRIMARY KEY, C2 TEXT NOT NULL); ##只支持带有主键的表
mysql> INSERT INTO t1 VALUES (1, 'Luis');
mysql> SELECT * FROM t1;
在server2中:
在server3中:
五. 延迟复制
在server2中:
STOP SLAVE SQL_THREAD;
CHANGE MASTER TO MASTER_DELAY=60;
START SLAVE SQL_THREAD;
show slave status\G;
六. 慢查询
set global slow_query_log=ON;
show variables like "long%";
set long_query_time=5;
show status like '%slow%';
七. MySQL路由器
1.MySQL路由器配置
在server4执行
rpm -ivh mysql-router-community-8.0.21-1.el7.x86_64.rpm
vim /etc/mysqlrouter/mysqlrouter.conf
[routing:ro]
bind_address = 0.0.0.0
bind_port = 7001
destinations = 172.25.1.1:3306,172.25.1.2:3306,172.25.1.3:3306
routing_strategy = round-robin
[routing:rw]
bind_address = 0.0.0.0
bind_port = 7002
destinations = 172.25.1.1:3306,172.25.1.2:3306,172.25.1.3:3306
routing_strategy = first-available
systemctl start mysqlrouter.service
mysql> grant all on test.* to sun@’%’ identified by ‘westos’; ##创建一个远程登录的用户
在真机中:
mysql -h 172.25.1.4 -P 7001 -u sun -p
在真机测试连接路由ip 登陆mysql
路由只能实现调度,负载均衡,不能实现读写分离。
[root@server1 ~]# lsof -i :3306在这里插入图片描述
查看日志:cat /var/log/mysqlrouter/mysqlrouter.log
当连接server1 down掉之后会自动跳转到server2上
由于mysql路由器的7001端口采用的使轮询的调度算法,所以每次连接到的后端真实的数据库都是一次变化的