MySQL高可用部署(雙機熱備 + Keepalived 故障自動切換)

一、安裝 MySQL


解壓

## 卸載系統自帶 mariadb
[root@data-01 ~]# rpm -qa | grep mariadb
mariadb-libs-5.5.60-1.el7_5.x86_64
[root@data-01 ~]# rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_64

## 遠程複製安裝包並解壓
[root@data-01 ~]# scp 192.168.0.92:/usr/local/src/* /usr/local/src/
[root@data-01 ~]# tar zxvf /usr/local/src/mysql-5.7.29-el7-x86_64.tar.gz -C /usr/local/
[root@data-01 ~]# ln -s /usr/local/mysql-5.7.29-el7-x86_64 /usr/local/mysql

添加運行 mysql 服務的 linux 用戶

[root@data-01 ~]# cd /usr/local/mysql
# 添加運行 mysql 的僞用戶(不需要登錄,只爲運行 mysql 服務),-r 系統用戶,-s 登錄shell
[root@data-01 mysql]# groupadd mysql
[root@data-01 mysql]# useradd -r -g mysql -s /bin/false mysql

設置 mysql 環境變量

## 設置 MySQL 的環境變量
[root@data-01 mysql]# vim /etc/profile.d/mysql-path.sh
export MYSQL_HOME=/usr/local/mysql
export PATH=$PATH:$MYSQL_HOME/bin
[root@data-01 mysql]# source /etc/profile.d/mysql-path.sh
[root@data-01 mysql]# mysql --version
mysql  Ver 14.14 Distrib 5.7.29, for el7 (x86_64) using  EditLine wrapper

初始化 mysql 數據目錄

## 初始化數據目錄
[root@data-01 mysql]# mkdir mysql-files
[root@data-01 mysql]# chmod 750 mysql-files
[root@data-01 mysql]# chown -R mysql:mysql /usr/local/mysql/
# mysql-files 權限信息如下(ll 命令)
# drwxr-x---.  2 mysql mysql    6 5月  15 11:18 data

# 在系統 root 帳號下運行 mysqld,要添加命令選項 --user=mysql,這樣 mysql service 才能正常讀寫 數據目錄
# --initialize-insecure 選項表示使用空密碼初始化 'root'@'localhost' 賬戶
[root@data-01 mysql]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/mysql-files
2020-05-15T10:32:27.535336Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2020-05-15T10:32:28.740104Z 0 [Warning] InnoDB: New log files created, LSN=45790
2020-05-15T10:32:28.826378Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2020-05-15T10:32:28.886516Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 60588ae2-9697-11ea-a152-00163ed7d8f0.
2020-05-15T10:32:28.887901Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2020-05-15T10:32:29.841822Z 0 [Warning] CA certificate ca.pem is self signed.
2020-05-15T10:32:30.065992Z 1 [Warning] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.

啓動 mysql 服務

# 啓動服務
[root@data-01 mysql]# mysqld_safe --user=mysql --datadir=/usr/local/mysql/mysql-files --basedir=/usr/local/mysql &
[1] 23025
[root@data-01 mysql]# Logging to '/usr/local/mysql/mysql-files/data-01.err'.
2020-05-15T11:43:46.931645Z mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/mysql-files
#查看服務
[root@data-01 mysql]# ps -ef | grep mysql
root      7630 28808  0 19:54 pts/0    00:00:00 grep --color=auto mysql
root     23025 28808  0 19:43 pts/0    00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --user=mysql --datadir=/usr/local/mysql/mysql-files --basedir=/usr/local/mysql
mysql    23129 23025  0 19:43 pts/0    00:00:00 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/mysql-files --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=data-01.err --pid-file=data-01.pid

設置 mysql root 用戶密碼

# 登錄 mysql
[root@data-01 mysql]# mysql -uroot -p
# 設置 root 用戶密碼
mysql> alter user 'root'@'localhost' identified by 'root-password';

修改配置文件

# 添加配置文件
[root@data-01 mysql]# vim /etc/my.cnf

/ect/my.conf

[mysqld]
basedir=/usr/local/mysql/
datadir=/usr/local/mysql/mysql-files
socket=/tmp/mysql.sock
user=mysql
symbolic-links=0
lower_case_table_names=1
# 允許最大連接數
max_connections=1000
# 服務端使用的字符集默認爲8比特編碼的latin1字符集
character-set-server=utf8 
# 創建新表時將使用的默認存儲引擎
default-storage-engine=INNODB
max_allowed_packet=16M
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
[client]
port=3306

