MariaDB 單機及集群部署


一、Linux單機部署

  1. 添加MariaDB的yum文件MariaDB.repo;

   2. 添加MariaDB.repo倉庫配置;

[mariadb]
name=MariaDB
baseurl=https://mirrors.aliyun.com/mariadb/yum/10.4/centos7-amd64/
gpgkey=https://mirrors.aliyun.com/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck=1

  3. 安裝MariaDB:yum install -y mariadb-server,若卸載執行yum autoremove mariadb;

   4. 啟動MariaDB服務:systemctl start mariadb,並設為開機自啟;

復制代碼
# 設置開機啟動
systemctl enable mariadb
# 啟動服務
systemctl start mariadb 
# 重新啟動
systemctl restart mariadb
# 停止
systemctl stop mariadb
復制代碼

 

   5. 登錄數據庫:mysql -u root -p,root賬號密碼為空,直接回車即可;

   6. 初始化MariaDB配置:mysql_secure_installation;

   7. 重啟MariaDB:systemctl restart mariadb;

   8. 授予外網登陸權限:grant all privileges on *.* to root@'%' identified by 'root'。

設置密碼:ALTER USER root@localhost IDENTIFIED VIA mysql_native_password USING PASSWORD("123456")

 

二、Linux Galera集群介紹及部署

  簡介:Galera Cluster是免費開源的Mariadb數據庫高可用方案,新版本Mariadb自帶Galera,其本身具有multi-master特性,支持多點寫入,Galera Cluster的三個及以上節點是對等關系,每個節點均支持寫入,集群內部會保證寫入數據的一致性與完整性,Galera集群是基於wsrep協議工作的。

  1. Galera Cluster特性

    優點:

      A. 同步復制(幾乎),沒有復制延遲;

      B. 雙活多主拓撲,任意集群節點可以同時讀寫數據庫,無需讀寫分離;

      C. 自動成員控制,故障節點從集群中刪除,自動節點加入,無需手動拷貝數據;

      D. 真正的並行復制,在行級別體現;

      E. 讀取可擴展性強;

    缺點:

      A. 節點上數據重復,新加入節點需要復制完整數據導致開銷大;

      B. 事務提交需要跨節點通信,因此分布式事務操作時寫入會比主從復制慢;

      C. 對於兩個節點集群,如果網絡出現波動不穩定,則可能集群會發生腦裂,導致服務不可用,因此建議最少3個節點(需奇數);

  2. Galera對比MySQL的局限性

    A. 目前復制僅支持InnoDB存儲引擎;

    B. 所有表都應該都一個主鍵,因為DELETE操作需要;

    C. 不支持XA事務及部分顯示鎖;

  3. 搭建集群環境

    A. 環境准備:OS版本 CentOS7.4,三台虛擬機;

    B. 防火牆設置:關閉防火牆 systemctl stop firewalld,或者防火牆開發以下端口;

      4567是Galera做數據復制的通訊和數據傳輸端口,需要在防火牆放開TCP和UDP

      4568是Galera做增量數據傳輸使用的端口(Incremental State Transfer, IST),需要防火牆放開TCP

      4444是Galera做快照狀態傳輸使用的端口(State Snapshot Transfer, SST),需要防火牆放開TCP;

    C. 關閉selinux:vi /etc/selinux/config,設置SELINUX=disabled;

    D. 修改文件描述符

    E. 配置hosts文件:vi /etc/hosts

      192.168.10.101 rhxy-db1

      192.168.10.102 rhxy-db2

      192.168.10.103 rhxy-db3

    F. 下載安裝mariadb:yum 安裝時文件默認放在var/lib/mysql中,若要指定datadir目錄需要將文件拷貝過去

      yum remove mariadb 

      yum install -y MariaDB-server rsync

    G. 修改配置文件:vi /etc/my.cnf.d/server.cnf

#
# These groups are read by MariaDB server.
# Use it for options that only the server (but not clients) should see
#
# See the examples of server my.cnf files in /usr/share/mysql/
#

