主从复制MySQL的安装和用数据库中间件MyCat实现分库分表、读写分离

1.MySql主从复制

1.1.安装mysql

1.1.1.下载

下载地址:https://dev.mysql.com/downloads/mysql/

1.1.2.卸载预装mysql

#查看已安装:
[root@centos upload]# rpm -qa | grep mariadb
#卸载:
[root@centos upload]# rpm -e --nodeps mariadb-libs-5.5.65-1.el7.x86_64
#再次查看:
[root@centos upload]# rpm -qa | grep mariadb

1.1.3.上传安装包

一般上传到 /usr/upload 包里

1.1.4.解压安装包

[root@centos upload]# tar -zxvf mysql-5.6.31-linux-glibc2.5-x86_64.tar.gz -C /usr/local
[root@centos upload]# cd /usr/local
[root@centos local]# mv mysql-5.6.31-linux-glibc2.5-x86_64 mysql

1.1.5.复制mysql的配置文件

[root@centos java]# cd mysql
[root@centos mysql]# cp support-files/my-default.cnf /etc/my.cnf
[root@centos mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysql

1.1.6.修改my.cnf

vim /etc/my.cnf
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
log-error = /usr/local/mysql/data/error.log
pid-file = /usr/local/mysql/data/mysql.pid
user = root
tmpdir = /tmp

1.1.7.初始化数据库

[root@centos local]# cd /usr/local/mysql
[root@centos mysql]# ./scripts/mysql_install_db --user=root --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --pid-file=/usr/local/mysql/data/mysql.pid --tmpdir=/tmp
1.1.7.1.会发现一处处理错误
运行安装mysql 报错
[root@localhost mysql-mult]# ./scripts/mysql_install_db  --defaults-file=conf/3306my.cnf

FATAL ERROR: please install the following Perl modules before executing ./scripts/mysql_install_db:
Data::Dumper

在这里插入图片描述

解决方法 :安装autoconf库

命令:

yum -y install autoconf
1.1.7.2.再次初始化数据库
[root@centos local]# cd /usr/local/mysql
[root@centos mysql]# ./scripts/mysql_install_db --user=root --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --pid-file=/usr/local/mysql/data/mysql.pid --tmpdir=/tmp

1.1.8.启动和关闭mysql

如果有问题看1.1.8.1.

[root@centos mysql]# service mysql start
Starting MySQL..                                          [确定]
[root@centos mysql]# service mysql stop
Shutting down MySQL..                                     [确定]
[root@centos mysql]# service mysql restart
Shutting down MySQL..           
Starting MySQL..                                          [确定]

1.1.8.1.配置mysql命令支持

如果提示没有mysql命令,需要添加软连接

[root@centos mysql]# ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql

1.1.9.修改MySQL密码(不要少最后的分号)

[root@centos upload]# mysql -u root
mysql> use mysql; 
mysql> update user set password= password("1111") where user='root';
mysql> flush privileges;

1.1.10.开放远程登录权限

mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '1111' WITH GRANT OPTION;
mysql>FLUSH PRIVILEGES;

设置完可以根据ip远程登录此数据库测试
在这里插入图片描述

1.1.11.设置开机启动

[root@centos mysql]# chkconfig mysql on

1.2.MySQL主从复制

1.2.1.mysql主从简介

1. MySQL 默认支持主(master)从(slave)功能.
2. 主从复制效果:在主数据库中操作时,从同步进行变化.
3. 主从复制本质:主数据的操作写入到(log_bin)日志中,从数据库从i/o线程从日志中读取,SQL线程进行同步数据操作.

在这里插入图片描述

主从备份要素:
    1. 开启主数据库日志功能
    2. 每个数据库需要有一个 server_id,主 server_id 值小于从server_id(标识从哪server写入的)
    3. 每个 mysql 都有一个 uuid,由于虚拟机直接进行克隆,需要修改uuid 的值(唯一识别码)

1.2.2.配置mysql主从步骤

1.2.2.1.克隆MySql-1的虚拟机

克隆MySql-1的虚拟机改名为MySql-2,并且改ip;

1.2.2.2.配置主数据库

1、修改主数据库的my.cnf文件
命令:

 cd
 vim /etc/my.cnf

在这里插入图片描述
log_bin名字可以自定义;

2、重启mysql

[root@centos upload]# service mysql restart

3、通过命令可以观察主数据库在主从关系中状态.
可以看到有个日志

1.2.2.3.配置从数据库

1、修改server_id

vim /etc/my.cnf 

在这里插入图片描述

2、mysql安装包里data文件夹auto.cnf中编写当前mysql的uuid

在这里插入图片描述

3、重启mysql

[root@centos upload]# service mysql restart

4、修改slave

mysql> stop slave;
mysql> change master to master_host='192.168.239.138',master_user='root',master_password='1111',master_log_file='master_log.000001';
mysql> start slave;

5、查看slave状态

mysql>show slave status \G;

io线程和sql线程已开启:

只要没有错误,说明配置成功主从关系:


在这里插入图片描述

6、验证主从关系

​ 在主数据库中新建数据库,新建表,添加数据,观察刷新从数据库的

2.MyCat

2.1.MyCat简介

MyCAT是一个数据库中间件。国产开源项目,由Java语言编写,前身是cobar项目。

2.2.Mycat对多数据库的支持

MySQL、Oracle、SQLServer、MongoDB……

2.3.MyCAT架构

如图所示:MyCAT使用Mysql的通讯协议模拟成了一个Mysql服务器,所有能使用Mysql的客户端以及编程语言都能将MyCAT当成是Mysql Server来使用,不必开发新的客户端协议。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hkckN8vk-1665840937493)(assets\1591516069752.png)]

