Spring Cloud 項目部署筆記(MySQL + Keepalived 雙主熱備 + Redis 主從 Sentinel 模式 + 單節點 Elasticsearch + Logstash)

本文是記錄整個環境的部署,不涉及對方案的討論。

1 部署規劃


共有 4 臺服務器,操作系統 CentOS 7.6。MySQL 和 Redis 實現高可用,ElasticSearch 和 java 後臺暫時爲單節點模式。

服務器/IP 安裝服務
192.168.0.90 keepalived、mysql(master)、redis(slave)、redis sentinal

192.168.0.91 keepalived、mysql(slave)、redis (master)、redis sentinal

192.168.0.92 elasticsearch、logstash、nodejs、nginx
config、weixin-third、yxf-project、eureka、gateway
192.168.0.93 channel-manager、digital-manager、digital-rest、
yxf-tenant、fission-marketing

※ 表中斜體部分爲 java 服務(非中間件)


2 部署方案


  • MySQL 雙主熱備 + Keepalived
  • Redis 主從 + Sentinel
  • 單機 ElasticSearch + Logstash

2.1 MySQL 高可用雙主熱備


即採用 MySQL + keepalived 方案,MySQL 雙主服務,相互同步複製,keepalived 監控 監控 MySQL 服務狀態,在某個 MySQL 服務不可用時,自動切換到另外一臺 MySQL 服務上。

關於 MySQL 服務,每個 master 和 對應的 slave 必須配置一個唯一的 ID(使用系統變量 server_id),每個 slave 必須配置 master 的主機名、日誌文件名和日誌文件內已同步的位置。這些細節可以通過在 slave 的 MySQL session 中使用 CHANGE MASTER TO 語句控制,這些信息以文件或者表的形式被存儲在 slave 的 master info repository 中。

  • master,開啓 binary logging,配置唯一 server ID。可能需要重啓服務。
  • slave,配置唯一 server ID。
  • 創建一個單獨的 MySQL 用戶,用戶 slave 向 master 讀取 binary log 時用。

2.1.1 Master 設置


2.1.1.1 配置 server id


server id 本質是mysql 系統變量,可以通過執行下面的語句實現

mysql> SET GLOBAL server_id = 2;

Server id 默認值是 0,爲默認值時,master 和 slave 均會拒絕外部的連接請求。

Binary logging 需要開啓,可以通過修改 mysql 配置文件 my.cnf 或者 my.ini 實現

[mysqld]
log-bin=mysql-bin
server-id=1

log-bin 和 server-id 都要配置在配置文件的 [mysqld] 分組中。修改完配置項,需要重啓 mysql 才能生效。

使用 InnoDB 引擎時,更好確保事務的有效性和一致性,需要在 master 的 my.cnf 配置中添加如下配置
innodb_flush_log_at_trx_commit=1
sync_binlog=1

確保 skip_networking 系統變量未開啓,否則 slave 不能和 master 通信,同步複製將失敗。


2.1.1.2 創建同步複製用戶


在 master 上需要有一個用戶帳號,供 slave 用來連接訪問,在 slave 上通過 CHANGE MASTER TO命令的 MASTER_USER 選項指定,並且該用戶必須被賦予 REPLICATION SLAVE 權限。

創建同步複製用戶示例,用戶名 repl,限定訪問主機域名 example.com,在 master 上執行:

mysql> CREATE USER 'repl'@'%.example.com' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.example.com';

※ 建議單獨給同步複製創建一個用戶,只賦予 replication 權限,和其他用戶區分開使用


2.1.1.3 獲取 master binary log 同步複製座標


要想 slave 服務能從正確的位置開始同步複製,我們需要記錄指定 master 服務器同步日誌的當前位置座標。

1、通過下列命令鎖定 InnoDB 表的 COMMIT 操作

mysql> FLUSH TABLES WITH READ LOCK;

保持運行上面命令的客戶端不關閉,這樣 read lock 才保持有效,否則 read lock 將失效。

2、在另一個 master 客戶端回話連接中,通過命令語句確定當前二進制日誌文件名和和同步位置:

mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 | 73       | test         | manual,mysql     |
+------------------+----------+--------------+------------------+

