当前位置: 代码迷 >> 综合 >> MyCat——数据读写分离、分库分表以及HA搭建
  详细解决方案

MyCat——数据读写分离、分库分表以及HA搭建

热度:65   发布时间:2023-12-22 05:45:05.0

环境准备

MySQL5.7
MyCAT1.6.7.3
VBox
三台CentOS7.3虚拟机:
192.168.1.7 MyCat01 -MySQL
192.168.1.8 MyCat02 -MySQL
192.168.1.9 MyCat03 -MyCat

搭建环境

192.168.1.7 MyCat01 -MySQL
192.168.1.8 MyCat02 -MySQL
两台节点搭建MySQL
192.168.1.9MyCat03 搭建MyCat中间件

MyCat官网,下载某个版本之后上传到服务器
http://www.mycat.org.cn/

解压

tar -zxvf Mycat-server-1.6.7.3-release-20190828135747-linux.tar.gz

进入到解压之后的mycat目录,进入到配置文件conf文件下

修改server.xml

vim server.xml

修改root的密码,和schemas的逻辑库,也修改user账户的逻辑库

修改schema.xml

vim schema.xml

修改逻辑库对应的库名称,跟server.xml中对应。
配置节点主机就是两台MySQL地址。
配置分配节点,就是对应两台MySQL的配置。
在这里插入图片描述

启动MyCat

console是可以将日志打印,记得要配置Java环境
start就是后台启动

./mycat console

测试插入数据

使用Navcat连接这3节点,MyCat默认端口是8066
在MyCat中插入两条数据,可以看到,两台数据根据配置的规则分别插入到了两个库中。

在这里插入图片描述
在这里插入图片描述
默认规则0-500M的主键在第一个库,500M-1000M在第二个库
autopartition-long规则

MyCat-Manager

除了8066端口之外还有一个9066端口

show @@help;

通过命令窗口打开这个链接
通过查看命令可以看到有
reload @@config
reload @@config_all
命令,通过这个命令可以重载MyCat的配置,这样在生成环境中就可以不重新启动MyCat带来的影响。

在这里插入图片描述

用户配置

server.xml中用户的配置

<user name="root" defaultAccount="true"><property name="password">123456</property><property name="schemas">user</property>
</user>

schemas的配置要要跟schema.xml配种中有多少schema标签匹配,有多个是就用,隔开,如:

<property name="schemas">user,order,product</property>

schema.xml配置

配置dataHost(节点主机),包括读host,写host
配置dataNode(数据节点),指定到具体的数据库
配置schema,表名、数据节点、分配规则

dataHost

<dataHost name="db7" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100"><heartbeat>select user()</heartbeat><writeHost host="M1" url="192.168.1.7:3306" user="root" password="123456"><!-- can have multi read hosts --><!--<readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx" /> -->
</writeHost>
</dataHost>

name:集群别名,随便取
maxCon,minCon:连接池的最大连接数和最小连接数
balance:负载均衡类型,0表示不使用读写分离,所有的读写请求都发送给写节点1和2读写均匀分配;3表示读落在readHost上
writeType:0表示所有的写请求都会落到第一个读库上;1表示读写请求随机发送给可用的节点
dbType:mysql代表的是配置的是mysql集群
dbDriver:mycat自带的数据库驱动
switchType:1代表mycat会使用自己的心跳监测结果去判断那个节点宕机了
slaveThreshold:100表示如果从库的时间落后于主库的时间超过100秒就被剔除,mycat就不会从这个从节点读取数据
heartbeat:心跳监测执行的SQL语句,也可以更改,比如select 1,只要有返回响应就行,表示没有宕机
writeHost :配置MySQL节点,有多少节点就配置多少个writeHost 标签。如果有主从关系,那就要把读的配置放在标签内部
host:自定义名称
url:节点地址+端口
user:节点的数据库登录账号
password:节点的数据库登录密码

dataNode

<dataNode name="dn7" dataHost="db7" database="user_7" />

name :节点名称
dataHost :对应的dataHost名称
database :对应数据库里的表

schema

<schema name="user" checkSQLschema="true" sqlMaxLimit="100"><!-- auto sharding by id (long) --><table name="user" dataNode="dn7,dn8" rule="auto-sharding-long" /><!-- global table is auto cloned to all defined data nodes ,so can join with any table whose sharding node is in the same data node --><!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate" /> -->
</schema>

checkSQLschema:true表示MyCat在执行SQL语句的时候会把SQL语句中逻辑库的名字去掉,直接使用表名;false反之
sqlMaxLimit:100表示每次查询最多返回100条数据,仅对分片表有效
table
name:虚拟表的名称
** type**:gobal表示这是全局表,不做水平切分;mod-long主键求模切分
dataNode:表放置的逻辑库位置,根据配置的dataNode来填
rule :定义分片表的分片规则,必须与rule.xml中的tableRule对应
ruleRequired :是否绑定分片规则,true表示没有绑定分片规则,程序报错

