集群的操作

集群

一、集群介绍

百度云笔记 提取码 1111
MySQL集群、Redis集群、elasticsearch集群、rabbitMQ集群等

1.1集群的目标

在这里插入图片描述

1.2集群的基础方式

在这里插入图片描述

二、MySQL集群

百度云笔记 提取码 1111

1、集群原理

在这里插入图片描述

2、Docker 安装模拟 MySQL 主从复制集群

2.1、下载 mysql 镜像

2.2、创建 Master 实例并启动

1).创建master实例

在192.168.56.10下,、/mydata/mysql下执行命令
在这里插入图片描述
在这里插入图片描述

docker run -p 3307:3306 --name mysql-master \
 -v /mydata/mysql/master/log:/var/log/mysql \
 -v /mydata/mysql/master/data:/var/lib/mysql \
 -v /mydata/mysql/master/conf:/etc/mysql \
 -e MYSQL_ROOT_PASSWORD=root \
 -d mysql:5.7

参数说明
-p 3307:3306:将容器的 3306 端口映射到主机的 3307 端口
-v /mydata/mysql/master/conf:/etc/mysql:将配置文件夹挂在到主机
-v /mydata/mysql/master/log:/var/log/mysql:将日志文件夹挂载到主机
-v /mydata/mysql/master/data:/var/lib/mysql/:将配置文件夹挂载到主机
-e MYSQL_ROOT_PASSWORD=root:初始化 root

2).修改 master 基本配置

vi /mydata/mysql/master/conf/my.cnf

[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci' 
init_connect='SET NAMES utf8' 
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
注意:skip-name-resolve 一定要加,不然连接 mysql 会超级慢
3) 添加 master 主从复制部分配置

vi /mydata/mysql/master/conf/my.cnf

把以下配置放入/mydata/mysql/master/conf/my.cnf

server_id=1
log-bin=mysql-bin
read-only=0
binlog-do-db=gulimall_ums
binlog-do-db=gulimall_pms
binlog-do-db=gulimall_oms
binlog-do-db=gulimall_sms
binlog-do-db=gulimall_wms
binlog-do-db=gulimall_admin
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
4).重启 master

docker restart mysql-master

2.3、创建 Slave 实例并启动

1).创建master实例

在192.168.56.10下,、/mydata/mysql下执行命令

docker run -p 3317:3306 --name mysql-slaver-01 \
 -v /mydata/mysql/slaver/log:/var/log/mysql \
 -v /mydata/mysql/slaver/data:/var/lib/mysql \
 -v /mydata/mysql/slaver/conf:/etc/mysql \
 -e MYSQL_ROOT_PASSWORD=root \
 -d mysql:5.7

在这里插入图片描述

在这里插入图片描述

2).修改 slave 基本配置

vi /mydata/mysql/slaver/conf/my.cnf

[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci' 
init_connect='SET NAMES utf8' 
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
3).添加 master 主从复制部分配置

vi /mydata/mysql/slaver/conf/my.cnf

把以下配置放入/mydata/mysql/slaver/conf/my.cnf

server_id=2
log-bin=mysql-bin
read-only=1
binlog-do-db=gulimall_ums
binlog-do-db=gulimall_pms
binlog-do-db=gulimall_oms
binlog-do-db=gulimall_sms
binlog-do-db=gulimall_wms
binlog-do-db=gulimall_admin
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
4).重启 slaver

docker restart mysql-slaver-01

5).navicat连接

或者使用navicat连接,进入master数据库
端口号3307(master),3317(slaver),ip 都192.168.56.10

2.4、为 master 授权用户来他的同步数据

作用:授权一个用户可以访问主节点,进行日志复制。

1).进入 master 容器

docker exec -it mysql /bin/bash
或者使用navicat连接,在master执行

2).添加用来同步的用户
GRANT REPLICATION SLAVE ON *.* to 'backup'@'%' identified by '123456';

在这里插入图片描述

3).查看 master 状态

show master status
在这里插入图片描述

2.5 配置 slaver 同步 master 数据

作用:告诉从mysql,即slaver,需要同步哪个主节点

1).进入 slaver 容器

docker exec -it mysql-slaver-01 /bin/bash
或者进入Navicat的slaver

2).设置主库连接
change master to master_host='192.168.56.10',master_user='backup',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=0,master_port=3307

