1.虚拟两台centos服务器 服务器A:192.168.7140 服务器B:192.168.7141
原理:Primary节点宕机之后,通过仲裁节点arbiter选举新的从节点Secondary为主节点。
主要成员(Primary):主要接收所有写操作。就是主节点。
副本成员(Secondary):从主节点通过复制操作以维护相同的数据集,即备份数据,不可写操作,但可以读操作(但需要配置)。是默认的一种从节点类型。
仲裁者(Arbiter):不保留任何数据的副本,只具有投票选举作用。当然也可以将仲裁服务器维护为副。
2.安装mongodb
服务器A:140
Primary主节点 mongodb配置如下:

dbpath = /usr/local/mongodb/data/db
# 设置日志文件的存放目录及其日志文件名
logpath = /usr/local/mongodb/data/log/mongodb.log
# 设置端口号(默认的端口号是 27017)
port = 27017
# 设置为以守护进程的方式运行,即在后台运行
fork = true
# 为本地连接远程
bind_ip=0.0.0.0
nohttpinterface = true
replSet = away
服务器B:141
Secondary从节点 mongodb 配置

dbpath = /usr/local/mongodb/data/db
# 设置日志文件的存放目录及其日志文件名
logpath = /usr/local/mongodb/data/log/mongodb.log
# 设置端口号(默认的端口号是 27017)
port = 27017
# 设置为以守护进程的方式运行,即在后台运行
fork = true
# 为本地连接远程
bind_ip=0.0.0.0
nohttpinterface = true
replSet = away
Arbiter 仲裁节点 mongodb配置

dbpath = /usr/local/mongodb-arbiter/data/db
# 设置日志文件的存放目录及其日志文件名
logpath = /usr/local/mongodb-arbiter/data/log/mongodb.log
# 设置端口号(默认的端口号是 27017)
port = 27018
# 设置为以守护进程的方式运行,即在后台运行
fork = true
# 为本地连接远程
bind_ip=0.0.0.0
nohttpinterface = true
replSet = away
3.主从配置
1.启动Primary节点mongodb
2.设置主、从、仲裁点
use admin;
nbgj = {
_id: "away",
members: [{
_id: 0,
host: "192.168.71.140:27017",
priority: 2
}, {
_id: 1,
host: "192.168.71.141:27017",
priority: 1
}, {
_id: 2,
host: "192.168.71.141:27018",
arbiterOnly: true
}]
};
nbgj可以是任意名字,第一个_id表示replica set名字,名字必须和mongodb配置一致,
Members包含所有节点地址得有优先级,优先级字段priority,值越高优先选择为主节点,arbiterOnly:true 标记为仲裁点
3.配置生效
rs.initiate(nbgj);
- 查看状态
rs.status();
显示
{
"set": "away",
"date": ISODate("2022-12-19T07:07:09.657Z"),
"myState": NumberInt("7"),
"term": NumberLong("7"),
"heartbeatIntervalMillis": NumberLong("2000"),
"members": [
{
"_id": NumberInt("0"),
"name": "192.168.71.140:27017",
"health": 1,
"state": NumberInt("1"),
"stateStr": "PRIMARY",
"uptime": NumberInt("2889"),
"optime": {
"ts": Timestamp(1671431371, 1),
"t": NumberLong("7")
},
"optimeDate": ISODate("2022-12-19T06:29:31.000Z"),
"lastHeartbeat": ISODate("2022-12-19T07:07:07.456Z"),
"lastHeartbeatRecv": ISODate("2022-12-19T07:07:09.2Z"),
"pingMs": NumberLong("0"),
"electionTime": Timestamp(1671430748, 1),
"electionDate": ISODate("2022-12-19T06:19:08.000Z"),
"configVersion": NumberInt("1")
},
{
"_id": NumberInt("1"),
"name": "192.168.71.141:27017",
"health": 1,
"state": NumberInt("2"),
"stateStr": "SECONDARY",
"uptime": NumberInt("6266"),
"optime": {
"ts": Timestamp(1671431371, 1),
"t": NumberLong("7")
},
"optimeDate": ISODate("2022-12-19T06:29:31.000Z"),
"lastHeartbeat": ISODate("2022-12-19T07:07:05.875Z"),
"lastHeartbeatRecv": ISODate("2022-12-19T07:07:08.285Z"),
"pingMs": NumberLong("0"),
"syncingTo": "192.168.71.140:27017",
"configVersion": NumberInt("1")
},
{
"_id": NumberInt("2"),
"name": "192.168.71.141:27018",
"health": 1,
"state": NumberInt("7"),
"stateStr": "ARBITER",
"uptime": NumberInt("6267"),
"configVersion": NumberInt("1"),
"self": true
}
],
"ok": 1
}
3 配置keepalived实现高可用
官网地址:http://www.keepalived.org(以下以2.0.6版本为例)
安装位置:/usr/local/
解压到 /usr/local

安装依赖包
yum -y install curl gcc openssl-devel libnl3-devel net-snmp-devel
yum -y install libnfnetlink-devel
yum -y install ipvsadm
安装keepalived
cd keepalived
./configure
make && make install
生成启动脚本
cat /usr/lib/systemd/system/keepalived.service

将keepalved加进系统服务并且在/etc/sysconfig/写入配置文件以及将keepalived命令/usr/bin 和 /usr/sbin
具体操作
cp /usr/local/keepalived/keepalived/etc/init.d/keepalived /etc/init.d/keepalived #最好查看下keeplaived是否有执行权限
mkdir /etc/keepalived/
cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/sbin/keepalived /usr/bin/ #方便以后查看keepalived的版本,用keepalived -v可以查看
cp /usr/local/sbin/keepalived /usr/sbin/
修改配置文件
vi /etc/keepalived/keepalived.conf
配置服务器A:140
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
#nopreempt #不抢占模式,只有优先级高的机器上设置即可,优先级低的机器可不设置
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.71.200
}
}
virtual_server 192.168.71.200 27017 {
delay_loop 2
lb_algo wrr
lb_kind DR
persistence_timeout 60 #会话保持时间
protocol TCP
real_server 192.168.71.140 27017 {
weight 3
notify_down /root/shutdown.sh #检测到服务down后执行的脚本
TCP_CHECK {
nb_get_retry 3 #重连次数
connect_timeout 10 #连接超时时间
delay_before_retry 3 #重连间隔时间
connect_port 27017 #健康检查端口
}
}
}
服务器B:141
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL # 标识本节点的字条串,通常为hostname
vrrp_skip_check_adv_addr
#vrrp_strict #这个最好注释掉,否则可能造成物理机的浏览器无法访问应用
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
#state MASTER
state BACKUP
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { # Block limited to 20 IP addresses @IP
192.168.71.200
}
}
#虚拟服务器定义块
virtual_server 192.168.71.200 27017 {
delay_loop 2
lb_algo wrr
lb_kind DR
persistence_timeout 60
protocol TCP
real_server 192.168.71.141 27017 {
weight 3
notify_down /root/shutdown.sh
TCP_CHECK {
nb_get_retry 3 #重连次数
connect_timeout 10 #连接超时时间
delay_before_retry 3 #重连间隔时间
connect_port 27017 #健康检查端口
}
}
}
编写检测服务down后所要执行的脚本shutdown.sh
shutdown.sh 内容
#!/bin/bash
killall keepalive
启动keepalived并查看日志
chkconfig keepalived on
service keepalived start #启动服务
service keepalived stop #停止服务
service keepalived restart #重启服务
systemctl enable keepalived.service #设置开机启动
启动后查看日志
tail -f /var/log/messages

测试
远程客户端通过vip登录测试
