MySQL主從分割槽和讀寫分離
阿新 • • 發佈:2018-11-06
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引擎(擁有事務,適合寫入),從而提高效能。