15.MyCat数据库分片

        MyCat 是一个开源的数据库中间件,主要用于将数据库操作请求路由和分发到后端的多个数据库节点。

1.Mycat环境搭建

        在两个不同数据库中创建相同表 

        下载mycat

https://github.com/MyCATApache/Mycat-Servericon-default.png?t=N7T8https://github.com/MyCATApache/Mycat-Server        将下载好的mycat上传到linux中并解压,进入conf目录打开server.xml文件配置账号与密码

        打开schema.xml文件配置        

        配置虚拟表

image-20220602114923879

        配置节点

image-20220602115057601

        配置每个节点的mysql

image-20220602115228187

        进入bin目录,启动mycat并查看运行情况

./mycat start

ps -ef|grep myca

        开放mycat的8066端口

firewall-cmd --zone=public --add-port=8066/tcp --permanent

systemctl restart firewalld.servic

        用工具连接三个数据库, 添加数据就会发现id每五百万的各放在一张表,这是由mycat的schema.xml文件中配置的方法决定的

2.Mycat读写分离

        注意:mysql主从最好版本一致,否则会导致从机设置失败(即使设置了server-id)

Slave is not configured or failed to initialize properly. You must at least set --server-id to enable either a master or a slave. Additional error messages can be found in the MySQL error log.

2.1 mysql的主从分离

        数据库读写分离对于大型系统或者访问量很高的互联网应用来说,是必不可少的一个重要功能。Insert SQL就是几十个毫秒,Select SQL则要几秒到几分钟才能有结果,很多复杂的SQL,其消耗服务器CPU的能力超强,不亚于死循环的威力。高峰时段的一些复杂SQL查询就导致数据库服务器CPU爆表,系统陷入瘫痪,严重情况下可能导致数据库崩溃。我们应该尽量避免没有主从复制机制的单节点数据库。

        对于MySQL来说,标准的读写分离是主从模式,一个写节点Master后面跟着多个读节点,读节点的数量取决于系统的压力,通常是1-3个读节点的配置。

2.2 MySQL主从复制的原理

1.主库上记录二进制日志(稍后介绍如何设置)。在每次准备提交事务完成数据更新前,主库将数据更新的事件记录到二进制日志中,MySQL会按事务提交的顺序而非每条语句的执行顺序来记录二进制日志。

2.备库将主库的二进制日志复制到其本地的中继日志中,备库会启动一个工作线程,称为IO线程,I/O线程跟主库建立一个普通的客户端连接,然后在主库上启动一个特殊的二进制转储(binhg dump、线程该线程没有对应的SQL命令),这个二进制转储线程会读取主库上二进制日志中的事件

3.备库的SQL线程执行最后一步,该线程从中继日志中读取事件并在备库执行,从而实现备库数据的更新主从复制是mysql来实现,mycat配合mysql的主从来完成功能。

2.3 MySQL的主从复制

mysql的主从复制完成后,接下来就引入mycat,采用标准的MySQL主从复制高可用性配置并交付给Mycat来完成后端MySQL节点的主从自动切换。

image-20220601172749851

工作流程为:

1.MySQL节点开启主从复制的配置方案,并将主节点配置为Mycat的dataHost里的writeNode,从节点配置为readNode.

2.Mycat内部定期对一个dataHost里的所有writeHost与readHost节点发起心跳检测,正常情况下,Mycat会将第一个writeHost作为写节点,所有的DML SQL会发送给此节点,将readHost作为读节点。

3.当一个dataHost里面配置了两个或多个writeHost的情况下,如果第一个writeHost宕机,则Mycat会在默认的3次心跳检查失败后,自动切换到下一个可用的writeHost执行DML SQL语句。

4.dataNodeHeartbeatPeriod=10000节点心跳检测的频率为10s一次。mycat默认会往数据库发生select users()

2.3.1 mysql主从复制操作步骤

1、主机操作

1.1、修改主机MySQL的/etc/my.cnf文件,特别注意的是my.cnf是MySQL数据库的主配置文件,这个路径是我安装MySQL时指定的主配置文件

<span style="background-color:#f8f8f8"><span style="color:#333333">#主机配置,同步db1中的数据,不同步mysql自带的数据库
binlog-do-db=db1
binlog-ignore-db=mysql
#启用日志
log-bin=mysql-bin
#服务器唯一ID,所有MySQL的id不能一致
server-id=<span style="color:#116644">1</span></span></span>

image-20220601172844554

1.2、重启mysql

service mysqld restart

1.3、登录MySQL创建从机用于连接主机的账户并授权

mysql -u root -p

grant file on . to 'tiger'@'%' identified by '123456';

创建一个用户并指定该用户可以操作主机上的所有文件(.),可以在任何ip(@'%')的设备上通过tiger账号登录主机

GRANT REPLICATION SLAVE,REPLICATION CLIENT ON . TO 'tiger'@'%' IDENTIFIED BY "123456";

指定从机可以通过tiger用户登录主机,对文件进行读写操作

一般不用root帐号,“%”表示所有客户端都可能连,只要帐号、密码正确。此处可用具体客户端IP代替,如10.211.55.5加强安全。

1.4、刷新权限 让上一步的授权操作生效 一定要做

FLUSH PRIVILEGES;

1.5、查看当前MySQL上有哪些用户

select user,host from mysql.user;

image-20220601172907069

1.6、查看master状态

show master status;

image-20220601172918851

File:记录成功事务的日志文件名

position:日志文件中的偏移量,用来记录还未同步内容的位置,避免重复同步已经同步过的数据

2、从MySQL配置

2.1、创建与主机中相同名称的数据库、表 db1

2.2、修改从MySQL的my.cnf文件,指定server-id,并重启从机

(docker安装的MySQL配置文件为:cd)

image-20220601172936491

2.3、登录从服务器mysql,执行以下命令配置从服务器 slaveof host port

docker exec -it mysql bash

mysql -u root -p

change master to master_host='192.168.137.129',master_port=3306,master_user='tiger',master_password='root',master_log_file='mysql-bin.000003',master_log_pos=474; 

如果此处报 should stop slave,是因为之前设置过主从结构,还在生效的状态,应该先停止此状态然后再输入以上指令

image-20220601172953341

注意语句中间不要断开,masteruser为执行同步操作的数据库账户,“992”无单引号(此处的449就是show master status中看到的position的值,这里的mysql-bin.000002就是file对应的值)。

2.4、重启从机mysql

exit退出mysql

exit退出docker

service mysqld restart

2.5、登录到从机中,输入以下指令启动从服务器复制功能

docker exec -it mysql bash

mysql -u root -p

start slave;

2.6、检查从服务器复制功能状态

show slave status \G;

image-20220602114725404

如果“Slave_IO_Running”为NO,很有可能是因为两个数据库的UUID完全一样造成的,解决方法:

  • 在从机上切换到root用户并切换当前工作路径为系统根目录

    cd /

  • 输入以下指令查找数据库UUID所在文件

    find -name auto.cnf

image-20220601173029691

  • 打开查找到的文件,修改id

image-20220601173044875

  • 重启从机

2.7、向主机中对应数据库的对应表插入一条数据,然后到从机对应表中查询看是否有相同的数据

猜你喜欢

转载自blog.csdn.net/LB_bei/article/details/132576003