乐趣区

关于mysql:高可用离线以及mysql主主备份部署

前言:为了缩小三维数据中心可视化管理系统的复工工夫,放弃其服务的高度可用性。同时部署多套同样的三维可视化零碎,让三维数据中心可视化零碎同时部署并运行到多个服务器上。同时提供一个虚构 IP,而后里面通过这个虚构 IP 来拜访三维可视化管理系统,当一台实体服务器挂掉时会主动的切到另一条服务器,然而这个虚构 IP 仍然能提供服务。

 要实现高可用性,须要保证数据的统一,因而须要保障这几台服务器上的数据库中的数据统一;同时还须要保障上传的文件信息统一。最初须要通过软件监听程序来监听并且挂掉时进行主动切换。

一、什么是高可用?

高可用 HA(High Availability)是分布式系统架构设计中必须思考的因素之一,它通常是指,通过设计缩小零碎不能提供服务的工夫。

假如零碎始终可能提供服务,咱们说零碎的可用性是 100%。

如果零碎每运行 100 个工夫单位,会有 1 个工夫单位无奈提供服务,咱们说零碎的可用性是 99%。52.56 分钟。

百度的搜寻首页,是业内公认高可用保障十分杰出的零碎,甚至人们会通过 www.baidu.com 能不能拜访来判断“网络的连通性”,百度高可用的服务让人留下啦“网络通顺,百度就能拜访”,“百度打不开,应该是网络连不上”的印象,这其实是对百度 HA 最高的贬责。—– 摘选自知乎

二、如何保障系统的高可用

咱们都晓得,单点是零碎高可用的大敌,单点往往是零碎高可用最大的危险和敌人,应该尽量在零碎设计的过程中防止单点。方法论上,高可用保障的准则是“集群化”,或者叫“冗余”:只有一个单点,挂了服务会受影响;如果有冗余备份,挂了还有其余 backup 可能顶上。

保证系统高可用,架构设计的外围准则是:冗余。

有了冗余之后,还不够,每次呈现故障须要人工染指复原势必会减少零碎的不可服务实际。所以,又往往是通过“主动故障转移”来实现零碎的高可用。—– 摘选自知乎

人话: 两台服务器启动着雷同的服务,如果有一台故障,另一台主动接管, 咱们将这个称之为高可用;

相似服务器: 冗余, 相似服务器有 2 - 4 个电源, 然而比拟贵

上图:

装置 keepalived:

离线装置办法:因为咱们的大部分客户都是属于数据中心,并不会连贯外网,所以采取离线装置的形式比拟多,在线装置的办法非常简单,如下命令即可,在装置 keepalived 之前确保装置了摄像头的那一套货色,因为这里波及到须要装置 openssl 的模块,如果没有装请先装 nginx 摄像头相应的软件

keepalived 的运行模式:

筹备条件:

须要三个 ip, 并且保障是局域网, 相互之间 ping 的通, 后面两个 ip 好了解, 两台服务器, 第三个 ip 就是一个虚构 ip, 就是空余 ip 没被启用的即可, 咱们拜访零碎的话就是通过这个虚构 ip 拜访

优先级

VRRP 依据优先级来确定虚构路由器中每台路由器的位置;

非抢占形式

如果 Backup 路由器工作在非抢占形式下,则只有 Master 路由器没有呈现故障 Backup 路由器即便随后被配置了更高的优先级也不会成为 Master 路由器;

抢占形式

如果 Backup 路由器工作在抢占形式下,当它收到 VRRP 报文后,会将本人的优先级与通告报文中的优先级进行比拟。如果本人的优先级比以后的 Master 路由器的优先级高,就会被动抢占成为 Master 路由器;否则,将放弃 Backup 状态.

yum install keepalived-y

1. 上传文件

1. 首先把文件传到 opt 上面

2. 解压装置

cd /opt   
tar -zxvf keepalived-2.0.20.tar.gz

3. 编译

cd  keepalived-2.0.20
./configure --prefix=/usr/local/keepalived

会发现有一个报错

4. 报错信息而后装置

