yuanxiaojiang
人的放纵是本能,自律才是修行

1.18.1数据库服务分布架构概述介绍
分布式架构理念:(基于业务逻辑分布式/基于程序逻辑分布式)
●架构演变过程早期,为了满足主要业务功能需求,可以将所有程序部署在一个服务器节点上;
·架构演变过程发展,为了满足主要业务压力增长,可以将所有程序拆分部署在不同服务器上;
●架构演变过程发展,为了满足主要业务安全稳定,可以将数据库设计成主从架构或读写分离;
●架构演变过程发展,为了满足多个业务数量增加,可以将架构环境根据业务的情况独立拆分;
●架构演变过程发展,为了满足单独业务数量激增I可以将多个数据表进行拆分到多个节点上;(垂直拆分-MyCAT进行数据表信息整合)
●架构演变过程发展,为了满足单独业务数量激增,可以将单个数据表进行拆分到多个节点上;(水平拆分-MyCAT进行数据表信息整合)
●架构演变过程发展,为了满足业务的数据搜索业务需求、缓存业务需求、大数据业务分析需求,还要引入NOSQL或NewSQL数据库;

 

传统网站架构的发展变化历程

1674788427009

数据库存储架构发展变化历程

1674788468176

1674788511223

1674788559115

 

架构规划

需要连个虚拟主机,每个虚拟主机中需要有4个实例

1674789847654

1674800966208

基础环境操作命令

# 删除历史数据库环境
pkill mysqld
rm -rf /data/330*
mv /etc/my.cnf /etc/my.cnf.bak