[mysqld_safe]
log-error=/usr/local/mysql/log/mysqld.log

重啓 MySQL

# 複製啓動腳本
[root@data-01 mysql]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
# 重啓服務
[root@data-01 mysql]# touch /usr/local/mysql/log/mysqld.log
[root@data-01 mysql]# chown mysql:mysql /usr/local/mysql/log/mysqld.log
[root@data-01 mysql]# service mysqld start
Starting MySQL. SUCCESS!

遠程訪問 MySQL 報錯,關閉服務器防火牆或者打開 MySQL 服務端口

# 遠程連接連不上,確認端口是否開放
[root@data-01 mysql]# firewall-cmd --zone=public --query-port=3306/tcp
# 開放 3306 端口
[root@data-01 mysql]# firewall-cmd --zone=public --add-port=3306/tcp --permanent
[root@data-01 mysql]# firewall-cmd --reload

在另外一臺服務器上安裝 MySQL。

在主節點上進行數據庫的創建和初始化。

建立兩個 MySQL 服務的互爲主備關係

1)修改 MySQL 主從服務的配置,添加主從相關配置項,my.cnf 完整配置爲下面的內容與上面已有配置內容的合併。

192.168.0.90:

[mysqld]
server-id=1
log-bin=mysql-bin
binlog-do-db=yxf-test
binlog-do-db=fission
slave-skip-errors=all
innodb_flush_log_at_trx_commit=1
sync_binlog=1
binlog_format=mixed
auto-increment-increment=2
auto-increment-offset=1

192.168.0.91:

[mysqld]
server-id=2
log-bin=mysql-bin
binlog-do-db=yxf-test
binlog-do-db=fission
slave-skip-errors=all
innodb_flush_log_at_trx_commit=1
sync_binlog=1
binlog_format=mixed
auto-increment-increment=2
auto-increment-offset=2

2)重啓兩個 MySQL 服務

192.168.0.90:

[root@data-01 ~]# service mysqld restart 
Shutting down MySQL.... SUCCESS! 
Starting MySQL. SUCCESS! 

192.168.0.90:

[root@data-02 ~]# service mysqld restart 
Shutting down MySQL.... SUCCESS! 
Starting MySQL. SUCCESS! 

4)創建主從同步 MySQL 帳號

192.168.0.90 和 192.168.0.91 執行相同操作:

mysql> create user 'repl'@'%' identified by 'NotRealPassword';
Query OK, 0 rows affected (0.00 sec)

mysql> grant replication slave on *.* to 'repl'@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

5) 鎖定當前主數據庫,阻止寫庫操作,只允許讀庫,進行數據庫備份

192.168.0.90:

[root@data-01 ~]# mysql -h192.168.0.90 -uroot -p
Enter password: 
ERROR 1129 (HY000): Host '192.168.0.90' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
[root@data-01 ~]# mysqladmin flush-hosts -p
Enter password: 
[root@data-01 ~]# mysql -h192.168.0.90 -uroot -p
Enter password:
mysql> flush tables with read lock;
Query OK, 0 rows affected (0.01 sec)
[root@data-01 ~]# mysqldump --databases yxf-test fission > ./yxf-and-fission.dump.db -p
Enter password:
[root@data-01 ~]# ll -h ./yxf-and-fission.dump.db 
-rw-r--r--. 1 root root 14M 5月  21 21:03 ./yxf-and-fission.dump.db

6)將備份數據庫導入到從庫中

192.168.0.90:

# 複製備份數據文件到從服務器
[root@data-01 ~]# scp ./yxf-and-fission.dump.db 192.168.0.91:~/

192.168.0.91:

# 導入到從庫
[root@data-02 ~]# mysql < ./yxf-and-fission.dump.db -p
Enter password:
# 確認從庫中已導入備份數據
[root@data-02 ~]# mysql -uroot -p
Enter password:
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| fission            |
| mysql              |
| performance_schema |
| sys                |
| yxf-test           |
+--------------------+
6 rows in set (0.00 sec)

7)查看 MySQL 主節點狀態

192.168.0.90:

mysql> show master status\G
*************************** 1. row ***************************
             File: mysql-bin.000001
         Position: 154
     Binlog_Do_DB: yxf-test,fission
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)

8)在備份節點設置主從關係

192.168.0.91:

