MySQL怎麼實現主從同步和Django實現MySQL讀寫分離
MySQL讀寫分離
場景
我們的專案中已經存在非常多的資料庫表了,資料量也會逐漸增多,所以我們需要做一些資料庫的安全和效能的最佳化。對於資料庫的最佳化,我們選擇使用MySQL讀寫分離實現。涉及內容包括主從同步和Django實現MySQL讀寫分離。
MT4問題彙總
MySQL主從同步
主從同步機制
主從同步介紹和優點
在多臺資料伺服器中,分為主伺服器和從伺服器。一臺主伺服器對應多臺從伺服器。
主伺服器只負責寫入資料,從伺服器只負責同步主伺服器的資料,並讓外部程式讀取資料。
主伺服器寫入資料後,即刻將寫入資料的命令傳送給從伺服器,從而使得主從資料同步。
應用程式可以隨機讀取某一臺從伺服器的資料,這樣就可以分攤讀取資料的壓力。
當從伺服器不能工作時,整個系統將不受影響;當主伺服器不能工作時,可以方便地從從伺服器選舉一臺來當主伺服器
使用主從同步的優點:
提高讀寫效能
因為主從同步之後,資料寫入和讀取是在不同的伺服器上進行的,而且可以透過增加從伺服器來提高資料庫的讀取效能。
提高資料安全
因為資料已複製到從伺服器,可以在從伺服器上備份而不破壞主伺服器相應資料。
主從同步機制
注意:MySQL伺服器之間的主從同步是基於二進位制日誌機制,主伺服器使用二進位制日誌來記錄資料庫的變動情況,從伺服器透過讀取和執行該日誌檔案來保持和主伺服器的資料一致。
Docker安裝執行MySQL從機
本專案中我們搭建一主一從的主從同步。
主伺服器:ubuntu作業系統中的MySQL。
從伺服器:Docker容器中的MySQL
獲取MySQL映象
# 主從同步儘量保證多臺MySQL的版本相同或相近
sudo docker image pull mysql:5.7.22 # 5.7.22版本
sudo docker load -i 檔案路徑/mysql_docker_5722.tar
1
2
3
指定MySQL從機配置檔案
在使用Docker安裝執行MySQL從機之前,需要準備好從機的配置檔案。
為了快速準備從機的配置檔案,我們直接把主機的配置檔案複製到從機中。
# 建立MySQL從機配置資料夾
mkdir mysql_slave
# 建立裝資料庫資料資料夾
mkdir data
cp -r /etc/mysql/mysql.conf.d ./
1
2
3
4
5
6
修改MySQL從機配置檔案
編輯 ~/mysql_slave/mysql.conf.d/mysqld.cnf檔案。
由於主從機都在同一個電腦中,所以我們選擇使用不同的埠號區分主從機,從機埠號是8306。
# 從機埠號
port = 8306
# 關閉日誌
general_log = 0
# 從機唯一編號
server-id = 2
1
2
3
4
5
6
Docker安裝執行MySQL從機
建立 root 使用者的密碼為 mysql
sudo docker run --name mysql-slave -e MYSQL_ROOT_PASSWORD=mysql -d --network=host -v /home/python/mysql_slave/data:/var/lib/mysql -v /home/python/mysql_slave/mysql.conf.d:/etc/mysql/mysql.conf.d mysql:5.7.22
1
測試從機是否建立成功
mysql -uroot -pmysql -h 127.0.0.1 --port=8306
1
主從同步實現
配置主機(ubuntu中MySQL)
配置檔案如有修改,需要重啟主機。
sudo service mysql restart
# 開啟日誌
general_log_file = /var/log/mysql/mysql.log
general_log = 1
# 主機唯一編號
server-id = 1
# 二進位制日誌檔案
log_bin = /var/log/mysql/mysql-bin.log
1
2
3
4
5
6
7
從機備份主機原有資料
# 在做主從同步時,如果從機需要主機上原有資料,就要先複製一份到從機
# 1. 收集主機原有資料
mysqldump -uroot -pmysql --all-databases --lock-all-tables > ~/master_db.sql
# 2. 從機複製主機原有資料
mysql -uroot -pmysql -h127.0.0.1 --port=8306 < ~/master_db.sql
1
2
3
4
5
6
主從同步實現
# 登入到主機
$ mysql –uroot –pmysql
# 建立從機賬號
$ GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' identified by 'slave';
# 重新整理許可權
$ FLUSH PRIVILEGES;
# 展示ubuntu中MySQL主機的二進位制日誌資訊
$ SHOW MASTER STATUS;
# 可以看到master_log_file和master_log_pos=Position
# 登入到從機
$ mysql -uroot -pmysql -h 127.0.0.1 --port=8306
# 從機連線到主機
$ change master to master_host='127.0.0.1', master_user='slave', master_password='slave',master_log_file=XXX, master_log_pos=XXX;
# 開啟從機服務
$ start slave;
# 展示從機服務狀態
$ show slave status \G
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Django實現MySQL讀寫分離
增加slave資料庫的配置
DATABASES = {
'default': { # 寫(主機)
'ENGINE': 'django.db.backends.mysql', # 資料庫引擎
'HOST': 'XXXX', # 資料庫主機
'PORT': 3306, # 資料庫埠
'USER': 'XX', # 資料庫使用者名稱
'PASSWORD': 'XXX', # 資料庫使用者密碼
'NAME': 'XXX' # 資料庫名字
},
'slave': { # 讀(從機)
'ENGINE': 'django.db.backends.mysql',
'HOST': 'XXXX',
'PORT': 8306,
'USER': 'XXX',
'PASSWORD': 'XXX',
'NAME': 'XXX'
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
建立和配置資料庫讀寫路由
建立資料庫讀寫路由
# 在meiduo_mall.utils.db_router.py中實現讀寫路由
class MasterSlaveDBRouter(object):
"""資料庫讀寫路由"""
def db_for_read(self, model, **hints):
"""讀"""
return "slave"
def db_for_write(self, model, **hints):
"""寫"""
return "default"
def allow_relation(self, obj1, obj2, **hints):
"""是否執行關聯操作"""
return True
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
配置資料庫讀寫路由
# 配置資料庫讀寫分離路由
DATABASE_ROUTERS = ['meiduo_mall.utils.db_router.MasterSlaveDBRouter']
1
2
冷備份
冷備份發生在資料庫已經正常關閉的情況下,當正常關閉時會提供給我們一個完整的資料庫。冷備份是將關鍵性檔案複製到另外位置的一種說法。對於備份資料庫資訊而言,冷備份是最快和最安全的方法。簡單說法就是:離線(沒有新的資料來)複製一份儲存,有事就直接用這備份來恢復。
1
冷備份的優點:
是非常快速的備份方法(只需複製檔案)
容易歸檔(簡單複製即可)
容易恢復到某個時間點上(只需將檔案再複製回去)
能與歸檔方法相結合,作資料庫“最新狀態”的恢復。
低度維護,高度安全。
冷備份的缺點:
單獨使用時,只能提供到“某一時間點上”的恢復。
在實施備份的全過程中,資料庫必須要作備份而不能作其它工作。也就是說,在冷備份過程中,資料庫必須是關閉狀態。
若磁碟空間有限,只能複製到磁帶等其它外部儲存裝置上,速度會很慢。
不能按表或按使用者恢復。
值得注意的是冷備份必須在資料庫關閉的情況下進行,當資料庫處於開啟狀態時,執行資料庫檔案系統備份是無效的 。而且在恢復後一定要把資料庫檔案的屬組和屬主改為mysql。
熱備份
熱備份是在資料庫執行的情況下,備份資料庫操作的sql語句,當資料庫發生問題時,可以重新執行一遍備份的sql語句。簡單說就是:線上的儲存對資料庫操作的sql語句,有事就再跑一遍這些sql語句。
# 在做主從同步時,如果從機需要主機上原有資料,就要先複製一份到從機
# 1. 收集主機原有資料
mysqldump -uroot -pmysql --all-databases --lock-all-tables > ~/master_db.sql
# 2. 從機複製主機原有資料(在配置檔案所在目錄下,資料會寫入data檔案中)
mysql -uroot -pmysql -h127.0.0.1 --port=8306 < ~/master_db.sql
1
2
3
4
5
6
熱備份的優點:
可在表空間或資料檔案級備份,備份時間短。
備份時資料庫仍可使用。
可達到秒級恢復(恢復到某一時間點上)。
可對幾乎所有資料庫實體作恢復。
恢復是快速的,在大多數情況下在資料庫仍工作時恢復。
熱備份的缺點:
不能出錯,否則後果嚴重。
若熱備份不成功,所得結果不可用於時間點的恢復。
因難於維護,所以要特別仔細小心,不允許“以失敗而告終”
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946337/viewspace-2674107/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 搭建MySQL主從實現Django讀寫分離MySqlDjango
- MySQL主從分離實現MySql
- Mycat中介軟體實現Mysql主從讀寫分離MySql
- ProxySQL實現MySQL讀寫分離MySql
- Amoeba 實現 MySQL 讀寫分離MySql
- 資料庫讀寫分離,主從同步實現方法資料庫主從同步
- Amoeba+Mysql 實現讀寫分離MySql
- mysql-proxy實現讀寫分離MySql
- mycat結合MySQL的雙主實現讀寫分離MySql
- [Mysql]主從複製和讀寫分離MySql
- MySQL主從同步讀寫分離的叢集配置MySql主從同步
- docker+atlas+mysql實現讀寫分離DockerMySql
- springboot+mybatis+druid實現mysql主從讀寫分離(五)Spring BootMyBatisUIMySql
- 帶貨直播系統,透過主從同步實現讀寫分離主從同步
- MYSQL 主從 + ATLAS 讀寫分離 搭建MySql
- 配置\清除 MySQL 主從 讀寫分離MySql
- MySQL主從複製讀寫分離MySql
- ProxySQL實現Mysql讀寫分離 - 部署手冊MySql
- MySQL 中介軟體Atlas 實現讀寫分離MySql
- MySQL Proxy 實現 MySQL 讀寫分離提高併發負載MySql負載
- 使用proxysql 1.4.14中介軟體實現mysql 5.7.26主從的讀寫分離MySql
- Mycat實現mysql的負載均衡讀寫分離MySql負載
- Spring配置RoutingDataSource實現mysql讀寫分離SpringMySql
- mysql proxy 安裝及配置實現讀寫分離MySql
- Kubernetes 中實現 MySQL 的讀寫分離MySql
- MySQL主從複製與讀寫分離MySql
- MysqL讀寫分離的實現-Mysql proxy中介軟體的使用MySql
- springboot多資料來源配合docker部署mysql主從實現讀寫分離Spring BootDockerMySql
- 揭秘MySQL的主從同步實現方案MySql主從同步
- 基於MySql主從分離的程式碼層實現MySql
- Mysql-主從複製與讀寫分離MySql
- (7)資料庫讀寫分離,主從同步實現方法(資料庫設定)資料庫主從同步
- mysql和redis實時同步資料怎麼實現MySqlRedis
- 搭建Redis簡易叢集實現主從複製和讀寫分離Redis
- Amoeba實現讀寫分離
- MySQL5.6基於GTID同步複製,與如何實現MySQL負載均衡、讀寫分離MySql負載
- mysql讀寫分離的最佳實踐MySql
- 搭建Redis“主-從-從”模式叢集並使用 RedisTemplate 實現讀寫分離Redis模式