目錄
一、mysql概述
1.1、關系型數據庫
1.2、MySQL數據庫
1.3、RDBMS術語
二、mysql的部署
2.1、拉取mysql
2.2、解壓
2.3、 改名
2.4、?指定安裝文件位置
2.5、?創建用戶組
2.6、?修改mysql配置文件
2.7、創建data文件夾
2.8、更改mysql目錄權限
2.9、初始化數據庫
?2.10、查看初始密碼
2.11、?啟動mysql服務
2.12、使用初始密碼進入數據庫,修改密碼
2.13、設置遠程連接
2.14、測試連接
三、mysql主主復制部署
3.1、克隆兩臺服務
3.2、 添加對應主機
3.3、?關閉防火墻以及修改selinux
3.4、 修改倆臺服務器的配置文件
3.5、主服務器
3.6、查看主服務器的日志配置
3.7、從服務器
3.8、從服務器
3.9、主服務器
3.10、在主服務查看?
四、MHA集群部署
添加主機名
4.1、 安裝MHA
4.2、免密
4.3、創建mysql的軟鏈接
4.4、創建用戶
4.5、配置環境變量
4.6、 創建manager的配置文件
4.7、檢查互信
4.8、?檢查主從復制狀態
4.9、開啟MHA-manager
4.10、查看MHA狀態
4.11、 測試HA高可用的自動切換
4.12、 回到主
五、MHA+VIP部署
5.1、修改mha.cnf配置文件
5.2、編寫?master_ip_failover文件
5.3、添加?master_ip_failover的權限
5.4、添加虛擬ip
5.5、 測試狀態檢查
5.6、開啟MHA-manager
5.7、測試
5.8、查看IP
5.9、進入host2,查看ip
5.10、手動轉移
5.10、測試連接
5.11、查看日志
一、mysql概述
1.1、關系型數據庫
關系型數據庫天然就是二維表格,因此存儲在數據表的行和列中。數據表可以彼此關聯協作存儲,也很容易提取數據。
1.2、MySQL數據庫
MySQL是一個關系型數據庫管理系統,由瑞典MySQL AB公司開發,目前屬于Oracle公司。
MySQL可將數據保存在不同的表中,而不是將所有數據放在一個大的倉庫內,從而加快了訪問速度并提高了靈活性。
MySQL 使用了標準的 SQL 語言形式。支持大型的數據庫,可以處理擁有上千萬條記錄的大型數據庫。MySQL 還可用于多種系統中,且支持多種語言。
1.3、RDBMS術語
數據庫:數據庫是一些關聯表的集合。
數據表:表是數據的矩陣。在一個數據庫中的表看起來像一個簡單的電子表格。
列:一列(數據元素)包含了相同的數據,例如郵政編碼的數據。
行:一行(=元組,或者記錄)是一組相關的數據,例如一條用戶訂閱的數據。
亢余:存儲兩倍數據,亢余降低了性能,但是提高了數據的安全性。
主鍵:主鍵是唯一的,一個數據表中只能夠包含一個主鍵,你可以使用主鍵來查詢數據。
外鍵:外鍵用于關聯兩個表。
復合鍵:復合鍵(組合鍵)將多個列作為一個索引鍵,一般用于復合索引。
索引:使用索引可快速訪問數據庫表中的特定信息。索引是對數據庫表中一列或者多列的值進行排序的一種結構。類似于書籍的目錄。
二、mysql的部署
2.1、拉取mysql
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.27-el7-x86_64.tar.gz
2.2、解壓
tar -xvf mysql-8.0.27-el7-x86_64.tar.gz
2.3、 改名
mv mysql-8.0.27-el7-x86_64 mysql
2.4、?指定安裝文件位置
mv mysql /usr/local
2.5、?創建用戶組
groupadd mysql
useradd -r -g mysql mysql
passwd mysql
2.6、?修改mysql配置文件
/etc/my.cnf[mysqld]
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
# server_id = .....
socket = /tmp/mysql.sock
character-set-server = utf8
skip-name-resolve
log-error = /usr/local/mysql/data/error.log
pid-file = /usr/local/mysql/data/mysql.pidsql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
2.7、創建data文件夾
cd /usr/local/mysql
mkdir data
2.8、更改mysql目錄權限
chown -R mysql .
chgrp -R mysql .
2.9、初始化數據庫
./bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
?2.10、查看初始密碼
vim /usr/local/mysql/data/error.log
2.11、?啟動mysql服務
./support-files/mysql.server start
2.12、使用初始密碼進入數據庫,修改密碼
./bin/mysql -uroot -palter user 'root'@'localhost' identified by 'Root123456';
2.13、設置遠程連接
mysql> create user 'root'@'%' identified with mysql_native_password by 'Root123456';
Query OK, 0 rows affected (0.01 sec)mysql> grant all on *.* to 'root'@'%';
Query OK, 0 rows affected (0.00 sec)mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
2.14、測試連接
systemctl stop firewalld.service
firewall-cmd --state
三、mysql主主復制部署
3.1、克隆兩臺服務
?刪除每臺服務器的server-uuid,并重新啟動mysql,生成新的uuid
3.2、 添加對應主機
vim /etc/hosts192.168.157.80 host1
192.168.157.81 host2
192.168.157.82 host3
3.3、?關閉防火墻以及修改selinux
# 關閉防火墻
systemctl stop firewalld
systemctl disable firewalld # 關閉自啟動# 修改selinux
vim /etc/sysconfig/selinux
SELINUX=disabled # 設置為disabled
3.4、 修改倆臺服務器的配置文件
主從服務器/etc/my.cnf添加以下三行server-id=200
log-bin=mysql-bin
binlog_checksum=nonelog-bin=mysql-bin ?//將mysql二進制日志取名為mysql-bin
binlog_checksum=none //不對二進制檢查
server-id=200 //為服務器設置一個獨一無二的id便于區分,建議使用ip地址的最后一位充當server-id
3.5、主服務器
use mysql;
CREATE USER 'slave'@'%' IDENTIFIED BY 'abc123';
grant REPLICATION SLAVE on *.* to 'slave'@'%';
alter user 'slave'@'%' IDENTIFIED WITH mysql_native_password BY 'abc123';
flush privileges;
3.6、查看主服務器的日志配置
show master status;
3.7、從服務器
根據主服務器的日志配置配置從服務器
change master to master_host='192.168.157.80',master_user='slave',master_password='abc123', master_log_file='mysql-bin.000001',master_log_pos=1124;啟動從服務器slave :start slave;
查看是否配置成功:show slave status;
3.8、從服務器
從服務器
use mysql;
CREATE USER 'slave1'@'%' IDENTIFIED BY 'abc123';
grant REPLICATION SLAVE on *.* to 'slave1'@'%';
alter user 'slave1'@'%' IDENTIFIED WITH mysql_native_password BY 'abc123';
flush privileges;查看從服務器的日志配置:show master status;
3.9、主服務器
根據從服務器的日志配置主服務器
change master to master_host='192.168.157.81',master_user='slave1',master_password='abc123', master_log_file='mysql-bin.000001',master_log_pos=1130;start slave;
3.10、在主服務查看?
show slave status \G;
四、MHA集群部署
192.168.157.80 | host1 | 主庫 |
192.168.157.81 | host2 | 備選主庫 |
192.168.157.82 | host3 | 從庫(MHA管理節點) |
添加主機名
配置MHA集群不用搞主主復制
vim /etc/hosts192.168.157.80 host1
192.168.157.81 host2
192.168.157.82 host3
4.1、 安裝MHA
- 所有節點安裝node軟件依賴包和node軟件yum -y install perl-DBD-MySQL
rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm- 在manager安裝manager軟件依賴包和manager軟件
yum install -y perl-Config-Tiny
yum install -y epel-release
yum install -y perl-Log-Dispatch
yum install -y perl-Parallel-ForkManager
yum install -y perl-Time-HiResrpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
4.2、免密
分發ssh密鑰
在 所有服務器(包括 host1, host2, host3)上執行以下操作:# 生成各自的密鑰對(如果沒有)
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N ""# 將所有服務器的公鑰收集到 host1
for host in 192.168.157.80 192.168.157.81 192.168.157.82; doecho "收集 $host 的公鑰:"ssh root@$host "cat ~/.ssh/id_rsa.pub" >> ~/.ssh/all_servers.pub
done# 在 host1 上,將所有公鑰添加到 authorized_keys
cat ~/.ssh/all_servers.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys# 將 host1 的 authorized_keys 復制回所有服務器
for host in 192.168.157.80 192.168.157.81 192.168.157.82; doscp ~/.ssh/authorized_keys root@$host:~/.ssh/
done檢查 host1 的 SSH 配置
確保 host1 的 /etc/ssh/sshd_config 配置正確:PermitRootLogin yes
PubkeyAuthentication yes
PasswordAuthentication no # 可選,取決于你的安全策略
AuthorizedKeysFile .ssh/authorized_keys重啟ssh服務:
systemctl restart sshd手動驗證 SSH 連接
在 host2 和 host3 上分別測試到 host1 的 SSH 連接:# 在 host2 上
ssh root@host1# 在 host3 上
ssh root@host1
4.3、創建mysql的軟鏈接
# 在三個主機系統bin目錄創建軟連接(需root權限)
ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
ln -s /usr/local/mysql/bin/mysqldump /usr/bin/mysqldump
4.4、創建用戶
在host1,host2,host3中cd /usr/local/mysql
./bin/mysql -u root -pCREATE USER 'slave'@'%' IDENTIFIED BY 'abc123';
grant REPLICATION SLAVE on *.* to 'slave'@'%';
alter user 'slave'@'%' IDENTIFIED WITH mysql_native_password BY 'abc123';
flush privileges;
4.5、配置環境變量
在三臺主機上
echo 'export PATH=$PATH:/usr/local/mysql/bin' >> ~/.bashrc
source ~/.bashrc
4.6、 創建manager的配置文件
#創建配置文件目錄、日志目錄
mkdir -p /etc/mha
mkdir -p /var/log/mha/log#編輯mha配置文件 vi /etc/mha/mha.cnf
[server default]
manager_log=/var/log/mha/log/manager # MHA 管理器的日志文件路徑
manager_workdir=/var/log/mha/log # MHA 管理器的工作目錄
master_binlog_dir=/usr/local/mysql/data # 主庫二進制日志所在目錄
user=root # MHA 連接 MySQL 的用戶名
password=root # MHA 連接 MySQL 的密碼
ping_interval=2 # 檢查服務器狀態的間隔時間(秒)
repl_user=slave # 復制用戶(用于從庫同步)
repl_password=abc123 # 復制用戶的密碼
ssh_user=root # SSH 連接用戶(用于遠程操作服務器)
[server1]
hostname=host1 # 服務器 1 的主機名或 IP
port=3306 # 服務器 1 的 MySQL 端口
[server2]
hostname=host2 # 服務器 2 的主機名或 IP
port=3306 # 服務器 2 的 MySQL 端口
candidate_master=1 # 可提升為主庫的候選從庫,搞了多主模式可加入
check_repl_delay=0 # 忽略復制延遲檢查(根據需求設置)
[server3]
hostname=host3 # 服務器 3 的主機名或 IP
port=3306 # 服務器 3 的 MySQL 端口
4.7、檢查互信
masterha_check_ssh --conf=/etc/mha/mha.cnf
4.8、?檢查主從復制狀態
masterha_check_repl --conf=/etc/mha/mha.cnf
?注:出現問題
1、需要注釋三臺主機中my.cnf中 [client]下的字符配置;
2、配置三臺主機中MySQL的環境變量;
3、如果之前測試過故障自動轉移,需要將/var/log/mha/log文件夾下的對應的 complete文件刪除
以上處理完成之后再進行檢測集群是否健康。
4.9、開啟MHA-manager
nohup masterha_manager --conf=/etc/mha/mha.cnf > /var/log/mha/log/manager.log < /dev/null 2>&1 &
4.10、查看MHA狀態
masterha_check_status --conf=/etc/mha/mha.cnf
4.11、 測試HA高可用的自動切換
在host1上,執行shutdown操作
mysqladmin -uroot -proot shutdownMHA會自動進行主從切換。切換完成后,MHA進程會自動停止運行。在host2和host3上觀察,執行下面的語句:
show slave status\G;
host1:?
host2:
host3:
4.12、 回到主
在新主庫(host3)上
STOP SLAVE; 在host2上
STOP SLAVE; 在舊主庫(host1)上
STOP SLAVE;
RESET SLAVE ALL; -- 清除原復制配置在host1上
SHOW MASTER STATUS;在host2,host3上
change master to master_host='192.168.157.80',master_user='slave',master_password='abc123', master_log_file='mysql-bin.000002',master_log_pos=152;start slave;SHOW SLAVE STATUS\G;
五、MHA+VIP部署
5.1、修改mha.cnf配置文件
vim /etc/mha/mha.cnf在server-default下添加如下代碼
master_ip_failover_script=/etc/mha/master_ip_failover
5.2、編寫?master_ip_failover文件
vim /etc/mha/master_ip_failover#!/bin/bash
# 完整的 MHA VIP 管理腳本(支持自動切換 VIP)
# 配置參數
VIP="192.168.157.88" # VIP 地址
NETMASK="24" # 子網掩碼
INTERFACE="ens33" # 網絡接口(修正拼寫錯誤:end33 → ens33)
ARPING_COUNT=3 # ARP 廣播次數
LOG_FILE="/var/log/mha/vip_scripts.log"
SSH_OPTS="-o StrictHostKeyChecking=no -o ConnectTimeout=10" # SSH 選項# 解析參數
command=""
ssh_user=""
orig_master_host=""
orig_master_ip=""
orig_master_port=""
new_master_host=""
new_master_ip=""
new_master_port=""while [[ $# -gt 0 ]]; docase "$1" in--command=*)command="${1#*=}"shift;;--ssh_user=*)ssh_user="${1#*=}"shift;;--orig_master_host=*)orig_master_host="${1#*=}"shift;;--orig_master_ip=*)orig_master_ip="${1#*=}"shift;;--orig_master_port=*)orig_master_port="${1#*=}"shift;;--new_master_host=*)new_master_host="${1#*=}"shift;;--new_master_ip=*)new_master_ip="${1#*=}"shift;;--new_master_port=*)new_master_port="${1#*=}"shift;;*)shift;;esac
done# 日志函數
log() {local level=$1local message=$2local timestamp=$(date '+%Y-%m-%d %H:%M:%S')echo "$timestamp [$level] $message" >> "$LOG_FILE"# 同時輸出到控制臺(便于調試)echo -e "[$timestamp] [$level] $message"
}# 執行 SSH 命令并返回結果
ssh_exec() {local host=$1local cmd=$2log "INFO" "在 $host 執行命令: $cmd"# 執行 SSH 命令并捕獲輸出和退出碼local output=$(ssh $SSH_OPTS "$ssh_user@$host" "$cmd" 2>&1)local exit_code=$?if [ $exit_code -ne 0 ]; thenlog "ERROR" "SSH 命令執行失敗($host): $output"elselog "INFO" "SSH 命令執行成功($host): $output"fireturn $exit_code
}# 添加 VIP 到新主庫
add_vip() {local host=$1log "INFO" "開始在新主庫 $host 添加 VIP: $VIP/$NETMASK"# 1. 檢查網絡接口是否存在local check_interface="ip link show $INTERFACE > /dev/null 2>&1"if ! ssh_exec "$host" "$check_interface"; thenlog "ERROR" "網絡接口 $INTERFACE 在 $host 上不存在"return 1fi# 2. 添加 VIPlocal add_cmd="ip addr add $VIP/$NETMASK dev $INTERFACE label ${INTERFACE}:0"if ! ssh_exec "$host" "$add_cmd"; thenlog "ERROR" "在 $host 上添加 VIP 失敗"return 1fi# 3. 發送 ARP 廣播(更新網絡緩存)local arp_cmd="arping -c $ARPING_COUNT -A -I $INTERFACE $VIP > /dev/null 2>&1"if ! ssh_exec "$host" "$arp_cmd"; thenlog "WARN" "ARP 廣播發送失敗,但 VIP 已添加"filog "INFO" "VIP 已成功添加到 $host"return 0
}# 從原主庫移除 VIP
remove_vip() {local host=$1log "INFO" "開始從原主庫 $host 移除 VIP: $VIP"# 1. 檢查 VIP 是否存在local check_vip="ip addr show $INTERFACE | grep -q '$VIP/$NETMASK'"if ! ssh_exec "$host" "$check_vip"; thenlog "WARN" "VIP $VIP 在 $host 上不存在,跳過移除"return 0fi# 2. 移除 VIPlocal del_cmd="ip addr del $VIP/$NETMASK dev $INTERFACE"if ! ssh_exec "$host" "$del_cmd"; thenlog "ERROR" "從 $host 上移除 VIP 失敗"return 1fi# 3. 發送 ARP 廣播(通知網絡更新)local arp_cmd="arping -c $ARPING_COUNT -A -I $INTERFACE $VIP > /dev/null 2>&1"ssh_exec "$host" "$arp_cmd"log "INFO" "VIP 已成功從 $host 移除"return 0
}# 主邏輯
main() {# 初始化日志目錄mkdir -p "$(dirname "$LOG_FILE")"log "INFO" "===== VIP 管理腳本啟動 ====="log "INFO" "解析到的參數: command=$command, 原主庫=$orig_master_host, 新主庫=$new_master_host"case "$command" in"start")# 新主庫啟動 VIPif [ -z "$new_master_host" ]; thenlog "ERROR" "start 命令缺少新主庫參數"exit 1fiif add_vip "$new_master_host"; thenlog "INFO" "VIP 切換到新主庫 $new_master_host 成功"exit 0elselog "ERROR" "VIP 切換到新主庫 $new_master_host 失敗"exit 1fi;;"stop"|"stopssh")# 從原主庫移除 VIPif [ -z "$orig_master_host" ]; thenlog "ERROR" "stop 命令缺少原主庫參數"exit 1fiif remove_vip "$orig_master_host"; thenlog "INFO" "從原主庫 $orig_master_host 移除 VIP 成功"exit 0elselog "ERROR" "從原主庫 $orig_master_host 移除 VIP 失敗"exit 1fi;;"status")# MHA 狀態檢查(必須返回 0)log "INFO" "腳本狀態正常,支持 VIP 管理"exit 0;;*)log "ERROR" "未知命令: $command(支持的命令: start/stop/stopssh/status)"exit 1;;esac
}# 執行主函數
main "$@"
5.3、添加?master_ip_failover的權限
chmod +x /etc/mha/master_ip_failover
5.4、添加虛擬ip
添加虛擬IP:ifconfig ens33:0 192.168.157.88/24刪除虛擬IP:ip addr del 192.168.157.88/24 dev ens33
5.5、 測試狀態檢查
/etc/mha/master_ip_failover --command=status --ssh_user=root
5.6、開啟MHA-manager
nohup masterha_manager --conf=/etc/mha/mha.cnf > /var/log/mha/log/manager.log < /dev/null 2>&1 &查看MHA狀態
masterha_check_status --conf=/etc/mha/mha.cnf
5.7、測試
在host1上,執行shutdown操作
mysqladmin -uroot -proot shutdown
5.8、查看IP
5.9、進入host2,查看ip
5.10、手動轉移
# 測試狀態檢查(應返回成功)
/etc/mha/master_ip_failover --command=status --ssh_user=root# 測試添加 VIP 到 host2
/etc/mha/master_ip_failover --command=start --ssh_user=root --new_master_host=host2# 測試從 host2 移除 VIP
/etc/mha/master_ip_failover --command=stop --ssh_user=root --orig_master_host=host2