共计 12039 个字符,预计需要花费 31 分钟才能阅读完成。
MHA:Master HA;是一款开源的 MySQL 的高可用程序,它为 MySQL 主从复制架构提供了 automating master failover 功能。MHA 在监控到 master 节点故障时,会将拥有最新数据的 slave 节点升为新的 master 节点,在此期间,MHA 会通过于 slave 节点获取额外信息来避免一致性方面的问题。MHA 还提供了 master 节点在线切换功能,即按需切换 master/slave 节点
MHA 服务有两种角色:管理节点(MHA Manager)和数据节点(MHA Node)
MHA Manager:通常单独部署在一台独立服务器上管理多个 master/slave 集群,每个 master/slave 集群称为一个 application
MHA Node:运行在每台 MySQL 服务器上(master/slave/manager),他通过监控具备解析和清理 logs 功能的脚本来加快故障转移
Galera Cluster
基于 wsrep 协议在全局实现复制,任何一节点都可实现读写操作,无延迟复制,不会产生数据丢失,当某台服务器宕机后,备用服务器会自动接管。
一、基于 Galera Cluster 实现 MySQL 高可用
准备环境:CentOS 7
节点 1 | IP:172.18.42.200 |
节点 2 | IP:172.18.42.201 |
节点 3 | IP:172.18.42.202 |
1、部署节点 1
(1)安装 Galera 服务
[root@node0 ~]# yum install MariaDB-Galera-server -y
(2)编辑其配置文件
[root@node0 ~]# rpm -ql galera ## 查看相关文件
/usr/lib64/galera/libgalera_smm.so
[root@node0 ~]# vim /etc/my.cnf.d/server.cnf
[galera]
# Mandatory settings ## 强制设置
wsrep_provider=/usr/lib64/galera/libgalera_smm.so ##wsrep 的提供者,一般是一个插件,不同的安装版本有可能不一样
wsrep_cluster_address=”gcomm://172.18.42.200, 172.18.42.201, 172.18.42.202″ ## 指明 Galera-Cluster 的各个节点
binlog_format=row ## 二进制日志格式,默认是 row 格式,不建议更改
default_storage_engine=InnoDB ## 指明使用的引擎
innodb_autoinc_lock_mode=2 ## 锁格式
bind-address=0.0.0.0 ##wsrep 在工作时监听的地址
wsrep_cluster_name=’mycluster’ ## 指明 Galera 集群的名称
(3)首次启动时,需要初始化集群
[root@node0 ~]# /etc/rc.d/init.d/mysql start –wsrep-new-cluster ## 在某一个节点上启动 mysql 服务
2、部署节点 2
(1)安装 MariaDB-Galera-server 服务
[root@node0 ~]# yum install MariaDB-Galera-server -y
(2)启动服务
[root@node2 ~]# service mysql start
Starting MySQL….SST in progress, setting sleep higher. SUCCESS!
3、部署节点 3
(1)安装 MariaDB-Galera-server 服务
[root@node0 ~]# yum install MariaDB-Galera-server -y
(2)启动服务
[root@node2 ~]# service mysql start
Starting MySQL….SST in progress, setting sleep higher. SUCCESS!
4、三个节点都连接 mysql 服务,随后创建一个数据库,查看其它两个节点是否复制
[root@node0 ~]# mysql ## 节点 1 连接 mysql 服务
MariaDB [(none)]> create database MaGeRepo; ## 在节点 1 上创建数据库“MaGeRepo”,并查看
MariaDB [(none)]> show databases;
+——————–+
| Database
+——————–+
| information_schema
| MaGeRepo
| mysql
| performance_schema
| test
+——————–+
[root@node1 ~]# mysql ## 节点 2 连接至 mysql 服务
MariaDB [(none)]> show databases; ## 查看数据库
+——————–+
| Database
+——————–+
| information_schema
| MaGeRepo
| mysql
| performance_schema
| test
+——————–+
[root@node2 ~]# mysql ## 节点 3 连接至 mysql 服务
MariaDB [(none)]> show databases; ## 查看数据库
+——————–+
| Database
+——————–+
| information_schema
| MaGeRepo
| mysql
| performance_schema
| test
+——————–+
## 数据库实现了同步
5、把节点 2 宕机,随后在数据库“MaGeRepo”中创建表“MaGe“;
MariaDB [MaGeRepo]> create table MaGe (ID int unsigned auto_increment not null primary key,Name char(10)); ## 在节点 1 上创建表“MaGe”
MariaDB [MaGeRepo]> insert into MaGe (Name) values (‘MaGe’),(‘Lweim’); ## 在节点 1 中插入数据“Lweim”、“MaGe”
MariaDB [MaGeRepo]> insert into MaGe (Name) values (‘Wtc’),(‘Wzx’); ## 在节点 3 中插入数据“Wtc”、“Wzx”
6、节点 2 开启 mysql 服务器,并查看其数据库
[root@node1 ~]# service mysql start ## 启动节点 2
Starting MySQL…..SST in progress, setting sleep higher. SUCCESS!
[root@node1 ~]# mysql ## 连接至 mysql 服务
MariaDB [MaGeRepo]> select * from MaGe; ## 查看表中的数据
+—-+——-+
| ID | Name
+—-+——-+
| 1 | MaGe
| 3 | Lweim
| 4 | Wtc
| 6 | Wzx
+—-+——-+
由此可见,当其中某一台服务器宕机后,即使数据发生改变,重新上线之后也可同步数据,但需要注意的是 ID 并不是按自动增长次序增长的,解决办法如下:
a:设定一个全局分配 ID 生成器,解决数据插入时 ID 顺序不一致问题
b:手动指定 ID 号,不让其自动生成
更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2016-07/132923p2.htm
二、基于 MHA 实现 MySQL 的高可用
准备环境:CentOS 7
MHA Manager 节点 | IP:172.18.42.200 |
MHA Node Master 节点 | IP:172.18.42.201 |
MHA Node Slave1 节点 | IP:172.18.42.202 |
MHA Node Slave2 节点 | IP:172.18.42.203 |
前提:基于 MHA 实现 MySQL 高可用时,各节点之间需要基于 ssh 秘钥进行通信
[root@node0 ~]# ssh-keygen -t rsa -P ” ## 在 Manager 节点上基于 rsa 算法生成秘钥,密码为空
[root@node0 ~]# cat .shh/id_rsa.pub &>> .shh/authorized_keys ## 先要确认能与本地进行通信
[root@node0 ~]# chmod 600 .ssh/id_rsa .ssh/authorized_keys ## 更改秘钥权限
[root@node0 ~]# scp -p .ssh/id_rsa .ssh/authorized_keys root@172.18.42.201:/root/.ssh/ ##Manager 节点把秘钥、公钥发送给每个节点,使各个节点可以进行秘钥通信(第一此通信需要秘钥,后续不需要)
[root@node0 ~]# scp -p .ssh/id_rsa .ssh/authorized_keys root@172.18.42.202:/root/.ssh/
[root@node0 ~]# scp -p .ssh/id_rsa .ssh/authorized_keys root@172.18.42.203:/root/.ssh/
[root@node0 ~]# ssh 172.18.42.201 ‘ifconfig’ ## 可基于此命令让各个节点之间进行测试是否建立连接
Are you sure you want to continue connecting (yes/no)? yes ## 第一次建立连接需要认证
root@node1’s password:
1、部署 MHA Manager 节点
(1)安装 mha4mysql-manager、mha4mysql-node
[root@node0 ~]# yum install mha4mysql-node-0.56-0.el6.noarch.rpm mha4mysql-manager-0.56-0.el6.noarch.rpm -y
(2)创建配置文件,并编辑
[root@node0 ~]# vim /etc/masterha/app1.cnf
[server default]
user=wtc ## 能远程连接至各 mysql 节点的用户管理账号,需要 mysql 节点创建此用户
password=wtc
manager_workdir=/data/masterha/app1 ## 管理节点的工作目录
manager_log=/data/masterha/app1/manager.log ## 管理节点的日志文件路径
remote_workdir=/data/masterha/app1 ## 远程的每个 mysql 节点为 Manager 节点提供工作目录,会自动创建
ssh_user=root ## 以 root 用户远程管理,,基于秘钥认证无需密码;如果不基于密码,需要指明密码
repl_user=repluser ## 复制权限用户账号
repl_password=replpass
ping_interval=1 ## 每隔多长时间探测一次 Master 节点是否在线
[server1] ## 定义 mysql 节点
hostname=172.18.42.201
candidate_master=1 ## 当主节点宕机以后,这个节点是否可以成为新的主节点
##no_master=1 ## 当主节点宕机后,这个节点不会成为新的主节点
[server2]
hostname=172.18.42.202
candidate_master=1
[server3]
hostname=172.18.42.203
candidate_master=1
2、部署 Master 节点
(1)安装 mariadb-server、mha4mysql-node 服务
[root@node1 ~] yum install mariadb-server mha4mysql-node-0.56-0.el6.noarch.rpm -y
(2)编辑其配置文件
[root@node1 ~]# vim /etc/my.cnf
[mysqld]
innodb_file_per_table = ON
skip_name_resolve = ON
log_bin=mysql-bin
relay-log=relay-log
server-id=1
[root@node1 ~]# systemctl start mariadb.service
MariaDB [(none)]> show master status;
mysql-bin.000003 245
MariaDB [(none)]> grant replication slave,replication client on *.* to ‘repluser’@’172.18.%.%’ identified by ‘replpass’; ## 创建具有复制权限的用户
3、部署 Slave1
(1)安装 mariadb-server、mha4mysql-node 服务
[root@node2 ~] yum install mariadb-server mha4mysql-node-0.56-0.el6.noarch.rpm -y
(2)编辑其配置文件
[root@node2 ~]# vim /etc/my.cnf
[mysqld]
innodb_file_per_table = ON
skip_name_resolve = ON
log_bin=mysql-bin
relay-log=relay-log
server-id=2
read_only=1 ##MHA 通过这个来判断那个是 mysql 主服务器
relay_log_purge=0
[root@node2 ~]# systemctl start mariadb.service
MariaDB [(none)]> change master to master_host=’172.18.42.201′,master_user=’repluser’,master_password=’replpass’,master_log_file=’mysql-bin.000003′,master_log_pos=245; ## 连接至 Master 节点
MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
4、部署 Slave2
(1)安装 mariadb-server、mha4mysql-node 服务
[root@wxpp ~] yum install mariadb-server mha4mysql-node-0.56-0.el6.noarch.rpm -y
(2)编辑其配置文件
[root@wxpp ~]# vim /etc/my.cnf
innodb_file_per_table = ON
skip_name_resolve = ON
log_bin=mysql-bin
relay-log=relay-log
server-id=3
read_only=1
relay_log_purge=0
[root@wxpp ~]# systemctl start mariadb.service
MariaDB [(none)]> change master to master_host=’172.18.42.201′,master_user=’repluser’,master_password=’replpass’,master_log_file=’mysql-bin.000003′,master_log_pos=245; ## 连接至 Master 节点
MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
5、在 Master 节点创建管理用户账号,在 Manager 节点检测各检点之间的连接
MariaDB [(none)]> grant all on *.* to ‘wtc’@’172.18.%.%’ identified by ‘wtc’; ## 实现了主从复制,在 Msater 节点创建的同时,slave 节点也会创建
[root@node0 ~]# masterha_check_ssh –conf=/etc/masterha/app1.cnf ## 测试各节点之间 ssh 互相通信是否 ok
Wed Apr 20 10:17:40 2016 – [info] All SSH connection tests passed successfully.
[root@node0 ~]# masterha_check_repl –conf=/etc/masterha/app1.cnf ## 检查各个节点之间主从复制是否 ok
172.18.42.201(172.18.42.201:3306) (current master) ##201 是主节点,202、203 是从节点
+–172.18.42.202(172.18.42.202:3306)
+–172.18.42.203(172.18.42.203:3306)
MySQL Replication Health is OK.
6、启动 Manager 节点服务,把 Master 节点宕机,查看是否转换
[root@node0 ~]# masterha_manager –conf=/etc/masterha/app1.cnf ## 启动 Manager 服务
Wed Apr 20 10:27:35 2016 – [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Wed Apr 20 10:27:35 2016 – [info] Reading application default configuration from /etc/masterha/app1.cnf..
Wed Apr 20 10:27:35 2016 – [info] Reading server configuration from /etc/masterha/app1.cnf..
[root@node1 ~]# systemctl stop mariadb.service ## 关掉节点 2 的 mariadb 服务
MariaDB [(none)]> show slave status\G; ## 查看 Slave2 节点的复制线程状态
Master_Host: 172.18.42.202 ##Master 节点转为 Slave1 节点了
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
7、现在我们开启 Master 节点,看其是否成为从节点
[root@node1 ~]# systemctl start mariadb.service ## 开启 Master 节点的 mariadb 服务
MariaDB [(none)]> change master to master_host=’172.18.42.202′,master_user=’repluser’,master_password=’replpass’,master_log_file=’mysql-bin.000003′,master_log_pos=245;
## 此时“master_host”应该指向 Slave1 的 IP
## 使用的二进制日志文件、事件是事先备份好的(在实现主从复制之前,备份一份)
MariaDB [(none)]> start slave; ## 启动复制线程
MariaDB [(none)]> show slave status\G;
Master_Host: 172.18.42.202 ## 此时 IP 为 Slave1 的 IP
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
[root@node0 ~]# masterha_check_repl –conf=/etc/masterha/app1.cnf ## 在 Manager 节点上查看一次,主从复制是否 ok
172.18.42.202(172.18.42.202:3306) (current master) ## 此时,主节点成为了 Slave1
+–172.18.42.201(172.18.42.201:3306)
+–172.18.42.203(172.18.42.203:3306)
MySQL Replication Health is OK.
问题小结:
1、masterha_manager 运行时是工作于前台的,而且不能断开,一旦进行主从切换后,就停止工作,我们需要手动把它开启,这时需要脚本来实现自行监控
2、在使用 MHA 方法时,启动 Manager 节点的服务有可能会失败,可以尝试一下先把 Manager 节点的日志文件路径创建好 ”/data/masterha/app1″
3、在配置 mysql 各节点的配置文件时,主从都需要开启中继日志、二进制日志
主节点开启中继日志和二进制日志,是因为主节点宕机以后启用时会变为从节点
从节点需要开启中继日志和二进制日志,是因为主节点宕机以后,任何一个从节点都有可能转移称为主节点
本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-07/132923.htm
MHA:Master HA;是一款开源的 MySQL 的高可用程序,它为 MySQL 主从复制架构提供了 automating master failover 功能。MHA 在监控到 master 节点故障时,会将拥有最新数据的 slave 节点升为新的 master 节点,在此期间,MHA 会通过于 slave 节点获取额外信息来避免一致性方面的问题。MHA 还提供了 master 节点在线切换功能,即按需切换 master/slave 节点
MHA 服务有两种角色:管理节点(MHA Manager)和数据节点(MHA Node)
MHA Manager:通常单独部署在一台独立服务器上管理多个 master/slave 集群,每个 master/slave 集群称为一个 application
MHA Node:运行在每台 MySQL 服务器上(master/slave/manager),他通过监控具备解析和清理 logs 功能的脚本来加快故障转移
Galera Cluster
基于 wsrep 协议在全局实现复制,任何一节点都可实现读写操作,无延迟复制,不会产生数据丢失,当某台服务器宕机后,备用服务器会自动接管。
一、基于 Galera Cluster 实现 MySQL 高可用
准备环境:CentOS 7
节点 1 | IP:172.18.42.200 |
节点 2 | IP:172.18.42.201 |
节点 3 | IP:172.18.42.202 |
1、部署节点 1
(1)安装 Galera 服务
[root@node0 ~]# yum install MariaDB-Galera-server -y
(2)编辑其配置文件
[root@node0 ~]# rpm -ql galera ## 查看相关文件
/usr/lib64/galera/libgalera_smm.so
[root@node0 ~]# vim /etc/my.cnf.d/server.cnf
[galera]
# Mandatory settings ## 强制设置
wsrep_provider=/usr/lib64/galera/libgalera_smm.so ##wsrep 的提供者,一般是一个插件,不同的安装版本有可能不一样
wsrep_cluster_address=”gcomm://172.18.42.200, 172.18.42.201, 172.18.42.202″ ## 指明 Galera-Cluster 的各个节点
binlog_format=row ## 二进制日志格式,默认是 row 格式,不建议更改
default_storage_engine=InnoDB ## 指明使用的引擎
innodb_autoinc_lock_mode=2 ## 锁格式
bind-address=0.0.0.0 ##wsrep 在工作时监听的地址
wsrep_cluster_name=’mycluster’ ## 指明 Galera 集群的名称
(3)首次启动时,需要初始化集群
[root@node0 ~]# /etc/rc.d/init.d/mysql start –wsrep-new-cluster ## 在某一个节点上启动 mysql 服务
2、部署节点 2
(1)安装 MariaDB-Galera-server 服务
[root@node0 ~]# yum install MariaDB-Galera-server -y
(2)启动服务
[root@node2 ~]# service mysql start
Starting MySQL….SST in progress, setting sleep higher. SUCCESS!
3、部署节点 3
(1)安装 MariaDB-Galera-server 服务
[root@node0 ~]# yum install MariaDB-Galera-server -y
(2)启动服务
[root@node2 ~]# service mysql start
Starting MySQL….SST in progress, setting sleep higher. SUCCESS!
4、三个节点都连接 mysql 服务,随后创建一个数据库,查看其它两个节点是否复制
[root@node0 ~]# mysql ## 节点 1 连接 mysql 服务
MariaDB [(none)]> create database MaGeRepo; ## 在节点 1 上创建数据库“MaGeRepo”,并查看
MariaDB [(none)]> show databases;
+——————–+
| Database
+——————–+
| information_schema
| MaGeRepo
| mysql
| performance_schema
| test
+——————–+
[root@node1 ~]# mysql ## 节点 2 连接至 mysql 服务
MariaDB [(none)]> show databases; ## 查看数据库
+——————–+
| Database
+——————–+
| information_schema
| MaGeRepo
| mysql
| performance_schema
| test
+——————–+
[root@node2 ~]# mysql ## 节点 3 连接至 mysql 服务
MariaDB [(none)]> show databases; ## 查看数据库
+——————–+
| Database
+——————–+
| information_schema
| MaGeRepo
| mysql
| performance_schema
| test
+——————–+
## 数据库实现了同步
5、把节点 2 宕机,随后在数据库“MaGeRepo”中创建表“MaGe“;
MariaDB [MaGeRepo]> create table MaGe (ID int unsigned auto_increment not null primary key,Name char(10)); ## 在节点 1 上创建表“MaGe”
MariaDB [MaGeRepo]> insert into MaGe (Name) values (‘MaGe’),(‘Lweim’); ## 在节点 1 中插入数据“Lweim”、“MaGe”
MariaDB [MaGeRepo]> insert into MaGe (Name) values (‘Wtc’),(‘Wzx’); ## 在节点 3 中插入数据“Wtc”、“Wzx”
6、节点 2 开启 mysql 服务器,并查看其数据库
[root@node1 ~]# service mysql start ## 启动节点 2
Starting MySQL…..SST in progress, setting sleep higher. SUCCESS!
[root@node1 ~]# mysql ## 连接至 mysql 服务
MariaDB [MaGeRepo]> select * from MaGe; ## 查看表中的数据
+—-+——-+
| ID | Name
+—-+——-+
| 1 | MaGe
| 3 | Lweim
| 4 | Wtc
| 6 | Wzx
+—-+——-+
由此可见,当其中某一台服务器宕机后,即使数据发生改变,重新上线之后也可同步数据,但需要注意的是 ID 并不是按自动增长次序增长的,解决办法如下:
a:设定一个全局分配 ID 生成器,解决数据插入时 ID 顺序不一致问题
b:手动指定 ID 号,不让其自动生成
更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2016-07/132923p2.htm