我们为什么要实现mysql的读写分离呢?
随着还联网的高速发展,上网的人越来也多,人们的查询和存储的数据也越来越多,查询和写入大量的集中在一台服务器上,使得单体数据库服务器无法承受。所以人们想到了,讲读取数据和写入数据分开操作,这样就可以大大的减轻主库的压力。
因此,一般来说都是通过主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-
Proxy/Amoeba)来提升数据库的并发负载能力 这样的方案来进行部署与实施的
我们在上一节通过主从复制实现了多台mysql的数据共享,这一节我们将通过mycat实现读写分离。
读写分离的原理
读写分离的优势
面对越来越大的访问压力,单台的服务器的性能成为瓶颈,需要分担负载
A:应用程序内部实现读写分离,安装既可以使用
B:减少一定部署难度
C:性能很好
缺点:
A:架构一旦调整,代码要跟着变
B:难以实现高级应用,如自动分库,分表
C:无法适用大型应用场景
优点:
A:架构设计更灵活
B:可以在程序上实现一些高级控制,如:透明化水平拆分,failover,监控
C:可以依靠些技术手段提高mysql性能,
D:对业务代码的影响小,同时也安全
缺点:
需要一定的开发运维团队的支持
一主两从
主机名 | IP | 系统版本 | 角色 |
---|---|---|---|
mycat | 192.168.116.101 | CentOS 7 | Mycat/NTP |
mysqlmaster | 192.168.116.20 | CentOS 7 | Master |
mysqlslave1 | 192.168.116.3 | CentOS 7 | Slave |
mysqlslave2 | 192.168.116.2 | CentOS 7 | Slave |
在Mycat上配置NTP服务,为其他三台mysql服务器提供时间服务
配置好本地yum源
安装NTP
[root@mycat ~]# yum -y install ntp
配置NTP
[root@mycat ~]# vim /etc/ntp.conf
添加如下两行
server 127.127.1.0
fudge 127.127.1.0 stratum 8
启动NTP服务
[root@mycat ~]# systemctl enable ntpd //设置为开机自启
[root@mycat ~]# systemctl start ntpd //开启ntp服务
在其它三台服务器上连接NTP校对同步时间
分别在其他三台服务器上输入以下两条命令
# yum -y install ntpdate
# /usr/sbin/ntpdate 192.168.116.101 //这里是NTP服务器的ip地址
1)主服务mysqlmaster的配置:
创建实验数据库并插入数据
mysql> create database HA;
mysql> use HA;
mysql> create table T1(id int,name varchar(20));
mysql> insert into T1 values(1,'Tom1');
创建主从复制授权用户,允许slave连接主机
mysql> grant replication slave on *.* to 'slave'@'192.168.116.%' identified by "123";
mysql> flush privileges; //刷新权限
配置my.cnf
[root@mysqlmaster~ ]# vim/etc/my.cnf
添加以下内容
[mysqld]
………… //省略部分内容
server-id=1
log-bin=/data/mysql/log/mysql-bin-master
binlog-do-db=HA
sync-binlog=1
binlog-format=mixed
重启mysql
[root@mysqlmaster~ ]# /etc/init.d/mysqld restart
查看master状态信息:
mysql> show master status; #显示主服务器的当前binlog文件及事件位置
导出数据库
复制前要保证同步的数据库一致
[root@mysqlmaster ~]# mysqldump -uroot -p123 HA >HA.sql
将导出的数据库传给从服务器
[root@mysqlmaster ~]# scp HA.sql [email protected]:~
[root@mysqlmaster1 ~]# scp HA.sql [email protected]:~
2)从服务器配置
1、mysqlslave1 配置
导入数据库,和主数据库服务器保持一致
[root@mysqlslave1 ~]# mysql -uroot -p123 -e 'create database HA;'
[root@mysqlslave1 ~]# mysql -uroot -p123 HA
[root@mysqlslave2 ~]# mysql -uroot -p123 -e 'create database HA;'
[root@mysqlslave2 ~]# mysql -uroot -p123 HA < HA.sql
从服务器mysqlslave1修改配置文件
[root@mysqlslave1 ~]# vim /etc/my.cnf
添加如下内容
[mysqld]
………… //省略部分内容
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
重启Mysql服务
[root@mysqlslave1 ~]# /etc/init.d/mysqld restart
进入从数据库进行授权
mysql>change master to master_host='192.168.116.20',
master_user='slave',master_password='123',
master_log_file='mysql-bin-master.000001',master_log_pos=154;
查看状态
mysql> start slave;
mysql> show slave status\G;
2、mysqlslave2
配置参考mysqlsalve1
注意:在mysqlslave2配置文件中 server-id 不能与其他数据库相同 之前已将讲过
MyCAT有提供编译好的安装包,支持windows、Linux、Mac、Solaris等系统上安装与运行。
官方下载主页http://www.mycat.io
上传mycat、jdk软件包到mycat服务器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mua3lF30-1644028922172)(C:\Users\77259\AppData\Roaming\Typora\typora-user-images\1629282309108.png)]
解压安装包
[root@mycat ~]# tar -zxvf Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz -C /usr/local/
进入解压的mycat查看目录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9C3Eztj0-1644028922173)(C:\Users\77259\AppData\Roaming\Typora\typora-user-images\1629282442541.png)]
目录解释
,mycat是java开发的。
解压jdk
[root@mycat ~]# tar -zxvf jdk-8u171-linux-x64.tar.gz -C /usr/local/
配置JDK环境变量
[root@mycat-node ~]# vim /etc/profile
在文件最后加入以下内容
JAVA_HOME=/usr/local/jdk1.8.0_171
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
export PATH JAVA_HOME CLASSPATH
使环境变量生效
[root@mycat ~]# source /etc/profile
查看java环境
[root@mycat ~]# java -version
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u0CKqxNR-1644028922173)(C:\Users\77259\AppData\Roaming\Typora\typora-user-images\1629282889633.png)]
配置mycat环境变量
[root@mycat ~]# ln -s /usr/local/mycat/bin/* /usr/local/bin/
配置mycat用户账号和授权信息
[root@mycat conf]# cd /usr/local/mycat/conf/
[root@mycat conf]# cp server.xml server.xml.bak //将源文件备份一份,安全
[root@mycat ~]# vim server.xml
server.xml文件其实跟读写分离策略关系不大,但是需要用此文件来配置连接MyCat的用户及权限等。
#name:连接mycat的账号
<user name="mycatroot" defaultAccount="true">
<property name="password">123456</property> #连接mycat的密码
<property name="schemas">HA</property>
#这里的HA指的是mycat的逻辑数据库名称,可以自定义。这个在schema.xml中会配置,
#要与之保持一致
<!-- 表级 DML 权限设置 -->
<!--
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
#设置只读账号
<user name="mycatreadonly">
<property name="password">123456</property>
<property name="schemas">HA</property>
<property name="readOnly">true</property>
</user>
这里的 HA 只的是逻辑数据库名
并不是真正的数据库
mycat会在 schema.xml中配置关于逻辑数据库对应的真实数据库,并同时实现读写分离
修改schema.xml配置文件
[root@mycat ~]# cd /usr/local/mycat/conf/
[root@mycat conf]# cp schema.xml schema.xml.bak
[root@mycat ~] # vim schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="HA" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<dataNode name="dn1" dataHost="dh1" database="HA" />
<dataHost name="dh1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="mysqlmaster" url="192.168.116.20:3306" user="root" password="123" />
<writeHost host="mysqlsalve1" url="192.168.116.3:3306" user="root" password="123" />
<writeHost host="mysqlsalve2" url="192.168.116.2:3306" user="root" password="123" />
</dataHost>
</mycat:schema>
截图如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MnobUF8u-1644028922174)(C:\Users\77259\AppData\Roaming\Typora\typora-user-images\1629283799975.png)]
注意:格式不要有错误否则会初始化异常,无法启动
参数说明
schema:
一个schema标签对代表一个逻辑库
其中:
Name:逻辑数据库名,与server.xml中的schema对应
sqlMaxLimit: select 时默认的limit,避免查询全表
dataNode=‘dn1’ 分库的时候用到,不分也可以。
dataNode:
name:指定逻辑数据节点名称,与schema中的dataNode一致。
dataHost:对应< dataHost >的name
database:真正要使用的数据库名称。
dataHost:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YfIUv8bs-1644028922174)(C:\Users\77259\AppData\Roaming\Typora\typora-user-images\1629284198468.png)]
balance:指的负载均衡类型,目前的取值有4种
balance=“0”, 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。
balance=“1”,全部的readHost与stand by writeHost(备主)参与select语句的负载均衡,
balance=“2”,所有读操作都随机的在writeHost、readhost上分发。
balance=“3”,所有读请求随机的分发到wiriterHost对应的readhost执行, writerHost不负担读压力
switchType:指的是切换的模式,目前的取值也有4种
switchType=’-1’ 表示不自动切换
switchType=‘1’ 默认值,表示自动切换
switchType=‘2’ 基于MySQL主从同步的状态决定是否切换,心跳语句为show slave status
switchType=‘3’ 基于MySQL galary cluster的切换机制(适合集群)(1.4.1),心跳语句为 show
status like ‘wsrep%’
writeType:表示写模式
writeType=“0”,所有的操作发送到配置的第一个writehost
writeType=“1”,随机发送到配置的所有writehost
writeType=“2”,不执行写操作
其他参数说明:
maxCon:指定物理主机服务最大支持1000个连接;
minCon:指定物理主机服务最小保持10个连接;
heartbeat:这个标签内指明用于和后端数据库进行心跳检查的语句
这里的schema.xml的配置还有之中方式
<writeHost host="hostM1" url="192.168.30.11:3306" password="123456" user="root">
<readHost host="hostS2" url="192.168.30.12:3306" password="123456" user="root"/>
<readHost host="hostS3" url="192.168.30.13:3306" password="123456" user="root"/>
</writeHost>
这样的话当writeHost对用的服务器宕机的话 它下面的readHost主机也不能使用了
给所有的mysql服务器授权root,因为在使用mycat连接数数据库时使用的是root用户
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U7DMSvTw-1644028922175)(C:\Users\77259\AppData\Roaming\Typora\typora-user-images\1629285043662.png)]
进每个Mysql服务器中进行以下操作
mysql> grant all on *.* to root@'192.168.116.%' identified by '123';
mysql>flush privileges;
启动mycat
[root@mycat ~]# mycat console
# 如果失败那一定是配置文件的错误。
# 可能是格式错误,或者信息配置错误
检测端口8806
[root@mycat ~]# netstat -antup | grep 8066
使用一个有数据库的客户端进行登录测试
使用mycatroot账号登录
此账户可以进行增删改查
[root@client ~]# mysql -u mycatroot -p123456 -h 192.168.116.10 -P 8066
mysql> show databases;
使用mycatreadonly账户登录
此账户只可以进行查看的操作
[root@client ~]# mysql -u mycatreadonly -p123456 -h 192.168.116.10 -P 8066
使用不同账户登录,自己进行以下select delete update操作就明白了
将主库或从库停止然后通过客户端进行登录在进行select delete update操作 检测
是格式错误,或者信息配置错误
检测端口8806
```bash
[root@mycat ~]# netstat -antup | grep 8066
使用一个有数据库的客户端进行登录测试
使用mycatroot账号登录
此账户可以进行增删改查
[root@client ~]# mysql -u mycatroot -p123456 -h 192.168.116.10 -P 8066
mysql> show databases;
使用mycatreadonly账户登录
此账户只可以进行查看的操作
[root@client ~]# mysql -u mycatreadonly -p123456 -h 192.168.116.10 -P 8066
使用不同账户登录,自己进行以下select delete update操作就明白了
将主库或从库停止然后通过客户端进行登录在进行select delete update操作 检测