最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mysql8.0.43使用InnoDB?Cluster配置主從復(fù)制

 更新時(shí)間:2025年09月29日 10:56:31   作者:yj1414158414  
本文主要介紹了mysql8.0.43使用InnoDB?Cluster配置主從復(fù)制,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

InnoDB Cluster,顧名思義只有InnoDB引擎可以使用。服務(wù)器內(nèi)存盡量4G,2G完全不夠。本文是單主模式,用到的mysql請(qǐng)自行安裝

地址名稱說(shuō)明
192.168.157.114:3306mysql_master主數(shù)據(jù)庫(kù)
192.168.157.115:3306mysql_slave1從庫(kù)1
192.168.157.116:3306mysql_slave2從庫(kù)2

1、配置Hosts解析(所有服務(wù)器都要執(zhí)行)

vim /etc/hosts
#輸入以下內(nèi)容
192.168.157.114  mysql_master
192.168.157.115  mysql_slave1
192.168.157.116  mysql_slave2

2、安裝mysql shell(所有服務(wù)器都要執(zhí)行)

下載地址:https://downloads.mysql.com/archives/shell/ 需要注意linux系統(tǒng)版本和mysql的版本

3、安裝mysql shell(所有服務(wù)器都要執(zhí)行)

#使用命令下載
mkdir -p /etc/mysql/shell
cd /etc/mysql/shell
#這個(gè)版本號(hào)根據(jù)mysql的版本來(lái),我mysql是8.0.43,但是沒找到shell的8.0.43版本
wget https://downloads.mysql.com/archives/get/p/43/file/mysql-shell-8.0.42-1.el7.x86_64.rpm
#安裝
rpm -ivh mysql-shell-8.0.42-1.el7.x86_64.rpm 
#驗(yàn)證是否安裝成功
mysqlsh --version

4、修改mysql配置文件(所有服務(wù)器都要執(zhí)行)

1、下面配置項(xiàng)的前綴loose-是mysql官方推薦的寫法,所有屬于可動(dòng)態(tài)加載插件(Plugin)的參數(shù),而不是MySQL服務(wù)器核心(Server Core)的參數(shù),都需要加 loose- 前綴。具體有哪些內(nèi)容是插件請(qǐng)自行百度

2、可以使用openssl 命令生成證書文件,生成命令在文末補(bǔ)充

# vim /etc/my.cnf 打開文件進(jìn)入編輯模式,配置下面的內(nèi)容,注意不要把你自己的配置替換了

[mysqld]
#設(shè)置binlog文件名稱
log-bin=mysql-log-bin

#設(shè)置數(shù)據(jù)庫(kù)唯一id(每個(gè)節(jié)點(diǎn)都不一樣)
server-id=1   
 
#禁用除InnoDB引擎外的所有引擎。不然group_replication一直不成功
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY,CSV"

#mysql 插件地址,這個(gè)地址必須配置,不然找不到組復(fù)制插件。
#通常為 /usr/local/mysql/lib64/mysql/plugin/(官方二進(jìn)制安裝)或 /usr/lib64/mysql/plugin/(包管理器安裝,如 yum/dnf)
#實(shí)在是不知道地址在哪,就登錄mysql執(zhí)行 SHOW VARIABLES LIKE 'plugin_dir';
plugin_dir = '/usr/lib64/mysql/plugin'

#加載組復(fù)制插件,完整路徑是/usr/lib64/mysql/plugin/group_replication.so
plugin_load_add = 'group_replication.so' 

#SSL加密方式。REQUIRED  強(qiáng)制加密,DISABLED禁用加密(生產(chǎn)環(huán)境慎用)
loose-group_replication_ssl_mode = REQUIRED  
 
#組復(fù)制集群名稱,可以任意定義。 推薦自己生成UUID
loose-group_replication_group_name='ce492252-9ae0-11ed-94c7-00163e0c22d4'

#指定 Binlog 的記錄格式為ROW。
#STATEMENT:每一次更改生成sql,從庫(kù)直接執(zhí)行sql,文件最小但數(shù)據(jù)一致性可能無(wú)法保證
#ROW:將主庫(kù)的行級(jí)變動(dòng)保存到binlog,從庫(kù)直接更改數(shù)據(jù)而非執(zhí)行sql。文件大,但數(shù)據(jù)一致性最好。一般使用ROW(多主模式必用)
#MIXED:優(yōu)先使用STATEMENT模式,出現(xiàn)了不安全的sql(隨機(jī)數(shù)、自增主鍵等)自動(dòng)切換到ROW。
binlog_format = ROW 

#開啟GTID。GTID格式:數(shù)據(jù)庫(kù)唯一Id:事務(wù)Id
gtid_mode = ON 