cd /opt
rpm -ivh libnl-1.1.4-3.el7.x86_64.rpm --force --nodeps
rpm -ivh libnl-devel-1.1.4-3.el7.x86_64.rpm --force --nodeps
cd keepalived-2.0.20
./configure --prefix=/usr/local/keepalived

没有报错了, 持续往下执行

 make && make install

输出下面的命令会报以下谬误

解决:

cd /usr/local/lib64
export LIBRARY_PATH=/usr/local/lib64
cd /opt/keepalived-2.0.20
./configure --prefix=/usr/local/keepalived
 make && make install

执行完之后也报错了

5. 初始化 keepalived

 cp /opt/keepalived-2.0.20/keepalived/etc/init.d/keepalived /etc/init.d/
 cp /opt/keepalived-2.0.20/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
mkdir -p /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
chmod +x /etc/init.d/keepalived

6. 增加 keepalived 到开机启动

chkconfig —add keepalived 
chkconfig keepalived on 

7. 启动、敞开、重启

service keepalived start  // 启动 
service keepalived stop   // 进行 
service keepalived restart   // 重启 

当咱们启动应用 service keepalived start 启动的时候会报错

解决:

ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1

在输出命令启动

service keepalived start

以上的 1 - 7 步骤在备机上也须要装一下, 请留神

8. 配置 keepalived

主机:192.168.10.51

备机:192.168.10.65

虚构 ip:192.168.10.77

在主机下操作:

vi /etc/keepalived/keepalived.conf

以下就是咱们须要批改的内容

填完间接 :wq! 保留退出即可

下面图外面说的网卡名称查询方法:

ip addr

而后重启 keepalived

service keepalived restart
service keepalived status     // 查看 keepalived 的状态, 下图示意曾经启动 

在备机下操作:

vi /etc/keepalived/keepalived.conf

以下就是咱们须要批改的内容

填完间接 :wq! 保留退出即可

而后重启 keepalived

service keepalived restart
service keepalived status     // 查看 keepalived 的状态, 下图示意曾经启动 

9. 验证

 启动后看对应的虚构 IP 地址是否生成,当主机关掉或者其对应的 keepalived 挂掉后备机是否生成对应的虚构 IP,以及主机重启工作时虚构 IP 是否从新漂移到主机上。

咱们能够互相 ping 一下, 能够看见是通的

下面咱们讲过, 默认拜访就是主机, 主机挂了就是切换到备机, 咱们只须要查看主机下面的 ip, 下面很显著有两个 ip, 其中有一个就是虚拟机 ip

当咱们把主机关掉或者主机的 keepalived 服务关掉之后看是否从新漂移回来呢?

咱们再看看 ip addr, 很显著曾经没有了虚构 ip

咱们曾经胜利关掉了主机的 keepalived 服务, 咱们看下备机上可能看到虚构 ip 吗

咱们在备机上操作, 咱们能够看到虚构 ip 跑到了这下面, 看到这里你是不是对 keepalived 的工作模式有了一个通俗的意识, 接下来咱们开启主机的 keepalived 服务, 可能在跳过去嘛. 这就是模仿当主机曾经复原服务了, 看是否主动跳转过来

启动主机的 keepalived 服务:

service keepalived start
service keepalived status

查看 ip, 很显著曾经切换回来了, 自此曾经配置实现了 keepalived 服务

mysql 主主备份:

 保障各服务器上的数据库中的数据统一,因而须要开启数据库同步机制。因为是一整套零碎,并且零碎内含数据库。因为任何一台服务器都有可能被选中,因而要让所有的数据库上的数据都是最新的,任何一个服务器上的数据发生变化时都要主动的同步到其余的服务器上。三维可视化管理系统应用的时 Mysql 数据库,这里采纳的时主 - 主备份机制进行同步的。

主一数据库:192.168.10.51

主二数据库:192.168.10.65

主数据库 1:

编辑数据库

vi /etc/my.cnf
# 开启二进制同步
log-bin=mysql-bin

# 设置 ID, 不能反复, 能够应用 IP 最初一位数字 
server-id=129

# 须要同步的数据名称, 多个数据库则要反复设置: bin-do-db,bin-ignore-db 为互斥关系, 只需设置其中一项即可
replicate-do-db=itv

