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