“高可用性”(High Availability)通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性。
什么原因造成系统的不可用
正常可用时间和全年时间百分比表示高可用的程度
如果要达到9.99999的高可用:(3652460)*(1-0.99999) = 5.256 即,全年最多有5分钟不可用
如何实现高可用
单点故障是指在一个系统中提供相同的功能的组件只用一个,如果这个组件失败了,就会影响功能的正常使用。组成应用系统的各个组件都可能成为单点。
优点
缺点
所以共享存储并不是一种好的解决单点故障的方式
优势
缺点
所以DRDB也不是一种理想的解决反感
优点
缺点
参考: https://blog.csdn.net/Code_Pupil/article/details/89377400
** 但是这需要解决如下几个问题**
MMM(Multi-Master Replication Manager)是MySQL多主复制管理器的简称,主要作用是监控和管理MySQL的主主复制拓扑,并在当前的主从服务器失效时,进行主和主备服务器之间的主从切换和故障转移等工作。
MMM提供了什么功能
MMM是基于MYSQL主主复制拓扑的
MMM部署步骤
$ ifconfig
eth1: flags=4163 mtu 1500
inet 192.168.33.102 netmask 255.255.255.0 broadcast 192.168.33.255
inet6 fe80::a00:27ff:feba:368b prefixlen 64 scopeid 0x20
ether 08:00:27:ba:36:8b txqueuelen 1000 (Ethernet)
RX packets 232 bytes 23673 (23.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 20 bytes 2162 (2.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
$ cd /etc/sysconfig/network-scripts
#ifcfg-<网卡名>:
$ cp ifcfg-eth1 ifcfg-eth1:1
$ vi ifcfg-eth1:1
#主要修改的是设备号和IP地址
IPADDR=192.168.33.201#IP地址
DEVICE=eth1:1#设备号
$ ifup eth1:1
$ ip addr show
$ ping 192.168.33.201
数据库配置参考: https://blog.csdn.net/Code_Pupil/article/details/89377400
主DB1服务器配置
#二进制日志的格式
binlog_format=row
binlog_row_image=minimal
#启用二进制日志(可自定义存放位置,需要先创建并赋予权限)
log_bin = /var/lib/mysql/sql_log/mysql_bin
#启用中继日志(可自定义存放位置)
relay_log = /var/lib/mysql/sql_log/mysql_relay_bin
#指定从服务器的服务ID,整个服务集群中式唯一的(自定义,集群中不重复即可)
server_id = 101
#可选(如果需要将从服务器作为其他服务器的主服务器时必须设置,否则不设置)
log_slave_updates = on
#控制ID的自增2
auto_increment_increment = 2
#控制ID初始值1
auto_increment_offset = 1
主DB2服务器
#二进制日志的格式
binlog_format=row
binlog_row_image=minimal
#启用二进制日志(可自定义存放位置,需要先创建并赋予权限)
log_bin = /var/lib/mysql/sql_log/mysql_bin
#启用中继日志(可自定义存放位置)
relay_log = /var/lib/mysql/sql_log/mysql_relay_bin
#指定从服务器的服务ID,整个服务集群中式唯一的(自定义,集群中不重复即可)
server_id = 102
#可选(如果需要将从服务器作为其他服务器的主服务器时必须设置,否则不设置)
log_slave_updates = on
#控制ID的自增2
auto_increment_increment = 2
#控制ID初始值2
auto_increment_offset = 2
从DB服务器
#二进制日志的格式
binlog_format=row
binlog_row_image=minimal
#启用二进制日志(可自定义存放位置,需要先创建并赋予权限)
log_bin = /var/lib/mysql/sql_log/mysql_bin
#启用中继日志(可自定义存放位置)
relay_log = /var/lib/mysql/sql_log/mysql_relay_bin
#指定从服务器的服务ID,整个服务集群中式唯一的(自定义,集群中不重复即可)
server_id = 103
#可选,建议从服务器只读
read_only = on
数据库数据需要一致,提前备份初始化数据
#rep:复制用户
#mmm_monitor:监控用户。所有mysql节点进行健康检查
#mmm_agent:代理用户。切换只读模式和同步Master信息
mysql>GRANT REPLICATION SLAVE ON *.* to 'repl'@'ip' identified by '密码';
mysql>GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'ip' IDENTIFIED BY '密码';
mysql>GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'ip' IDENTIFIED BY '密码';
mysql> SHOW MASTER STATUS \G;
*************************** 1. row ***************************
File: mysql_bin.000006
Position: 2018
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
#rep:复制用户
#mmm_monitor:监控用户。所有mysql节点进行健康检查
#mmm_agent:代理用户。切换只读模式和同步Master信息
mysql>GRANT REPLICATION SLAVE ON *.* to 'repl'@'ip' identified by '密码';
mysql>GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'ip' IDENTIFIED BY '密码';
mysql>GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'ip' IDENTIFIED BY '密码';
mysql>CHANGE MASTER TO
->MASTER_HOST='master_host_ip',#主DB1服务器IP
->MASTER_USER='repl',#主DB1复制用户
->MASTER_PASSWORD='PassWord',#主DB1复制用户密码
->MASTER_LOG_FILE='mysql_bin.000007',#在主DB1查看日志文件
->MASTER_LOG_POS=5856;#在主DB1查看节点
mysql>start slave;#启动复制链路
mysql>show slave status \G;#查看复制链路是否启动
*************************** 1. row ***************************
Slave_IO_Running: Yes #YES表示成功
Slave_SQL_Running: Yes #YES表示成功
Last_IO_Errno: 0 #IO错误代码
Last_IO_Error: #IO错误提示
Last_SQL_Errno: 0 #SQL错误代码
Last_SQL_Error: #SQL错误提示
mysql> SHOW MASTER STATUS \G;
*************************** 1. row ***************************
File: mysql_bin.000001
Position: 2175
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
mysql>CHANGE MASTER TO
->MASTER_HOST='master_host_ip',#主DB2服务器IP
->MASTER_USER='repl',#主DB2复制用户
->MASTER_PASSWORD='PassWord',#主DB2复制用户密码
->MASTER_LOG_FILE='mysql_bin.000007',#在主DB2查看日志文件
->MASTER_LOG_POS=5856;#在主DB2查看节点
mysql>start slave;#启动复制链路
mysql>show slave status \G;#查看复制链路是否启动
*************************** 1. row ***************************
Slave_IO_Running: Yes #YES表示成功
Slave_SQL_Running: Yes #YES表示成功
Last_IO_Errno: 0 #IO错误代码
Last_IO_Error: #IO错误提示
Last_SQL_Errno: 0 #SQL错误代码
Last_SQL_Error: #SQL错误提示
mysql> SHOW MASTER STATUS \G;
*************************** 1. row ***************************
File: mysql_bin.000006
Position: 3401
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
#mmm_monitor:监控用户。所有mysql节点进行健康检查
#mmm_agent:代理用户。切换只读模式和同步Master信息
mysql>GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'ip' IDENTIFIED BY '密码';
mysql>GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'ip' IDENTIFIED BY '密码';
mysql>CHANGE MASTER TO
->MASTER_HOST='master_host_ip',#主DB1服务器IP
->MASTER_USER='repl',#主DB1复制用户
->MASTER_PASSWORD='PassWord',#主DB1复制用户密码
->MASTER_LOG_FILE='mysql_bin.000007',#在主DB1查看日志文件
->MASTER_LOG_POS=5856;#在主DB1查看节点
mysql>start slave;#启动复制链路
mysql>show slave status \G;#查看复制链路是否启动
*************************** 1. row ***************************
Slave_IO_Running: Yes #YES表示成功
Slave_SQL_Running: Yes #YES表示成功
Last_IO_Errno: 0 #IO错误代码
Last_IO_Error: #IO错误提示
Last_SQL_Errno: 0 #SQL错误代码
Last_SQL_Error: #SQL错误提示
主DB1\2、从DB配置YUM源
$ cd /usr/local/src/
$ yum -y install wget
$ wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
$ wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
$ rpm -ivh epel-release-latest-7.noarch.rpm
$ rpm -ivh remi-release-7.rpm
$ vi /etc/yum.repos.d/remi.repo
[remi]
enabled=1 #改成1
$ vi /etc/yum.repos.d/epel.repo
[epel]
baseurl #注释取消
#metalink#注释镜像
$ yum search mmm
=============================== N/S matched: mmm ===============================
mysql-mmm-agent.noarch : MMM Database Server Agent Daemon and Libraries
mysql-mmm-monitor.noarch : MMM Monitor Server Daemon and Libraries
mysql-mmm-tools.noarch : MMM Control Scripts and Libraries
mysql-mmm.noarch : Multi-Master Replication Manager for MySQL
$ yum install mysql-mmm-agent.noarch -y
在监控服务器安装监控服务
$ yum -y install mysql-mmm*
MMM数据库节点配置
主DB1\2、从DB配置都要一样
$ vi /etc/mysql-mmm/mmm_common.conf
active_master_role writer
cluster_interface eth1 #网卡,ip addr查看IP所在网卡
pid_path /run/mysql-mmm-agent.pid
bin_path /usr/libexec/mysql-mmm/
replication_user repl #复制用户
replication_password Password #复制用户密码
agent_user mmm_agent #代理用户
agent_password Password #代理用户密码
ip 192.168.33.101 #主DB1服务器IP
mode master
peer db2
ip 192.168.33.102 #主DB2服务器IP
mode master
peer db1
ip 192.168.33.103 #从DB服务器IP
mode slave
hosts db1, db2 #写角色db
ips 192.168.33.201 #写角色的虚拟IP
mode exclusive #独占模式,同一时刻只能有一个主
hosts db1, db2, db3 #读角色db
ips 192.168.33.201, 192.168.33.202,192.168.33.203 #写角色的虚拟IP
mode balanced
修改mmm-agent配置
$ vi /etc/mysql-mmm/mmm-agent.conf
include mmm_common.conf
# The 'this' variable refers to this server. Proper operation requires
# that 'this' server (db1 by default), as well as all other servers, have the
# proper IP addresses set in mmm_common.conf.
this db1 #只需修改这里,根据mmm_common.conf配置修改(db1|db2|db3)
配置监控服务器监控节点
$ vi /etc/mysql-mmm/mmm-mon.conf
include mmm_common.conf
ip 127.0.0.1
pid_path /run/mysql-mmm-monitor.pid
bin_path /usr/libexec/mysql-mmm
status_path /var/lib/mysql-mmm/mmm_mond.status
ping_ips 192.168.33.101,192.168.33.102,192.168.33.103 #配置主DB1\2、从DB服务器IP
auto_set_online 60
# The kill_host_bin does not exist by default, though the monitor will
# throw a warning about it missing. See the section 5.10 "Kill Host
# Functionality" in the PDF documentation.
#
# kill_host_bin /usr/libexec/mysql-mmm/monitor/kill_host
#
monitor_user mmm_monitor #监控用户
monitor_password Password #监控用户密码
debug 0
启动三个服务器MMM集群
$ service mysql-mmm-agent start
$ service mysql-mmm-agent status
Redirecting to /bin/systemctl status mysql-mmm-agent.service
● mysql-mmm-agent.service - MySQL MMM agent
Loaded: loaded (/usr/lib/systemd/system/mysql-mmm-agent.service; disabled; vendor preset: disabled)
Active: active (running) since Fri 2019-05-10 08:27:16 UTC; 27s ago
Process: 7347 ExecStart=/usr/sbin/mmm_agentd (code=exited, status=0/SUCCESS)
Main PID: 7349 (mmm_agentd)
CGroup: /system.slice/mysql-mmm-agent.service
├─7349 mmm_agentd
└─7350 mmm_agentd
May 10 08:27:16 localhost.localdomain systemd[1]: Starting MySQL MMM agent...
May 10 08:27:16 localhost.localdomain systemd[1]: PID file /run/mysql-mmm-age...
May 10 08:27:16 localhost.localdomain systemd[1]: Started MySQL MMM agent.
Hint: Some lines were ellipsized, use -l to show in full.
监控服务器启动监控服务
$ service mysql-mmm-monitor start
$ mmm_control show 查看状态
优点
缺点
MHA是一位日本MySQL大牛用Perl写一套MySQL故障切换方案,来保证数据库系统的高可用,在宕机的事件内(通常10-30秒),完成故障转意,部署MHA,可避免主从一致性问题,节约购买新服务器的费用,不影响服务器性能,易安装,不改变现有部署 参考:https://blog.csdn.net/linuxlsq/article/details/52606255
优点
缺点
参考文章
https://github.com/caojx-git/learn/blob/master/notes/mysql/打造扛得住的MySQL.md