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 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 ~]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值