2.4.MyCat分库分表

垂直分割(分库):指按照业务将表进行分类,分布到不同的数据库上面,这样也就将数据或者说压力分担到不同的库上面,如下图:

把usian拆成3个库

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-opMsKGwX-1665840937495)(assets\1591516268835.png)]

水平分割(分表):一个表格的数据按照行分割到多个节点上,如图:

把tb_order表拆分到3个数据库里

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hbUJ9q2G-1665840937497)(assets\1591516586577.png)]

典型的分片规则:

​ 根据主键编号进行hash、求余,如图

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qYL5xF1d-1665840937499)(assets\1591516799849.png)]

2.5.MyCat安装

2.5.1.下载mycat

官方网站:http://www.mycat.org.cn/

github地址:https://github.com/MyCATApache

2.5.2.安装Mycat

1、把MyCat的压缩包上传到linux服务器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3ThlxUaA-1665840937501)(assets\1591517439707.png)]

2、解压缩,得到mycat目录

[root@centos upload]# tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local

3、启动和关闭MyCat

进入mycat/bin,启动MyCat
启动命令:./mycat start
停止命令:./mycat stop
重启命令:./mycat restart
查看状态:./mycat status

注意:可以使用mysql的客户端直接连接mycat服务。默认服务端口为8066

3.Mycat分库分表和读写分离(读写分离前提是有主从复制的MySQL主从机)

3.1.需求

把表分片存储到三个数据节点上。

3.2.安装环境

mysql节点1环境

操作系统版本 : centos6.5
数据库版本 :mysql-5.6
数据库名 : db1
ip:192.168.25.134

mysql节点2环境

操作系统版本 :centos6.5
数据库版本 :mysql-5.6
数据库名 : db2
ip:192.168.25.135

mysql节点3环境

操作系统版本 :centos6.5
数据库版本 :mysql-5.6
数据库名 : db3
ip:192.168.25.136

mycat节点环境

操作系统版本 :centos6.5
mycat版本:1.6release
ip:192.168.25.137

3.4.MyCat重要概念

1、逻辑库(schema):一个包含了所有数据库的逻辑上的数据库

2、逻辑表(table):一个包含了所有表的逻辑上的表

3、数据主机(dataHost):数据库软件安装到哪个服务器上

4、数据节点(dataNode):服务器上的mysql

5、分片规则(rule):拆分规则

3.5. 配置schema.xml

3.5.1.Schema.xml介绍

Schema.xml作为MyCat中重要的配置文件之一,管理着MyCat的逻辑库、表、分片规则、DataNode以及DataHost。
能够配置:逻辑库(schema)、逻辑表(table)、数据主机(dataHost)、数据节点(dataNode)

3.5.2.Schema.xml配置

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
	<schema name="power_shop" checkSQLschema="false" sqlMaxLimit="100">
		<table name="tb_content" dataNode="dn1,dn2,dn3" rule="crc32slot" />
		<table name="tb_content_category" dataNode="dn1,dn2,dn3" rule="crc32slot1"/>
		<table name="tb_item" dataNode="dn1,dn2,dn3" rule="crc32slot2" />
		<table name="tb_item_cat" dataNode="dn1,dn2,dn3" rule="crc32slot3" />
		<table name="tb_item_desc" dataNode="dn1,dn2,dn3" rule="crc32slot4"  />
		<table name="tb_item_param" dataNode="dn1,dn2,dn3" rule="crc32slot5"  />
		<table name="tb_item_param_item" dataNode="dn1,dn2,dn3" rule="crc32slot6" />
		<table name="tb_order" dataNode="dn1,dn2,dn3" rule="crc32slot7" />
		<table name="tb_order_item" dataNode="dn1,dn2,dn3" rule="crc32slot8" />
		<table name="tb_order_shipping" dataNode="dn1,dn2,dn3" rule="crc32slot9" />
		<table name="tb_user" dataNode="dn1,dn2,dn3" rule="crc32slot10" />
		<!--下面这俩可不加入,则对应的rule.xml也不要加相关算法-->
		<table name="de_duplication" dataNode="dn1,dn2,dn3" rule="crc32slot11" />
		<table name="local_message" dataNode="dn1,dn2,dn3" rule="crc32slot12" />
	</schema>

	<dataNode name="dn1" dataHost="localhost1" database="db1" />
	<dataNode name="dn2" dataHost="localhost1" database="db2" />
	<dataNode name="dn3" dataHost="localhost1" database="db3" />

	<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
		writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="hostM1" url="192.168.233.137:3306" user="root" password="1111">
			<readHost host="hostS2" url="192.168.233.138:3306" user="root" password="1111" />
		</writeHost>
	</dataHost>
