MySQL 集群

集群是在复制上的另一个 概念, 每一个角色都可以单独的存在,可以读和写

为什么需要分布式数据库

    随着计算机和信息技术的迅猛发展和普及,行业应用系统的规模迅速扩大,行业应用所产生的数据量量呈爆炸式增长,动辄达到数百TB甚至数百PB规模,已远远超出现有的传统计算技术和信息系统的处理能力,而集中式数据库面对大规模数据处理逐渐表现出其局限性,因此,人们希望寻找一种能快速处理数据和及时响应用户访问的方法,也希望对数据进行集中分析、管理和维护。这已成为现实世界的迫切需求。

    分布式数据库是在集中式数据库的基础上发展起来的,是计算机技术和网络技术结合的产物。分布式数据库是指数据在物理上分布而逻辑上集中管理的数据库系统。物理上分布指的是分布式数据库的数据分布在物理位置不同并由网络连接的节点或站点上;逻辑上集中是指各数据库之间在逻辑上是一个整体,并由统一的数据库管理系统管理。不同的节点分布可以跨不同的机房、城市甚至国家。

    分布式数据库的主要特点如下:

  1. 透明性:用户不必关心数据的逻辑分区和物理位置的分布细节,也不必关心重复副本(冗余数据)的一致性问题,同时不必关心在局部场地上数据库支持哪种数据模型。对于系统开发工程师而言,当数据从一个场地移到另一个场地时不必改写应用程序,使用起来如同一个集中式数据库。
  2. 数据冗余性:分布式数据库通过冗余实现系统的可靠性、可用性,并改善其性能。多个节点存储数据副本,当某一节点的数据遭到破坏时,冗余的副本可保证数据的完整性;当工作的节点受损害时,可通过心跳等机制进行切换,系统整体不被破坏。还可以通过热点数据的就近分析原则减少网络通信的消耗,加快访问速度,改善性能。
  3. 易于扩展性:在分布式数据库中能够方便地通过水平扩展提高系统的整体性能,也能通过垂直扩展来提供性能,扩展并不需要修改系统程序。
  4. 自治性:各节点上的数据由本地的DBMS管理,具有自动处理能力,完成本场地的应用或局部应用。

 MySQL Cluster
 MySQL Cluster是MySQL官网自带的一种集群工具和模型他的原理是

 MySQL 集群是 MySQL 适合于分布式计算环境的高可用、高冗余版本。它采用了 NDB Cluster 存储引擎,允许在 1 个集群中运行多个 MySQL 服务器。在 MySQL 5.0 及以上的二进制版本中,以及与最新的 Linux 版本兼容的 RPM 包中提供了该存储引擎。

    MySQL集群是一种技术,该技术允许在无共享的系统中部署“内存中”和“磁盘中”数据库的 Cluster 。通过无共享体系结构,系统能够使用廉价的硬件,而且对软硬件无特殊要求。此外,由于每个组件有自己的内存和磁盘,不存在单点故障。MySQL Cluster 由一组计算机构成,每台计算机上均运行着多种进程,包括 MySQL 服务器,NDB Cluster 的数据节点,管理服务器,以及(可能存在的)专门的数据访问程序。

管理服务器(MGM节点)负责管理 Cluster 配置文件和 Cluster 日志。Cluster 中的每个节点从管理服务器检索配置数据。

当数据节点内出现新的事件时,节点将关于这类事件的信息传输到管理服务器,然后,将这类信息写入 Cluster 日志。

目前能够运行 MySQL Cluster 的操作系统有 Linux、Mac OS X 和 Solaris,最新的版本已经支持 Windows 操作系统。

MySQL 群集的数据节点之间的通信是不加密的,并且需要高速的带宽,所以建议把群集建立在一个高速局域网内,不建议跨网段、跨公网的部署这种系统体系。

MySQL 集群分为三种节点:管理节点,数据节点和SQL节点。

  1. 管理节点:主要用于管理各个节点,能够通过命令对某个节点进行重启、关闭、启动等操作。也能够监视全部节点的工作状态。
  2. 数据节点:主要是对数据的存储,不提供其他的服务。
  3. SQL节点:主要是对外提供SQL功能,类似一台普通的 MySQL Server。
    而SQL节点和数据节点可以是同一台机器,也就是说这台机器即是SQL节点也是数据节点。它们只是逻辑关系上的划分,实际部署时,甚至所有的阶段都可以位于同一台物理机器上,只是配置较复杂些 。