mysql> CHANGE MASTER TO MASTER_HOST='192.168.0.90', MASTER_USER='repl', MASTER_PASSWORD='NotRealPassword', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154;
mysql> start slave;
# 下面值保留部分主要信息
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.0.90
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 154
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
             Master_Server_Id: 1
                  Master_UUID: 60588ae2-9697-11ea-a152-00163ed7d8f0
             Master_Info_File: /usr/local/mysql-5.7.29-el7-x86_64/mysql-files/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
1 row in set (0.00 sec)

9)交換節點執行 8 和 9 兩步操作,建立雙主關係,釋放數據庫 read lock

192.168.0.90:

mysql> UNLOCK TABLES;

10)在兩個 MySQL 服務節點上分別進行數據更新,在對應的從節點驗證數據更新被同步。


二、安裝 keepalived


解壓、編譯、安裝

[root@data-01 ~]# tar zxvf /usr/local/src/keepalived-2.0.20.tar.gz -C /usr/local/
[root@data-01 ~]# ln -s /usr/local/keepalived-2.0.20 /usr/local/keepalived

# 依賴根據實際情況安裝
[root@data-01 keepalived]# yum install -y gcc-c++
[root@data-01 keepalived]# yum -y install openssl-devel libnl3-devel net-snmp-devel libnfnetlink-devel ipvsadm
# ./configure 不報錯 執行 install
[root@data-01 keepalived]# ./configure
[root@data-01 keepalived]# make && make install

# 複製文件
[root@data-01 keepalived]# mkdir /etc/keepalived
[root@data-01 keepalived]# cp /usr/local/keepalived/keepalived/etc/init.d/keepalived /etc/init.d/
[root@data-01 keepalived]# cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
[root@data-01 keepalived]# cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/

編輯配置文件

# 編輯配置文件
[root@data-01 keepalived]# vim /etc/keepalived/keepalived.conf

/etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   script_user root
   enable_script_security
   # vrrp_strict # 打開有可能造成物理機的瀏覽器無法訪問應用
   # vrrp_garp_interval 0 # 默認就是 0,當前版本配置說明自定義值應該小於1
   # vrrp_gna_interval 0 # 默認就是 0,當前版本配置說明自定義值應該小於1
}

vrrp_instance VI_1 {
    state BACKUP # 主備節點均設置爲 BACKUP 狀態
    interface eth0
    virtual_router_id 51 # 所屬虛擬路由組 ID,主備節點相同
    priority 100 # 主備優先級相同
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 集羣虛擬IP,主備節點配置相同
    virtual_ipaddress {
        192.168.0.94
    }
}

virtual_server 192.168.0.94 3306 {
    delay_loop 2
    lvs_sched wrr # 配置項當前版本 name,和許多網上博客內容不一樣
    lvs_method DR # 配置項當前版本 name,和許多網上博客內容不一樣
    persistence_timeout 50
    protocol TCP

    real_server 192.168.0.91 3306 { # 當前節點 IP 和 mysql 服務端口
        weight 3
        notify_down /root/shutdown_keepalived.sh
        TCP_CHECK {
            retry 3 # 配置項當前版本 name,和許多網上貼子不一樣
            connect_timeout 10
            delay_before_retry 3
            connect_port 3306
        }
    }
}

添加並編輯停止 keepalived 服務命令腳本

# 編輯 停止 keepalived 服務腳本
[root@data-01 keepalived]# vim ~/shutdown_keepalived.sh

shutdown_keepalived.sh

#!/bin/bash
pkill keepalived

確認服務器 selinux 狀態關閉,防火牆關閉

[root@data-01 ~]# firewall-cmd --state
not running
[root@data-01 ~]# getenforce
Enforcing
# 關閉 selinux
[root@data-01 ~]# setenforce 0
[root@data-01 ~]# getenforce 
Permissive

最後,先啓動 MySQL 服務,再啓動 keepalived 服務,keepalived 服務日誌文件默認路徑爲 /var/log/messages。兩節點服務都啓動完成之後,通過查看服務器 IP 信息確認虛擬 IP 正確綁定到主節點上。

根據下面的查看信息可以看出,虛擬 IP 地址 192.168.0.94 綁定到主節點 192.168.0.90 上。

當前主節點:

# 當前主節點
[root@data-01 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:16:3e:d7:d8:f0 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.90/24 brd 192.168.0.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet 192.168.0.94/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::1e2d:8b9f:f605:6bbd/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

當前備份節點

[root@data-02 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:16:3e:57:c3:b6 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.91/24 brd 192.168.0.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::ffc:9908:8b02:9e0d/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

完成

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章