# 自增长字段初始值为 1
auto-increment-offset=1

# 自增长字段增量值
auto-increment-increment=2

# 跳过所有复制的谬误
slave-skip-errors=all
systemctl restart mysqld   // 重启 mysql 服务 

主数据库 2:

编辑数据库

vi /etc/my.cnf
# 开启二进制同步
log-bin=mysql-bin

# 设置 ID, 不能反复, 能够应用 IP 最初一位数字 
server-id=128

# 须要同步的数据名称, 多个数据库则要反复设置: bin-do-db,bin-ignore-db 为互斥关系, 只需设置其中一项即可
replicate-do-db=itv

# 自增长字段初始值为 1
auto-increment-offset=1

# 自增长字段增量值
auto-increment-increment=2

# 跳过所有复制的谬误
slave-skip-errors=all
systemctl restart mysqld   // 重启 mysql 服务 

创立 mysql 复制账户:

在主一数据库操作:

为主二的所在的 ip 创立一个账号密码为 root1, 这样就可能容许近程拜访本机数据库了

登录 mysql:

mysql -uroot -proot   // 登录 mysql
grant replication slave on *.* to root1@'192.168.10.68' identified by 'root1';

赋予权限: 如果就这样连贯的话尽管能拜访但还是看不了数据的, 所以须要赋予 root1 权限

update user set `Select_priv` = 'Y',`Insert_priv` = 'Y',`Update_priv` = 'Y',`Delete_priv` = 'Y',`Create_priv` = 'Y',`Drop_priv` = 'Y',
`Reload_priv` = 'Y',`Shutdown_priv` = 'Y',`Process_priv` = 'Y',`File_priv` = 'Y',`Grant_priv` = 'Y',`References_priv` = 'Y',
`Index_priv` = 'Y',`Alter_priv` = 'Y',`Show_db_priv` = 'Y',`Super_priv` = 'Y',`Create_tmp_table_priv` = 'Y',
`Lock_tables_priv` = 'Y',`Execute_priv` = 'Y',`Repl_slave_priv` = 'Y',`Repl_client_priv` = 'Y',`Create_view_priv` = 'Y',
`Show_view_priv` = 'Y',`Create_routine_priv` = 'Y',`Alter_routine_priv` = 'Y',`Create_user_priv` = 'Y',`Event_priv` = 'Y',
`Trigger_priv` = 'Y',`Create_tablespace_priv` = 'Y'
where user='root1';

立刻失效:

flush privileges;

在主二数据库操作:

为主一的所在的 ip 创立一个账号密码为 root1, 这样就可能容许近程拜访本机数据库了

登录 mysql:

mysql -uroot -proot   // 登录 mysql
grant replication slave on *.* to root1@'192.168.10.67' identified by 'root1';

赋予权限: 如果就这样连贯的话尽管能拜访但还是看不了数据的, 所以须要赋予 root1 权限

update user set `Select_priv` = 'Y',`Insert_priv` = 'Y',`Update_priv` = 'Y',`Delete_priv` = 'Y',`Create_priv` = 'Y',`Drop_priv` = 'Y',
`Reload_priv` = 'Y',`Shutdown_priv` = 'Y',`Process_priv` = 'Y',`File_priv` = 'Y',`Grant_priv` = 'Y',`References_priv` = 'Y',
`Index_priv` = 'Y',`Alter_priv` = 'Y',`Show_db_priv` = 'Y',`Super_priv` = 'Y',`Create_tmp_table_priv` = 'Y',
`Lock_tables_priv` = 'Y',`Execute_priv` = 'Y',`Repl_slave_priv` = 'Y',`Repl_client_priv` = 'Y',`Create_view_priv` = 'Y',
`Show_view_priv` = 'Y',`Create_routine_priv` = 'Y',`Alter_routine_priv` = 'Y',`Create_user_priv` = 'Y',`Event_priv` = 'Y',
`Trigger_priv` = 'Y',`Create_tablespace_priv` = 'Y'
where user='root1';

立刻失效:

flush privileges;

测试是否拜访:

在主一登录主二的数据库:

mysql -h192.168.10.65 -uroot1 -p    // 登录主二的数据库 