# 強(qiáng)制所有事務(wù)使用 GTID
enforce-gtid-consistency = ON  

#開啟MySQL重啟時(shí)快速恢復(fù) GTID 狀態(tài)。
#比如一個(gè)自動(dòng)處理快遞單號(hào)的程序,執(zhí)行到ID=1000的時(shí)候崩潰了,設(shè)置為ON的時(shí)候在重啟之后自動(dòng)從1000開始,而不是1-1000再處理一次
binlog_gtid_simple_recovery = ON

#控制每隔多少事務(wù)清理一次GTID數(shù)據(jù)。
#數(shù)據(jù)存放于mysql.gtid_executed表,默認(rèn)的是1000,可以自行調(diào)整或者不要此參數(shù)
#如果每秒1萬(wàn)的事務(wù),可以設(shè)置大一點(diǎn),比如10000,如果每秒就一兩百,則可以設(shè)小一點(diǎn),比如100。很多項(xiàng)目都沒達(dá)到每秒100的事務(wù),除非搶購(gòu)這種
gtid_executed_compression_period = 1000

#組復(fù)制中控制新節(jié)點(diǎn)引導(dǎo)過(guò)程的“寬松開關(guān)”(第一個(gè)節(jié)點(diǎn)必須是ON,后續(xù)節(jié)點(diǎn)必須是OFF)
#ON:簡(jiǎn)化擴(kuò)容和恢復(fù)操作,自動(dòng)選擇引導(dǎo)源并容忍短暫不一致,保證最終一致
#OFF:嚴(yán)格依賴手動(dòng)配置引導(dǎo)源,適用于初始組形成或需要強(qiáng)一致性的場(chǎng)景。
loose-group_replication_bootstrap_group = OFF 
 
#MySQL 啟動(dòng)時(shí)自動(dòng)加入組復(fù)制集群(一般都需要設(shè)置ON,設(shè)置OFF只有手動(dòng)加入集群,生產(chǎn)環(huán)境ON)
loose-group_replication_start_on_boot = ON 

#禁用組復(fù)制自動(dòng)獲取安全證書(生產(chǎn)環(huán)境推薦OFF),設(shè)置為ON則加入新節(jié)點(diǎn)之后自動(dòng)從集群中獲取公鑰文件
#如果設(shè)置ON則必須保證已經(jīng)生成了證書文件,可以使用openssl 命令生成。生成命令在文末補(bǔ)充
loose-group_replication_recovery_get_public_key = OFF 

# 配置SSL/TLS,用于常規(guī)客戶端連接和組復(fù)制通信(group_replication_recovery_get_public_key=OFF必須配置)
ssl_ca = /etc/mysql/ssl/ca.pem
ssl_cert = /etc/mysql/ssl/server-cert.pem
ssl_key = /etc/mysql/ssl/server-key.pem

# 配置恢復(fù)通道專用的SSL認(rèn)證(group_replication_recovery_get_public_key=OFF必須配置)
# 指定恢復(fù)通道信任的CA(與上面用的同一個(gè)CA)
loose-group_replication_recovery_ssl_ca = /etc/mysql/ssl/ca.pem
# 指定恢復(fù)用戶(repl)使用的客戶端證書和私鑰(group_replication_recovery_get_public_key=OFF必須配置)
loose-group_replication_recovery_ssl_cert = /etc/mysql/ssl/client-cert.pem
loose-group_replication_recovery_ssl_key = /etc/mysql/ssl/client-key.pem

#  強(qiáng)制恢復(fù)通道使用SSL(group_replication_recovery_get_public_key=OFF必須配置)
loose-group_replication_recovery_use_ssl = ON

# 允許加入集群的 IP 地址段
loose-group_replication_ip_whitelist = 192.168.157.0/24  

# 本機(jī)ip地址+組復(fù)制端口(每個(gè)節(jié)點(diǎn)都不一樣)
loose-group_replication_local_address = "192.168.157.114:33061" 

# 所有參與主從復(fù)制的mysql ip地址+組復(fù)制端口。如果有新的節(jié)點(diǎn)加入就會(huì)先從他自己的配置文件查找集群中的主機(jī),然后加入,并不依賴于他的靜態(tài)配置。他找到的這個(gè)主機(jī)就像一個(gè)介紹者一樣,引導(dǎo)新的節(jié)點(diǎn)加入
loose-group_replication_group_seeds = "192.168.157.114:33061,192.168.157.115:33061,192.168.157.116:33061"  

#是否啟用 單主模式(默認(rèn)是單主模式) 
#單主模式會(huì)由節(jié)點(diǎn)自動(dòng)選舉出一個(gè)主節(jié)點(diǎn),這也是為什么節(jié)點(diǎn)集群數(shù)量必須是奇數(shù)的原因,因?yàn)槿绻桥紨?shù)可能存在1對(duì)1或2對(duì)2的情況
loose-group_replication_single_primary_mode = ON  

