设为首页 收藏本站
查看: 531|回复: 0

[经验分享] Linux下构建MySQL集群

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-9-9 08:27:28 | 显示全部楼层 |阅读模式
一、目标

1.安装MySQL-Cluster相关软件包。
2.依次配置管理/数据/SQL节点。
3.启动并测试MySQL-Cluster集群架构。

二、方案

    使用6台RHEL 6.5虚拟机,如图所示。其中sql1和sql2作为SQL节点,ndb1和ndb2作为数据节点,mgmsvr作为管理节点,这5个节点构成MySQL Cluster体系;而另一台虚拟机192.168.4.1作为测试客户机。


wKiom1QMflOjG7UWAAFskHW96JQ669.jpg



    构成MySQL集群体系的5个节点应安装Cluster版的MySQL相关软件包;测试用的Linux客户机只需安装普通版的MySQL-client即可。


三、实现
1、准备工作
1)确认各节点服务器的IP地址,使各节点能互通,防火墙和selinux处于关闭状态。
关闭防火墙:
    # iptables -F                       //清空防火墙条目
    # service iptables stop       //关闭防火墙
    # chkconfig iptables off    //开机不自启
关闭selinux:
  vim打开 /etc/selinux/config修改SELINUX=disabled  
   # getenforce 0
2)卸载所有节点上的冲突包
官方提供的MySQL-Cluster相关软件包(可在这里获得http://yun.baidu.com/share/link?shareid=2445480853&uk=3928340278)已集成数据库服务端/客户端程序,因此可直接用来替换普通的MySQL服务端/客户端程序。如果已安装有普通版的mysql-server、mysql、MySQL-server、MySQL-client包,先将其卸载(若没有则忽略):
   # rpm -qa | grep -i mysql         //检查有没有安装普通版的mysql软件

对于RHEL自带的mysql-libs暂时保留(如果直接卸载会因为依赖关系删除许多重要的包,比如crontab、postfix等),但在安装MySQl-Cluster相关包的时候采用“-U”升级的方式执行替换。
   # rpm -e --nodeps MySQL-client

如果有残留的/etc/my.cnf文件,确保已转移备用或直接删除。
  # mv /etc/my.cnf /etc/my.cnf.bak

3)在所有节点上,解压下载的MySQL-Cluster集合包
   # tar xvf MySQL-Cluster-gpl-7.3.3-1.el6.x86_64.rpm-bundle.tar
  MySQL-Cluster-shared-gpl-7.3.3-1.el6.x86_64.rpm

  MySQL-Cluster-shared-compat-gpl-7.3.3-1.el6.x86_64.rpm    //安装共享库和兼容包
  MySQL-Cluster-server-gpl-7.3.3-1.el6.x86_64.rpm                 //安装服务端程序
  MySQL-Cluster-client-gpl-7.3.3-1.el6.x86_64.rpm                 //安装客户端程序
  MySQL-Cluster-test-gpl-7.3.3-1.el6.x86_64.rpm
  MySQL-Cluster-devel-gpl-7.3.3-1.el6.x86_64.rpm
  MySQL-Cluster-embedded-gpl-7.3.3-1.el6.x86_64.rpm

在SQL节点(sql1、sql2)服务器上,修改MySQL数据库的root密码:
  [iyunv@sql1 ~]# service mysql start         //启动MySQL服务程序
  Starting MySQL... [确定]
  [iyunv@sql2 ~]# cat /root/.mysql_secret
  # The random password set for the root user at Wed Sep  3 21:04:20 2014 (local time): msA7Bq2B

  [iyunv@sql1 ~]# mysql –u root –pmsA7Bq2B             //以上述默认密码登录
    mysql> set password=password("123456");
    Query OK, 0 rows affected (0.17 sec)
在数据节点(ndb1、ndb2)和管理节点(mgmsvr)上,实际上并不需要启动MySQL服务程序,因此建议将mysql服务的自启状态设为关闭
  [iyunv@ndb1 ~]# chkconfig mysql off
4)在sql节点添加授权数据库用户
在SQL节点(sql1、sql2)服务器上,添加相应的授权数据库用户,以方便客户端使用数据库服务。以用户user为例,允许其从192.168.4.0/24网段访问:

  mysql> grant all on *.* to user@'192.168.4.%' identified by "123456";  
  Query OK, 0 rows affected (0.03 sec)

2、配置管理节点mgmsvr(192.168.4.3)
1)创建工作文件夹
为管理节点提供一个工作目录,方便记录mysql集群相关的日志消息:
  [iyunv@mgmsvr ~]# mkdir /var/log/mysql-cluster
2)创建配置文件
在管理节点的配置文件中,应涵盖所有节点的设置,主要包括各节点的ID号、主机名或IP地址、工作目录等信息。
针对本实验,管理节点的配置参考如下:
  [iyunv@mgmsvr ~]# cat /etc/config.ini     //文件名可以随意
  [ndbd default]                //为所有的节点指定默认配置
  NoOfReplicas=2//保留2份数据拷贝
  DataMemory=80M//数据缓存大小
  IndexMemory=18M//索引缓存大小
  [ndb_mgmd]//指定一个管理节点的配置,可以有多个管理节点
  nodeid=3//节点的id号,作为节点的唯一识别码,不可以与其他节点相同
  hostname=192.168.4.3  //节点的ip地址
  datadir=/var/log/mysql-cluster   //该管理节点的工作目录
  [ndbd]//指定数据节点的配置,每个数据节点对应一个ndbd配置
  nodeid=4
  hostname=192.168.4.4      
  datadir=/var/log/mysql-cluster/data
  [ndbd]
  nodeid=5
  hostname=192.168.4.5
  datadir=/var/log/mysql-cluster/data
  [mysqld]//指定SQL节点的配置,每个SQL节点对应一个配mysqld置
  nodeid=6
  hostname=192.168.4.6
  [mysqld]
  nodeid=7
  hostname=192.168.4.7


3、配置数据节点,分别在ndb1 (192.168.4.4)、ndb2(192.168.4.5)上做下面的操作
1)创建工作文件夹
为各数据节点提供一个工作目录,用来存放实际的数据库表记录等相关数据:
  [iyunv@ndb1~]# mkdir -p /var/lib/mysql-cluster/data
2)创建配置文件
指定一个数据存储目录,管理服务器的IP地址、采用ndbcluster存储引擎,以便支持集群特性;并添加[mysql_cluster]配置段,同样指定管理地址。
针对本实验,2个数据节点的配置参考如下:
  [iyunv@ndb1 ~]# cat /etc/my.cnf
  [mysqld]
  datadir=/var/log/mysql-cluster/data   //指定数据存储目录
  ndb-connectstring=192.168.4.3      //要连接的管理服务器的ip地址
  Ndbcluster//指定运行的存储引擎
  [mysql_cluster]//集群连接配置
  ndb-connectstring=192.168.4.3    //管理服务器的地址
4、配置SQL节点,分别在sql1(192.168.4.6)、sql2(192.168.4.7)上做下面的操作
调整my.cnf配置,指定运行的存储引擎、默认存储引擎,并通过[mysql_cluster]配置段指定管理地址。在MySQL-Cluster集群环境中,若某个数据库未采用ndbcluster引擎(而是InnoDB、MyISAM等其他引擎),则当更新数据库表时,可能无法同步到其他节点。
  [iyunv@sql1 ~]# cat /etc/my.cnf
  [mysqld]
  ndbcluster        //指定运行的存储引擎
  default-storage-engine=ndbcluster     //指定默认的存储引擎  
  [mysql_cluster]
  ndb-connectstring=192.168.4.3   //管理服务器的地址

5、启动MySQL集群
正确的启动顺序:管理节点 --> 数据节点 --> SQL节点。
关闭顺序:SQL节点 --> 数据节点 --> 管理节点。
1)启动管理节点
MySQL Cluster管理节点的对应服务程序为ndb_mgmd,通过选项-f指定建立的集群配置文件。
  [iyunv@mgmsvr ~]# ndb_mgmd -f /etc/config.ini

关于管理节点的启动,有以下几个需要注意的地方:
    ndb_mgmd默认以后台模式运行(--daemon),调试过程中可添加选项--nodaemon来禁用后台模式。
    ndb_mgmd初次启动成功以后,会自动保存集群配置,以后再启动时会忽略-f指定的配置文件,除非添加--initial选项(比如向集群中添加新的节点时,就应该重新初始化)。

若希望每次开机后自动运行ndb_mgmd,可将上述启动操作写入到/etc/rc.local配置文件内,例如:
  [iyunv@mgmsvr ~]# cat /etc/rc.local   
  .. ..
  ndb_mgmd -f /etc/my-cluster.ini
