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

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