暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL集群搭建实现高可用

一元殿 2019-05-13
471

点击上方“icloud布道师”,“星标或置顶公众号”

逆境前行,能帮你的只有自己


来源 / www.budaoshi.top




MySQL集群概述

MySQL Cluster 是一组计算机构成,适合于分布式计算环境的高实用、高冗余版本。它采用了NDB Cluster 存储引擎,允许在1个 Cluster 中运行多个MySQL服务器。

来源:百度词条\ https://baike.baidu.com/item/MySQL

MySQL Cluster 是一种技术,该技术允许在无共享的系统中部署“内存中”数据库的 Cluster 。通过无共享体系结构,系统能够使用廉价的硬件,而且对软硬件无特殊要求。此外,由于每个组件有自己的内存和磁盘,不存在单点故障。


MySQL集群架构



SQL结点:给上层应用程序提供SQL访问

管理结点:管理整个集群;开启/关闭整个集群,通过nmb mgmd来操作

存储/数据结点:保存cluster的数据;数据结点可以提供副本,实现数据亢余

NDB引擎:是一种内存中的存储引擎;具有高可用和数据一致性的特点



NDB 引擎


NDB引擎:

MySQL Cluster 使用了一个专用的基于内存的存储引擎——NDB引擎,这样做的好处是速度快, 没有磁盘I/O的瓶颈,但是由于是基于内存的,所以数据库的规模受系统总内存的限制, 如果运行NDB的MySQL服务器一定要内存够大,比如4G, 8G, 甚至16G。NDB引擎是分布式的,它可以配置在多台服务器上来实现数据的可靠性和扩展性,理论上 通过配置2台NDB的存储节点就能实现整个数据库集群的冗余性和解决单点故障问题


缺陷:

· 基于内存,数据库的规模受集群总内存的大小限制

· 基于内存,断电后数据可能会有数据丢失,这点还需要通过测试验证。

· 多个节点通过网络实现通讯和数据同步、查询等操作,因此整体性受网络速度影响,因此速度也慢


优点:

· 多个节点之间可以分布在不同的地理位置,因此也是一个实现分布式数据库的方案。

· 扩展性很好,增加节点即可实现数据库集群的扩展。

· 冗余性很好,多个节点上都有完整的数据库数据,因此任何一个节点宕机都不会造成服务中断。



Mysql cluster的下载地址:https://dev.mysql.com/downloads/cluster/



实验环境



在我们做的实验中mysql cluster集群各机器角色如下分配:


mysql 管理节点:cluster.129.cn   IP:192.168.231.129

mysql 数据节点:cluster.130.cn   IP:192.168.231.130

mysql 数据节点:cluster132.cn   IP:192.168.231.132

msyql SQL节点:cluster133.cn   IP:192.168.231.133

msyql SQL节点:cluster134.cn   IP:192.168.231.134


环境清理

这一部分虽然是初始,但是有一点复杂

在所有的主机下面执行以下操作:


首先,清除旧版本的mysql

    [root@bogon ~]# yum remove -y mariadb* mysql*
      [root@bogon ~]# rpm -qa |grep mysql


      然后,清除以下文件

        [root@bogon ~]# rm -rf etc/my.cfg
        [root@bogon ~]# rm -rf  var/lib/mysql/*
        [root@bogon ~]# rm -rf  etc/init.d/mysqld


        然后,打开/etc/profile文件,查看是否有与mysql相关的环境变量,如果有则删去


        安装mysql clunter社区版

        还是在所有的主机下面执行以下操作:



        下载此包;然后传到每台服务器上

          [root@bogon ~]# rz


          然后传到每台服务器上

            [root@bogon ~]# scp mysql80-community-release-el7-3.noarch.rpm  192.168.231.130:~/
            [root@bogon ~]# scp mysql80-community-release-el7-3.noarch.rpm 192.168.231.132:~/
            [root@bogon ~]# scp mysql80-community-release-el7-3.noarch.rpm 192.168.231.133:~/
            [root@bogon ~]# scp mysql80-community-release-el7-3.noarch.rpm 192.168.231.134:~/


            安装epel源

              [root@bogon ~]# yum install epel-release -y


              rpm包安装

                [root@bogon ~]# rpm -ivh mysql80-community-release-el7-3.noarch.rpm


                打开yum源,开启此mysql-clunter源

                  [root@bogon ~]# vim etc/yum.repos.d/mysql-community.repo


                    [mysql-cluster-7.6-community]
                    name=MySQL Cluster 7.6 Community
                    baseurl=http://repo.mysql.com/yum/mysql-cluster-7.6-community/el/7/$basearch/
                    enabled=1
                    gpgcheck=1
                    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql


                    或者批量修改

                       sed -i "63s/0/1/g" etc/yum.repos.d/mysql-community.repo


                      然后刷新yum源

                        [root@bogon ~]# yum clean all&&yum list


                        安装cluster依赖包

                          [root@bogon ~]# yum install -y perl perl-Class-MethodMaker perl-DBI  libaio numactl


                          安装cluster

                            [root@bogon ~]# yum install -y mysql-cluster-community-serve    


                            针对数据结点服务器安装包

                            mysql 数据节点:cluster.130.cn   IP:192.168.231.130

                            mysql 数据节点:cluster132.cn   IP:192.168.231.132

                              [root@bogon ~]# yum install -y mysql-cluster-community-data-node


                              针对管理端安装management管理包

                              mysql 管理节点:cluster.129.cn   IP:192.168.231.129

                                root@bogon ~]# yum -y install mysql-cluster-community-management-server


                                针对管理结点服务器创建文件

                                                       mysql 管理节点:cluster.129.cn   IP:192.168.231.129

                                  [root@bogon ~]# mkdir -p usr/mysql-cluster/



                                  搭建mysql集群



                                  经过复杂的安装配置,接下来搭建cluster


                                  在管理结点创建配置文件

                                                           mysql 管理节点:cluster.129.cn   IP:192.168.231.129

                                    [root@bogon mysql-cluster]# vim usr/mysql-cluster/config.ini
                                      [ndbd default]
                                      NoOfReplicas=2
                                      DataMemory=200M
                                      IndexMemory=100M


                                      [ndb_mgmd]
                                      nodeid=1
                                      datadir=/var/lib/mysql
                                      HostName=192.168.231.129


                                      [ndbd]
                                      HostName=192.168.231.130
                                      DataDir=/var/lib/mysql
                                      nodeid=2


                                      [ndbd]
                                      HostName=192.168.231.132
                                      DataDIR=/var/lib/mysql
                                      nodeid=3


                                      [mysqld]
                                      HostName=192.168.231.133
                                      Datdir=/var/lib/mysql
                                      nodeid=4


                                      [mysqld]
                                      HostName=192.168.231.134
                                      DataDir=/var/lib/mysql
                                      nodeid=5


                                      在这个文件里,我们分别给五个节点分配了ID,这有利于更好的管理和区分各个节点。

                                      当然,要是不指定,MySQL也会动态分配一个


                                      在数据结点创建配置文件

                                      mysql 数据节点:cluster.130.cn   IP:192.168.231.130

                                      mysql 数据节点:cluster132.cn   IP:192.168.231.132

                                      打开配置文件

                                        [root@bogon ~]# mv etc/my.cnf etc/my.bak
                                        [root@bogon ~]# vim /etc/my.cnf

                                        两台配置文件完全一样

                                          [mysql]
                                          datadir=/var/lib/mysql
                                          ndbcluster
                                          ndb-connectstring=192.168.231.129


                                          [mysql_safe]
                                          log-error=/var/log/mysqld.log
                                          pid-file=/var/run/mysqld/mysqld.pid


                                          [mysql_cluster]
                                          ndb-connectstring=192.168.231.129



                                          在SQL结点创建配置文件

                                          msyql SQL节点:cluster133.cn   IP:192.168.231.133

                                          msyql SQL节点:cluster134.cn   IP:192.168.231.134

                                            [root@bogon ~]# mv etc/my.cnf etc/my.bak
                                            [root@bogon ~]# vim /etc/my.cnf
                                              [mysqld]
                                              ndbcluster
                                              ndb-connectstring=192.168.231.129


                                              [mysqld_safe]
                                              log-error=/var/log/mysqld.log
                                              pid-file=/var/run/mysqld/mysqld.pid


                                              [mysql_cluster]
                                              ndb-connectstring=192.168.231.129





                                              启动mysql cluster


                                              初次启动命令以及用户密码更改调整:(请严格按照次序启动)


                                              先启动:管理结点服务->数据结点服务->sql结点服务


                                              执行初次启动前请先确认 将两台机器的防火墙关闭(service iptables stop 或者 设定 防火墙端口可通,两个端口即通讯端口1186、数据端口3306 )


                                              在这次实验,我们默认关闭防火墙

                                                [root@bogon mysql-cluster]# systemctl stop firewalld


                                                启动管理结点服务器

                                                mysql 管理节点:cluster.129.cn   IP:192.168.231.129


                                                  [root@bogon mysql]# ndb_mgmd --ndb_nodeid=1 --initial -f usr/mysql-cluster/config.ini
                                                  MySQL Cluster Management Server mysql-5.7.26 ndb-7.6.10



                                                  启动会报这个错误,我把第四行注释掉了就好了



                                                    [MgmtSrvr] WARNING -- at line 4: [DB] IndexMemory is deprecated, use Number bytes on each ndbd(DB) node allocated for storing indexes instead

                                                    注释掉/usr/mysql-cluster/config.ini中文件中的第四行,

                                                    #indexmemory


                                                    如果再启动报这个错误,说明有日志文件产生进程数据,清空/var/lib/mysql/的文件


                                                      [root@bogon mysql-cluster]# killall nbd_mgmd
                                                      nbd_mgmd: no process found
                                                      不是这个原因


                                                        [root@bogon mysql]# rm -rf /var/lib/mysql/*

                                                        差点写成rm -rf var/lib 所以这个命令还是慎用!


                                                        接下来启动客户端

                                                          [root@bogon mysql]# ndb_mgm


                                                          看到登陆成功


                                                          查看状态

                                                            ndb_mgm> show

                                                              Cluster Configuration
                                                              ---------------------
                                                              [ndbd(NDB)] 2 node(s)
                                                              id=2 (not connected, accepting connect from 192.168.231.130)
                                                              id=3 (not connected, accepting connect from 192.168.231.132)


                                                              [ndb_mgmd(MGM)] 1 node(s)
                                                              id=1 @192.168.231.129 (mysql-5.7.26 ndb-7.6.10)


                                                              [mysqld(API)] 2 node(s)
                                                              id=4 (not connected, accepting connect from 192.168.231.133)
                                                              id=5 (not connected, accepting connect from 192.168.231.134)


                                                              接下来启动数据节点

                                                              mysql 数据节点:cluster.130.cn   IP:192.168.231.130

                                                              mysql 数据节点:cluster132.cn   IP:192.168.231.132

                                                                [root@bogon ~]# ndbd --initial

                                                                  2019-05-10 13:50:09 [ndbd] INFO     -- Angel connected to '192.168.231.129:1186'
                                                                  2019-05-10 13:50:09 [ndbd] INFO     -- Angel allocated nodeid: 2

                                                                  看到连接管理结点服务器成功了


                                                                  我们再返回管理结点看下状态

                                                                  可以看到id=2的服务器开启成功


                                                                  再启动另一台数据结点

                                                                    [root@bogon ~]# ndbd --initial
                                                                    2019-03-28 08:56:56 [ndbd] INFO -- Angel connected to '192.168.231.129:1186'
                                                                    2019-03-28 08:56:56 [ndbd] INFO     -- Angel allocated nodeid: 3

                                                                    连接成功!

                                                                     

                                                                    我们再返回管理结点看下状态

                                                                    可以看到id=2和3的服务器都开启成功



                                                                    接下来启动SQL节点


                                                                    msyql SQL节点:cluster133.cn   IP:192.168.231.133

                                                                    msyql SQL节点:cluster134.cn   IP:192.168.231.134


                                                                      [root@bogon ~]# systemctl start mysqld

                                                                      初始化比较慢,稍微一等

                                                                      现在再查看管理结点状态

                                                                        ndb_mgm> show
                                                                        Cluster Configuration
                                                                        ---------------------
                                                                        [ndbd(NDB)] 2 node(s)
                                                                        id=2 @192.168.231.130 (mysql-5.7.26 ndb-7.6.10, Nodegroup: 0, *)
                                                                        id=3 @192.168.231.132 (mysql-5.7.26 ndb-7.6.10, Nodegroup: 0)


                                                                        [ndb_mgmd(MGM)] 1 node(s)
                                                                        id=1 @192.168.231.129 (mysql-5.7.26 ndb-7.6.10)


                                                                        [mysqld(API)] 2 node(s)
                                                                        id=4 @192.168.231.133 (mysql-5.7.26 ndb-7.6.10)
                                                                        id=5 @192.168.231.134 (mysql-5.7.26 ndb-7.6.10)




                                                                        由于4和5两台机器为新建,忘记关闭selinux,导致sql结点连接不上管理结点!!!

                                                                        找了一天的错误!!!



                                                                        现在进入sql结点服务器的数据库

                                                                        此时的数据库有默认的密码,所以要修改密码!


                                                                        首先找到随机密码

                                                                          [root@bogon ~]# grep password var/log/messages
                                                                            [root@bogon ~]# grep password var/log/messages
                                                                            May 10 14:02:28 bogon mysqld_pre_systemd: 2019-05-10T06:02:28.680228Z 1 [Note] A temporary password is generated for root@localhost: &e&%I%eUy6dd
                                                                            May 10 14:07:05 bogon mysqld: 2019-05-10T06:07:05.024270Z 0 [Note] Shutting down plugin 'validate_password'
                                                                            May 10 14:07:07 bogon mysqld: 2019-05-10T06:07:07.073202Z 0 [Note] Shutting down plugin 'sha256_password'
                                                                            May 10 14:07:07 bogon mysqld: 2019-05-10T06:07:07.073204Z 0 [Note] Shutting down plugin 'mysql_native_password'
                                                                            May 10 14:09:05 bogon mysqld: 2019-05-10T06:09:05.680521Z 0 [Note] Shutting down plugin 'validate_password'
                                                                            May 10 14:09:07 bogon mysqld: 2019-05-10T06:09:07.629116Z 0 [Note] Shutting down plugin 'sha256_password'
                                                                            May 10 14:09:07 bogon mysqld: 2019-05-10T06:09:07.629118Z 0 [Note] Shutting down plugin 'mysql_native_p


                                                                            复制随机密码并登陆数据库

                                                                              [root@bogon ~]# mysql -u root -p'&e&%I%eUy6dd'


                                                                              修改密码:

                                                                              首先要修改密码的复杂度和长度

                                                                                mysql> set global validate_password_policy=0;
                                                                                  mysql> set global validate_password_length=1;


                                                                                  然后修改密码

                                                                                    mysql> set password for root@localhost =password("123456");

                                                                                    刷新权限表

                                                                                      mysql> flush privileges;


                                                                                      然后创建一个登陆账户

                                                                                      在所有的sql结点创建!

                                                                                        mysql> grant all privileges on *.* to cluster@'%' identified by '123456';


                                                                                        刷新权限表

                                                                                          mysql> flush privileges;


                                                                                          模拟外部服务器登陆:

                                                                                            [root@bogon ~]# mysql -u cluster -p123456 -h 192.168.231.133


                                                                                            查看表

                                                                                              mysql> show databases;
                                                                                              +--------------------+
                                                                                              | Database |
                                                                                              +--------------------+
                                                                                              | information_schema |
                                                                                              | mysql |
                                                                                              | ndbinfo |
                                                                                              | performance_schema |
                                                                                              | sys |
                                                                                              +--------------------+
                                                                                              5 rows in set (0.09 sec)



                                                                                              现在是用cluster账号远程登陆sql结点1的数据库


                                                                                              创建测试数据

                                                                                                mysql> create database ah;
                                                                                                Query OK, 1 row affected (0.15 sec)


                                                                                                mysql> use ah
                                                                                                Database changed
                                                                                                mysql> create table test1 (id int)engine=ndb;
                                                                                                Query OK, 0 rows affected (0.37 sec)


                                                                                                mysql> insert into test1 values(10010);
                                                                                                Query OK, 1 row affected (0.64 sec)


                                                                                                查看测试数据

                                                                                                  mysql> select * from test1
                                                                                                  ;
                                                                                                  +-------+
                                                                                                  | id |
                                                                                                  +-------+
                                                                                                  | 10010 |
                                                                                                  +-------+
                                                                                                  1 row in set (0.04 sec)


                                                                                                  现在是在sql2结点查看数据:

                                                                                                    mysql> select * from ah.test1;
                                                                                                    +-------+
                                                                                                    | id |
                                                                                                    +-------+
                                                                                                    | 10010 |
                                                                                                    +-------+
                                                                                                    1 row in set (0.02 sec)


                                                                                                    集群已经生效!


                                                                                                    现在是sql结点2的数据库插入数据

                                                                                                      mysql> insert into test1 values (1333);


                                                                                                      现在是在sq1结点查看数据:

                                                                                                        mysql> select * from test1;
                                                                                                        +-------+
                                                                                                        | id |
                                                                                                        +-------+
                                                                                                        | 10010 |
                                                                                                        | 1333 |
                                                                                                        +-------+
                                                                                                        2 rows in set (0.01 sec)


                                                                                                        集群的任何一台服务器读写都同步!!!



                                                                                                        测试单点故障




                                                                                                        停掉一个sql节点测试单点故障问题

                                                                                                          mysqladmin -uroot -p123456 shutdown


                                                                                                          查看管理结点服务器状态


                                                                                                          可以看到已经模拟挂掉一台sql结点数据库

                                                                                                          现在在好的sql数据库插入数据并查看


                                                                                                            mysql> insert into test1 values(10086);
                                                                                                            Query OK, 1 row affected (0.00 sec)


                                                                                                            mysql> select * from test1;
                                                                                                            +-------+
                                                                                                            | id |
                                                                                                            +-------+
                                                                                                            | 1333 |
                                                                                                            | 10086 |
                                                                                                            | 10010 |
                                                                                                            +-------+
                                                                                                            3 rows in set (0.00 sec)


                                                                                                            测试正常!

                                                                                                            规避单点故障




                                                                                                            关闭cluster集群



                                                                                                            关闭mysql集群顺序: 


                                                                                                            关闭管理节点服务>关闭管理节点时,数据结点服务自动关闭 >关闭SQL结点服务



                                                                                                            mysql 管理节点:cluster.129.cn   IP:192.168.231.129

                                                                                                              ndb_mgm> shutdown
                                                                                                              Node 2: Cluster shutdown initiated
                                                                                                              Node 3: Cluster shutdown initiated
                                                                                                              Node 3: Node shutdown completed.
                                                                                                              Node 2: Node shutdown completed.
                                                                                                              3 NDB Cluster node(s) have shutdown.




                                                                                                              mysql 数据节点:cluster.130.cn   IP:192.168.231.130

                                                                                                              mysql 数据节点:cluster132.cn   IP:192.168.231.132

                                                                                                              这两个结点自动关闭!



                                                                                                              msyql SQL节点:cluster133.cn   IP:192.168.231.133

                                                                                                              msyql SQL节点:cluster134.cn   IP:192.168.231.134


                                                                                                                [root@bogon ~]# mysqladmin -uroot -p123456 shutdown







                                                                                                                以上就是本期全部内容!


                                                                                                                文章转载自一元殿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                                                                                                评论