启动完成后查看监听状态:
  [iyunv@svr3 ~]# netstat -anpt | grep ndb
  tcp  0  0  0.0.0.0:1186      0.0.0.0:*          LISTEN       3809/ndb_mgmd     
  tcp  0  0  127.0.0.1:1186    127.0.0.1:54902    ESTABLISHED 3809/ndb_mgmd   
  tcp  0  0  127.0.0.1:54902   127.0.0.1:1186     ESTABLISHED 3809/ndb_mgmd

2)启动数据节点ndb1、ndb2
MySQL Cluster数据节点的对应服务程序为ndbd(单线程的)、ndbmtd(多线程的),首次启动或重新初始化时加 --initial选项,以后不用加。

启动ndb1:
  [iyunv@ndb1 ~]# ndbd --initial
  2014-09-05 20:15:17 [ndbd] INFO     -- Angel connected to '192.168.4.3:1186'
  2014-09-05 20:15:17 [ndbd] INFO     -- Angel allocated nodeid: 4
启动ndb2;
  [iyunv@ndb2 ~]# ndbd --initial
  2014-09-05 20:15:44 [ndbd] INFO     -- Angel connected to '192.168.4.3:1186'
  2014-09-05 20:15:44 [ndbd] INFO     -- Angel allocated nodeid: 5
在ndb1和ndb2服务器上,修改/etc/rc.local配置文件,以便每次开机后能自动启动数据节点服务:
  [iyunv@ndb1 ~]# cat /etc/rc.local
  .. ..
  ndbd
3)启动SQL节点sql1、sql2
对于MySQL Cluster的SQL节点来说,对应的服务程序就是mysqld,正常通过mysql脚本重新启动服务就可以了。启动sql1:
[iyunv@sql1~]# service mysql restart
Shutting down MySQL..... SUCCESS!
Starting MySQL................................ SUCCESS!
[iyunv@sql1~]# chkconfig mysql on     //开机自启
启动sql2:
[iyunv@sql2 ~]# service mysql restar
Shutting down MySQL..... SUCCESS!
Starting MySQL.........SUCCESS
[iyunv@sql2 ~]# chkconfig mysql on
成功启动后,可在本机登入mysql>环境,检查默认的存储引擎,确保已支持ndbcluster且作为默认存储引擎:
  [iyunv@sql1 ~]# mysql -uuser -p123456
  ... ...
  mysql> show enginesG;
  *************************** 1. row ***************************
      Engine: ndbcluster
     Support: DEFAULT
     Comment: Clustered, fault-tolerant tables
  Transactions: YES
          XA: NO
    Savepoints: NO
*************************** 2. row ***************************
      Engine: MRG_MYISAM
     Support: YES
     Comment: Collection of identical MyISAM tables
  Transactions: NO
          XA: NO
  Savepoints: NO
  ... ...
4)在管理节点上查看集群状态
[iyunv@mgmsvr 桌面]# ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show    //查看当前各节点的状态
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)]2 node(s)     //两个数据节点
id=4@192.168.4.4  (mysql-5.6.14 ndb-7.3.3, Nodegroup: 0, *)
id=5@192.168.4.5  (mysql-5.6.14 ndb-7.3.3, Nodegroup: 0)

[ndb_mgmd(MGM)]1 node(s)     //一个管理节点
id=3@192.168.4.3  (mysql-5.6.14 ndb-7.3.3)

[mysqld(API)]2 node(s)//两个SQL节点
id=6@192.168.4.6  (mysql-5.6.14 ndb-7.3.3)
id=7 @192.168.4.7  (mysql-5.6.14 ndb-7.3.3)

6.MySQL集群的高可用性测试
1)数据同步测试
从客户机访问sql1,执行写数据库、表相关操作:

[iyunv@client~]# mysql -u user -h 192.168.4.6 -p
Enter password:                                 //验证口令
    .. ..
    mysql> CREATE DATABASE testdb;                 //新建testdb库
    Query OK, 1 row affected (0.04 sec)
    mysql> USE testdb;                                 //切换到testdb库
    Database changed
    mysql> CREATE TABLE tab1(id int(4));         //新建tab1表
    Query OK, 0 rows affected (0.14 sec)
    mysql> INSERT INTO testdb.tab1 VALUES(1234),(5678);     //插入测试记录
    Query OK, 2 rows affected (0.02 sec)
    Records: 2 Duplicates: 0 Warnings: 0
    mysql> SELECT * FROM tab1;                     //确认添加的表记录
    +------+
    |  id   |
    +------+
    | 1234 |
    | 5678 |
    +------+
    2 rows in set (0.02 sec)

