MariaDB數據庫主從架構和配置優化

                          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、主從複製

一、一主一從

image.png

二、一主多從

image.png

三、主從複製原理

主服務器數據更新時,會產生二進制日誌,以後經過slave服務線程(線程1)讀取二進制日誌,而且和從服務器的IO Thread(線程2)傳輸二進制日誌,寫入中繼日誌relay log,接着從服務器經過SQL Thread的線程(線程3)讀取中繼日誌中SQL語句並寫入數據庫中,從而實現了主從複製

要求主服務器必須啓動二進制日誌,若是從服務器開本身的從服務器,也須要開啓二進制日誌

用戶訪問量大時,主從複製會有延遲

四、讀寫分離方法:MySQL垂直分區

image.png

其餘信息、用戶信息、消息信息各放各的服務器,數據表之間沒法join,須要結合軟件開發來實現表之間的鏈接

五、讀寫分離方法:MySQL水平分片

image.png

仍然須要配合業務部門的軟件開發來實現

六、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複製模型

image.png

4、實現主從複製(版本最好同樣)

主節點配置:

一、 啓用二進制日誌

    [mysqld]

    log_bin

二、爲當前節點設置一個全局唯一的ID號

    [mysqld]

    server_id=#

    log-basename=master 可選項,設置datadir中日誌名稱,確保不依賴主機名

三、建立有複製權限的用戶帳號

    GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'HOST' IDENTIFIED BY 'replpass';image.png

從節點配置:

一、啓動中繼日誌

    [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]image.png

    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

spacer.gifimage.png

十4、MYSQL配置最佳實踐

一、高併發大數據的互聯網業務,架構設計思路是「解放數據庫CPU,將計算轉移到服務層」,併發量大的狀況下,這些功能極可能將數據庫拖死,業務邏輯放到服務層具有更好的擴展性,可以輕易實現「增機器就加性能」

二、參考:

    阿里巴巴Java開發手冊

    58到家數據庫30條軍規解讀

    http://zhuanlan.51cto.com/art/201702/531364.htm

相關文章
相關標籤/搜索