# this is read by the standalone daemon and embedded servers
[server]

# this is only for the mysqld standalone daemon
[mysqld]
skip-name-resolve
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET collation_connection = utf8mb4_unicode_ci'
init_connect='SET NAMES utf8mb4'
skip-character-set-client-handshake=true
skip-external-locking
#skip-grant-tables
#**#開啟性能監控
performance_schema=ON

#**#暫存的連接數量
back_log=128
max_connections=1256

interactive_timeout = 120
wait_timeout = 120
# Connection and Thread variables

port                           = 3306                                # default 3306
#socket                         = /data/mysql/data/mysql.sock                             # Use mysqld.sock on Ubuntu, conflicts with AppArmor otherwise
# basedir                        = %BASEDIR%
datadir                        =/data/mysql/data
# tmpdir                         = '%INSTANCEDIR%/tmp'
# innodb_tmpdir                  = '%INSTANCEDIR%/tmp'                 # MySQL 5.7

# MySQL error log

log_error                      = /data/mysql/logs/master_error.log   # Adjust AppArmor configuration: /etc/apparmor.d/local/usr.sbin.mysqld
# log_timestamps                 = SYSTEM                              # MySQL 5.7, equivalent to old behaviour
log_warnings                   = 2                                   # MySQL 5.6, equivalent to log_error_verbosity = 3
# log_error_verbosity            = 3                                   # MySQL 5.7, equivalent to log_warnings = 2, MariaDB does NOT support this!
innodb_print_all_deadlocks     = 1
# wsrep_log_conflicts            = 1                                   # for Galera only!

general_log=ON
general_log_file =/data/mysql/logs/master_general.log

# Slow Query Log

slow_query_log_file            = /data/mysql/logs/master_slow.log   # Adjust AppArmor configuration: /etc/apparmor.d/local/usr.sbin.mysqld
slow_query_log                 = 0
log_queries_not_using_indexes  = 0                                   # Interesting on developer systems!
long_query_time                = 1
min_examined_row_limit         = 100


# InnoDB variables

innodb_strict_mode             = ON
# innodb_file_format_check       = 1                                   # Desupported in MySQL 8.0
# innodb_file_format             = Barracuda                           # For dynamic and compressed InnoDB tables, default in 5.7
innodb_buffer_pool_size        = 2G                                    # Go up to 80% of your available RAM
innodb_buffer_pool_instances   = 8                                     # Bigger if huge InnoDB Buffer Pool or high concurrency

innodb_file_per_table          = 1                                   # Is the recommended way nowadays
# innodb_flush_method            = O_DIRECT                            # O_DIRECT is sometimes better for direct attached storage
# innodb_write_io_threads        = 8                                   # If you have a strong I/O system or SSD
# innodb_read_io_threads         = 8                                   # If you have a strong I/O system or SSD
# innodb_io_capacity             = 1000                                # If you have a strong I/O system or SSD

innodb_flush_log_at_trx_commit = 2                                   # 1 for durability, 0 or 2 for performance
innodb_log_buffer_size         = 8M                                  # Bigger if innodb_flush_log_at_trx_commit = 0
innodb_log_file_size           = 256M                                # Bigger means more write throughput but longer recovery time

                                                                     # Since MariaDB 10.0 and MySQL 5.6
innodb_monitor_enable = all

#
# * Galera-related settings
#
[galera]
# Mandatory settings
wsrep_on=ON
wsrep_provider=/usr/lib64/galera-4/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.10.101,192.168.10.102,192.168.10.103"
wsrep_node_name=rhxy-db1
wsrep_node_address=192.168.10.101

binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
#
# Allow server to accept connections on all interfaces.
#
bind-address=0.0.0.0
#
# Optional setting
wsrep_cluster_name=MariaDB-Galera-Cluster
wsrep_slave_threads=4
innodb_flush_log_at_trx_commit=0
innodb_buffer_pool_size=2G
wsrep_sst_method=rsync
wsrep_causal_reads=OFF
# this is only for embedded server
[embedded]