然后从客户机访问sql2,确认结果(能看到从sql1上所建的库、表、表记录):

    [iyunv@client~]# mysql -u user -h 192.168.4.7 -p
    Enter password:                                 //验证口令
    .. ..
    mysql> SHOW DATABASES;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | ndbinfo            |
    | performance_schema |
| test               |
| testdb                        |                             //确认可看到testdb库
    +--------------------+
    6 rows in set (0.13 sec)
    mysql> USE testdb;                                 //切换到testdb库
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    Database changed
    mysql> SELECT * FROM tab1;                     //查看表记录也一致
    +------+
    | id   |
    +------+
    | 1234 |
    | 5678  |
    +------+
    2 rows in set (0.09 sec)

反过来从sql2上所作的数据库表操作,从sql1上也能获得相同的结果。

2)高可用性测试(关闭一台数据节点)

关闭数据节点ndb1上的ndbd进程:
[iyunv@ndb1 ~]# netstat -anpt | grep ndbd             //正常运行时
tcp        0      0 192.168.4.4:37869           0.0.0.0:*                   LISTEN      2092/ndbd           
tcp        0      0 192.168.4.4:45945           0.0.0.0:*                   LISTEN      2092/ndbd           
tcp        0      0 192.168.4.4:38305           0.0.0.0:*                   LISTEN      2092/ndbd           
tcp        0      0 192.168.4.4:45945           192.168.4.5:51824           ESTABLISHED 2092/ndbd           
tcp        0      0 192.168.4.4:38305           192.168.4.6:44646           ESTABLISHED 2092/ndbd           
tcp        0      0 192.168.4.4:37869           192.168.4.7:53096           ESTABLISHED 2092/ndbd           
tcp        0      0 192.168.4.4:33238           192.168.4.3:1186            ESTABLISHED 2091/ndbd           
tcp        0      0 192.168.4.4:33239           192.168.4.3:1186            ESTABLISHED 2092/ndbd
   
[iyunv@ndb1 ~]# killall -9 ndbd                     //强制结束ndbd进程
    [iyunv@ndb1 ~]# netstat -anpt | grep ndbd             //确认已结束

此时从管理节点上查看集群状态,会发现ndb1已断开连接:

    ndb_mgm> show
Cluster Configuration
---------------------
[ndbd(NDB)]2 node(s)     //两个数据节点
id=4@192.168.4.4  (not connected, accepting connect from 192.168.4.4)
id=5@192.168.4.5  (mysql-5.6.14 ndb-7.3.3, Nodegroup: 0, *)

[ndb_mgmd(MGM)]1 node(s)     //一个管理节点
id=3@192.168.4.3  (mysql-5.6.14 ndb-7.3.3)

[mysqld(API)]2 node(s)//两个SQL节点
id=6@192.168.4.6  (mysql-5.6.14 ndb-7.3.3)
id=7 @192.168.4.7  (mysql-5.6.14 ndb-7.3.3)


然后从客户机访问sql1或sql2,仍然可读、写数据库。比如可向mydb.mytb表中再添加一条记录:

    mysql> INSERT INTO testdb.tab1 VALUES(1236);     //添加一条表记录
    Query OK, 1 row affected (0.00 sec)
    mysql> SELECT * FROM testdb.tab1;                 //确认结果
    +------+
    | id      |
    +------+
    | 1234 |
    | 1236 |
    | 5678 |
    +------+
    3 rows in set (0.00 sec)

以上测试成立说明:只要还有一台数据节点可用,MYSQL数据库整体就仍然可用。

接下来可进一步验证故障恢复过程。重新启动ndb1上的ndbd服务进程,稍待片刻后强制关闭ndb2上的ndbd服务进程。然后再次访问sql1或sql2节点,查询tab1表的记录,发现与前面添加的结果一致:
    [iyunv@ndb1 ~]# ndbd
2014-09-05 21:15:17 [ndbd] INFO     -- Angel connected to '192.168.4.3:1186'
2014-09-05 21:15:17 [ndbd] INFO     -- Angel allocated nodeid: 4
[iyunv@ndb2 ~]# killall -9 ndbd
[iyunv@ndb2 ~]# netstat -anptu | grep ndb

