5.Redis的哨兵服务

5.Redis的哨兵服务,第1张

0Redis主从架构的问题
1哨兵服务介绍
2架构图
3主从服务搭建
4配置哨兵服务
5启动哨兵服务
6验证哨兵服务

对于Redis的主从架构而言,无法实现 master 和 slave 角色的自动切换, 即当 master 出现 redis 服务异常、主机断电、磁盘损坏等问题导致 master 无法使用,而 redis 高可用无法实现自故障转移(将 slave 提升为 master),需要手动改环境配置才能切换到 slave redis 服务器。另外无法横向扩展 Redis 服务的并行写入性能, 当单台 Redis 服务器性能无法满足业务写入需求的时候就必须需要一种方式解决此问题。
1master和slave角色的无缝切换,让业务无感知从而不影响业务使用
2可以横向动态扩展Redis服务器, 从而实现多台服务器并行写入以实现更高并发的目的。

Sentinel进程是用于监控redis集群中Master主服务器工作的状态,在Master主服务器发生故障的时候,可以实现Master和Slave服务器的切换,保证系统的高可用,其已经被集成在 redis26+的版本中,Redis的哨兵模式到了28版本之后就稳定了下来。一般在生产环境也建议使用Redis28以后版本。哨兵(Sentinel)是一个分布式系统,你可以在一个架构中运行多个哨兵(sentinel) 进程,这些进程使用流言协议(gossipprotocols)来接收关于Master主服务器是否下线的信息,并使用投票协议(Agreement Protocols)来决定是否执行自动故障迁移,以及选择哪个 Slave 作为新的 Master。每个哨兵(Sentinel)进程会向其它哨兵(Sentinel)、Master、Slave定时发送消息,以确认对方是否”活”着,如果发现对方在指定配置时间(可配置的)内未得到回应,则暂时认为对方已掉线,也就是所谓的”主观认为宕机” ,英文名称:Subjective Down,简称SDOWN。有主观宕机,肯定就有客观宕机。当“哨兵群”中的多数 Sentinel 进程在对 Master 主服务器做出 SDOWN 的判断,并且通过SENTINEL is-master-down-by-addr 命令互相交流之后,得出的Master Server下线判断,这种方式就是“客观宕机”,英文名称是: Objectively Down, 简称 ODOWN。通过一定的 vote 算法,从剩下的 slave 从服务器节点中,选一台提升为 Master 服务器节点,然后自动修改相关配置,并开启故障转移(failover)。Sentinel 机制可以解决 master 和 slave 角色的切换问题。

安装

修改配置文件

启动服务

192168177139

192168177140

其他地方配置和主服务器一致

启动服务

查看主从状态
MASTER

SLAVE1

SLAVE2

MASTER

SLAVE1

SLAVE2

主服务器

SLAVE1:升级为主服务器

SLAVE2:主服务器变为node10

主服务器

从服务器

又到了为小伙伴们解惑的时候了 (❦ω❦),master强调从整体上掌握或精通某个领域或知识点。boundary强调某个领域或范围的限制或限定。这里就给大家总结了一个它们基础知识的表格,可以先简单了解一下先:

了解完master与boundary的基础知识后,现在就来看看它们的具体区别~(@^_^@)~

1、含义的不同

- master强调掌握、精通某个领域、知识或技能。

- boundary则指领域、范围、限制等。

例句:

- He has mastered the art of public speaking (他掌握了演讲技巧,master强调掌握某个领域、知识或技能。)

- The border between the two countries forms a boundary (两个国家之间的边界形成一道界限,boundary指领域、范围、限制等。)

2、数量的不同

- master在数量上强调有精通的程度,通常是指一两个或有限个方面。

- boundary强调某个领域或范围的有限性。

例句:

- She has mastered French and Spanish (她精通法语和西班牙语,master在数量上强调了有限的精通程度。)

- The boundary between science and art is becoming increasingly blurred (科学和艺术之间的界限正在越来越模糊,boundary强调领域或范围的有限性。)

3、学科的不同

- master可以用于任何学科或技能,如语言学、数学、音乐等。

- boundary更多地使用于学术或研究领域,特别是跨学科的研究。

例句:

- She has mastered the art of photography (她掌握了摄影的艺术,master可以用于任何学科或技能。)

- The boundary between biology and chemistry is not always clear (生物学和化学之间的界限并不总是很明确,boundary更多地使用于学术或研究领域。)

4、人群的不同

- master通常用于描述个人,表示对某个领域的单人掌握程度。

- boundary则更多地用于描述社会、文化、地理等范畴的概念,通常不能单独应用于个人。

例句:

- He is a master of the guitar (他精通吉他,master用于描述个人。)

- The Great Wall of China forms a boundary between China and Mongolia (中国的长城构成了中国和蒙古之间的边界,boundary用于描述国家、地理等范畴的概念。)

5、全局的不同

