MySQL数据库集群是一个分布式系统,它为处理大量数据提供了高可用性、可扩展性和改进的性能。MyCat是一个开源的数据库中间件,可以有效地构建这样一个集群。
MyCat通过提供数据分片、负载平衡和读/写拆分等功能,简化了MySQL数据库集群的管理过程。通过将数据分布在多个节点上,MyCat实现了并行处理,增强了查询性能,并提供了容错能力。
MySQL复制,也称为主-从复制,是一个将数据从一个MySQL数据库(主数据库)自动复制到一个或多个其他MySQL数据库(从数据库)的过程。这种复制机制允许在数据库系统中实现数据冗余、提高性能和增强容错能力。
在MySQL复制中,主数据库是数据的主要来源,而从数据库则从主数据库复制数据。对主数据库所做的任何更改(如插入、更新或删除)都会自动传播到从属数据库,从而确保整个复制拓扑中的数据一致性。
1.Master数据库:Master数据库是数据的主要来源,它接收并处理来自应用程序或客户端的写入操作(数据修改)。
2.从数据库:从数据库从主数据库复制数据。他们接收并应用在主机上所做的更改,确保数据在所有复制副本中保持一致。
3.二进制日志:二进制日志是由主数据库维护的文件,以二进制格式记录所有数据修改(插入、更新、删除)。从数据库使用二进制日志来获取和应用更改。
4.复制线程:MySQL使用两个主线程进行复制:I/O线程和SQL线程。I/O线程从主线程读取二进制日志并将其发送到从线程。SQL线程从I/O线程接收复制的事件,并将它们应用于从属数据库。
实验环境:五台服务器,其中四台安装MySQL5.7,修改主机名,所有服务器都配置域名解析(如下图)。
(第一个实验只会用到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
mysql> create database master1db;
mysql> create table master1db.master1tab(id int);
mysql> insert into master1db.master1tab values(11111111);
在master2上操作:
<1> 测试rep用户是否可用:
[root@master02 ~]# mysql -h master1 -urep -p'123456'
<2> 启动服务器序号:
[root@master02 ~]# vim /etc/my.cnf
重启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
返回主服务器(master1)更新数据,在从服务器(master2)观察是否同步。
-------------------------------------------------实验一到此结束---------------------------------------------------
在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
重启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
-------------------------------------------------实验二到此结束---------------------------------------------------
设置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,试验成功!-------------------------------
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
[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行):
<4> 配置mycat后端:
备份该文件:
[root@mycat ~]# cp /usr/local/mycat/conf/schema.xml .
[root@mycat ~]# vim /usr/local/mycat/conf/schema.xml
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
[root@mycat ~]# ps aux | grep mycat
[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代理实验结束-------------------------------------------------------