最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

MySQL的GaleraCluster配置说明

来源:懂视网 责编:小采 时间:2020-11-09 15:16:56
文档

MySQL的GaleraCluster配置说明

MySQL的GaleraCluster配置说明:Galera Cluster介绍 Galera是一个MySQL(也支持MariaDB,Percona)的同步多主集群软件,目前只支持InnoDB引擎。 主要功能: 同步复制 真正的multi-master,即所有节点可以同时读写数据库 自动的节点成员控制,失效节点自动被清除 新节点加入数据自动复制 真正
推荐度:
导读MySQL的GaleraCluster配置说明:Galera Cluster介绍 Galera是一个MySQL(也支持MariaDB,Percona)的同步多主集群软件,目前只支持InnoDB引擎。 主要功能: 同步复制 真正的multi-master,即所有节点可以同时读写数据库 自动的节点成员控制,失效节点自动被清除 新节点加入数据自动复制 真正

Galera Cluster介绍 Galera是一个MySQL(也支持MariaDB,Percona)的同步多主集群软件,目前只支持InnoDB引擎。 主要功能: 同步复制 真正的multi-master,即所有节点可以同时读写数据库 自动的节点成员控制,失效节点自动被清除 新节点加入数据自动复制 真正的

Galera Cluster介绍

Galera是一个MySQL(也支持MariaDB,Percona)的同步多主集群软件,目前只支持InnoDB引擎。



