对于想了解MySQL之——MySQLCluster集群搭建详解(基于RPM安装包双管理中心)的读者,本文将是一篇不可错过的文章,我们将详细介绍mysql集群搭建步骤,并且为您提供关于CentOS6.5
对于想了解MySQL之——MySQL Cluster集群搭建详解(基于RPM安装包 双管理中心)的读者,本文将是一篇不可错过的文章,我们将详细介绍mysql集群搭建步骤,并且为您提供关于CentOS6.5安装mysqlcluster7.3.7搭建mysql数据库集群环境(双管理中心)_MySQL、MySQL之 INSERT ... ON DUPLICATE KEY UPDATE、MySQL之 MHA 高可用集群部署、mysql之 MHA的binlog-server 创建的有价值信息。
本文目录一览:- MySQL之——MySQL Cluster集群搭建详解(基于RPM安装包 双管理中心)(mysql集群搭建步骤)
- CentOS6.5安装mysqlcluster7.3.7搭建mysql数据库集群环境(双管理中心)_MySQL
- MySQL之 INSERT ... ON DUPLICATE KEY UPDATE
- MySQL之 MHA 高可用集群部署
- mysql之 MHA的binlog-server 创建
MySQL之——MySQL Cluster集群搭建详解(基于RPM安装包 双管理中心)(mysql集群搭建步骤)
1、下载mysql-cluster 7.3.7
http://dev.mysql.com/downloads/cluster/
2、环境清理及安装
1)清理CentOS6.5自带的MySQL服务,其中第一个命令我不执行也可以,其他系统如果不可以,还是建议执行
# yum -y remove mysql # rpm -qa | grep mysql* # rpm -e --nodeps mysql-libs-5.1.71-1.el6.x86_64
2)环境准备
创建文件夹(分如下3个类来创建对应的文件夹)
存储节点:# mkdir /var/lib/mysql/data 管理节点:# mkdir /var/lib/mysql-cluster SQL节点:可不用 文件夹授权 进程DIR:# mkdir /var/run/mysqld 使用如下的命令来变更权限保证可写入: # chmod -R 1777 /var/lib/mysql # chmod -R 1777 /var/run/mysqld # chmod -R 1777 /var/lib/mysql-cluster
3)安装mysql-cluster
首先解压MySQL-Cluster-gpl-7.4.2-1.el6.x86_64.rpm-bundle.tar # tar xvf MySQL-Cluster-gpl-7.4.2-1.el6.x86_64.rpm-bundle.tar 然后执行如下命令安装 # rpm -ivh MySQL-Cluster-server-gpl-7.3.4-1.el6.x86_64.rpm # rpm -ivh MySQL-Cluster-client-gpl-7.3.4-1.el6.x86_64.rpm
特别注意,当安装完毕server gpl包后,将出现如下提示信息,提醒我们整个cluster安装后的初次超级账户密码存在/root/.mysql_secret这个文件当中。
--------------------------------------------------------------------------------------------------------------------- A RANDOM PASSWORD HAS BEEN SET FOR THE MySQL root USER ! You will find that password in '/root/.mysql_secret'. You must change that password on your first connect, no other statement but 'SET PASSWORD' will be accepted. See the manual for the semantics of the 'password expired' flag. Also, the account for the anonymous user has been removed. In addition, you can run: /usr/bin/mysql_secure_installation which will also give you the option of removing the test database. This is strongly recommended for production servers. -----------------------------------------------------------
3、配置管理节点
1)执行如下命令:
# cd /var/lib/mysql-cluster # vi config.ini
2)配置config.ini文件,如附件
100.218的配置文件:
config.ini
配置信息:
[computer] Id=mgr-server-01 HostName=192.168.100.218 [mgm default] datadir=/var/lib/mysql-cluster [mgm] HostName=192.168.100.218 NodeId=60 [mgm] HostName=192.168.100.217 NodeId=61 [ndbd default] NoOfReplicas = 2 DataMemory = 50M IndexMemory = 50M MaxNoOfTables = 1024 MaxNoOfAttributes = 5000000 MaxNoOfOrderedIndexes = 10000 [ndbd] HostName=192.168.100.217 DataDir=/var/lib/mysql NodeId=1 [ndbd] HostName=192.168.100.218 DataDir=/var/lib/mysql NodeId=2 [mysqld] HostName=192.168.100.217 NodeId=81 [mysqld] HostName=192.168.100.218 NodeId=82
100.217的配置文件
config.ini
[computer] Id=mgr-server-02 HostName=192.168.100.217 [mgm default] datadir=/var/lib/mysql-cluster [mgm] HostName=192.168.100.218 NodeId=60 [mgm] HostName=192.168.100.217 NodeId=61 [ndbd default] NoOfReplicas = 2 DataMemory = 50M IndexMemory = 50M MaxNoOfTables = 1024 MaxNoOfAttributes = 5000000 MaxNoOfOrderedIndexes = 10000 [ndbd] HostName=192.168.100.217 DataDir=/var/lib/mysql NodeId=1 [ndbd] HostName=192.168.100.218 DataDir=/var/lib/mysql NodeId=2 [mysqld] HostName=192.168.100.217 NodeId=81 [mysqld] HostName=192.168.100.218 NodeId=82
其实两个文件差别不大,就在于computer配置中的名称和标识id
4、SQL节点和数据节点的配置
修改my.cnf文件,添加如下内容:
[client] socket=/var/lib/mysql/mysql.sock [mysqld] max_connections=100 datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock ndbcluster ndb-connectstring=192.168.100.218,192.168.100.217 [mysqld_safe] log-error=/var/log/mysqld.log #pid-file=/var/run/mysqld/mysqld.pid pid-file=/var/lib/mysql/mysqld.pid [mysql_cluster] ndb-connectstring=192.168.100.218,192.168.100.217
5、MySQL Cluster初次启动命令以及用户密码更改调整:(请严格按照次序启动)
1)启动mysql-cluster
执行初次启动前请先确认 将两台机器的防火墙关闭(service iptables stop 或者 设定 防火墙端口可通,两个端口即通讯端口1186、数据端口3306 )
初次启动mgt console命令:ndb_mgmd -f /var/lib/mysql-cluster/config.ini (初始化需要加--initial)
启动均衡节点命令: ndbd --initial
启动数据节点命令: mysqld_safe --defaults-file=/usr/my.cnf --explicit_defaults_for_timestamp &
my.cnf在有些系统中是在etc目录下
注意在启动过程中需要监测整个控制台输出,发现有错误信息需要及时解决,根据错误日志内容来解决。
---------------------------------------------------------------------------------------------------------
如果一起正常,使用如下命令将Management console开启: ndb_mgm
执行# show
检查是否各个节点都已经完全启动,如下,每个节点都已经连接,如果有节点没连接,会看到
ndb_mgm> show Connected to Management Server at: 192.168.100.218:1186 Cluster Configuration --------------------- [ndbd(NDB)] 2 node(s) id=1 @192.168.100.217 (mysql-5.6.21 ndb-7.4.2, Nodegroup: 0) id=2 @192.168.100.218 (mysql-5.6.21 ndb-7.4.2, Nodegroup: 0, *) [ndb_mgmd(MGM)] 1 node(s) id=60 @192.168.100.218 (mysql-5.6.21 ndb-7.4.2) id=61 @192.168.100.217 (mysql-5.6.21 ndb-7.4.2) [mysqld(API)] 2 node(s) id=81 @192.168.100.217 (mysql-5.6.21 ndb-7.4.2) id=82 @192.168.100.218 (mysql-5.6.21 ndb-7.4.2)
如果有节点没连接,如下,id=81一行,表示没连接,检查问题故障点
ndb_mgm> show Cluster Configuration --------------------- [ndbd(NDB)] 2 node(s) id=1 @192.168.100.217 (mysql-5.6.21 ndb-7.4.2, Nodegroup: 0) id=2 @192.168.100.218 (mysql-5.6.21 ndb-7.4.2, Nodegroup: 0, *) [ndb_mgmd(MGM)] 1 node(s) id=60 @192.168.100.218 (mysql-5.6.21 ndb-7.4.2) id=61 @192.168.100.217 (mysql-5.6.21 ndb-7.4.2) [mysqld(API)] 2 node(s) id=81 (not connected, accepting connect from 192.168.100.217) id=82 @192.168.100.218 (mysql-5.6.21 ndb-7.4.2)
2)修改密码
当mysqld 启动完毕正常后(可以使用pgrep mysqld来获取进程ID),我们可以使用如下命令修改:
mysql -u root -p;
随机密码(具体请参见/root/.mysql_secret文件获取),进入后使用如下指令修改密码:
SET PASSWORD = PASSWORD(''新密码'');
但是这个新密码,必须是hash值,所以要使用如下方式获取密码字符串的hash值
select password(''111111'');
然而执行上面命令,会让你先设置密码,郁闷,又绕回来了,那就去其他地方的mysql上执行下吧
111111的hash值是“*FD571203974BA9AFE270FE62151AE967ECA5E0AA”
SET PASSWORD = PASSWORD(''*FD571203974BA9AFE270FE62151AE967ECA5E0AA'');
好郁闷啊,设置完以后,登陆还必须使用密文,那好吧,就用密文进去,进去后使用如下命令,强制使用明文进行登陆
use mysql; delete from user; grant all on *.* to root@'%' identified by "111111" with grant option; flush privileges; quit;
然后,可以使用明文密码登陆了 几台装有SQL数据节点的服务器皆需要执行一遍上述命令; 6、当上面步奏都操作完成以后,测试cluster是否正常工作 1)简单功能测试 在218上进入mysql后执行如下:
create database clustertest; use clustertest; CREATE TABLE testtable(Count INT) ENGINE=NDBCLUSTER;
注意:ENGINE=NDBCLUSTER; 引擎必须使用NDBCLUSTER才可以同步,否则不会进行同步
检查是否成功,在217上,进去mysql,查看是否自动创建了database和table,如果创建,则表示成功,如果失败,请检查环境配置
2)测试灾备情况下数据是否可以同步(一台数据库停掉了,再启动的时候,是否会将遗失的数据自动补充)
停掉217上的mysql服务,在218上执行
insert into testtable values (1);
启动217的mysql服务,使用show确认217的数据库节点已经连接上了,执行如下语句
select * from testtable;
如果发现有数据,则表示功能完备
7、关闭Cluster:(需要严格按照次序执行)
关闭数据节点:# mysqld stop (SQL节点可以用mysqladmin shutdown或别的方式关闭。)
在管理节点上执行:# ndb_mgm -e shutdown
将安全的关闭管理节点和数据节点。
关闭后使用如下的进程检测命令查看一下是否退出来了:
# pgrep mysqld # ps aux | grep nbdb
如果没有,找到对应的pid进行kill 操作即可
kill -9 进程号
8、再次启动Cluster方案:
启动整个cluster的次序,注意,一些语句已经减去了初始化的内容:
ndb_mgmd -f /var/lib/mysql-cluster/config.ini ndbd mysqld_safe --defaults-file=/usr/my.cnf --explicit_defaults_for_timestamp &
备注:
1、mysql安装后,默认会自动启动的,每次启动cluster的时候,都需要先把mysql的服务关闭,太麻烦,于是可以执行如下命令(我出手有点狠):
chkconfig --level 123456 mysql off
2、防火墙问题,偷个懒,我懒得去一一开放端口,干脆把防火墙直接关了(极不推荐的做法)
chkconfig --level 123456 iptables off
参考相关文档:
MySQL Cluster config.ini文件配置详解:
http://note.youdao.com/share/?id=376407a1136d2032afb6ef68aa39fba5&type=note
http://note.youdao.com/share/?id=3906996cbe3298a22fbb5a2196d6cbed&type=note
MySQL Cluster 备份与恢复 http://www.linuxidc.com/Linux/2013-06/85295.htm
MySQL Cluster安装配置 http://www.linuxidc.com/Linux/2013-07/87705.htm
MySQL Cluster 3台机器搭建集群环境 DOC http://www.linuxidc.com/Linux/2013-01/78249.htm
MySQL Cluster7.2在线增加数据节点存在重大弊端 http://www.linuxidc.com/Linux/2012-08/67605.htm
搭建MySQL-Cluster集群架构 http://www.linuxidc.com/Linux/2014-05/102218.htm
以上就是 MySQL之——MySQL Cluster集群搭建详解(基于RPM安装包 双管理中心)的内容。
CentOS6.5安装mysqlcluster7.3.7搭建mysql数据库集群环境(双管理中心)_MySQL
MySQL Cluster 是一种技术,该技术允许在无共享的系统中部署“内存中”数据库的 Cluster 。通过无共享体系结构,系统能够使用廉价的硬件,而且对软硬件无特殊要求。此外,由于每个组件有自己的内存和磁盘,不存在单点故障。 MySQL Cluster 由一组计算机构成,每台计算机上均运行着多种进程,包括MySQL服务器,NDB Cluster 的数据节点,管理服务器,以及(可能)专门的数据访问程序。
下文中没有特别指出的地方,都是两台服务器都需要执行的命令,并且由于是双管理中心配置,其实两台机器出了一些标识id和ip的配置不同外,其他参数配置都是基本一样的
1、下载mysql-cluster 7.3.7
http://dev.mysql.com/downloads/cluster/
2、环境清理及安装 1)清理CentOS6.5自带的mysql服务,其中第一个命令我不执行也可以,其他系统如果不可以,还是建议执行
# yum -y remove mysql # rpm -qa | grep mysql* # rpm -e --nodeps mysql-libs-5.1.71-1.el6.x86_64
2)环境准备
创建文件夹(分如下3个类来创建对应的文件夹)
存储节点:# mkdir /var/lib/mysql/data
管理节点:# mkdir /var/lib/mysql-cluster SQL节点:可不用 文件夹授权
进程DIR:# mkdir /var/run/mysqld
使用如下的命令来变更权限保证可写入:
# chmod -R 1777 /var/lib/mysql
# chmod -R 1777 /var/run/mysqld
# chmod -R 1777 /var/lib/mysql-cluster
3)安装mysql-cluster
首先解压MySQL-Cluster-gpl-7.4.2-1.el6.x86_64.rpm-bundle.tar
# tar xvf MySQL-Cluster-gpl-7.4.2-1.el6.x86_64.rpm-bundle.tar
然后执行如下命令安装
# rpm -ivh MySQL-Cluster-server-gpl-7.3.4-1.el6.x86_64.rpm
# rpm -ivh MySQL-Cluster-client-gpl-7.3.4-1.el6.x86_64.rpm
特别注意,当安装完毕server gpl包后,将出现如下提示信息,提醒我们整个cluster安装后的初次超级账户密码存在/root/.mysql_secret这个文件当中。
---------------------------------------------------------------------------------------------------------------------
A RANDOM PASSWORD HAS BEEN SET FOR THE MySQL root USER !
You will find that password in ''/root/.mysql_secret''.
You must change that password on your first connect,
no other statement but ''SET PASSWORD'' will be accepted.
See the manual for the semantics of the ''password expired'' flag.
Also, the account for the anonymous user has been removed.
In addition, you can run:
/usr/bin/mysql_secure_installation
which will also give you the option of removing the test database.
This is strongly recommended for production servers.
-----------------------------------------------------------
2、配置管理节点
1)执行如下命令:
# cd /var/lib/mysql-cluster
# vi config.ini
2)配置config.ini文件,如附件100.218的配置文件:[computer]
Id=mgr-server-01
HostName=192.168.100.218
[mgm default]
datadir=/var/lib/mysql-cluster
[mgm]
HostName=192.168.100.218
NodeId=60
ExecuteOnComputer=mgr-server-01
PortNumber=1186
ArbitrationRank=2
[mgm]
HostName=192.168.100.217
NodeId=61
ExecuteOnComputer=mgr-server-01
PortNumber=1186
ArbitrationRank=2
[ndbd default]
NoOfReplicas=2
DataMemory=500M
IndexMemory=500M
[ndbd]
HostName=192.168.100.217
DataDir=/var/lib/mysql
NodeId=1
[ndbd]
HostName=192.168.100.218
DataDir=/var/lib/mysql
NodeId=2
[mysqld]
HostName=192.168.100.217
NodeId=81
[mysqld]
HostName=192.168.100.218
NodeId=82
100.217的配置文件:[computer]
Id=mgr-server-02
HostName=192.168.100.217
[mgm default]
datadir=/var/lib/mysql-cluster
[mgm]
HostName=192.168.100.218
NodeId=60
ExecuteOnComputer=mgr-server-01
PortNumber=1186
ArbitrationRank=2
[mgm]
HostName=192.168.100.217
NodeId=61
ExecuteOnComputer=mgr-server-01
PortNumber=1186
ArbitrationRank=2
[ndbd default]
NoOfReplicas=2
DataMemory=500M
IndexMemory=500M
[ndbd]
HostName=192.168.100.217
DataDir=/var/lib/mysql
NodeId=1
[ndbd]
HostName=192.168.100.218
DataDir=/var/lib/mysql
NodeId=2
[mysqld]
HostName=192.168.100.217
NodeId=81
[mysqld]
HostName=192.168.100.218
NodeId=82
其实两个文件差别不大,就在于computer配置中的名称和标识id
3、SQL节点和数据节点的配置
修改my.cnf文件,添加如下内容: [client] socket=/var/lib/mysql/mysql.sock [mysqld] max_connections=100 datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock ndbcluster ndb-connectstring=192.168.100.218,192.168.100.217 [mysqld_safe] log-error=/var/log/mysqld.log #pid-file=/var/run/mysqld/mysqld.pid pid-file=/var/lib/mysql/mysqld.pid
[mysql_cluster] ndb-connectstring=192.168.100.218,192.168.100.217
4、MySQL Cluster初次启动命令以及用户密码更改调整:(请严格按照次序启动)
1)启动mysql-cluster
执行初次启动前请先确认 将两台机器的防火墙关闭(service iptables stop 或者 设定 防火墙端口可通,两个端口即通讯端口1186、数据端口3306 )
初次启动mgt console命令:ndb_mgmd -f /var/lib/mysql-cluster/config.ini
启动均衡节点命令: ndbd --initial
启动数据节点命令: mysqld_safe --defaults-file=/usr/my.cnf --explicit_defaults_for_timestamp &
my.cnf在有些系统中是在etc目录下
注意在启动过程中需要监测整个控制台输出,发现有错误信息需要及时解决,根据错误日志内容来解决。
---------------------------------------------------------------------------------------------------------
如果一起正常,使用如下命令将Management console开启: ndb_mgm
执行# show
检查是否各个节点都已经完全启动,如下,每个节点都已经连接,如果有节点没连接,会看到
ndb_mgm> showConnected to Management Server at: 192.168.100.218:1186Cluster Configuration---------------------[ndbd(NDB)] 2 node(s)id=1 @192.168.100.217 (mysql-5.6.21 ndb-7.4.2, Nodegroup: 0)id=2 @192.168.100.218 (mysql-5.6.21 ndb-7.4.2, Nodegroup: 0, *)[ndb_mgmd(MGM)] 1 node(s)id=60 @192.168.100.218 (mysql-5.6.21 ndb-7.4.2)id=61 @192.168.100.217 (mysql-5.6.21 ndb-7.4.2)[mysqld(API)] 2 node(s)id=81 @192.168.100.217 (mysql-5.6.21 ndb-7.4.2)id=82 @192.168.100.218 (mysql-5.6.21 ndb-7.4.2)
如果有节点没连接,如下,id=81一行,表示没连接,检查问题故障点
ndb_mgm> showCluster Configuration---------------------[ndbd(NDB)] 2 node(s)id=1 @192.168.100.217 (mysql-5.6.21 ndb-7.4.2, Nodegroup: 0)id=2 @192.168.100.218 (mysql-5.6.21 ndb-7.4.2, Nodegroup: 0, *)[ndb_mgmd(MGM)] 1 node(s)id=60 @192.168.100.218 (mysql-5.6.21 ndb-7.4.2)id=61 @192.168.100.217 (mysql-5.6.21 ndb-7.4.2)[mysqld(API)] 2 node(s)id=81 (not connected, accepting connect from 192.168.100.217)id=82 @192.168.100.218 (mysql-5.6.21 ndb-7.4.2)
2)修改密码
当mysqld 启动完毕正常后(可以使用pgrep mysqld来获取进程ID),我们可以使用如下命令修改:
mysql -u root -p;
随机密码(具体请参见/root/.mysql_secret文件获取),进入后使用如下指令修改密码:
SET PASSWORD = PASSWORD(''新密码'');
但是这个新密码,必须是hash值,所以要使用如下方式获取密码字符串的hash值
select password(''111111'');
然而执行上面命令,会让你先设置密码,郁闷,又绕回来了,那就去其他地方的mysql上执行下吧 111111的hash值是“*FD571203974BA9AFE270FE62151AE967ECA5E0AA” SET PASSWORD = PASSWORD(''*FD571203974BA9AFE270FE62151AE967ECA5E0AA''); 好郁闷啊,设置完以后,登陆还必须使用密文,那好吧,就用密文进去,进去后使用如下命令,强制使用明文进行登陆 use mysql; delete from user; grant all on *.* to root@''%'' identified by "111111" with grant option; flush privileges; quit; 然后,可以使用明文密码登陆了
几台装有SQL数据节点的服务器皆需要执行一遍上述命令;
5、当上面步奏都操作完成以后,测试cluster是否正常工作
1)简单功能测试
在218上进入mysql后执行如下:
create database clustertest;
use clustertest;
CREATE TABLE testtable(Count INT) ENGINE=NDBCLUSTER; 注意:ENGINE=NDBCLUSTER; 引擎必须使用NDBCLUSTER才可以同步,否则不会进行同步
检查是否成功,在217上,进去mysql,查看是否自动创建了database和table,如果创建,则表示成功,如果失败,请检查环境配置
2)测试灾备情况下数据是否可以同步(一台数据库停掉了,再启动的时候,是否会将遗失的数据自动补充)
停掉217上的mysql服务,在218上执行
insert into testtable values (1);
启动217的mysql服务,使用show确认217的数据库节点已经连接上了,执行如下语句
select * from testtable;
如果发现有数据,则表示功能完备
6、关闭Cluster:(需要严格按照次序执行)
关闭数据节点:# mysqld stop (SQL节点可以用mysqladmin shutdown或别的方式关闭。)
在管理节点上执行:# ndb_mgm -e shutdown
将安全的关闭管理节点和数据节点。
关闭后使用如下的进程检测命令查看一下是否退出来了:
# pgrep mysqld
# ps aux | grep nbdb
如果没有,找到对应的pid进行kill 操作即可
kill -9 进程号
7、再次启动Cluster方案:
启动整个cluster的次序,注意,一些语句已经减去了初始化的内容:
ndb_mgmd -f /var/lib/mysql-cluster/config.inindbd
mysqld_safe --defaults-file=/etc/my.cnf --explicit_defaults_for_timestamp &
备注: 1、mysql安装后,默认会自动启动的,每次启动cluster的时候,都需要先把mysql的服务关闭,太麻烦,于是可以执行如下命令(我出手有点狠):
chkconfig --level 123456 mysql off
2、防火墙问题,偷个懒,我懒得去一一开放端口,干脆把防火墙直接关了(极不推荐的做法)
chkconfig --level 123456 iptables off
MySQL之 INSERT ... ON DUPLICATE KEY UPDATE
一、insert or update需求
需求:如果test_table中存在记录则update,不存在则insert。
二、老做法:3条sql
select * from test_table where id = 1; //查询表中是否已有记录
insert into test_table (id,name) values(1,''may''); //记录不存在,执行insert
update test_table set name = ''may'' where id = 1; //记录存在,执行update
先查询一次,判断记录是否存在;如果不存在,则插入记录;如果存在,则更新记录。在数据量不大的情况下,不存在效率问题,可用。
但是,数据量一旦很大,效率则会很低,且会出现数据并发的问题,例如:数据重复,甚至跑到内存溢出。等等。而使用 “on duplicate key update"在数据量大的情况下,效率明显高很多。只有一个sql,直接在数据库层做处理,少了很多在业务层的判断。
三、使用 on duplicate key update:1条sql
使用 on duplicate key update,1条sql可以搞定上面3条sql所做的事情,且效率更高。
insert into test_table (id,name) values(1,''may'')
on duplicate key update name = values(name);
【前提:on duplicate key update 的使用必须有一个 唯一索引 或者 主键】
MySQL之 MHA 高可用集群部署
目录
- 前言
- 一、MHA 介绍
- 1.1 MHA 的组成
- 1.2 MHA 的特点
- 二、 搭建 MySQL 高可用(MHA)
- 2.1 修改几台mysql节点的主机名
- 2.2 修改几台MySQL服务器的主配置文件/etc/my.cnf
- 2.3 配置 MySQL一主两从(主从复制)
- 2.4 安装 MHA 软件
- 2.5 在所有服务器上配置无密码认证
- 2.6 在 manager 节点上配置 MHA
- 2.7 第一次配置需要在 Master 节点上手动开启虚拟IP
- 2.8 在 manager 节点上检查测试 ssh 无密码认证
- 2.9 在 manager 节点上测试 mysql 主从连接情况
- 2.10 在 manager 节点上启动 MHA
- 2.11 查看相关状态
- 总结
前言
- MysqL 的主从复制和读写分离,只能实现读写同时进行时产生的锁表问题,如果主服务器发生故障,则会出现单点故障。
解决MysqL 单点故障可以用 Keepalived、MHA、3M等技术。
一、MHA 介绍
- MHA(MasterHigh Availability)是一套优秀的MysqL高可用环境下 故障切换 和 主从复制 的软件。
- MHA 是在主从复制前提上搭建的
- MHA 的出现就是解决 MysqL 单点故障的问题。
- MysqL故障切换过程中,MHA能做到 0-30秒内 自动完成故障切换操作。
- MHA能在故障切换的过程中最大程度上 保证数据的一致性,以达到真正意义上的高可用。
1.1 MHA 的组成
MHA Node(数据节点)
- 在每台 MysqL 服务器上都部署运行 MHA Node。
MHA Manager(管理节点)
- MHA Manager 可以单独部署在一台独立的机器上,管理多个 master-slave 集群;也可以部署在一台 slave 节点上;
- MHA Manager 会【定时探测】集群中的 master 节点。当 master 出现故障时,它可以自动将具有最新数据的 slave 提升为新的 master, 然后将所有其他的 slave 重新指向新的 master(主从复制的对接)。整个故障转移过程对应用程序完全透明(应用程序感觉不到);
- 即:找一台机器部署运行 MHA Manager
1.2 MHA 的特点
- 在自动故障切换过程中,MHA试图 从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失;
- 使用半同步复制,可以大大降低数据丢失的风险,如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性;
- 目前MHA支持一主多从架构,最少三台服务,即一主两从、或一主三从等;
二、 搭建 MysqL 高可用(MHA)
实验思路:
MHA架构搭建:
1)数据库安装
2)一主两从
3)MHA搭建
故障模拟:
1)Master主库失效
2)备选主库成为主库
3)原故障主库恢复重新加入到MHA成为从库
7-7 manager
7-8 master
7-3 slave1
7-4 slave2
环境准备:
需要用到的MHA软件包:
mha4MysqL-manager-0.57.tar.gz
mha4MysqL-node-0.57.tar.gz
主机 | 操作系统 | IP地址 | 所需软件服务 |
---|---|---|---|
MHA manager | CentOS7 | 192.168.10.10 | MHA manager、 MHA node 组件 |
Master 节点服务器 | CentOS7 | 192.168.10.101 | MysqL5.7、MHA node 组件 |
Slave1(主/备) 节点服务器 | CentOS7 | 192.168.10.40 | MysqL5.7、MHA node 组件 |
Slave2 节点服务器 | CentOS7 | 192.168.10.50 | MysqL5.7、MHA node 组件 |
manager 定时探测Master 是否故障,故障了 manager 就把Slave1作为Master ,Slave2 再认定新的Master 。
首先关闭防火墙和安全功能
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
Master、Slave1、Slave2 都安装 MysqL 5.7。
2.1 修改几台MysqL节点的主机名
hostnamectl set-hostname MysqL1 # Master 服务器
hostnamectl set-hostname MysqL2 # Slave1 服务器
hostnamectl set-hostname MysqL3 # Slave2 服务器
2.2 修改几台MysqL服务器的主配置文件/etc/my.cnf
修改配置文件/etc/my.cnf,并创建命令软链接。
主从服务器都要开启二进制日志,因为从服务器也能称为主服务器。
Master
vim /etc/my.cnf
[MysqLd]
server-id = 1 #保证 MysqL 在集群内是唯一的
log_bin = master-bin
log-slave-updates = true #允许从服务器进行同步
保存退出
systemctl restart MysqLd
ln -s /usr/local/MysqL/bin/MysqL /usr/sbin/
ln -s /usr/local/MysqL/bin/MysqLbinlog /usr/sbin/
Slave1、Slave2 修改
vim /etc/my.cnf
server-id = 2 #MysqL2改为2
#server-id = 3 MysqL3服务器server-id 改成 3,三台服务器 server-id 不能一样
log_bin = master-bin
relay-log = relay-log-bin #开启中继日志
relay-log-index = slave-relay-bin.index #设置中继日志名称、位置
systemctl restart MysqLd
ln -s /usr/local/MysqL/bin/MysqL /usr/sbin/
ln -s /usr/local/MysqL/bin/MysqLbinlog /usr/sbin/
2.3 配置 MysqL一主两从(主从复制)
(1)所有MysqL服务器进行MysqL授权
为了实现主从复制
三台MysqL服务器都需要执行下面的命令
MysqL -uroot -pabc123
#主服务器中进行配置,授权给从服务器用
#因为从都有可能成为主,所以三台MysqL服务器都需要执行下面的命令
grant replication slave on *.* to 'myslave'@'192.168.10.%' identified by 'abc123';
#manager 用,三台MysqL服务器都需要执行下面的命令
grant all privileges on *.* to 'mha'@'192.168.10.%' identified by 'manager';
#三台MysqL服务器用主机名再授权一遍,防止从数据库通过主机名连接不上主服务器数据库
grant all privileges on *.* to 'mha'@'MysqL1' identified by 'manager';
flush privileges;
grant all privileges on *.* to 'mha'@'MysqL2' identified by 'manager';
flush privileges;
grant all privileges on *.* to 'mha'@'MysqL3' identified by 'manager';
flush privileges; #刷新权限
(2)在Master节点查看二进制文件和同步点
Master 主服务器 执行
show master status;
#每个人的二进制文件名或者偏移量都可能不一样,记住自己的
(3)在 Slave1、Slave2 节点执行同步操作
两台从服务器都需要执行一遍
change master to master_host='192.168.10.101',master_user='myslave',master_password='abc123',master_log_file='master-bin.000001',master_log_pos=1747;
#【master-bin.000001 和 偏移量 1747 都是上面主服务器 show master status; 查出来的结果 ,master_host 是主服务器地址】
start slave; #开启服务
show slave status\G
查看结果:
Slave_IO_Running: Yes
Slave_sql_Running: Yes
#一般 Slave_IO_Running: No 的可能性:
#网络不通
#my.cnf配置有问题
#密码、file文件名、pos偏移量不对
#防火墙没有关闭
(4)Slave1、Slave2 节点设置为只读模式
两台从服务器都需要执行一遍
set global read_only=1;
#改回读写状态set global read_only=0;
(5)主从复制验证
在 Master 主服务器 创建一个库、创建一个表,插入几条记录。
在两台从服务器上应该都能看到主创建的数据了。主从复制就完成了。
2.4 安装 MHA 软件
(1)所有服务器上都安装 MHA 依赖的环境
- 首先安装 epel 源,需要在线源安装(不能使用本地yum源)
- 然后在所有服务器上安装 node 组件
# Master 主服务器 安装在线源
mv /etc/yum.repos.d/repos.bak/CentOS-* /etc/yum.repos.d/
yum list
yum install epel-release --nogpgcheck -y
yum install -y perl-dbd-mysql \
perl-Config-Tiny \
perl-Log-dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN
(2)所有服务器上都安装 MHA node 软件包
- 对于每个操作系统版本不一样,这里 CentOS7.4 必须选择 0.57 版本。
- 在所有服务器上必须先安装 node 组件,最后在 MHA-manager 节点上安装 manager 组件,因为 manager 依赖 node 组件。
#将软件包mha4MysqL-node-0.57.tar.gz放入/opt目录下
cd /opt
tar zxvf mha4MysqL-node-0.57.tar.gz
cd mha4MysqL-node-0.57
perl Makefile.PL
make && make install
(3)在 MHA manager 节点上安装 manager 组件
#将软件包mha4MysqL-manager-0.57.tar.gz放入/opt目录下
cd /opt
tar zxvf mha4MysqL-manager-0.57.tar.gz
cd mha4MysqL-manager-0.57
perl Makefile.PL
make && make install
manager 组件安装后在 /usr/local/bin 下面会生成几个工具:
2.5 在所有服务器上配置无密码认证
- 通过使用密钥对实现无密码认证。
(1)在 manager 节点上配置到所有数据库节点的无密码认证
对所有MysqL 做无密码认证
ssh-keygen -t rsa #一路按回车键
ssh-copy-id 192.168.163.11
ssh-copy-id 192.168.163.12
ssh-copy-id 192.168.163.13
MysqL 与 MysqL 之间做无密码认证即可。
2.6 在 manager 节点上配置 MHA
(1)在 manager 节点上复制相关脚本到 /usr/local/bin 目录
cp -rp /opt/mha4MysqL-manager-0.57/samples/scripts /usr/local/bin
#复制后会有四个执行文件
ll /usr/local/bin/scripts/
文件名 | 作用 |
---|---|
master_ip_failover | 自动切换时 VIP 管理的脚本 |
master_ip_online_change | 在线切换时 vip 的管理 |
power_manager | 故障发生后关闭主机的脚本 |
send_report | 因故障切换后发送报警的脚本 |
(2)复制上述的自动切换时 VIP 管理的脚本到 /usr/local/bin 目录
- 这里使用 master_ip_failover 脚本来管理 VIP 和 故障切换
cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin
#先清空原有内容
echo '' > /usr/local/bin/master_ip_failover
#直接复制并修改vip相关参数
vim /usr/local/bin/master_ip_failover
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
use Getopt::Long;
my (
$command, $ssh_user, $orig_master_host, $orig_master_ip,
$orig_master_port, $new_master_host, $new_master_ip, $new_master_port
);
#############################添加内容部分#########################################
my $vip = '192.168.163.200'; #指定vip的地址
my $brdc = '192.168.163.255'; #指定vip的广播地址
my $ifdev = 'ens33'; #指定vip绑定的网卡
my $key = '1'; #指定vip绑定的虚拟网卡序列号
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip"; #代表此变量值为ifconfig ens33:1 192.168.163.200
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down"; #代表此变量值为ifconfig ens33:1 down
my $exit_code = 0; #指定退出状态码为0
#my $ssh_start_vip = "/usr/sbin/ip addr add $vip/24 brd $brdc dev $ifdev label $ifdev:$key;/usr/sbin/arping -q -A -c 1 -I $ifdev $vip;iptables -F;";
#my $ssh_stop_vip = "/usr/sbin/ip addr del $vip/24 dev $ifdev label $ifdev:$key";
##################################################################################
Getoptions(
'command=s' => \$command,
'ssh_user=s' => \$ssh_user,
'orig_master_host=s' => \$orig_master_host,
'orig_master_ip=s' => \$orig_master_ip,
'orig_master_port=i' => \$orig_master_port,
'new_master_host=s' => \$new_master_host,
'new_master_ip=s' => \$new_master_ip,
'new_master_port=i' => \$new_master_port,
);
exit &main();
sub main {
print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";
if ( $command eq "stop" || $command eq "stopssh" ) {
my $exit_code = 1;
eval {
print "disabling the VIP on old master: $orig_master_host \n";
&stop_vip();
$exit_code = 0;
};
if ($@) {
warn "Got Error: $@\n";
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "start" ) {
my $exit_code = 10;
eval {
print "Enabling the VIP - $vip on the new master - $new_master_host \n";
&start_vip();
$exit_code = 0;
};
if ($@) {
warn $@;
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "status" ) {
print "Checking the Status of the script.. OK \n";
exit 0;
}
else {
&usage();
exit 1;
}
}
sub start_vip() {
`ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
## A simple system call that disable the VIP on the old_master
sub stop_vip() {
`ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}
sub usage {
print
"Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";
}
(3)创建 MHA 软件目录并拷贝配置文件,这里使用app1.cnf配置文件来管理 MysqL 节点服务器
mkdir /etc/masterha
cp /opt/mha4MysqL-manager-0.57/samples/conf/app1.cnf /etc/masterha #新创建个/etc/masterha目录
vim /etc/masterha/app1.cnf
[server default]
manager_log=/var/log/masterha/app1/manager.log
manager_workdir=/var/log/masterha/app1
master_binlog_dir=/usr/local/MysqL/data
master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
user=mha
password=manager
ping_interval=1
remote_workdir=/tmp
repl_user=myslave
repl_password=123456
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.163.12 -s 192.168.163.13
shutdown_script=""
ssh_user=root
[server1]
hostname=192.168.163.11
port=3306
[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.163.12
port=3306
[server3]
hostname=192.168.163.13
port=3306
#--------------------------配置文件解释--------------------------------------------------------------------------
[server default]
manager_log=/var/log/masterha/app1/manager.log #manager日志
manager_workdir=/var/log/masterha/app1.log #manager工作目录
master_binlog_dir=/usr/local/MysqL/data/ #master保存binlog的位置,这里的路径要与master里配置的binlog的路径一致,以便MHA能找到
master_ip_failover_script=/usr/local/bin/master_ip_failover #设置自动failover时候的切换脚本,也就是上面的那个脚本
master_ip_online_change_script=/usr/local/bin/master_ip_online_change #设置手动切换时候的切换脚本
user=mha #设置监控用户root
password=manager #设置MysqL中root用户的密码,这个密码是前文中创建监控用户的那个密码
ping_interval=1 #设置监控主库,发送ping包的时间间隔1秒,默认是3秒,尝试三次没有回应的时候自动进行failover
remote_workdir=/tmp #设置远端MysqL在发生切换时binlog的保存位置
repl_user=myslave #设置复制用户的用户
repl_password=123456 #设置复制用户的密码
report_script=/usr/local/send_report #设置发生切换后发送的报警的脚本
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.163.12 -s 192.168.163.13 #指定检查的从服务器IP地址
shutdown_script="" #设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机防止发生脑裂,这里没有使用)
ssh_user=root #设置ssh的登录用户名
[server1]
hostname=192.168.163.11
port=3306
[server2]
hostname=192.168.163.12
port=3306
candidate_master=1
#设置为候选master,设置该参数以后,发生主从切换以后将会将此从库提升为主库,即使这个主库不是集群中最新的slave
check_repl_delay=0
#默认情况下如果一个slave落后master 超过100M的relay logs的话,MHA将不会选择该slave作为一个新的master, 因为对于这个slave的恢复需要花费很长时间;通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master
[server3]
hostname=192.168.163.13
port=3306
2.7 第一次配置需要在 Master 节点上手动开启虚拟IP
Master
/sbin/ifconfig ens33:1 192.168.163.200/24
2.8 在 manager 节点上检查测试 ssh 无密码认证
MHAManager
masterha_check_ssh -conf=/etc/masterha/app1.cnf
#如果正常最后会输出 successfully;
#如果失败可以去配置服务器无密码认证的地方看看有没有问题
2.9 在 manager 节点上测试 MysqL 主从连接情况
MHAManager
masterha_check_repl -conf=/etc/masterha/app1.cnf
#最后出现 MysqL Replication Health is OK 字样说明正常;
#出现MysqL Replication Health is NOT OK!的,可以去看一下MysqL服务器上的软链接是否少创建-->本文位置:2、修改三台MysqL服务器的主配置文件/etc/my.cnf,并创建命令软链接
2.10 在 manager 节点上启动 MHA
nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &
#------------------------组件解释--------------
--remove_dead_master_conf:该参数代表当发生主从切换后,老的主库的 ip 将会从配置文件中移除。
--manger_log:日志存放位置。
--ignore_last_failover:在缺省情况下,如果 MHA 检测到连续发生宕机,且两次宕机间隔不足 8 小时的话,则不会进行 Failover, 之所以这样限制是为了避免 ping-pong 效应。该参数代表忽略上次 MHA 触发切换产生的文件,默认情况下,MHA 发生切换后会在日志记目录,也就是上面设置的日志app1.failover.complete文件,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非在第一次切换后收到删除该文件,为了方便,这里设置为--ignore_last_failover。
2.11 查看相关状态
查看 MHA 状态,可以看到当前的 master 是 MysqL1 节点。
masterha_check_status --conf=/etc/masterha/app1.cnf
查看 MHA 日志,也以看到当前的 master 是 192.168.163.40
cat /var/log/masterha/app1/manager.log | grep "current master"
补充:若要关闭 manager 服务,可以使用如下命令。
masterha_stop --conf=/etc/masterha/app1.cnf
或者可以直接采用 kill 进程 ID 的方式关闭。
总结
1.先有主从同步集群,最少一主二从
2.MHA的配置:核心两个组件:Manager、node
现在每台机器上都部署 node 节点,
只在MHA服务器上部署Manager
master——ip_for 虚拟IP飘逸地址
MHA 需要四台服务器,一台 manager 做配置文件,一主两从(三台)做主从复制,在主上面启动一个虚拟网卡,当主挂了虚拟IP 就会飘到新的主, 主挂掉了,找台数据最新的从作为主,其他Slave主机的主服务器指向该台机器,
mysql之 MHA的binlog-server 创建
以下命令是基于mysql的 MHA高可用之后的配置的!!!!
1. 修改MHA配置
[root@mysql-db03 ~]# vim /etc/mha/app1.cnf
[binlog1]
no_master=1
hostname=10.0.0.53
master_binlog_dir=/data/mysql/binlog/
2. 备份binlong
#创建备份binlog目录
[root@mysql-db03 ~]# mkdir -p /data/mysql/binlog/
#进入该目录
[root@mysql-db03 ~]# cd /data/mysql/binlog/
#备份binlog
[root@mysql-db03 binlog]# mysqlbinlog -R --host=10.0.0.50 --user=mha --password=mha --raw --stop-never mysql-bin.000009 &
#启动mha
[root@mysql-db03 binlog]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &
3. 测试binlog
#查看binlog目录中的binlog
[root@mysql-db03 binlog]# ll
total 44
-rw-r--r-- 1 root root 285 Mar 8 03:11 mysql-bin.000001
#登录主库
[root@mysql-db01 ~]# mysql -uroot -poldboy123
#刷新binlog
mysql> flush logs;
#再次查看binlog目录
[root@mysql-db03 binlog]# ll
total 48
-rw-r--r-- 1 root root 285 Mar 8 03:11 mysql-bin.000001
-rw-r--r-- 1 root root 143 Mar 8 04:00 mysql-bin.000002
#######能看到从库的binlog目录下多了一个文件说明测试成功
今天的关于MySQL之——MySQL Cluster集群搭建详解(基于RPM安装包 双管理中心)和mysql集群搭建步骤的分享已经结束,谢谢您的关注,如果想了解更多关于CentOS6.5安装mysqlcluster7.3.7搭建mysql数据库集群环境(双管理中心)_MySQL、MySQL之 INSERT ... ON DUPLICATE KEY UPDATE、MySQL之 MHA 高可用集群部署、mysql之 MHA的binlog-server 创建的相关知识,请在本站进行查询。
本文标签: