大家好,我是 V 哥,關(guān)于 MySQL 高可用方案,在面試中頻頻出現(xiàn),有同學(xué)在字節(jié)面試就遇到過,主要考察你在高可用項目中是如何應(yīng)用的,V 哥整理了6種方案,供你參考。
MySQL的高可用方案有多種,常見的包括以下幾種:
主從復(fù)制(Master-Slave Replication)是一種常見的MySQL高可用方案,主要用于數(shù)據(jù)讀寫分離、備份、故障恢復(fù)等場景。以下是適合的業(yè)務(wù)場景和實現(xiàn)步驟的詳細(xì)介紹。
my.cnf
或my.ini
(路徑根據(jù)系統(tǒng)不同有所差異,一般在/etc/my.cnf
或/etc/mysql/my.cnf
)。 [mysqld]
# 開啟二進(jìn)制日志 (Master必須開啟)
log-bin=mysql-bin
# 設(shè)置server-id,確保在集群中唯一
server-id=1
# 設(shè)置binlog格式,推薦ROW
binlog_format=ROW
# 可選:限制binlog大小
max_binlog_size=100M
# 可選:保留二進(jìn)制日志的天數(shù)
expire_logs_days=7
在修改配置文件后,需要重啟MySQL服務(wù)以使配置生效:
sudo systemctl restart mysqld
在主庫上為從庫創(chuàng)建一個專門用于復(fù)制的用戶,并授予復(fù)制權(quán)限:
CREATE USER 'replica'@'192.168.1.101' IDENTIFIED BY 'replica_password';
GRANT REPLICATION SLAVE ON *.* TO 'replica'@'192.168.1.101';
FLUSH PRIVILEGES;
由于復(fù)制需要基于二進(jìn)制日志來同步數(shù)據(jù),所以需要鎖定表來確保數(shù)據(jù)的一致性:
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
運行SHOW MASTER STATUS;
命令后,MySQL會返回類似如下信息:
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 120 | | |
+------------------+----------+--------------+------------------+
記錄下File
和Position
的值,例如:mysql-bin.000001
和 120
。它們將在配置從庫時使用。
使用mysqldump
進(jìn)行全量備份,將數(shù)據(jù)導(dǎo)出并導(dǎo)入從庫:
mysqldump -u root -p --all-databases --master-data > master_backup.sql
完成備份后,解除數(shù)據(jù)庫鎖定:
UNLOCK TABLES;
my.cnf
或my.ini
。 [mysqld]
# 設(shè)置server-id,確保在集群中唯一
server-id=2
# 從庫不需要開啟二進(jìn)制日志,除非需要級聯(lián)復(fù)制
log-bin=mysql-slave-bin
# 其他可選配置
relay-log=relay-bin
使配置生效:
sudo systemctl restart mysqld
將在主庫導(dǎo)出的備份文件導(dǎo)入到從庫:
mysql -u root -p < master_backup.sql
使用主庫的二進(jìn)制日志文件名和位置,配置從庫的復(fù)制:
CHANGE MASTER TO
MASTER_HOST='192.168.1.100',
MASTER_USER='replica',
MASTER_PASSWORD='replica_password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=120;
配置完成后,啟動從庫的復(fù)制進(jìn)程:
START SLAVE;
通過以下命令查看從庫的復(fù)制狀態(tài):
SHOW SLAVE STATUS\G;
需要確認(rèn)以下兩個字段為Yes
,表明復(fù)制正常運行:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
AbstractRoutingDataSource
來根據(jù)操作類型選擇不同的數(shù)據(jù)庫連接。Seconds_Behind_Master
字段監(jiān)控從庫的延遲,確保數(shù)據(jù)同步及時。 STOP SLAVE;
RESET SLAVE ALL;
主從復(fù)制可以為讀多寫少的業(yè)務(wù)場景提供一個簡單而有效的解決方案,既提升了讀操作的性能,也增強(qiáng)了數(shù)據(jù)庫的可靠性。
半同步復(fù)制(Semi-Synchronous Replication)是介于異步復(fù)制和全同步復(fù)制之間的一種高可用方案。它在寫操作時不僅要求主庫將數(shù)據(jù)寫入二進(jìn)制日志文件,還要求至少一個從庫確認(rèn)收到數(shù)據(jù)后,主庫才認(rèn)為提交成功。相比異步復(fù)制,它提供了更好的數(shù)據(jù)一致性保障,但又不像全同步復(fù)制那樣帶來較大的性能開銷。以下將詳細(xì)介紹它的適用業(yè)務(wù)場景和具體實現(xiàn)步驟。
192.168.1.100
,從庫的IP為192.168.1.101
。my.cnf
或my.ini
。 [mysqld]
# 啟用二進(jìn)制日志(必須開啟)
log-bin=mysql-bin
# 設(shè)置server-id,必須在主從庫中唯一
server-id=1
# 設(shè)置binlog格式,推薦ROW格式
binlog_format=ROW
# 啟用半同步復(fù)制的插件
plugin-load=rpl_semi_sync_master=semisync_master.so
# 啟用半同步復(fù)制,并設(shè)置半同步超時時間
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=10000 # 以毫秒為單位,超時時間為10秒
sudo systemctl restart mysqld
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled = 1;
REPLICATION SLAVE
權(quán)限: CREATE USER 'replica'@'192.168.1.101' IDENTIFIED BY 'replica_password';
GRANT REPLICATION SLAVE ON *.* TO 'replica'@'192.168.1.101';
FLUSH PRIVILEGES;
SHOW VARIABLES LIKE 'rpl_semi_sync%';
確認(rèn)rpl_semi_sync_master_enabled
為ON
。
my.cnf
或my.ini
: [mysqld]
# 設(shè)置server-id,確保唯一
server-id=2
# 啟用半同步復(fù)制的插件
plugin-load=rpl_semi_sync_slave=semisync_slave.so
# 啟用半同步復(fù)制
rpl_semi_sync_slave_enabled=1
sudo systemctl restart mysqld
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
CHANGE MASTER TO
MASTER_HOST='192.168.1.100',
MASTER_USER='replica',
MASTER_PASSWORD='replica_password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=120;
這里的MASTER_LOG_FILE
和MASTER_LOG_POS
的值可以從主庫上通過SHOW MASTER STATUS
獲得。
START SLAVE;
Slave_IO_Running
和Slave_SQL_Running
為Yes
: SHOW SLAVE STATUS\G;
SHOW STATUS LIKE 'Rpl_semi_sync_master%';
關(guān)鍵字段:
Rpl_semi_sync_master_status
: ON
表示主庫啟用了半同步復(fù)制。Rpl_semi_sync_master_clients
: 表示當(dāng)前確認(rèn)半同步復(fù)制的從庫數(shù)量。 SHOW STATUS LIKE 'Rpl_semi_sync_slave%';
關(guān)鍵字段:
Rpl_semi_sync_slave_status
: ON
表示從庫啟用了半同步復(fù)制。rpl_semi_sync_master_timeout
控制主庫等待從庫確認(rèn)的超時時間。默認(rèn)值是10秒,如果從庫在該時間內(nèi)未響應(yīng),主庫將退回到異步模式,繼續(xù)執(zhí)行寫操作。通過配置半同步復(fù)制,業(yè)務(wù)可以在數(shù)據(jù)安全性與性能之間找到一個較好的平衡。它適用于對數(shù)據(jù)一致性要求高,但又不想完全犧牲性能的場景,是金融、銀行等關(guān)鍵業(yè)務(wù)系統(tǒng)中的常見選擇
Galera Cluster是一種基于多主(Multi-master)復(fù)制的高可用數(shù)據(jù)庫集群方案,提供了高并發(fā)、高可用性、強(qiáng)一致性和容錯能力。它允許多個節(jié)點同時進(jìn)行讀寫操作,并確保所有節(jié)點的數(shù)據(jù)一致性。下面詳細(xì)介紹它適合的業(yè)務(wù)場景以及實現(xiàn)步驟。
ntp
或chrony
服務(wù)來保持各節(jié)點時間的一致性。 sudo apt-get update
sudo apt-get install mariadb-server
sudo apt-get install galera-4
my.cnf
(路徑可能是/etc/mysql/my.cnf
或/etc/my.cnf
,根據(jù)系統(tǒng)的不同有所差異)。[mysqld]
部分添加以下配置: [mysqld]
# 服務(wù)器唯一ID
server-id=1
# 開啟二進(jìn)制日志(但Galera不使用它,兼容性需求)
log-bin
# 在所有節(jié)點啟用同步復(fù)制功能
binlog_format=ROW
# 必須啟用的選項
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
innodb_flush_log_at_trx_commit=0
# 啟用Galera同步協(xié)議
wsrep_on=ON
# 連接到集群的URL
wsrep_cluster_address="gcomm://192.168.1.101,192.168.1.102,192.168.1.103"
# 指定Galera庫
wsrep_provider=/usr/lib/galera/libgalera_smm.so
# 集群名稱,所有節(jié)點應(yīng)保持一致
wsrep_cluster_name="my_galera_cluster"
# 節(jié)點名稱,確保在集群中唯一
wsrep_node_name="node1"
# 節(jié)點的IP地址
wsrep_node_address="192.168.1.101"
# 數(shù)據(jù)庫用戶名和密碼,供節(jié)點間認(rèn)證使用
wsrep_sst_auth="sst_user:sst_password"
# SST(State Snapshot Transfer)時使用的方式
wsrep_sst_method=rsync # 可選擇rsync或xtrabackup
server-id
、wsrep_node_name
和wsrep_node_address
,以保證每個節(jié)點的配置唯一。 CREATE USER 'sst_user'@'%' IDENTIFIED BY 'sst_password';
GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'sst_user'@'%';
FLUSH PRIVILEGES;
可以使用以下命令開放這些端口:
sudo ufw allow 3306/tcp
sudo ufw allow 4567/tcp
sudo ufw allow 4568/tcp
sudo ufw allow 4444/tcp
sudo galera_new_cluster
sudo systemctl start mysql
SHOW STATUS LIKE 'wsrep_cluster_size';
如果一切順利,wsrep_cluster_size
的值應(yīng)該為3,表示集群中有3個節(jié)點。
wsrep_cluster_size
: 當(dāng)前集群的節(jié)點數(shù)。wsrep_cluster_status
: 應(yīng)為Primary
,表示集群處于正常狀態(tài)。wsrep_ready
: 應(yīng)為ON
,表示節(jié)點可以處理請求。Galera Cluster 是一種適用于高可用、高一致性、高并發(fā)讀寫業(yè)務(wù)場景的數(shù)據(jù)庫集群解決方案。通過多主節(jié)點和同步復(fù)制機(jī)制,Galera能夠確保數(shù)據(jù)的一致性和集群的高可用性,特別適合那些對數(shù)據(jù)一致性要求高且需要處理大量讀寫請求的業(yè)務(wù)。
噢了,現(xiàn)在你可以成功部署一個穩(wěn)定、高效的Galera Cluster,滿足大規(guī)模、跨地域、高一致性業(yè)務(wù)場景的需求。
MySQL Group Replication是MySQL 5.7及以上版本提供的一種原生高可用性解決方案。它采用多主復(fù)制的架構(gòu),支持強(qiáng)一致性和高可用性。以下是MySQL Group Replication適合的業(yè)務(wù)場景,以及具體的實現(xiàn)步驟。
ntp
或chrony
確保所有節(jié)點的系統(tǒng)時間一致。 sudo apt-get update
sudo apt-get install mysql-server
mysql --version
my.cnf
(路徑通常是/etc/mysql/my.cnf
或/etc/my.cnf
)。[mysqld]
部分添加以下配置: [mysqld]
server-id=1 # 每個節(jié)點的唯一ID,依次為1, 2, 3
log_bin=binlog # 啟用二進(jìn)制日志
binlog_format=ROW # 設(shè)置二進(jìn)制日志格式為ROW
gtid_mode=ON # 啟用GTID
enforce-gtid-consistency=true # 強(qiáng)制GTID一致性
transaction_write_set_extraction=FULL # 設(shè)置事務(wù)寫集提取為FULL
# 啟用Group Replication
plugin-load=group_replication.so # 加載Group Replication插件
group_replication_group_name="aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee" # 設(shè)置組的UUID
group_replication_start_on_boot=on # 啟動時自動啟動Group Replication
group_replication_ssl_mode=DISABLED # 禁用SSL(如需使用SSL,可更改配置)
group_replication_group_seeds="192.168.1.101:33061,192.168.1.102:33061,192.168.1.103:33061" # 所有節(jié)點的地址
group_replication_local_address="192.168.1.101:33061" # 當(dāng)前節(jié)點的地址(根據(jù)實際節(jié)點修改)
server-id
唯一,并修改group_replication_local_address
。 CREATE USER 'repl_user'@'%' IDENTIFIED BY 'repl_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
FLUSH PRIVILEGES;
可以使用以下命令開放這些端口:
sudo ufw allow 3306/tcp
sudo ufw allow 33061/tcp
sudo systemctl start mysql
START GROUP REPLICATION;
SELECT * FROM performance_schema.replication_group_members;
SHOW STATUS LIKE 'group_replication%';
group_replication_members
: 集群中節(jié)點的數(shù)量。group_replication_state
: 集群狀態(tài),正常情況下應(yīng)為ONLINE
。group_replication_primary_member
: 當(dāng)前主節(jié)點的ID。 STOP GROUP REPLICATION;
START GROUP REPLICATION;
MySQL Group Replication是一種非常靈活且強(qiáng)大的高可用性解決方案,適合高可用性、高一致性和高并發(fā)的業(yè)務(wù)場景。通過簡單的配置和管理,企業(yè)可以快速部署一個高效且可靠的數(shù)據(jù)庫集群,確保業(yè)務(wù)連續(xù)性和數(shù)據(jù)安全。
MySQL InnoDB Cluster是MySQL 5.7及以上版本提供的一個集成高可用性解決方案。它結(jié)合了MySQL Group Replication、MySQL Shell和MySQL Router,為用戶提供了一個簡化的部署和管理高可用集群的方式。以下是MySQL InnoDB Cluster適合的業(yè)務(wù)場景,以及具體的實現(xiàn)步驟。
ntp
或chrony
確保所有節(jié)點的系統(tǒng)時間一致。在每個節(jié)點上安裝MySQL(5.7或以上版本)。以Ubuntu為例,安裝命令如下:
sudo apt-get update
sudo apt-get install mysql-server
MySQL Shell是InnoDB Cluster的管理工具,安裝命令如下:
sudo apt-get install mysql-shell
MySQL Router是用于應(yīng)用程序和InnoDB Cluster之間的連接中介,安裝命令如下:
sudo apt-get install mysql-router
在每個節(jié)點上編輯MySQL配置文件my.cnf
(路徑通常是/etc/mysql/my.cnf
或/etc/my.cnf
)。
在[mysqld]
部分添加以下配置:
[mysqld]
server-id=1 # 每個節(jié)點的唯一ID,依次為1, 2, 3
log_bin=binlog # 啟用二進(jìn)制日志
binlog_format=ROW # 設(shè)置二進(jìn)制日志格式為ROW
gtid_mode=ON # 啟用GTID
enforce-gtid-consistency=true # 強(qiáng)制GTID一致性
transaction_write_set_extraction=FULL # 設(shè)置事務(wù)寫集提取為FULL
# InnoDB Cluster配置
plugin-load=group_replication.so # 加載Group Replication插件
group_replication_group_name="aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee" # 設(shè)置組的UUID
group_replication_start_on_boot=on # 啟動時自動啟動Group Replication
group_replication_ssl_mode=DISABLED # 禁用SSL(如需使用SSL,可更改配置)
group_replication_group_seeds="192.168.1.101:33061,192.168.1.102:33061,192.168.1.103:33061" # 所有節(jié)點的地址
group_replication_local_address="192.168.1.101:33061" # 當(dāng)前節(jié)點的地址(根據(jù)實際節(jié)點修改)
server-id
唯一,并修改group_replication_local_address
。在每個節(jié)點上創(chuàng)建用于InnoDB Cluster的復(fù)制用戶:
CREATE USER 'repl_user'@'%' IDENTIFIED BY 'repl_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
FLUSH PRIVILEGES;
確保集群節(jié)點間的通信端口是開放的,主要端口包括:
可以使用以下命令開放這些端口:
sudo ufw allow 3306/tcp
sudo ufw allow 33061/tcp
在每個節(jié)點上啟動MySQL服務(wù):
sudo systemctl start mysql
mysqlsh --uri root@192.168.1.101
\sql
var cluster = dba.createCluster('myCluster');
cluster.addInstance('repl_user@192.168.1.102:3306');
cluster.addInstance('repl_user@192.168.1.103:3306');
cluster.status();
mysqlrouter --bootstrap repl_user@192.168.1.101:3306 --user=mysqlrouter
/etc/mysqlrouter/mysqlrouter.conf
,可以根據(jù)需要進(jìn)行修改。 cluster.status();
cluster.addInstance('repl_user@192.168.1.102:3306');
MySQL InnoDB Cluster是一個強(qiáng)大且靈活的高可用性解決方案,適合高可用性、高一致性和高并發(fā)的業(yè)務(wù)場景。通過簡單的配置和管理,企業(yè)可以快速部署一個高效且可靠的數(shù)據(jù)庫集群,確保業(yè)務(wù)連續(xù)性和數(shù)據(jù)安全。
Percona XtraDB Cluster (PXC)是一個基于MySQL和Galera庫的高可用性解決方案,提供多主集群的特性。它支持強(qiáng)一致性、自動故障轉(zhuǎn)移和擴(kuò)展性。以下是Percona XtraDB Cluster適合的業(yè)務(wù)場景,以及具體的實現(xiàn)步驟。
假設(shè)我們要搭建一個包含3個節(jié)點的Percona XtraDB Cluster,節(jié)點IP如下:
ntp
或chrony
確保所有節(jié)點的系統(tǒng)時間一致。在每個節(jié)點上安裝Percona Server。以Ubuntu為例,安裝命令如下:
sudo apt-get update
sudo apt-get install percona-server-server-5.7
在每個節(jié)點上安裝Galera庫:
sudo apt-get install percona-xtradb-cluster-galera
在每個節(jié)點上編輯MySQL配置文件my.cnf
(路徑通常是/etc/mysql/my.cnf
或/etc/my.cnf
)。
在[mysqld]
部分添加以下配置:
[mysqld]
server-id=1 # 每個節(jié)點的唯一ID,依次為1, 2, 3
log_bin=binlog # 啟用二進(jìn)制日志
binlog_format=ROW # 設(shè)置二進(jìn)制日志格式為ROW
default-storage-engine=InnoDB # 設(shè)置默認(rèn)存儲引擎為InnoDB
innodb_flush_log_at_trx_commit=1 # 每次事務(wù)提交后將日志刷新到磁盤
innodb_file_per_table=ON # 為每個表使用單獨的表空間
innodb_buffer_pool_size=1G # 根據(jù)實際情況調(diào)整緩沖池大小
# Galera配置
wsrep_provider=/usr/lib/galera/libgalera_smm.so # Galera庫路徑
wsrep_cluster_name="my_cluster" # 設(shè)置集群名稱
wsrep_cluster_address="gcomm://192.168.1.101,192.168.1.102,192.168.1.103" # 所有節(jié)點的地址
wsrep_node_address="192.168.1.101" # 當(dāng)前節(jié)點的地址(根據(jù)實際節(jié)點修改)
wsrep_node_name="node1" # 當(dāng)前節(jié)點的名稱
wsrep_sst_method=rsync # 設(shè)置狀態(tài)快照傳輸方法
server-id
唯一,并修改wsrep_node_address
和wsrep_node_name
。在每個節(jié)點上創(chuàng)建用于集群的復(fù)制用戶:
CREATE USER 'repl_user'@'%' IDENTIFIED BY 'repl_password';
GRANT ALL PRIVILEGES ON *.* TO 'repl_user'@'%';
FLUSH PRIVILEGES;
確保集群節(jié)點間的通信端口是開放的,主要端口包括:
可以使用以下命令開放這些端口:
sudo ufw allow 3306/tcp
sudo ufw allow 4567/tcp
sudo ufw allow 9200/tcp
在第一個節(jié)點上啟動MySQL服務(wù):
sudo systemctl start mysql
由于這是第一個節(jié)點,因此它將自動初始化集群。
在第二個節(jié)點和第三個節(jié)點上,首先以gcomm://
開頭啟動服務(wù)以加入集群:
sudo systemctl stop mysql # 停止MySQL服務(wù)
sudo galera_new_cluster # 初始化Galera集群
然后啟動第二個節(jié)點和第三個節(jié)點:
sudo systemctl start mysql
在任意一個節(jié)點上,運行以下命令以檢查集群狀態(tài):
SHOW STATUS LIKE 'wsrep_cluster_size';
此命令將返回集群中節(jié)點的數(shù)量,確保所有節(jié)點都已成功加入集群。
SHOW STATUS LIKE 'wsrep_connected';
返回值應(yīng)為ON
,表示節(jié)點已連接。
SHOW STATUS LIKE 'wsrep%';
關(guān)鍵字段包括:
wsrep_cluster_size
:集群中節(jié)點的數(shù)量。wsrep_ready
:表示節(jié)點是否準(zhǔn)備好進(jìn)行寫操作。wsrep_connected
:表示節(jié)點是否連接到集群。 sudo systemctl stop mysql # 停止MySQL服務(wù)
sudo galera_new_cluster # 初始化Galera集群
sudo systemctl start mysql # 啟動MySQL服務(wù)
Percona XtraDB Cluster是一個強(qiáng)大且靈活的高可用性解決方案,適合高可用性、高一致性和高并發(fā)的業(yè)務(wù)場景。通過簡單的配置和管理,企業(yè)可以快速部署一個高效且可靠的數(shù)據(jù)庫集群,確保業(yè)務(wù)連續(xù)性和數(shù)據(jù)安全。
以上6種高可用方案詳解,希望可以幫助小伙伴們,歡迎關(guān)注威哥愛編程,插播一下,服票大漲,會意味著大環(huán)境將走出低迷嗎?
更多建議: