MySQL高级三

目录

三、MySQL高级03

3.1 MyCat

3.1.1 MyCat简介

3.1.2 中间件的作用

3.2 安装MyCat

3.3 主从复制

3.3.1 主从复制的原理

3.3.2 主从复制的好处

3.3.3 配置主从复制


三、MySQL高级03

如果虚拟机的磁盘已满,可以对磁盘进行重新分配

参考:虚拟机扩展磁盘与增加磁盘操作_虚拟机新增磁盘_石头城12345的博客-CSDN博客

3.1 MyCat

3.1.1 MyCat简介

Mycat 是数据库中间件。  java->mycat->mysql
1 Cobar属于阿里B2B事业群,始于2008年,在阿里服役3年多,接管3000+个MySQL数据库的schema,集群日处理在线SQL请求50亿次以上。由于Cobar发起人的离职,Cobar停止维护。
2 Mycat是开源社区在阿里cobar基础上进行二次开发,解决了cobar存在的问题,并且加入了许多新的功能在其中。青出于蓝而胜于蓝。
3 OneProxy基于MySQL官方的proxy思想利用c进行开发的,OneProxy是一款商业收费的中间件。舍弃了一些功能,专注在性能和稳定性上。
4 kingshard由小团队用go语言开发,还需要发展,需要不断完善。
5 Vitess是Youtube生产在使用,架构很复杂。不支持MySQL原生协议,使用需要大量改造成本。
6 Atlas是360团队基于mysql proxy改写,功能还需完善,高并发下不稳定。
7 MaxScale是mariadb(MySQL原作者维护的一个版本) 研发的中间件
8 MySQLRoute是MySQL官方Oracle公司发布的中间件

3.1.2 中间件的作用

1、读写分离

 

2、数据分片

垂直拆分(分库)、水平拆分(分表)、垂直+水平拆分(分库分表)

 

3、多数据源整合

 

4、原理

Mycat 的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的 SQL 语句,首先对 SQL语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此 SQL 发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。

这种方式把数据库的分布式从代码中解耦出来,用户察觉不出来后台使用Mycat 还是MySQL。

 

3.2 安装MyCat

注:使用mycat1.6的应用于要求

jdk版本在1.7以上
mysql版本支持5.+,不支持8.+
​
mysql版本如果不正确,会一直报错
Can't connect to MySQL server on'XXXXX'

1、安装wget

-- 使用yum安装wget
yum -y install wget
​
Installed:
  wget.x86_64 0:1.14-18.el7_6.1                                                                        
Complete!

2、使用wget下载MyCat压缩包

wget http://dl.mycat.org.cn/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

3、解压安装包

tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

4、配置环境变量

-- 进入配置文件
vim /etc/profile
-- 配置MyCat的环境变量
export MYCAT_HOME=/usr/lwl/soft/mycat/mycat
export PATH=$MYCAT_HOME/bin:$PATH
​
配置完之后使配置文件生效
source /etc/profile

5、修改server.xml

vim /usr/lwl/soft/mycat/mycat/conf/server.xml
​
1、端口号在第33行,默认为8066(不用进行修改)
<property name="serverPort">8066</property> <property name="managerPort">9066</property>
​
2、修改root用户密码(第81行)
原始密码:123456  修改后的密码root

6、修改schema.xml

方式一:

修改配置文件 schema.xml
删除<schema>标签间的表信息,<dataNode>标签只留一个,
<dataHost>标签只留一个,<writeHost>
<readHost>只留一对 

方式二:

或者将原本的schema.xml文件更名为schema-bak.xml

再建一个新的文件名为schema.xml,内容如下:

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
        <!--这里的TESTDB对应server.xml文件中的property标签-->
        <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
                <!--表名为test1,这张表在数据库test中一定要存在-->
                <table name="test1" dataNode="dn1" />
        </schema>
        <!--节点名字为dn1,dataHost对应下面的dataHost标签,database是指明数据库-->
        <dataNode name="dn1" dataHost="localhost1" database="test" />
        <!--数据库的一些信息,比如dbType="mysql"是说数据库类型是mysql-->
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <!--一直在运行的时候,使用的是user-->
                <heartbeat>select user()</heartbeat>
                <!--用来进行数据库写操作的主机信息,默认的用户名和密码都是root-->
                <writeHost host="hostM1" url="192.168.111.127:3306" user="root" password="密码">
                    <!--用来进行数据库读操作的主机信息,默认的用户名和密码都是root-->
                    <readHost host="hostS2" url="192.168.111.128:3306" user="root" password="密码"></readHost>
                </writeHost>
        </dataHost>
</mycat:schema>
​
​
配置完成后,要赋予新的schema.xml文件高级权限
chmod 777 schema.xml

schema文件解释:

引用:使用Mycat实现数据库读写分离 - 简书

1、schema 解释
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
​
name属性:表示的是逻辑库的名字,是应用程序连接的时候的数据库名称.
​
checkSQLschema属性:当该值设置为 true 时,如果我们执行语句select * from TESTDB.travelrecord;则 MyCat 会把语句修改为select * from travelrecord;。即把表示 schema 的字符去掉,避免发送到后端数据库执行时报(ERROR 1146 (42S02): Table ‘testdb.travelrecord’ doesn’t exist)。
​
sqlMaxLimit属性:当该值设置为某个数值时。每条执行的 SQL 语句,如果没有加上 limit 语句,MyCat 也会自动的加上所对应的值。例如设置值为 100,执行select * from TESTDB.travelrecord;的效果为和执行select * from TESTDB.travelrecord limit 100;相同。设置该值的话,MyCat 默认会把查询到的信息全部都展示出来,造成过多的输出。所以,在正常使用中,还是建议加上一个值,用于减少过多的数据返回。
当然 SQL 语句中也显式的指定 limit 的大小,不受该属性的约束。
需要注意的是,如果运行的 schema 为非拆分库的,那么该属性不会生效。需要手动添加 limit 语句
​
​
​
2、table标签解释
<table name="test1" dataNode="dn1" />
Table 标签定义了 MyCat 中的逻辑表,所有需要拆分的表都需要在这个标签中定义。
​
name 属性:定义逻辑表的表名,这个名字就如同我在数据库中执行 create table 命令指定的名字一样,同个 schema 标签中定义的名字必须唯一。
​
dataNode属性:定义这个逻辑表所属的 dataNode, 该属性的值需要和后面 dataNode 标签中 name 属性的值相互对应。
​
​
​
3、dataNode标签解释
<dataNode name="dn1" dataHost="localhost1" database="test" />
dataNode 标签定义了 MyCat 中的数据节点,也就是我们通常说所的数据分片。一个 dataNode 标签就是一个独立的数据分片。
​
name 属性:定义数据节点的名字,这个名字需要是唯一的,我们需要在table 标签上应用这个名字,来建立表与分片对应的关系。
​
dataHost 属性:该属性用于定义该分片属于哪个数据库实例的,属性值是引用 dataHost 标签上定义的 name 属性。
​
database 属性:该属性用于定义该分片属性哪个具体数据库实例上的具体库,因为这里使用两个纬度来定义分片,就是:实例+具体的库。因为每个库上建立的表和表结构是一样的。所以这样做就可以轻松的对表进行水平拆分。
​
​
​
4、dataHost标签解释
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
作为 Schema.xml 中最后的一个标签,该标签在 mycat 逻辑库中也是作为最底层的标签存在,直接定义了具体的数据库实例、读写分离配置和心跳语句。
​
name 属性:唯一标识 dataHost 标签,供上层的标签使用
​
maxCon 属性:指定每个读写实例连接池的最大连接。也就是说,标签内嵌套的 writeHost、readHost 标签都会使用这个属性的值来实例化出连接池的最大连接数
​
minCon 属性:指定每个读写实例连接池的最小连接,初始化连接池的大小
​
balance 属性:
负载均衡类型,目前的取值有 3 种:
balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
balance="1",全部的 readHost 与 stand by writeHost参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载
均衡。
balance="2",所有读操作都随机的在 writeHost、readhost 上分发。
balance="3",所有读请求随机的分发到 wiriterHost 对应的readhost 执行,writerHost 不负担读压力,
注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。
​
writeType 属性:
负载均衡类型,目前的取值有 3 种:
① writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个 writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .
② writeType="1",所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐。switchType 属性
-1 表示不自动切换。
1 默认值,自动切换。
2 基于 MySQL 主从同步的状态决定是否切换。
​
dbType 属性:指定后端连接的数据库类型,目前支持二进制的 mysql 协议,还有其他使用 JDBC 连接的数据库。例如:mongodb、oracle、spark 等。
​
dbDriver 属性:指定连接后端数据库使用的 Driver,目前可选的值有 native 和 JDBC。使用 native 的话,因为这个值执行的是二进制的 mysql 协议,所以可以使用 mysql 和 maridb。其他类型的数据库则需要使用 JDBC 驱动来支持。
从 1.6 版本开始支持 postgresql 的 native 原始协议。
如果使用 JDBC 的话需要将符合 JDBC 4 标准的驱动 JAR 包放到MYCAT\lib 目录下,并检查驱动 JAR 包中。
包括如下目录结构的文件:META-INF\services\java.sql.Driver。在这个文件内写上具体的 Driver 类名,例如:
com.mysql.jdbc.Driver。
​
​
5、heartbeat标签解释
<heartbeat>select user()</heartbeat>
这个标签内指明用于和后端数据库进行心跳检查的语句。例如,MYSQL 可以使用 select user(),Oracle 可以使用 select 1 from dual 等。
​
​
6、writeHost 标签、readHost 标签解释
这两个标签都指定后端数据库的相关配置给 mycat,用于实例化后端连接池。唯一不同的是,writeHost 指定写实例、readHost 指定读实例,组着这些读写实例来满足系统的要求。在一个 dataHost 内可以定义多个 writeHost 和 readHost。
但是,如果 writeHost 指定的后端数据库宕机,那么这个 writeHost 绑定的所有 readHost 都将不可用。另一方面,由于这个 writeHost 宕机系统会自动的检测到,并切换到备用的 writeHost 上去。
​
host 属性:用于标识不同实例,一般 writeHost 我们使用M1,readHost 我们用S1。
​
url 属性:后端实例连接地址,如果是使用 native 的 dbDriver,则一般为 ipaddress:port 这种形式。用 JDBC 或其他的dbDriver,则需要特殊指定。当使用 JDBC 时则可以jdbc:mysql://localhost:3306/。
​
user 属性:后端存储实例需要的用户名字。
​
password 属性:后端存储实例需要的密码。
​

