一、集群技术
1、集群概述
mysql复制技术
① 集群目的
负载均衡 解决高并发
高可用HA 服务可用性
远程灾备 数据有效性
② 类型
m、m-s、m-s-s...、m-m-s-s、m-m
③ 原理图示
概念:
1、在主库上把数据更改(DDL DML DCL)记录到二进制日志(Binary Log)中。
2、备库I/O线程将主库上的日志复制到自己的中继日志(Relay Log)中。
3.、备库SQL线程读取中继日志中的事件,将其重放到备库数据库之上。
2、集群案例
环境
全新服务器-相互通信
全新安装mysql57-逐一安装
配置域名解析
ps:需要重新安装多台数据库,不能克隆已经安装的数据库,因为数据库 ID相同。
一主一从(m-s)
① 主(master1)
部署一台新的mysql服务器。准备好域名解析。
准备数据1(验证主从同步使用)master1:
create database master1db;
create table master1db.master1tab(name char(50));
insert into master1db.master1tab values (1111);
insert into master1db.master1tab values (2222);
开启二进制日志
vim /etc/my.cnf //master1中
[mysqld] //在[mysqld]下写
log_bin
server-id=1
systemctl restart mysqld //重启生效
创建复制用户
grant replication slave,replication client on *.* to 'rep'@'10.8.162.%' identified by 'weinihao123'
备份master数据库的数据(对master1进行操作)
mysqldump -p'weinihao123' --all-databases --single-transaction --master-data=2 --flush-logs > `date +%F`-mysql-all.sql //以日期为文件的开头
scp -r 2020-9-3-mysql-all.sql master2:/tmp //发送给另一台主机
CHANGE MASTER TO MASTER_LOG_FILE='localhost-bin.000002', MASTER_LOG_POS=154;//观察二进制的日志分割
准备数据2 (验证主从同步使用)
master1:
insert into master1db.master1tab values (33333333);
insert into master1db.master1tab values (44444);
② 从(master2)
测试rep用户是否可用
master2
mysql -h master1 -urep -p'weinihao123' //预防账户问题
启动服务器序号
[root@localhost ~]# vim /etc/my.cnf
server-id=2 //设置服务器id,不能和刚刚的主库一样
[root@localhost ~]# systemctl restart mysqld
mysql -uroot -p'weinihao123'
//测试服务器是否修改正确。能否正常登陆。
手动同步数据
mysql> set sql_log_bin=0; //暂时关闭二进制日志,只在当前登录下有效
mysql> source /tmp/2020-9-3-mysql-all.sql
设置主服务器
mysql> change master to
master_host='master1',
master_user='rep',
master_password='weinihao123',
master_log_file='localhost-bin.000002',
master_log_pos=154;
//注意,二进制日志的位置,应该参照主服务器备份时生成的新位置。
启动从设备
start slave;
查看启动状态(IO-YES/SQL-YES)
show slave status\G;
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: master1
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: localhost-bin.000003
Read_Master_Log_Pos: 154
Relay_Log_File: localhost-relay-bin.000003
Relay_Log_Pos: 375
Relay_Master_Log_File: localhost-bin.000003
Slave_IO_Running: Yes //yes才是正常的
Slave_SQL_Running: Yes //yes才是正常的
返回主服务器(master1)更新数据,在从服务器(master2)观察是否同步。
一主一从(m-s自动)
这个实验与上一个实验需求基本相同。master1 作为主mysql,master2 作为从mysql。
不同之处,在主从库的配置文件中都使用了
“gtid_mode=ON
enforce_gtid_consistency=1”
该属性自动记录position位置。不需要手动指定了。
主:启动二进制日志,服务器id,gtid
vim /etc/my.cnf
log_bin
server-id=1
gtid_mode=ON
enforce_gtid_consistency=1
剩下操作与上一个实验相同。
从:启动二进制日志,服务器id,gtid
vim /etc/my.cnf
log_bin
server-id=2
gtid_mode=ON
enforce_gtid_consistency=1
剩下操作与上一个实验相同。
二、代理技术
1、代理简介
DB Proxy,数据库中间件
功能:
读写分离 M-S-S M-M-S-S
负载均衡 Galera Cluster
支持数据的分片自动路由与聚合
产品:
MySQL Proxy MySQL官方
Atlas 奇虎360
DBProxy 美团点评
Amoeba 早期阿里巴巴
cober 阿里巴巴
MyCat 阿里巴巴
图示:
2、MYCAT实战
架构:
准备好域名解析
准备好mycat和双主双从的环境
MyCat
10.18.43.163 mycat
M-M-S-S
10.18.43.41 master1
10.18.43.170 master2
192.168.0.116 slave1
192.168.0.117 slave2
① 配置Java环境
下载jdk图示
tar xf jdk-8u91-linux-x64.tar.gz -C /usr/local/
//解压java软件开发工具包
ln -s /usr/local/jdk1.8.0_91/ /usr/local/java
tail -3 /etc/profile
JAVA_HOME=/usr/local/java
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME PATH
//添加三行
//设置JAVA变量,便于JAVA调用
source /etc/profile
env |grep JAVA
java -version
//查询到版本。说明jdk安装成功
② 配置mycat
下载mycat
wget http://dl.mycat.org.cn/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
tar xf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
ls /usr/local/mycat/
配置mycat前端
vim /usr/local/mycat/conf/server.xml
注释掉多余用户
启动mycat管理员
配置mycat后端
配置之前先备份下该文件,防止不小心改错
vim /usr/local/mycat/conf/schema.xml
注释:
schema name:mycat维护的集群名称。
datanode:后方节点群的名称。
datahost:后方节点群的主机名称。
writehost:写主机
readhost:读主机
倒着看。
在本例中switchType值设置为1,表示自动切换,某些对主从数据一致要求较高的场景,建议使用2判断主从状态后再切换
切换的触发条件为主节点mysql服务崩溃或停止
slaveThreshold 主从的延迟在多少秒以内,则把读请求分发到这个从节点,否则不往这个节点分发,假设生产环境能容忍的主从延时为60秒,则设置此值为60,此例中设置值为100
③ 配置mysql群
//M-M-S-S 准备Mycat连接的用户及权限
//例如master1
grant all on *.* to 'mycatproxy'@'192.168.0.118' identified by 'weinihao123';
//192.168.0.118是mycat服务器的IP
④ 启动mycat
在mycat服务器上
/usr/local/mycat/bin/mycat start
//Starting Mycat-server...
//启动成功,否则就是配置Mycat后端语法错误。
netstat -anpt | grep java //监测端口是否启动
ps aux | grep mycat //进程是否启动
yum install -y mariadb
//安装客户端
mysql -h -uroot -p123456 -P8066
show databases;
MySQL [(none)]> show databases;
+----------+
| DATABASE |
+----------+
| tianyun |
+----------+
1 row in set (0.01 sec)
//看到的数据库是虚拟的。
//注意后方mysql群中应该创建该库
//在mysql-master1上创库创表
create database tianyun;
create table tianyun.t1 (id int);
⑤ Mycat使用后方数据库
//在mycat上
select * from tianyun.t1;
insert into tianyun.t1 values(3);
// 在mysql集群能查询到数据。实验完成。