主要功能:

  • 同步复制
  • 真正的multi-master,即所有节点可以同时读写数据库
  • 自动的节点成员控制,失效节点自动被清除
  • 新节点加入数据自动复制
  • 真正的并行复制,行级
  • 用户可以直接连接集群,使用感受上与MySQL完全一致
  • 优势:

    因为是多主,所以不存在Slave lag(延迟)

    不存在丢失交易的情况

    同时具有读和写的扩展能力

    更小的客户端延迟

    节点间数据是同步的,而Master/Slave模式是异步的,不同slave上的binlog可能是不同的

    技术:

    Galera集群的复制功能基于Galera library实现,为了让MySQL与Galera library通讯,特别针对MySQL开发了wsrep API。







    MariaDB介绍

    MariaDB是MySQL的一个分支,由MySQL的创始人Michael Widenius主导开发,采用GPL授权许可。

    开发这个分支的原因之一是Oracle公司收购了MySQL后,有将MySQL闭源的潜在风险,因此社区采用分支的方式来避开这个风险。

    MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。

    在存储引擎方面,使用XtraDB来代替MySQL的InnoDB。

    方案总览

  • haproxy作为MariaDB Galera Cluster的前端
  • 2台haproxy用keepalived避免单点故障
  • 3台MariaDB和一个garbd仲裁节点组成集群,仲裁节点上无数据
  • Galera的SST采用Percona提供的XtraBackup(防止锁表,非阻塞)

  • 环境描述

    OS: CentOS 6.0 64bit

    MariaDB server1:

    192.168.0.171

    MariaDB server2:

    192.168.0.172

    MariaDB server3:

    192.168.0.173

    HAProxy server1:

    192.168.0.151

    HAProxy server2:

    192.168.0.152

    HAProxy共享的VIP:

    192.168.0.170

    MySQL root password:

    q1w2e3!@#

    Cluster root username:

    clusteroot

    Cluster root password:

    q1w2e3!@#

    Galera SST user:

    sst

    Galera SST password:

    sstpass123

    环境准备

    以下操作以MariaDB server1为示例。

    1.准备hosts文件

    编辑上述每台服务器的/etc/hosts,添加如下内容:

    192.168.0.151 haproxy1.cluster.local haproxy1

    192.168.0.152 haproxy2.cluster.local haproxy2

    192.168.0.171 galera1.cluster.local galera1

    192.168.0.172 galera2.cluster.local galera2

    127.0.0.1 localhost.localdomain localhost

    ::1 localhost6 localhost6.localdomain

    2.安装163,epel,Percona,MariaDB的YUM源

    [root@mdb-01 ~]# wget http://mirrors.163.com/.help/CentOS6-Base-163.repo

    [root@mdb-01 ~]# rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

    [root@mdb-01 ~]# cat CentOS6-Base-163.repo > /etc/yum.repos.d/CentOS-Base.repo

    [root@mdb-01 ~]# vi /etc/yum.repos.d/MariaDB.repo

    # MariaDB 5.5 CentOS repository list - created 2013-05-16 01:58 UTC

    # http://mariadb.org/mariadb/repositories/

    [mariadb]

    name = MariaDB

    baseurl = http://yum.mariadb.org/5.5/centos6-amd64

    gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB

    gpgcheck=1

    [root@mdb-01 ~]# rpm --import https://yum.mariadb.org/RPM-GPG-KEY-MariaDB

    [root@mdb-01 ~]# vi /etc/yum.repos.d/Percona.repo

    [percona]

    name = CentOS $releasever - Percona

    baseurl=http://repo.percona.com/centos/$releasever/os/$basearch/

    enabled = 1

    gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-percona

    gpgcheck = 1

    [root@mdb-01 ~]# wget -O /etc/pki/rpm-gpg/RPM-GPG-KEY-percona http://www.percona.com/downloads/RPM-GPG-KEY-percona

    [root@mdb-01 ~]# yum makecache

    Galera Cluster的配置

    1.安装MariaDB、galera、xtrabackup

    [root@mdb-01 ~]# rpm -e --nodeps mysql-libs

    [root@mdb-01 ~]# yum install MariaDB-Galera-server galera MariaDB-client xtrabackup

    2.设置开机启动MariaDB

    [root@mdb-01 ~]# chkconfig mysql on

    [root@mdb-01 ~]# service mysql start

    3.设置MariaDB的root密码,并做安全加固

    [root@mdb-01 ~]# /usr/bin/mysql_secure_installation

    4.确认MariaDB已正确安装并处于运行状态

    [root@mdb-01 ~]# mysql -u root -p

    Enter password:

    Welcome to the MariaDB monitor. Commands end with ; or \g.

    Your MariaDB connection id is 11

    Server version: 5.5.29-MariaDB MariaDB Server, wsrep_23.7.3.rXXXX

    Copyright (c) 2000, 2013, Oracle, Monty Program Ab and others.

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

    MariaDB [(none)]>

    注意查看是否有"wsrep_23.7.3.rXXXX"的输出。

    5.创建用于同步数据库的SST帐号

    [root@mdb-01 ~]# mysql -u root -p

    mysql> GRANT USAGE ON *.* to sst@'%' IDENTIFIED BY 'sstpass123';

    mysql> GRANT ALL PRIVILEGES on *.* to sst@'%';

    mysql> FLUSH PRIVILEGES;

    mysql> quit

    6.创建wsrep.cnf文件

    [root@mdb-01 ~]# cp /usr/share/mysql/wsrep.cnf /etc/my.cnf.d/

    [root@mdb-01 ~]# vi /etc/my.cnf.d/wsrep.cnf

    只需要修改如下4行:

    wsrep_provider=/usr/lib64/galera/libgalera_smm.so

    wsrep_cluster_address="gcomm://"

    wsrep_sst_auth=sst:sstpass123

    wsrep_sst_method=xtrabackup

    注意:

    "gcomm://" 是特殊的地址,仅仅是Galera cluster初始化启动时候使用。

    如果集群启动以后,我们关闭了第一个节点,那么再次启动的时候必须先修改

    "gcomm://"为其他节点的集群地址,例如

    wsrep_cluster_address="gcomm://192.168.0.172:4567"

    7.在/etc/my.cnf中加入如下一行

    !includedir /etc/my.cnf.d/

    8.确认本机防火墙上开放了所需TCP 3306和TCP 4567的端口

    [root@mdb-01 ~]# iptables -A INPUT -i eth0 -p tcp --dport 3306 -j ACCEPT

    [root@mdb-01 ~]# iptables -A INPUT -i eth0 -p tcp --dport 4567 -j ACCEPT

    9.重起MariaDB服务

    [root@mdb-01 ~]# /etc/init.d/mysql restart

    10.确认MySQL的3306端口和wsrep的4567端口处于监听状态

    [root@mdb-01 ~]# netstat -tulpn | grep -e 4567 -e 3306

    tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 8977/mysqld

    tcp 0 0 0.0.0.0:4567 0.0.0.0:* LISTEN 8977/mysqld

    至此,集群的第一个节点配置完毕。

    11.为集群增加其他节点

    在Galera Cluster中,新接入的节点叫Joiner,给joiner提供复制的节点叫Donor。



    对于生产环境使用,建议设立一个专用的"参考节点",这个"参考节点"不执行任何客户端的SQL请求。


    上图中红色的NODE A即为"参考节点",这样做的好处有如下几条:

    1.数据一致性:

    因为"参考节点"本身不执行任何客户端SQL,所以在这个节点上发生transaction冲突的可能性最小。

    因此如果发现集群有数据不一致的时候,"参考节点"上的数据应该是集群中最准确的。

    2.数据安全性:

    因为"参考节点"本身不执行任何客户端SQL,所以在这个节点上发生灾难事件的可能性最小。

    因此当整个集群宕掉的时候,"参考节点"应该是恢复集群的最佳节点。

    3.高可用

    "参考节点"可以作为专门state snapshot donor。

    因为"参考节点"不服务于客户端,因此当使用此节点进行SST的时候,不会影响用户体验,并且前端的负载均衡设备也不需要重新配置。

    构造如上图的结构,新节点的操作步骤如下:

    1.按照上述1-9的步骤安装MariaDB和Galera library

    2.除了第5步wsrep_cluster_address的配置稍有不同:

    wsrep_cluster_address="gcomm://Node-A-IP:4567"

    3.重起MariaDB

    4.按上述步骤配置下一个节点,将其wsrep_cluster_address指向其前一个节点,例如:

    Node C -> Node B, Node D -> Node C, … , Node N -> …

    5.配置Node A重新加入集群,修改/etc/my.cnf.d/wsrep.cnf中的wsrep_cluster_address地址指向Node N。

    wsrep_cluster_address="gcomm://Node-N-IP:4567"

    修改节点的wsrep_cluster_address有两种方式:

    1)修改配置文件中的wsrep_cluster_address,然后重启MySQL

    2)直接修改MySQL全局变量

    mysql> SHOW VARIABLES LIKE 'wsrep_cluster_address';

    +-----------------------+----------------------------+

    | Variable_name | Value |

    +-----------------------+----------------------------+

    | wsrep_cluster_address | gcomm://192.168.0.172:4567 |

    +-----------------------+----------------------------+

    1 row in set (0.00 sec)

    mysql> set global wsrep_cluster_address="gcomm://192.168.0.172:4567,192.168.0.173:4567";

    Query OK, 0 rows affected (2.20 sec)

    mysql> SHOW VARIABLES LIKE 'wsrep_cluster_address';

    +-----------------------+-------------------------------------------------------+

    | Variable_name | Value |

    +-----------------------+-------------------------------------------------------+

    | wsrep_cluster_address | gcomm://192.168.0.172:4567,192.168.0.173:4567 |

    +-----------------------+-------------------------------------------------------+

    1 row in set (0.00 sec)

    12.确认galera集群正确安装和运行

    [root@mdb-01 ~]# mysql -u root -p


    wsrep_ready 为ON,则说明MariaDB Galera集群已经正确运行了。

    wsrep_cluster_size 标明了组成集群的节点个数。

    13.给集群加入Galera arbitrator

    对于只有2个节点的Galera Cluster和其他集群软件一样,需要面对极端情况下的"脑裂"状态。

    为了避免这种问题,Galera引入了"arbitrator(仲裁人)"。

    "仲裁人"节点上没有数据,它在集群中的作用就是在集群发生分裂时进行仲裁,集群中可以有多个"仲裁人"节点。

    "仲裁人"节点加入集群的方法很简单,运行如下命令即可:

    [root@arbt ~]# garbd -a gcomm://192.168.0.171:4567 -g my_wsrep_cluster -d

    参数说明:

    -d 以daemon模式运行

    -a 集群地址

    -g 集群名称

    Haproxy的相关配置

    1.创建用于后端MySQL服务器健康检查的数据库帐号

    haproxy现在支持option mysql-check,这个检查会向后端服务器发送2个包,一个用于客户端认证,一个用于关闭连接。这个检查需要在每个节点上都需要创建一个无密码的MySQL帐号。

    [root@mdb-01 ~]# mysql -u root -p

    Enter password:

    mysql> INSERT INTO mysql.user (host,user) values ('%','haproxy');

    mysql> FLUSH PRIVILEGES;

    mysql> quit

    2.编译haproxy和keepalived(过程略,可参考我这篇博文:http://blog.sina.com.cn/s/blog_704836f40101gm11.html)

    3.配置keepalived(此处只列出Master的配置)

    vrrp_script chk_haproxy {
    script "killall -0 haproxy" # verify the pid is exist or not
    interval 2 # check every 2 seconds
    weight 2 # add 2 points of prio if OK
    }

    vrrp_instance VI_1 {
    interface eth0 # interface to monitor
    state MASTER
    virtual_router_id 51 # Assign one ID for this route
    priority 101 # 101 on master, 100 on backup
    virtual_ipaddress {
    192.168.0.170 # the virtual IP
    }
    track_script {
    chk_haproxy
    }
    }

    4.配置haproxy

    defaults
    log global
    mode http
    retries 3
    option redispatch
    maxconn 4096
    contimeout 50000
    clitimeout 50000
    srvtimeout 50000

    listen mysql_proxy 0.0.0.0:3306
    mode tcp
    balance roundrobin
    option tcpka
    option httpchk
    option mysql-check user haproxy
    server galera1 192.168.0.171:3306 weight 1
    server galera2 192.168.0.172:3306 weight 1

    其他相关

    1.Galera Cluster部署的前置检查

    在要转成Galera Cluster的数据库上执行如下SQL语句:

    SELECT DISTINCT
    CONCAT(t.table_schema,'.',t.table_name) as tbl,
    t.engine,
    IF(ISNULL(c.constraint_name),'NOPK','') AS nopk,
    IF(s.index_type = 'FULLTEXT','FULLTEXT','') as ftidx,
    IF(s.index_type = 'SPATIAL','SPATIAL','') as gisidx
    FROM information_schema.tables AS t
    LEFT JOIN information_schema.key_column_usage AS c
    ON (t.table_schema = c.constraint_schema AND t.table_name = c.table_name
    AND c.constraint_name = 'PRIMARY')
    LEFT JOIN information_schema.statistics AS s
    ON (t.table_schema = s.table_schema AND t.table_name = s.table_name
    AND s.index_type IN ('FULLTEXT','SPATIAL'))
    WHERE t.table_schema NOT IN ('information_schema','performance_schema','mysql')
    AND t.table_type = 'BASE TABLE'
    AND (t.engine <> 'InnoDB' OR c.constraint_name IS NULL OR s.index_type IN ('FULLTEXT','SPATIAL'))
    ORDER BY t.table_schema,t.table_name;

    上述SQL检索数据库,输出不符合使用Galera的表的信息,对应的5个字段顺序为:表,表引擎,是否无主键,是否有全文索引,是否有空间索引。

    找到不符合的原因,对应修改即可。

    2.MySQL Galera监控

    查看MySQL版本: mysql> SHOW GLOBAL VARIABLES LIKE 'version';

    查看wsrep版本: mysql> SHOW GLOBAL STATUS LIKE 'wsrep_provider_version';

    查看wsrep有关的所有变量: mysql> SHOW VARIABLES LIKE 'wsrep%' \G

    查看Galera集群状态: mysql> show status like 'wsrep%';

    监控状态参数说明:

    集群完整性检查:

    wsrep_cluster_state_uuid:在集群所有节点的值应该是相同的,有不同值的节点,说明其没有连接入集群.

    wsrep_cluster_conf_id:正常情况下所有节点上该值是一样的.如果值不同,说明该节点被临时"分区"了.当节点之间网络连接恢复的时候应该会恢复一样的值.

    wsrep_cluster_size:如果这个值跟预期的节点数一致,则所有的集群节点已经连接.

    wsrep_cluster_status:集群组成的状态.如果不为"Primary",说明出现"分区"或是"split-brain"状况.

    节点状态检查:

    wsrep_ready: 该值为ON,则说明可以接受SQL负载.如果为Off,则需要检查wsrep_connected.

    wsrep_connected: 如果该值为Off,且wsrep_ready的值也为Off,则说明该节点没有连接到集群.(可能是wsrep_cluster_address或wsrep_cluster_name等配置错造成的.具体错误需要查看错误日志)

    wsrep_local_state_comment:如果wsrep_connected为On,但wsrep_ready为OFF,则可以从该项查看原因.

    复制健康检查:

    wsrep_flow_control_paused:表示复制停止了多长时间.即表明集群因为Slave延迟而慢的程度.值为0~1,越靠近0越好,值为1表示复制完全停止.可优化wsrep_slave_threads的值来改善.

    wsrep_cert_deps_distance:有多少事务可以并行应用处理.wsrep_slave_threads设置的值不应该高出该值太多.

    wsrep_flow_control_sent:表示该节点已经停止复制了多少次.

    wsrep_local_recv_queue_avg:表示slave事务队列的平均长度.slave瓶颈的预兆.

    最慢的节点的wsrep_flow_control_sent和wsrep_local_recv_queue_avg这两个值最高.这两个值较低的话,相对更好.

    检测慢网络问题:

    wsrep_local_send_queue_avg:网络瓶颈的预兆.如果这个值比较高的话,可能存在网络瓶

    冲突或死锁的数目:

    wsrep_last_committed:最后提交的事务数目

    wsrep_local_cert_failures和wsrep_local_bf_aborts:回滚,检测到的冲突数目

    参考文档:

    MariaDB和Galera Cluster相关文档

    http://www.alexwilliams.ca/blog/2009/08/10/using-haproxy-for-mysql-failover-and-redundancy/

    https://github.com/olafz/percona-clustercheck

    https://mariadb.com/blog/setup-mariadb-enterprise-cluster-part-3-setup-ha-proxy-load-balancer-read-and-write-pools

    http://www.sebastien-han.fr/blog/2012/04/08/mysql-galera-cluster-with-haproxy/

    http://www.alexwilliams.ca/blog/2009/08/10/using-haproxy-for-mysql-failover-and-redundancy/

    http://blog.secaserver.com/2011/07/install-mysql-replication-and-cluster-using-galera/
    http://weetinyworld.blogspot.tw/2013/04/setting-up-mariadb-galera-cluster-from.html
    http://blog.wu-boy.com/2013/03/galera-cluster-for-mysql-multi-master-replication/
    http://www.sebastien-han.fr/blog/2012/08/29/setup-galera-with-sst-xtrabackup-method/
    http://blog.secaserver.com/2011/07/install-mysql-replication-and-cluster-using-galera/
    http://blog.secaserver.com/2012/02/high-availability-mysql-cluster-galera-haproxy/
    http://www.severalnines.com/resources/clustercontrol-mysql-haproxy-load-balancing-tutorial
    http://opentodo.net/2012/12/mysql-multi-master-replication-with-galera/
    http://www.planetlarg.net/open-source-cookbook/data-storage/replace-mysql-mysql-galera
    http://www.sebastien-han.fr/blog/2012/04/08/mysql-galera-cluster-with-haproxy/
    http://www.zrwm.com/?cat=130
    http://openquery.com/blog/galera-predeployment-check
    http://www.percona.com/files/presentations/percona-live/nyc-2012/PLNY12-galera-cluster-best-practices.pdf
    https://groups.google.com/forum/#!msg/codership-team/OUxATjcznPI/H8ftsjZwptAJ
    http://www.zrwm.com/?p=5844
    http://beerpla.net/2008/09/05/mysql-slave-lag-delay-explained-and-7-ways-to-battle-it/
    http://wiki.vps.net/vps-net-features/cloud-servers/template-information/galeramysql-recommended-cluster-configuration/
    http://haproxy.1wt.eu/download/1.4/doc/configuration.txt

    GTID和mysqlfailover相关文档
    http://scriptingmysql.wordpress.com/2012/12/06/using-the-mysql-script-mysqlfailover-for-automatic-failover-with-mysql-5-6-gtid-replication/
    http://svenmysql.blogspot.se/2012/10/failover-and-flexible-replication.html
    http://svenmysql.blogspot.tw/2012/10/advanced-use-of-global-transaction.html
    http://svenmysql.blogspot.se/2013/03/flexible-fail-over-policies-using-mysql.html
    http://www.percona.com/sites/default/files/presentations/MHA_Toronto_Presentation.pdf
    http://hickey.in/?p=78
    http://dev.mysql.com/doc/refman/5.6/en/replication-gtids-howto.html
    http://huoding.com/2011/04/05/59
    http://www.cnblogs.com/hustcat/archive/2009/12/19/1627525.html
    http://dev.mysql.com/doc/refman/5.5/en/replication-howto-masterstatus.html

    声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文档

    MySQL的GaleraCluster配置说明

    MySQL的GaleraCluster配置说明:Galera Cluster介绍 Galera是一个MySQL(也支持MariaDB,Percona)的同步多主集群软件,目前只支持InnoDB引擎。 主要功能: 同步复制 真正的multi-master,即所有节点可以同时读写数据库 自动的节点成员控制,失效节点自动被清除 新节点加入数据自动复制 真正
    推荐度:
    标签: 详解 说明 配置
    • 热门焦点

    最新推荐

    猜你喜欢

    热门推荐

    专题
    Top