- master强调从整体上掌握或精通某个领域或知识点。

- boundary强调某个领域或范围的限制或限定。

例句:

- He has mastered the English language (他已经在整体范围上掌握了英语,master强调精通某个领域的整体。)

- The city council is responsible for setting the boundaries of the various districts (市议会负责设置各区域的边界,boundary强调领域或范围的限制或限定。)

比如说,数据库一今天有更新,数据库二必须数据和数据库,比如说,数据库一今天有更新,数据库二必须数据和数据库是一样的,“当数据库一服务器挂了之后网站不受影响,转去访问数据库服务器二”
这个是网站程序去控制的,在数据库连接配置文件里,写个js或是php上面的小程序,当数据库一错误,连接数据库二。
下面是同步数据库的配置:
两台服务器,分别安装好Mysql,都安装在 /usr/local/mysql 目录下(安装步骤省略,请参考相关文档),两台服务器的IP分别是19216801和19216802,我们把19216801作为master数据库,把19216802作为slave服务器,我们采用单向同步的方式,就是master的数据是主的数据,然后slave主动去master哪儿同步数据回来。
两台服务器的配置一样,我们把关键的配置文件拷贝一下,默认的配置文件是在 /usr/local/mysql/share/mysql目录下,分别有 my-largecnf, my-mediumcnf, my-smallcnf等几个文家,我们只是测试,使用my-mediumcnf就行了。mysql安装完后,默认的配置文件是指定在数据库存放目录下的,我们用的是41X的,所以配置文件就应该在 /usr/local/mysql/var 目录下,于是把配置文件拷贝过去:
cp /usr/local/mysql/share/mysql/my-mediumcnf /usr/local/mysql/var/mycnf
两台服务器做相同的拷贝配置文件 *** 作。
2 配置Master服务器
我们要把19216801配置为主mysql服务器(master),那么我们就要考虑我们需要同步那个数据库,使用那个用户同步,我们这里为了简单起见,就使用root用户进行同步,并且只需要同步数据库abc。
打开配置文件:
vi /usr/local/mysql/var/mycnf
找到一下信息:
# required unique id between 1 and 2^32 - 1
# defaults to 1 if master-host is not set
# but will not function as a master if omitted
server-id = 1 //1为master,2为salve
添加两行:
sql-bin-update-same //同步形式
binlog-do-db = abc //要同步的数据库
重启19216801的mysql服务器:
/usr/local/mysql/bin/mysqladmin shutdown
/usr/local/mysql/bin/mysqld_safe --user=mysql &
3 配置Slave服务器
我们的slave服务器主要是主动去master服务器同步数据回来,我们编辑配置文件:
vi /usr/local/mysql/var/mycnf
找到下面类似的信息:
# required unique id between 1 and 2^32 - 1
# defaults to 1 if master-host is not set
# but will not function as a master if omitted
server-id = 1
把上面的server-id修改为2,同时添加一些信息:
server-id = 2 //本Mysql是slave服务器
master-host = 19216801 //master服务器的IP
master-user = root //连接master服务器的用户
master-password = '' //连接master服务器的密码
master-port = 3306 //连接端口
master-connect-retry = 10 //重试次数
replicate-do-db = abc //要同步的数据库
log-slave-updates //同步的形式
重启19216802的mysql服务器:
/usr/local/mysql/bin/mysqladmin shutdown
/usr/local/mysql/bin/mysqld_safe --user=mysql &
4 测试安装
首先查看一下slave的主机日志:
cat /usr/local/mysql/var/xxxxx_err (xxx是主机名)
检查是否连接正常, 看到类似这样的信息就成功了
051031 11:42:40 mysqld started
051031 11:42:41 InnoDB: Started; log sequence number 0 43634
/usr/local/mysql/libexec/mysqld: ready for connections
Version: '4115-log' socket: '/tmp/mysqlsock' port: 3306 Source distribution
051031 11:42:41 [Note] Slave SQL thread initialized, starting replication in log 'FIRST'
at position 0, relay log '/new4-relay-bin000001' position: 4
051031 11:43:21 [Note] Slave I/O thread: connected to master 'root@19216801:3306',
replication started in log 'FIRST' at position 4
在Master查看信息
/usr/local/mysql/bin/mysql -u root
查看master状态:
mysql> show master status;
查看Master下mysql进程信息:
mysql> show processlist;
在slave上查看信息:
/usr/local/mysql/bin/mysql -u root
查看slave状态:
mysql> show slave status;
查看slave下mysql进程信息:
mysql> show processlist;
你再在master的abc库里建立表结构并且插入数据,然后检查slave有没有同步这些数据,就能够检查出是否设置成功。
最后,如果有兴趣的话,可以研究一下双击热备份,或者一台master,多台slave的同步实现。
我是饮食web,如果看不懂可以追问,我上线了可以帮你解答

