1. 程式人生 > >MySQL主從分割槽和讀寫分離

MySQL主從分割槽和讀寫分離

MySQL主從分割槽、讀寫分離、負載均衡

	一個MySQL的伺服器的承載連線的數量是有限的,當超出最大連線數之後,MySQL伺服器就會出現異常或者宕機。 再者,伺服器也可能會壞掉(比如硬碟壞了),這時資料會丟失,所以我們需要考慮資料庫的主從分割槽。
	一般大型網站都是讀多寫少,實現讀寫分離是一個不錯的解決方案。比如MyIsam引擎就適合讀。

一、主從複製(分割槽)

至少需要兩臺MySQL伺服器,一臺主(寫)伺服器(Master),一臺從(讀)伺服器(Slave)。寫在主伺服器上的資料會自動同步到從伺服器上。
例如:Linux作為主伺服器、Windows作為從伺服器。

1.1、在主伺服器上建立一個能遠端訪問的賬戶

從伺服器同步主伺服器的資料,需要登入主伺服器。因此,需要一個能遠端訪問的賬戶用來做主從負責的工作。

GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO [email protected]'%' 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引擎(擁有事務,適合寫入),從而提高效能。