基于MyCat构建MySQL数据库集群

一、前言

       MySQL数据库集群是一个分布式系统,它为处理大量数据提供了高可用性、可扩展性和改进的性能。MyCat是一个开源的数据库中间件,可以有效地构建这样一个集群。
       MyCat通过提供数据分片、负载平衡和读/写拆分等功能,简化了MySQL数据库集群的管理过程。通过将数据分布在多个节点上,MyCat实现了并行处理,增强了查询性能,并提供了容错能力。

二、MySQL-Replication

        MySQL复制,也称为主-从复制,是一个将数据从一个MySQL数据库(主数据库)自动复制到一个或多个其他MySQL数据库(从数据库)的过程。这种复制机制允许在数据库系统中实现数据冗余、提高性能和增强容错能力。

       在MySQL复制中,主数据库是数据的主要来源,而从数据库则从主数据库复制数据。对主数据库所做的任何更改(如插入、更新或删除)都会自动传播到从属数据库,从而确保整个复制拓扑中的数据一致性。

基于MyCat构建MySQL数据库集群_第1张图片

       1.Master数据库:Master数据库是数据的主要来源,它接收并处理来自应用程序或客户端的写入操作(数据修改)。

       2.从数据库:从数据库从主数据库复制数据。他们接收并应用在主机上所做的更改,确保数据在所有复制副本中保持一致。

       3.二进制日志:二进制日志是由主数据库维护的文件,以二进制格式记录所有数据修改(插入、更新、删除)。从数据库使用二进制日志来获取和应用更改。

       4.复制线程:MySQL使用两个主线程进行复制:I/O线程和SQL线程。I/O线程从主线程读取二进制日志并将其发送到从线程。SQL线程从I/O线程接收复制的事件,并将它们应用于从属数据库。

 三、实战案例

         实验环境:五台服务器,其中四台安装MySQL5.7,修改主机名,所有服务器都配置域名解析(如下图)。

基于MyCat构建MySQL数据库集群_第2张图片
vim /etc/hosts

基于MyCat构建MySQL数据库集群_第3张图片

1.一主一从(M-S)(1)

(第一个实验只会用到master1、master2)

实验步骤:

在master1上操作:

<1>开启MySQL的二进制日志,进入MySQL的配置文件:/etc/my.cnf

[root@master01 ~]# vim /etc/my.cnf

在文件末尾添加:

 log_bin

server-id=1

重启MySQL服务:[root@master01 ~]# systemctl restart mysqld

<2>创建复制用户:

[root@master01 ~]# mysql -uroot -p123456

mysql > grant replication slave, replication client on *.* to 'rep'@'192.168.188.%' identified by '123456';

<3>备份master1数据:

[root@master01 ~]# mysqldump -p'123456' --all-databases --single-transaction --master-data=2 --flush-logs > `date +%F`-mysql-all.sql

<4> 将备份的sql文件发送给master2:

[root@master01 ~]# scp -r 2023-08-17-mysql-all.sql master2:/tmp

<5> 观察二进制日志分割点:

[root@master01 ~]# vim 2023-08-17-mysql-all.sql

基于MyCat构建MySQL数据库集群_第4张图片
<6> 准备数据验证主从同步:

mysql> create database master1db;

mysql> create table master1db.master1tab(id int);

mysql> insert into master1db.master1tab values(11111111);

基于MyCat构建MySQL数据库集群_第5张图片

在master2上操作: 

<1> 测试rep用户是否可用:

[root@master02 ~]# mysql -h master1 -urep -p'123456'

<2> 启动服务器序号:

[root@master02 ~]# vim /etc/my.cnf

基于MyCat构建MySQL数据库集群_第6张图片

 重启MySQL服务:[root@master02 ~]# systemctl restart mysqld

<3> 手动同步数据:

mysql> set sql_log_bin=0;

mysql> source /tmp/2023-08-17-mysql-all.sql

<4> 设置主服务器:

mysql>  change master to
    -> master_host='master1',
    -> master_user='rep',
    -> master_password='123456',
    -> master_log_file='master01-bin.000002',
    -> master_log_pos=154;
<5> 启动从设备:

mysql> slave start;

<6> 查看启动状态:

mysql> show slave status\G

基于MyCat构建MySQL数据库集群_第7张图片

 返回主服务器(master1)更新数据,在从服务器(master2)观察是否同步。