配置主从MySql

配置

在作为主节点的服务器上配置/etc/my.cnf
添加如下配置,主节点的server-id必须为1,从节点不能重复

log-bin=sea_mysql
server-id=1

在从节点中的/etc/my.cnf配置

server-id=2

重启两台服务器的Mysql

主创建备份账户并授权replication slave

创建账户
mysql>create user 'repl'@'%' identified by '123456';
授权replication slave给repl账户

刷新权限

mysql>grant replication slave on *.* to 'repl'@'%';
mysql>FLUSH PRIVILEGES;
主进行锁表

这是为了在进行主从数据备份的时候,防止数据落到主库上,这样数据就没法插入到主库。

mysql>FLUSH TABLES WITH READ LOCK;
主 找到log-bin位置
mysql> SHOW MASTER STATUS;

主备份数据
mysqldump --all-databases --master-data > dbdump.db

然后在从节点的服务器上把主节点备份下来的dbdump.db复制过到相同的默认路径

scp root@192.168.1.7:~/dbdump.db .


加载过来之后在从节点的数据库中加载这份备份文件

mysql < dbdump.db -uroot -p

执行完并确认数据已经备份到主节点之后,释放主节点的锁

mysql> unlock tables;unlock tables;

设置主从同步

在从节点中进行配置
master_log_file=‘sea_mysql.000001’,
master_log_pos=747;
两条就是在主节点中 show master status的信息

mysql> change master to-> master_host='192.168.1.7',-> master_user='repl',-> master_password='123456',-> master_log_file='sea_mysql.000001',-> master_log_pos=747;
mysql> start slave;

字表

childTable :定义分片字表
name :字表名称
joinKey :标志字表的列,用于与父表做关联
parentKey :标志父表的列,与joinKey对应
primaryKey :子表主键,同table标签上的
needAddLimit :同table标签上的

joinKey表示是子表中的字段名称,parentKey表示是是父表中的字段名称

<table name="o_order" dataNode="dn7,dn8" rule="auto-sharding-long"><childTable name="order_item" joinKey="order_id" parentKey="id" />
</table>

HA

避免单点故障
HA架构图
两个keepalived会虚拟出一个虚拟IP,一个连接请求进来通过虚拟IP,然后会进入到其中一个haproxy,然后通过haproxy我们自己定义的负载均衡方式去访问两台mycat。

安装第二台mycat

在192.168.1.8上也安装MyCat
-r表示mycat目录下的所有文件

scp -r root@192.168.1.9:/usr/mycat .

然后启动mycat,navcat连接

安装haproxy

yum -y install haproxy.x86_64

修改配置

vim /etc/haproxy/haproxy.cfg

连接mycat要用tcp协议去连接
在这里插入图片描述
把mycat的节点配置上
在这里插入图片描述
启动haproxy

haproxy -f /etc/haproxy/haproxy.cfg

连接的密码就是mycat的账号密码

HA-Keepalived

安装keepalived

yum install -y keepalived.x86_64

配置

vim /etc/keepalived/keepalived.conf

注释掉如下配置,不然会影响虚拟ip

然后把下面这段配置之后的配置都删除就可以了,不影响使用


查看当前主机的网卡名称

修改网卡的名称

在另一台的主机手也安装keepalived,配置跟上面一样,唯一区别的就是要改成SLAVE,虚拟IP就MASTER的一致
在这里插入图片描述

启动keepalived

keepalived -f /etc/keepalived/keepalived.conf

查看网卡下的虚拟地址,可以看到现在有2个了,多了一个我们刚刚自己配置的

然后用Navcat连接,地址用虚拟IP,账号密码用mycat的

Keepalived的Master挂了

当Master挂了之后,虚拟IP就会绑定到SLAVE上,当主节点再次启动之后,虚拟IP也还是绑定在SLAVE上。

haproxy挂了之后的热备

keepalived配置中的TCP_CHECK没有起到作用,暂时先去掉
安装killall命令,这并不是杀掉进程的命令,而是探测你进程是否还存在的命令。

yum install -y psmisc.x86_64

修改keepalived的配置

vrrp_script chk_haproxy {
    script "killall -0 haproxy"interval 2
}
track_script {
    chk_haproxy
}

至此,重启两台keepalived之后,可以尝试杀掉haproxy,可以看到虚拟IP也是在互相存在于另一台的主机上。并且也不影响查询。

.7主机
.8主机