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 返回