13 集群搭建 zookeeper solr redis.txt
UP 返回
1.zookeeper集群部署
!!@@202207191.png_555_400_0.5@@!! 集群部署图
!!@@202207228.png_580_551_1@@!! 选举过程,一般配置奇数个结点,方便选举超过半数
集群配置方式:(此处在同一个服务器上配置三个节点,以端口进行区分)
1) 安装测试服务器:zookeeper-123654-zoo,安装的是CentOS6,网络记得改为仅主机模式,ip为192.168.25.131,root/123654,zoo/123654,固定ip地址参2.4节:E:\笔记积累\编程Blog\JavaWeb高并发大型电商\01 1-6 环境配置.txt 注意对ifcfg-eth0的修改需要和文档中写的一致,原有的数据不删掉可能会报错,导致修改失败(结论存疑)
同时关闭linux防火墙,参上述文档2.5节(一定要关闭)
!!@@202207221.png_631_204_1@@!!
!!@@202207272.png_1044_532_1@@!! 查看虚拟机的子网ip和网关
2) 安装jdk 参同上文档2.7节
3) 安装zookeeper 参1.2节:E:\笔记积累\编程Blog\JavaWeb 品优购\01 环境框架搭建.txt
将Zookeeper解压 ,在解压后的文件夹中创建data目录 ,将 conf下zoo_sample.cfg 文件改名为 zoo.cfg
mkdir /usr/local/zookeeper-cluster #创建该目录
cp -r zookeeper-3.4.6 /usr/local/zookeeper-cluster/zookeeper-1 #将解压后的Zookeeper复制到以下三个目录
cp -r zookeeper-3.4.6 /usr/local/zookeeper-cluster/zookeeper-2
cp -r zookeeper-3.4.6 /usr/local/zookeeper-cluster/zookeeper-3
4) 配置每一个Zookeeper 的dataDir(zoo.cfg) clientPort 分别为2181 2182 2183
修改/usr/local/zookeeper-cluster/zookeeper-1/conf/zoo.cfg
clientPort=2181
dataDir=/usr/local/zookeeper-cluster/zookeeper-1/data
修改/usr/local/zookeeper-cluster/zookeeper-2/conf/zoo.cfg
clientPort=2182
dataDir=/usr/local/zookeeper-cluster/zookeeper-2/data
修改/usr/local/zookeeper-cluster/zookeeper-3/conf/zoo.cfg
clientPort=2183
dataDir=/usr/local/zookeeper-cluster/zookeeper-3/data
5) 在每个zookeeper的 data 目录下创建一个 myid 文件,内容分别是1、2、3 。这个文件就是记录每个服务器的ID
如果你创建的文本文件内容比较简单,可以通过echo 命令快速创建文件:echo 内容 >文件名
!!@@202207222.png_476_63_1@@!!
6) 在每一个zookeeper 的 zoo.cfg配置客户端访问端口(clientPort)和集群服务器IP列表。集群服务器IP列表如下
server.1=192.168.25.131:2881:3881
server.2=192.168.25.131:2882:3882
server.3=192.168.25.131:2883:3883
#server.服务器ID=服务器IP地址:服务器之间通信端口:服务器之间投票选举端口 例如:2181是客户端连接的端口,2881就是zookeeper之间通信的端口,而3881作为选举端口,这些端口可以自己指定
大批量修改文件内容可以使用editPlus:
文件 -> FTP -> 设置FTP服务器 -> 添加,输入相关参数,再点击高级设置,加密选sftp,端口输入22
!!@@202207225.png_841_494_1@@!!
确定保存后,在目录中选取远程服务器即可连接,进入对应的三个目录,将上述配置复制进zoo.cfg:
!!@@202207224.png_538_322_1@@!! !!@@202207227.png_1150_650_1@@!!
7) 启动结点
进入第一个节点,启动并查看状态,此时因为只有一个结点,所以集群仍未启动:
./zkServer.sh start
./zkServer.sh status
!!@@202207229.png_614_137_1@@!!
进入第二个节点,同样操作,可以看到集群启动了,且2节点是leader,1节点是follower
!!@@2022072211.png_615_182_1@@!!
进入第三个节点,同样操作,可以看到3节点也是follower,因为leader已经存在了
!!@@2022072212.png_613_128_1@@!!
8) 异常模拟
通过./zkServer.sh stop模拟节点挂掉,可以看到一下结果:
3个节点的集群,从服务器挂掉,集群正常 :把3号服务器停掉
3个节点的集群,2个从服务器都挂掉,主服务器也无法运行。因为可运行的机器没有超过集群总数量的半数 :把1号服务器(从服务器)也停掉,查看2号(主服务器)的状态
启动挂掉的一个节点,集群继续正常工作,且之前的leader保持不变 :再次把1号服务器启动起来,发现2号服务器又开始正常工作了
当集群中的主服务器挂了,集群中的其他服务器会自动进行选举状态,然后产生新得leader :把3号服务器也启动起来,把2号服务器停掉
当领导者产生后,再次有新服务器加入集群,不会影响到现任领导者 :把2号服务器重新启动,2号服务器启动后依然是跟随者(从服务器),3号服务器依然是领导者(主服务器)
Dubbox连接zookeeper集群,修改服务提供者和服务调用者的spring 配置文件:
<!-- 指定注册中心地址 -->
<dubbo:registry
protocol="zookeeper" address="192.168.25.140:2181,192.168.25.140:2182,192.168.25.140:2183">
</dubbo:registry>
!!@@2022072214.png_1443_306_1@@!!
由于项目使用properties注入的方式引入的dubbox参数,所以在本项目中连接zookeeper集群方式为:
1) 改造common模块,修改dubbox_pro.properties文件为集群地址。重新install该模块,输入参数install -P pro
2) 以search模块做测试,启动solr,启动redis。注释掉search-service中applicationContext-service.xml的zookeeper服务器地址,因为该模块引入了common,同时web.xml文件中可以读取classpath*:spring/applicationContext*.xml,故能够拿到common中的配置
3) 修改search-web,首先同样注释掉applicationContext-service.xml的zookeeper服务器地址,此时需要引入common依赖以获取其中的zookeeper参数,但是web.xml中需要额外加上读取classpath*:spring/applicationContext*.xml,以保证配置文件可以被读到
!!@@202207261.png_1121_515_1@@!!
4) 启动search-service service-web(两服务启动未报错) solr redis,访问 http://localhost:9104/ ,可以正常查询,说明集群连接成功
2. solr集群部署
2.1 概念
SolrCloud(solr 云)是 Solr 提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud。当一个系统的索引数据量少的时候是不需要使用 SolrCloud的,当索引量很大,搜索请求并发很高,这时需要使用 SolrCloud 来满足这些需求。
SolrCloud 是基于 Solr 和Zookeeper的分布式搜索方案,它的主要思想是使用 Zookeeper作为集群的配置信息中心。
!!@@202207281.png_826_628_1@@!! SolrCloud系统架构
上图中,从物理结构来看,有三个 Solr 实例( 每个实例包括两个 Core),组成一个 SolrCloud。每一个实例可以当成一个solr服务器,而一台服务器又可以分成多个core;同一个服务器的core应该存储不同的数据,同理相同数据的备份应该放在不同的服务器core上以达到容错的目的
从逻辑结构来看,索引集合包括两个 Shard(shard1 和 shard2),shard1 和 shard2 分别由三个 Core 组成,其中一个 Leader 两个 Replication,Leader 是由 zookeeper 选举产生,zookeeper 控制每个shard上三个 Core 的索引数据一致,解决高可用问题。用户发起索引请求分别从 shard1 和 shard2 上获取,解决高并发问题。
整个Collection可以看成solr上的所有数据,对比于SolrCloud整个对外提供查询服务;两个Shard则是将Collection分片存储,数据是不一样的;而每个Shard对应的三个Core则是存储同一份数据,且一个主两个从
Collection :Collection 在 SolrCloud 集群中是一个逻辑意义上的完整的索引结构。它常常被划分为一个或多个 Shard(分片),它们使用相同的配置信息。比如:针对商品信息搜索可以创建一个 collection。collection=shard1+shard2+....+shardX
Core :每个 Core 是 Solr 中一个独立运行单位,提供 索引和搜索服务。一个 shard 需要由一个Core 或多个 Core 组成。由于 collection 由多个 shard 组成所以,collection 一般由多个 core 组成。
Master 或 Slave:Master 是 master-slave 结构中的主结点(通常说主服务器),Slave 是 master-slave 结构中的从结点(通常说从服务器或备服务器)。同一个 Shard 下 master 和 slave 存储的数据是一致的,这是为了达到高可用目的。
Shard:Collection 的逻辑分片。每个 Shard 被化成一个或者多个 replication,通过选举确定哪个是 Leader。
2.2 集群搭建
!!@@202208021.png_864_561_0.5@@!! 按此图搭建,需要三个 zookeeper 节点,四个 tomcat 节点。zookeeper已经搭建完毕
搭建zookeeper集群(参上一节)
把solr的Tomcat复制到用于上传的文件夹 D:\EnvironmentDevs ,使用sftp上传文件夹:
put -r D:\EnvironmentDevs\apache-tomcat-Solr ▶上传目录需要添加参数-r
cd ~ ▶回到主目录看看是否上传成功
创建文件夹作为四个节点的总目录:mkdir /usr/local/solr-cloud
将solr文件夹复制到四个目录中:
cp -r apache-tomcat-Solr /usr/local/solr-cloud/tomcat-1
cp -r apache-tomcat-Solr /usr/local/solr-cloud/tomcat-2
cp -r apache-tomcat-Solr /usr/local/solr-cloud/tomcat-3
cp -r apache-tomcat-Solr /usr/local/solr-cloud/tomcat-4
将solrhome文件夹以同样的方式上传到服务器:
put -r D:\EnvironmentDevs\solrhome
创建solrhomes文件夹,再同样复制四份进去:mkdir /usr/local/solrhomes
cp -r solrhome /usr/local/solrhomes/solrhome-1
cp -r solrhome /usr/local/solrhomes/solrhome-2
cp -r solrhome /usr/local/solrhomes/solrhome-3
cp -r solrhome /usr/local/solrhomes/solrhome-4
使用editplus修改每个solr的配置,关联上对应的solrhome
!!@@202208023.png_1046_471_1@@!! 路径:/usr/local/solr-cloud/tomcat-1/webapps/solr/WEB-INF/web.xml
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>/usr/local/solrhomes/solrhome-1</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
因为四个Tomcat都需要启动,所以修改每一个的配置端口防止冲突。Tomcat有三个重要的端口:
8005端口用来关闭TOMCAT服务
8080端口负责建立HTTP连接。在通过浏览器访问Tomcat服务器的Web应用时,使用的就是这个连接器。
8009端口负责和其他的HTTP服务器建立连接。在把Tomcat与其他HTTP服务器集成时,就需要用到这个连接器。
所以把四个Tomcat的端口对应改成下面这样:
8105 8180 8109
8205 8280 8209
8305 8380 8309
8405 8480 8409
!!@@202208042.png_1265_639_1@@!! 路径:/usr/local/solr-cloud/tomcat-1/conf/server.xml
修改每一个Tomcat的bin下的脚本文件catalina.sh( 实际上start.sh执行的也是走的这个脚本 ),添加JVM运行参数使得Tomcat运行时能够找到zookeeper集群。如果zookeeper只有一个,那么只用填一个地址即可
JAVA_OPTS="-DzkHost=192.168.25.131:2181,192.168.25.131:2182,192.168.25.131:2183"
!!@@202208044.png_1219_536_1@@!! 路径:/usr/local/solr-cloud/tomcat-1/bin/catalina.sh
修改每一个solrhome的配置文件solr.xml,把其中的 ip 及端口号配置好,对应的tomcat的IP和端口
<str name="host">192.168.25.131</str>
<int name="hostPort">8180</int>
!!@@202208045.png_1357_523_1@@!! 路径:/usr/local/solrhomes/solrhome-1/solr.xml
为了让 zookeeper 统一管理配置文件,需要把 solrhome下collection1/conf 目录上传到zookeeper。上传任意 solrhome 中的配置文件即可,因为他们都是一样的
首先将solr-4.10.3.tgz.tgz压缩包上传到服务器并解压
put d:/EnvironmentDevs/solr-4.10.3.tgz.tgz
tar zxvf solr-4.10.3.tgz.tgz
进入目录:solr-4.10.3/example/scripts/cloud-scripts ,使用solr提供的zkcli.sh脚本来上传配置:
./zkcli.sh -zkhost 192.168.25.131:2181,192.168.25.131:2182,192.168.25.131:2183 -cmd upconfig -confdir /usr/local/solrhomes/solrhome-1/collection1/conf -confname myconf
参数解释:
-zkhost :指定zookeeper地址列表
-cmd :指定命令。upconfig 为上传配置的命令
-confdir : 配置文件所在目录
-confname : 配置名称,用于在zookeeper中作区分
!!@@202208051.png_1073_373_1@@!! 执行结束
启动集群。此时进入Tomcat的bin目录执行start会显示权限不够,需要把最外面的文件夹变成可读可写可执行:
chmod -R 777 solr-cloud 在usr/local目录下执行。重新进入各个bin可以发现文件都变成了绿色。按序启动所有Tomcat(前提是zookeeper已经起启动)
!!@@202208062.png_1007_508_1@@!!
直接访问http://192.168.25.131:8180/solr/ 访问报错,没解决,不搞了【放弃】
3. Redis集群部署 Redis-Cluster
3.1 概念
Redis是在内存中保存数据的,所以不适合存储大数据,适合存储大数据的是Hadoop生态系统的Hbase或者是MogoDB。Redis更适合处理高并发,一台设备的存储能力是很有限的,但是多台设备协同合作,就可以让内存增大很多倍,这就需要用到集群
Redis集群搭建的方式有多种,例如使用客户端分片、Twemproxy、Codis等,但从redis 3.0之后版本支持redis-cluster集群,它是Redis官方提出的解决方案,Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态(存储的数据是不同的),每个节点都和其他所有节点连接。
客户端与 redis 节点直连,不需要中间 proxy 层。客户端不需要连接集群所有节点连接集群中任何一个可用节点即可,所有的 redis 节点彼此互联(PING-PONG 机制),内部使用二进制协议优化传输速度和带宽。
redis-cluster 把所有的物理节点映射到[0-16383]slot 上,cluster 负责维护:node<->slot<->value。即Redis 集群中内置了 16384 个哈希槽。例如三个节点,槽分布的值如下:SERVER1: 0-5460,SERVER2: 5461-10922,SERVER3: 10923-16383
当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。
可以看到这样只能达到海量存储的目的,如果要想高可用,那么redis每个节点应该含有主节点和从节点,主从节点中的数据是一样的。所以redis使用来进行容错:
选举过程是集群中所有master,如果半数以上master与故障节点通信超时(cluster-node-timeout),认为该节点故障,自动触发故障转移操作. ,故障节点对应的从节点自动升级为主节点
如果集群任意master挂掉,且当前master没有slave可用来升级为master,则集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完成时进入fail状态
3.2 集群搭建
最好三个节点,同时每个节点布置一个从节点,这样需要6个redis实例
安装gcc。Redis 是 c 语言开发的,安装 redis 需要 c 语言的编译环境。如果没有 gcc 需要在线安装
yum install gcc-c++
使用yum命令安装 ruby,需要使用ruby脚本来实现集群搭建
yum install ruby Ruby,一种简单快捷的面向对象(面向对象程序设计)脚本语言
yum install rubygems RubyGems简称gems,是一个用于对 Ruby组件进行打包的 Ruby 打包系统▶▶▶
以上命令在新建的虚拟机中无法执行,也没有找到解决办法,故放弃。redis使用pingyougou-server克隆出来的虚拟机redis-test,因为这里已经预先装好了c环境
将redis源码包redis-3.0.0.tar.gz上传到服务器,解压,进入解压后的目录
make 直接输入make执行,编译redis源码
!!@@202208071.png_495_231_1@@!! 到此表示执行成功
mkdir /usr/local/redis-cluster 创建redis文件夹
make install PREFIX=/usr/local/redis-cluster/redis-1 在redis文件夹下执行该命令6次,每次后缀数字不一样,安装6个redis实例
!!@@202208072.png_679_360_1@@!!
cp redis.conf /usr/local/redis-cluster/redis-1/bin 执行6次,后缀数字不同,将配置文件复制到各个实例中(redis安装后并没有该配置文件,需要复制过去)
通过editplus修改每一个redis的配置文件
port 7001 每一个端口分别向后递增
cluster-enabled yes 将该行注释出来,表示开启集群
!!@@2022082210.png_1396_633_1@@!!
启动各实例:
cd /usr/local/redis-cluster/redis-1/bin/ 每次执行目录后缀改一下就行了
./redis-server redis.conf 启动时指定配置文件
ps -ef | grep redis 可以看到各个实例都启动起来了
!!@@2022082211.png_667_152_1@@!!
上传集群脚本:
put D:/EnvironmentDevs/redis-3.0.0.gem 上传redis-3.0.0.gem
gem install redis-3.0.0.gem 安装ruby用于搭建redis集群的脚本
cd redis-3.0.0/src/ 进入redis源码的src文件夹,里面有一个脚本redis-trib.rb
执行脚本命令: replicas为1,表示每一个master布置一个从节点
./redis-trib.rb create --replicas 1 192.168.25.132:7001 192.168.25.132:7002 192.168.25.132:7003 192.168.25.132:7004 192.168.25.132:7005 192.168.25.132:7006
!!@@2022082212.png_1043_462_1@@!! 从节点没有槽,当他变成主节点就有了
使用 ./redis-trib.rb check 192.168.25.132:7001 即可看到整个集群的状态
3.3 集群连接
进入windows的redis文件夹,通过命令行连接集群: 如果只使用redis-cli,那么连接的就是本地redis
redis-cli -h 192.168.25.132 -p 7001 -c
!!@@2022082213.png_487_263_1@@!! 结尾一定要-c,这样连接的才是集群,否则连接的就是7001单机redis
从图中可以看出,abc被分配到槽5798,这个值存在了7002上。这时退出集群,使用单机的方式连接7001,get name报错,因为值不在这里,但是他给出了值应该在的位置。此时登录单机7002,可以获取到
redis-cli -h 192.168.25.132 -p 7001 shutdown 关闭redis节点。可以通过该命令看看各个节点的变化
3.4 SpringDataRedis连接redis集群
在common模块中添加两个配置文件redis-cluster-config.properties applicationContext-redis-cluster.xml。相关配置见代码
!!@@2022082214.png_1493_703_1@@!!
重新安装common模块
package -P pro 先打一个生产环境的包,可以去文件夹里看到对应的配置为JedisConnectionFactory_pro
install -P pro 安装到本地仓库
启动pinyougou-content-service和pinyougou-portal-web,确保两个服务都引入了common模块。同时web服务的web.xml中要确保有加载spring容器的配置,否则会找不到common下的那些配置文件;zookeeper集群及图片服务器也需要启动
访问 http://localhost:9103/ ,即可看到首页效果
DOWN 返回