基于MyCat构建MySQL数据库集群_第8张图片

-------------------------------------------------实验一到此结束---------------------------------------------------

2.一主一从(M-S)(2)

在master2上操作:

重置master2数据库:

[root@master02 ~]# systemctl stop mysqld
[root@master02 ~]# rm -rf /var/lib/mysql/*
[root@master02 ~]# systemctl start mysqld
[root@master02 ~]# grep password /var/log/mysqld.log

 [root@master02 ~]# mysqladmin -uroot -p'zRIUdUFwp2.n' password '123456'

在master1上操作:

<1> 启动二进制日志,服务器ID,GTID :

[root@master01 ~]# vim /etc/my.cnf

基于MyCat构建MySQL数据库集群_第9张图片

重启MySQL服务:[root@master01 ~]# systemctl restart mysqld

<2>  授权复制用户rep(略):

        在实验一中对rep用户已经授权。

<3> 备份数据:

[root@master01 ~]# mysqldump -p'123456' --all-databases --single-transaction --master-data=2 --flush-logs > `date +%F-%H`-mysql-all.sql

[root@master01 ~]# scp -r 2023-08-18-07-mysql-all.sql master2:/tmp
<4> 模拟数据变化:

mysql> insert into master1db.master1tab values(33333333);

 在master2上操作:

<1> 测试rep用户是否可用:

[root@master02 ~]# mysql -h master1 -urep -p'123456'

<2> 启动二进制日志,服务器ID,GTID:

[root@master01 ~]# vim /etc/my.cnf

在文件末尾添加三行:

log_bin
gtid_mode=ON
enforce_gtid_consistency=1

重启MySQL服务:[root@master01 ~]# systemctl restart mysqld

<3> 还恢复手动同步数据:

mysql> set sql_log_bin=0;

mysql> source /tmp/2023-08-18-07-mysql-all.sql

mysql> select * from master1db.master1tab;

<4> 设置主服务器:

mysql> change master to
master_host='master1',
master_user='rep',
master_password='123456',
master_auto_position=1;

<5> 启动从设备:

mysql> slave start;

<6> 查看启动状态:

mysql> show slave status\G

基于MyCat构建MySQL数据库集群_第10张图片

-------------------------------------------------实验二到此结束---------------------------------------------------

 3. 双主双从(MM-SS)

设置master2为master1的主服务器:

 在master2上操作:

在master2上进行授权:

mysql> grant replication slave, replication  client on *.* to 'rep'@'192.168.188.%'  identiified by 'QianFeng@123';

mysql> flush privileges;

在master1上操作:

<1> 设置master2为master1的主服务器:

mysql> change master to
master_host='master2',
master_user='rep',
master_password='123456',
master_auto_position=1;

mysql> slave start;

mysql> show slave status\G

<2> 同步现有数据:

[root@master01 ~]# mysqldump -p'123456' --all-databases --single-transaction --master-data=2  --flush-logs > `date +%F`-mysql-all.sql

[root@master01 ~]# scp -r 2023-08-18-mysql-all.sql slave2:/tmp

[root@master01 ~]# scp -r 2023-08-18-mysql-all.sql slave2:/tmp

 分别在slave1、slave2上操作:

[root@slave01 ~]# mysql -p'123456' < /tmp/2023-08-18-mysql-all.sql

[root@slave02 ~]# mysql -p'123456' < /tmp/2023-08-18-mysql-all.sql

[root@slave01 ~]#vim /etc/my.cnf
server-id=3
gtid_mode=ON
enforce_gtid_consistency=1
master-info-repository=TABLE
relay-log-info-repository=TABLE

[root@slave02 ~]#vim /etc/my.cnf
server-id=4
gtid_mode=ON
enforce_gtid_consistency=1
master-info-repository=TABLE
relay-log-info-repository=TABLE

[root@slave01 ~]# systemctl restart mysqld

[root@slave02 ~]# systemctl restart mysqld

在slave1、slave2上都要执行:

mysql> change master to
master_host='master1',
master_user='rep',
master_password='123456',
master_auto_position=1 for channel 'master1'; 

mysql> change master to
master_host='master2',
master_user='rep',
master_password='123456',
master_auto_position=1 for channel 'master2'; 

