本文是记录整个环境的部署,不涉及对方案的讨论。
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 root@192.168.0.90:~/.ssh/known_hosts root@192.168.0.90:~/.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 ~]