[iyunv@client ~]# mysql -uuser -h 192.168.4.7 -p123456
    mysql> SELECT * FROM testdb.tab1;                 //确认结果
+------+
| id      |
+------+
| 1234 |
| 1236 |
| 5678 |
+------+

    3 rows in set (0.00 sec)

以上测试成立说明:因故障中断的数据节点(ndb1)恢复后,会立即从正常的数据节点(sql2)同步数据,确保数据一致性。

3)高可用性测试(关闭一台SQL节点)
当MySQL集群内有多个SQL节点时,只要有一台SQL节点可用,就可以通过它来访问MySQL数据库中保存的表数据。
比如说,关闭sql1、sql2中的任何一台以后,还可以通过另外一台来访问mydb库。
[iyunv@sql1 ~]# netstat -anptu | grep mysql
tcp        0      0 192.168.4.6:44646           192.168.4.4:38305           ESTABLISHED 1545/mysqld         
tcp        0      0 192.168.4.6:38400           192.168.4.3:1186            ESTABLISHED 1545/mysqld         
tcp        0      0 192.168.4.6:35859           192.168.4.5:43959           ESTABLISHED 1545/mysqld         
tcp        0      0 :::3306                     :::*                        LISTEN   
[iyunv@sql1 ~]# service mysql stop
Shutting down MySQL.... SUCCESS!
[iyunv@sql1 ~]# netstat -anptu | grep mysql
[iyunv@client ~]# mysql -uuser -h192.168.4.6 -p
Enter password:
ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.4.6' (111)  //sql1出故障,不能登录
[iyunv@client ~]# mysql -uuser -h192.168.4.7 -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 6
Server version: 5.6.14-ndb-7.3.3-cluster-gpl MySQL Cluster Community Server (GPL)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

mysql> show databases;                  //sql2可以正常访问
+-------------------------+
| Database                   |
+-------------------------+
| information_schema   |
| mysql                       |
| ndbinfo                     |
| performance_schema |
| test                           |
| testdb                       |
+------------------------+
6 rows in set (0.00 sec)





四、问题和经验总结
测试的过程中会出现各种问题,要耐心调试才行。所有问题的出现都是有原因的,出现问题后看报错,找日志可以快速定位造成问题的地方,然后根据提示信息,找到原因。不看日志,盲目地重启服务,重启电脑,即使偶尔解决了,也不会从中得到什么。
下面是我测试过程中,收集的一些问题:

问题1:
[iyunv@sql2 ~]# /etc/init.d/mysql restart
MySQL server PID file could not be found!                  [失败]
Starting MySQL..........................................................................................................................................................................................................................^C     //实在等不下去了,只能ctrl+c中断

这个问题经常出现,而且造成这种情况的原因比较多,在强制杀掉mysqld进程的时候会出现,在没有关闭mysql服务的情况下修改hostname的时候也会出现,等等情况。我做法是先查看是否有mysqld的残留进程,然后统统杀掉,再重启服务,一般的情况下会奏效,不奏效只能去看错误日志了。


问题2
如果管理节点上显示下面的数据节点后面两个都没有“*”,有可能是数据节点的selinux没有关掉。
ndb_mgm> show
Cluster Configuration
---------------------
[ndbd(NDB)]2 node(s)
id=4@192.168.4.4  (mysql-5.6.14 ndb-7.3.3, Nodegroup: 0)
id=5@192.168.4.5  (mysql-5.6.14 ndb-7.3.3, Nodegroup: 0)

问题3
出现数据节点连接不上管理节点,如下
[iyunv@ndb1 mysql]# ndbd --initial
2014-09-05 22:59:29 [ndbd] INFO     -- Angel connected to '192.168.4.3:1186'
2014-09-05 23:00:00 [ndbd] ERROR    -- Failed to allocate nodeid, error: 'Error: Could not alloc node id at 192.168.4.3 port 1186: No free node id found for ndbd(NDB).'
这是可能是因为你的ndbd进程已经在运行,在管理节点上已经没有可以供分配的节点id了。
在数据节点上查看进程正常就可以了,这个错误可以忽略。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-24565-1-1.html 上篇帖子: CentOS卸载MySQL的方法 yum remove xxx 下篇帖子: mysql主主复制+keepalived 打造高可用mysql集群 Linux
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表