项 目 | Mycat | MySQL-master | MySQL-master-standby | MySQL-slave |
---|---|---|---|---|
IP | 10.230.4.131 | 10.230.3.194 | 10.230.3.195 | 10.230.2.132 |
Port | 8077/9077 | 3306 | 3306 | 3307 |
MySQL为二主一从,3.195为3.194的standby,2.132为3.194的slave。
实验用例表如下:
CREATE TABLE 'yf.travelrecord' (
'id' int(11) NOT NULL AUTO_INCREMENT,
'org_code' varchar(20) NOT NULL,
'test_name' varchar(20) DEFAULT NULL,
PRIMARY KEY ('id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Mycat的基本配置如下:
select user()
通过show @@datasource查看后端数据库的分布情况
不开启读写分离机制,所有的读操作都发送到当前的writeHost上。
所有读操作都发送到了当前的wirteHost对应的readhost和备用的writehost,这样就可以减轻主库的压力,高效地提供写操作,而由其他服务器承担比较耗费资源的读操作。
所有读操作都发送到所有的writeHost金额readhost上,即当前datahost内的服务器都参与分担读操作。这个场景比较适合主库压力不是很大时,也可以分担读操作,更合理地利用资源。
所有读操作只发送到当前writeHost对应的readhost上。在实际应用时,比较适合双主热备、多个slave的情况。
MySQL Galera Cluster是一套基于同步复制的多主MySQL集群解决方案,使用简单,没有单点故障,可用性高,能很好地保证业务量不断增长时数据的安全和随时扩展。
MySQL Galera Cluster的主要特点有:多服务器的拓扑结构;真正的多主架构,任何节点都可以进行读写及同步复制,各节点之间无延迟且节点宕机不会导致数据丢失;紧密耦合,所有节点均保持相同的状态,节点之间没有不同的数据,无须主从切换操作或使用vip;在Failover的过程中无停机时间(其实不需要Failover),无须手工备份当前数据库并复制至新节点;支持InnoDB存储引擎;对应用透明,无需更改应用或进行极小的更改便可以在任意节点上进行读写;自动剔除故障节点,自动加入新节点;真正行级别的并发复制,客户端连接与操作单台MySQL数据库的体验一致。
Galera官方建议一套Cluster至少有3个节点,理论上可以多写,但是在多个实验环境和生产案例中,多写会引起较为严重的锁等待,所以使用Galera时推荐用一写多读。这样,Galera结合Mycat,很容易配置出一套读写分离的数据库架构。
项 目 | Mycat | Pxc1 | Pxc2 | Pxc3 | Pxc1_slave |
---|---|---|---|---|---|
IP | 10.230.4.131 | 10.230.3.194 | 10.230.3.195 | 10.230.3.195 | 10.230.2.132 |
Hostname | xjw-cc-03 | xjw-dba-01 | xjw-dba-02 | xjw-dba-03 | rfd-dba-01 |
Port | 8077/9077 | 3306 | 3306 | 3306 | 3307 |
3.194、3.195、3.196为一套Percona Xtradb Cluster,2.132为3.194节点的slave。
实验用例表如下:
CREATE TABLE 'yf.travelrecord' (
'id' int(11) NOT NULL AUTO_INCREMENT,
'org_code' varchar(20) NOT NULL,
'test_name' varchar(20) DEFAULT NULL,
PRIMARY KEY ('id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Mycat的基本配置如下:
show status like 'wsrep%'
不进行读写分离,所有读写都走配置的dataHost的第一个writeHost。
全部的readHost与stand by writeHost都参与select语句的负载均衡,如果Pxc的节点本身没带slave,则三个Pxc节点中 的一个作为写,另外两个作为读。按照我们的配置,pxc_M1将作为写节点,pxc_M2、pxc_M3参与度。
在第一个节点增加一台slave,Mycat配置如下:
show status like 'wsrep%'
这时pxc_S1也作为读节点加入读负载均衡。
所有读操作都随机地在writeHost、readHost上分发。此时作为写节点的pxc_M1也参与读操作。
所有读请求都随机地分发至writeHost对应的readHost执行,writeHost不负担读压力。如果writeHost没有对应的readHost,则查询分发至writeHost。
从上面的各种验证中可以看出,Galera Cluster有多个节点时,就能通过Mycat实现读写分离,而且从Galera的原理可以看出,节点间的同步是“实时”的,这就为那些对读写延迟要求严格的系统提供了很好的选择。如果某个读节点查询的资源消耗很大,影响了整个集群的性能,则这时可以在节点上加一个slave,把大查询再分离出去。增加slave或者调整读节点的操作对前端都是透明的,只需修改Mycat配置文件,重启或者重载Mycat即可。Galera Cluster的读写分离在某种意义上与Oracle ADG非常相似。