在这里插入图片描述

3).启动从库同步

start slave

4)、查看从库状态

show slave status
在这里插入图片描述

2.6 测试主从复制

1).从56.10的mysql导出mysql数据库

在这里插入图片描述
在这里插入图片描述

2).master数据库导入数据

创建数据库,执行SQL脚本
在这里插入图片描述

3).修改某表数据

在这里插入图片描述

4).查看slaver数据库

刷新从库,即slaver,发现也有数据库,及表
在这里插入图片描述
效果:只要主库有任何修改,从库都有相同的操作。这就是主从复制的效果

至此主从配置完成;
总结:
1)、主从数据库在自己配置文件中声明需要同步哪个数据库,忽略哪个数据库等信息。
并且 server-id 不能一样
2)、主库授权某个账号密码来同步自己的数据
3)、从库使用这个账号密码连接主库来同步数据

三、MySQL集群-ShardingSphere

0.分片存储 简介

主从复制,不能解决单表的性能问题。
当某个表,数据量特别大的时候,查询起来非常慢。所以,需要分片存储

分库分表怎么做?

除了innodb class外,还可以在主从同步配置,或双主配时,让每一个主服务器,设置一个自增的主键。

1. 自增的主键-不用了

比如,在第一个服务器,进行以下设置

auto_increment_offset: 1 从几开始增长

在第二个服务器,进行以下设置

auto_increment_increment: 2 每次的步长

这种方式不好为何。放弃使用

2. 使用 MyCat 或者 ShardingSphere

1.ShardingSphere 简介

ShardingSphere 文档5.0
ShardingSphere 文档4.0 ,使用4.0

ShardingSphere 由 JDBC、Proxy 和 Sidecar(规划中)组成

1.1产品

1). ShardingSphere-JDBC (麻烦)

使用ShardingSphere-JDBC,还需要依赖,太麻烦
在这里插入图片描述

2). ShardingSphere-Proxy (可以 ok)

ShardingSphere-Proxy,为透明化的数据库代理端,可以使用。
使用ShardingSphere-Proxy,它代理我们管理数据库。

在这里插入图片描述

3). ShardingSphere-Sidecar(TODO,正在 开发)

2.分库分表,读写&分离

构建的数据库结构
在这里插入图片描述

2.1 ShardingSphere-Proxy 的使用

ShardingSphere-Proxy 用户手册5.0
ShardingSphere-Proxy 用户手册4.0, 使用4.0
在这里插入图片描述

PROXY 启动两种方式,镜像、压缩包。我们使用 压缩包的方式

1).下载安装 Sharding-Proxy

Sharding-Proxy压缩包 5.0
Sharding-Proxy压缩包 4.0, 使用4.0
在这里插入图片描述

a.下载安装 mysql驱动

下载安装 mysql驱动,将其放入 SHARDINGSPHERE_PROXY /lib 目录下

下载MySQL 数据库
在这里插入图片描述

2.2、配置数据分片+读写分离

1).修改server.yaml文件

配置Sharding数据库
在这里插入图片描述
在这里插入图片描述

2).修改config-sharding.yaml文件

配置分库分表策略
在这里插入图片描述

schemaName: sharding_db
# 配置两个数据源,即2个master数据库
dataSources:
  ds_0:
    url: jdbc:mysql://192.168.56.10:3307/demo_ds_0?serverTimezone=UTC&useSSL=false
    username: root
    password: root
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
    
  ds_1:
    url: jdbc:mysql://192.168.56.10:3307/demo_ds_1?serverTimezone=UTC&useSSL=false
    username: root
    password: root
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
    
#每个数据库,每张表都分为2张表
shardingRule:
  tables:
    #订单表的分表策略
    t_order:
      actualDataNodes: ds_${0..1}.t_order_${0..1}
      tableStrategy:
        inline:
          #根据订单id进行分表,订单id对2取模,值为0为表0,1则表1
          shardingColumn: order_id
          algorithmExpression: t_order_${order_id % 2}
      keyGenerator:
        type: SNOWFLAKE
        column: order_id
        
    #订单项表的分表策略
    t_order_item:
      actualDataNodes: ds_${0..1}.t_order_item_${0..1}
      tableStrategy:
        inline:
          shardingColumn: order_id
          algorithmExpression: t_order_item_${order_id % 2}
      keyGenerator:
        type: SNOWFLAKE
        column: order_item_id
  #绑定的表为订单表,订单项表
  bindingTables:
    - t_order,t_order_item
  #数据库策略
  defaultDatabaseStrategy:
    inline:
      shardingColumn: user_id
      algorithmExpression: ds_${user_id % 2}
  defaultTableStrategy:
    none:
3).修改config-master_slave.yaml文件

配置读写分离的配置
在这里插入图片描述

a.修改config-master_slave.yaml文件
   schemaName: sharding_db_1
#读写分离 配置 
dataSources:
  master_0_ds:
    url: jdbc:mysql://192.168.56.10:3307/demo_ds_0?serverTimezone=UTC&useSSL=false
    username: root
    password: root
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
  slave_ds_0:
    url: jdbc:mysql://192.168.56.10:3317/demo_ds_0?serverTimezone=UTC&useSSL=false
    username: root
    password: root
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
   

#数据源的主从规则
masterSlaveRule:
  name: ms_ds_0
  masterDataSourceName: master_0_ds
  slaveDataSourceNames:
    - slave_ds_0

b.修改config-master_slave2.yaml文件
schemaName: sharding_db_2
#读写分离 配置 
dataSources:
  master_1_ds:
    url: jdbc:mysql://192.168.56.10:3307/demo_ds_1?serverTimezone=UTC&useSSL=false
    username: root
    password: root
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
  slave_ds_1:
    url: jdbc:mysql://192.168.56.10:3317/demo_ds_1?serverTimezone=UTC&useSSL=false
    username: root
    password: root
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50    
    

#数据源的主从规则
masterSlaveRule:
  name: ms_ds_1
  masterDataSourceName: master_1_ds
  slaveDataSourceNames:
    - slave_ds_1
   
4). 启动sharding

在这里插入图片描述

a.问题1, jar包有的后缀名不对

原因:jar包有的后缀名不对,修改就行
在这里插入图片描述
在这里插入图片描述

.b.问题2,数据库不存在

数据库demo_ds_1 不存在
在这里插入图片描述
解决方法:创建数据库

5).创建数据库
a.停止maser、slaver数据库

docker stop mysql-master mysql-slaver-01

b. 修改mater的my.cnf文件,

在/mydata/mysql/master/conf/下的my.cnf文件
添加以下配置
binlog-do-db=demo_ds_0
binlog-do-db=demo_ds_1
在这里插入图片描述

c. 修改slaver的my.cnf文件,

在/mydata/mysql/slaver/conf/下的my.cnf文件
添加以下配置
binlog-do-db=demo_ds_0
binlog-do-db=demo_ds_1
在这里插入图片描述
重启master、slaver

6).navicat创建master的数据库

分别在master、slaver创建demo_ds_0、demo_ds_1数据库
在这里插入图片描述

6).重启sharding-ok

在这里插入图片描述
在这里插入图片描述

7).创建sharding数据库
a.启动sharding,带端口号

cmd,start.bat 3388

b.使用Navicat连接 失败XXX

在这里插入图片描述

c 连接成功,但是打不开

在这里插入图片描述
原因:docker的mysql与本地mysql版本不一致
本地mysql 是8.1,docker的mysql是5.7
咋办?

安装5.7mysql

Windows安装MySQL5.7教程
安装5.7的mysql端口号为3307
安装路径:D:\Program Files\MySQL\MySQL Server 5.7
安装方式:msi文件安装

d.sharding安装失败

四.Redis 集群

1、redis 集群形式

1.1、数据分区方案

1)、客户端分区

在这里插入图片描述
客户端分区方案 的代表为 Redis Sharding,Redis Sharding 是 Redis Cluster 出来之前,业
界普遍使用的 Redis 多实例集群 方法。Java 的 Redis 客户端驱动库 Jedis,支持 Redis
Sharding 功能,即 ShardedJedis 以及 结合缓存池 的 ShardedJedisPool。

优点
不使用 第三方中间件,分区逻辑 可控,配置 简单,节点之间无关联,容易 线性扩展,灵
活性强。

缺点
客户端 无法 动态增删 服务节点,客户端需要自行维护 分发逻辑,客户端之间 无连接共享,
会造成 连接浪费。

2)、客户端分区