mysql> slave start;

mysql> show slave status\G

---------------------------------检查I/O线程和SQL线程都为Yes,试验成功!-------------------------------

4.mycat 代理

        MyCat是一个强大的数据库中间件,不仅仅可以用作读写分离、以及分表分库、容灾备份,而且可以用于多租户应用开发、云平台基础设施、让你的架构具备很强的适应性和灵活性,借助于即将发布的MyCat只能优化模块,系统的数据访问瓶颈和热点一目了然,根据这些统计分析数据,你可以自动或手工调整后端存储,将不同的表映射到不同存储引擎上,而整个应用的代码一行也不用改变。

在mycat上操作:

<1> 配置java环境

上传jdk的压缩包到mycat服务器并解压缩:

[root@mycat ~]# tar xf jdk-8u91-linux-x64.tar.gz -C /usr/local/

[root@mycat ~]# ln -s /usr/local/jdk1.8.0_91/ /usr/local/java

[root@mycat ~]# vim /etc/profile

基于MyCat构建MySQL数据库集群_第11张图片

 [root@mycat ~]# source /etc/profile

[root@mycat ~]# java -version
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)

<2> 配置MyCat:

上传mycat的压缩包到mycat服务器并解压缩:

[root@mycat ~]# tar xf  Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/

[root@mycat ~]# ls /usr/local/mycat/

<3> 配置mycat前端:

[root@mycat ~]# vim  /usr/local/mycat/conf/server.xml

 注释掉多余用户(95-99行):

基于MyCat构建MySQL数据库集群_第12张图片

 修改82行设为自己的数据库名:

 <4> 配置mycat后端:

备份该文件:

[root@mycat ~]# cp /usr/local/mycat/conf/schema.xml .

[root@mycat ~]#  vim  /usr/local/mycat/conf/schema.xml
基于MyCat构建MySQL数据库集群_第13张图片

schema name:mycat维护的集群名称。
datanode:后方节点群的名称。
datahost:后方节点群的主机名称。
writehost:写主机
readhost:读主机 

属性介绍:

  • balance 类型

    • 1. balance=“0”, 关闭读写分离功能。 所有读操作都发送到当前可用的writeHost上。

    • 2. balance=“1”,开启读写分离 所有读操作都随机的发送到readHost。

  • writeType 属性

    • 备份型

      • 1. writeType="0", 所有写操作发送到配置的第一个 writeHost, 第一个挂了切到还生存的第二个writeHost, 重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties 。

    • 负载型

      • 2. writeType="1",所有写操作都随机的发送到配置的 writeHost。

  • switchType 模式

    • switchType指的是切换的模式,目前的取值也有4种:

    • 1. switchType='-1' 负1表示不自动切换。

    • 2. switchType='1' 默认值,表示根据延时自动切换。

    • 3. switchType='2' 根据MySQL主从同步的状态决定是否切换,心跳语句为 select user()。

 在master1上授权:

mysql> grant all on *.* to 'mycatproxy'@'192.168.188.55' identified by '123456';

启动mycat:

[root@mycat ~]# /usr/local/mycat/bin/mycat start

[root@mycat ~]# netstat  -anpt | grep java

基于MyCat构建MySQL数据库集群_第14张图片

[root@mycat ~]# ps aux | grep mycat

基于MyCat构建MySQL数据库集群_第15张图片

[root@mycat ~]# yum install -y mariadb 

[root@mycat ~]# mysql -hmycat -uroot -p123456 -P8066

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.29-mycat-1.6-RELEASE-20161028204710 MyCat Server (OpenCloundDB)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> show databases;
+----------+
| DATABASE |
+----------+
| max      |
+----------+
1 row in set (0.00 sec)

 在master1上创库,创表:

mysql> create database  max;
Query OK, 1 row affected (0.00 sec)

mysql> create table max.t1 (id int);
Query OK, 0 rows affected (0.02 sec)

在mycat插入数据:

MySQL [(none)]> insert into max.t1 values(3);
Query OK, 1 row affected (0.09 sec)

在master1上查看:

mysql> select * from max.t1;
+------+
| id   |
+------+
|    3 |
+------+
1 row in set (0.00 sec)

----------------------------------------mycat代理实验结束-------------------------------------------------------

你可能感兴趣的:(数据库,mysql)