Mycat读写分离以及拆库拆表综合实验1:主从复制与多源复制

  • schema:由多个数据库组成的逻辑数据库
  • datanode:将数据切分后,一个大表被分配到不同的分片数据库上,每个表分片所在的数据库就称为分片节点
  • datahost:一个或者多个分片节点所在的机器就是节点主机

分片节点与节点主机的概念稍微有点不好理解,举例来说,一张100W的表被分为两张表,前50W在A主机的数据库中,后50W在B主机的数据库中,表所在的数据库就称这张表的分片节点;一个主机中不可能只有一张表,会有许多的分片表放在该主机上,该主机就称为节点主机,即datanode=database@datahost

mycat原理的简单说明:

拦截--->分析--->转发--->结果处理--->返回给用户

mycat分析大致包括:分片分析,路由分析,读写分离分析,缓存分析等,在接下来的实验中会通过分析log来查看mycat如何工作。

架构图如下:
Mycat读写分离以及拆库拆表综合实验1:主从复制与多源复制

数据规划:

Haproxy 集群

haproxy01 node127 192.168.31.127
haproxy02 node128 192.168.31.128

Mycat集群

mycat01 node119 192.168.31.119
mycat02 node118 192.168.31.118

MySQL主从复制集群

mysqlm1 node115   192.168.31.115
mysqlm2 node116   192.168.31.116
mysqls1  node117   192.168.31.117

MySQL galera Cluster

pxc1 node123 192.168.31.123
pxc2 node124 192.168.31.125
pxc3 node126 192.168.31.126

部署mysql互为主从、多源复制

编辑node115配置文件

node115# cat /etc/my.cnf
                datadir=/var/lib/mysql
                socket=/var/lib/mysql/mysql.sock
                log-bin=/tmp/node115
                log-bin-index=/tmp/node115
                server-id=115
                innodb_file_per_table=1

编辑node116配置文件

node116# cat /etc/my.cnf
log-bin=/tmp/node116
log-bin-index=/tmp/node116
server-id=116
innodb_file_per_table=1

编辑node117配置文件
node117上的配置

master_info_repository=TABLE
relay_log_info_repository=TABLE
server-id=117
slave_skip_errors = 1062

master_info_repository

开启MTS功能后,务必将参数master_info_repostitory设置为TABL,这样性能可以有50%~80%的提升。这是因为并行复制开启后对于元master.info这个文件的更新将会大幅提升,资源的竞争也会变大。在之前InnoSQL的版本中,添加了参数来控制刷新master.info这个文件的频率,甚至可以不刷新这个文件。因为刷新这个文件是没有必要的,即根据master-info.log这个文件恢复本身就是不可靠的。在MySQL 5.7中,推荐master_info_repository设置为TABLE,来减少这部分的开销。

relay_log_info_repository 同理

在node115、node116上执行授权操作
mysql> grant replication slave on *.* to 'rep'@'192.168.31.%' identified by 'Mirror-12345';

在配置同步之前先要获取master file以及Pos,请根据实际情况配置

mysql> show master status\G
*************************** 1. row ***************************
             File: node115.000002
             Position: 35291277

在node116上的配置:

mysql> change master to
    -> master_host='192.168.31.115',
    -> master_user='rep',
    -> master_password='Mirror-12345',
    -> master_port=3306,
    -> master_log_file='node115.000002',
    -> master_log_pos=154;

在node115上的配置:

mysql> change master to
    -> master_host='192.168.31.116',
    -> master_user='rep',
    -> master_password='Mirror-12345',
    -> master_port=3306,
    -> master_log_file='node116.000002',
    -> master_log_pos=154;

node117上的配置

mysql> set global read_only=1;  #只读模式

change master to
master_host='192.168.31.115',
master_user='rep',
master_password='Mirror-12345',
master_port=3306,
master_log_file='node115.000002',
master_log_pos=154 for channel 'node115'; #以channel区分源

change master to
master_host='192.168.31.116',
master_user='rep',
master_password='Mirror-12345',
master_port=3306,
master_log_file='node116.000001',
master_log_pos=447 for channel 'node116';

确定replication已经正常运行

mysql> show slave status\G[for channel chanelname]
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes

在node115或者node116上使用存储过程来确定同步

#创建表

CREATE TABLE `t3` (  
    `id` INT (11) NOT NULL AUTO_INCREMENT,  
    `user_id` VARCHAR (20) NOT NULL,  
    `vote_id` INT (11) NOT NULL,  
    `group_id` INT (11) NOT NULL,  
    `create_time` datetime NOT NULL,  
    PRIMARY KEY (`id`),  
    KEY `index_user_id` (`user_id`) USING HASH  
) ENGINE = INNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8

#创建存储过程

DELIMITER //
CREATE  PROCEDURE `t5`(IN n int)  
BEGIN
DECLARE i INT DEFAULT 1;
WHILE (i <= n ) DO  INSERT INTO t3(user_id,vote_id,group_id,create_time ) VALUES (FLOOR(RAND() * 1000),FLOOR(RAND() * 1000),FLOOR(RAND() * 100) ,now() );  
set i=i+1;  
END WHILE;
END; 
//

#调用存储

call t5(10000)

#在node117上确定数据已经同步

mysql> select count(*) from t3;

猜你喜欢

转载自blog.51cto.com/2143754/2119712