2.1.1.4 初始數據快照同步


  • 如果數據表都是 InnoDB 引擎,推薦使用 mysqldump 方式;
  • 如果數據庫使用 binary portable files 存儲,可以直接複製原始數據文件到 slave。該方式因爲跳過了爲 insert 語句更新索引的相關處理,效率更高。
1)使用 mysqldump 創建數據快照

master 中已存在歷史數據,通過下面命令語句創建數據快照,然後在同步複製開始前導入到 slave 中:

shell> mysqldump --all-databases --master-data > dbdump.db

上面的示例 dump 所有的數據庫到 dbdump.db 文件中, --master-data 選項將會自動地在 slave 上追加啓動同步複製所需要的 CHANGE MASTER TO 語句。如果不使用 --master-data 選項,則需要通過手動方式鎖定所有的數據表。

如果要 dump 部分指定的數據庫,則通過 --databases 選項來實現,選項後跟上要進行 dump 的數據庫的名字:

shell> mysqldump --databases db_name1 [db_name2 ...] > my_databases.sql

2)使用 raw data files 創建數據快照

情況一,如果使用了 InnoDB

① 獲取 read lock 和 master status:

mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;

② 在另外一個連接回話中,關閉 master server :

shell> mysqladmin shutdown

③ 複製和打包 mysql 數據文件(兩種方式二選一):

shell> tar cf /tmp/db.tar ./data
shell> zip -r /tmp/db.zip ./data

④ 重新啓動 master server;

情況二,如果沒使用 InnoDB

不需要關閉和重啓 master server。

① 獲取 read lock 和 master status;
② 複製和打包 mysql 數據文件;
③ 釋放 read lock

mysql> UNLOCK TABLES;

2.1.2 Slave 設置


開始前,先確認已完成如下操作:

  • MySQL master 已完成必要的同步複製配置;
  • 已獲取 master status 信息,或者 master 的 binary log index file 的副本,即 master 的數據快照;
  • 已釋放 master 的 read lock;

2.1.2.1 設置 server id


同 master server id 設置,開啓二進制日誌則要配置 log-bin,MySQL 配置文件 my.cnf 有修改後,需要重啓 mysql 服務。


2.1.2.2 設置 slave 的 master 信息


在 slave 上執行下面的 sql 命令語句,來設置 slave 同步複製的 master 對象的連接信息,根據自己系統的替換相關的選項值:

# 輸入命令時不換行
mysql> CHANGE MASTER TO 
  MASTER_HOST='master_host_name', 
  MASTER_USER='replication_user_name', 
  MASTER_PASSWORD='replication_password', 
  MASTER_LOG_FILE='recorded_log_file_name', 
  MASTER_LOG_POS=recorded_log_position;

2.1.2.3 設置同步複製


分新數據庫和已存在數據兩種情況。

1) 新數據庫

沒有要導入的數據快照,設置 slave 從一個新的 master 開始同步:

① 啓動 mysql slave 建立連接;
② 執行 CHANGE MASTER TO 語句;

2) 已存在數據

在開始建立同步前,先將 master 的數據快照導入到 slave,有兩種方式,二選一:

  • 方式一,如果使用 mysqldump 創建了快照
  1. 通過使用 --skip-slave-start 選項,start the slave,這樣同步處理就不開始。
  2. 導入 dump 文件:
    shell> mysql < fulldb.dump
    
  • 方式二 ,使用 raw data files 創建快照
  1. 解壓數據文件到 slave 的數據目錄下,例如:

    shell> tar xvf dbdump.tar
    

    請確認文件權限,確保 slave 可以訪問和修改。

  2. 通過使用 --skip-slave-start 選項,start the slave,這樣同步處理就不開始。

  3. 通過 CHANGE MASTER TO 語句配置 slave 在 master 的同步座標、登錄憑證和主機名。

  4. 啓動 slave 線程:

    mysql> START SLAVE;
    

執行完以上處理,slave 就連接到 master,同步複製發生在 master 上的做完快照之後的任何數據更新。


2.2 Redis 一主一從 + Sentinal


Redis 採用一主一從兩個服務節點,通過 Redis Sentinel 模式,在主節點不可用的情況下,直接切換到從節點,從而實現 Redis 高可用。

2.3 單機 ElasticSearch + Logstash


Logstash 的作用是將 mysql 的表數據以 json 的方式 存儲到 elasticsearch 中去,以便進行數據的全文檢索。