# 控制數(shù)據(jù)一致性檢查,多主模式時(shí)開啟 
loose-group_replication_enforce_update_everywhere_checks = OFF  

#組復(fù)制節(jié)點(diǎn)數(shù)量。在mysql 8.0.16僅版本之前僅當(dāng)group_replication_single_primary_mode = OFF時(shí)使用,最好是奇數(shù)。
#8.0.16+這個(gè)字段就是只讀的,系統(tǒng)自動(dòng)維護(hù),但是可以查詢SHOW GLOBAL VARIABLES LIKE 'group_replication_group_size';
#loose-group_replication_group_size = 3   
  
#消息緩存大小,根據(jù)服務(wù)器配置設(shè)置。
#組復(fù)制中,節(jié)點(diǎn)需要頻繁交換事務(wù)日志(Binlog)、心跳包、元數(shù)據(jù)(如 GTID 集合)等消息。
#為了避免頻繁讀寫磁盤(降低性能),節(jié)點(diǎn)會(huì)將部分消息暫存到內(nèi)存緩存中,待合適時(shí)機(jī)再寫入磁盤或發(fā)送給其他節(jié)點(diǎn)。
loose-group_replication_message_cache_size = 1073741824  # 1GB(1024 * 1024 * 1024 字節(jié))

#消息壓縮閾值。當(dāng)節(jié)點(diǎn)間傳輸?shù)南⒋笮〕^(guò)該閾值時(shí),MySQL 會(huì)自動(dòng)對(duì)消息進(jìn)行壓縮,減少網(wǎng)絡(luò)帶寬消耗,會(huì)額外占用CPU
#如果系統(tǒng)內(nèi)部大多是一般的insert 語(yǔ)句,可以設(shè)置小一點(diǎn)??梢詼p少壓縮時(shí)候CPU消耗,因?yàn)榭赡苓_(dá)不到壓縮的閾值
loose-group_replication_compression_threshold = 1048576  # 1MB(1024 * 1024 字節(jié))
 

修改完之后重啟master、slave1、slave2:systemctl restart mysqld

5、設(shè)置證書文件權(quán)限(所有服務(wù)器都要執(zhí)行)

# 確保證書文件所有權(quán)為 mysql 用戶(或 MySQL 運(yùn)行用戶)
sudo chown mysql:mysql /etc/mysql/ssl/ca.pem
sudo chown mysql:mysql /etc/mysql/ssl/server-cert.pem
sudo chown mysql:mysql /etc/mysql/ssl/server-key.pem

# 私鑰文件權(quán)限需嚴(yán)格限制(僅 mysql 用戶可讀)
sudo chmod 600 /etc/mysql/ssl/server-key.pem
# 公鑰和 CA 證書可讀(644)
sudo chmod 644 /etc/mysql/ssl/ca.pem
sudo chmod 644 /etc/mysql/ssl/server-cert.pem

6、設(shè)置root賬戶具有組復(fù)制的權(quán)限(所有服務(wù)器都要執(zhí)行)

#登錄mysql之后執(zhí)行,root是用戶名,%代表允許所有地址連接,localhost代表允許本地連接,ip代表允許特定ip連接
GRANT 
    CLONE_ADMIN, 
    CONNECTION_ADMIN, 
    GROUP_REPLICATION_ADMIN, 
    PERSIST_RO_VARIABLES_ADMIN, 
    REPLICATION_APPLIER, 
    REPLICATION_SLAVE_ADMIN, 
    ROLE_ADMIN, 
    SYSTEM_VARIABLES_ADMIN 
ON *.* 
TO 'root'@'%' 
WITH GRANT OPTION;

FLUSH PRIVILEGES; 

7、創(chuàng)建集群(master操作)

#1、登錄mysql shell
mysqlsh root@192.168.157.114:3306  #然后輸入密碼
#2、進(jìn)入mysql shell命令行之后執(zhí)行
dba.configureInstance() #會(huì)有一個(gè)確認(rèn)框,輸入y回車
#輸出如下就代表成功
MySQL  192.168.157.114:3306 ssl  JS > dba.configureInstance()
Configuring local MySQL instance listening at port 3306 for use in an InnoDB cluster...

This instance reports its own address as mysql_master:3306
Clients and other cluster members will communicate with it through this address by default. If this is not correct, the report_host MySQL system variable should be changed.

applierWorkerThreads will be set to the default value of 4.

The instance 'mysql_master:3306' is valid to be used in an InnoDB cluster.
The instance 'mysql_master:3306' is already ready to be used in an InnoDB cluster.

Successfully enabled parallel appliers.  

#3、創(chuàng)建集群,mysql_group_replication_cluster_0001是集群的名稱,任意輸入 
var cluster = dba.createCluster('mysql_group_replication_cluster_0001');
#輸出以下內(nèi)容就是成功。
#如果退出了mysql shell,再次進(jìn)入就需要var cluster = dba.getCluster("集群名稱");才能獲取到對(duì)應(yīng)的集群,然后才可以使用cluster.status();查看集群狀態(tài)
MySQL  192.168.157.114:3306 ssl  JS > var cluster = dba.createCluster('mysql_group_replication_cluster_0001')
A new InnoDB Cluster will be created on instance 'mysql_master:3306'.

Validating instance configuration at 192.168.157.114:3306...

This instance reports its own address as mysql_master:3306

Instance configuration is suitable.
NOTE: Group Replication will communicate with other members using 'mysql_master:3306'. Use the localAddress option to override.

* Checking connectivity and SSL configuration...

Creating InnoDB Cluster 'mysql_group_replication_cluster_0001' on 'mysql_master:3306'...

Adding Seed Instance...
Cluster successfully created. Use Cluster.addInstance() to add MySQL instances.
At least 3 instances are needed for the cluster to be able to withstand up to
one server failure.

創(chuàng)建完主節(jié)點(diǎn)之后,必須進(jìn)入mysql命令行執(zhí)行SET GLOBAL group_replication_bootstrap_group=OFF;(不能直接改配置文件)。接下來(lái)配置slave1和slave2

8、配置從庫(kù)(slave1和slave2操作)

#1、確保loose-group_replication_local_address=ip:端口
# 1.1、slave1的配置
loose-group_replication_local_address = "192.168.157.115:33061"
# 1.2、slave2的配置
loose-group_replication_local_address = "192.168.157.116:33061"

#2、確保service-id是唯一的
# 2.1、slave1的配置
server-id=2
# 2.2、slave2的配置 
server-id=3 

#3、確保loose-group_replication_bootstrap_group = OFF
loose-group_replication_bootstrap_group = OFF

#如果更改了配置,記得重啟mysql
systemctl restart mysqld
 
#檢查配置是否正確(mysql shell命令行執(zhí)行),如果輸出有錯(cuò)誤,按照提示修改就行,一定要確保slave1和slave2的 dba.configureInstance();輸出是正常的
dba.configureInstance();#可能會(huì)輸出WARNING,實(shí)際是已經(jīng)成功了

#正常輸出如下
Configuring local MySQL instance listening at port 3306 for use in an InnoDB cluster...

This instance reports its own address as mysql_master:3306
Clients and other cluster members will communicate with it through this address by default. If this is not correct, the report_host MySQL system variable should be changed.

applierWorkerThreads will be set to the default value of 4.

The instance 'mysql_master:3306' is valid to be used in an InnoDB cluster.
The instance 'mysql_master:3306' is already ready to be used in an InnoDB cluster.

Successfully enabled parallel appliers.  

9、slave1和slave2加入集群(master操作)

#mysql shell命令行執(zhí)行
var cluster = dba.getCluster('mysql_group_replication_cluster_0001')
#檢查新節(jié)點(diǎn)的狀態(tài),出現(xiàn)"reason": "new", "state": "ok" 就是可以加入集群
cluster.checkInstanceState('root@192.168.157.115:3306');  
#節(jié)點(diǎn)加入集群。recoveryMethod:定義如何從主節(jié)點(diǎn)獲取數(shù)據(jù),官方推薦clone;label:當(dāng)前實(shí)例的別名;interactive:禁用交互式反饋,自動(dòng)執(zhí)行命令
#輸出:The instance 'mysql_slave1:3306' was successfully added to the cluster.就代表成功
cluster.addInstance("root@192.168.157.115:3306",{recoveryMethod:"clone",label:"mysql_group_replication_slave1",interactive:false}) ;
#再查看當(dāng)前集群的狀態(tài)
cluster.status()
#輸出如下
{    "clusterName": "mysql_group_replication_cluster_0001", 
    "defaultReplicaSet": {
        "name": "default", 
        "primary": "mysql_master:3306", 
        "ssl": "REQUIRED", 
        "status": "OK_NO_TOLERANCE", 
        "statusText": "Cluster is NOT tolerant to any failures.", 
        "topology": {
            "mysql_group_replication_slave1": {
                "address": "mysql_slave1:3306", 
                "memberRole": "SECONDARY", 
                "mode": "R/O", 
                "readReplicas": {}, 
                "replicationLag": "applier_queue_applied", 
                "role": "HA", 
                "status": "ONLINE", 
                "version": "8.0.43"
            }, 
            "mysql_master:3306": {
                "address": "mysql_master:3306", 
                "memberRole": "PRIMARY", 
                "mode": "R/W", 
                "readReplicas": {}, 
                "replicationLag": "applier_queue_applied", 
                "role": "HA", 
                "status": "ONLINE", 
                "version": "8.0.43"
            }
        }, 
        "topologyMode": "Single-Primary"
    }, 
    "groupInformationSourceMember": "mysql_master:3306"
} 

