一、简介
1 主从服务优势:
好处一:实现服务器负载均衡
通过服务器复制功能,可以在主服务器和从服务器之间实现负载均衡。即可以通过在主服务器和从服务器之间切分处理客户查询的负荷,从而得到更好的客户相应时间。通常情况下,数据库管理员会有两种思路。
好处二:通过复制实现数据的异地备份
可以定期的将数据从主服务器上复制到从服务器上,这无疑是先了数据的异地备份。在传统的备份体制下,是将数据备份在本地。此时备份 作业与数据库服务器运行在同一台设备上,当备份作业运行时就会影响到服务器的正常运行。有时候会明显的降低服务器的性能。同时,将备份数据存放在本地,也 不是很安全。如硬盘因为电压等原因被损坏或者服务器被失窃,此时由于备份文件仍然存放在硬盘上,数据库管理员无法使用备份文件来恢复数据。这显然会给企业 带来比较大的损失。
好处三:提高数据库系统的可用性
数据库复制功能实现了主服务器与从服务器之间数据的同步,增加了数据库系统的可用性。当主服务器出现问题时,数据库管理员可以马上让从服务器作为主服务器,用来数据的更新与查询服务。然后回过头来再仔细的检查主服务器的问题。
二、数据库配置步骤
1、配置主数据库
找到mysql安装目录,找到my.ini,添加
================================================
#Master Config
server-id=1 //指定服务器ID,必须和从服务器ID不同,唯一,主数据库一般为1
log-bin=mysql-bin //指定日志文件
binlog-do-db=xianhua //指定需要同步的数据库
================================================
2、安装从mysql,并配置从数据库
(1)将免安装版(绿色版)mysql解压
(2)一般在解压后的文件夹中有my-default.ini文件,没有my.ini文件
(3)新建一个my.ini文件,内容可如下
==========================================
[mysqld]
basedir ="C:/安装目录/mysql-5.6.15-64"
datadir = "C:/安装目录/mysql-5.6.15-64/data"
port =3307
server_id =2//指定服务器ID,必须和主服务器ID不同,唯一,
log-bin=mysql-bin //指定日志文件
binlog-do-db=amusement//同步数据库
character_set_server = utf8
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[client]
# 设置mysql客户端的字符集
default-character-set=utf8
======================================
至少包含basedir,datadir这两个基本的配置,其他可以没有
(4)配置mysql服务
执行开始-》运行-》cmd
在mysql的bin目录下运行以下命令
mysqld --install MySQLSlave --defaults-file=D:/mysql-5.6.13-win32\my.ini
完成后,即已安装了mysq服务
(5)从数据库账号为:root,没有密码
3、实现数据库主从同步
(1)在主数据库建立从服务器可以连接的账号,赋予从数据库权限
(2)重新启动主数据库服务,启动从数据库服务
(3)打开主数据库的图形化界面
执行命令:show master status
记录File以及Position的值;
(4)打开从数据库的图形化界面
执行命令:
change master to
master_host=‘主数据库端口号‘,master_user=‘账号‘,master_password=‘密码‘,
master_log_file=‘aaa‘,master_log_pos=bb;
-- 其中xx是在主服务器中创建的一个账户,aaa是刚才记录的File的值,bbb是刚才记录的Position的值。
stop slave; -- 停止服务
start slave; -- 开启服务
show slave status;
两个都为yes说明配置成功
三、项目应用
1、ssh框架(hibernate模板工具类)
(1)spring-datasource.xml(主库作为写库,从库作为读库)
<bean id="dataSource-read"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property
name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3307/同步数据库?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value></value>
</property>
</bean>
<bean
id="dataSource-write"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3306/同步数据库?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull</value>
</property>
<property name="username">
<value>账号</value>
</property>
<property name="password">
<value>密码</value>
</property>
</bean>
(2)spring-config.xml
<!-- 2 将读数据源 交给 sessionfactory
-->
<bean
id="sessionFactory-read"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
>
<property name="dataSource" ref="dataSource-read"></property>
<property name="hibernateProperties">
<props>
<prop
key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop
key="hibernate.show_sql">true</prop>
<prop
key="hibernate.format_sql">true</prop>
</props>
</property>
<!-- 扫描hibernate 实体类 pojo 相当于 hibernate.cfg.xml 配置的映射文件 -->
<property name="packagesToScan"
value="org.lt.pojo"></property>
</bean>
<!-- 2 将写数据源 交给 sessionfactory
-->
<bean
id="sessionFactory-write"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
>
<property
name="dataSource"
ref="dataSource-write"></property>
<property
name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop
key="hibernate.show_sql">true</prop>
<prop
key="hibernate.format_sql">true</prop>
</props>
</property>
<!-- 扫描hibernate 实体类
pojo 相当于 hibernate.cfg.xml 配置的映射文件 -->
<property
name="packagesToScan"
value="org.lt.pojo"></property>
</bean>
<!-- 将 sessionfactory 交给
模板工具类
模板工具类 直接在dao 层 使用 -->
<bean id="hibernateTemplate-write"
class="org.springframework.orm.hibernate3.HibernateTemplate">
<property
name="sessionFactory"
ref="sessionFactory-write"></property>
</bean>
<bean id="hibernateTemplate-read"
class="org.springframework.orm.hibernate3.HibernateTemplate">
<property
name="sessionFactory"
ref="sessionFactory-read"></property>
</bean>
<!-- 3 将 sessionfactory 交给 事物去管理 -->
<bean
id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property
name="sessionFactory" ref="sessionFactory-write" />
</bean>
<!-- 4 指定如何管理事物 指定用注解的方式管理事物-->
<!-- 使用注解控制事物 -->
<!-- 和上面的 bean
id="transactionManager" 对应 -->
<tx:annotation-driven
transaction-manager="transactionManager" />
(3)DataSourceTemplate.java
package org.lt.utils;
import javax.annotation.Resource;
import
org.springframework.orm.hibernate3.HibernateTemplate;
import
org.springframework.stereotype.Component;
@Component
public class DataSourceTemplate {
@Resource(name="hibernateTemplate-write")
private
HibernateTemplate hibernateTemplateWrite;
@Resource(name="hibernateTemplate-read")
private
HibernateTemplate hibernateTemplateRead;
public
HibernateTemplate getHibernateTemplateWrite() {
return hibernateTemplateWrite;
}
public
HibernateTemplate getHibernateTemplateRead() {
return hibernateTemplateRead;
}
}
(4)使用实例
public void
saveOrUpdateAllEntity(Collection<T> coll) { getHibernateTemplateWrite().saveOrUpdateAll(coll);
}
public T findEntityById(T entity,
Integer id) {
return
(T) getHibernateTemplateRead().get(entity.getClass(), id);
}