sunliwen / poco

Poco v1.6
0 stars 1 forks source link

nginx/app/mongodb/es/redis 的高可用的调研 #53

Open jacobfan opened 10 years ago

jacobfan commented 10 years ago

我们需要测试用的这些工具,在各种边缘状态下(例如大数据量)下的反应。 各个服务高可用的调研。

aoeuidht commented 10 years ago

mongodb

mongodb 可以采用 一主一从的部署方式(多个从有点浪费), 然后在主fail掉之后,会自动切换。程序需要做对应的修改,如果操作返回了相关错误,需要程序自动切换mongodb的地址。

链接: http://docs.mongodb.org/manual/core/replica-set-architecture-three-members/ , Primary with a Secondary and an Arbiter 这一小节

aoeuidht commented 10 years ago

Redis

redis 官方也有一个 failover 的自动解决方案,同样可以采用一主一从的部署方式: http://redis.io/topics/sentinel

py的代码需要做对应的修改,在第一个ip地址读取、写入失败之后,自动切换到 slave 的ip。

aoeuidht commented 10 years ago

ES

es 官方也提供了对应的解决 方案 http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/_add_failover.html

我回头测试一下这三个软件的 failover 的方式,让线上做参考。

aoeuidht commented 10 years ago

ES 结果

  1. 启动 es0 ,设置 cluster.nameelasticsearch (建议后面更改为更有含义的名称),此时服务运行在端口 9200
  2. 启动es1,设置 cluster.nameelasticsearch ,es1 运行在端口9201, 会自动以 es0 为master, es1 为 slave
  3. 使用 127.0.0.1:9201/_cluster/state/master_node?pretty127.0.0.1:9201/_cluster/state/?pretty 可以查看 es 的运行状态
  4. kill es0, es1 会自动变为 master, 9201 端口此时提供服务
  5. 重新启动 es0, es0 会运行在 9200 端口, es0 为slave, es1 为master

部署方式

  1. 找两台机器,运行两个 es node: es0、es1
  2. 在redis中,储存 es 的 ip 列表,默认第0个ip地址为master
  3. 程序在访问 es 前,先读取配置,再访问 es; 如果 master 操作失败,自动切换为 slave
  4. 需要有一个 crontab 来更新 redis 中的配置
aoeuidht commented 10 years ago

MongoDB 测试

我在自己的开发机上,按照master-slave-arbiter 的方式,部署了三个 mongodb 节点,步骤如下:

  1. 启动mongod
mongod --port 27027 --dbpath /home/liszt/work/tmp/rs00 --replSet rs0  --smallfiles --oplogSize 128
mongod --port 27028 --dbpath /home/liszt/work/tmp/rs01 --replSet rs0  --smallfiles --oplogSize 128
mongod --port 27029 --dbpath /home/liszt/work/tmp/arb --replSet rs0  --smallfiles --oplogSize 128
  1. 初始化 replica
mongo 127.0.0.1:27027
# init master
rs.initiate()
# add slave
rs.add("192.168.1.104:27028")
# add arbiter
rs.addArb("192.168.1.104:27029")
  1. 查看 status
rs.status()
  1. 停掉 27027 端口的mongo, 27028 成为 master; 重新启动后,27027 成为slave

部署方式

  1. 在两台机器上部署 master、slave
  2. 部署arbiter(arbiter不占用太多资源,对机器要求低)
  3. 程序操作mongodb前,首先连接 arbiter,读出 master 的信息后进行操作
aoeuidht commented 10 years ago

Redis 测试

Redis 可以使用 master-slave 方式的配置,配合 sentinel 来完成 failover,具体步骤如下

master、slave 配置

  1. 在 8009 端口,运行 master
  2. 在 8008 端口,运行 slave,需要在 配置文件中,增加对应的配置
slaveof 127.0.0.1 8009
slave-read-only no

sentinel 配置

  1. 更改 sentinel 配置文件
sentinel monitor mymaster 127.0.0.1 8009 1
sentinel down-after-milliseconds mymaster 6000
sentinel failover-timeout mymaster 10000
sentinel can-failover mymaster yes
sentinel parallel-syncs mymaster 1

sentinel monitor resque 127.0.0.1 8008 1
sentinel down-after-milliseconds resque 6000
sentinel failover-timeout resque 10000
sentinel can-failover resque yes
sentinel parallel-syncs resque 5
  1. 启动 redis-sentinel
redis-server sentinel.conf --sentinel

此时,运行在 8009 端口的服务为 master,运行在8008端口的服务为 slave。

failover

如果停掉运行在 8009 端口的服务,运行在 8008 的 redis 会自动切换成 master,并继续提供服务。 启动8009后,8009会运行服务,但不会自动变成master, 8008保持master不变, 需要手工参与master、slave的配置。

client

需要使用支持 sentinel 的 redis-client, python 有对应的包。

上线

  1. 两台机器运行 redis-server 的 master、 slave
  2. 运行 redis sentinel
  3. 客户端首先连接 sentinel, 然后读出 master 的 host:port, 然后进行 redis 读写操作
  4. master down 之后,会自动读写原来的 slave, 但master重启之后的操作,仍然需要手工参与