在这里插入图片描述
代理分区常用方案有 Twemproxy 和 Codis。

3)、redis-cluster

1.2 、高可用方式

1).Sentinel( 哨兵机制)支持高可用

前面介绍了主从机制,但是从运维角度来看,主节点出现了问题我们还需要通过人工干预的
方式把从节点设为主节点,还要通知应用程序更新主节点地址,这种方式非常繁琐笨重, 而
且主节点的读写能力都十分有限,有没有较好的办法解决这两个问题,哨兵机制就是针对第
一个问题的有效解决方案,第二个问题则有赖于集群!哨兵的作用就是监控 Redis 系统的运
行状况,其功能主要是包括以下三个:

  • 监控(Monitoring): 哨兵(sentinel) 会不断地检查你的 Master 和 Slave 是否运作正常。
  • 提醒(Notification): 当被监控的某个 Redis 出现问题时, 哨兵(sentinel) 可以通过 API
    向管理员或者其他应用程序发送通知。
  • 自动故障迁移(Automatic failover): 当主数据库出现故障时自动将从数据库转换为主数
    据库。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    《深入理解 Redis 哨兵搭建及原理》
2).redis-cluster

详见下章

2、Redis-Cluster

https://redis.io/topics/cluster-tutorial/
Redis 的官方多机部署方案,Redis Cluster。一组 Redis Cluster 是由多个 Redis 实例组成,官
推荐使用 6 实例,其中 3 个为主节点,3 个为从结点。一旦有主节点发生故障的时候,
Redis Cluster 可以选举出对应的从结点成为新的主节点,继续对外服务,从而保证服务的高
可用性。那么对于客户端来说,知道知道对应的 key 是要路由到哪一个节点呢?Redis Cluster
把所有的数据划分为 16384 个不同的槽位,可以根据机器的性能把不同的槽位分配给不同
的 Redis 实例
,对于 Redis 实例来说,他们只会存储部分的 Redis 数据,当然,**槽的数据是
可以迁移的,**不同的实例之间,可以通过一定的协议,进行数据迁移。
在这里插入图片描述

2.1、槽

在这里插入图片描述
Redis 集群的功能限制;Redis 集群相对 单机 在功能上存在一些限制,需要 开发人员 提前
了解,在使用时做好规避。JAVA CRC16 校验算法
在这里插入图片描述在这里插入图片描述

2.2、一致性 hash

一致性哈希 可以很好的 解决稳定性问题,可以将所有的 存储节点 排列在 收尾相接 的
Hash 环上,每个 key 在计算 Hash 后会 顺时针 找到 临接 的 存储节点 存放。而当有节
点 加入 或 退出 时,仅影响该节点在 Hash 环上 顺时针相邻 的 后续节点。
在这里插入图片描述
Hash 倾斜
如果节点很少,容易出现倾斜,负载不均衡问题。一致性哈希算法,引入了虚拟节点,在整
个环上,均衡增加若干个节点。比如 a1,a2,b1,b2,c1,c2,a1 和 a2 都是属于 A 节点
的。解决 hash 倾斜问题

3、部署 Cluster - - 开始操作

3.1、创建 6 个 redis 节点

3 主 3 从方式。从为了同步备份,主进行 slot 数据分片
在这里插入图片描述

for port in $(seq 7001 7006); \
do \
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
port ${port}
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 192.168.56.10
cluster-announce-port ${port}
cluster-announce-bus-port 1${port}
appendonly yes
EOF
docker run -p ${port}:${port} -p 1${port}:1${port} --name redis-${port} \
 -v /mydata/redis/node-${port}/data:/data \
 -v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
 -d redis:5.0.7 redis-server /etc/redis/redis.conf; \
done

在这里插入图片描述
创建成功,7001~7006
在这里插入图片描述

3.2、使用 redis 建立集群

进入某个redis内部
docker exec -it redis-7001 bash
执行命令
redis-cli --cluster create 192.168.56.10:7001 192.168.56.10:7002 192.168.56.10:7003 192.168.56.10:7004 192.168.56.10:7005 192.168.56.10:7006 --cluster-replicas 1

在这里插入图片描述在这里插入图片描述

3.3、测试集群效果

随便进入某个 redis 容器
docker exec -it redis-7002 /bin/bash

使用 redis-cli 的 cluster 方式进行连接,如进入7006
redis-cli -c -h 192.168.56.10 -p 7006

