MySQL主从分区和读写分离

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引擎(拥有事务,适合写入),从而提高性能。

猜你喜欢

转载自blog.csdn.net/qq_35253970/article/details/83589941