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

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



架构规划
需要连个虚拟主机,每个虚拟主机中需要有4个实例


基础环境操作命令
# 删除历史数据库环境 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/* 初始化命令。。。

systemctl文件

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







mysql -uroot -proot -h10.0.0.51 -P8066
select @@server_id -- 模拟程序读操作,会将请求发送到3309从库
begin;select @@server_id; -- 进行写入操作,会将请求发送到3307从库
MyCAT分布式存储冗余功能实现(实现高可用)
利用mycat分布式存储功能设置,实现读写分离及其高可用效果

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分布式存储企业场景应用
垂直分表应用

利用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;"
浙公网安备 33010602011771号