
拷贝以下内容并保存为docker-composeyml,修改域名等相关参数
这里面包括四个容器服务,nextcloud,nextcloud-db(mysql),solr和redis,其中nextcloud是必须的,后面的服务不使用可以删除配置(同时要删除nextcloud中的依赖)。比如用户数少不想使用mysql,可删除depends_on:后面的- nextcloud-db以及后面的nextcloud-db配置段。nextcloud-db建议企业用户使用,redis作为缓存可以让服务器响应速度变得更快,solr提供了更好的搜索功能,你可以按需要自己配置。
运行docker容器
进入在docker-composeyml目录
运行数据库容器(不使用Mysql略过)
docker-compose up -d nextcloud-db
运行其他容器
docker-compose up -d
redis配置
如果doker-composeyml添加了redis服务,需要编辑php配置来启用服务,配置文件路径是/docker/nextcloud/config/configphp
重启reverse容器
docker restart reverse
配置solr
默认的文件查找功能只相当于一个列表过滤,无法搜索子文件夹,启用nextant插件借助solr服务可实现全文搜索,不光搜索文件名,还可以按文档的内容搜索。前提是在docker-composeyml中配置了solr。
在配置过程中发现nextant无法连接solr,通过docker logs solr查看到错误信息“
cp: can't create directory '/opt/solr/server/solr/mycores/nextant': Permission denied”,
原来是没有权限,执行以下命令修改权限:
sudo chmod -R 777 /docker/nextcloud/solr
重启solr
docker restart solr
通过docker logs solr查看,solr正常启动
登录设置
通过浏览器访问你的网站,第一次打开界面是这样的。
首次打开
输入用户名密码来创建管理员帐号
使用Nextant开启全文搜索
打开Nextant的前提是前面安装了solr服务,
管理员帐号登录,点击右上角齿轮图标,点击"+应用",点击"应用软件包",点击files,找到Nextant,点击启用;
点击右上角齿轮图标,选择管理,点击其他设置,找到Nextant (全文搜索)选项;
在Address of your solr servlet中输入>的计算方法有以下几种:
1 平均耗时计算:可以通过计算每次服务调用的总耗时,除以调用次数,得到服务的平均耗时。
2 中位数计算:可以通过将每次服务调用的耗时进行排序,然后取中间值,得到服务的中位数耗时。
3 分位数计算:可以通过将每次服务调用的耗时进行排序,然后取不同分位数的值,得到服务的分位数耗时。
4 百分位计算:可以通过将每次服务调用的耗时进行排序,然后取不同百分位的值,得到服务的百分位耗时。
只论技术方面的话,通俗的说就是前端界面,后端逻辑,数据库,web服务器,以及真实服务器(云服务器或实实在在的硬件服务器)。
前端界面这一块,现在比较流行热门的技术有vuejs,vuejs是一个基于数据驱动的渐进式前端开源框架,不仅适用于PC端,也适总于移动端,现在很多大型的网站都在用vuejs。多说一句,vuejs的作者是中国人。
再说后端这一块,基本上是被springboot一统天下,springboot的IOC和AOP特性以及一系列的设计模式,让开发变得简单高效。
数据库这一块,市面上比较流行的有商业数据库有甲骨文公司的oracle,微软的sqlserver,开源的有postgresql,mysql,redis,sqlite等。
web服务器,比较常用的就是tomcat,nginx等。
服务器硬件的话,要么是云服务器(阿里云或者腾讯云),要么是真是的硬件服务器。
最后,网站开发,说简单也简单,就是三层构架,说难也难,其中涉及高并发大数据负载均衡的问题,都是现在热门的问题。如果想快速开发,建议借助现有的开源平台,快速高效,省时省力。
redis集群模式,丢失master主服务器是无法继续工作的,所以随时都需要一个master节点。但是服务器宕机是经常出现的事情,集群本身是无法完成故障转移的,所以需要一个第三方的解决方案,帮redis集群完成故障转移(选择主节点、通知从节点修改同步master地址,让原来的主节点成为从节点)。(1)首先sentinel也属于一种redis服务器,只不过启动时加载的配置文件不同。配置文件里包括了监控的主服务器列表(对,可以是多个主服务器,即就是多个集群)。
(2)sentinel通过配置文件中的主服务器IP:端口号,建立链接和订阅,就是一个双向的通道
(3)sentinel默认每10秒,向建立链接的主服务器,发送INFO命令;主服务器收到命令,返回主服务器信息。
可以看到,返回了主服务器的运行ID,重要的是:同步主服务器的从节点信息
(4)从步骤(3)中获取到的从节点信息,从节点的IP和端口。sentinel和从节点建立链接和订阅
(5)sentinel默认每10秒,向建立链接的从服务器,发送INFO命令,从服务器接收到命令后,返回从服务器信息
主要包括了从服务器对应的master节点的地址:端口号,偏移量
(6)sentinel与主服务器和从服务器建立了链接和订阅,可以向主从服务器发送命令,也可以接收主从服务器的广播
订阅命令:subscribe _sentinel_:hello
通道名:hello
sentinel对hello频道的订阅会一直持续到sentinel和服务器之间的链接断开为止
sentinel向服务器通道发送的消息,其他与该服务器建立订阅关系的sentinel也会收到订阅通知,sentinel自己也会收到自己发出的消息的订阅通知
(7)sentinel默认会每两秒一次,向所有建立链接和订阅的主从服务器,发送广播消息
命令:publish_sentinel__:hello "<s_ip>,<s_port>,<s_runid>,<s_epoch>,<m_name>,<m_ip>,<m_port>,<m_epoch>"
可以看到主要包含
s_ip : sentinel自己 IP地址
s_port : sentinel自己端口号
s_runid : sentinel自己的运行ID
s_epoch : sentinel当前的配置纪元
m_name, m_ip, m_port, m_epoch : 当前监控服务器的名称(主或者从)、IP地址、端口号、当前配置纪元
这个消息,也会被其他订阅该通道的sentinel收到
sentinel在接收到订阅消息后(就是上文中自己与别的sentinel,publish的消息),首先过滤掉自己发,然后接收别人的消息,就能获取监听改主服务器的所有sentinel节点
(8)通过上一步,sentinel能够感知到其他监控主服务器的sentinel节点,然后和其他sentinel建立连接,最终,所有监视主服务器的sentinel节点组成了一个相关连接的网络!
sentinel会默认每1s向自己所建立连接的服务器发送PING命令,这些服务器包括(监视master的其他sentinel,master、salve服务器),根据收到的返回值,来确定目标服务器的状态
常见返回值:+PONG、-LOADING、-MASTERDOWN,含义在此处先不关注
判定条件:目标服务器在一定的时间内(配置文件字段:down-after-milliseconds的值),一直返回“失败”
对失败的定义:
(1)目标服务器没有在规定时间内返回(该时间可配置)
(2)目标服务器返回了上述三种返回值之外的值
确定一个目标服务器失败之后,会在sentinel自己的实例表中记录该实例的状态,用:
SRI_S_DOWN表示,S=subjective客观
注:一个master服务器会被多个sentinel监控,多个sentinel可能设置了不同的
down-after-milliseconds
和我们设想的一样,单一的sentinel并不能决定目标master服务器的生死存亡,会拿着自己实例表里的“客观”下线的服务器地址和端口,去向同样监控这台服务器的sentinel询问,看看“别人”这个服务器到底下线没? 当能够从别的sentinel那里询问到“足够数量”的已下线(客观下线或者主观下线)结果后,sentinel就可以判断目标服务器真的下线了,就可以执行故障转移了。
(1)sentinel发送命令is-master-down-by-addr
SENTINEL is-master-down-by-addr <ip> <port> <current_epoch> <runid>
发送的目标:监控master服务器的其他sentinel
参数解析:ip、port=自己监控的master服务器的IP,端口,current_epoch=源sentinel当前的配置纪元,runid=源sentinel的唯一标识ID
(2)sentinel对命令is-master-dowm-by-addr的回复
1) <down_state> :下线的状态,0-未下线,1-已下线
2) <leader_runid> :当前sentinel的局部leader,为 “” 时表示没有leader
3) <leader_epoch> :当前sentinel的局部leader的配置纪元,当没有leader时,该项为0
(3)sentinel收到命令is-master-down-by-addr的回复后
sentinel收到足够数量(可配置)的“已下线”回复(即down_state=1),就会在自己的实例表里将对应的master服务器状态(flags)设置为 SRI_O_DOWN,O=Objective。
监控同一个master服务器的sentinel,对客观下线的条件可以不一致,即收到多少已下线回复才认定客观下线,可以不尽相同。
由于监控同一个master服务器的sentinel有很多,并不能决定是哪个sentinel去执行故障转移,所以需要多个sentinel进行选leader头结点。
具体步骤:
(1)sentinel通过向其他sentinel节点发送is-master-down-by-addr命令,已经可以判断当前master服务器是否客观下线
(2)已经判断master服务器客观下线的sentinel,再次向其他节点发送
is-master-down-by-addr命令,携带自己的runId和配置纪元
这里再复习一遍命令 :
sentinel is-master-down-by-addr <ip>,<port>,<cur_epoch>,<runid>
(3)目标sentinel收到源sentinel的 is-master…命令之后,执行以下判断
1>判断epoch和自己的纪元是否相等,不相等直接舍弃这条命令
2>判断自己的配置表里是否有局部leader,没有的话,将源sentinel的runid设置为自己的局部了leader
如果已经有了局部leader,那么会返回自己的局部leader的信息
3>对源sentinel的is-master-down-by-addr命令进行回复
示例:
源sentinel向目标sentinel发送命令,
SENTINEL is-master-down-by-addr 127001 8080 0 11522852334a
源sentinel收到命令的回复
1
11522852334a
0
表示有一个sentinel将自己成功设置成为leader(需要把返回的runid和自己的runid比对)
4>当过半的sentinel将自己成功设置为局部leader,标识选主成功,如果在一段时间内没有收到过半的成功数,那么会进行下一轮命令的发送,epoch递增+1
例如,共有10个sentinel监视同一个master服务器,其中一个sentinel必须收到10/2+1=6个及以上的成功数,才能认为自己成功当选leader
(1)筛选master节点的备胎(即就是哪些slave节点可以成为新的master)
选择master节点备胎就一个要求,数据尽量完整,状态尽量好
1>删除,客观下线或者主观下线的slave服务器
2>删除,在最近5s没有回复过头sentinel节点的INFO命令的slave服务器
剩下的slave服务器,根据优先级进行排序,遇到优先级一样的,再根据偏移量排序(目的是筛选出和master服务器数据较同步的slave服务器)。再遇到偏移量一样的,继续根据runid排序,找出runid最小的(没有什么依据,只是个排序),至此,可以作为master的slave服务器就筛选好了。
(2)slave服务器升级为master
头sentinel向步骤(1)中筛选出来的slave服务器发送slaveof_no_one,发送完该转移命令。之后,头sentinel每秒一次的频率向上述slave服务器发送INFO命令,观察INFO命令返回的role字段,看是否变为master,变为master表示成功升级为master服务器。
(3)修改原slave服务器列表的复制/同步目标
头sentinel向原slave服务器列表发送命令:
slave of 127001:8080,修改slave的复制目标
(4)修改已下线的master服务器为新master的slave节点
头sentinel保持对已下线master的监控,当已下线master重新上线(对PING命令有回复),就对他发送slave of 127001命令,让其成为slave。
至此,故障转移全部结束。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)