cluster info; 获取集群信息
cluster nodes;获取集群节点
Get/Set 命令测试,将会重定向
节点宕机,slave 会自动提升为 master,master 开启后变为 slave

添加、获得数据,测试

在这里插入图片描述

3.4 k8s 部署 redis

参照有状态部署即可

五、Elasticsearch 集群

1、集群原理

Elasticsearch: 权威指南
集群内的原理

elasticsearch 是天生支持集群的,他不需要依赖其他的服务发现和注册的组件,如 zookeeper
这些,因为他内置了一个名字叫 ZenDiscovery 的模块,是 elasticsearch 自己实现的一套用
于节点发现和选主等功能的组件,所以 elasticsearch 做起集群来非常简单,不需要太多额外
的配置和安装额外的第三方组件。

1.1、单节点

在这里插入图片描述在这里插入图片描述

1.2、集群健康

在这里插入图片描述

1.3 分片

  • 一个 分片 是一个底层的 工作单元 ,它仅保存了全部数据中的一部分。我们的文档被
    存储和索引到分片内,但是应用程序是直接与索引而不是与分片进行交互。分片就认为
    是一个数据区
  • 一个分片可以是 主 分片或者 副本 分片。索引内任意一个文档都归属于一个主分片,
    所以主分片的数目决定着索引能够保存的最大数据量。
  • 在索引建立的时候就已经确定了主分片数,但是副本分片数可以随时修改
  • 让我们在包含一个空节点的集群内创建名为 blogs 的索引。 索引在默认情况下会被分
    配 5 个主分片, 但是为了演示目的,我们将分配 3 个主分片和一份副本(每个主分片
    拥有一个副本分片):
PUT /blogs{
"settings" : {
"number_of_shards" : 3,
"number_of_replicas" : 1
}}

在这里插入图片描述

1.4、新增节点

在这里插入图片描述

1.5 水平扩容-启动第三个节点

在这里插入图片描述
在运行中的集群上是可以动态调整副本分片数目的,我们可以按需伸缩集群。让我们把副本
数从默认的 1 增加到 2

PUT /blogs/_settings
{
"number_of_replicas" : 2
}

在这里插入图片描述

1. 6、应对故障

在这里插入图片描述

1.7、问题与解决

1)、主节点

主节点负责创建索引、删除索引、分配分片、追踪集群中的节点状态等工作。Elasticsearch中的主节点的工作量相对较轻,用户的请求可以发往集群中任何一个节点,由该节点负责分发和返回结果,而不需要经过主节点转发。而主节点是由候选主节点通过 ZenDiscovery 机制选举出来的,所以要想成为主节点,首先要先成为候选主节点。

2)、候选主节点

node.master: true
在这里插入图片描述

3)、数据节点

node.data:true
在这里插入图片描述

4)、客户端节点

在这里插入图片描述

node.master: false
node.data: false
5)、脑裂”问题可能的成因

在这里插入图片描述

1.8、集群结构

三台物理机为例。在这三台物理机上,搭建了 6 个 ES 的节点,三个 data 节点,三个 master
节点(每台物理机分别起了一个 data 和一个 master),3 个 master 节点
,目的是达到(n/2)
+1 等于 2 的要求,这样挂掉一台 master 后(不考虑 data),n 等于 2,满足参数,其他两
个 master 节点都认为 master 挂掉之后开始重新选举,

master 节点上
node.master = true
node.data = false
discovery.zen.minimum_master_nodes = 2

data 节点上
node.master = false
node.data = true

在这里插入图片描述

2、集群搭建

在这里插入图片描述
所有之前先运行:

sysctl -w vm.max_map_count=262144

我们只是测试,所以临时修改。

永久修改使用下面

#防止 JVM 报错
echo vm.max_map_count=262144 >> /etc/sysctl.conf
sysctl -p

2.0、准备 docker 网络

Docker 创建容器时默认采用 bridge 网络,自行分配 ip,不允许自己指定。
在实际部署中,我们需要指定容器 ip,不允许其自行分配 ip,尤其是搭建集群时,固定 ip是必须的。
我们可以创建自己的 bridge 网络 : mynet,创建容器的时候指定网络为 mynet 并指定 ip即可。

查看网络模式 docker network ls;

在这里插入图片描述
创建一个新的 bridge 网络

docker network create --driver bridge --subnet=172.18.12.0/16 --gateway=172.18.1.1 mynet

在这里插入图片描述

查看网络信息
docker network inspect mynet

在这里插入图片描述
以后使用- -network=mynet --ip 172.18.12.x 指定 ip

2.1、3-Master 节点创建

创建3个master主节点

for port in $(seq 1 3); \
do \
mkdir -p /mydata/elasticsearch/master-${port}/config
mkdir -p /mydata/elasticsearch/master-${port}/data
chmod -R 777 /mydata/elasticsearch/master-${port}
cat << EOF >/mydata/elasticsearch/master-${port}/config/elasticsearch.yml
cluster.name: my-es #集群的名称,同一个集群该值必须设置成相同的
node.name: es-master-${port} #该节点的名字
node.master: true #该节点有机会成为 master 节点
node.data: false #该节点可以存储数据
network.host: 0.0.0.0
http.host: 0.0.0.0 #所有 http 均可访问
http.port: 920${port}
transport.tcp.port: 930${port}
#discovery.zen.minimum_master_nodes: 2 #设置这个参数来保证集群中的节点可以知道其它 N 个有 master 资格的节点。官方推荐(N/2+1
discovery.zen.ping_timeout: 10s #设置集群中自动发现其他节点时 ping 连接的超时时间
discovery.seed_hosts: ["172.18.12.21:9301", "172.18.12.22:9302", "172.18.12.23:9303"] #设置集群中的 Master 节点的初始列表,可以通过这些节点来自动发现其他新加入集群的节点,es7的新增配置
cluster.initial_master_nodes: ["172.18.12.21"] #新集群初始时的候选主节点,es7 的新增配置
EOF
docker run --name elasticsearch-node-${port} \
 -p 920${port}:920${port} -p 930${port}:930${port} \
 --network=mynet --ip 172.18.12.2${port} \
 -e ES_JAVA_OPTS="-Xms300m -Xmx300m" \
 -v /mydata/elasticsearch/master-${port}/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
 -v /mydata/elasticsearch/master-${port}/data:/usr/share/elasticsearch/data \
 -v /mydata/elasticsearch/master-${port}/plugins:/usr/share/elasticsearch/plugins \
 -d elasticsearch:7.4.2
done

在这里插入图片描述

查看es节点是否安装成功
docker ps

在这里插入图片描述

2.2、 3-Data-Node 创建

创建3个data数据节点

for port in $(seq 4 6); \
do \
mkdir -p /mydata/elasticsearch/node-${port}/config
mkdir -p /mydata/elasticsearch/node-${port}/data
chmod -R 777 /mydata/elasticsearch/node-${port}
cat << EOF >/mydata/elasticsearch/node-${port}/config/elasticsearch.yml
cluster.name: my-es #集群的名称,同一个集群该值必须设置成相同的
node.name: es-node-${port} #该节点的名字
node.master: false #该节点有机会成为 master 节点
node.data: true #该节点可以存储数据
network.host: 0.0.0.0
#network.publish_host: 192.168.56.10 #互相通信 ip,要设置为本机可被外界访问的 ip,否则无法通信
http.host: 0.0.0.0 #所有 http 均可访问
http.port: 920${port}
transport.tcp.port: 930${port}
#discovery.zen.minimum_master_nodes: 2 #设置这个参数来保证集群中的节点可以知道其它 N 个有 master 资格的节点。官方推荐(N/2+1
discovery.zen.ping_timeout: 10s #设置集群中自动发现其他节点时 ping 连接的超时时间
discovery.seed_hosts: ["172.18.12.21:9301", "172.18.12.22:9302", "172.18.12.23:9303"] #设置集群中的 Master 节点的初始列表,可以通过这些节点来自动发现其他新加入集群的节点,es7的新增配置
cluster.initial_master_nodes: ["172.18.12.21"] #新集群初始时的候选主节点,es7 的新增配置
EOF
docker run --name elasticsearch-node-${port} \
 -p 920${port}:920${port} -p 930${port}:930${port} \
 --network=mynet --ip 172.18.12.2${port} \
 -e ES_JAVA_OPTS="-Xms300m -Xmx300m" \
 -v /mydata/elasticsearch/node-${port}/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
 -v /mydata/elasticsearch/node-${port}/data:/usr/share/elasticsearch/data \
 -v /mydata/elasticsearch/node-${port}/plugins:/usr/share/elasticsearch/plugins \
 -d elasticsearch:7.4.2
done

在这里插入图片描述

查看结果
docker ps 

创建3个master主节点、3个data数据节点,ok
在这里插入图片描述
查看日志,es是否有异常

docker logs elasticsearch-node-3

2.3、测试集群

测试是否可以访问
http://192.168.56.10:9201 等,一个个测试

在这里插入图片描述
查看节点状况
http://192.168.56.10:9201/_nodes/process?pretty
查看集群状态
http://192.168.56.10:9201/_cluster/stats?pretty
查看集群健康状况
http://192.168.56.10:9201/_cluster/health?pretty
查看各个节点信息
http://192.168.56.10:9202/_cat/nodes
在这里插入图片描述

3、k8s 上部署

有状态服务

jvm.options -Xms100m
-Xmx512m

六、RabbitMQ 集群

1、集群形式

RabbiMQ 是用 Erlang 开发的,集群非常方便,因为 Erlang 天生就是一门分布式语言,但其
本身并不支持负载均衡。
RabbitMQ 集群中节点包括内存节点(RAM)、磁盘节点(Disk,消息持久化),集群中至少有
一个 Disk 节点。
在这里插入图片描述

1.1、搭建集群

mkdir /mydata/rabbitmq
cd rabbitmq/
mkdir rabbitmq01 rabbitmq02 rabbitmq03

在这里插入图片描述

docker run -d --hostname rabbitmq01 --name rabbitmq01 -v /mydata/rabbitmq/rabbitmq01:/var/lib/rabbitmq -p 15673:15672 -p 5673:5672 -e RABBITMQ_ERLANG_COOKIE='atguigu' rabbitmq:management

docker run -d --hostname rabbitmq02 --name rabbitmq02 -v /mydata/rabbitmq/rabbitmq02:/var/lib/rabbitmq -p 15674:15672 -p 5674:5672 -e RABBITMQ_ERLANG_COOKIE='atguigu' --link rabbitmq01:rabbitmq01 rabbitmq:management

docker run -d --hostname rabbitmq03 --name rabbitmq03 -v /mydata/rabbitmq/rabbitmq03:/var/lib/rabbitmq -p 15675:15672 -p 5675:5672 -e RABBITMQ_ERLANG_COOKIE='atguigu' --link rabbitmq01:rabbitmq01 --link rabbitmq02:rabbitmq02 rabbitmq:management

在这里插入图片描述

查看创建结果
docker ps

在这里插入图片描述
测试 访问
http://192.168.56.10:15673
http://192.168.56.10:15674
http://192.168.56.10:15675
用户名密码为 guest

1.2、节点加入集群

初始化01、02、03

进入第一个节点
docker exec -it rabbitmq01 /bin/bash

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
Exit

在这里插入图片描述

进入第二个节点
docker exec -it rabbitmq02 /bin/bash

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbitmq01
rabbitmqctl start_app
exit

进入第三个节点
docker exec -it rabbitmq03 bash

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbitmq01
rabbitmqctl start_app
exit

1.3、实现镜像集群

随便进入一个RabbitMQ
docker exec -it rabbitmq01 bash

在这里插入图片描述
查看 vhost/下面的所有 policy,可以使用

 rabbitmqctl list_policies -p /

在这里插入图片描述

这样,整个集群就会变成镜像集群,如http://192.168.56.10:15673/为例子,进行测试
测试1. 添加队列
rabbitMq1添加队列,另外2个rabbitMq也会有结果
在这里插入图片描述
测试2. 发送消息
rabbitMq1发送消息
在这里插入图片描述
进入其他RabbitMQ,hello确实有消息
在这里插入图片描述
RabbitMQ消费消息,其他RabbitMQ也可以看到消息没了。

在这里插入图片描述
在这里插入图片描述

七.k8s 有状态服务部署

可以使用 kubesphere,快速搭建 MySQL 环境。

  • 有状态服务抽取配置为 ConfigMap
  • 有状态服务必须使用 pvc 持久化数据
  • 服务集群内访问使用 DNS 提供的稳定域名

在这里插入图片描述
mysql部署,参照 k8s 上部署

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值