MariaDB數據庫主從架構和配置優化
node
--------------------------------------------------------------------------------------------------------------------------------------------
mysql
1、MySQL複製git
一、擴展方式:Scale UP,Scale Outgithub
二、MySQL的擴展sql
讀寫分離數據庫
複製:每一個節點都有相同的數據集vim
向外擴展centos
基於二進制日誌發生更改,實現主從複製安全
單向複製,由主到從複製服務器
三、複製的功用
數據分佈、負載均衡讀、備份、高可用和故障切換、MySQL升級測試
2、MySQL讀寫分離
讀寫分離應用:
mysql-proxy:Oracle
Atlas:奇虎,基於mysql-proxy
DBProxy:美團
Cetus:網易
Amoeba
Cobar:阿里巴巴,基於Amoeba的升級版
Mycat:基於Cobar
ProxySQL
3、主從複製
一、一主一從
二、一主多從
三、主從複製原理
主服務器數據更新時,會產生二進制日誌,以後經過slave服務線程(線程1)讀取二進制日誌,而且和從服務器的IO Thread(線程2)傳輸二進制日誌,寫入中繼日誌relay log,接着從服務器經過SQL Thread的線程(線程3)讀取中繼日誌中SQL語句並寫入數據庫中,從而實現了主從複製
要求主服務器必須啓動二進制日誌,若是從服務器開本身的從服務器,也須要開啓二進制日誌
用戶訪問量大時,主從複製會有延遲
四、讀寫分離方法:MySQL垂直分區
其餘信息、用戶信息、消息信息各放各的服務器,數據表之間沒法join,須要結合軟件開發來實現表之間的鏈接
五、讀寫分離方法:MySQL水平分片
仍然須要配合業務部門的軟件開發來實現
六、MySQL複製概念
主從複製線程:
主節點:
dump Thread:爲每一個Slave的I/O Thread啓動一個dump線程,用於向其發送binary log events
從節點:
I/O Thread:向Master請求二進制日誌事件,並保存於中繼日誌中
SQL Thread:從中繼日誌中讀取日誌事件,在本地完成重放
跟複製功能相關的文件:
master.info:用於保存slave鏈接至master時的相關信息,例如帳號、密碼、服務器地址等
relay-log.info:保存在當前slave節點上已經複製的當前二進制日誌和本地replay log日誌的對應關係
主從複製特色:
異步複製:客戶端發送同步命令完畢,什麼時候主從同步不予理會
主從數據不一致比較常見
複製架構:
Master/Slave, Master/Master(除非對數據準確度要求不高,通常不推薦使用), 環狀複製
一主多從
從服務器還能夠再有從服務器
一從多主:適用於多個不一樣數據庫(mysql版本大於5.6)
複製須要考慮二進制日誌事件記錄格式
STATEMENT(5.0以前)
ROW(5.1以後,推薦)
MIXED
七、MySQL複製模型
4、實現主從複製(版本最好同樣)
主節點配置:
一、 啓用二進制日誌
[mysqld]
log_bin
二、爲當前節點設置一個全局唯一的ID號
[mysqld]
server_id=#
log-basename=master 可選項,設置datadir中日誌名稱,確保不依賴主機名
三、建立有複製權限的用戶帳號
GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'HOST' IDENTIFIED BY 'replpass';
從節點配置:
一、啓動中繼日誌
[mysqld]
server_id=# 爲當前節點設置一個全局唯的ID號
relay_log=relay-log relay log的文件路徑,默認值hostname-relay-bin
relay_log_index=relay-log.index 默認值hostname-relay-bin.index
二、 進入數據庫進行遠程複製,對主服務器進行遠程鏈接記不住輸入help change,會有提示,接着help chage master to,會有提示命令
mysql> CHANGE MASTER TO MASTER_HOST='host', MASTER_USER='repluser',
MASTER_PASSWORD='replpass', MASTER_LOG_FILE='mysql-bin.xxxxx',
MASTER_LOG_POS=#;
mysql> START SLAVE [IO_THREAD|SQL_THREAD];
三、若是主節點已經運行了一段時間,且有大量數據時,如何配置並啓動slave節點
經過備份恢復數據至從服務器
複製起始位置爲備份時,二進制日誌文件及其POS
若是要啓用級聯複製,須要在從服務器啓用如下配置,及主---從1----從2,從1須要加的內容
[mysqld]
log_bin
log_slave_updates
複製架構中應該注意的問題:
一、限制從服務器爲只讀
在從服務器上設置read_only=ON
注意:此限制對擁有SUPER權限的用戶均無效
阻止全部用戶, 包括主服務器複製的更新
mysql> FLUSH TABLES WITH READ LOCK;
二、RESET SLAVE
在從服務器清除master.info ,relay-log.info, relay log ,開始新的relay log ,注意:須要先STOP SLAVE
RESET SLAVE ALL 清除全部從服務器上設置的主服務器同步信息如:PORT, HOST, USER和 PASSWORD 等
三、sql_slave_skip_counter = N 從服務器忽略幾個主服務器的複製事件,global變量,複製時候產生錯誤,是否跳過錯誤,默認值是0,關閉
四、如何保證主從複製的事務安全
參看https://mariadb.com/kb/en/library/server-system-variables/
在master節點啓用參數:
sync_binlog=1 每次寫後當即同步二進制日誌到磁盤,性能差
若是用到的爲InnoDB存儲引擎:
innodb_flush_log_at_trx_commit=1 每次事務提交當即同步日誌寫磁盤
innodb_support_xa=ON 默認值,分佈式事務MariaDB10.3.0廢除
sync_master_info=# #次事件後master.info同步到磁盤
在slave節點啓用服務器選項:
skip_slave_start=ON 不自動啓動slave,在slave節點啓用參數:
sync_relay_log=# #次寫後同步relay log到磁盤
sync_relay_log_info=# #次事務後同步relay-log.info到磁盤
5、半同步複製
半同步複製實現:一主多從,若是至少一個從服務器同步成功,主服務器將會向客戶端返回成功信息;或者全部從服務器長時間沒有同步,超過了限定時長,主服務器也將會向客戶端返回成功信息
一、主服務器配置:
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
mysql>SET GLOBAL rpl_semi_sync_master_enabled=1;,寫入文件時永久保存
mysql>SET GLOBAL rpl_semi_sync_master_timeout = 1000;超時長爲1s,單位是毫秒
mysql>SHOW GLOBAL VARIABLES LIKE '%semi%';
mysql>SHOW GLOBAL STATUS LIKE '%semi%‘;
二、從服務器配置:
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
mysql> SET GLOBAL rpl_semi_sync_slave_enabled=1;
stop slave; start slave;,這兩步用來啓用插件
附show plugins;:查看插件
工做中建議master--slave半同步--slave1,2,3
6、
一、複製過濾器:
讓從節點僅複製指定的數據庫,或指定數據庫的指定表
二、兩種實現方式:
(1) 服務器選項:主服務器僅向二進制日誌中記錄與特定數據庫相關的事件
注意:此項和binlog_format相關
參看:https://mariadb.com/kb/en/library/mysqld-options/#-binlog-ignore-dbbinlog_do_db = 數據庫白名單列表,多個數據庫需多行實現,選項,/etc/my.cnf的[mysqld]
binlog_ignore_db = 數據庫黑名單列表,選項
問題:基於二進制還原將沒法實現;不建議使用
(2) 從服務器SQL_THREAD在replay中繼日誌中的事件時,僅讀取與特定數據庫(特定表)相關的事件並應用於本地
問題:會形成網絡及磁盤IO浪費
在從服務器上添加的複製過濾器相關變量,先stop slave中止線程,而後使用set replicate...=DB設置名單
replicate_do_db= 指定複製庫的白名單,只適用於global選項,使用必須use進入當前庫進行增刪改操做,不能在其它表中用DB.TBL
replicate_ignore_db= 指定複製庫黑名單
replicate_do_table= 指定複製表的白名單
replicate_ignore_table= 指定複製表的黑名單
replicate_wild_do_table= foo%.bar% 支持通配符
replicate_wild_ignore_table=
三、基於SSL複製:
在默認的主從複製過程或遠程鏈接到MySQL/MariaDB全部的連接通訊中的數據都是明文的,外網裏訪問數據或則複製,存在安全隱患。經過SSL/TLS加密的方式進行復制的方法,來進一步提升數據的安全性
參看:https://mariadb.com/kb/en/library/replication-with-secure-connections/
主服務器開啓SSL:[mysqld] 加一行ssl
主服務器配置證書和私鑰;而且建立一個要求必須使用SSL鏈接的複製帳號
從服務器使用CHANGER MASTER TO 命令時指明ssl相關選項
Master服務器配置
[mysqld]
log-bin
server_id=1
ssl
ssl-ca=/etc/my.cnf.d/ssl/cacert.pem ----CA證書
ssl-cert=/etc/my.cnf.d/ssl/master.crt ----CA頒發的證書
ssl-key=/etc/my.cnf.d/ssl/master.key ----主服務器的私鑰
保存後進入數據庫輸入
grant replication slve on *.* to ssluser@'HOST' identified by 'passwd' require ssl;,創建強制加密的用戶
Slave服務器配置
mysql>
CHANGE MASTER TO
MASTER_HOST='MASTERIP',
MASTER_USER='rep',
MASTER_PASSWORD='centos',
MASTER_LOG_FILE='mariadb-bin.000001',
MASTER_LOG_POS=245,
MASTER_SSL=1,
MASTER_SSL_CA = '/etc/my.cnf.d/ssl/cacert.pem',
MASTER_SSL_CERT = '/etc/my.cnf.d/ssl/slave.crt',
MASTER_SSL_KEY = '/etc/my.cnf.d/ssl/slave.key';
CA服務器:創建目錄放證書,openssl genrsa 2048 >cakey.pem,
openssl req -new -x509 -key cakey.pem -out cacert.pem -days 3650,生成自簽名,交互式設置;
openssl req -newkey rsa:1024 -days 100 -nodes -keyout master.key > master.csr,生成主服務器私鑰文件 > 生成證書申請,交互式填寫與上一步同樣
openssl x509 -req -in master.csr -days 100 -CA cacert.pem -CAkey cakey.pem -set_serial 01 >master.crt
openssl req -newkey rsa:1024 -days 100 -nodes -keyout master.key > slave.csr
openssl x509 -req -in slave.csr -days 100 -CA cacert.pem -CAkey cakey.pem -set_serial 02 >slave.crt
證書申請完畢,將生成的文件放到對應的目錄下
7、複製的監控和維護
一、 清理日誌
PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr }
RESET MASTER
RESET SLAVE
二、 複製監控
SHOW MASTER STATUS
SHOW BINLOG EVENTS
SHOW BINARY LOGS
SHOW SLAVE STATUS
SHOW PROCESSLIST
三、 從服務器是否落後於主服務
Seconds_Behind_Master: 0
四、 如何肯定主從節點數據是否一致
percona-tools
五、 數據不一致如何修復
刪除從數據庫,從新複製
8、高可用
一、MMM: Multi-Master Replication Manager for MySQL,Mysql主主複製管理器是一套靈活的腳本程序,基於perl實現,用來對mysql replication進行監控和故障遷移,並能管理mysql Master-Master複製的配置(同一時間只有一個節點是可寫的)
官網: http://www.mysql-mmm.org
https://code.google.com/archive/p/mysql-master-master/downloads
二、MHA: Master High Availability,對主節點進行監控,可實現自動故障轉移至其它從節點;經過提高某一從節點爲新的主節點,基於主從複製實現,還須要客戶端配合實現,目前MHA主要支持一主多從的架構,要搭建MHA,要求一個複製集羣中必須最少有三臺數據庫服務器,一主二從,即一臺充當master,一臺充當備用master,另一臺充當從庫,出於機器成本的考慮,淘寶進行了改造,目前淘寶TMHA已經支持一主一從
官網:https://code.google.com/archive/p/mysql-master-ha/
三、Galera Cluster:wsrep(MySQL extended with the Write Set Replication)
經過wsrep協議在全局實現複製;任何一節點均可讀寫,不須要主從複製,實現多主讀寫
9、MHA集羣架構
工做原理
一、從宕機崩潰的master保存二進制日誌事件(binlog events)
二、識別含有最新更新的slave
三、應用差別的中繼日誌(relay log)到其餘的slave
四、應用從master保存的二進制日誌事件(binlog events)
五、提高一個slave爲新的master
六、使其餘的slave鏈接新的master進行復制
實驗,建議centos7上作,不要在centos6作
一、準備初步環境,四臺主機 ,1主2從1管理器
二、主機之間實現基於key實現,時間須要同步
隨便一臺主機,ssh-keygen,ssh-copy-id,在本身主機生成公鑰,將此目錄拷貝至每一個設備對應的/root,實現設備之間互通基於key驗證
三、主服務器上:
vim /etc/my.cnf
[mysqld]
log-bin
server_id=1
skip_name_resolve=1 --------->必須項
四、建立帳戶
複製帳號:mysql>grant replication slave on *.* to repluser@'192.168.8.%' identified by 'magedu';
管理帳號:mysql>grant all on *.* to mhauser@'192.168.8.%' identified by 'magedu';
五、從服務器改文件
從1:
vim /etc/my.cnf
[mysqld]
server_id=2 不一樣節點此值各不相同
log-bin
read_only
relay_log_purge=0
skip_name_resolve=1 --------->必須項
從2:
vim /etc/my.cnf
[mysqld]
server_id=3 不一樣節點此值各不相同
log-bin
read_only
relay_log_purge=0
skip_name_resolve=1 --------->必須項
改好後重啓服務
六、兩臺從服務器:mysql>CHANGE MASTER TO MASTER_HOST=‘主服務器_IP', MASTER_USER='repluser', MASTER_PASSWORD=‘magedu', MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=245;,設置主從同步,show slave status\G檢查同步狀態,複製完成後start slave開啓線程
七、基於epel源安裝工具
管理節點安裝manager工具包:mha4mysql-manager、mha4mysql-node
被管理節點安裝node工具包:mha4mysql-node
八、修改管理主機配置文件
vim /etc/mastermha/app1.cnf ----------->本身新建
[server default]
user=mhauser
password=magedu
manager_workdir=/data/mastermha/app1/ -------->注意有沒有根下/data目錄
manager_log=/data/mastermha/app1/manager.log
remote_workdir=/data/mastermha/app1/
ssh_user=root
repl_user=repluser
repl_password=magedu
ping_interval=1
[server1]
hostname=192.168.8.17---------->主服務器
candidate_master=1
[server2]
hostname=192.168.8.27 --------->代替主服務器的從服務器
candidate_master=1
[server3]
hostname=192.168.8.37 -------->從服務器
九、mha驗證啓動
masterha_check_ssh --conf=/etc/mastermha/app1.cnf --------->8的配置文件建哪了就寫哪
masterha_check_repl --conf=/etc/mastermha/app1.cnf 同上
十、啓動執行
masterha_manager --conf=/etc/mastermha/app1.cnf 該步驟前臺執行,確保安全能夠加hub
十一、測試
主機宕機後會依舊執行程序,系統自動更換主服務器
10、Galera Cluster
一、集成了Galera插件的MySQL集羣,是一種新型的,數據不共享的,高度冗餘的高可用方案,目前Galera Cluster有兩個版本,分別是Percona Xtradb Cluster及MariaDB Cluster,Galera自己是具備多主特性的,即採用multi-master的集羣架構,是一個既穩健,又在數據一致性、完整性及高性能方面有出色表現的高可用解決方案
二、特色
多主架構:真正的多點讀寫的集羣,在任什麼時候候讀寫數據,都是最新的
同步複製:集羣不一樣節點之間數據同步,沒有延遲,在數據庫掛掉以後,數據不會丟失
併發複製:從節點APPLY數據時,支持並行執行,更好的性能
故障切換:在出現數據庫故障時,因支持多點寫入,切換容易
熱插拔:在服務期間,若是數據庫掛了,只要監控程序發現的夠快,不可服務時間就會很是少。在節點故障期間,節點自己對集羣的影響很是小
自動節點克隆:在新增節點,或者停機維護時,增量數據或者基礎數據不須要人工手動備份提供,Galera Cluster會自動拉取在線節點數據,最終集羣會變爲一致
對應用透明:集羣的維護,對應用程序是透明的
三、在一個服務器發生事務,在另外一臺服務器也會發生一樣的事務
四、Galera Cluster包括兩個組件
Galera replication library (galera-3)
WSREP:MySQL extended with the Write Set Replication
五、WSREP複製實現:percona-cluster、MariaDB-Cluster
六、注意:都至少須要三個節點,不能安裝mariadb-server,安裝後會自動卸載mariadb-server,安裝本身的集羣版
基於epel源安裝,epel源地址:https://mirrors.tuna.tsinghua.edu.cn/mariadb/mariadb-5.5.59/yum/centos7-amd64/
yum install MariaDB-Galera-server
七、編輯配置文件
vim /etc/my.cnf.d/server.cnf
wsrep_provider = /usr/lib64/galera/libgalera_smm.so -------->程序路徑
wsrep_cluster_address="gcomm://192.168.8.7,192.168.8.17,192.168.8.27" ---->3個服務器ip地址
binlog_format=row ----------->基於行的複製方式
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2 -------->基於鎖的模式
bind-address=0.0.0.0
下面配置可選項
wsrep_cluster_name = 'mycluster' 默認my_wsrep_cluster
wsrep_node_name = 'node1'
wsrep_node_address = ‘192.168.8.7'
八、其它設備的配置文件按照剛纔配置文件格式進行更改,或者覆蓋
九、首次啓動時,須要初始化集羣,在其中一個節點上執行命令
/etc/init.d/mysql start --wsrep-new-cluster
十、其它主機正常啓動其它節點
service mysql start ----------->注意mysql不帶d
十一、查看集羣中相關係統變量和狀態變量
SHOW VARIABLES LIKE 'wsrep_%'\G ----->服務器變量
SHOW STATUS LIKE 'wsrep_%'\G ------>服務器當前狀態
SHOW STATUS LIKE 'wsrep_cluster_size'\G
十二、測試
11、複製的問題和解決方案:
一、數據損壞或丟失
Master: MHA + semi repl
Slave: 從新複製
二、混合使用存儲引擎
MyISAM:不支持事務
InnoDB: 支持事務
三、不唯一的server id
從新複製
四、複製延遲
須要額外的監控工具的輔助
一從多主:mariadb10版後支持
多線程複製:對多個數據庫複製
12、性能衡量指標
一、數據庫服務衡量指標:
qps: query per second
tps: transaction per second
二、壓力測試工具:
mysqlslap
Sysbench:功能強大,https://github.com/akopytov/sysbench
tpcc-mysql
MySQL Benchmark Suite
MySQL super-smack
MyBench
十3、生產環境my.cnf配置示例
硬件:內存32G
十4、MYSQL配置最佳實踐
一、高併發大數據的互聯網業務,架構設計思路是「解放數據庫CPU,將計算轉移到服務層」,併發量大的狀況下,這些功能極可能將數據庫拖死,業務邏輯放到服務層具有更好的擴展性,可以輕易實現「增機器就加性能」
二、參考:
阿里巴巴Java開發手冊
58到家數據庫30條軍規解讀
http://zhuanlan.51cto.com/art/201702/531364.htm