增加机器可以这样做,写入 *** 作唯一一台mysql,其他N台对这台mysql主从同步,这样就能把查询的 *** 作分摊到N台mysql上。
切换的其中一种做法:
1、原mysql为A,新mysql为B
2、A主,B从,B只查
3、代码里面写host指向A
4、A、B同步完成后开始切换
5、A、B配一样的权限
6、把代码指向A的host改为指向B
7、这就可以把A关了,现在都在读写B
完全不依靠xml文件,怎么配置m依赖包的引入。创建好maven项目之后,打开maven项目下的pomxml文件,在配置文件中增加对mybatis包和mysql驱动包的依赖。在dependencies中增加对这两个包的配置即可自动将这两个包添加到项目中。
mybatis数据库配置。对于mybatis框架来说,首先需要配置的就是数据库的数据源配置以及采用何种开发模式的配置,对于mavne项目来说这些资源信息都需要配置在src/main/resources下面,对于普通的java项目则只需要配置在src下即可。ybatis 说是动态切换数据库,还是什么
MySQL在互联网应用中已经遍地开花,但是在银行系统中,还在生根发芽的阶段。本文记录的是根据某生产系统实际需求,对数据库高可用方案从需求、各高可用技术特点对比、实施、测试等过程进行整理,完善Mysql高可用方案,同时为后续开展分布式数据库相关测试做相应准备。
存储复制技术: 传统IOE架构下,常用高可用方案,靠存储底层复制技术实现数据的一致性,优点数据安全性有保障,限制在于是依赖存储硬件,实施成本较高。
keepalived+双主复制: 两台MySQL互为主从关系,即双主模式,通过Keepalived配置虚拟IP,实现当其中的一台数据库故障时,自动切换VIP到另外一台MySQL数据库,备机快速接管业务来保证数据库的高可用。
MHA: MHA部署在每台mysql服务器上,定时探测集群中的master节点,当master出现故障时,它可以自动将最新的slave提升为新的master,然后将所有其他的slave重新指向新的master,优点在最大程度保证数据的一致性的前提下实现快速切换,最少需要3台服务器,存在数据丢失的可能性。
PXC: Percona eXtra Cluster是Percona基于galera cluster封装的集群方案。不同于普通多主复制,PXC保障强一致性和实时同步,故障切换更快。但是也需要3个节点,配置相对复杂,对性能也稍有影响。
除了上述方案外,还有MMM、Heartbeat+DRBD等高可用方案,此处不做详细介绍。
综合评估下,本次实施采用了 keepalived+mysql双主实现数据库同城双机房的高可用。MySQL版本为: 5721。 *** 作系统:Red Hat Enterprise Linux Server 73。
配置过程如下:
Mysql-master1: IP地址1 --以下简称master1
Mysql-master2: IP地址2 --以下简称master2
Mysql-vip : VIP地址 --应用连接使用
Mysql复制相关概念描述:
1、 Mysql主从复制图示:
2、 Mysql主从复制过程描述:
(1)master记录二进制日志:在每个事务更新数据完成之前,master在二进制日志记录这些改变。MySQL将事务写入二进制日志。在事务写入二进制日志完成后,master通知存储引擎提交事务。
(2)slave将master的binarylog拷贝到自己的中继日志:首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事务,如果已经同步了master,它会睡眠并等待master产生新的事件。I/O线程将这些事务写入中继日志。
(3)SQL slave thread处理该过程的最后一步:SQL线程从中继日志读取事务,并重放其中的事务而更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
主主同步就是两台机器互为主的关系,在任何一台机器上写入都会同步至备端。
为了便于后续数据库服务器的扩展,且在整个复制环境中能够自动地切换,降低运维成本,引入了当前主流的基于Mysql GTID的复制特性,工作原理及优缺点简介如下。
3、 GTID工作原理简介:
(1) master更新数据时,会在事务前产生GTID,一同记录到Binlog日志中。
(2) slave的I/O线程将变更的binlog写入到本地的relay log中。
(3) slave的sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录。
(4) 如果有记录说明该GTID的事务已经执行,slave会忽略。
(5) 如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。
(6) 在解析的过程中会判断是否有主键,如果有就用索引,如果没有就用全部扫描。
4、 GTID优点:
(1) 一个事务对应一个唯一的ID,一个GTID在一个服务器上 只会执行一次。(2) GTID是用来替代传统复制的方法,GTID复制与普通复制模式的最大不同就是不需要指定二进制文件名和位置。
(3) 减少手工干预和降低服务故障时间,当主机宕机之后会通过软件从众多的备机中提升一台备机为新的master。
5、 GTID也存在一些限制:
(1) 不支持非事务引擎。
(2) 不支持create table … select 语句复制(主库直接报错)。
(3) 不允许一个sql同时更新一个事务引擎表和非事务引擎表。
(4) 在一个复制组中,必须要求统一开启GTID或者是统一关闭GTID。
(5) 开启GTID需要重启(57版本除外)。
(6) 开启GTID后,就不再使用原理的传统复制方式。
(7) 不支持create temporary table 和 drop temporary table语句。
(8) 不支持sql_slave_skip_counter。
前置条件:
主备两个节点使用行内统一的安装部署脚本安装mysql5721介质(略)
Master1端创建应用的数据库(略)
1、 修改MySQL配置文件
参考相关配置规范,分别设置master1、master2的mycnf文件,
其中server-id参数设置为不同值;
由于后续keepalived会挂起VIP,应用通过VIP连接数据库,为了避免应用程序无法通过VIP访问,需将两个节点的bind-address参数注释掉;
2、 设置master1端自动半同步模式
Mysql的同步模式主要有如下3种:
a 主从同步复制:数据完整性好,但是性能消耗略高;
b 主从异步复制:性能消耗低,但容易出现不一致;
c 主从半自动复制:介于上述两种之间,既保持了数据的完整性,又提高了性能;
基于上述特性,建议采用半自动同步模式,由于后续要配置为双主模式,因此任一节点其角色既为master又为slave,因此相关的master/slave插件要同时配置,过程如下。
(1) 首先查看库是否支持动态加载(默认都支持)
(2) 主从库上分别安装插件
作为主库,安装插件semisync_masterso
作为从库,安装插件semisync_slaveso
(3) 安装完成后,从plugin表中能够看到刚刚安装的插件
(4) 分别打开主从库半同步复制
同时添加到各自的mycnf中,在后续数据库实例重启时自动加载该配置。
此时查看状态还没有启动
(5) 两个节点分别启动IO进程
(6) 查看半同步状态
3、 将master1设为master2的主服务器
(1)在master1主机上创建授权账户,允许在master2主机上连接
(2)将主库master1数据导出
(3)将mastersql传输到master2上并导入
(4)在master2端将master1设置为自己的主库,并开启slave功能
在master2上查看slave状态
至此master1到master2的主从复制关系已经建立完成。
4、 将master2设为master1的主服务器
在master1上执行
在master1上查看slave状态
1、keepalived相关概念说明:
keepalived是集群管理中保证集群高可用的一个软件解决方案,其功能类似于heartbeat,用来防止单点故障
keepalived是以VRRP协议为实现基础的,VRRP全称VirtualRouter Redundancy Protocol,即虚拟路由冗余协议。
虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip,master会发组播(组播地址为2240018),当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master,这样的话就可以保证路由器的高可用了。
keepalived主要有三个模块,分别是core 、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责 健康 检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。同时为了避免出现脑裂,应关闭防火墙或者开启防火墙但允许接收VRRP协议。
2、keepalived的安装配置
(1)配置本地yum源,在master1和master2两台服务器上安装keepalived的相关依赖包Kernel-devel/openssl-devel/popt-devl等
配置指向rhel-75iso的yum本地源,步骤略
注意:如不知道keepalived需要哪些依赖包,可到下载后的源码解压目录下查看INSTALL 文件内容,安装需要的依赖包,源码安装任何一个软件都要养成查看源码包文档的习惯,比如INSTALL,README,doc等文档,可以获得很多有用的信息。
(2)在两台mysql上解压缩并编译安装keepalived
(3)master1、master2上分别配置keepalivedconf
注意上图红色字体中两个节点配置相同处及差异。
说明:keepalived只有一个配置文件keepalivedconf,里面主要包括以下几个配置区域:
· global_defs:主要是配置故障发生时的通知对象以及机器标识。
· vrrp_instance:用来定义对外提供服务的VIP区域及其相关属性。
· virtual_server:虚拟服务器定义
(4)同时两个节点上都需要添加检测脚本
作用:是当mysql停止工作时自动关闭本机的keeplived服务,从而实现将故障主机踢出热备组,因每台机器上keepalived只添加了本机为realserver,所以当mysqld正常启动后,我们还需要手动启动keepalived服务。
(5)分别启动两个节点的keepalived服务
检查两个节点keepalived启动进程
检查两个节点的vip挂载情况
(6)主备机故障切换测试
停止master2的mysql服务,看keepalived 健康 检查程序是否会触发脚本,自动进行故障切换,步骤略
查看master1节点的VIP挂载情况,验证是否实现了自动切换,步骤略
说明在master2服务器的mysql服务发生故障时,触发了脚本,自动完成了切换。
(7)现在我们把master2的mysql服务开起来,并且keepalived的服务也需要启动。
即便master2的mysql服务和keepalived服务都重新开启了,master1仍然是主master了,master2未对主master的权利进行抢夺,说明设置的nopreempt参数生效了,为了保证群集的稳定性,生产环境不允许抢占配置,只有当master1的mysql服务坏掉的时候,master2才会再次成为主master,否则它永远只能当master1的备份。(注:nopreempt一般是在优先级高的mysql上设置)
Sysbench是一个模块化的、跨平台、多线程基准测试工具,可用于评估数据库负载情况,通过sysbench命令配置IP地址、端口号、用户名、密码连接到指定的数据库db1中,创建多个表,并快速插入指定条数的记录,观察主备库同步效率
(1) 下载开源工具sysbench-041214targz,放置在相应目录下并解压
(2) 使用iso配置本地yum源并安装Sysbench如下的依赖包(步骤略):autoconf/automake/cdbs/debhelper(>=9)/docbook-xml/docbook-xsl/libmysqlclient15-dev/libtool/xsltproc
(3) 编译sysbench
编辑配置文件/etc/ldsoconf中添加mysql lib目录/mysql/app/5721/lib,并执行命令ldconfig生效
(4) 执行sysbench压测
使用sysbench工具向主节点的db1数据库中创建5张表,并且每张表分别插入10万条记录
同时观察备机同步效率
几个重要的参数说明:
B、半自动同步模式、异步模式切换测试
(1) 检查主备同步状态,及同步参数设置
rpl_semi_sync_master_enabled参数表示启用半同步模式;
rpl_semi_sync_master_timeout参数单位为毫秒,表示主库事务等待从库返回commit成功信息超过10秒就降为异步模式,不再等待从库,等探测到从库io线程恢复后,再返回为半自动同步;
rpl_semi_sync_master_wait_no_slave参数表示事务提交后需要等待从库返回确认信息;
(2) 将slave的io线程停止
(3) 使用sysbench向master写入少量的数据,本例创建一张表,并插入10条记录,命令包装在1sh测试脚本中
通过记录的时间戳发现,master在等待了slave10秒无响应,自动切换为异步模式,将数据写入本地。
(4) Slave启动io线程,数据自动追平
至此MySQL主主复制配置完成,运行在半自动同步模式,通过keepalived实现Mysql的HA高可用。
上线后应符合统一的标准监控策略,添加备份协议对数据进行周期备份并保存到带库中,以及定期的数据恢复测试。
由于是靠keepalived实现的高可用,还应将如下资源添加到监控管理平台:
1、 对每台数据库主机的3个keepalived进程进行监控;
2、 对主备节点的io线程、sql线程工作状态进行监控;
是不同的表还是不同的数据库?
如果是不同的表,那就可以根据用户的类型来选择不同的表进行查询就可以了
如果是不同的数据库的话,那就不好办了,你们的系统是集成框架,则必定配有连接池,这样的话切换起来就比较麻烦,除非查询一次链接一次数据库,这是效率最低的,不推荐,我的思路想法是搭建两个或者两个以上的WEB服务,每个服务对应一个数据库,这样的话根据用户的请求类型提交的不同的WEB服务站上。这样还有一个好处,就是如果数据库不相同或者表结构不相同的话,处理起来也是很方便的。至于架设多个WEB服务的话,如果在一台服务器上的话,设置不同的端口就行了;还有一个可能需要考虑的问题,那就是SESSION共享的问题,这个在分布式系统中经常用到的,网上有很多资料,你也可以查一查
在使用jdbc将mysql中的数据查询出来更新到sqlserve数据库时,怎么自动转换类型
JDBC *** 作MySQL数据库的步骤
1、准备MySQL数据库驱动包:mysql-connector-java-508-binjar,一个项目中只能存在一个版本的驱动包
a、复制该驱动包,粘贴到项目中
b、选中项目里的驱动包,右键->Build Path->Add to Build Path
2、在类里写代码加载驱:决定连接哪种数据库
a、ClassforName("commysqljdbcDriver");
b、必须进行异常处理:ClassNotFoundException
3、连接数据库
a、Connection con=DriverManagergetConnection("连接字符串", "用户名", "密码");
b、连接字符串格式固定,不同数据库,格式不同:jdbc:mysql://要连接的计算机名称:端口号/要连接的数据库名称
c、必须进行异常处理:SQLException
4、拼写要执行的sql语句,必须是可以在数据库中执行的
5、创建执行sql语句的对象
a、Statement stmt=concreateStatement();
b、注意:Statement必须来自于javasql包中
6、执行sql语句
a、执行insert、update和delete语句:int row=stmtexecuteUpdate(sql);返回影响行数
b、执行查询语句:ResultSet rs=stmtexecuteQuery(sql);返回查询结果
c、执行任意sql语句(DDL、DCL、DML和DQL等)
7、对执行结果进行处理
a、执行更新语句:判断影响行数是否为0,0表示失败,非0表示成功
b、对查询结果进行处理:
1) 结果集需要先移动、后取值 :rsnext();int id=rsgetInt(1);
String name=rsgetString("loginName");
2) 结果集有多条时,需要循环 *** 作:
while(rsnext()){ Systemoutprintln(rsgetInt(1)+"\t"+rsgetString(2)+"\t"+rsgetString(3)+"\t"+rsgetString(4)+"\t"+rsgetInt(5));
}
3) 不确定是否有查询结果时:if(rsnext()){说明有查询结果}else{没有查询结果}
4) 使用了聚合函数,一定有查询结果,查询结果是一行一列:
rsnext();
int result=rsgetInt(1);
注意:结果集取值时取出的时查询语句中包含的字段,与表中字段无关
9、关闭相关对象(先关闭结果集对象、在关闭执行语句对象,最后关闭连接对象)
例如:执行查询语句
Scanner input=new Scanner(Systemin);
Systemoutprint("请输入登录名: ");
String name=inputnext();
Systemoutprint("请输入密码: ");
String pass=inputnext();
try {
ClassforName("commysqljdbcDriver");
Connection con=DriverManagergetConnection("jdbc:mysql://localhost:3306/userdb", "root", "root");
String sql="select COUNT() from UserInfo where loginName='"+name+"' and loginPass='"+pass+"'";
Statement stmt=concreateStatement();
ResultSet rs=stmtexecuteQuery(sql);
rsnext();
int result=rsgetInt(1);
if(result!=0){
Systemoutprintln("登录成功!");
}else{
Systemoutprintln("用户名或密码错误,请重新登录!");
}
rsclose();
stmtclose();
conclose();
} catch (ClassNotFoundException e) {
Systemoutprintln("加载驱动错误:"+egetMessage());
} catch (SQLException e) {
Systemoutprintln("数据库 *** 作错误:"+egetMessage());
}
执行添加、修改和删除语句
try {
//加载驱动
ClassforName("commysqljdbcDriver");
//连接数据库
Connection con=DriverManagergetConnection("jdbc:mysql://localhost:3306/userdb", "root", "root");
//拼写要执行的sql语句
String sql="update UserInfo set loginPass='111' where loginName='a'";
//String sql="insert UserInfo values(default,'test','test')";
//String sql="delete from UserInfo where loginName='a'";
//创建执行语句对象
Statement stmt=concreateStatement();
//执行
int row=stmtexecuteUpdate(sql);
//处理结果
if(row==0){
Systemoutprintln("修改失败!");
}else{
Systemoutprintln("修改成功!");
}
//关闭
stmtclose();
conclose();
} catch (ClassNotFoundException e) {
Systemoutprintln("驱动加载错误:"+egetMessage());
} catch (SQLException e) {
Systemoutprintln("数据库 *** 作错误:"+egetMessage());
}
云端数据库是指被优化或部署到一个虚拟计算环境中的数据库,可以实现按需付费、按需扩展、高可用性以及存储整合等优势。根据数据库类型一般分为关系型数据库和非关系型数据库(NoSQL数据库)。云端数据库的特性有:实例创建快速、支持只读实例、读写分离、故障自动切换、数据备份、Binlog备份、SQL审计、访问白名单、监控与消息通知等。
不需要改动。hql是独立于数据库的,hibernate切换数据库以后,除了jdbc的一些如地址、用户名、密码要换以外。
Hibernate支持不同的数据库主要是用方言也就是dialect的,对应就是hibernatecfgxml配置文件里的一个设置,比如 SQL Server的就是:
<property name="hibernatedialect" value="orghibernatedialectSQLServerDialect"/>这里的orghibernatedialectSQLServerDialect是hibernate带的或你自己提供的一个数据库数据类型映射的一个Java类,由它处理不同数据库的区别。
但是如果不同的数据库之间差别太大的话,即直接要写不同的SQL语句的话,Hibernate的dialect也处理不了。
以上就是关于怎么给 mysql 增加从机器或是切换数据库全部的内容,包括:怎么给 mysql 增加从机器或是切换数据库、完全不依靠xml文件,怎么配置mybatis 说是动态切换数据库,还是什么……、基于MySQL双主的高可用解决方案理论及实践等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)