面對日益增長的系統訪問量,數據庫的吞吐量面臨着巨大瓶頸。 對於同一時間有大量併發讀操做和較少寫操做類型的應用系統來講,將單一的數據庫拆分爲主庫和從庫,主庫負責處理事務性的增刪改操做,從庫負責處理查詢操做,可以有效的避免由數據更新致使的行鎖,使得整個系統的查詢性能獲得極大的改善。 經過一主多從的配置方式,能夠將查詢請求均勻的分散到多個數據副本,可以進一步的提高系統的處理能力。 使用多主多從的方式,不但可以提高系統的吞吐量,還可以提高系統的可用性,能夠達到在任何一個數據庫宕機,甚至磁盤物理損壞的狀況下仍然不影響系統的正常運行。mysql
雖然讀寫分離能夠提高系統的吞吐量和可用性,但同時也帶來了數據不一致的問題,這包括多個主庫之間的數據一致性,以及主庫與從庫之間的數據一致性的問題。而且,讀寫分離也帶來了與數據分片一樣的問題,它一樣會使得應用開發和運維人員對數據庫的操做和運維變得更加複雜。透明化讀寫分離所帶來的影響,讓使用方儘可能像使用一個數據庫同樣使用主從數據庫,是讀寫分離中間件的主要功能。ios
在上一篇文章介紹到Mysql數據庫的分庫分表,本文將介紹讀寫分離git
192.168.0.3
192.168.0.4
複製代碼
這裏不作過多介紹了 我這裏安裝的Mysql 8.0github
MySQL 主從複製的方式有多種,本文主要演示基於基於日誌(binlog)的主從複製方式。spring
主從配置須要注意的點sql
主從服務器操做系統版本和位數一致;
Master 和 Slave 數據庫的版本要一致;
Master 和 Slave 數據庫中的數據要一致;
Master 開啓二進制日誌, Master 和 Slave 的 server_id 在局域網內必須惟一;
複製代碼
Master 上的配置shell
1.安裝數據庫;
2.修改數據庫配置文件, 指明 server_id, 3.開啓二進制日誌(log-bin);
4.啓動數據庫, 查看當前是哪一個日誌, position 號是多少;
5.登陸數據庫, 受權數據複製用戶(IP 地址爲從機 IP 地址, 若是是雙向主從, 6.這裏的還須要受權本機的 IP 地址, 此時本身的 IP 地址就是從 IP 地址);
7.備份數據庫(記得加鎖和解鎖);
8.傳送備份數據到 Slave 上;
9.啓動數據庫;
複製代碼
如下步驟, 爲單向主從搭建成功, 想搭建雙向主從須要的步驟:數據庫
登陸數據庫, 指定 Master 的地址、 用戶、 密碼等信息(此步僅雙向主從時須要)
開啓同步
查看狀態
複製代碼
1.一、版本一致
1.二、初始化表,並在後臺啓動mysql
1.三、修改root的密碼
複製代碼
#vim /etc/my.cnf
[mysqld]
log-bin=mysql-bin //[必須]啓用二進制日誌
server-id=222 //[必須]服務器惟一ID,默認是1,通常取IP最後一段/自定義均可以的
複製代碼
mysql> mysql -u root -p
mysql> show master status;
複製代碼
#vi /etc/my.cnf
[mysqld]
log-bin=mysql-bin //[不是必須]啓用二進制日誌
server-id=226 //[必須]服務器惟一ID,默認是1,通常取IP最後一段/自定義均可以的
複製代碼
mysql> mysql -u root -p
mysql> show master status;
複製代碼
systemctl restart mysqld.service
複製代碼
change master to master_host='192.168.0.4',master_user='test',master_password='12root',master_log_file='mysql-bin.000001',master_log_pos=155;
複製代碼
通常不用root賬號,"%" 表示全部客戶端均可能連,只要賬號,密碼正確,此處可用具體客戶端IP代替,如192.168.0.4(主服務器的IP),增強安全 8. 開啓主從同步vim
mysql> start slave; #中止主從同步命令爲:stop slave
複製代碼
mysql> show slave status\G;
複製代碼
注:Slave_IO及Slave_SQL進程必須正常運行,即YES狀態,不然都是錯誤的狀態(如:其中一個NO均屬錯誤)
說明們的主從同步配置成功瀏覽器
注意:若是若是從庫宕機,從新啓動,要鏈接上mysql服務,執行 start slave 這個命令,開啓主從同步
分別查詢兩臺服務器的數據庫
在主數據庫建立test表
mysql> create database test;
複製代碼
查詢從數據庫
注: 編寫一shell腳本,用nagios監控slave的兩個yes(Slave_IO及Slave_SQL進程),如發現只有一個或零個yes,就代表主從有問題了,發短信警報吧
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`age` int(11) DEFAULT NULL,
`name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
SET FOREIGN_KEY_CHECKS = 1;
複製代碼
從數據庫會自動同步
application.properties 配置
# 配置真實數據源
sharding.jdbc.datasource.names=master1,slave0
# 主數據庫
sharding.jdbc.datasource.master1.type=com.zaxxer.hikari.HikariDataSource
sharding.jdbc.datasource.master1.hikari.driver-class-name=com.mysql.cj.jdbc.Driver
sharding.jdbc.datasource.master1.jdbc-url=jdbc:mysql://192.168.0.3:3306/ds0?characterEncoding=utf-8&autoReconnect=true&serverTimezone=Asia/Shanghai
sharding.jdbc.datasource.master1.username=test
sharding.jdbc.datasource.master1.password=12root
# 從數據庫
sharding.jdbc.datasource.slave0.type=com.zaxxer.hikari.HikariDataSource
sharding.jdbc.datasource.slave0.hikari.driver-class-name=com.mysql.cj.jdbc.Driver
sharding.jdbc.datasource.slave0.jdbc-url=jdbc:mysql://192.168.0.3:3306/ds0?characterEncoding=utf-8&autoReconnect=true&serverTimezone=Asia/Shanghai
sharding.jdbc.datasource.slave0.username=test
sharding.jdbc.datasource.slave0.password=12root
# 配置讀寫分離
# 配置從庫選擇策略,提供輪詢與隨機,這裏選擇用輪詢
sharding.jdbc.config.masterslave.load-balance-algorithm-type=round_robin
sharding.jdbc.config.masterslave.name=ms
sharding.jdbc.config.masterslave.master-data-source-name=master1
sharding.jdbc.config.masterslave.slave-data-source-names=slave0
# 開啓SQL顯示,默認值: false,注意:僅配置讀寫分離時不會打印日誌
sharding.jdbc.config.props.sql.show=true
spring.main.allow-bean-definition-overriding=true
複製代碼
主要改動application.properties配置 其餘地方不作改動
打開瀏覽器訪問: http://localhost:8080/select 查詢用戶集合
打開瀏覽器訪問: http://localhost:8080/insert?id=1&name=lhd&age=12 插入一條數據 控制檯打印:
主庫負責寫 從庫負責讀
這樣讀寫分離就這樣作好了
項目地址: github.com/LiHaodong88…