数据库为什么要主从复制、读写分离?
- 在企业应用中,成熟的业务通常数据量都比较大
- 单台MySQL在数据存储、安全性和高并发方面都无法满足实际的需求
- 需要配置多台主从数据服务器以实现主从复制,增加数据可靠性,读写分离,减少数据库压力和存储引擎带来的表锁定和行锁定问题
一、主从复制原理
- 基于语句的复制(默认)
在主服务器上执行的语句,从服务器执行同样的语句 - 基于行的复制
把改变的内容复制到从服务器 - 混合类型的复制
一旦发现基于语句无法精确复制时,就会采用基于行的复制
主从间的工作过程
主服务器上开启二进制日志文件,并允许其他数据库同步
从服务器上开启中继日志
主服务器的二进制日志数据以字节流的形式传入I/O线程
I/O线程写入中继日志
从服务器通过SQL线程从中继日志读取SQL语句与主服务器同步
二、读写分离原理
- 只在主服务器上写,只在从服务器上读
- 主数据库处理事务性查询,从数据库处理SELECT查询
- 数据库复制用于将事务性查询的变更同步到集群中的从数据库
三、Amoeba实现主从复制、读写分离
3.1原理:
- 共涉及三个账号
1.主从复制账号myslave,允许从服务器访问主服务器
2.mysql允许amoeba直接访问的账号 test
3.允许客户端访问amoeba服务器的账号 amoeba - 通过Amoeba实现读写分离
- 虚拟模块MySQL-Proxy做读取从服务器时的轮询
3.2实例
此处在amoeba上装数据库作为客户端
3.2.1.时间同步
[root@master ~]# ntpdate ntp1.aliyun.com
21 Oct 18:29:46 ntpdate[44242]: step time server 120.25.115.20 offset 1.449094 sec
3.2.2.三台数据库安装mysql5.7,amoeba服务器作为客户端使用时可安装mysql5.7或者简易数据库做测试,此处四台都装了mysql5.7,安装方法见
3.3.3.主服务器20.0.0.21上
vim /etc/my.cnf
#找到server-id部分,三台主从数据库的id必须不同
server-id = 11
log-bin = master-bin //主服务器日志文件
log-slave-updates=true //允许从服务器更新
[root@master ~]# systemctl restart mysqld.service //配置文件修改后必须重启
然后进数据库
[root@master ~]# mysql -uroot -p
Enter password:
mysql> grant replication slave on *.* to 'myslave'@'20.0.0.%' identified by 'abc123'';
Query OK, 0 rows affected, 1 warning (0.01 sec)
//给从服务器授权,允许20.0.0.网段的服务器使用myslave访问所有库的所有表
mysql> flush privileges; //策略刷新
Query OK, 0 rows affected (0.00 sec)
mysql> show master status; //查看主服务器状态,日志用于从服务器同步,position是当前定位
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 | 599 | | |