非關係型數據庫: key-value: redis 、memcache ;java
面向文檔: mongoDB mysql
面向列: HBaseios
數據切分git
mycatgithub
TDDLredis
Sharding-JDBC算法
cobarsql
超大容量問題shell
訂單表數據量過大數據庫
性能問題
單一數據庫解決全部應用節點
垂直切分、 水平切分
垂直分庫
不一樣的表放在不一樣的庫中
垂直分表
列多的表拆分紅多個列少的表
好比說商 品表拆分
水平切分
拆分若是所有放在一個庫中,可能會有性能問題。
可能把部分表放在不一樣的數據庫中
拆分維度選擇的數據很是重要
er分片
範圍切分
select a.x ,b.y from a,b on a.id=b.id
設計的時候考慮到應用層的join問題。
A服務裏查詢到一個list
直接經過接口查詢
/** *批量查詢不要這樣使用 **/ for(list){ bservice.select(list); }
全局表
作字段冗餘(空間換時間的作法)
訂單表須要展現,商家id 商家名稱(由於訂單表和商家表是一對一的關係),那麼查詢的時候可能每一次都須要爲了查詢商家名稱,能夠作商家名稱字段冗餘
商家名稱變動解決辦法
在應用層作拼接
用自增id作主鍵,多表狀況下自增id會重複
解決方案
UUID 性能比較低
snowflake (雪花算法)
mongoDB
zookeeper
redis自增
數據庫表
多個數據庫表之間保證原子性
性能問題; 互聯網公司用強一致性分佈式事務比較少,通常使用最終一致性,或者軟事物來解決
分庫分表最難的在於業務的複雜度;
前提: 水平分表的前提是已經存在大量的業務數據。而這個業務數據已經滲透到了各個應用節點
1. 提早規劃(主鍵問題解決、 join問題)
2. 當前數據單表超過1000W、天天的增加量持續上升
絕大部分都是寫少讀多的操做,能夠作讀寫分離,多個讀庫作壓力釋放
讀庫能夠實現負載均衡
數據庫的版本5.7版本
安裝之後文件對應的目錄
mysql的數據文件和二進制文件: /var/lib/mysql/
mysql的配置文件: /etc/my.cnf
mysql的日誌文件: /var/log/mysql.log
repl
,而且容許其餘服務器能夠經過該用戶遠程訪問master,經過該用戶去讀取二進制數據,實現數據同步Create user repl identified by 'repl';
repl用戶必須具備REPLICATION SLAVE權限,除此以外其餘權限都不須要
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY 'repl' ;
2.修改6 etc/my.cnf
配置文件,在[mysqld] 下添加以下配置
log-bin=mysql-bin #啓用二進制日誌文件 server-id=6 #服務器惟一ID
3.重啓數據庫
systemctl restart mysqld
4.登陸到數據庫,經過show master status
查看master的狀態信息
server-id=118 #服務器id,惟一 relay-log=slave-relay-bin #中繼日誌,保存master同步過來的信息 relay-log-index=slave-relay-bin.index read_only=1
systemctl restart mysqld
change master to master_host='116.62.221.6', master_port=3306,master_user='repl',master_password='repl',master_log_file='mysql-bin.000003',master_log_pos=429;
master_log_pos
表示從主節點哪一個位置開始讀,
master_log_file
這兩個部分從master的show master status
能夠找到對應的值,不能隨便寫。
start slave
show slave status\G;
查看slave服務器狀態,當以下兩個線程狀態爲yes,表示主從複製配置成功
Slave_IO_Running=Yes Slave_SQL_Running=Yes
master記錄二進制日誌。在每一個事務更新數據完成以前,master在二日誌記錄這些改變。MySQL將事務串行的寫入二進制日誌,即便事務中的語句都是交叉執行的。在事件寫入二進制日誌完成後,master通知存儲引擎提交事務
binlog: 用來記錄mysql的數據更新或者潛在更新(update xxx where id=x effect row 0);
文件內容存儲:/var/lib/mysql
mysqlbinlog --base64-output=decode-rows -v mysql-bin.000001
查看binlog的內容
show binlog events in 'mysql-bin.000001'
查看binlog的日誌,不須要看內容
查看當前日誌模式
show variables like '%log%'
-> binlog_format
statement :
基於sql語句的模式。update table set name =」」; effect row 1000; uuid、now() other function
row: (默認)
基於行模式; 存在1000條數據變動; 記錄修改之後每一條記錄變化的值
mixed:
混合模式,由mysql自動判斷處理
修改binlog_formater
,經過在mysql客戶端輸入以下命令能夠修改
set global binlog_format='row/mixed/statement';
或者在
vim /etc/my.cnf
的[mysqld]下增長binlog_format='mixed'
一主多從或者雙主
網絡延遲比較大
磁盤的讀寫
在數據庫和應用層增長緩存處理,優先從緩存中讀取數據
sync_binlog
屬性; sync_binlog=0
設置爲0執行ddl binlog
不會立馬刷新到文件中,而是經過文件系統調度刷新
文件系統來調度把binlog_cache
刷新到磁盤
sync_binlog=n
等於n表示執行n個事物刷新
Nagios
作網絡監控
mk-heartbeat
心跳監控
經過監控作報警
https://github.com/MyCATApach...
至關於代理
查詢若是是分片鍵那麼直接落到對應數據庫,若是不是分片鍵,那麼會路由到全部數據庫
haproxy負載均衡
keepalive 高可用
分片數據庫
對應的rule分片策略
範圍分片
這是範圍分片,0-200M表示到分片5
邏輯數據庫邏輯表
配置當前服務
在互聯網行業中,最大的特色是併發量高、數據量大;爲了應對這兩個特色,後端的技術架構須要使用各類技術來支撐;而這個專題所講的是關於數據庫層面的優化
當數據庫的訪問量到達必定的瓶頸的時候,當數據庫單表數據比較大嚴重影響ddl性能的時候。咱們應該根據什麼思路去作優化和調整
下載mysql的repo源
wget http://repo.mysql.com/mysql57-community-release-el7-8.noarch.rpm
安裝源
rpm -ivh mysql57-community-release-el7-8.noarch.rpm
安裝數據庫
yum install mysql-server
啓動數據庫
systemctl start mysqld
grep "password" /var/log/mysqld.log
得到,root@localhost: 此處爲隨機密碼Open & Edit /etc/my.cnf
or /etc/mysql/my.cnf
, depending on your distro.
Add skip-grant-tables
under [mysqld]
Restart Mysql
service mysqld restart
You should be able to login to mysql now using the below command mysql -u root -p
Run mysql> flush privileges;
Set new password by ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';
Go back to /etc/my.cnf
and remove/comment skip-grant-tables
Restart Mysql
service mysqld restart
Now you will be able to login with the new password mysql -u root -p
set global validate_password_length=1; set global validate_password_policy=0;
默認狀況下其餘服務器的客戶端不能直接訪問mysql服務端,須要對ip受權
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION; FLUSH PRIVILEGES;