[mariadb]

[mariadb-10.4]

       注意其余節點只需要改wsrep_node_name和wsrep_node_address參數值;

    H. 集群啟動

      第一個節點:galera_new_cluster,systemctl enable mariadb;

      其余節點:systemctl start mariadb,systemctl enable mariadb;

    I. 常用命令

      集群狀態監控:show global status like 'wsrep_%';

      查看集群節點數:show status like 'wsrep_cluster_size';

        查看集群同步狀態:show status like 'wsrep_local_state_comment';

    J. 驗證數據同步

  4. Gelera配置參數

    A. wsrep_on:是否啟用wsrep復制,默認值為OFF,如果要加入集群,需要開啟設置為ON;

    B. wsrep_provider:wsrep庫的位置,

    C. wsrep_cluster_address:啟動時要連接集群節點的地址;

    D. wsrep_cluster_name:集群的名稱,同一集群中所有節點的值都相等;

    E. wsrep_node_name:節點的名稱;

    F. wsrep_node_address:節點的網絡地址,默認端口4567;

    G. wsrep_sst_method:用於進行狀態快照傳輸的方式,默認值rsync;

    H. wsrep_slave_threads:用於並行應用Gelera寫的副本線程數,默認值1;

    I. wsrep_causal_reads:是否在集群中強制執行讀提交特性,默認值OFF;

      J. wsrep_start_position:節點應使用的起始位置;

      K. wsrep_recover:默認值為OFF,若設置為ON,在服務器啟動時,服務會恢復Galera最近申請的寫集的序號,服務將退出;

  5. 常見問題

    問題一

      現象:[ERROR] WSREP: failed to open gcomm backend connection: 110: failed to reach primary view: 110 (Conn;

      原因:發生集群腦裂

      解決方案:刪除所有節點的兩個緩存文件及/var/lock/subsys目錄下的mysql 文件,然后重新啟動

        A. 刪除mysql文件:rm -rf /var/lock/subsys/mysql;

        B. 刪除緩存文件:rm -rf /var/lib/mysql/galera.cache /var/lib/mysql/grastate.dat;

        C. 第一個節點執行:systemctl start mariadb --wsrep-new-cluster;

        D. 其余節點執行:systemctl start mariadb;

    問題二

      現象:執行如下命令,報錯

      原因:systemd 允許創建同一服務的多個實例,而不是傳遞命令行參數;

      解決方案:

        A. 在第一個節點上執行:/usr/bin/mysqld_safe --wsrep-new-cluster,命名在前台執行;

        B. 在其他節點上執行:systemctl start mariadb;

        C. 待集群完全形成后,通過向第一個節點發送 SIGQUIT(在控制台上按 CTRL + \)來停止第一個節點上的 mariadb,(pkill -SIGQUIT mysqld);

        D. 再在第一個節點上執行:systemctl start mariadb; 

    問題三

      現象:虛擬機全部停電,需要重啟

      解決方案:

        A. 每台mariadb機器都需要刪掉grastate.dat文件;

        B. 重新啟動集群 ,在其中一台執行galera_new_cluster,另外幾台執行systemctl start mariadb;

    問題四:

      現象:當數據庫啟動失敗后,清理集群文件,再使用systemctl start mariadb或galera_new_cluster,服務卡住無反應且也不報錯;

      原因:數據庫啟動失敗后,依然會有wsrep進程,此進程自己不會終止;

      解決方案:ps -ef | grep wsrep,查出進程號后kill -9 pid即可,然后再執行啟動命令。

    可參考:Mariadb問題集綿

    

三、Linux Docker單機部署

  1. 問題一:

           現象:docker版mariadb mysql命令進入終端后查詢語句無法輸入中文;

     原因:容器內LANG不支持中文;

        解決方案:docker exec -it `docker ps | grep mariadb | awk '{ print $1 }'` env LANG=C.UTF-8 bash

 

可參考:MariaDB Gelera Cluster官方文檔

    MySQL排查故障

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM