Spring Cloud 項目部署
本文是記錄整個環境的部署,不涉及對方案的討論。
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 創建了快照
- 通過使用 --skip-slave-start 選項,start the slave,這樣同步處理就不開始。
- 導入 dump 文件:
shell> mysql < fulldb.dump
-
方式二 ,使用 raw data files 創建快照
-
解壓數據文件到 slave 的數據目錄下,例如:
shell> tar xvf dbdump.tar
請確認文件權限,確保 slave 可以訪問和修改。
-
通過使用 --skip-slave-start 選項,start the slave,這樣同步處理就不開始。
-
通過 CHANGE MASTER TO 語句配置 slave 在 master 的同步座標、登錄憑證和主機名。
-
啓動 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 中,具體內容此處省略,學習參照官方文檔;並上傳配置文件中涉及到的相關文件:
- MySQL 驅動:mysql-connector-java-5.1.46.jar;
- MySQL 數據查詢 SQL 腳本文件;
- 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