摘要: 默认官方memcached是不支持主从同步的,为了解决memcached的高可用,我们是在客户端实现双写和调度,把一份session 多次写入后端的session服务器上,这样使得多台memcached服务器之间的数据有了冗余备份,即便集群中某一台memcached宕机以后,也不会丢失session;在用户访问上,我们在客户端上实现把调度自动切换到没有宕机的memcached上,这样又保证了线上业务的正常使用;memcached 它没有redis那种持久化的特点,它的数据上保存到内存中,一旦服务器掉电,或者重启服务都会导致数据丢失; 阅读全文
posted @ 2020-08-11 12:18 Linux-1874 阅读(208) 评论(2) 推荐(0) 编辑
摘要: 导入数据时,提示我们没有认证;这里需要注意一点,导入数据之前需要关闭各 redis 服务器的密码,包括集群中的各 node 和源 Redis server,避免认证带来的环境不一致从而无法导入,可以加参数--cluster-replace 强制替换 Redis cluster 已有的 key。 阅读全文
posted @ 2020-08-09 18:23 Linux-1874 阅读(239) 评论(0) 推荐(0) 编辑
摘要: 使用reshard 指定集群中任意节点的地址和端口即可启动对集群重新分片操作;重新分配槽位需要指定移动好多个槽位,接收指定数量槽位的节点id,从那些节点上移动指定数量的槽位,all表示集群中已有槽位的节点上;如果是手动指定,那么需要指定对应节点的ID,最后如果指定完成,需要使用done表示以上source node指定完成;接下来它会打印一个方案槽位移动方案,让我们确定。 阅读全文
posted @ 2020-08-08 17:40 Linux-1874 阅读(256) 评论(0) 推荐(0) 编辑
摘要: redis cluster 把所有的 redis node 映射到 0-16383 个槽位(slot)上,读写需要到指定的 redis node 上进行操作,因此有多少个 reids node 相当于 redis 并发扩展了多少倍。Redis cluster 预先分配 16384 个(slot)槽位,当需要在 redis 集群中写入一个 key -value 的时候,会使用 CRC16(key) mod 16384 之后的值,决定将 key 写入值哪一个槽位从而决定写入哪一个 Redis 节点上,从而有效解决redis单机读写瓶颈。 阅读全文
posted @ 2020-08-06 09:20 Linux-1874 阅读(384) 评论(0) 推荐(2) 编辑
摘要: Sentinel是一个分布式系统,我们可以在一个架构中运行多个sentinel,这些sentinel进程使用流言协议(gossipprotocols)来接收关于 Master是否下线的信息,并使用投票协议(Agreement Protocols)来决定是否执行自动故障迁移,以及选择哪个 Slave 作为新的 Master。每个sentinel进程会向其他sentinel进程、master、slave定时发送消息,以确保对方是否”活”着,如果发现对方在指定配置时间(可配置的)内未得到回应,则暂时认为对方已掉线,也就是所谓的”主观认为宕机” ,英文名称:Subjective Down,简称 SDOWN。 阅读全文
posted @ 2020-08-04 02:16 Linux-1874 阅读(476) 评论(0) 推荐(1) 编辑
摘要: 消息队列主要分为两种,分别是生产者消费者模式和发布者订阅者模式,这两种模式 Redis 都支持;在生产者消费者(Producer/Consumer)模式下,上层应用接收到的外部请求后开始处理其当前步骤的操作,在执行完成后将已经完成的操作发送至指定的频道(channel)当中,并由其下层的应用监听该频道并继续下一步的操作,如果其处理完成后没有下一步的操作就直接返回数据给外部请求,如果还有下一步的操作就再将任务发布到另外一个频道,由另外一个消费者继续监听和处理。生产者消费者模式下,多个消费者同时监听一个队列,但是一个消息只能被最先抢到消息的消费者消费,即消息任务是一次性读取和处理,此模式在分布式业务架构中非常常用,比较常用的软件还有RabbitMQ、Kafka、RocketMQ、ActiveMQ 等; 阅读全文
posted @ 2020-08-02 21:32 Linux-1874 阅读(242) 评论(0) 推荐(0) 编辑
摘要: redis同步数据的方式有两种,一种是socket方式,所谓socker方式复制数据是指master在做快照时,不将快照存入磁盘,直接将rdb文件通过网络发送给从节点;这种方式如果是在多个从节点上同步数据,它是串行复制,也就是说第一个slave同步完成后,再同步第二个slave;disk是指主节点将rdb保存到磁盘,然后在发送给从节点;disk方式同步数据在多个slave情景中,它可以共享rdb文件,主节点不用重复生成多个相同的rdb发送给slave;通常情况只有在磁盘速度缓慢但是网络相对较快的情况下才使用 socket 方式,否则都是用disk方式; 阅读全文
posted @ 2020-08-01 23:32 Linux-1874 阅读(367) 评论(0) 推荐(1) 编辑
摘要: 从上面的日志中可以了解到redis做快照存储时,它会启动一个线程去存储快照,即便发生错误它也会每隔几秒去重复的执行存储快照的操作;其实上面的错误的原因是我们开启了stop-writes-on-bgsave-error这个选项,所以为了避免这种错误发生,我们可以把stop-writes-on-bgsave-error这个选项设置为no,但是这样设置以后我们还需要,通过监控来监控redis的日志,及时发现问题避免丢失数据; 阅读全文
posted @ 2020-07-29 00:00 Linux-1874 阅读(341) 评论(0) 推荐(0) 编辑
摘要: 很多开源软件都支持include这个指令,把某个目录下的文件导入到指定位置做配置文件的方式(最常见的就是把某个目录下的以点conf结尾的文件导入到当前位置);以上红框中的内容表示把/usrlocal/reds/conf.d/test.conf文件都导入到此处;这里需要注意一点redis好像不支持以模式匹配的方式导入多个文件,必须单个导入,除此之外导入的文件必须得存在可访问;对于include指令放在哪个位置,需要自行定义,因为include以下的配置文件如果和include指定的文件配置有重复,以include之下的内容为准;也就说导入配置会覆盖导入配置之前的配置; 阅读全文
posted @ 2020-07-27 20:02 Linux-1874 阅读(290) 评论(0) 推荐(0) 编辑
摘要: Redis是什么?redis是一款基于BSD协议,开源的非关系型数据库(nosql数据库),作者是意大利开发者Salvatore Sanfilippo在2009年发布,使用C语言编写;redis是基于内存存储,而且是目前比较流行的键值数据库(key-value database),它提供将内存通过网络远程共享的一种服务,提供类似功能的还有memcache,但相比 memcache,redis 还提供了易扩展、高性能、具备数据持久性等功能。主要的应用场景有session共享,常用于web集群中的tomcat或PHP中多web服务器的session共享;消息队列,ELK的日志缓存,部分业务的订阅发布系统;计数器,常用于访问排行榜,商品浏览数等和次数相关的数值统计场景;缓存,常用于数据查询、电商网站商品信息、新闻内容等; 阅读全文
posted @ 2020-07-26 10:49 Linux-1874 阅读(320) 评论(0) 推荐(0) 编辑
摘要: session复制集群的原理就是通过多播通信的方式,把节点的session信息发送给集群其他节点;这种session复制集群有一个缺陷,如果后端tomcat server 一旦增多,那么对于后端用于发送session信息的网络会非常拥挤,到达一定的量以后,后端网络就可能瘫痪,这样一来session复制集群就失效了;这其中的原因就是因为各个节点通过多播通信的方式发送session;为了解决这样的问题,我们需要重新想办法把用户的session存起来; 阅读全文
posted @ 2020-07-23 17:51 Linux-1874 阅读(320) 评论(0) 推荐(1) 编辑
摘要: 会话是识别用户,跟踪用户访问行为的一个手段,通过cookie(存在客户端)或session(存在服务端)来判断本次请求是那个客户端发送过来;常用的会话保持有绑定会话,就是前边我们聊的在代理上通过算法或通过给客户端响应首部加cookie这种方式来保持同一cookie或同一ip地址的请求始终发送到同一后端server进行响应;但是这样的会话绑定的方式存在一个问题,就是当后端某一server宕机,那么之前上面的所有会话信息将消失,那么后续的客户端来请求,代理是否要把请求调度到后端宕机的server呢?如果说调度上去呢,那么用户之前的会话信息又没有了,如果说不调度呢,那么用户将不能够得到服务;所以对于这种情况我们需要把会话都同步到后端所有server上,即便某一台或几台后端server宕机了,不会导致用户的会话信息丢失,同样服务也是可用的; 阅读全文
posted @ 2020-07-22 22:43 Linux-1874 阅读(346) 评论(0) 推荐(4) 编辑
摘要: nginx的调度算法中hash $remote_addr 和ip_hash是把IP地址的前24位做hash,所以如果你的IP前三段相同时,nginx它会认为是和nginxserver是同一局域网,所以它会把请求调度到同一局域网之前来请求过的后端server上进行响应;当然除了我们可以对源地址做hash,我们也可以对其他首部做hash计算,原理都是类似的,都是把对应首部的值做hash计算,然后同权重和做取模运算;然后根据nginx内部的对应关系,把取模后端结果相同的请求调度到同一后端server,就是基于这样的原理,把客户端和后端server绑定到一起实现了会话绑定; 阅读全文
posted @ 2020-07-20 23:27 Linux-1874 阅读(295) 评论(0) 推荐(0) 编辑
摘要: 通常tomcat作为应用服务器,我们不建议也不应该让tomcat直接面向客户端提供服务;因此进入tomcat的访问就只有其他反代服务器的请求了;如果说tomcat使用其他反代服务器对外提供服务,那么对于https的访问就应该由代理服务器端来实现,从代理服务器到tomcat的访问,我们应该还是使用http或者ajp协议,综上所述常用的连接器也就http和ajp;http是一个文本格式协议,对于浏览器来说是支持的;ajp协议是二进制格式协议,对于浏览器是不支持的;所以对于反代服务器来讲,面向客户端它提供http协议访问,面向服务端它提供ajp协议去访问;这样去反代tomcat,相对要安全一点,至少客户端不能绕过代理直接访问tomcat; 阅读全文
posted @ 2020-07-18 12:26 Linux-1874 阅读(275) 评论(0) 推荐(0) 编辑
摘要: connector连接器组件:主要作用负责接收请求,常见的连接器有三种,分别是http连接器,https连接器,和ajp连接器;进入tomcat的请求可分为两类,一类是来自客户端浏览器的访问,一类是来自其他web server反代访问;如果想配置tomcat只能通过代理来访问,并且不能绕过代理来访问,我们可以选择把http和https连接器给禁用了,只留一个ajp连接器,这样一来tomcat就只能通过httpd的ajp反代来访问,因为浏览器不支持ajp协议; 阅读全文
posted @ 2020-07-17 09:01 Linux-1874 阅读(339) 评论(0) 推荐(1) 编辑
摘要: 所谓部署就是把webapp的源文件放置于目标目录(网页程序文件存放目录,类似httpd中的documentroot指定的目录),然后配置tomcat服务器能够基于web.xml和context.xml文件中定义的路径来访问webapp;然后将其特有的类和依赖的类通过类加载器(class loader)装载至jvm的这一过程;部署第方式有两种,一种是自动部署(auto deploy),自动部署就是我们直接把webapp文件放置对应目录下就可以实现访问,不需要人为手动的去配置部署;另外一种就是手动部署,手动部署又可以分为冷部署和热部署;所谓冷部署就是把webapp源码文件放到指定位置,然后启动tomcat这种方式叫冷部署;热部署指的是在不停止tomcat的前提下进行部署的方式; 阅读全文
posted @ 2020-07-16 09:41 Linux-1874 阅读(308) 评论(0) 推荐(1) 编辑
摘要: 总结一点,部署tomcat环境,首先要安装jdk,因为tomcat本身就是java语言编写,我们要在服务器上安装好java程序运行环境和标准类库等组件,tomcat才可以服务器上正常的运行起来;其实从上面的演示我们大概也能知道tomcat就是为Java jsp程序提供一个运行环境,后续的jsp代码主要就是在tomcat上运行,而非jdk上;jdk是运行Java程序(tomcat)而必须有的组件; 阅读全文
posted @ 2020-07-15 09:20 Linux-1874 阅读(312) 评论(0) 推荐(1) 编辑
摘要: 在mariadb的主从复制集群中,读的能力被扩展了,而写的能力始终没有被扩展;这样一来对于主服务器就存在单点的问题,通常除了做双主可解决主节点单点的问题,我们还可以给主节点做高可用;而对于mariadb的主从复制集群来讲,虽然读的能力提升了,但通常情况后端数据库服务器是直接面向程序,这意味着程序要知道读请求和写请求该发往不同的数据库服务器上;在用户发来读请求,这个程序它会分析用户的请求,然后把用户的请求代理到后端server上;也就是说我们需要一个程序能够解析用户的读写操作,把对应的操作代理到后端不同的节点上;这样一来用户的读操作始终均衡的被调度到从节点,写操作调度到主节点; 阅读全文
posted @ 2020-07-12 10:48 Linux-1874 阅读(289) 评论(1) 推荐(1) 编辑
摘要: mariadb的主从复制集群,默认情况下是把主库上的所有库进行复制,只要在主库上产生写操作,从库基于主库的二进制日志做重放,从而实现把主库的上的库表复制到从库;复制过滤器指的是我们仅复制一个或几个数据库相关的数据,而非所有;过滤器的作用就是来定义我们要复制那些库,那些表,这种定义过滤器的方式叫白名单机制;除了这种告诉服务器我们要复制的库表的,当然我们也可以告诉服务器我们不需要复制的库或表,或者需要忽略的库表的机制叫黑名单;在定义我们需要复制的库或者表,我们可以在主库上定义,也可以在从库上定义;不同的是在主库上定义,我们只能定义需要复制的那些库,忽略那些库; 阅读全文
posted @ 2020-07-06 13:36 Linux-1874 阅读(229) 评论(0) 推荐(0) 编辑
摘要: 半同步指的是在主节点发生写操作事件后,它会把该操作的事件发送给从节点,当从节点接收到主节点发送过来的事件后,就立刻告诉主节点,从节点已经接收到主节点发送过来的事件,此时主机点并不会等到从节点重放完成,而是接收到从节点接收到主节点发送过去的的事件确认消息后,就返回给客户端;而在mariadb/mysql主从复制集群中的半同步,并不是我们刚才说的这种半同步机制;在mariadb/mysql主从复制集群中的半同步指的是,一主多从的复制集群中,一个从节点或一部分从节点和主节点是同步复制,一部分从节点是异步复制; 阅读全文
posted @ 2020-07-05 14:32 Linux-1874 阅读(246) 评论(0) 推荐(0) 编辑
摘要: 前面我们聊到了mariadb的事务,以及事务隔离级别,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13198186.html;今天我们来聊一聊mariadb的日志相关话题;mariadb日志有6种,分别是查询日志(general_log),慢查询日志(log_slow_queries),错误日志(log_error,log_warnings),二进制日志(binlog),中继日志(relay_log)和事务日志(innodb_log); 阅读全文
posted @ 2020-06-29 01:49 Linux-1874 阅读(353) 评论(1) 推荐(0) 编辑
摘要: 所谓原子性,就是事务中执行的语句要么全部执行,要么全部不执行,如果事务在中途发生错误,那么前面执行过的语句将会回滚到事务前;一致性指的是在执行事务之前和事务执行完成后的数据库状态是完整的;也就是说我们执行的语句都按照我们预想的结果执行了;隔离性指数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。持久性指的是,事务执行完成后,对数据的修改是永久的; 阅读全文
posted @ 2020-06-28 00:46 Linux-1874 阅读(276) 评论(0) 推荐(1) 编辑
摘要: 首先我们来看看mariadb的锁定概念,所谓锁就是当一个进程或事务在操作某一资源时,为了防止其他用户或者进程或事务对其进行资源操作,导致资源抢占而发生冲突,通常在A进程操作该资源时,会对该资源进行加锁,实现多进程或多用户操作同一资源时,不会发生冲突;通常情况锁的类型分读锁和写锁,所谓读锁就是共享锁,它可以实现多个读操作共享;而写锁就是排它锁,独占锁,一旦加了写锁,其他用户的读写操作将被阻塞,直到该写锁被释放或者因超时而被释放,在其他用户进行的读写操作,此时就会被执行; 阅读全文
posted @ 2020-06-27 00:20 Linux-1874 阅读(260) 评论(0) 推荐(0) 编辑
摘要: 1-u5mwgfq7rb这个名称的网络名称空间有三张网卡,分别是eth0,eth1和vxlan0,它们都是桥接在br0这个网卡上;而上面管理节点也在1-u5mwgfq7rb这个网络名称空间,并且它们中的vxlan0的vlan id都是4096,这意味着管理节点上的vxlan0可以同node2上的vxlan0直接通信(相同网络名称空间中的相同VLAN id是可以直接通信的),而vxlan0又是直接桥接到br0这块网卡,所以我们在nginx日志中能够看到ingress-sbox容器的地址在访问nginx;这其中的原因是ingress-sbox的网关就是br0;其实node3也是相同逻辑,不同节点上的容器间通信都是走vxlan0,与外部通信走eth1---->然后通过SNAT走docker-gwbridge---->物理网卡出去; 阅读全文
posted @ 2020-06-20 23:56 Linux-1874 阅读(335) 评论(0) 推荐(2) 编辑
摘要: 用docker-machine创建虚拟主机来对节点主机管理时,我们给定虚拟主机的名称docker-machine会把该名称当作主机名,把节点主机的主机名更改为我们指定的名称;从上面的信息可以看到docker-node01这台主机上有nginx镜像和n1容器;这说明我们刚才的操作都是发送给docker-node01上了;从上面的演示可以看到,我们在docker-machine上切换环境,当前shell并不能反映我们是否切换到对应的环境了;这样一来在主机特别多的情况,很容易出错;接下来我们配置当前shell的PS1的环境变量; 阅读全文
posted @ 2020-06-19 23:45 Linux-1874 阅读(272) 评论(0) 推荐(0) 编辑