发现连贯失败

咱们查看 3306 端口发现被占用, 咱们开启 3306 端口, 咱们在主备机都须要凋谢此端口

应该是防火墙的起因,

firewall-cmd --zone=public --add-port=3306/tcp --permanent

而后重启防火墙

systemctl restart firewalld.service

持续连贯, 发现能够连贯胜利, 并且能够查看数据

show databases;  // 查看数据库 

同理, 在主二的数据库能够拜访主一的数据库看下:

mysql -h192.168.10.51 -uroot1 -p    // 登录主一的数据库 
show databases;  // 查看数据库 

重启数据库

 主数据库 1: systemctl restart mysqld
 主数据库 2: systemctl restart mysqld 

互告 bin-log 信息

主主同步还有主从同步都是基于 binlog 的原理进行, 相当于咱们关上了这个开关, 每次操作数据库都会产生一个 binlog 日志, 而后把 binlog 日志进行发给对方进行执行, 这样数据就放弃同步了

首先进入 MySQL 命令行:

主数据库 1:

查看日志: show master status;

设置同步:

change master to master_host = '192.168.10.65',master_user='root1',master_password='root1',master_port=3306,master_log_file='mysql-bin.000002',master_log_pos=154;

备注: master_log_file 与 File 值统一, master_log_pos 与 Position 值统一

开始同步: start slave;

查看同步状况:

show slave status\G;

当看到了两个 yes,即:Slave_IO_Running: Yes

Slave_SQL_Running: Yes

阐明曾经配置胜利了, 然而这里有一个显示为 no, 显著有问题

解决办法:

stop slave;
reset slave;
start slave;

而后咱们持续查看同步状况;

show slave status\G;

灰常完满

主数据库 2:

这里其实跟下面的主数库一是一样的操作

show master status;
change master to master_host = '192.168.10.51',master_user='root1',master_password='root1',master_port=3306,master_log_file='mysql-bin.000002',master_log_pos=154;

备注 : master_log_file 与 File 值统一, master_log_pos 与 Position 值统一

开始同步:

  start slave;

查看同步状况:

 show slave status\G;

当看到了两个 yes,即:

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

阐明曾经配置胜利了, 如果这里的 slave_io_Running 显示 no 仍然采纳下面的方法操作即可

开启我的项目测试:

在主一和主二机器上别离部署我的项目, 并且导入雷同的数据库, 而后用 forever 启动, 这个在之前的部署环境就有讲过, 此处不再赘述, 咱们开启我的项目

在主机上开启机房:

在备机上也开启机房:

而后咱们开始拜访这两个我的项目 (留神此时的防火墙, 把 8081 端口关上):

咱们发现两个我的项目都能够顺利的关上,这时候咱们就应用虚构 ip 进行拜访,因为理论咱们也是通过这个虚构 ip 进行拜访的,咱们的虚构 ip 是 192.168.10.77, 一 i 就那个能够顺利拜访了,当初咱们就关掉主机的机房程序,看他能不能拜访

关掉主机服务:

forever stopall

咱们还须要吧 keepalived 的服务关了,因为 keepalived 并不知道咱们的机房程序曾经挂了,所以要时刻监听 8081 端口的状态,如果 8081 端口监听不到那么就进行 keepalived 这个服务,以下是 sheel 脚本,而后咱们设置监听一分钟即可

A=`netstat -lnp | grep 8081 | wc -l`

if [$A -eq 0]; then
    # echo "keepalived 应该敞开了"
    /usr/sbin/service keepalived stop
fi

而后关掉 keepalived 的服务:

service keepalived stop

当初咱们持续拜访主机的程序,而后在拜访虚构 ip

能够看到,主机程序曾经拜访不到,那么虚构 ip 呢 (这里留神虚构 ip 机大的防火墙肯定要敞开或者是凋谢 8081 端口)

能够看到, 虚构 ip 曾经飘到备用服务器上了, 这时候备机下面曾经有了虚构 ip

如果当初主机从新上线, 虚构 ip 还会从备机飘到主机上, 这时候就会产生一个景象, 就是脑裂

咱们启动主机的机房并且启动 keepalived

退出移动版