MySQL主从分区、读写分离、负载均衡
一个MySQL的服务器的承载连接的数量是有限的,当超出最大连接数之后,MySQL服务器就会出现异常或者宕机。 再者,服务器也可能会坏掉(比如硬盘坏了),这时数据会丢失,所以我们需要考虑数据库的主从分区。
一般大型网站都是读多写少,实现读写分离是一个不错的解决方案。比如MyIsam引擎就适合读。
一、主从复制(分区)
至少需要两台MySQL服务器,一台主(写)服务器(Master),一台从(读)服务器(Slave)。写在主服务器上的数据会自动同步到从服务器上。
例如:Linux作为主服务器、Windows作为从服务器。
1.1、在主服务器上创建一个能远程访问的账户
从服务器同步主服务器的数据,需要登录主服务器。因此,需要一个能远程访问的账户用来做主从负责的工作。
GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO root@'%' IDENTIFIED BY '123456';
1.2、在Linux上的MySQL中配置Master
a、在/etc/文件夹下,进入my.cnf文件,
b、在配置文件[mysqld]加入如下值:
[mysqld]
server-id=1 //服务器ID
log-bin=mysql-bin //开启日志记录
binlog-do-db=db1 //要同步的第一个数据库库名
binlog-do-db=db2 //要同步的第二个数据库库名
1.3、重启Master服务器
service mysql restart;
重启完成之后,测试是否配置成功,执行如下命令:
mysql> SHOW MASTER STATUS
1.4、在Windows上的MySQL配置Slave从服务器
修改MySQL安装目录下的my.ini文件,添加:
server-id= 131
1.5、重启Slave
进入计算机管理中的“服务”,选择mysql服务,右键关闭和开启
1.6、slave连接到Master
在从服务器中设置:
change master to master_host='主服务器ip',master_user='root',master_password='123456';
然后查看是否连通:SHOW SLAVE STATUS
如果Slave_IO_Running, 和Slave_SQL_Running是No表明slave还没有开始复制过程。
1.7、开始主从复制
start slave
之后可以再看结果:SHOW SLAVE STATUS.
如果结果不是两个yes,执行SHOW SLAVE STATUS命令后,在表中有一个log字段描述了错误原因;
二、数据库的负载均衡
一主两从:
找三台服务器,分别安装mysql。并且用户名和密码需要相同,关闭电脑防火墙。
一台作为主服务器;
两台作为从服务器(即A和B两台电脑)。
B电脑需要访问A电脑虚拟机上面的mysql:
a、怎么远程访问虚拟机:
打开虚拟机的网络编辑器—选择WMnet8—选择nat配置—
b、主从服务器上的数据库必须名称相同,都叫db_1803.
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
stream {
server {
listen 33061;
proxy_pass mysql;
}
upstream mysql {
server 192.168.52.29:3306 weight=1;
server 192.168.52.41:3306 weight=1;
}
}
注意:tomcat的负载均衡与mysql的负载均衡不能使用同一个nginx。
三、读写分离
一般项目中的写操作使用率远低于查询操作。所以查询操作可能需要比写操作更多的请求连接数。再者,实现事务隔离级别的原理使用的锁机制,以及数据库中随处可见的读写锁可能导致死锁,读写分离可以避免死锁问题。
2.1、实现代码:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
<context:component-scan base-package="com.qianfeng.dao"/>
<!--配置-读-数据源-->
<bean id="readDataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/db_1704"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<!--配置-写-数据源-->
<bean id="writeDataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://192.168.72.188:8066/db_1704"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<!--负责读的MyBatis-->
<bean id="readSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="readDataSource"/>
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
</bean>
<!--负责写的MyBatis-->
<bean id="writeSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="readDataSource"/>
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
</bean>
</beans>
三、总结
1、一个master可以有多个slave:
2、实现了负载均衡,将压力分散到多台服务器之上,提高了数据库服务器的承载压力,增加了项目数据库的连接数。
3、确保数据库产品的稳定性,实现数据库的双机热备功能(备份)。
4、可以实现从库配置myisam引擎(适合查询),主库配置InnoDB引擎(拥有事务,适合写入),从而提高性能。