7、修改服务器名字(可以不修改)

修改前:
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
​
​
#主机修改后:
# 这里的hostM1对应schema.xml中的writeHost标签
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 hostM1
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6 hostM1
192.168.111.127 hostM1
​
#从机修改后
# 这里的hostM1对应schema.xml中的readHost标签
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 hostS1
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6 hostS1
192.168.111.128 hostS1

8、开启主机(127)mycat

1、使用窗口(A)进入到mycat中的logs文件中  /usr/lwl/soft/mycat/mycat/logs
​
2、展示其中的日志文件
[root@hostM1 logs]# ls
2023-02  2023-03  console.log  mycat.log  mycat.pid  wrapper.log
​
3、动态显示日志文件
tail -f wapper.log
​
4、然后再开启一个窗口(B)开启mycat
开启命令:mycat start
​
5、在窗口(A)中的日志中可以观察到
MyCAT Server startup successfully. see logs in logs/mycat.log
即是mycat开启成功

9、连接mycat

mysql -uroot -proot -h192.168.111.127 -P8066 -DTESTDB
-u 代表输入用户
-p 代表密码
-h 代表IP地址
-P 代表端口号
-D 代表连接的数据库名称

10、测试是否连接成功

向TESTDB数据库的test1表中添加一条数据
切换到192.168.111.127的mysql数据库,查看test1的表中是否有相应的数据,如果有就代表读写分离成功
​
测试读写:
连接mycat的mysql,进行添加个查询操作,并且查看操作日志

