Galera Cluster 实现mysql群集

参考:http://blog.itpub.net/14431099/viewspace-1316643/ 前端

http://lovestoned.blog.51cto.com/2904444/1617817 node

http://www.itbaofeng.com/?p=59 mysql

http://lansgg.blog.51cto.com/5675165/1180305 linux

http://1130739.blog.51cto.com/1120739/1852319 c++

1、MySQL Galera介绍sql

MySQL/Galera是MySQL/InnoDB的多主集群,有如下特性: 数据库

1)同步复制安全

2)Active-active的多主拓扑结构bash

3)集群任意节点能够读和写服务器

4)自动身份控制,失败节点自动脱离集群

5)自动节点接入

6)真正的基于”行”级别和ID检查的并行复制

7)无单点故障,易扩展

二、架构图

 wKioL1Wd32KiRavcAAGodn34Chk758.jpg

2、Galera Cluster安装

一、安装前的准备

    1)须要至少三台mysql服务器,若是只有两台作cluster的话,一旦出现数据不一致的状况,就可能发生脑裂,须要一台仲裁服务器,若是直接三台作cluster的话,就再也不须要仲裁。


    2)若是是对现有环境作galera集群,须要对mysql现有表作检查,包括表,表引擎,是否无主键,是否有全文索引,是否有空间索引:

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;

二、实验环境:

操做系统:Centos6.5-X64

mysql1:192.168.100.6

mysql2:192.168.100.3

mysql3:192.168.100.2

 

三、主机192.168.100.6上面安装相关依赖包:

yum groupinstall -y "Development Tools" "Server Platform Development"

 

四、安装含wsrep patch的mysql版本

yum install -y libaio-devel gcc gcc-c++ boost-devel scons check-devel openssl-devel
wget https://launchpad.net/codership-mysql/5.6/5.6.16-25.5/+download/mysql-5.6.16_wsrep_25.5-linux-x86_64.tar.gz 
tar xf mysql-5.6.16_wsrep_25.5-linux-x86_64.tar.gz 
mv mysql-5.6.16_wsrep_25.5-linux-x86_64 /usr/local/mysql
useradd -s /sbin/nologin -M mysql
mkdir /data/mydata
./scripts/mysql_install_db --no-defaults --datadir=/data/mydata --user=mysql
chown -R mysql.mysql /data/mydata/
chown root.mysql /usr/local/mysql
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

 五、安装galera复制插件

wget https://launchpad.net/galera/3.x/25.3.5/+download/galera-25.3.5-src.tar.gz
tar xf galera-25.3.5-src.tar.gz
cd galera-25.3.5-src
scons
cp garb/garbd /usr/local/mysql/bin
cp libgalera_smm.so /usr/local/mysql/lib/plugin/

 六、编辑mysql配置文件my.cnf

[mysqld]
basedir = /usr/local/mysql
datadir = /data/mydata
port = 3306
server-id=101
socket = /tmp/mysql.sock
pid-file=/data/mydata/mysql.pid
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
wsrep_node_name = mysql1
wsrep_provider = /usr/local/mysql/lib/plugin/libgalera_smm.so
wsrep_sst_method = rsync
#wsrep_sst_auth=sst:sstpass    #使用sst的用户和密码,这里若是开启,须要在mysql上建立该用户,并授予其足够的权限
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
innodb_locks_unsafe_for_binlog=1
innodb_flush_log_at_trx_commit=1
innodb_file_per_table=1
binlog_format=ROW
log-bin=mysql-bin
relay-log=mysql-relay-bin
log-slave-updates=1

 

七、启动mysql

service mysqld start --wsrep_cluster_address=gcomm://

 查看mysqld监听的端口

[root@root ~]# netstat -plantu | grep mysqld
tcp     0      0 0.0.0.0:4567       0.0.0.0:*          LISTEN      3656/mysqld         
tcp     0      0 0.0.0.0:3306       0.0.0.0:*          LISTEN      3656/mysqld

关闭mysql

[root@root ~]# /usr/local/mysql/bin/mysqladmin -uroot -p shutdown

注意:

    1)"gcomm://"是特殊地址,仅仅是galera cluster初始化启动时候使用,再次启动时须要使用具体的ip地址

    2)wsrep默认使用4567端口,mysql启动后,除了检查mysql的3306端口外,还要检查此端口4567.


