数据库管理与高可用-MySQL主从复制与读写分离
目录
#1.1MySQL主从复制原理
1.1.1MySQL支持的复制类型
1.1.2复制的工作过程
#2.1MySQL读写分离原理
2.1.1常见的MySQL读写分离为为两种
#3.1主从复制+读写分离的实验案例
1.1MySQL主从复制的原理
MySQL 主从复制是一种常用的数据同步机制,用于将主数据库(Master)的数据变更同步到一个或多个从数据库(Slave),实现数据冗余、读写分离和高可用性。
1.1.1MySQL支持的复制类型
1.基于语句的复制:在主服务器上执行的SQL语句,在从服务器上执行同样的语句,MySQL默认采用基于语句的复制,效率比较高。
2.基于行的复制:把改变的内容复制过去,而不是把命令在从服务器上执行一遍。
3.混合类型的复制:默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。
1.1.2复制的工作过程
1. 在每个事务更新数据完成之前,Master 将这些改变记录进二进制日志。写入二进制日志完成后,Master 通知存储引擎提交事务。
2. Slave 将 Master 的 Binary log 复制到其中继日志(Relay log)。首先,Slave 开始一个工作线程 ——I/O 线程,I/O 线程在 Master 上打开一个普通的连接,然后开始 Binlog dump process。Binlog dump process 从 Master 的二进制日志中读取事件,如果已经跟上 Master,它会睡眠并等待 Master 产生新的事件。I/O 线程将这些事件写入中继日志。
3. SQL slave thread(SQL 从线程)处理该过程的最后一步。SQL 线程从中继日志读取事件,并重放其中的事件而更新 Slave 数据,使其与 Master 中的数据保持一致。只要该线程与 I/O 线程保持一致,中继日志通常会位于 OS 的缓存中,所以中继日志的开销很小。复制过程有一个很重要的限制,即复制在 Slave 上是串行化的,也就是说 Master 上的并行更新操作不能在 Slave 上并行操作。
2.1MySQL读写分离原理
MySQL 读写分离是优化数据库负载、提升系统性能与可用性的常用方案,核心围绕 “分离读写压力,利用主从复制保障数据一致”。
2.1.1常见的MySQL读写分离分为两种
(1)基于程序代码内部实现
在代码中根据 select、insert 进行路由分类,这类方法也是目前生产环境应用最广泛的。优点是性能较好,因为在程序代码中实现,不需要增加额外的设备作为硬件开支;缺点是需要开发人员来实现,运维人员无从下手。
(2)基于中间代理层实现
代理一般位于客户端和服务器之间,代理服务器接到客户端请求后通过判断后转发到后端数据库,有两个代表性程序。
3.1主从复制+读写分离的实验案例
配置Master主服务器
1.vim /etc/my.cnf
log-bin=/usr/local/mysql/data/mysql-bin
binlog_format = MIXED
server-id=1
2.重启MySQL服务
3.登录MySQL程序,给从服务器授权
配置Slave从服务器
1.slave1,slave2上的server-id不能一致,slave1为server-id=2,而slave2为server-id=3,在vim /etc/my.cnf中配置。
2.重启mysqld服务
3.登录mysqld,配置同步
4.验证主从复制效果
搭建MySQL读写分离
安装Mycat2
安装并配置mycat软件
创建Mycat2工作所必须得账号
启动Mycat2
第一步:Mycat增加数据源
查看数据源信息
第二步:创建Mycat集群
查看并修改集群配置
修改负载均衡的默认策略为轮询
修改配置后需要重启mycat 
登录mycat集群,创建测试库和测试表
停止slave1和slave2的主从同步
slave1:
[root@localhost ~]# mysql -uroot -p
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.01 sec)
slave2:
[root@localhost ~]# mysql -uroot -p
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.01 sec)
在master和slave1,slave2创建测试数据
Master 上操作:
mysql> use test;
Database changed
mysql> insert into test.zang values ('1','zhang','this_is_master');
Query OK, 1 row affected (0.01 sec)
slave1上操作:
mysql> use test;
Database changed
mysql> insert into test.zang values ('2','zhang','this_is_slave1');
Query OK, 1 row affected (0.01 sec)
slave2上操作:
mysql> use test;
Database changed
mysql> insert into test.zang values ('3','zhang','this_is_slave2');
Query OK, 1 row affected (0.01 sec)
登录mycat集群,查询tets.zang的数据
[root@localhost ~]# mysql -uroot -p123456 -P8066 -h192.168.10.101
mysql> select * from test.zang;
+----+-------+----------------+
| id | name | address |
+----+-------+----------------+
| 2 | zhang | this_is_slave1 |
+----+-------+----------------+
1 row in set (0.01 sec)mysql> select * from test.zang; #第二次查询
+----+-------+----------------+
| id | name | address |
+----+-------+----------------+
| 3 | zhang | this_is_slave2 |
+----+-------+----------------+
1 row in set (0.01 sec)
mysql> select * from test.zang;
+----+-------+----------------+
| id | name | address |
+----+-------+----------------+
| 2 | zhang | this_is_slave1 |
+----+-------+----------------+
1 row in set (0.01 sec)[root@localhost ~]# mysql -uroot -p123456 -P8066 -h192.168.10.101
MySQL [(none)]>insert into zang values('4','zhang','write_test');
Query OK, 1 row affected (0.08 sec)