# 创建相关目录初始化数据
mkdir /data/33{07..10}/data -p && chown -R mysql.mysql /data/*
初始化命令。。。

 

image

 systemctl文件

image

MyCAT分布式存储主从环境架构(进行多实例主从与双主架构)

实现双主关系建立

# 实现双主关系建立(10.0.0.51:3307 <--> 10.0.0.52:3307)
mysql -S /data/3307/mysql.sock -e "create user repl@'10.0.0.%'" identified with 
\mysql_native_password by '123';grant replication slave on *.* to repl@10.0.0.%;" db02上进行 mysql -S /data/3307/mysql.sock -e "create user root@'10.0.0.%'" identified with
\mysql_native_password by 'root';grant all on *.* to repl@10.0.0.%;" db02上进行

在db01数据库上进行操作
mysql -S /data/3307/mysql.sock -e "change master to master_host='10.0.0.52',master_port=3307\
,master_auto_position=1,master_user='repl',master_password='123';"
mysql -S /data/3307/mysql.sock -e "start slave;"
mysql -S /data/3307/mysql.sock -e "show slave status\G;" |grep Running;

在db02数据库上进行操作
mysql -S /data/3307/mysql.sock -e "change master to master_host='10.0.0.51',master_port=3307\
,master_auto_position=1,master_user='repl',master_password='123';"
mysql -S /data/3307/mysql.sock -e "start slave;"
mysql -S /data/3307/mysql.sock -e "show slave status\G;" |grep Running;
# 实现主从建立(10.0.0.51:3307 --> 10.0.0.51:3309)
mysql -S /data/3309/mysql.sock -e "change master to master_host='10.0.0.51',master_port=3307\
,master_auto_position=1,master_user='repl',master_password='123';"
mysql -S /data/3309/mysql.sock -e "start slave;"
mysql -S /data/3309/mysql.sock -e "show slave status\G;" |grep Running;
# 实现主从建立(10.0.0.52:3307 --> 10.0.0.52:3309)
mysql -S /data/3309/mysql.sock -e "change master to master_host='10.0.0.51',master_port=3307\
,master_auto_position=1,master_user='repl',master_password='123';"
mysql -S /data/3309/mysql.sock -e "start slave;"
mysql -S /data/3309/mysql.sock -e "show slave status\G;" |grep Running;

 

 

# 实现双主关系建立(10.0.0.51:3308 <--> 10.0.0.52:3308)
mysql -S /data/3308/mysql.sock -e "create user repl@'10.0.0.%'" identified with 
\mysql_native_password by '123';grant replication slave on *.* to repl@10.0.0.%;"  db01上进行
mysql -S /data/3308/mysql.sock -e "create user root@'10.0.0.%'" identified with 
\mysql_native_password by 'root';grant all on *.* to repl@10.0.0.%;"  db01上进行

在db02数据库上进行操作
mysql -S /data/3308/mysql.sock -e "change master to master_host='10.0.0.52',master_port=3307\
,master_auto_position=1,master_user='repl',master_password='123';"
mysql -S /data/3308/mysql.sock -e "start slave;"
mysql -S /data/3308 /mysql.sock -e "show slave status\G;" |grep Running;

在db02数据库上进行操作
mysql -S /data/3307/mysql.sock -e "change master to master_host='10.0.0.51',master_port=3307\
,master_auto_position=1,master_user='repl',master_password='123';"
mysql -S /data/3307/mysql.sock -e "start slave;"
mysql -S /data/3307/mysql.sock -e "show slave status\G;" |grep Running;
# 实现主从建立(10.0.0.51:3307 --> 10.0.0.51:3309)
mysql -S /data/3309/mysql.sock -e "change master to master_host='10.0.0.51',master_port=3307\
,master_auto_position=1,master_user='repl',master_password='123';"
mysql -S /data/3309/mysql.sock -e "start slave;"
mysql -S /data/3309/mysql.sock -e "show slave status\G;" |grep Running;
# 实现主从建立(10.0.0.52:3307 --> 10.0.0.52:3309)
mysql -S /data/3309/mysql.sock -e "change master to master_host='10.0.0.51',master_port=3307\
,master_auto_position=1,master_user='repl',master_password='123';"
mysql -S /data/3309/mysql.sock -e "start slave;"
mysql -S /data/3309/mysql.sock -e "show slave status\G;" |grep Running;

 

异常同步错误充值方法

mysql -S /data/3307/mysql.sock -e "stop;reset slave all;"

mysql -S /data/3308/mysql.sock -e "stop;reset slave all;"

mysql -S /data/3309/mysql.sock -e "stop;reset slave all;"

mysql -S /data/3310/mysql.sock -e "stop;reset slave all;"

安装MYCAT软件程序

MyCAT是开源组织和社区开发人员,在淘宝cober(TDDL)基础上进行的二次开发

软件下载地址https://github.com/MyCATApache/Mycat-Server

# 在db01上部署java环境
yum install -y java
# cd /usr/local

# 配置服务程序环境变量
vim /etc/profile
export PATH=/usr/local/mycat/bin:$PATH
source /etc/profile

# 运行启动服务程序并测试连接mycat
mycat start
mysql -uroot -proot -h127.0.0.1 -P8066 或者
mysql -uroot -proot -h127.0.0.1 -P8066 -default-auth=mysql_native_password
有可能出现连接不上的情况,因为mycat程序中,使用的java连接驱动版本为5.1版本,和数据库8.0可能有兼容问题
cp mysql-connector-java-8.0.21/mysql-connector-java-8.0.21.jar /usr/local/mycat/lib/
mycat restart

 

MyCAT分布式存储读写分离实现

mycat程序目录结构

目录信息 解释说明 文件信息 解释说明
bin 程序脚本目录    
conf 配置文件目录 schema.xml 管理节点信息配置文件(主配置文件)
节点信息、读写分离、高可用设置、调用分片策略
    rule.xml 定义分片规则配置文件(分片策略定义、功能使用方法)
    server.xml 服务功能本身配置文件
(服务有关配置:用户、网络、权限、策略)
    xx.txt 分片参数定义文件
    log4j2.xml 相关日志记录配置
lib 驱动程序目录    
logs 日志文件目录 wrapper.log 服务运行启动日志文件
    mycat.log 服务运行情况日志文件

mycat实现读写分离

cd /usr/local/mycat/conf/
cp schema.xml schema.xml.bak
vim schema.xml

 

image

image

 

image

image

image

 

image

 

 

image

 mysql -uroot -proot -h10.0.0.51 -P8066

select @@server_id  -- 模拟程序读操作,会将请求发送到3309从库

begin;select @@server_id;  -- 进行写入操作,会将请求发送到3307从库

MyCAT分布式存储冗余功能实现(实现高可用)

利用mycat分布式存储功能设置,实现读写分离及其高可用效果 

image

mycat读写分离高可用功能测试

# 在db01主节点进行操作
mycat restart
# 读写分离测试操作
mysql -uroot -proot -h10.0.0.51 -P8066
select @@server_id;  #9
select @@server_id;  #19 

begin;select @@server_id;


# 在51上将真正的主库给停掉(模拟出现故障)
systemctl stop mysql57
重新执行上述读操作,只会达到19这个从库

 

MyCAT分布式存储企业场景应用

垂直分表应用 

1674788511223

 

利用dataNode配置信息创建两个数据表垂直分片,对应sh1和sh2
垂直分片sh1负责将用户表信息,读写分离及高可用存储在51-3307/3309 52-3307/3309节点上
垂直分片sh2负责将订单表信息,读写分离及高可用存储在51-3308/3310 52-3308/3310节点上
[root@master~]#cd/usr/local/mycat/conf/负责 [root@master conf]#mv schema.xml schema.xml.ha [root@masterconf]#vim schema.xml <?xmlversion="1.0"?> <!DOCTYPEmycat:schemaSYSTEM"schema.dtd"> <mycat:schemaxmlns:mycat="http://io.mycat/"> <schemaname="TESTDB"checksQLschema="false"sqlMaxLimit="1oo"dataNode="sh1"> <table name="user"dataNode="sh1"/> <table name="order_t" dataNode="sh2"/> </schema> <dataNodename="shl"dataHost="xiaoql"database="taobao"/> <dataNode name="sh2"dataHost="xiaoq2"database="taobao"/> <dataHost name="xiaoql" maxCon="1ooo" minCon="10"balance="1"writeType="O"dbType="mysql" dbDriver="native"switchType="1"> <heartbeat>select user()</heartbeat> <writeHosthost="db1"url="192.168.30.101:3307"user="root"password="123"> <readHost host="db2" url="192.168.30.101:3309"user="root"password="123"/> </writeHost> <writeHosthost="db3"url="192.168.30.102:3307"user="root"password="123"> <readHost host="db4" url="192.168.30.102:3309"user="root" password="123"/> </writeHost> </dataHost>

<dataHostname="xiaoq2"maxCon="1ooo"minCon="10"balance="1"writeType="0"dbType="mysql"
dbDriver="native"switchType="1">
<heartbeat>selectuser()</heartbeat>
<writeHost host="db1" url="192.168.30.101:3308" user="root" password="123">
<readHost hos
"db2"url="192.168.30.101:3310"user="root" password="123" />
</writeHost>
<writeHosthost="db3"url="192.168.30.102:3308"user="root"password="123">
<readHost host="db4" url="192.168.30.102:3310" user="root" password="123"/>
</writeHost>
</dataHost>
</mycat:schema>

 

 

#创建测试库和表
[root@master~]#mysql-S/data/33o7/mysql.sock-e"createdatabase
baocharset utf8;"
[root@master~]# mysql-S/data/33o8/mysql.sock-e"create database taobao charset utf8;"
[root@master~]#mysql-S/data/3307/mysql.sock-e"usetaobao;createtableuser(idint,namevarchar(2o));"
[root@master~]#mysql-S/data/33o8/mysql.sock-e"usetaobao;createtableorder_t(idint,namevarchar(2o));"
对于数据库的DDL操作不要进入mycat进行操作,避免出现死锁问题,都需要进入后端节点进行操作
#重启服务程序
[root@master~]#mycatrestart
#创建数据表测试数据
[root@master~]#mysql-uroot-p123456-h192.168.30.101-P8066
mysql> insert into user values(1,'a');
mysql> insert into user values(2,'b');
mysql>insert into user values(3,'c');
mysql> commit;
向用户表中添加模拟数据信息 

mysql>insert into order_t values(1,x'),(2,'y');
mysql> commit;
-向订单表中添加模拟数据信息
#查看后端数据库节点数据存储信息
[root@master confj#mysql-S/data/33o7/mysql.sock-e"show tables from taobao;"
|Tables_in_taobao|
|user
[root@master conf]#mysql-S/data/3308/mysql.sock-e"showtables from taobao;"

 

 

posted on 2025-09-30 09:37  猿小姜  阅读(27)  评论(0)    收藏  举报

levels of contents