MySql NDB Cluster + HaProxy 安装部署
简介
MySQL Cluster是一个基于NDB Cluster存储引擎的完整的分布式数据库系统。不仅仅具有高可用性,而且可以自动切分数据,冗余数据等高级功能。和Oracle Real Cluster Application不太一样的是,MySQL Cluster 是一个Share Nothing的架构,各个MySQL Server之间并不共享任何数据,高度可扩展以及高度可用方面的突出表现是其最大的特色。
简单的说,MySQL Cluster 实际上是在无共享存储设备的情况下实现的一种完全分布式数据库系统,其主要通过 NDB Cluster(简称 NDB)存储引擎来实现。
NDB Cluster 是一种技术,该技术允许在无共享的系统中部署“内存中”数据库的 Cluster 。通过无共享体系结构,系统能够使用廉价的硬件,而且对软硬件无特殊要求。
NDB CLUSTER概念: 一种内存存储引擎(也称为NDB),提供高可用性和数据持久性功能。
无共享:每个组件有自己的内存和磁盘,不存在单点故障。
NDB Cluster 由一组计算机构成,每台计算机上均运行着多种进程,包括MySQL服务器,NDB Cluster 的数据节点,管理服务器,以及(可能)专门的数据访问程序。
Cluster 中所有组件的关系,如下图:
特点
1、 通过自动分片实现高水平的写入扩展能力
MySQL Cluster 自动将表分片(或分区)到不同节点上,使数据库可以在低成本的商用硬件上横向扩展,同时保持对应用程序完全应用透明。
2、 99.999% 的可用性
凭借其分布式、无共享架构,MySQL Cluster 可提供 99.999% 的可用性,确保了较强的故障恢复能力和在不停机的情况下执行预定维护的能力。
3、 SQL 和NoSQL API
MySQL Cluster 让用户可以在解决方案中整合关系数据库技术和NoSQL技术中的最佳部分,从而降低成本、风险和复杂性。
4、 实时性能
MySQL Cluster 提供实时的响应时间和吞吐量,能满足最苛刻的 Web、电信及企业应用程序的需求。
5、 具有跨地域复制功能的多站点集群
跨地域复制使多个集群可以分布在不同的地点,从而提高了灾难恢复能力和全球 Web 服务的扩展能力。
6、 联机扩展和模式升级
为支持持续运营,MySQL Cluster 允许向正在运行的数据库模式中联机添加节点和更新内容,因而能支持快速变化和高度动态的负载。
三大组件
NDB Cluster 有三种类型的节点,也称三大组件,并且在最小的NDB集群配置中,至少有三个节点
管理节点(MGM):
作用: 管理NDB集群内的其他节点,执行提供配置数据(Cluster配置文件和 Cluster日志),启动和停止节点以及运行备份等功能。 Cluster中的每个节点从管理服务器检索配置数据,并请求确定管理服务器所在位置的方式。当数据节点内出现新的事件时,节点将关于这类事件的信息传输到管理服务器,然后,将这类信息写入 Cluster日志。由于此节点类型管理其他节点的配置,因此应首先启动此类节点,然后再启动其他节点。MGM节点使用命令ndb_mgmd启动 。
数据节点(DATE):
作用: 存储集群数据。数据节点数量与复制数量一样多,乘以分段数量(请参见 第21.1.2节“NDB群集节点,节点组,副本和分区”)。例如,有两个副本,每个副本有两个片段,则需要四个数据节点。一个副本足够用于数据存储,但不提供冗余; 因此,建议有2个(或更多)副本提供冗余,从而提高可用性。数据节点使用ndbd命令启动 。
SQL节点:
作用: 访问 Cluster数据。对于MySQL Cluster,客户端节点是使用NDB Cluster存储引擎的传统MySQL服务器。通常,SQL节点是使用命令“mysqld –ndbcluster”启动的,或将“ndbcluster”添加到“my.cnf”后使用“mysqld”启动。
这三中类型的所有节点构成一个完成的MySQL集群体系:
数据保存在“NDB存储服务器”的存储引擎中,表(结构)则保存在“MySQL服务器”中。
应用程序通过“MySQL服务器”访问这些数据表。
集群管理服务器通过管理工具(ndb_mgmd)来管理“NDB存储服务器”。
一、安装前准备
搭建 MySQL Cluster首先需要至少一个管理节点主机来实现管理功能,一个SQL节点主机来实现MySQL server功能和两个ndb节点主机实现NDB Cluster的功能。在这里使用双SQL节点来搭建环境,具体信息如下:
1. 服务器规划表:
2. 下载安装包到本地电脑
下载 MySQL cluster 7.4 版本,选择 linux-通用二进制发行版本
mysql-cluster-gpl-7.4.17-linux-glibc2.12-x86_64.tar.gz
利用 pscp 工具将安装包远程上传到每台服务器上(除负载均衡服务器之外)
pscp D:\mysql-cluster-gpl-7.4.17-linux-glibc2.12-x86_64.tar.gz ubuntu@192.168.1.7:/usr/local
- 务必保证服务器时间的同步,和软件源的可用
3. 设置集群各节点之间的免密登录
创建密钥:
命令:ssh-keygen (一直按回车即可)
密钥传输
命令:ssh-copy-id -i ~/.ssh/id_rsa.pub postgres@192.168.1.16
注意:!!!
1.除了安装负载均衡的服务器外,每个节点都必须将自己的密钥传输到其他节点
二、安装部署
安装sql节点 :
sql节点:
192.168.1.11
192.168.1.8
注意: 所有节点的服务器中必须保证没有旧的、已经安装过的mysql程序,如有,请卸载干净。
安装依赖包
[root@192.168.1.11 ~]# apt-get -y install libaio1 libaio-dev
创建 mysql 用户组及用户
[root@192.168.1.11 ~]# addgroup mysql
[root@192.168.1.11 ~]# adduser -r -g mysql mysql
解压安装包
[root@192.168.1.11 ~]# cd /usr/local/
[root@192.168.1.11 ~]# tar zxvf /usr/local/mysql-cluster-gpl-7.4.17-linux-glibc2.12-x86_64.tar.gz
为解压后的文件创建符号链接 mysql
[root@192.168.1.11 local]# ln -sv mysql-cluster-gpl-7.4.17-linux-glibc2.12-x86_64 mysql
更改权限
[root@192.168.1.11 mysql]# chown -R mysql.root /usr/local/mysql
[root@192.168.1.11 mysql]# chown -R mysql.root /usr/local/mysql/
创建data文件夹,并修改权限,用以存放mysql初始化后的数据,
[root@192.168.1.11 local]# cd mysql
[root@192.168.1.11 mysql]# mkdir /usr/local/mysql/data
[root@192.168.1.11 mysql]# chown -R mysql.root /usr/local/mysql/data
复制配置文件到 /etc 下
[root@192.168.1.11 mysql]# cp /usr/local/mysql/my.cnf /etc
运行 mysql_install_db 脚本,开始初始化
[root@192.168.1.11 mysql]# /usr/local/mysql/scripts/mysql_install_db –user=mysql –datadir=/usr/local/mysql/data –basedir=/usr/local/mysql
–user 为 mysqld服务的运行用户
–basedir 和 –datadir 则分别代表 mysql 的安装目录和数据存放目录,如果不指定这两个参数,就会有如下错误:
初始化成功,如图:
将MySQL启动脚本复制到相应的目录,使其可执行
[root@192.168.1.11 mysql]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d
[root@192.168.1.11 mysql]# chmod +x /etc/init.d/mysql.server
添加环境变量,执行命令方便一点
[root@192.168.1.11 mysql]# echo “export PATH=$PATH:/usr/local/mysql/bin” >> /root/.bash_profile
[root@192.168.1.11 mysql]# source /root/.bash_profile
并将其设置为在操作系统启动时启动:
[root@192.168.1.11 mysql]# apt-get -y install sysv-rc-conf
[root@192.168.1.11 mysql]# update -rc.d -f mysql.server defaults
[root@192.168.1.11 mysql]# sysv-rc-conf
- 修改/etc/my.cnf配置文件,追加如下配置
[mysqld] datadir=/usr/local/mysql/data basedir=/usr/local/mysql socket=/tmp/mysql.sock symbolic-links=0 skip-name-resolve skip-grant-tables # 运行NDB存储引擎 ndbcluster # 管理节点 ndb-connectstring=192.168.1.7:1186 [MYSQL_CLUSTER] #管理节点 ndb-connectstring=192.168.1.7:1186
安装NDB节点:
NDB节点:
192.168.1.16
192.168.1.14
注意: NDB节点的安装和SQL节点安装大致相似
- 安装
[root@192.168.1.16 ~]# apt-get -y install libaio1 libaio-dev
[root@192.168.1.16 ~]# addgroup mysql
[root@192.168.1.16 ~]# adduser -r -g mysql mysql
[root@192.168.1.16 ~]# cd /usr/local
[root@192.168.1.16 ~]# tar zxvf /usr/local/mysql-cluster-gpl-7.4.17-linux-glibc2.12-x86_64.tar.gz
[root@192.168.1.16 local]# ln -sv mysql-cluster-gpl-7.4.17-linux-glibc2.12-x86_64 mysql
[root@192.168.1.16 mysql]# chown -R mysql.root /usr/local/mysql
[root@192.168.1.16 mysql]# chown -R mysql.root /usr/local/mysql/
[root@192.168.1.16 local]# cd mysql
[root@192.168.1.16 mysql]# mkdir /usr/local/mysql/data
[root@192.168.1.16 mysql]# chown -R mysql.root /usr/local/mysql/data
[root@192.168.1.16 mysql]# cp /usr/local/mysql/my.cnf /etc/my.cnf
[root@192.168.1.16 mysql]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/usr/local/mysql/data --basedir=/usr/local/mysql
[root@192.168.1.16 mysql]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d
[root@192.168.1.16 mysql]# chmod +x /etc/init.d/mysql.server
[root@192.168.1.16 mysql]# echo "export PATH=$PATH:/usr/local/mysql/bin" >> /root/.bash_profile
[root@192.168.1.16 mysql]# source /root/.bash_profile
[root@192.168.1.16 mysql]# apt-get -y install sysv-rc-conf
[root@192.168.1.16 mysql]# update -rc.d -f mysql.server defaults
[root@192.168.1.16 mysql]# sysv-rc-conf
创建用来存放NDB节点的数据目录,在管理节点里面也要配置为该目录
[root@192.168.1.16 mysql]# mkdir /var/lib/mysql-cluster
- 和SQL节点一样,修改/etc/my.cnf配置文件,追加如下配置
[mysqld] datadir=/usr/local/mysql/data basedir=/usr/local/mysql socket=/tmp/mysql.sock symbolic-links=0 skip-name-resolve skip-grant-tables # 运行NDB存储引擎 ndbcluster # 管理节点 ndb-connectstring=192.168.1.7:1186 [MYSQL_CLUSTER] #管理节点 ndb-connectstring=192.168.1.7:1186
安装管理节点MGM:
管理节点 MGM:
192.168.1.7
注意:
如果只安装一个管理节点的话,只需要 ndb_mgm 和 ndb_mgmd两个程序即可,这两个可执行程序可以在上面的MySQL节点的MySQL安装目录中的bin目录下面找到,直接CP过来就能使用。但考虑到以后的扩展问题,在这里,我们依然全部安装程序。
- 安装
[root@192.168.1.7 ~]# apt-get -y install libaio1 libaio-dev
[root@192.168.1.7 ~]# addgroup mysql
[root@192.168.1.7 ~]# adduser -r -g mysql mysql
[root@192.168.1.7 ~]# cd /usr/local
[root@192.168.1.7 ~]# tar zxvf /usr/local/mysql-cluster-gpl-7.4.17-linux-glibc2.12-x86_64.tar.gz
[root@192.168.1.7 local]# ln -sv mysql-cluster-gpl-7.4.17-linux-glibc2.12-x86_64 mysql
[root@192.168.1.7 mysql]# chown -R mysql.root /usr/local/mysql
[root@192.168.1.7 mysql]# chown -R mysql.root /usr/local/mysql/
[root@192.168.1.7 local]# cd mysql
[root@192.168.1.7 mysql]# mkdir /usr/local/mysql/data
[root@192.168.1.7 mysql]# chown -R mysql.root /usr/local/mysql/data
[root@192.168.1.7 mysql]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/usr/local/mysql/data --basedir=/usr/local/mysql
[root@192.168.1.7 mysql]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d
[root@192.168.1.7 mysql]# chmod +x /etc/init.d/mysql.server
[root@192.168.1.7 mysql]# echo "export PATH=$PATH:/usr/local/mysql/bin" >> /root/.bash_profile
[root@192.168.1.7 mysql]# source /root/.bash_profile
[root@192.168.1.7 mysql]# apt-get -y install sysv-rc-conf
[root@192.168.1.7 mysql]# update -rc.d -f mysql.server defaults
[root@192.168.1.7 mysql]# sysv-rc-conf
创建目录mysql-cluster,该目录会存放相关日志文件,以及pid号。并在目录中创建配置文件config.ini
[root@192.168.1.7 mysql]# mkdir /var/lib/mysql-cluster
[root@192.168.1.7 mysql]# cd /var/lib/mysql-cluster
[root@192.168.1.7 mysql]# vi config.ini
- 管理节点配置文件 /var/lib/mysql-cluster/config.ini
[NDBD DEFAULT] #每个数据节点的镜像数量,通常最低设置为2,否则就没有意义了,这里是方便后面测试 NoOfReplicas=2 #每个数据节点中给数据分配的内存 DataMemory=80M #每个数据节点中给索引分配的内存 IndexMemory=18M #管理节点 [NDB_MGMD] nodeid=1 #管理节点ip hostname=192.168.1.7 #管理节点数据目录,存放相关日志,以及pid文件 datadir=/var/lib/mysql-cluster #第一个 ndbd 节点: [NDBD] nodeid=2 #数据节点ip地址 hostname=192.168.1.16 #NDB点数据存放目录 datadir=/usr/local/mysql/data #第二个 ndbd 节点: [NDBD] nodeid=3 hostname=192.168.1.14 datadir=/usr/local/mysql/data # SQL node options: [MySQLD] nodeid=4 #SQL节点ip地址 hostname=192.168.1.11 [MySQLD] nodeid=5 hostname=192.168.1.8 这里保留了一个空节点。否则停止NDB会报错:No free node id found for ndbd(NDB) [MySQLD]
- 配置参数解释:
在上面的配置文件中,包括很多的组,组名用"[]"括起来,在这里我们最关心的是3类节点组的配置,分别定义如下: [NDB_MGMD] 表示管理节点的配置,只能有一个。 [NDBD DEFAULT] 表示每个数据节点的默认配置,在每个节点的[NDBD]中不用再写这些选项,只能有一个。 [NDBD] 表示每个数据节点的配置,可以有多个。 [MYSQLD] 表示SQL节点的配置,可以有多个,分别写上不同的SQL节点的ip地址;也可以不用写,只保留一个空节点,表示任意一个ip地址都可以进行访问。此节点的个数表明了可以用来连接数据节点的SQL节点总数。 *注意:每个节点都有一个独立的id号,可以填写,比如nodeid=2,(老版本使用id,新版本已经不使用id标识了)也可以不用填写,系统会按照配置文件的填写顺序自动分配。
三、启动 cluster
注意:启动顺序:管理节点->数据节点->SQL节点(很重要)
1. 启动管理节点:
[root@192.168.1.7 ~]# ndb_mgmd -f /var/lib/mysql-cluster/config.ini MySQL Cluster Management Server mysql-5.5.19 ndb-7.2.4 [root@192.168.1.7 ~]# netstat -ntlp | grep 1186 tcp 0 0 0.0.0.0:1186 0.0.0.0:* > LISTEN 1329/ndb_mgmd [root@192.168.1.7 ~]# ps -ef | grep ndb_mgmd | grep -v grep root 1329 1 0 17:30 ? 00:00:00 ndb_mgmd -f /> data/mysql-cluster/config.ini [root@192.168.1.7 ~]#
2. 启动NDB(数据节点)
两个数据节点:
192.168.1.16
192.168.1.14
注意:只有在第一次启动或在备份/恢复或配置变化后重启ndbd时,才加–initial参数!原因在于,该参数会使节点删除由早期ndbd实例创建的,用于恢复的任何文件,包括用于恢复的日志文件。
启动数据节点: [root@192.168.1.16 ~]# ndbd --initial 2018-01-16 17:40:51 [ndbd] INFO -- Angel connected to '192.168.1.16:1186' 2018-01-16 17:40:51 [ndbd] INFO -- Angel allocated nodeid: 3 查看相关进程: [root@192.168.1.16 ~]# ps -ef | grep ndbd | grep -v grep root 2266 1 0 17:41 ? 00:00:00 ndbd --initial root 2267 2266 1 17:41 ? 00:00:04 ndbd --initial
启动数据节点: [root@192.168.1.14 ~]# ndbd --initial 2018-01-16 17:42:21 [ndbd] INFO -- Angel connected to '192.168.1.14:1186' 2018-01-16 17:42:21 [ndbd] INFO -- Angel allocated nodeid: 3 查看相关进程: [root@192.168.1.14 ~]# ps -ef | grep ndbd | grep -v grep root 2266 1 0 17:43 ? 00:00:00 ndbd --initial root 2267 2266 1 17:43 ? 00:00:04 ndbd --initial
ndbd进程是使用NDB存储引擎处理表中数据的进程。通过该进程,存储节点能够实现分布式事务管理,节点恢复,在线备份相关任务。
3. 启动SQL节点(启动mysql服务)
两个sql节点:
192.168.1.11
192.168.1.8
[root@192.168.1.11 ~]# /etc/init.d/mysql.server start Starting MySQL [ OK ] [root@192.168.1.11 ~]#
[root@192.168.1.8 ~]# /etc/init.d/mysql.server start Starting MySQL..... [ OK ] [root@192.168.1.8 ~]#
4. 节点全部启动成功后,在管理节点使用ndb_mgm工具的show命令查看集群状态:
[root@192.168.1.7 ~]# ndb_mgm -- NDB Cluster -- Management Client -- ndb_mgm> show Connected to Management Server at: localhost:1186 Cluster Configuration --------------------- [ndbd(NDB)] 2 node(s) id=2 @192.168.1.16 (mysql-5.6.38 ndb-7.4.17, Nodegroup: 0, Master) id=3 @192.168.1.14 (mysql-5.6.38 ndb-7.4.17, Nodegroup: 1) [ndb_mgmd(MGM)] 1 node(s) id=1 @192.168.1.7 (mysql-5.6.38 ndb-7.4.17) [mysqld(API)] 3 node(s) id=4 @192.168.1.11 (mysql-5.6.38 ndb-7.4.17) id=5 @192.168.1.8 (mysql-5.6.38 ndb-7.4.17) id=6 (not connected, accepting connect from any host) ndb_mgm>
ndb_mgm工具是ndb_mgmd(MySQL Cluster Server)的客户端管理工具,通过该工具可以方便的检查Cluster的状态,启动备份,关闭等功能。更详细的方法可以通过ndb_mgm –help命令来进行查看。
- 从上面显示的状态可以看出如下信息:
1. 集群目前的管理服务器端口是1186
Connected to Management Server at: localhost:1186
2. 集群的数据节点(NDB)有2个,详细信息:
[ndbd(NDB)] 2 node(s) id=2 @192.168.1.16 (mysql-5.6.38 ndb-7.4.17, Nodegroup: 0, Master) id=3 @192.168.1.14 (mysql-5.6.38 ndb-7.4.17, Nodegroup: 1)
3. 集群的管理节点有一个,详细信息:
[ndb_mgmd(MGM)] 1 node(s) id=1 @192.168.1.7 (mysql-5.6.38 ndb-7.4.17)
4. SQL节点有3个,目前处于连接状态的有2个,详细信息:
[mysqld(API)] 3 node(s) id=4 @192.168.1.11 (mysql-5.6.38 ndb-7.4.17) id=5 @192.168.1.8 (mysql-5.6.38 ndb-7.4.17) id=6 (not connected, accepting connect from any host)
四、MySQL Cluster 高可用测试
成功启动后,下面来测试一下Cluster的功能。如果要使用cluster,则表的引擎必须为NDB,其他类型存储引擎的数据不会保存到数据节点中。对于cluster的一个重要功能就是防止单点故障。我们下面对这些问题分别来进行测试。
1. NDB存储引擎测试
(1)在任意一个SQL节点(我这里选择192.168.1.11)的mysql库中创建测试表t1,设置存储引擎为NDB,并插入两条测试数据:
mysql> use mysql; mysql> create table t1 (id int,name varchar(20)) engine=ndb; Query OK, 0 rows affected (0.44 sec) mysql> insert into t1 values(1,'mashuai'); Query OK, 1 row affected (0.11 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> insert into t1 values(2,'mashuai'); Query OK, 1 row affected (0.03 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql>
(2)在另外一个SQL节点(192.168.1.8)查询mysql库中t1表,结果如下:
mysql> use mysql; mysql> select * from t1; +------+---------+ | id | name | +------+---------+ | 1 | mashuai | | 2 | mashuai | +------+---------+ 2 rows in set (0.08 sec) mysql>
显然,两个SQL节点查询的数据时一致的。
(3)在SQL节点192.168.0.11上把测试表t1引擎改为MyISAM,再次插入测试数据:
mysql> alter table t1 engine=myisam; Query OK, 2 rows affected (0.50 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> insert into t1 select 2,'good boy'; Query OK, 1 row affected (0.00 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql>
(4)在SQL节点192.168.1.8上再次查询表t1,结果如下:
mysql> select * from t1; ERROR 1146 (42S02): Table 't1' doesn't exist mysql> show tables; Empty set (0.04 sec) mysql>
直接报错,说表不存在了。(老版本是报ERROR 1412:Table definition ha changed,please retry transaction)
(5)我们再次改回NDB引擎。
mysql> alter table t1 engine=ndb; Query OK, 3 rows affected (0.25 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql>
(6)再次进行查询如下:
mysql> select * from t1; +------+---------+ | id | name | +------+---------+ | 1 | mashuai | | 2 | mashuai | +------+---------+ 3 rows in set (0.02 sec) mysql>
发现表t1的数据再次同步到了数据节点。所有SQL节点又都可以正常查询数据。
2. 单点故障测试
对于任意一种节点,都存在单点故障的可能性。在cluster的设置过程中,应该尽量对每一类节点设置冗余,以防止单点故障发生时造成的应用终端。对于管理节点,一般不需要特殊的配置,只需要将管理工具和配置文件防止多台服务器上即可。下面我们测试一下SQL节点和NDB(数据节点)的单点故障。
- SQL节点发生单点故障
对于上面的测试环境中,我们设置了两个SQL节点,应用从两个节点对数据访问都可以得到一致的结果。如果有一个节点故障,系统会正常运行吗?我们测试便知。
(1)将SQL节点192.168.1.8上的MySQL服务停止:
[root@192.168.1.8 ~]# /etc/init.d/mysql.server stop Shutting down MySQL.. [ OK ] [root@192.168.1.8 ~]#
(2)查看cluster状态:
[root@192.168.1.7 ~]# ndb_mgm -- NDB Cluster -- Management Client -- ndb_mgm> show Connected to Management Server at: localhost:1186 Cluster Configuration --------------------- [ndbd(NDB)] 2 node(s) id=2 @192.168.1.16 (mysql-5.6.38 ndb-7.4.17, Nodegroup: 0, Master) id=3 @192.168.1.14 (mysql-5.6.38 ndb-7.4.17, Nodegroup: 1) [ndb_mgmd(MGM)] 1 node(s) id=1 @192.168.1.7 (mysql-5.6.38 ndb-7.4.17) [mysqld(API)] 3 node(s) id=4 @192.168.1.11 (mysql-5.6.38 ndb-7.4.17) id=5 (not connected, accepting connect from any host) id=6 (not connected, accepting connect from any host) ndb_mgm>
可以发现SQL节点192.168.1.8已经断开,但是另外一个SQL节点192.168.1.11仍然处于正常状态。
(3)从SQL节点192.168.1.11上查看表t1,结果如下:
mysql> select * from t1; +------+---------+ | id | name | +------+---------+ | 1 | mashuai | | 2 | mashuai | +------+---------+ 3 rows in set (0.02 sec) mysql>
显然,SQL节点的单点故障并没有引起数据查询的故障。对于应用来说,需要改变的就是将以前对故障节点的访问改为对非故障节点的访问(SQL节点前面可以挂LVS,然后做各种检测)
- NDB(数据节点)的单点故障
在这个测试环境中,数据节点也是两个,那么他们对数据的存储是互相镜像还是一份数据分成几块存储呢?(类似磁盘阵列RAID1还是RAID0)?这个答案关键在于配置文件中[NDBD DEFAULT]组中的NoOfReplicas参数,如果这个参数等于1,表示只有一份数据,但是分成N块分别存储在N个数据节点上,如果该值等于2,则表示数据被分成N/2,每块数据都有两个备份,这样即使有任意一个节点发生故障,只要它的备份节点正常,数据就可以正常查询。
在下面的例子中,先将两个数据节点之一停止,访问表t1,看能否正常访问;然后将NoOfReplicas配置改为2,这时,数据节点实际上已经互为镜像,保存了两份。这时再停止任意一个数据节点,看是否能访问表t1。
(1)将数据节点192.168.1.16上的NDB进程停止:
[root@192.168.1.16 ~]# ps -ef | grep ndbd root 2266 1 0 17:21 ? 00:00:00 ndbd --initial root 2267 2266 1 17:21 ? 00:01:03 ndbd --initial root 2368 1300 0 23:06 pts/0 00:00:00 grep ndbd [root@192.168.1.16 ~]# pkill -9 ndbd [root@192.168.1.16 ~]# ps -ef | grep ndbd root 2371 1300 0 17:22 pts/0 00:00:00 grep ndbd [root@192.168.1.16 ~]#
(2)查看cluster状态:
[root@192.168.1.7 ~]# ndb_mgm -- NDB Cluster -- Management Client -- ndb_mgm> show Connected to Management Server at: localhost:1186 Cluster Configuration --------------------- [ndbd(NDB)] 2 node(s) id=2 (not connected, accepting connect from any host) id=3 @192.168.1.14 (mysql-5.6.38 ndb-7.4.17, Nodegroup: 1) [ndb_mgmd(MGM)] 1 node(s) id=1 @192.168.1.7 (mysql-5.6.38 ndb-7.4.17) [mysqld(API)] 3 node(s) id=4 @192.168.1.11 (mysql-5.6.38 ndb-7.4.17) id=5 @192.168.1.8 (mysql-5.6.38 ndb-7.4.17) id=6 (not connected, accepting connect from any host) ndb_mgm>
看见只有一个NDB节点在运行。
(3)在任意节点,这里是192.168.1.11查看表t1的数据:
mysql> select * from t1; +------+---------+ | id | name | +------+---------+ | 1 | mashuai | | 2 | mashuai | +------+---------+ 3 rows in set (0.02 sec) mysql>
显然挂掉一个NDB节点不影响我们正常的数据查询,数据节点的冗余同样防止了单点故障。
3. MySQL Cluster集群的关闭
关闭顺序:SQL节点->数据节点->管理节点(在MySQL Cluster环境中,NDB节点和管理节点的关闭都可以在管理节点的管理程序中完成,也可以分节点关闭,但是SQL节点却没办法。所以,在关闭整个MySQL Cluster环境或者关闭某个SQL节点的时候,首先必须到SQL节点主机上来关闭SQL节点程序。关闭方法和MySQL Server的关闭一样。)
(1)SQL节点关闭
[root@192.168.1.11 ~]# /etc/init.d/mysqld stop Shutting down MySQL.. [ OK ] [root@192.168.1.11 ~]#
(2)(NDB)数据节点关闭
[root@192.168.1.16 ~]# ndbd stop 2018-01-16 18:30:51 [ndbd] INFO -- Angel connected to '192.168.0.30:1186' 2018-01-16 18:30:51 [ndbd] INFO -- Angel allocated nodeid: 2 [root@192.168.1.16 ~]#
(3)管理节点关闭
ndb_mgm> shutdown Node 2: Cluster shutdown initiated Node 3: Cluster shutdown initiated 3 NDB Cluster node(s) have shutdown. Disconnecting to allow management server to shutdown. Node 3: Node shutdown completed. ndb_mgm>
总结:
第一次部署MySql Cluster,踩了不少坑,比如参数NoOfReplicas无法临时更改,管理节点配置文件中如果不多预留一个[MySQLD],在停止NDB节点时会报错,以及配置文件中的[NDBD]段落中的datadir指定的目录在数据节点的服务器上面要存在。MySQL Cluster的核心在于NDB Cluster存储引擎,不仅对数据进行了水平切分,还对数据进行了跨节点冗余。既解决了数据库的扩展问题,同时也在很大程度上提高了数据库整体可用性。
五、安装 HaProxy 负载均衡
服务器: 192.168.1.4
下载安装 HaProxy
[ubuntu@192.168.1.4]# sudo apt -get install haproxy
修改配置文件
[ubuntu@192.168.1.4]# sudo vi /etc/haproxy/haproxy.cfg
配置文件如下:
global log /dev/log local0 info #日志相关 log /dev/log local1 notice maxconn 4096 chroot /var/lib/haproxy stats timeout 30s user haproxy group haproxy daemon #debug #quiet #pidfile /usr/local/haproxy/haproxy.pid # Default SSL material locations ca-base /etc/ssl/certs crt-base /etc/ssl/private # Default ciphers to use on SSL-enabled listening sockets. # For more information, see ciphers(1SSL). This list is from: # https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/ ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS ssl-default-bind-options no-sslv3 defaults log global mode tcp #修改:mode http ---->mode tcp option tcplog #修改:option httplog--->option tcplog option dontlognull #retries 3 #option redispatch #maxconn 2000 timeout connect 10s #修改:连接超时时间 timeout client 60s #修改:连接客户端超时时间 timeout server 60s #修改:连接服务器端超时时间 listen mysql-cluster bind *:6666 #代理端口 mode tcp #模式 TCP option mysql-check # user root #mysql健康检查 root为mysql登录用户名 balance roundrobin #调度算法 server mysql1 192.168.1.11:3306 check port 3306 #weight 1 check inter 1s rise 2 fall 2 #健康检查加上check server mysql2 192.168.1.8:3306 check port 3306 #weight 1 check inter 1s rise 2 fall 2 listen stats #监控 mode http option httplog bind 0.0.0.0:8888 stats enable stats refresh 30s #设置统计页面自动刷新时间 stats uri /dbs stats realm welcome login\ Haproxy stats auth admin:admin stats admin if TRUE
- 检测修改文件配置结果
[ubuntu@192.168.1.4]# haproxy -f /etc/haproxy/haproxy.cfg -c [ubuntu@192.168.1.4]# Configuration file is valid (配置有效) [ubuntu@192.168.1.4]# sudo service haproxy restart (重启服务)
- 验证结果:
在浏览器中输入:http://192.168.1.4:8888/dbs 弹出登录对话框: 用户名:admin 密码为:admin
如图所示:
- 连接测试:
安装 mysql客户端: [ubuntu@192.168.1.4]# sudo apt-get install mysql-client-core-5.7 安装 mariadb 数据库系统管理器 [ubuntu@192.168.1.4]# sudo apt-get install mariadb-client-core-10.0 连接mysql 命令: [ubuntu@192.168.1.4]# mysql -h 192.168.1.4 -P 6666 -u root -D mysql -p
如图所示:
配置mysql允许远程链接
默认情况下,mysql帐号不允许从远程登陆,只能在localhost登录。本文提供了二种方法设置mysql可以通过远程主机进行连接。
1. 改表法
在localhost登入mysql后,更改 "mysql" 数据库里的 "user" 表里的 "host" 项,将"localhost"改称"%" 例如: [root@192.168.1.11 ~]# #mysql -u root -p Enter password: …… mysql> mysql> update user set host = '%' where user = 'root'; mysql> select host, user from user;
2.授权法
例如: 你想root使用mypassword(密码)从任何主机连接到mysql服务器的话。 mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY 'mypassword' WITH GRANT OPTION; 如果你想允许用户root从ip为192.168.1.6的主机连接到mysql服务器,并使用mypassword作为密码 mysql> GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'192.168.1.6'IDENTIFIED BY'mypassword' WITH GRANT OPTION; mysql> FLUSH PRIVILEGES #使修改生效,就可以了
3. 常见问题:
1、在采用法二授权法之后,无法在本地登录mysql,如: [root@192.168.1.11 ~]# #mysql -u root -p -h 192.168.1.11 Enter password: ERROR 1045 (28000): Access denied for user 'root'@'192.168.1.11' (using password: YES) 解决方法: 1、这时可以使用:mysql -u root -p 登录,进入到mysql后。 mysql> grant all privileges on *.* to 'root'@'loadb116' identified by '123456' with grant option; Query OK, 0 rows affected (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) 2、在本地使用ip地址登录 [root@192.168.1.11 ~]# # mysql -u root -p -h 192.168.5.116 Enter password: Welcome to the MySQL monitor. Commands end with ; or /g. Your MySQL connection id is 60 Server version: 5.1.45 MySQL Community Server (GPL) Type 'help;' or '/h' for help. Type '/c' to clear the buffer. mysql>
- 用 Navicat 连接 cluster