快捷查看指令 ctrl+f 进行搜索会直接定位到需要的知识点和命令讲解(如有不正确的地方欢迎各位小伙伴在评论区提意见,博主会及时修改
mycat快速搭建
在主从数据库集群架构中,让主库负责处理写入操作,而从库只负责处理select查询,让两者分工明确达到提高数据库整体读写性能。当然,主数据库另外一个功能就是负责将数据变更同步到从库中,也就是写操作
优点
- 分摊服务器压力,提高机器的系统处理效率。
- 在写入不变,大大分摊了读取,提高了系统性能。另外,当读取被分摊后,又间接提高了写入的性能。所以,总体性能提高了。
- 增加冗余,提高服务可用性,当一台数据库服务器宕机后可以调整另外一台从库以最快速度恢复服务。
MyCAT 是使用 JAVA 语言进行编写开发,使用前需要先安装 JAVA 运行环境(JRE),由于 MyCAT 中使用了 JDK7 中的一些特性,所以要求必须在 JDK7 以上的版本上运行。
mycat部署
- 准备一台虚拟机
- 安装java环境
下列代码执行完成之后:JDK就被安装在了/usr/java/jdk1.80_xxx
目录下。
[root@localhost tmp]# cd /tmp
[root@localhost tmp]# rpm -ivh jdk-8u251-linux-x64.rpm
警告:jdk-8u251-linux-x64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID ec551f03: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:jdk1.8-2000:1.8.0_251-fcs ################################# [100%]Unpacking JAR files...
tools.jar...
plugin.jar...
javaws.jar...
deploy.jar...
rt.jar...
jsse.jar...
charsets.jar...
localedata.jar...
- 配制环境变量
[root@localhost java]# vi /etc/profile
在profile中尾部追加一下3行配置
export JAVA_HOME=/usr/java/default
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.
//刷新环境变量
[root@localhost java]# source /etc/profile
注意:如果刷新环境变量时,有异常信息,大多是配置环境变量的关键字有错
- 解压缩mycat.tar.gz
[root@localhost opt]# tar zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /opt/
- 配置环境变量
[root@localhost opt]# vi /etc/profile
export MYCAT_HOME=/opt/mycat
export PATH=$PATH:$JAVA_HOME/bin:$MYCAT_HOME/bin
//刷新环境变量
[root@localhost java]# source /etc/profile
- 修改mycat配置文件
6.1 server.xml
# 进入mycat/conf目录中
[root@mycat conf]# vim server.xml
...
<!--下面的用户和密码是应用程序连接到 MyCat其中的schemas 配置项所对应的值是逻辑数据库的名字,可以自由定义,但需要和后面 schema.xml 文件中配置的一致。-->
<user name="root" defaultAccount="true">
<property name="password">root</property>
<property name="schemas">mycatdb</property>
</user>
<!--下面是另一个用户,并且设置的访问 TESTED 逻辑数据库的权限是 只读。可以注释掉
<user name="user">
<property name="password">user</property>
<property name="schemas">mycatdb</property>
<property name="readOnly">true</property>
</user>
-->
</mycat:server>
defaultAccount:当前使用版本支持可以添加,不支持报错误可以删掉
6.2 schema.xml
逻辑库和分表设置
<schema name="mycatdb" // 逻辑库名称,与server.xml的一致
checkSQLschema="false" // 不检查sql
sqlMaxLimit="100" // 最大连接数
dataNode="dn1"> // 数据节点名称
<!--这里定义的是分表的信息-->
</schema>
数据节点
<dataNode name="dn1" // 此数据节点的名称
dataHost="localhost1" // 主机组虚拟的
database="testdb" /> // 真实的数据库名称
主机组
<dataHost name="localhost1" // 主机组
maxCon="1000" minCon="10" // 连接
balance="0" // 负载均衡
writeType="0" // 写模式配置
dbType="mysql" dbDriver="native" // 数据库配置
switchType="1" slaveThreshold="100">
<!--这里可以配置关于这个主机组的成员信息,和针对这些主机的健康检查语句-->
</dataHost>
balance 属性
负载均衡类型,目前的取值有 3 种:
- balance=“0”, 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
- balance=“1”, 全部的 readHost 与 writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。
- balance=“2”, 所有读操作都随机的在 writeHost、readhost 上分发。
- balance=“3”, 所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力, #注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。
writeType 属性
负载均衡类型
- writeType=“0”, 所有写操作发送到配置的第一个 writeHost,第一个挂了切换到还生存的第二个writeHost,重新启动后已切换后的为准.
- writeType=“1”,所有写操作都随机的发送到配置的 writeHost,#版本1.5 以后废弃不推荐。
健康检查
<heartbeat>select user()</heartbeat> #对后端数据进行检测,执行一个sql语句,user()内部函数
读写配置
<writeHost host="hostM1" url="192.168.246.135:3306" user="mycat" password="111111">
<!-- can have multi read hosts -->
<readHost host="hostS2" url="192.168.246.136:3306" user="mycat" password="111111" />
</writeHost>
配置范例
[root@mycat conf]# vim schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="mycatdb" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<dataNode name="dn1" dataHost="localhost1" database="back" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="192.168.240.134" url="192.168.240.134:3306" user="mycat" password="123456">
<!-- can have multi read hosts -->
<readHost host="192.168.240.135" url="192.168.240.135:3306" user="mycat" password="123456" />
<readHost host="192.168.240.136" url="192.168.240.136:3306" user="mycat" password="123456" />
</writeHost>
</dataHost>
</mycat:schema>
- 创建用户
在上述schema.xml中配置了主库从库的登录用户,若库中没有该用户,需要创建
mysql> grant all on back.* to mycat@'%' identified by '123456';
- 启动mycat
[root@localhost conf]# mycat start
Starting Mycat-server...
- 登录mycat测试
VIP设置(浮动IP)
在计算机网络架构中,VIP(Virtual IP)是指一个虚拟的IP地址,可以分配给多个不同的物理主机,使得它们看起来像是一个单独的主机。这种技术在一定程度上提高了网络的可靠性和可用性,因为当一个物理主机出现故障时,其他主机可以接管它的 VIP,并继续提供服务
添加VIP
- 查看网卡信息
[root@localhost conf]# yum install -y net-tools httpd-tools
[root@localhost conf]# ifconfig
- 添加VIP
[root@localhost conf]# ifconfig ens33:1 192.168.240.200
- 再次查看
- 关闭VIP
[root@localhost conf]# ifconfig ens33:1 down
MyCat+MHA+VIP实现自动切换主库vip
配置
- MHA所在主机创建脚本,配置完成之后给与可执行权限
[root@localhost conf]# vi /usr/local/bin/master_ip_failover
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
use Getopt::Long;
my (
$command, $ssh_user, $orig_master_host, $orig_master_ip,
$orig_master_port, $new_master_host, $new_master_ip, $new_master_port
);
my $vip = '192.168.240.200/24'; #此处改为你希望的主库vip
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip"; # 网卡信息要与你的集群相同
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
GetOptions(
'command=s' => \$command,
'ssh_user=s' => \$ssh_user,
'orig_master_host=s' => \$orig_master_host,
'orig_master_ip=s' => \$orig_master_ip,
'orig_master_port=i' => \$orig_master_port,
'new_master_host=s' => \$new_master_host,
'new_master_ip=s' => \$new_master_ip,
'new_master_port=i' => \$new_master_port,
);
exit &main();
sub main {
print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";
if ( $command eq "stop" || $command eq "stopssh" ) {
my $exit_code = 1;
eval {
print "Disabling the VIP on old master: $orig_master_host \n";
&stop_vip();
$exit_code = 0;
};
if ($@) {
warn "Got Error: $@\n";
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "start" ) {
my $exit_code = 10;
eval {
print "Enabling the VIP - $vip on the new master - $new_master_host \n";
&start_vip();
$exit_code = 0;
};
if ($@) {
warn $@;
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "status" ) {
print "Checking the Status of the script.. OK \n";
exit 0;
}
else {
&usage();
exit 1;
}
}
sub start_vip() {
`ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
sub stop_vip() {
return 0 unless ($ssh_user);
`ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}
sub usage {
print
"Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";
}
- MHA配置文件添加读取vip迁移脚本
[root@localhost conf]# vi /var/log/mha/app1.cnf
[server default]
manager_log=/var/log/mha/log/manager.log
manager_workdir=/var/log/mha/app.log
master_binlog_dir=/opt/liuyh/log/mylog
master_ip_failover_script=/usr/local/bin/master_ip_failover # 添加脚本信息
password=111111
ping_interval=2
repl_password=111111
repl_user=testslave
ssh_user=root
user=mha
[server1]
hostname=192.168.157.111
port=3306
[server3]
hostname=192.168.157.113
port=3306
[server2]
hostname=192.168.157.112
port=3306
- 测试mha主从复制情况
[root@localhost conf]# masterha_check_repl --conf=/var/log/mha/app1.cnf
- 将mycat中schema.xml配置文件的主库信息改为vip
- 开启前手动为主库设置vip
- 开启mycat和MHA,测试主从切换