</mycat:schema>

在这里插入图片描述

3.6. 配置server.xml

3.6.1.server.xml介绍

server.xml几乎保存了所有mycat需要的系统配置信息。
最常用的是在此配置:MyCat的用户名、密码及权限。

3.6.2.server.xml配置

配置MyCat的用户名和密码:

<user name="root">
    <property name="password">1111</property>
    <property name="schemas">power_shop</property>
</user>

<user name="user">
    <property name="password">1111</property>
    <property name="schemas">power_shop</property>
    <property name="readOnly">true</property>
</user>

3.7.配置rule.xml

  • 能够配置:分片规则(rule)

3.7.1.分片规则

3.7.1.1.auto-sharding-long 规则
以 500 万为单位,实现分片规则:
1-500 万保存在 db1 中, 500 万零 1 到 1000 万保存在 db2 中,1000 万零 1 到 1500 万保存在 db3 中.
3.7.1.2.crc32slot 规则
在 CRUD 操作时,根据具体数据的 crc32 算法计算,数据应该保存在哪一个dataNode 中

3.7.2.rule.xml配置

1)<columns>id</columns>中推荐配置主键列

2)所有的 tableRule 只能使用一次。如果需要为多个表配置分片规则,那么需要在此重新定义该规则。

3) 要分片的数据库节点数量,必须指定,否则没法分片
<tableRule name="crc32slot1">
    <rule>
    	<columns>id</columns>
    	<algorithm>crc32slot</algorithm>
    </rule>
</tableRule>
<tableRule name="crc32slot2">
    <rule>
   	 	<columns>id</columns>
   		<algorithm>crc32slot</algorithm>
    </rule>
</tableRule>
<tableRule name="crc32slot3">
    <rule>
    	<columns>id</columns>
    	<algorithm>crc32slot</algorithm>
    </rule>
</tableRule>
<tableRule name="crc32slot4">
    <rule>
    	<columns>item_id</columns>
    	<algorithm>crc32slot</algorithm>
    </rule>
</tableRule>
<tableRule name="crc32slot5">
    <rule>
    	<columns>id</columns>
    	<algorithm>crc32slot</algorithm>
    </rule>
</tableRule>
<tableRule name="crc32slot6">
    <rule>
    	<columns>id</columns>
    	<algorithm>crc32slot</algorithm>
    </rule>
</tableRule>
<tableRule name="crc32slot7">
    <rule>
    	<columns>order_id</columns>
    	<algorithm>crc32slot</algorithm>
    </rule>
</tableRule>
<tableRule name="crc32slot8">
    <rule>
    	<columns>id</columns>
    	<algorithm>crc32slot</algorithm>
    </rule>
</tableRule>
<tableRule name="crc32slot9">
    <rule>
    	<columns>order_id</columns>
    	<algorithm>crc32slot</algorithm>
    </rule>
</tableRule>
<tableRule name="crc32slot10">
    <rule>
    	<columns>id</columns>
    	<algorithm>crc32slot</algorithm>
    </rule>    
</tableRule>
<tableRule name="crc32slot11">
    <rule>
    	<columns>tx_no</columns>
    	<algorithm>crc32slot</algorithm>
    </rule>
</tableRule>
<tableRule name="crc32slot12">
    <rule>
    	<columns>tx_no</columns>
    	<algorithm>crc32slot</algorithm>
    </rule>
</tableRule>    
<function name="crc32slot" class="io.mycat.route.function.PartitionByCRC32PreSlot">
    <property name="count">3</property><!-- 要分片的数据库数量,必须指定,否则没法分片 -->
</function>

3.8.测试

3.8.1.创建库

在主数据库中分别创建db1、db2、db3

3.8.2.创建表并插入数据

配置完毕后,重新启动mycat。

使用mysql客户端连接mycat,创建表并插入数据。
在这里插入图片描述

3.8.3.分表测试

在这里插入图片描述

3.8.4.项目测试

1、修改数据库url

spring:
  application:
    name: power-shop-item
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    # 把原来MySQL的地址换成MyCat的地址和端口;其他都能用
    url: jdbc:mysql://192.168.233.140:8066/power_shop?characterEncoding=UTF-8
    username: root
    password: 1111
    type: com.alibaba.druid.pool.DruidDataSource

2、测试

分别主MySQL数据库中的db1、db2、db3这三个库分别查询一个表中数据数量
命令:SELECT count(1) FROM tb_item
会发现大致相等。

加起来后再在比较原始总数量,会发现相等。 即实现了分库分表(其实只实现了水平分库)。(可以再在schema.xml中配置)
水平分库定义:是把同一个表的数据按一定规则拆到不同的数据库中,每个库可以放在不同的服务器上对比。

因为主从复制,从MySQL数据库和主MySQL拥有一样的结构和数据。
MyCat设置了读、写数据库的ip地址分别指定为从和主,即实现了读写分离
读写分离必须要有主从复制的数据库。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值