MySQL Cluster的优缺点

优点:

  1. 99.999 %的高可用性
  2. 快速的自动失效切换
  3. 灵活的分布式体系结构,没有单点故障
  4. 高吞吐量和低延迟
  5. 可扩展性强,支持在线扩容

缺点:

  1. 存在很多限制,比如:不支持外键,数据行不能超过8K(不包括BLOB和text中的数据)
  2. 部署、管理、配置很复杂
  3. 占用磁盘空间大,内存大
  4. 备份和恢复不方便
  5. 重启的时候,数据节点将数据load到内存需要很长时间

基于Galera+MyCat 的高可用集群部署

Galera Cluster的工作流程模式

环境准备:/etc/hosts
192.168.1.2 client
192.168.1.3 proxy1
192.168.1.4 proxy2
192.168.1.5 mysql1
192.168.1.6 mysql2
192.168.1.7 mysql3
1)关闭SELinux
2)关闭防火墙
3)ntp同步时间 ntpdate time1.aliyun.com
4)主机之间相互做好上面的解析 /etc/hosts

安装Galera
官网下载 下载 Galera 源, 这是一种补丁包,包含了数据库,所以我们也可以不需要安装Mysql 直接从官方源下载打了 Galera 集群补丁的mysql

官方文档说明

配置Yum源

启用yum存储库

对于基于RPM的发行版,例如CentOS,Red Hat和Fedora,您可以通过将galera.repo文件添加到/etc/yum.repos.d/目录来启用Codership存储库。

使用您喜欢的文本编辑器,创建galera.repo文件。

[galera]
name = Galera
baseurl = https://releases.galeracluster.com/galera-3/DIST/RELEASE/ARCH
gpgkey = https://releases.galeracluster.com/GPG-KEY-galeracluster.com
gpgcheck = 1

[mysql-wsrep]
name = MySQL-wsrep
baseurl =  https://releases.galeracluster.com/mysql-wsrep-VERSION/DIST/RELEASE/ARCH
gpgkey = https://releases.galeracluster.com/GPG-KEY-galeracluster.com
gpgcheck = 1

在该baseurl字段中,对网址进行以下更改:

VERSION指示所需的MySQL-wsrep版本。例如,5.6
DIST指示分发名称。例如,centos或fedora。
RELEASE指示发行版本号。例如,6对于CentOS 20或21Fedora。
ARCH指示硬件的体系结构。例如,x86_64对于64位系统。
现在可以通过下载安装Codership存储库中的软件包yum。
[root@mysql1 ~]# yum list | grep -E "wsrep|galera"
galera.x86_64 25.3.12-2.el7 epel
galera-3.x86_64 25.3.24-2.el7 galera
mysql-wsrep-5.7.x86_64 5.7.23-25.15.el7 mysql_wsrep
mysql-wsrep-client-5.7.x86_64 5.7.23-25.15.el7 mysql_wsrep
mysql-wsrep-common-5.7.x86_64 5.7.23-25.15.el7 mysql_wsrep
mysql-wsrep-devel-5.7.x86_64 5.7.23-25.15.el7 mysql_wsrep
mysql-wsrep-libs-5.7.x86_64 5.7.23-25.15.el7 mysql_wsrep
mysql-wsrep-libs-compat-5.7.x86_64 5.7.23-25.15.el7 mysql_wsrep
mysql-wsrep-server-5.7.x86_64 5.7.23-25.15.el7 mysql_wsrep
mysql-wsrep-test-5.7.x86_64 5.7.23-25.15.el7 mysql_wsrep
[root@mysql1 ~]# yum -y install mysql-wsrep-5.7.x86_64 galera-3.x86_64
此处可以只在一台机器上做,然后开启缓存(keepcache=1),下载下来包之后,可以选择搭建一个ftp服务器,另外两台机器直接做一个yum此处的源即可安装

开启数据库服务