到此slave1的配置就完成了,接下來(lái)只需要按照slave1的步驟把slave2配置好就行,最終在master節(jié)點(diǎn)使用cluster.status()命令輸出如下,“memberRole”: "PRIMARY"就是寫入節(jié)點(diǎn)。

MySQL  192.168.157.114:3306 ssl  JS > cluster.status()
{
    "clusterName": "mysql_group_replication_cluster_0001", 
    "defaultReplicaSet": {
        "name": "default", 
        "primary": "mysql_master:3306", 
        "ssl": "REQUIRED", 
        "status": "OK", 
        "statusText": "Cluster is ONLINE and can tolerate up to ONE failure.", 
        "topology": {
            "mysql_group_replication_slave1": {
                "address": "mysql_slave1:3306", 
                "memberRole": "SECONDARY", 
                "mode": "R/O", 
                "readReplicas": {}, 
                "replicationLag": "applier_queue_applied", 
                "role": "HA", 
                "status": "ONLINE", 
                "version": "8.0.43"
            }, 
            "mysql_group_replication_slave2": {
                "address": "mysql_slave2:3306", 
                "memberRole": "SECONDARY", 
                "mode": "R/O", 
                "readReplicas": {}, 
                "replicationLag": "applier_queue_applied", 
                "role": "HA", 
                "status": "ONLINE", 
                "version": "8.0.43"
            }, 
            "mysql_master:3306": {
                "address": "mysql_master:3306", 
                "memberRole": "PRIMARY", 
                "mode": "R/W", 
                "readReplicas": {}, 
                "replicationLag": "applier_queue_applied", 
                "role": "HA", 
                "status": "ONLINE", 
                "version": "8.0.43"
            }
        }, 
        "topologyMode": "Single-Primary"
    }, 
    "groupInformationSourceMember": "mysql_master:3306"
}

測(cè)試是否完成了主從同步:
1、在master節(jié)點(diǎn)新建數(shù)據(jù)庫(kù)my_test,看是否會(huì)同步到另外兩個(gè)節(jié)點(diǎn)去。
2、把slave2節(jié)點(diǎn)關(guān)機(jī),然后在主節(jié)點(diǎn)的my_test數(shù)據(jù)庫(kù)加一個(gè)test表,觀察是否同步到了slave1。
3、把slave2開機(jī),觀察是否同步了test表
注意:從屬節(jié)點(diǎn)禁止寫入數(shù)據(jù),可能會(huì)腦裂(主節(jié)點(diǎn)寫入數(shù)據(jù),從節(jié)點(diǎn)也寫入了數(shù)據(jù),就不知道到底哪個(gè)是真的),現(xiàn)在很多ORM框架都支持讀寫分離

補(bǔ)充內(nèi)容

1、生成SSL證書

#創(chuàng)建文件保存生成證書的腳本
mkdir -p /etc/mysql/ssl
cd /etc/mysql/ssl
vim generate_mgr_ssl.sh

復(fù)制粘貼以下內(nèi)容并保存

#!/bin/bash
set -e  # 設(shè)置腳本遇到任何錯(cuò)誤就立即退出,避免產(chǎn)生不一致的中間狀態(tài)

# ==================== 【第一部分:核心節(jié)點(diǎn)定義 - 必須修改】 ====================
# 定義mysql集群節(jié)點(diǎn)主機(jī)名稱 
NODES=("mysql_master" "mysql_slave1" "mysql_slave2")
# 定義與節(jié)點(diǎn)主機(jī)名對(duì)應(yīng)的IP地址。主機(jī)名和ip地址必須對(duì)應(yīng)
NODE_IPS=("192.168.157.114" "192.168.157.115" "192.168.157.116")

# ==================== 【第二部分:證書主題信息 - 建議修改】 ====================
# 設(shè)置證書的國(guó)家代碼。CN表示中國(guó),US表示美國(guó),JP表示日本等
COUNTRY_CODE="CN"
# 設(shè)置證書的省 
STATE_NAME="Chongqing"
# 設(shè)置證書的城市名稱 
CITY_NAME="Chongqing"
# 設(shè)置證書的組織名稱 
ORGANIZATION_NAME="mysql_group_replication_test"
# 設(shè)置CA證書的通用名稱(CA的標(biāo)識(shí)名) 
CA_COMMON_NAME="mysql_group_replication_test_ca"
# 設(shè)置客戶端證書的通用名稱 
CLIENT_COMMON_NAME="mysql_group_replication_test_client"

# ==================== 【第三部分:證書有效期和加密強(qiáng)度 - 按需修改】 ====================
# 設(shè)置證書的有效期(天) 
CERT_VALID_DAYS=3650
# 設(shè)置RSA密鑰的強(qiáng)度(位數(shù))。4096是當(dāng)前的安全標(biāo)準(zhǔn),2048也可用但安全性較低
RSA_KEY_BITS=4096
# ==================== 【第四部分:SAN擴(kuò)展配置 - 按需修改】 ====================
# 是否在服務(wù)器證書中包含環(huán)回地址127.0.0.1。本地連接測(cè)試,設(shè)置為true
INCLUDE_LOCALHOST=true
# 是否在服務(wù)器證書中包含主機(jī)名的DNS記錄。如果集群之間使用主機(jī)名進(jìn)行連接,設(shè)置為true
INCLUDE_DNS=true
# 是否在服務(wù)器證書中包含IP地址。如果集群之間使用ip進(jìn)行連接,設(shè)置為true
INCLUDE_IP=true

# ==================== 【腳本主體部分(通常不需要修改)】 ====================
echo "生成CA證書..."
openssl genrsa ${RSA_KEY_BITS} > ca-key.pem
openssl req -new -x509 -nodes -days ${CERT_VALID_DAYS} -key ca-key.pem -out ca.pem \
  -subj "/C=${COUNTRY_CODE}/ST=${STATE_NAME}/L=${CITY_NAME}/O=${ORGANIZATION_NAME}/CN=${CA_COMMON_NAME}"
  
# 創(chuàng)建初始序列號(hào)文件 
echo "01" > ca.srl

# 循環(huán)為每個(gè)節(jié)點(diǎn)生成服務(wù)器證書
for i in "${!NODES[@]}"; do
    NODE=${NODES[$i]}
    IP=${NODE_IPS[$i]}
    echo "為 $NODE ($IP) 生成服務(wù)器證書..."
    
    # 生成服務(wù)器私鑰
    openssl genrsa ${RSA_KEY_BITS} > server-${NODE}-key.pem
    
    # 創(chuàng)建證書簽名請(qǐng)求(CSR)
    openssl req -new -key server-${NODE}-key.pem -out server-${NODE}-req.pem \
      -subj "/C=${COUNTRY_CODE}/ST=${STATE_NAME}/L=${CITY_NAME}/O=${ORGANIZATION_NAME}/CN=${NODE}"
    
    # 創(chuàng)建SAN擴(kuò)展配置文件
    SAN_CONTENT=""
    if [ "$INCLUDE_DNS" = true ]; then
        SAN_CONTENT="DNS:${NODE}"
    fi
    
    if [ "$INCLUDE_IP" = true ]; then
        if [ -n "$SAN_CONTENT" ]; then
            SAN_CONTENT="${SAN_CONTENT}, IP:${IP}"
        else
            SAN_CONTENT="IP:${IP}"
        fi
    fi
    
    if [ "$INCLUDE_LOCALHOST" = true ]; then
        if [ -n "$SAN_CONTENT" ]; then
            SAN_CONTENT="${SAN_CONTENT}, IP:127.0.0.1"
        else
            SAN_CONTENT="IP:127.0.0.1"
        fi
    fi
    
    # 寫入擴(kuò)展配置文件
    cat > server-${NODE}-ext.cnf << EOF
subjectAltName = ${SAN_CONTENT}
extendedKeyUsage = serverAuth, clientAuth
EOF
    
    # 使用CA簽署服務(wù)器證書 - 添加 -CAcreateserial 參數(shù)
    openssl x509 -req -in server-${NODE}-req.pem -days ${CERT_VALID_DAYS} -CA ca.pem -CAkey ca-key.pem \
      -CAcreateserial -out server-${NODE}-cert.pem -extfile server-${NODE}-ext.cnf
done

echo "生成客戶端證書..."
# 生成客戶端私鑰
openssl genrsa ${RSA_KEY_BITS} > client-key.pem

# 創(chuàng)建客戶端證書簽名請(qǐng)求
openssl req -new -key client-key.pem -out client-req.pem \
  -subj "/C=${COUNTRY_CODE}/ST=${STATE_NAME}/L=${CITY_NAME}/O=${ORGANIZATION_NAME}/CN=${CLIENT_COMMON_NAME}"

# 創(chuàng)建客戶端證書擴(kuò)展配置文件
cat > client-ext.cnf << EOF
extendedKeyUsage = clientAuth
EOF

# 簽署客戶端證書 - 使用配置文件而不是命令行擴(kuò)展
openssl x509 -req -in client-req.pem -days ${CERT_VALID_DAYS} -CA ca.pem -CAkey ca-key.pem \
  -CAcreateserial -out client-cert.pem -extfile client-ext.cnf

echo "清理臨時(shí)文件..."
rm -f *.cnf *.req

echo "證書生成完成!"
echo "生成的文件清單:"
ls -la *.pem

# ==================== 【后續(xù)操作提示】 ====================
echo ""
echo "下一步需要手動(dòng)執(zhí)行的操作:"
echo "1. 將 ca.pem 分發(fā)到所有節(jié)點(diǎn)的 /etc/mysql/ssl/ 目錄"
echo "2. 將 server-<node>-key.pem 和 server-<node>-cert.pem 分發(fā)到對(duì)應(yīng)節(jié)點(diǎn),并重命名為 server-key.pem 和 server-cert.pem"
echo "3. 將 client-key.pem 和 client-cert.pem 分發(fā)到所有節(jié)點(diǎn)"
echo "4. 設(shè)置文件權(quán)限:"
echo "   chown mysql:mysql /etc/mysql/ssl/*"
echo "   chmod 600 /etc/mysql/ssl/*.pem"
echo "   chmod 644 /etc/mysql/ssl/ca.pem"

執(zhí)行命令生成證書。 再次說(shuō)明:這里生成的證書不是直接使用,需要按照服務(wù)器名稱復(fù)制對(duì)應(yīng)的文件到/etc/mysql/ssl,并修改文件名稱

chmod +x generate_mgr_ssl.sh
./generate_mgr_ssl.sh

2、常用命令

#在mysql shell命令模式的時(shí)候,輸入\q按回車退出
\q
#使用root賬號(hào)登錄3306端口的mysql
mysqlsh root@192.168.157.114:3306 
#自動(dòng)化檢查mysql配置信息,以滿足InnoDB Cluster運(yùn)行
dba.configureInstance()   
#檢查mysql配置文件是否正確,如有不正確的內(nèi)容會(huì)輸出。非常有用!
mysqld --validate-config    
#查看集群狀態(tài)
cluster.status(); 

3、常見問題

只要是出現(xiàn) Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.就代表沒有使用ssl去連接。要么在my.cnf配置好ssl相關(guān)的文件路徑,并確保能有權(quán)限讀取文件。要么更改賬戶的密碼校驗(yàn)插件為mysql_native_password。修改配置文件和修改的文件夾的權(quán)限都需要重啟mysql。

如果退出了mysql shell,再次進(jìn)入就需要var cluster = dba.getCluster("集群名稱");才能獲取到對(duì)應(yīng)的集群,然后才可以使用cluster.status();查看集群狀態(tài)。

dba.configureInstance();執(zhí)行可能報(bào)錯(cuò)Dba.configureInstance: This function is not available through a session to an instance belonging to an unmanaged asynchronous replication topology (RuntimeError)可能是因?yàn)橹芭渲昧酥鲝膹?fù)制導(dǎo)致的,我這個(gè)slave1和slave2都是之前做的普通主從復(fù)制。出現(xiàn)這個(gè)問題,需要登錄mysql然后執(zhí)行。
STOP SLAVE; – 停止復(fù)制(如果是從節(jié)點(diǎn))
RESET SLAVE ALL; – 清除復(fù)制配置(包括主從關(guān)系)
RESET MASTER; – 重置二進(jìn)制日志(確保GTID干凈)

var cluster = dba.getCluster('mysql_group_replication_cluster_0001')
提示錯(cuò)誤:Dba.getCluster: This function is not available through a session to a standalone instance (metadata exists, instance belongs to that metadata, but GR is not active) (MYSQLSH 51314)。需要確認(rèn)配置是否正確group_replication_bootstrap_group=ON;group_replication_bootstrap_group=ON (第一個(gè)節(jié)點(diǎn)是ON,后續(xù)節(jié)點(diǎn)是OFF)

到此這篇關(guān)于mysql8.0.43使用InnoDB Cluster配置主從復(fù)制的文章就介紹到這了,更多相關(guān)mysql InnoDB Cluster主從復(fù)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • Myeclipse連接mysql數(shù)據(jù)庫(kù)心得體會(huì)

    Myeclipse連接mysql數(shù)據(jù)庫(kù)心得體會(huì)

    這篇文章主要為大家詳細(xì)介紹了MyEclipse連接MySQL數(shù)據(jù)庫(kù)圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • MySQL 的CASE WHEN 語(yǔ)句使用說(shuō)明

    MySQL 的CASE WHEN 語(yǔ)句使用說(shuō)明

    本文介紹下,在mysql數(shù)據(jù)庫(kù)中,有關(guān)case when語(yǔ)句的用法,介紹了case when語(yǔ)句的基礎(chǔ)知識(shí),并提供了相關(guān)實(shí)例,供大家學(xué)習(xí)參考,有需要的朋友不要錯(cuò)過(guò)
    2011-10-10
  • Navicat Premium15連接云服務(wù)器中的數(shù)據(jù)庫(kù)問題及遇到坑

    Navicat Premium15連接云服務(wù)器中的數(shù)據(jù)庫(kù)問題及遇到坑

    這篇文章主要介紹了Navicat Premium15連接云服務(wù)器中的數(shù)據(jù)庫(kù)問題及遇到坑,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • Mysql占用過(guò)高CPU時(shí)的優(yōu)化手段(必看)

    Mysql占用過(guò)高CPU時(shí)的優(yōu)化手段(必看)

    下面小編就為大家?guī)?lái)一篇Mysql占用過(guò)高CPU時(shí)的優(yōu)化手段(必看)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-03-03
  • MySQL去除字段前后空白字符串的解決方案

    MySQL去除字段前后空白字符串的解決方案

    平時(shí)處理數(shù)據(jù)或開發(fā)過(guò)程中遇到表中很多數(shù)據(jù)不規(guī)范的,像字符串中有各種亂七八糟的字符的,有空格的,我們需要把他們?nèi)コ?只保留有用內(nèi)容的時(shí)候,該如何處理?本文給大家介紹了MySQL去除字段前后空白字符串的解決方案,需要的朋友可以參考下
    2025-09-09
  • mysql解析json數(shù)據(jù)組獲取數(shù)據(jù)組所有字段的方法實(shí)例

    mysql解析json數(shù)據(jù)組獲取數(shù)據(jù)組所有字段的方法實(shí)例

    mysql在5.7開始支持json解析了,也可以解析數(shù)組,下面這篇文章主要給大家介紹了關(guān)于mysql解析json數(shù)據(jù)組獲取數(shù)據(jù)組所有字段的相關(guān)資料,文中通過(guò)圖文以及實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • mysql之如何把查詢的結(jié)果保存到新表

    mysql之如何把查詢的結(jié)果保存到新表

    這篇文章主要介紹了mysql之如何把查詢的結(jié)果保存到新表問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • MySQL中回表查詢避免和優(yōu)化指南

    MySQL中回表查詢避免和優(yōu)化指南

    在開發(fā)和運(yùn)維中,要想設(shè)計(jì)高效的數(shù)據(jù)庫(kù)系統(tǒng),要想優(yōu)化提升SQL查詢性能,都離不開一個(gè)理論知識(shí):回表查詢,本篇文章我們以具體的案例來(lái)介紹一下MySQL中,回表查詢相關(guān)的知識(shí)、案例以及優(yōu)化方案,需要的朋友可以參考下
    2025-09-09
  • MySQL數(shù)據(jù)庫(kù)優(yōu)化經(jīng)驗(yàn)詳談(服務(wù)器普通配置)

    MySQL數(shù)據(jù)庫(kù)優(yōu)化經(jīng)驗(yàn)詳談(服務(wù)器普通配置)

    同時(shí)在線訪問量繼續(xù)增大 對(duì)于1G內(nèi)存的服務(wù)器明顯感覺到吃力嚴(yán)重時(shí)甚至每天都會(huì)死機(jī) 或者時(shí)不時(shí)的服務(wù)器卡一下 這個(gè)問題曾經(jīng)困擾了我半個(gè)多月MySQL使用是很具伸縮性的算法,因此你通常能用很少的內(nèi)存運(yùn)行或給MySQL更多的被存以得到更好的性能。
    2011-03-03
  • MySQL數(shù)據(jù)庫(kù)安全之防止撰改的方法

    MySQL數(shù)據(jù)庫(kù)安全之防止撰改的方法

    這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)防止撰改的方法,需要的朋友可以參考下
    2014-07-07

最新評(píng)論

凤山市| 玛纳斯县| 疏附县| 志丹县| 旺苍县| 九台市| 张家口市| 五台县| 威信县| 灵武市| 鄂伦春自治旗| 武宁县| 丽水市| 老河口市| 芒康县| 康乐县| 阳泉市| 礼泉县| 合川市| 平阳县| 和龙市| 中宁县| 泌阳县| 凤凰县| 抚宁县| 伊宁县| 揭西县| 邮箱| 南岸区| 通州市| 崇左市| 鄂尔多斯市| 潍坊市| 遂溪县| 乌审旗| 磐安县| 镇坪县| 凌源市| 青冈县| 湛江市| 开远市|