为了应用系统的可伸缩性,往往需要对数据库进行scale
out设计,scale
out设计也就是通过增加数据库处理节点来提高系统整体的处理能力,即增加数据库服务器的数量来分担压力。通过这种方式系统的伸缩性增强了,成本也降低了,但是系统的架构复杂了,维护困难了。难免出现系统的宕机或故障。因此,理论上来说,系统的安全性(可能数据丢失)降低了,可用性也降低了。那么要提高数据安全性,以及系统的高可用性,很简单的办法就是所有软硬件都避免单点隐患,所有数据都保存多份。从技术上来说,就可以通过数据库复制技术实现。MySQL的Replication技术就是数据库复制的实现手段之一。
关于MySQL的Replication,有几种可选的架构方案,如常规的复制架构Master-Slave方案,Dual
Master架构方案,以及级联复制架构方案,今天重点看看最简单的Master-Slave方案,其架构图如下所示:
这种架构方案,也就是一台MySQL服务器作为主服务器,主要负责应用客户端的写数据处理,同时供其他的一些作为Slave的MySQL服务器复制数据的源。而那些Slave服务器上的数据都是master服务器数据的完全备份,相对实时备份,这些备份数据主要供应用客户端的读数据使用,因为一般应用系统的读数据的压力都比写数据的压力大,特别是web应用系统。

 集群允许转换以及转换中的步骤在多个服务器上并发执行。在使用kettle集群时,首先需要定义的是Cluster schema。所谓的Cluster schema就是一系列的子服务器的集合。在一个集群中,它包含一个主服务器(Master)和多个从属服务器服务器(slave)。如下图所示:
子服务器(Slave servers)允许你在远程服务器上执行转换。建立一个子服务器需要你在远程服务器上建立一个叫做“Carte”的 web 服务器,该服务器可以从Spoon(远程或者集群执行)或者转换任务中接受输入。
在以后的描述中,如果我们提到的是子服务器,则包括集群中的主服务器和从属服务器;否则我们会以主服务器和从属服务器来进行特别指定。
注意: 在集群环境下执行转化时,你必须有一个子服务器作为主服务器(master
server)而其余所有的子服务器都作从属服务器(slave server)
代理服务器主机名

设置你要通过代理进行连接的主机名
代理服务器端口

设置与代理进行连接时所需的端口号
Ignore proxy for hosts: regexp|separated

指定哪些服务器不需要通过代理来进行连接。该选项支持你使用正则表达式来制定多个服务器,多个服务器之间以'
| ' 字符来进行分割
创建cluster schema
定义转换
定义完了 cluster schema 后,下一步就是定义在集群环境下执行的转换。我们这里展现的只是一个最简单的例子,完全是为了演示而用。现实情况中的集群有可能非常复杂。
首先你像平时一样创建转换,以hop连接连个两个步骤。然后你指定第二个步骤将在集群下执行
然后选择需要使用的集群。转换如图一样显示在GUI中。
注意 Cx4显示这个步骤将在集群中运行,而这个集群中有4个从属服务器。假设我们将计算结果再次存入到数据表中
这个转换虽然定义了集群,但是我们同样可以让它在单机环境下执行,而且可以得到相同的结果。这意味着你可以使用普通的本地模式来测试它。
执行转换
要想以集群方式来运行转换或者作业,首先需要启动在Cluster schema中定义的主服务器和从属服务器,然后再运行转换或者作业。
启动子服务器
子服务器其实是一个嵌入式的名为 Carte 的 小web server。要进行集群转换,首先需要启动cluster schema中的子服务器
脚本启动
kettle 提供了 cartebat 和 cartesh ( inux )批处理脚本来启动子服务器,这种启动方式分为两种
使用主机号和端口号
 

Carte 127001 8080
Carte 1921681221 8081

使用配置文件

Carte /foo/bar/carte-configxml
Carte url

需要用到集群,负载均衡及mysql
复制(replication);
下面提供一个系统模型你可以参考一下:
集群的结构为一个主MySQL服务器(Master)服务器与多个从属MySQL服务器(Slave)建立复制(replication)连接,主服务器与从属服务器实现一定程度上的数据同步,多个从属服务器存储相同的数据副本,实现数据冗余,提供容错功能。部署开发应用系统时,对数据库 *** 作代码进行优化,将写 *** 作(如UPDATE、INSERT)定向到主服务器,把大量的查询 *** 作(SELECT)定向到从属服务器,实现集群的负载均衡功能。如果主服务器发生故障,从属服务器将转换角色成为主服务器,使应用系统为终端用户提供不间断的网络服务;主服务器恢复运行后,将其转换为从属服务器,存储数据库副本,继续对终端用户提供数据查询检索服务。

    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。

            至此,故障转移全部结束。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/zz/13460936.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-08-11
下一篇 2023-08-11

发表评论

登录后才能评论

评论列表(0条)

保存