3 安裝部署


3.1 Linux 免密登錄


################################################################
# 1. 產生密鑰
################################################################

# 產生密鑰,中間過程直接按 Enter,多臺服務器時每臺重複執行
[root@localhost ~]# ssh-keygen -t rsa
# 查看生成密鑰文件
[root@localhost ~]# ls .ssh/
id_rsa  id_rsa.pub

################################################################
# 2. 複製公鑰
################################################################

## 在每臺服務器上(包括免登陸目標服務器自己)執行復制公鑰到同一免登陸目標服務器,這樣目標服務器
## 下 ~/.ssh/authorized_keys 文件中包含所有服務器的公鑰;
## 然後將包含所有服務器公鑰的 authorized_keys 文件複製到所有的服務器的 ~/.ssh/目錄下
[root@localhost ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.1.90

## 編輯 ~/.ssh/known_hosts 文件,複製一行內容多次,每行對應一臺服務器,開始內容是服務器 IP,
## IP 後面的內容相同,保存退出之後,將該文件複製到所有服務器的對應目錄下
[root@localhost ~]# vim ~/.ssh/known_hosts
192.168.0.90 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBKAi+TI/ntu3q8erPYoIov2n2XjxkcyBfV1D7UpHqVxFMLt2LULHUH/0D77xaCJEEYShhdJq9H9pKpQ6Bjskr/4=
192.168.0.91 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBKAi+TI/ntu3q8erPYoIov2n2XjxkcyBfV1D7UpHqVxFMLt2LULHUH/0D77xaCJEEYShhdJq9H9pKpQ6Bjskr/4=
...... 省略多個 IP 對應的多行

################################################################
# 3. 複製文件 authorized_keys known_hosts 
################################################################

# 所有服務器對目標服務器已經免密登錄,在每臺服務器上執行文件複製
[root@localhost ~]# scp [email protected]:~/.ssh/known_hosts [email protected]:~/.ssh/authorized_keys ~/.ssh/

這樣集羣中所有服務器均有了包含所有服務器信息的 authorized_keys 和 known_hosts 文件,也就實現了相互間的免密登錄。


3.2 安裝 JDK 8


# 查看 jdk 版本
[root@data-01 ~]# java -version
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
# 查詢已安裝 jdk
[root@data-01 ~]# rpm -qa | grep jdk
java-1.7.0-openjdk-1.7.0.191-2.6.15.5.el7.x86_64
java-1.7.0-openjdk-headless-1.7.0.191-2.6.15.5.el7.x86_64
java-1.8.0-openjdk-headless-1.8.0.181-7.b13.el7.x86_64
java-1.8.0-openjdk-1.8.0.181-7.b13.el7.x86_64
copy-jdk-configs-3.3-10.el7_5.noarch
# 卸載已安裝 jdk
[root@data-01 ~]# rpm -e --nodeps java-1.7.0-openjdk-1.7.0.191-2.6.15.5.el7.x86_64
[root@data-01 ~]# rpm -e --nodeps java-1.7.0-openjdk-headless-1.7.0.191-2.6.15.5.el7.x86_64
[root@data-01 ~]# rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.181-7.b13.el7.x86_64
[root@data-01 ~]# rpm -e --nodeps java-1.8.0-openjdk-1.8.0.181-7.b13.el7.x86_64

# 安裝 oracle jdk 8
[root@web-01 ~]# tar zxf /usr/local/src/jdk-8u181-linux-x64.tar.gz -C /usr/local/
[root@web-01 ~]# ln -s /usr/local/jdk1.8.0_181 /usr/local/jdk

# 設置 環境變量 JAVA_HOME,將 jdk 添加到 PATH
[root@web-01 ~]# vim /etc/profile.d/set-jdk-env-var.sh
export JAVA_HOME=/usr/local/jdk
export PATH=$PATH:$JAVA_HOME/bin
[root@web-01 ~]# source /etc/profile.d/set-jdk-env-var.sh

# 安裝完成
[root@web-01 ~]# java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

3.3 安裝 MySQL 雙主熱備

3.3.1 安裝 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 服務節點上分別進行數據更新,在對應的從節點驗證數據更新被同步。


3.3.2 安裝 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

開機啓動及防火牆設置相關

# 開機啓動
chkconfig keepalived on
# 查看防火牆服務狀態
systemctl status firewalld
# 查看防火牆服務狀態
firewall-cmd --state
# 開啓
service firewalld start
# 重啓
service firewalld restart
# 關閉
service firewalld stop
# 查看防火牆規則
firewall-cmd --list-all
# 查詢端口是否開放
firewall-cmd --query-port=8080/tcp
# 開放80端口
firewall-cmd --permanent --add-port=80/tcp
# 移除端口
firewall-cmd --permanent --remove-port=8080/tcp
# 重啓防火牆(修改配置後要重啓防火牆)
firewall-cmd --reload
# 參數解釋
# 1、firewall-cmd:是Linux提供的操作firewall的一個工具;
# 2、–permanent:表示設置爲持久;
# 3、–add-port:標識添加的端口;


3.4 安裝 Redis 主從 和 Sentinel


解壓、編譯和安裝

[root@data-01 ~]# tar zxvf /usr/local/src/redis-4.0.1.tar.gz -C /usr/local/
[root@data-01 ~]# ln -s /usr/local/redis-4.0.1 /usr/local/redis
[root@data-01 ~]# cd /usr/local/redis
[root@data-01 redis]# make
[root@data-01 redis]# make test
cd src && make test
make[1]: 進入目錄“/usr/local/redis-4.0.1/src”
    CC Makefile.dep
make[1]: 離開目錄“/usr/local/redis-4.0.1/src”
make[1]: 進入目錄“/usr/local/redis-4.0.1/src”
You need tcl 8.5 or newer in order to run the Redis test
make[1]: *** [test] 錯誤 1
make[1]: 離開目錄“/usr/local/redis-4.0.1/src”
make: *** [test] 錯誤 2
# 出現上面的錯誤,安裝 tcl 依賴
[root@data-01 redis]# yum install -y tcl
# 再次運行 make test,結果返回 OK
[root@data-01 redis]# make test
...... 省略日誌輸出,僅顯示結論部分 ↓ ......
\o/ All tests passed without errors!

Cleanup: may take some time... OK
make[1]: 離開目錄“/usr/local/redis-4.0.1/src”
# 安裝 redis 命令腳本到相應的 bin 目錄
[root@data-01 redis]# make install
# 至此 單機安裝完成

修改 Redis 配置

[root@data-01 ~]# mkdir /usr/local/etc/redis
[root@data-01 ~]# cp /usr/local/redis/redis.conf /usr/local/etc/redis/
[root@data-01 ~]# cp /usr/local/redis/sentinel.conf /usr/local/etc/redis/
# 創建必要的目錄
[root@data-01 ~]# mkdir -p redis/logs redis/data
# 編輯 redis 配置文件的下面的項
[root@data-01 ~]# vim /usr/local/redis/redis.conf

redis.conf

protected-mode no
daemonize yes
logfile /root/redis/logs/6379.log
dir /root/redis
# 本 redis instance 的關聯的 master instance 的地址,slave 需要配
slaveof 192.168.0.91 6379
# 訪問 redis master instance 的密碼,maseter 和 slave 都做了配置
masterauth 123456
# 訪問本 redis instance 需要密碼認證,maseter 和 slave 都做了配置
requirepass 123456

!!! redis 配置中,一定要註釋掉 bind 127.0.0.1,否則只能在本機訪問

修改 Sentinel 配置

# 修改 sentinel 配置
[root@data-01 ~]# vim /usr/local/etc/redis/sentinel.conf

sentinel.conf

protected-mode no
sentinel monitor mymaster 192.168.0.91 6379 1
# redis 的 master 的密碼,該配置內容行位置需要在上面配置項 sentinel monitor 的 下面,否則啓動 sentinel 報錯
sentinel auth-pass mymaster 123456
daemonize yes
logfile /root/redis/logs/26379.sentinel.log
pidfile /var/run/redis_26379.pid
# ----------- ↑↑↑ sentinel.conf end ↑↑↑----------- #

啓動 Redis 和 Sentinel

# 啓動 Redis 和 Sentinel
[root@data-01 ~]# redis-server /usr/local/etc/redis/redis.conf
[root@data-01 ~]# redis-sentinel /usr/local/etc/redis/sentinel.conf

# redis-cli 連接 redis 服務查看主從集羣信息
[root@data-01 ~]# redis-cli -h 192.168.0.90
192.168.0.90:6379> info replication
# Replication
role:slave
master_host:192.168.0.91
master_port:6379
# ......省略剩餘信息

經驗證,停止 master,slave 自動轉爲 master。

3.5 安裝 ElasticSearch + Logstash


3.5.1 安裝 Elasticsearch

解壓

[root@web-01 src]# pwd
/usr/local/src
[root@web-01 src]# tar zxvf elasticsearch-7.2.1-linux-x86_64.tar.gz -C /usr/local/
[root@web-01 src]# cd ../
[root@web-01 local]# ln -s elasticsearch-7.2.1 elasticsearch

配置

[root@web-01 local]# cd elasticsearch
[root@web-01 elasticsearch]# vim config/elasticsearch.yml

elasticsearch.yml

cluster.name: yxfes
node.name: node-1
path.data: /usr/local/elasticsearch/data
path.logs: /usr/local/elasticsearch/logs
network.host: 0.0.0.0
http.port: 9200
cluster.initial_master_nodes: ["node-1"]
http.cors.enabled: true
http.cors.allow-origin: "*"

修改 jvm 配置,調整內存分配爲 4G

[root@web-01 elasticsearch]# vim config/jvm.options

jvm.options

-Xms4g
-Xmx4g

修改系統用戶資源限制配置,重新登錄有效

# This change will only take effect the next time the elasticsearch user opens a new session.
[root@web-01 elasticsearch]# vim /etc/security/limits.conf

/etc/security/limits.conf

elasticsearch  -  nofile  65535

修改 vm.max_map_count

[root@web-01 elasticsearch]# vim /etc/sysctl.conf

/etc/sysctl.conf

vm.max_map_count=262144

命令行設置,使 vm.max_map_count 在系統重啓前生效

[root@web-01 elasticsearch]# sysctl -w vm.max_map_count=262144

Elasticsearch 服務不能用 root 用戶啓動,添加啓動用戶,並將 elasticsearch 相關安裝和配置目錄權限設置爲新用戶:

[root@web-01 config]# groupadd elasticsearch
[root@web-01 config]# useradd elasticsearch
[root@web-01 local]# chown -R elasticsearch:elasticsearch elasticsearch
[root@web-01 local]# chown -R elasticsearch:elasticsearch elasticsearch-7.2.1

添加編輯 elasticsearch 服務啓動腳本

[root@web-01 local]# su - elasticsearch
[elasticsearch@web-01 ~]$ vim es_start.sh

啓動腳本 es_start.sh

export ES_HOME=/usr/local/elasticsearch
export JAVA_HOME=$ES_HOME/jdk
export PATH=$PATH:$JAVA_HOME/bin
$ES_HOME/bin/elasticsearch -d

啓動服務並查看

[elasticsearch@web-01 ~]$ chmod +u es_start.sh
[elasticsearch@web-01 ~]$ sh es_start.sh
# 查看服務
[root@web-01 ~]# curl -X GET "localhost:9200/_cat/health?v&pretty"
epoch      timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1589807702 13:15:02  yxfes   green           1         1      0   0    0    0        0             0                  -                100.0%

3.5.2 安裝 logstash


解壓安裝包

[root@web-01 src]# pwd
/usr/local/src
[root@web-01 src]# tar zxvf logstash-oss-7.2.1.tar.gz -C /usr/local/

添加 logstash 服務啓動系統用戶,並修改安裝目錄用戶爲新建用戶:

[root@web-01 logstash]# groupadd logstash
[root@web-01 logstash]# useradd logstash
[root@web-01 logstash]# chown -R logstash:logstash /usr/local/logstash-7.2.1

[root@web-01 logstash]# su - logstash
[logstash@web-01 ~]# mkdir data
[logstash@web-01 ~]# mkdir logs
# 系統的磁盤空間主要掛載到了 /home 下,所以將 data 和 logs 都軟連接到 /home 下
[logstash@web-01 ~]# ln -s /home/logstash/data /usr/local/logstash/data
[logstash@web-01 ~]# ln -s /home/logstash/logs /usr/local/logstash/logs

修改 logstash.conf,配置內容爲從 MySQL 讀取數據,並存儲到 elasticsearch 中,具體內容此處省略,學習參照官方文檔;並上傳配置文件中涉及到的相關文件:

  1. MySQL 驅動:mysql-connector-java-5.1.46.jar;
  2. MySQL 數據查詢 SQL 腳本文件;
  3. Logstash metadata 文件,logstash 服務啓動前,文件內容爲空;
# 修改 /usr/local/logstash/config/logstash.conf 爲項目匹配的配置,這裏省略
[logstash@web-01 ~]# /usr/local/logstash/config/logstash.conf
# 上傳 mysql-connector-java-x.y.z.jar 到 $LS_HOME/config/drivers下
# 上傳 logstash.conf 配置中涉及的 sql 文件 以及 metadata 文件,metadata文件夾下的文件內容初始爲空

添加啓動腳本,並通過腳本啓動服務

# 編輯啓動腳本,添加可執行權限
[logstash@web-01 ~]# vim logstash_start.sh
export LS_HOME=/usr/local/logstash
$LS_HOME/bin/logstash -f $LS_HOME/config/logstash.conf &
sleep 3
tail -100f $LS_HOME/logs/logstash-plain.log
# 運行 logstash
[logstash@web-01 ~]# chmod +x logstash_start.sh

Logstash 服務安裝完畢。


3.6 Spring Boot 服務


3.6.1 可運行 jar 啓動腳本


腳本內容記錄在此,方便以後借鑑

start-spring-service.sh

#!/bin/bash
project_name=$1
my_profile="test"

if [ -n "$2" ]; then
  my_profile="$2"
fi

echo ">>> begining lauch project $project_name ....."
pid=$(jps -l|grep $project_name|cut -d ' ' -f1)
echo ">>> source project process-id----$pid"
if [ $pid ]
 then
   echo ">>> kill source project PID......"
   kill -9  $pid
   echo ">>> restart project ......"
 else
  echo ">>> start project......"
fi

echo ">>> the project profile is: ${my_profile}"
sleep 2

log_file_name=${project_name/-1.0.0.jar/}.out

var_xms=2g
var_xmx=2g
if [[ $project_name == "yunyi-eureka"* || $project_name == "yunyi-config"* ||$project_name == "yunyi-gateway"* ]]
then
  var_xms=512m
  var_xmx=512m
  echo "非業務服務:$project_name,啓動參數 -Xms$var_xms -Xmx$var_xmx"
elif [[ $project_name == "yunyi-channel-manager"* || $project_name == "yunyi-digital-office-manager"* || $project_name == "yunyi-digital-office-rest"*  ]]
then
  var_xms=2g
  var_xmx=2g
elif [[ $project_name == "yunyi-weixin-third"* || $project_name == "yunyi-yxf-tenant"* || $project_name == "yunyi-yxf-project"*  ]]
then
  var_xms=1g
  var_xmx=1g
else
  echo ">>> !!! WARN !!!: 無匹配 project name ...."
fi

echo ">>> 項目名 :$project_name,啓動內存參數 -Xms$var_xms -Xmx$var_xmx 。"
sleep 2
if [[ $project_name == "yunyi-eureka"* || $project_name == "yunyi-config"* ]]
then
  nohup java -server -Xms$var_xms -Xmx$var_xmx -jar $(pwd)/$project_name --spring.profiles.active=$my_profile  >/usr/local/yunyi/logs/$log_file_name 2>&1 &
else
  nohup java -server -Xms$var_xms -Xmx$var_xmx -jar $(pwd)/$project_name --spring.profiles.active=$my_profile --spring.cloud.config.uri=http://10.88.0.92:8888 >/usr/local/yunyi/logs/$log_file_name 2>&1 &
fi
sleep 2
tail -f /usr/local/yunyi/logs/$log_file_name

腳本用法

sh start-spring-service.sh <jar 文件路徑> [spring.profiles.active,默認 test]

3.6.2 從服務器篩選、壓縮和下載文件


參考操作命令,下面示例均是文件夾操作

# 複製文件(夾)
cp -r web-manage temp/
# 刪除篩選掉的文件(夾)
rm -rf icloud-admin icloud-tenant icloud-project
# 壓縮打包
zip -r webui.zip ./
# 下載,也可通過 ftp 工具
sz webui.zip

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