3.3 主从复制

3.3.1 主从复制的原理

mysql要做到主从复制,其实依靠的是二进制日志,即:假设主服务器叫Master,从服务器叫Slave;主从复制就是Slave跟着Master学,Master做什么,Slave就做什么。
那么Slave怎么同步Master的动作呢?现在Master有一个日志功能,把自己所做的增删改查的动作全都记录在日志中,Slave只需要拿到这份日志,照着日志上面的动作施加到自己身上就可以了。这样就实现了主从复制,具体实现如下图:

 

3.3.2 主从复制的好处

1) 实现服务器负载均衡
2) 通过复制实现数据的异地备份
3) 提高数据库系统的可用性

3.3.3 配置主从复制

1、配置主从复制的要求

1、配置主从复制要求主机、从机安装相同版本的mysql
​
2、主机、从机的mysql中都需要有远程连接的权限
​
3、两台服务器都关闭防火墙
    systemctl stop firewalld
    
4、主机和从机能够互相连通(能ping通)
    在主机127执行:ping 192.168.111.128
    在从机128执行:ping 192.168.111.127

2、两台主机都开启mysql服务

systemctl start mysqld 或者 service mysqld start

3、修改mysql的配置文件 (/etc/my.cnf)

主机:修改192.168.111.127的配置文件
[mysqld] # 一定要在这下面配置
log-bin=mysql-bin   # 二进制的文件
server-id=127       # 唯一的标识  默认是1
​
从机:修改192.168.111.128的配置文件
[mysqld] # 一定要在这下面配置
log-bin=mysql-bin   # 二进制的文件
server-id=128      # 唯一的标识  默认是1
​
​
注:
1、可以只在一台服务器上配置即可,一定要保证主机和从机的server-id不一样
2、log-bin可以不写,会有默认的名字

4、重启mysql服务

systemctl restart mysqld 或者 service mysqld restart

5、主机(127)连接mysql查看主机的状态

show master status;

 

6、从机(128)连接mysql配置对应的主机信息

连接mysql后,配置对应的主机信息,
主机的ip地址,主机的用户名和密码,二进制文件名字和位置
​
change master to master_host='192.168.111.127',
master_user='root',master_password='root',
master_log_file='mysql-bin.000001',master_log_pos=154;

 

7、启动从机

-- 启动从机
start slave;
​
-- 查看从机状态
show slave status\G;

问题1、Slave_IO_Running: No

 

解决uuid相同的问题
​
1、可以先查看两台服务器的uuid
show variables like '%server_uuid%';
​
2、查找auto.cnf
find / -name auto.cnf
​
3、这个文件可以修改任何一个数字,也可以直接删除
这里修改了从机(128)的配置文件
[auto]  #修改前
server-uuid=647f2cac-b7ff-11ed-aefd-000c29102664
[auto]  #修改后 将倒数第五位的0改为7
server-uuid=647f2cac-b7ff-11ed-aefd-000c29172664
​
​
修改后可以先停止从机
stop slave;
​
重启主机和从机的mysql服务
systemctl restart mysqld;
​
再开启从机
start slave;

问题2、Slave_IO_Running: Connecting

 

出现上图就是连接不上主机:
1、防火墙没有关闭
2、主机的用户名和密码不对
3、日志文件的名字不对
4、pos的值不对
​
先停止从机:
stop slave;
​
重启主机和从机的mysql服务
systemctl restart mysqld;
​
再开启从机
start slave;
​
再排除情况
可以先查看日志文件名字是否更改

8、验证主从复制是否成功

在主机中test库中test1表中添加一条数据
然后在从机的test库中的test1表进行查询,能查到就代表配置成功

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值