文章目錄
一、分析
- 本文所說的高可用
本文所說的MySQL高可用主要是通過Keepalived來實現多個節點的服務的可用性檢測和故障轉移,對外提供VIP地址供客戶端連接,由keepalived根據服務的狀態,負責將vip漂移到真實可用的機器上,從而實現服務的高可用。
- 架構
兩臺MySQL或者多臺做主主互備,VIP對外提供連接
機器 | IP/VIP | 組件 | 版本 |
---|---|---|---|
mysql1 | 10.10.0.1 | MySQL/Keepalived | 5.7.25/2.0.20 |
mysql2 | 10.10.0.2 | MySQL/Keepalived | 5.7.25/2.0.20 |
10.10.0.3 |
二、基礎環境
1、修改主機名及hosts
hostnamectl set-hostname mysql1
hostnamectl set-hostname mysql2
...
cat >> /etc/hosts <<EOF
10.10.0.1 mysql1
10.10.0.2 mysql2
EOF
2、修改系統進程打開最大文件數
echo "* soft nofile 65535" >> /etc/security/limits.conf
echo "* hard nofile 65535" >> /etc/security/limits.conf
3、關閉防火牆及selinux
systemctl stop firewalld && systemctl disable firewalld
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
三、MySQL
分別在mysql1及mysql2節點安裝同一版本的mysql,本文以5.7.25爲例說明
1、卸載mariadb數據庫
rpm -qa | grep mariadb
yum -y remove mariadb-libs-5.5.52-1.el7.x86_64
2、依賴檢查安裝
- 安裝MySQL需要libaio組件,默認的操作系統自帶,可檢查一下,如果沒有需自行安裝
rpm -qa | grep libaio
- 安裝net-tools組件,默認系統沒有需自行安裝
rpm -ivh net-tools-2.0-0.24.20131004git.el7.x86_64.rpm
3、解壓安裝MySQL
僅安裝必須的幾個包即可
tar -xvf mysql-5.7.25-1.el7.x86_64.rpm-bundle.tar
rpm -ivh mysql-community-common-5.7.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.25-1.el7.x86_64.rpm
4、修改配置文件
vim /etc/my.cnf
default-storage-engine = innodb
innodb_file_per_table
collation-server = utf8_general_ci
init-connect = 'SET NAMES utf8'
character-set-server = utf8
max_allowed_packet = 500M
innodb_buffer_pool_size = 512M
max_connections = 20000
expire_logs_days = 10
max_binlog_size = 512M
5、初始化並啓動數據庫
mysqld --initialize
chown mysql:mysql /var/lib/mysql -R
systemctl enable mysqld && systemctl start mysqld
6、修改密碼及權限添加
默認MySQL安裝完有一個臨時密碼,可通過這個臨時密碼修改我們數據庫的密碼
cat /var/log/mysqld.log | grep password
通過臨時密碼登陸MySQL,修改密碼
mysql -uroot -pSlg.ieA+j8Dn
set password for root@localhost = password('Test1234!');
添加遠程登錄權限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Test1234\!';
FLUSH PRIVILEGES;
四、主主互備
1、主機mysql1配置
創建用於存放bin日誌文件的目錄
mkdir -p /usr/local/mysql
創建bin日誌文件並修改權限及用戶屬組
touch /usr/local/mysql/mysql-bin.log
chmod 777 /usr/local/mysql/mysql-bin.log && chown -R mysql:mysql /usr/local/mysql/
修改配置文件my.cnf
vim /etc/my.cnf
log_bin = /usr/local/mysql/mysql-bin.log
server_id = 1
binlog_ignore_db=mysql
auto_increment_increment = 2
auto_increment_offset = 1
重啓MySQL
service mysqld stop && service mysqld start
登陸MySQL配置mysql2的同步賬號
mysql -uroot -p
grant replication slave on *.* to'slave'@'10.10.0.2' identified by 'Test1234!';
FLUSH PRIVILEGES;
2、主機mysql2配置
創建用於存放bin日誌文件的目錄
mkdir -p /usr/local/mysql
創建bin日誌文件並修改權限及用戶屬組
touch /usr/local/mysql/mysql-bin.log
chmod 777 /usr/local/mysql/mysql-bin.log && chown -R mysql:mysql /usr/local/mysql/
修改配置文件my.cnf
vim /etc/my.cnf
log_bin = /usr/local/mysql/mysql-bin.log
server_id = 2
binlog_ignore_db=mysql
auto_increment_increment = 2
auto_increment_offset = 1
重啓MySQL
service mysqld stop && service mysqld start
登陸MySQL配置mysql1的同步賬號
mysql -uroot -p
grant replication slave on *.* to'slave'@'10.10.0.1' identified by 'Test1234!';
FLUSH PRIVILEGES;
3、mysql1配置
重啓並登陸MySQL
service mysqld stop && service mysqld start
mysql -uroot -p
配置salve
stop slave;
change master to master_host='10.10.0.2',master_user='slave',master_password='Test1234!';
start slave;
4、mysql2配置
重啓並登陸MySQL
service mysqld stop && service mysqld start
mysql -uroot -p
配置salve
stop slave;
change master to master_host='10.10.0.1',master_user='slave',master_password='Test1234!';
start slave;
5、查看主主互備狀態
分別登陸mysql1及mysql2,查看互備狀態
show slave status \G;
重點關注項爲:
Slave_IO_State: Waiting for master to send event
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
五、Keepalived
在mysql1和mysql2分別安裝keepalived
1、安裝依賴
yum -y install openssl-devel
2、獲取Keepalived
https://www.keepalived.org/download.html
3、安裝
tar -xvf keepalived-2.0.20.tar.gz && rm -rf keepalived-2.0.20.tar.gz && cd keepalived-2.0.20
./configure --prefix=/usr/local/keepalived
make && make install
4、版本查看
/usr/local/keepalived/sbin/keepalived -v
5、配置文件
- 配置文件參數詳解
https://www.cnblogs.com/arjenlee/p/9258188.html
- 創建配置文件目錄及配置文件
mkdir -p /etc/keepalived
自帶配置文件:/usr/local/keepalived/etc/keepalived/keepalived.conf,可作參考,這裏直接創建新的配置文件即可
- mysql1服務器
vim /etc/keepalived/keepalived.conf
global_defs {
router_id mysql1
}
vrrp_script mysql_check {
script "/usr/local/keepalived/check.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 80
advert_int 1
track_script {
mysql_check
}
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
10.10.0.3
}
}
- mysql2服務器
vim /etc/keepalived/keepalived.conf
global_defs {
router_id mysql2
}
vrrp_script mysql_check {
script "/usr/local/keepalived/check.sh"
interval 2
weight:-20
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 70
advert_int 1
track_script {
mysql_check
}
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
10.10.0.3
}
}
- vrrp_script:檢查腳本,檢查haproxy狀態,如果掛掉,VIP漂移
- script:腳本命令
- interval:檢查間隔
- weight:權重
- state:標記該節點是master還是backup
- interface:配置VIP綁定的網卡,這裏使用和外網通信的網卡
- virtual_router_id:取1-255之間的值,主備需要相同,這樣才能成爲一個組
- priority:權重,數值高的主機是master,所以主節點要比從節點大,這是影響主備的關鍵
- advert_int:主備之間通訊的間隔秒數,用於判斷主節點是否存活
- auth_type:進行安全認證的方式,PASS或者AH方式,推薦PASS
- auth_pass:PASS的密碼
- virtual_ipaddress:VIP地址,最多可以寫20個,keepalive啓動後會自動配置該VIP
6、檢測腳本
放置到配置文件所指定目錄並添加權限
vim /usr/local/keepalived/check.sh
#!/bin/bash
count=`ps aux | grep -v grep | grep mysqld | wc -l`
if [ $count -eq 0 ]; then
exit 1
else
exit 0
fi
chmod +x /usr/local/keepalived/check.sh
7、啓動
- 創建service文件
cat > /etc/systemd/system/keepalived.service <<EOF
[Unit]
Description=LVS and VRRP High Availability Monitor
After=syslog.target network-online.target
[Service]
Type=forking
KillMode=process
ExecStart=/usr/local/keepalived/sbin/keepalived
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable keepalived && systemctl start keepalived && systemctl status keepalived
8、主從查看
在主節點查看網絡信息,可以發現我們設置的VIP,當主節點或者MySQL任意一個掛掉時,VIP都會自動漂移到從節點實現mysql的高可用