集群
- 一、集群介绍
- 二、MySQL集群
- 三、MySQL集群-ShardingSphere
- 四.Redis 集群
- 五、Elasticsearch 集群
- 六、RabbitMQ 集群
- 七.k8s 有状态服务部署
一、集群介绍
百度云笔记 提取码 1111
MySQL集群、Redis集群、elasticsearch集群、rabbitMQ集群等
1.1集群的目标
1.2集群的基础方式
二、MySQL集群
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 目录下
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 是天生支持集群的,他不需要依赖其他的服务发现和注册的组件,如 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 提供的稳定域名