八、给Galera添加一个新的mysql节点

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

wKioL1WfgrHyuz68AAEIosZ2-XY510.jpg

在生产环境中,建议设置一个专用的donor,这个专用的donor不执行任何来自客户端的SQL请求,这样作有如下几点好处:

好处:

    1)数据的一致性:

        由于donor自己不执行任何客户端SQL,因此在这个节点上发生事务冲突的可能性最小,所以,若是发现集群有数据不一致时,donor上的数据应该是整个集群中最准确的。

    2)数据安全性:

        由于专用donor自己不执行任何客户端SQL,因此在这个节点上发生灾难事件的可能性最小,所以当整个集群宕掉的时候,该节点应该是恢复集群的最佳节点。

    3)高可用性:

        专用donor能够做为专门的state snapshot donor。由于该节点不服务于客户端,所以当使用此节点进行sst的时候,不影响用户体验,而且前端的负载均衡设备也不须要从新配置。


添加的新节点须要知足如下几个条件:

  1)安装带有wsrep patch的mysql版本

  2)安装galera复制插件

  3)配置好新节点的mysql(参考donor的my.cnf)

  4)配置或启动的gcomm://的地址须要使用donor的IP。

 由此,能够参考192.168.100.6配置192.168.100.3,启动mysql以下:

service mysqld start --wsrep_cluster_address="gcomm://192.168.100.6:4567"

 

注意:

指定集群ip的方式有三种:

1)如上所示,在mysql启动时,加--wsrep_cluster_address参数指定

2)在my.cnf中配置wsrep_cluster_address

3)直接修改全局变量:set global wsrep_cluster_address="gcomm://192.168.100.6:4567"

另外须要说明的是,gcomm://的值能够有多个,彼此间用逗号隔开,例:gcomm://192.168.100.6:4567, 192.168.100.2:4567

 

 

九、添加仲裁节点

在只有两台数据库节点的galera集群中,为了解决脑裂问题,须要引入仲裁节点,集群中能够有多个仲裁节点。仲裁节点上没有数据,它仅仅只是在集群发生脑裂时仲裁。能够参考192.168.100.6配置192.168.100.2节点。

仲裁节点加入集群的方法以下:

/usr/local/mysql/bin/garbd -a gcomm://192.168.100.6:4567 -g my_wsrep_cluster -d
-a:指定集群地址
-d:以守护进程的方式运行
-g:集群名称

 

3、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%'

 

 

二、参数说明

 1)集群完整性检查:
    wsrep_cluster_state_uuid:在集群全部节点的值应该是相同的,有不一样值的节点,说明其没有链接入集群.
    wsrep_cluster_conf_id:正常状况下全部节点上该值是同样的.若是值不一样,说明该节点被临时”分区”了.当节点之间网络链接恢复的时候应该会恢复同样的值.
    wsrep_cluster_size:若是这个值跟预期的节点数一致,则全部的集群节点已经链接.
    wsrep_cluster_status:集群组成的状态.若是不为”Primary”,说明出现”分区”或是”split-brain”情况.


 2)节点状态检查:
    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,则能够从该项查看缘由.

 3)复制健康检查:
    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这两个值最高.这两个值较低的话,相对更好.

 

4)检测慢网络问题:
    wsrep_local_send_queue_avg:网络瓶颈的预兆.若是这个值比较高的话,可能存在网络瓶

5)冲突或死锁的数目:
    wsrep_last_committed:最后提交的事务数目
    wsrep_local_cert_failures和wsrep_local_bf_aborts:回滚,检测到的冲突数目

4、Galera状态快照转移(SST)

    SST容许新接入的节点使用定制的方法来获取最初的数据,当前mysql支持三种SST方法:

    一、mysqldump

        这须要接收服务器在转移前彻底初始化和准备接收链接。此方法是经过定义阻塞,阻止修改自身状态转移的持续时间。这也是最慢的方式,可能会带来高负载的问题。

    二、rsync

        最快的方式,也是galera默认使用的方式。rsync脚本运行在发送和接收端上。在接收端,开启rsync服务模式,等待发送端链接。在发送端,开启rsync客户端模式,发送mysql数据目录内容到链接节点。这种方法也会阻塞,可是比mysqldump快。

    三、xtrabackup

        也很快,但须要额外安装。

相关文章
相关标签/搜索