mysql8.0.43使用InnoDB?Cluster配置主從復(fù)制
InnoDB Cluster,顧名思義只有InnoDB引擎可以使用。服務(wù)器內(nèi)存盡量4G,2G完全不夠。本文是單主模式,用到的mysql請(qǐng)自行安裝
| 地址 | 名稱 | 說明 |
|---|---|---|
| 192.168.157.114:3306 | mysql_master | 主數(shù)據(jù)庫(kù) |
| 192.168.157.115:3306 | mysql_slave1 | 從庫(kù)1 |
| 192.168.157.116:3306 | mysql_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的版本來,我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ù)一致性可能無法保證 #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ù),可以設(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ā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ù)南⒋笮〕^該閾值時(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;(不能直接改配置文件)。接下來配置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的配置就完成了,接下來只需要按照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í)行命令生成證書。 再次說明:這里生成的證書不是直接使用,需要按照服務(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)文章
MySQL按時(shí)間統(tǒng)計(jì)數(shù)據(jù)的方法總結(jié)
在本篇MYSQL的內(nèi)容里,我們給大家整理了關(guān)于按時(shí)間統(tǒng)計(jì)數(shù)據(jù)的方法內(nèi)容,有需要的朋友們學(xué)習(xí)下。2019-02-02
MySQL安裝過程中在第四步initializing database出錯(cuò)的解決方法
安裝mysql時(shí),在第四步一直卡住了顯示失敗,文中通過圖文介紹的解決方法非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能幫助到大家2023-09-09
詳解MySQL用事件調(diào)度器Event Scheduler創(chuàng)建定時(shí)任務(wù)
事件調(diào)度器(Event Scheduler)是在MySQLv5.1.6中新增的一個(gè)功能,它相當(dāng)于一個(gè)定時(shí)器,可以在指定的時(shí)間點(diǎn)執(zhí)行一條SQL語(yǔ)句或一個(gè)語(yǔ)句塊,也可以用于在固定間隔重復(fù)執(zhí)行。下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)在MySQL中如何用事件調(diào)度器Event Scheduler創(chuàng)建定時(shí)任務(wù)2016-08-08
mysql實(shí)現(xiàn)按組區(qū)分后獲取每組前幾名的sql寫法
這篇文章主要介紹了mysql實(shí)現(xiàn)按組區(qū)分后獲取每組前幾名的sql寫法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2023-03-03