[root@mysql1 ~]# systemctl start mysqld
[root@mysql1 ~]# systemctl enable mysqld
[root@mysql1 ~]# newpass=`grep "temporary password" /var/log/mysqld.log | awk '{print $NF}'`
[root@mysql1 ~]# mysqladmin -p"$newpass" password 'admin1234.'

创建并授权用于数据同步的用户

[root@mysql1 ~]# mysql -p'admin1234.'
mysql> grant all on *.* to galera@'192.168.1.%' identified by 'admin1234.';
mysql> flush privileges;  这里依旧采用网段授权的方式

配置galera

[root@mysql1 ~]# vim /etc/my.cnf
 
server_id=1                      //每个节点的server_id不同
binlog_format=row
default_storage_engine=InnoDB
innodb_file_per_table=1
innodb_autoinc_lock_mode=2

wsrep_on=on
wsrep_provider=/usr/lib64/galera-3/libgalera_smm.so  // 先确认下是不是在这个文件夹中
wsrep_cluster_name="galer"     // galer集群的名字
wsrep_cluster_address="gcomm://"      通信的地址//后两个节点要在//后添加另外两台的ip,做了解析可以直接写主机名,逗号分隔
wsrep_node_name="galera1"             //节点名,不要重复
wsrep_node_address="192.168.1.5"     //每个节点的ip
wsrep_sst_auth=admin:admin1234.    //前面授权的账号和密码
wsrep_sst_method=rsync

注释:
wsrep_on=on:启用wsrep,=on或者=1都可以
wsrep_provider:指定集群同步数据使用的库文件,// 先确认下模块路径
wsrep_cluster_name:自定义集群的名字
wsrep_cluster_address:mysql节点加入集群需要的地址,第一个节点的写法比较特通信的地址//后两个节点要在//后添加另外两台的ip,做了解析可以直接写主机名,逗号分隔
wsrep_node_name:指定集群节点名称,一般写本机的主机名即可
wsrep_node_address:指定本机地址
wsrep_sst_auth:指定三台服务器之间进行数据同步时使用的帐号和密码,需要创建
wsrep_sst_method:数据复制的两种方式:rsync和xtrabackup,rsync是系统自带,比较常用。libgalera_smm.so库只是提供了复制的功能,而真正进行数据同步时要靠rsync机制实现

如果没有rsync 则需要安装
[root@mysql1 ~]# yum -y install rsync
[root@mysql1 ~]# systemctl restart mysqld
[root@mysql1 ~]# ss -antp | grep -E "3306|4567"
LISTEN 0 128 *:4567 *:* users:(("mysqld",pid=17071,fd=12))
ESTAB 0 0 10.30.162.72:4567 10.30.162.73:35708 users:(("mysqld",pid=17071,fd=55))
ESTAB 0 0 10.30.162.72:4567 10.30.162.75:55016 users:(("mysqld",pid=17071,fd=41))
LISTEN 0 80 :::3306 :::* users:(("mysqld",pid=17071,fd=27))

三个mysql都需要照以上配置

三个节点配置完成之后,可以通过如下命令查询是否成功
[root@mysql1 ~]# mysql -p'admin1234.'
mysql> show status like "wsrep%";

安装mycat

下载JDK
[root@tomcat1 ~]# tar xf jdk-8u181-linux-x64.tar.gz -C /usr/local/
[root@tomcat1 ~]# ln -s /usr/local/jdk1.8.0_181/ /usr/local/java
[root@tomcat1 ~]# vim /etc/profile
export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin
[root@tomcat1 ~]# source /etc/profile
[root@tomcat1 ~]# java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

安装mycat
[root@proxy1 ~]# wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
[root@proxy1 ~]# tar xf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local

创建库,并且授权给mycat一个账户

[root@mysql1 ~]# mysql -p'admin1234.'
mysql> create database galera;
mysql> grant all on galera.* to mycat@'192.168.1.%' identified by 'admin1234.';
mysql> flush privileges;

配置mycat

[root@proxy1 ~]# cd /usr/local/mycat/conf/
[root@proxy1 conf]# vim server.xml
...
<user name="galera">
<property name="password">123456</property>
<property name="schemas">galera_test</property>
</user>
...
[root@proxy1 conf]# vim schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="">http://io.mycat/">
 
<schema name="galera_test" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<dataNode name="dn1" dataHost="localhost1" database="galera" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="3" slaveThreshold="100">
<heartbeat>show status like 'wsrep%'</heartbeat>
<writeHost host="galera1" url="192.168.1.5:3306" user="galera"
password="admin1234.">   //上面创建的并授权用于数据同步的用户 
</writeHost>
<writeHost host="galera2" url="192.168.1.6:3306" user="galera"
password="admin1234." >
</writeHost>
<writeHost host="galera3" url="192.168.1.7:3306" user="galera"
password="admin1234." >
</writeHost>
</dataHost>
</mycat:schema>

验证

[root@proxy1 ~]# /usr/local/mycat/bin/mycat start
Starting Mycat-server...
[root@proxy1 ~]# ss -antp | grep java
LISTEN 0 1 127.0.0.1:32000 *:* users:(("java",pid=1665,fd=4),("wrapper-linux-x",pid=1663,fd=4))
LISTEN 0 50 :::1984 :::* users:(("java",pid=1665,fd=55))
LISTEN 0 50 :::41825 :::* users:(("java",pid=1665,fd=54))
LISTEN 0 50 :::44913 :::* users:(("java",pid=1665,fd=56))
[root@proxy1 ~]# jps  //java查看进程的命令
1350 WrapperSimpleApp
1367 Jps

keepalived

安装keepalived
[root@proxy1 ~]# yum -y install keepalived
配置keepalived
[root@proxy1 ~]# vim /etc/keepalived/keepalived.conf
Configuration File for keepalived
 
global_defs {
    router_id galera1
}
 
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.10
    }
}
 
virtual_server 192.168.1.10 80 {
    delay_loop 3
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP
 
    real_server 192.168.1.5 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
        }
    }
    real_server 192.168.1.6 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
        }
    }
    real_server 192.168.1.7 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
        }
    }
}                      

BACKUP端

修改router_id priority state
[root@proxy1 ~]# systemctl restart keepalived
验证
[root@proxy1 ~]# ip a | grep ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.1.3/24 brd 10.30.162.255 scope global noprefixroute dynamic ens33
inet 192.168.1.10/32 scope global ens33
 
[root@physical ~]# mysql -ugalera -p123456 -h 192.168.1.10 -P8066
mysql> show databases;
+----------------+
| DATABASE       |
+----------------+
| galera_test    |
+----------------+
1 row in set (0.00 sec)
 
mysql> select * from test2;
+---------------+
| id            |
+---------------+
| 100000000     |
+---------------+
1 rows in set (0.01 sec)

编写脚本,达到mycat如果宕机后,尝试重启服务,未启动则关闭keepalived

[root@proxy1 ~]# vim /etc/keepalived/mycat.sh
#/bin/bash
/usr/local/mycat/bin/mycat status &>/dev/null
if [ $? -ne 0 ];then
    /usr/local/mycat/bin/mycat restart &>/dev/null
    sleep 5
    if [ "$state" = "running" ];then
        systemctl restart keepalived
    else
        systemctl stop keepalived
    fi
fi
 
[root@proxy1 ~]# chmod +x /etc/keepalived/mycat.sh
[root@proxy1 ~]# vim /etc/keepalived/keepalived.conf
···
vrrp_script check_mycat {
    script "/etc/keepalived/mycat.sh"
    interval 5
}
track_script {
    check_mycat
}
···

[root@mysql1 ~]# vim /etc/my.cnf
max_allowed_packet=16M
[root@mysql1 ~]# systemctl restart mysqld

如果将三台数据库服务器都宕机了,想要再启动的话,会报如下错误

[root@mysql1 ~]# vim /var/lib/mysql/grastate.dat
safe_to_bootstrap: 1
修改完第一个节点,第一个节点起来后,再重启其他两个节点,即可启动

第一个节点因为没有"推荐人",所以一旦他宕机,如果想要让它重新加入到之前的集群中,必须
在它的推荐人填上另外机器的ip(解析的话,可以直接填解析名)

发表评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据