网站优化性能升级需求,要将两个Mysql配置成主从关系实现读写分离,现在一台开发服务器上安装两个MySQL和实现主从关系,将安装配置过程记录一下,系统环境是Windows,使用的MySQL版本是mysql-5.7.17-winx64源码版。
MySQL的安装
1:首先将MySQL的压缩包解压到合适的目录,拷贝文件my-default.ini改名为my.ini,打开my.ini编译以下基本内容:
#设置数据库默认字符集
character_set_server=utf8
#打开log-bin功能
log-bin=mysql-bin
#MySQL目录
basedir = D:\mysql-5.7.17-winx64-Read
#Mysql数据目录
datadir = D:\mysql-5.7.17-ReadData
#MySQL运行端口
port = 3307
#可指定任意值但需确保不同的数据库唯一值
server_id = 11
其他性能配置略。
2:接着打开命令行工具切换到MySQL的bin目录下执行数据库初始化
mysqld --initialize-insecure --user=mysql;
默认情况下MySQL5.7初始化时会自动生成一个随机的登陆密码,添加--initialize-insecure 属性指定则指定已非安全的方式初始化数据库,在登陆数据库之后再修改数据库密码。
执行完命令之后正常情况下Mysql的数据目录将新建出数据库的基本文件。
3:接下来安装数据库到系统服务
mysqld -install "MySQL5.7 Read" --defaults-file=D:\mysql-5.7.17-winx64-Read\my.ini
Mysql5.7 Read 指定服务名称
--defaults-file 指定默认配置文件
4:启动登陆Mysql服务器
通过Windows系统服务管理页面来启动MySQL,通过命令行登陆MySQL
mysql -P3307 -uroot -p
-P指定端口,默认是3306
由于初始化数据库时指定了--initialize-insecure 属性所以登陆无需密码。
修改MySQL密码
切换到mysql数据库设置数据库的登陆密码。
set password = password('admin');
刷新权限
flush privileges;
退出后用新密码重新登陆数据库。
这样一台数据库就安装成功了,假如启动失败出现错误提示,通过查看MySQL数据目录下的.err文件查看日志,确定问题原因。
按照同样的方式安装另一个数据库,由于当前是在同一台服务器上安装两个MySQL,需要注意在新安装的Mysql的my.ini文件中指定不同port 和server_id。
在开发过程中我们经常需要远程登陆MySQL查看数据:
创建远程链接账号
GRANT ALL PRIVILEGES ON *.* TO remote@"%" IDENTIFIED BY "remote@12345";
刷新权限
flush privileges;
参考:
http://www.cnblogs.com/c3gen/p/6168765.html
--------------------------------------------------------------------------------------分割线-------------------------------------------------------------------------------------------------------------------------
主从配置
主数据库
登陆主数据库之后执行:
授权给从数据库服务器
GRANT REPLICATION SLAVE ON *.* to 'rep1'@'127.0.0.1' identified by 'rep1@12345';
查询主数据库状态
show master status;
+------------------+----------+--------------+------------------+---------------
----+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_
Set |
+------------------+----------+--------------+------------------+---------------
----+
| mysql-bin.000001 | 154 | | |
|
+------------------+----------+--------------+------------------+---------------
----+
记录下 FILE 及 Position 的值,在后面进行从服务器操作的时候需要用到。
如果没有显示主数据库状态,是因为没有配置log-bin
从数据库
登陆从数据库之后执行:
执行同步SQL语句
change master to master_host='127.0.0.1',master_user='rep1',master_password='rep1@12345',master_port=3308,master_log_file='mysql-bin.000001',master_log_pos=154;
正确执行后启动Slave同步进程
start slave;
主从同步检查
show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 127.0.0.1
Master_User: rep1
Master_Port: 3308
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 154
Relay_Log_File: USER-20140819IT-relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
其中Slave_IO_Running 与 Slave_SQL_Running 的值都必须为YES,才表明状态正常
参考:
http://blog.csdn.net/gavid0124/article/details/51692450
http://yw666.blog.51cto.com/11977292/1870808
http://studys.blog.51cto.com/9736817/1604034
--------------------------------------------------------------------------------------分割线-------------------------------------------------------------------------------------------------------------------------
Mybatis + Spring 实现动态读写分离
数据库主从关系配置好之后就需要在程序中实现读写分离,主库写数据,从库读数据,来提高性能数据库的读写性能。
在Spring的配置文件中配置:
<bean id="readDataSource" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${read.jdbc.url}"/>
<property name="username" value="${read.jdbc.username}"/>
<property name="password" value="${read.jdbc.password}"/>
<!-- 配置初始化大小、最小、最大 -->
<property name="initialSize" value="${druid.pool.size.init}"/>
<property name="minIdle" value="${druid.pool.size.min}"/>
<property name="maxActive" value="${druid.pool.size.max}"/>
<!-- 配置监控统计拦截的filters,wall用于防止sql注入,stat用于统计分析 -->
<property name="filters" value="wall,stat"/>
</bean>
<bean id="writeDataSource" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${write.jdbc.url}"/>
<property name="username" value="${write.jdbc.username}"/>
<property name="password" value="${write.jdbc.password}"/>
<!-- 配置初始化大小、最小、最大 -->
<property name="initialSize" value="${druid.pool.size.init}"/>
<property name="minIdle" value="${druid.pool.size.min}"/>
<property name="maxActive" value="${druid.pool.size.max}"/>
<!-- 配置监控统计拦截的filters,wall用于防止sql注入,stat用于统计分析 -->
<property name="filters" value="wall,stat"/>
</bean>
<bean id="dynamicDataSource" class="com.distributed.system.common.datasource.DynamicDataSource">
<property name="readDataSource" ref="readDataSource"/>
<property name="writeDataSource" ref="writeDataSource"/>
</bean>
<!--3、配置SqlSessionFactory对象-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--注入数据库连接池-->
<property name="dataSource" ref="dynamicDataSource"/>
<!--配置mybatis全局配置文件:mybatis-config.xml-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<!--扫描entity包,使用别名,多个用;隔开-->
<property name="typeAliasesPackage" value="com.distributed.system.api.xinquan.all.entity"/>
<!--扫描sql配置文件:mapper需要的xml文件-->
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
</bean>
<!--配置事务管理器(mybatis采用的是JDBC的事务管理器)-->
<bean id="transactionManager" class="com.distributed.system.common.datasource.DynamicDataSourceTransactionManager">
<property name="dataSource" ref="dynamicDataSource"></property>
</bean>
mybatis-config.xml文件中配置
<!-- 配置读写分离动态切换-->
<plugins>
<plugin interceptor="com.distributed.system.common.datasource.DynamicPlugin"></plugin>
</plugins>
DynamicDataSourceTransactionManager,DynamicDataSource,DynamicPlugin 类的实现查看参考链接。
参考:
http://www.jianshu.com/p/2222257f96d3