一、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官方文檔