前言:在數據驅動的時代,數據庫作為數據存儲與管理的核心組件,其架構的選擇與配置對系統的性能、可用性和擴展性至關重要。MySQL 作為一款廣泛應用的開源關系型數據庫,憑借其穩定的性能和豐富的功能,深受開發者和企業的青睞。?
MySQL 8.0 版本帶來了許多新特性和改進,無論是單節點部署還是主從架構搭建,都有其獨特的優勢和適用場景。單節點部署簡單便捷,適用于小型應用或開發測試環境,能快速滿足基本的數據存儲需求;而一主兩從架構則在高可用性、讀寫分離、數據備份等方面表現出色,適用于中大型系統,可有效提升系統的性能和可靠性。?
本文將詳細介紹 MySQL 8.0 單節點的部署流程,包括環境準備、安裝配置等關鍵步驟。同時,針對手動配置一主兩從架構,從主服務器的配置、從服務器的設置到主從復制的啟動與驗證,進行全面且深入的講解。通過實際操作示例和注意事項的說明,幫助讀者掌握相關技術要點,以便根據實際需求選擇合適的數據庫架構,為系統的數據管理奠定堅實基礎。
一、單節點 MySQL 8.0 安裝與基礎配置
第一步:卸載系統自帶mariadb
查看系統自帶的Mariadb:rpm -qa|grep mariadb
卸載系統自帶的Mariadb:rpm -e --nodeps mariadb-libs-5.5.44-2.el7.centos.x86_64
刪除etc目錄下的my.cnf:rm -rf /etc/my.cnf
檢查mysql是否存在:rpm -qa | grep mysql
第二步:將下載的mysql安裝包mysql-8.0.35-1.el7.x86_64.rpm-bundle
上傳到指定路徑/usr/local
第三步:在當前目錄下創建一個 mysql-8.0.35 文件夾,解壓安裝包到該目錄下
命令:tar -xvf mysql-8.0.35-1.el7.x86_64.rpm-bundle
第四步:下載并安裝mysql依賴的插件
命令:yum -y install openssl-devel;yum -y install libaio;yum -y remove mysql-libs
第五步:裝完該插件之后,依次按順序執行以下命令安裝這些 rpm 包
rpm -ivh mysql-community-server-8.0.28-1.el7.x86_64.rpm --force --nodeps
rpm -ivh mysql-community-client-plugins-8.0.35-1.el7.x86_64.rpm
rpm -ivh mysql-community-common-8.0.35-1.el7.x86_64.rpm
......
報錯處理:
yum install perl-JSON
yum install -y perl-Module-Install.noarch
第六步:修改配置文件
命令:vim /etc/my.cnf
加入以下內容:
[mysqld]
##設置端口
port=3306
##設置字符集
character-set-server=utf8mb4
##不區分大小寫
lower_case_table_names=1
##group_concat()函數默認長度1024,需要調整200000
group_concat_max_len=200000
##數據庫最大連接數100,改為10000
max_connections=10000
##鎖等待的時間是默認為50s,修改為500
innodb_lock_wait_timeout=500
第七步:MySQL 安裝好了之后系統會自動的注冊一個服務,服務名稱叫做 mysqld,所以可以通過以下命令操作 MySQL:
啟動 MySQL 服務:systemctl start mysqld
重啟 MySQL 服務:systemctl restart mysqld
關閉 MySQL 服務:systemctl stop mysqld
先啟動mysql服務
第八步:rpm 安裝 MySQL 會自動生成一個隨機密碼,可在 /var/log/mysqld.log
這個文件中查找該密碼
第九步:連接 MySQL
命令:mysql -u root –p或mysql -uroot –p
這里如果報錯:2800.且根本就沒用登錄密碼的界面,無法登錄數據庫
做以下操作處理:
第十步:在修改配置之前,先把 mysql 服務停止
命令:systemctl stop mysqld.service
第十一步:刪除錯誤日志
命令:rm -rf /var/log/mysqld.log
第十二步:遞歸刪除 /var/lib/mysql 目錄下面的內容
命令:cd /var/lib/mysql
rm -rf *
#遞歸刪除
第十三步:刪除原目錄,創建數據庫目錄并授權
命令:rm -rf /var/lib/mysql
進入/var/lib 目錄,創建目錄:cd /var/lib && mkdir mysql
賦權:chown -R mysql:mysql mysql
第十四步:初始化 MySql
命令:mysqld --defaults-file=/etc/my.cnf --initialize --user=mysql --basedir=/var/lib/mysql --datadir=/var/lib/mysql
啟動服務:systemctl start mysqld.service
查看服務:systemctl status mysqld.service
第十五步:連接數據庫,修改root用戶密碼
命令:mysql -uroot –p
并輸入密碼
第十六步:1.8修改root用戶密碼
命令:ALTER USER 'root'@'localhost' IDENTIFIED BY 'fjdkjkfhkfjlgk';
第十七步:創建用戶與權限分配
命令:create user 'mysqladmin'@'%' IDENTIFIED WITH mysql_native_password BY 'Dfdghjgkjdl';
命令:grant all on *.* to 'mysqladmin'@'%';
命令:flush privileges;
Myaql開機自啟動:
命令:systemctl enable mysqld
驗證:返回結果為 enabled,則表示開機自啟已成功設置
二、手動搭建一主兩從架構
這里就先不展示ansible自動化腳本了,執行后雖然是一步安裝好,但是無法展示部署細節,下面我寫下手動搭建mysql主從的具體步驟,便于理解些
環境規劃
角色 | IP地址 | server_id | 數據目錄 | 密碼統一 |
---|---|---|---|---|
主庫(Master) | 192.168.1.100 | 101 | /var/lib/mysql | Root@2023# |
從庫1(Slave) | 192.168.1.101 | 102 | /var/lib/mysql | Root@2023# |
從庫2(Slave) | 192.168.1.102 | 103 | /var/lib/mysql | Root@2023# |
1. 初始化從庫密碼
從庫都執行 :grep 'temporary password' /db/mysql/3306/log/errorlog/error.log|awk -F ' ' '{print $NF}'
生成密碼:
從庫1:MlMQppp1Si.h
從庫2:M9xiHdG7E+u
后mysql -uroot -p
輸入上述密碼登錄:
這個只是初始密碼,要改掉成為跟主庫一樣的,ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Root@2023#';
兩個從庫都執行這個命令,然后退出
2.從庫創建用戶并分配相應的權限
在從庫上創建必要的用戶和權限:
-- 創建管理用戶
CREATE USER 'mysqladmin'@'%' IDENTIFIED WITH mysql_native_password BY 'Ma8gTsn19ln#';
GRANT ALL PRIVILEGES ON *.* TO 'mysqladmin'@'%' WITH GRANT OPTION;-- 創建應用程序用戶,允許進行常見的 DML 操作
CREATE USER 'appuser'@'%' IDENTIFIED WITH mysql_native_password BY 'Ma8gTsn19ln!';
GRANT SELECT, UPDATE, DELETE, INSERT ON *.* TO 'appuser'@'%';-- 創建報表用戶,僅允許進行查詢操作
CREATE USER 'report'@'%' IDENTIFIED WITH mysql_native_password BY 'Ma8gTsn19ln!';
GRANT SELECT ON *.* TO 'report'@'%';-- 創建備份用戶,用于本地備份操作
CREATE USER 'bakuser'@'localhost' IDENTIFIED BY '57xUJQObLvM3KPux!';
GRANT ALL ON *.* TO 'bakuser'@'localhost';-- 創建監控用戶,賦予監控相關權限
CREATE USER 'orch_monitor'@'%' IDENTIFIED WITH mysql_native_password BY 'Monitor123456##915';
GRANT RELOAD, PROCESS, SUPER, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'orch_monitor'@'%';-- 創建 proxysql 用戶,允許進行常見的 DML 操作
CREATE USER 'proxysql'@'%' IDENTIFIED WITH mysql_native_password BY 'Wbymc521!@#';
GRANT SELECT, UPDATE, DELETE, INSERT ON *.* TO 'proxysql'@'%';-- 創建 exporter 用戶,賦予監控工具所需的權限
CREATE USER 'exporter'@'%' IDENTIFIED WITH mysql_native_password BY 'Exq#Py29!';
GRANT SELECT, PROCESS, REPLICATION CLIENT, RELOAD ON *.* TO 'exporter'@'%';-- 創建復制用戶,用于主從復制
CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'Aepl@897';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
命令:select user,host from mysql.user;
檢查下3臺機的select user,host from mysql.user;
是不是一樣的
3. 配置主從復制
在兩個從庫執行以下語句,切記不要在主庫上執行:
reset master;
change master to master_host='主庫ip',master_port=3306,master_user='repl',master_password='Repl@123',master_auto_position=1;
start slave;
4.兩個從庫執行下 以下命令,查看結果
命令:show slave status\G
從庫判斷依據:
Slave_IO_Running
:如果這個參數的值為Yes,則表示從服務器的IO線程正在運行,該服務器是作為從庫的。
Slave_SQL_Running
:如果這個參數的值也是Yes,則表示從服務器的SQL線程也在運行,該服務器同樣是作為從庫的。
如果一個MySQL服務器是主庫,那么它不會有這些復制相關的參數,或者這些參數的值會是空的或者顯示為No。
主庫判斷依據:
Master_UUID
:在主庫上,這個參數會顯示一個唯一的標識符,而在從庫上,這個參數通常不會顯示。
Read_Master_Log_Pos
:在主庫上,這個參數通常為0,因為它不讀取任何主日志位置。
5.所有節點查看是否只讀
命令:SELECT @@read_only;
這里查詢的結果,從庫只能為1;主庫要為0,如果主庫不為0,用下面的命令修改:
set global read_only=0;
grant all privileges on *.* to appuser@'%';
6.quit退出mysql命令行,執行以下命令,查看server_id
mysql -u appuser -h 主庫 -p'密碼' -e "select @@server_id;"
mysql -u appuser -h 從庫1 -p'密碼' -e "select @@server_id;"
mysql -u appuser -h 倉庫2 -p'密碼' -e "select @@server_id;"
這里的輸出結果,主庫不能和從庫一樣,然后兩個從庫的輸出值也不能一樣,如果一樣需要按下面的方法修正
7.三個節點查看相關數值,查看各自是否能對上
cat /etc/my.cnf|grep server_id
cat /etc/my.cnf|grep innodb_buffer_pool_size
cat /etc/my.cnf|grep report_host
8. 修改從庫核心配置
編輯 vim /etc/my.cnf
文件,添加以下內容:
server_id=102 # 從庫 1 設為 102,從庫 2 設為 103
relay_log=relay-bin # 中繼日志文件,建議根據實際情況合理配置具體參數
read_only=1 # 開啟只讀模式
super_read_only=1 # 增強只讀保護
innodb_buffer_pool_size=30G # 以當前服務器實際內存為準
重啟服務:
systemctl restart mysqld
Mysql各節點全部都重啟下,然后各節點使用 步驟6.
的命令查看是否生效
在主庫執行:set global read_only=0;
9.兩個從庫都執行以下命令,查看Slave_IO_Running和Slave_SQL_Running是否為Yes
命令:show slave status\G
10.查看從庫的innodb_buffer_pool_size當前值是否一致
命令:show global variables like 'innodb_buffer_pool_size';
11.主庫執行命令查看是否將從庫的ip加進來
命令:show slave hosts;
12.開啟兩個從庫所有用戶的只讀(步驟可選)
set global read_only=1;set global super_read_only=1;
13.三個節點配置開機自啟
參考MYSQL單節點部署的
三、以上步驟如果還是未能生效,可參考以下可選步驟:
1. 連接主庫并啟動復制(可選)
在從庫上執行以下命令:
mysql -u root -p'Root@2023#'STOP SLAVE; # 停止可能存在的舊復制線程CHANGE MASTER TO MASTER_HOST='192.168.1.100', # 主庫 IP 地址MASTER_PORT=3306,MASTER_USER='repl', # 復制用戶MASTER_PASSWORD='Repl@123', # 復制用戶密碼MASTER_AUTO_POSITION=1; # 使用 GTID 自動定位START SLAVE; # 啟動復制線程
2. 主從狀態驗證(可選)
① 從庫復制狀態檢查
檢查從庫的復制狀態:
SHOW SLAVE STATUS\G# 檢查以下關鍵參數:
# Slave_IO_Running: Yes (IO 線程正常)
# Slave_SQL_Running: Yes (SQL 線程正常)
# Seconds_Behind_Master: 0 (無延遲)
② 主庫查看從庫連接
在主庫上查看從庫連接情況:
SHOW SLAVE HOSTS;
③ 數據一致性驗證
在主庫上創建測試數據庫和表:
CREATE DATABASE test;
USE test;
CREATE TABLE t1(id INT PRIMARY KEY);
INSERT INTO t1 VALUES(1);
在從庫上驗證數據是否同步:
SELECT * FROM test.t1; # 應返回與主庫一致的數據
四、常見問題與解決方案
1. 初始化失敗:權限不足
# 創建日志文件并設置權限
touch /var/log/mysqld.log
chown mysql:mysql /var/log/mysqld.log
chmod 644 /var/log/mysqld.log# 重新初始化
mysqld --defaults-file=/etc/my.cnf --initialize --user=mysql --basedir=/usr --datadir=/var/lib/mysql
2. SELinux 導致初始化失敗
# 臨時關閉 SELinux
setenforce 0# 永久修改(編輯 /etc/selinux/config)
SELINUX=disabled
3. 從庫復制線程中斷
修復步驟:
-
在主庫上刷新日志:
FLUSH LOGS;
-
在從庫上重置復制狀態:
RESET SLAVE;
-
重新配置復制并啟動:
CHANGE MASTER TO MASTER_HOST='主庫 IP',MASTER_PORT=3306,MASTER_USER='repl',MASTER_PASSWORD='Repl@123',MASTER_AUTO_POSITION=1; START SLAVE;
五、最佳實踐與注意事項
1. 配置文件模板
[mysqld]
# 基礎配置
port=3306
lower_case_table_names=1 # 表名不區分大小寫# 字符集
character-set-server=utf8mb4
collation-server=utf8mb4_bin# 連接與性能
max_connections=10000
innodb_lock_wait_timeout=500# 復制相關(主庫)
log_bin=mysql-bin
server_id=101# 復制相關(從庫)
relay_log=relay-bin
read_only=1
super_read_only=1
2. 生產環境建議
- 定期備份:使用
mysqldump --master-data
或物理備份工具 - 監控指標:關注連接數和緩沖池命中率
- 版本一致性:確保主從節點版本相同
- 防火墻設置:開放 3306 端口,允許從庫 IP 連接
通過以上步驟,我們完成了 MySQL 8.0 單節點安裝及手動一主兩從架構搭建。手動配置的優勢在于可控性強,適合理解復制原理,后續維護也更便捷。生產環境中建議結合監控工具(如 Prometheus+Grafana)實時跟蹤復制狀態,確保數據高可用性與一致性。