MySQL读写分离—mycat
一、 MySQL读写分离的概述及简介:
1、 MySQL读写分离的概述:
MySQL作为目前世界上使用最广泛的免费数据库,但在实际的生产环境中,由单台MySQL作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面。
因此,一般都是通过主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy/Amoeba)来提升数据库的并发负载能力。
2、 读写分离的工作原理:
让主数据库处理事务性增、改、删(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。
3、 读写分离的目的:
a) 主从只负责各自的写和读,极大程度的缓解X锁和S锁的争用
b) 从库可配置myisam引擎,提升查询性能以及节约系统开销
c) 增加冗余,提高可用性
4、 实现读写分离的两种方式:
a) 应用程序ceng 实现指的是在应用程序内部及连接器中实现读写分离
优点:
i. 应用程序内部实现读写分离,安装即可使用
ii.减少一定部署难度
iii.性能最好
缺点:
iv.架构一旦调整,代码要跟着变
v.难以实现高级应用,如自动分库,分表
vi.无法适用大型应用场景
b)
中间件层实现:
优点:
i. 架构设计灵活
ii. 可以在程序上实现一些高级控制,如:透明化水平拆分,failover,监控
iii. 可以依靠些技术手段提高MySQL性能
iv. 对业务代码的影响小,同时也安全
缺点:
需要一定的开发运维团队的支持
5、 什么是MYCAT:
a) 一个彻底开源的,面向企业应用开发的大数据库集群
b) 支持事务、ACID、可以代替MySQL的加强版数据库
c) 一个可以视为MySQL集群的企业级数据库,用来代替昂贵的Oracle集群
d) 一个融合内存缓存技术、NoSQL技术、HDFS大数据库的新型SQL Server
e) 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品
二、 实验部署
实验环境:
注意:关闭各个linux的firewalld防火墙和selinux
1、 在四台主机上做hosts映射
2、 建立时间同步环境,在mycat-node上配置NTP服务,为其他三台MySQL服务其提供时间校对服务
a) 安装并配置ntp服务,以及启动NTPD服务
[root@mycat-node ~]# yum -y install ntp
[root@mycat-node ~]# vim /etc/ntp.conf
[root@mycat-node ~]# systemctl restart ntpd
[root@mycat-node ~]# systemctl enable ntpd
b) 其他三台服务器连接NTP校对同步时间
# yum -y install ntpdate
# /usr/sbin/ntpdate 192.168.30.10
c) 为三台服务器设置crontab计划任务
3、 配置主从复制:M-S-S
a) 配置cong11
mysql> create database HA;
mysql> use HA;
mysql> create table ha(id int,name varchar(10));
mysql> insert into ha values(1,'Tom1');
i. 创建主从复制的授权用户,允许slave主机连接master:
mysql>grant replication slave on *.* to'slave'@'192.168.30.%' identified by "123456";
ii. 配置cong11的my.cnf文件,并重启服务:
[root@cong11 ~]#vim /etc/my.cnf
server-id=1 // mysql唯一标识ID
log-bin=/data/mysql/log/mysql-bin-master //开启MySQL的二进制日志
binlog-do-db=HA //指定复制的数据库
sync-binlog=1 //将更新的二进制内容同步到硬盘
binlog-format=mixed //二进制记录模式为混合mixed模式
iii. 将数据库锁住,仅允许读,确保数据的一致性:
mysql> flush tables with read lock;
iv. 查看master状态信息:
mysql> show master status;
v. 导出数据库并将数据库传给从服务器:
[root@cong11 ~]#mysqldump -uroot -p123456 -B HA > ha.sql
[root@cong11 ~]#scp ha.sql root@192.168.30.12:~
[root@cong11 ~]#scp ha.sql root@192.168.30.13:~
b) 配置从服务器 cong12:
i. 导入数据库
[root@cong12 ~]#mysql -uroot -p123456 <ha.sql
ii. 配置cong12的主配置文件,并重启服务:
server-id=2
relay-log=/data/mysql/log/relay-log-bin
relay-log-index=/data/mysql/log/slave-relay-bin.index
replicate-do-db=HA
iii. 进行主从配置,并启动从功能:
mysql> change master to
master_host='192.168.30.11',master_user='slave',master_password='123456',master_log_file='mysql-bin-master.000001',master_log_pos=154;
iv. 查看从服务状态:
mysql> show slave status\G;
c) 配置从服务器 cong13
cong13服务器的配置同cong12配置相同
只有id号不同:
server-id=3
4、 配置mycat服务:
a) 上传解压mycat软件包
[root@mycat-node ~]# tar -zxvf Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz -C /usr/local/
b) 配置JDK环境:
i. 上传解压JDK软件包
[root@mycat-node ~]# tar -zxvf jdk-8u171-linux-x64.tar.gz -C /usr/local/
ii. 配置JDK环境变量(/etc/profile)
[root@mycat-node ~]# source /etc/profile #使环境变量生效
iii. 查看java环境
[root@mycat-node ~]# java -version
c) 服务启动与启动设置
配置mycat环境变量
[root@mycat-node ~]# ln -s /usr/local/mycat/bin/* /usr/local/bin/
d) 配置mycat用户账号和授权信息:server.xml:Mycat的连接信息(账号密码):
[root@mycat-node ~]# cd /usr/local/mycat/conf/
[root@mycat-node conf]# cp server.xml server.xml.bak
[root@mycat-node conf]# vim server.xml
第一个用户:mycatroot 密码:123456 数据库:HA 所有权限账号
第二个用户:mycatreadonly 密码:123456 数据库:HA 只读权限
e) 配置mycat的配置文件:schema.xml:最主要的配置项,此文件关联mysql读写分离策略、分库分表策略都是在此文件中配置的。
[root@mycat-node ~]# cd /usr/local/mycat/conf/
[root@mycat-node conf]# cp schema.xml schema.xml.bak
[root@mycat-node conf]# vim schema.xml
schema:数据库设置
dataNode:分片信息
dataHost:物理数据库
balance:负载均衡类型(“1”表示都参与select语句的负载均衡)
switchType:切换的模式(“-1”表示不自动切换)
writeType:写模式(“0”表示所有操作发送给第一个writehost)
f) 给所有MySQL主机root远程登陆权限
mysql> grant all on *.* to root@'192.168.30.%' identified by '123456';
mysql> flush privileges;
g) 启动mycat服务
[root@mycat-node ~]# mycat console //console检测语法是否错误
h) 开启mycat
[root@mycat-node ~]# mycat start
i) 检测mycat状态
[root@mycat-node ~]# netstat -antup | grep 8066
5、 连接mycat
在mycat-Node主机上安装MySQL的分支:mariadb
[root@mycat-node ~]# yum -y install mariadb
a) 使用mycatroot账号登录
[root@mycat-node ~]# mysql -umycatroot -p123456 -h 192.168.30.10 -P 8066
i. 插入数据
证明:mycatroot用户可以插入数据并切查询数据
b) 使用mycatreadonly账号登录
[root@mycat-node ~]# mysql -umycatreadonly -p123456 -P 8066 -h192.168.30.10
i. 插入数据:
证明:mycatreadonly账号仅允许查询数据不允许插入数据