MariaDB數據庫主從架構和配置優化
--------------------------------------------------------------------------------------------------------------------------------------------
一、MySQL複製
1、擴展方式:Scale UP,Scale Out
2、MySQL的擴展
讀寫分離
複製:每個節點都有相同的數據集
向外擴展
基於二進制日誌發生更改,實現主從複製
單向複製,由主到從複製
3、複製的功用
數據分佈、負載均衡讀、備份、高可用和故障切換、MySQL升級測試
二、MySQL讀寫分離
讀寫分離應用:
mysql-proxy:Oracle
Atlas:奇虎,基於mysql-proxy
DBProxy:美團
Cetus:網易
Amoeba
Cobar:阿里巴巴,基於Amoeba的升級版
Mycat:基於Cobar
ProxySQL
三、主從複製
1、一主一從
2、一主多從
3、主從複製原理
主服務器數據更新,寫入二進制日誌,之後通過slave服務線程(線程1)將自己的二進制日誌讀取,和從服務器的IO Thread(線程2)傳輸二進制日誌,寫入中繼日誌relay log,接着從服務器通過SQL Thread的線程(線程3)寫入數據庫中,實現了主從複製
要求主服務器必須啓動二進制日誌,如果從服務器開自己的從服務器,也需要開啓二進制日誌
用戶訪問量大時,主從複製會有延遲
4、讀寫分離方法:MySQL垂直分區
其他信息、用戶信息、消息信息各放各的服務器,數據表之間無法join,需要結合軟件開發來實現表之間的連接
5、讀寫分離方法:MySQL水平分片
仍然需要配合業務部門的軟件開發來實現
6、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
7、MySQL複製模型
四、實現主從複製(版本最好一樣)
主節點配置:
1、 啓用二進制日誌
[mysqld]
log_bin
2、爲當前節點設置一個全局惟一的ID號
[mysqld]
server_id=#
log-basename=master 可選項,設置datadir中日誌名稱,確保不依賴主機名
3、創建有複製權限的用戶賬號
GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'HOST' IDENTIFIED BY 'replpass';
從節點配置:
1、啓動中繼日誌
[mysqld]
server_id=# 爲當前節點設置一個全局惟的ID號
relay_log=relay-log relay log的文件路徑,默認值hostname-relay-bin
relay_log_index=relay-log.index 默認值hostname-relay-bin.index
2、 進入數據庫進行遠程複製,對主服務器進行遠程連接記不住輸入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];
3、如果主節點已經運行了一段時間,且有大量數據時,如何配置並啓動slave節點
通過備份恢復數據至從服務器
複製起始位置爲備份時,二進制日誌文件及其POS
如果要啓用級聯複製,需要在從服務器啓用以下配置,及主---從1----從2,從1需要加的內容
[mysqld]
log_bin
log_slave_updates
複製架構中應該注意的問題:
1、限制從服務器爲只讀
在從服務器上設置read_only=ON
注意:此限制對擁有SUPER權限的用戶均無效
阻止所有用戶, 包括主服務器複製的更新
mysql> FLUSH TABLES WITH READ LOCK;
2、RESET SLAVE
在從服務器清除master.info ,relay-log.info, relay log ,開始新的relay log ,注意:需要先STOP SLAVE
RESET SLAVE ALL 清除所有從服務器上設置的主服務器同步信息如:PORT, HOST, USER和 PASSWORD 等
3、sql_slave_skip_counter = N 從服務器忽略幾個主服務器的複製事件,global變量,複製時候產生錯誤,是否跳過錯誤,默認值是0,關閉
4、如何保證主從複製的事務安全
參看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到磁盤
五、半同步複製
半同步複製實現:一主多從,如果至少一個從服務器同步成功,主服務器將會向客戶端返回成功信息;或者所有從服務器長時間沒有同步,超過了限定時長,主服務器也將會向客戶端返回成功信息
1、主服務器配置:
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%‘;
2、從服務器配置:
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
六、
1、複製過濾器:
讓從節點僅複製指定的數據庫,或指定數據庫的指定表
2、兩種實現方式:
(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=
3、基於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
證書申請完畢,將生成的文件放到對應的目錄下
七、複製的監控和維護
1、 清理日誌
PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr }
RESET MASTER
RESET SLAVE
2、 複製監控
SHOW MASTER STATUS
SHOW BINLOG EVENTS
SHOW BINARY LOGS
SHOW SLAVE STATUS
SHOW PROCESSLIST
3、 從服務器是否落後於主服務
Seconds_Behind_Master: 0
4、 如何確定主從節點數據是否一致
percona-tools
5、 數據不一致如何修復
刪除從數據庫,重新複製
八、高可用
1、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
2、MHA: Master High Availability,對主節點進行監控,可實現自動故障轉移至其它從節點;通過提升某一從節點爲新的主節點,基於主從複製實現,還需要客戶端配合實現,目前MHA主要支持一主多從的架構,要搭建MHA,要求一個複製集羣中必須最少有三臺數據庫服務器,一主二從,即一臺充當master,一臺充當備用master,另外一臺充當從庫,出於機器成本的考慮,淘寶進行了改造,目前淘寶TMHA已經支持一主一從
官網:https://code.google.com/archive/p/mysql-master-ha/
3、Galera Cluster:wsrep(MySQL extended with the Write Set Replication)
通過wsrep協議在全局實現複製;任何一節點都可讀寫,不需要主從複製,實現多主讀寫
九、MHA集羣架構
工作原理
1、從宕機崩潰的master保存二進制日誌事件(binlog events)
2、識別含有最新更新的slave
3、應用差異的中繼日誌(relay log)到其他的slave
4、應用從master保存的二進制日誌事件(binlog events)
5、提升一個slave爲新的master
6、使其他的slave連接新的master進行復制
實驗,建議centos7上做,不要在centos6做
1、準備初步環境,四臺主機 ,1主2從1管理器
2、主機之間實現基於key實現,時間需要同步
隨便一臺主機,ssh-keygen,ssh-copy-id,在自己主機生成公鑰,將此目錄拷貝至每個設備對應的/root,實現設備之間互通基於key驗證
3、主服務器上:
vim /etc/my.cnf
[mysqld]
log-bin
server_id=1
skip_name_resolve=1 --------->必須項
4、創建賬戶
複製賬號: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';
5、從服務器改文件
從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 --------->必須項
改好後重啓服務
6、兩臺從服務器: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開啓線程
7、基於epel源安裝工具
管理節點安裝manager工具包:mha4mysql-manager、mha4mysql-node
被管理節點安裝node工具包:mha4mysql-node
8、修改管理主機配置文件
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 -------->從服務器
9、mha驗證啓動
masterha_check_ssh --conf=/etc/mastermha/app1.cnf --------->8的配置文件建哪了就寫哪
masterha_check_repl --conf=/etc/mastermha/app1.cnf 同上
10、啓動執行
masterha_manager --conf=/etc/mastermha/app1.cnf 該步驟前臺執行,確保安全可以加hub
11、測試
主機宕機後會依舊執行程序,系統自動更換主服務器
十、Galera Cluster
1、集成了Galera插件的MySQL集羣,是一種新型的,數據不共享的,高度冗餘的高可用方案,目前Galera Cluster有兩個版本,分別是Percona Xtradb Cluster及MariaDB Cluster,Galera本身是具有多主特性的,即採用multi-master的集羣架構,是一個既穩健,又在數據一致性、完整性及高性能方面有出色表現的高可用解決方案
2、特點
多主架構:真正的多點讀寫的集羣,在任何時候讀寫數據,都是最新的
同步複製:集羣不同節點之間數據同步,沒有延遲,在數據庫掛掉之後,數據不會丟失
併發複製:從節點APPLY數據時,支持並行執行,更好的性能
故障切換:在出現數據庫故障時,因支持多點寫入,切換容易
熱插拔:在服務期間,如果數據庫掛了,只要監控程序發現的夠快,不可服務時間就會非常少。在節點故障期間,節點本身對集羣的影響非常小
自動節點克隆:在新增節點,或者停機維護時,增量數據或者基礎數據不需要人工手動備份提供,Galera Cluster會自動拉取在線節點數據,最終集羣會變爲一致
對應用透明:集羣的維護,對應用程序是透明的
3、在一個服務器發生事務,在另一臺服務器也會發生同樣的事務
4、Galera Cluster包括兩個組件
Galera replication library (galera-3)
WSREP:MySQL extended with the Write Set Replication
5、WSREP複製實現:percona-cluster、MariaDB-Cluster
6、注意:都至少需要三個節點,不能安裝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
7、編輯配置文件
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'
8、其它設備的配置文件按照剛纔配置文件格式進行更改,或者覆蓋
9、首次啓動時,需要初始化集羣,在其中一個節點上執行命令
/etc/init.d/mysql start --wsrep-new-cluster
10、其它主機正常啓動其它節點
service mysql start ----------->注意mysql不帶d
11、查看集羣中相關係統變量和狀態變量
SHOW VARIABLES LIKE 'wsrep_%'\G ----->服務器變量
SHOW STATUS LIKE 'wsrep_%'\G ------>服務器當前狀態
SHOW STATUS LIKE 'wsrep_cluster_size'\G
12、測試
十一、複製的問題和解決方案:
1、數據損壞或丟失
Master: MHA + semi repl
Slave: 重新複製
2、混合使用存儲引擎
MyISAM:不支持事務
InnoDB: 支持事務
3、不惟一的server id
重新複製
4、複製延遲
需要額外的監控工具的輔助
一從多主:mariadb10版後支持
多線程複製:對多個數據庫複製
十二、性能衡量指標
1、數據庫服務衡量指標:
qps: query per second
tps: transaction per second
2、壓力測試工具:
mysqlslap
Sysbench:功能強大,https://github.com/akopytov/sysbench
tpcc-mysql
MySQL Benchmark Suite
MySQL super-smack
MyBench
十三、生產環境my.cnf配置示例
硬件:內存32G
十四、MYSQL配置最佳實踐
1、高併發大數據的互聯網業務,架構設計思路是“解放數據庫CPU,將計算轉移到服務層”,併發量大的情況下,這些功能很可能將數據庫拖死,業務邏輯放到服務層具備更好的擴展性,能夠輕易實現“增機器就加性能”
2、參考:
阿里巴巴Java開發手冊
58到家數據庫30條軍規解讀
http://zhuanlan.51cto.com/art/201702/531364.htm