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

                          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、一主一從

image.png

2、一主多從

image.png

3、主從複製原理

主服務器數據更新,寫入二進制日誌,之後通過slave服務線程(線程1)將自己的二進制日誌讀取,和從服務器的IO Thread(線程2)傳輸二進制日誌,寫入中繼日誌relay log,接着從服務器通過SQL Thread的線程(線程3)寫入數據庫中,實現了主從複製

要求主服務器必須啓動二進制日誌,如果從服務器開自己的從服務器,也需要開啓二進制日誌

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

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

image.png

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

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

image.png

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

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

image.png

四、實現主從複製(版本最好一樣)

主節點配置:

1、 啓用二進制日誌

    [mysqld]

    log_bin

2、爲當前節點設置一個全局惟一的ID號

    [mysqld]

    server_id=#

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

3、創建有複製權限的用戶賬號

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

從節點配置:

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]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=

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

image.png

十四、MYSQL配置最佳實踐

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

2、參考:

    阿里巴巴Java開發手冊

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章