要点概括

1、关闭iptables 或者设置常用端口为accept(关闭省事)

2、修改/etc/hosts ,设置RSA互信,避免在传文件需要密码

3、使用mariadb或者其他版本的DB带有WSREP功能

4、修改配置文件,在原来初始化的基础上加上WSREP的参数

5、启动第一个节点

6、在第一节点设置其他2节点的连接用户名和密码和配置文件设置一致

7、初始化启动其他节点

8、集群负载均衡和单点故障使用haproxy+keepalived

9、Haproxy+cluster状态检测

10、http://down.51cto.com/data/2257417(配置文件路径)

http://down.51cto.com/data/2257427(全部需要的包和软件)

######

Galera Cluster 是一套基于同步复制的多主MySQL集群解决方案,使用简单,没有单点故障,可用性搞,能很好的保证业务不断增长时,对数据的安全性和随时的扩展。

任何架构的高可用,没有绝对的最优,都有它的局限性,此斯也不例外。

使用前十项注意

1、使用Galera必须要给MySQL-Serverwsrep补丁。可以直接使用官方提供的已经打好补丁的MySQL安装包,如果服务器上已经安装了标准版MYSQL,需要先卸载再重新安装。卸载前注意备份数据。

2MySQL/Galera集群只支持InnoDB存储引擎。如果你的数据表使用的MyISAM,需要转换为InnoDB,否则记录不会在多台复制。可以在备份老数据时,为mysqldump命令添加–skip-create-options参数,这样会去掉表结构的声明信息,再导入集群时自动使用InnoDB引擎。不过这样会将AUTO_INCREMENT一并去掉,已有AUTO_INCREMENT列的表,必须在导入后重新定义。

3MySQL 5.5及以下的InnoDB引擎不支持全文索引(FULLTEXT indexes),如果之前使用MyISAM并建了全文索引字段的话,只能安装MySQL 5.6 with wsrep patch

4、所有数据表必须要有主键(PRIMARY,如果没有主键可以建一条AUTO_INCREMENT列。

5MySQL/Galera集群不支持下面的查询:LOCK/UNLOCK TABLES,不支持下面的系统变量:character_set_serverutf16utf32ucs2

6、数据库日志不支持保存到表,只能输出到文件(log_output = FILE),不能设置binlog-do-dbbinlog-ignore-db

7、跟其他集群一样,为了避免节点出现脑裂而破坏数据,建议Galera集群最低添加3个节点。

8、在高并发的情况下,多主同时写入时可能会发生事务冲突,此时只有一个事务请求会成功,其他的全部失败。可以在写入/更新失败时,自动重试一次,再返回结果。

9、节点中每个节点的地位是平等的,没有主次,向任何一个节点读写效果都是一样的。实际可以配合VIP/LVSHA使用,实现高可用性。

10、如果集群中的机器全部重启,如机房断电,第一台启动的服务器必须以空地址启动:mysqld_safe wsrep_cluster_address=gcomm:// >/dev/null&

安装前的建议:

1、需要至少3台的服务器,如果只有两台做CLUSTER的话,一旦出现数据不一致的情况下,就可能发生闹裂,需要一台仲裁服务器,如果是3台服务器的话,就不需要仲裁

2、CLUSTER需要用到3306444445674568端口,在IPTABLES 中开通对这些ACCEPT

3、如果是对现有环境做GALERA集群,需要对DB现有的表做检查,包括表、表引擎,是否无主键,需要安装scons

######开始..............

一、设置防火墙:

wKiom1ggJknwGArHAAFGuo8APNM957.png-wh_50

或者iptables –F  service iptables stop

二、设置HOST,RSA,使用vim /etc/hosts 添加信息

192.168.15.2 mysql_1

192.168.15.13 mysql_2

192.168.15.23 mysql_3

2、添加RSA,添加前建议删除旧的记录

#cd

#cd .ssh

wKioL1ggJuuCVeI3AAAlY63puNU029.png-wh_50

Ssk-keygen –t rsa直接按回车即可

ssh-copy-id -i ".ssh/id_rsa.pub root@ip各个节点ip地址"

###root@IP使用每个服务器的IP地址,PXC 使用3台服务器,每台服务器执行3次

三、安装MARIADB及其他需要的包:

1、安装scons,安装此包说是为了检查有无主见,

# tar zxvf scons-2.2.0.tar.gz && cdscons-2.2.0

# python setup.py install

 

2、解压初始化MARIADB,解压到/usr/local/

# tar –zxvf mariadb---- -C /usr/local

# cd /usr/local

#ln –s ###做个软连接mysql (安装MARIADB略)

##mairadb的配置文件存放在/etc/my.cnf,改成其他名字 启动节点会有问题,节点启动默认去读/etc/my.cnf

3、安装galera复制插件

(mariadb自带有复制插件,这个针对pxc 或者mysql版本的wsrep)

# tar zxfv galera-25.3.5-src.tar.gz  && cd galera-25.3.5-src

#scons ##使用scons编译galera????????

编译的时候可能会有各种问题,主要是因为系统依赖的包:

问题1

boost/shared_ptr.hppnot found or not usable

问题2

Checking for C headerfile check.h... no

Error: check headerfile not found or not usable

问题3

ssl support requiredbut asio/ssl.hpp not found or not usable

compile with ssl=0 orcheck that openssl devel headers are usable

    问题4

        gcc

yum install boost* openssl* check* -y

yum y install gcc

#mkdir /usr/lib64/galera/

#cp libgalera_smm.so/usr/local/mysql/lib/plugin/

##cp libgalera_smm.so  /usr/lib64/galera/

# cp garb/garbd  /usr/local/mysql/bin/

# cp libgalera_smm.so /usr/local/mysql/lib/plugin/  #数据解压后的basedir

若插件没设置会导致TIMEOUT:

wKiom1ggKg7TdhQWAAKEg7vrHcM369.png-wh_50

四、添加WSREP的配置参数,具体看模板(my.cnf)

五、启动第一个节点:

/usr/local/mysql/bin/mysqld_safe--wsrep_cluster_address=gcomm:// >/dev/null &

##gcomm://是特殊地址,仅仅是galera cluster初始化启动时候使用,再次启动时需要使用具体的IP地址

Wsrep默认使用4567端口,mysql启动后,除了检查3306端口外,还需要检查此端口

若启动的时候报这个错,说明离成功很接近了,主要是因为启动的方式错误,导致无法启动


六、第一节点启动后,添加配置文件里集群连接的认证的用户名和密码:(和配置文件用户名密码一直

#grant all privileges on *.* to wsrep_sst_user@'localhost' identified by "password";

#flush privileges;

七、添加其他节点,节点启动和第一节点相同,只要修改几个参数

###这里和PXC启动的方式有点区别:mariadb:

/usr/local/mysql/bin/mysqld_safe --wsrep_cluster_address=gcomm://192.168.15.13:4567>/dev/null &

若是第一节点挂了,不影响其他节点正常工作,若第一节点恢复,启动时候要:

/usr/local/mysql/bin/mysqld_safe --wsrep_cluster_address=gcomm://192.168.15.23:4567 >/dev/null &  IP 指定正常节点即可

wKiom1ggKz2gfcmVAAF0-GwjoOc885.png-wh_50

#######有些参数还需要具体调整

若集群其他节点连接第一节点出现:

说明配置问题,其他节点可以根据第一节点的启动,重新初始化实例,然后连接第一节点

次坑花了2天时间,原来是配置文件问题………………………..

wKiom1ggK9rhmTj4AAKEg7vrHcM671.png-wh_50

到此集群搭建完毕,可以测试在任意一个节点写入数据,都可以同步,

###集群使用的默认端口:3306数据实例

4444

4567

4568  貌似ISTSST 使用的

普及知识点:GALERA监控

1、常用指令

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

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

查看GALERA集群状态:show status like 'wsrep%';

1、集群完整性检查

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

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

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

2、节点状态检查

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

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

wsrep_local_state_comment:如果wsrep_connectedOn,wsrep_readyOFF,则可以从该项查看原因

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_sentwsrep_local_recv_queue_avg这两个值最高.这两个值较低的话,相对更好.

5、检测慢网络问题:

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

5)冲突或死锁的数目:

  wsrep_last_committed:最后提交的事务数目

  wsrep_local_cert_failureswsrep_local_bf_aborts:回滚,检测到的冲突数目

  • Galera的状态快照转移(SST

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

  1mysqldump

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

  2rsync

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

  3xtrabackup

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

 

####搭建集群注意几个参数:

Binlog_format=row###日志格式必须为ROW

Default_storage_engine=INNODB

Innodb_autoinc_lock_mod2=2 ###指定innodb自增长列锁模式,2为交叉锁模式,多个语句能同时执行

INNODB_LOCKS_UNSAFE_FOR_BINLOG=1

 WSREP_CLUSTER_NAME=CLUSTER_NAME###CLUSTER的名字

WSREP_CLUSTER_ADDRESS=GCOMM://IP1,IP2###集群中所有的node-ip,貌似只写本地也没问题,就是启动的时候写第一节点的IP 即可

Wsrep_node_address=ip ---每个节点配置为自己的IP

WSREP_PROVIDER=/USR/LOCAL/LIB/LIBGALERA_SMM.SO##指定GALERA库文件,PXC自带该库文件,MARIADB GALERA 需要安装GALERA

WSREP_SST_METHOD=RSYNC/XTRABACKUP  #指定SST方式,支持RSYNC(最快,需要表锁),MYSQLDUMPXTRABACKUP

WSREP_SST_AUTH=SST:123456     ----传输的用户

第一节点启动:不能用mysqld启动

应该为##./mysqld_safe –defaults-file=/etc/my.cnf –wsrep-cluster-address=”gcomm://”&

八、安装haproxy及修改配置文件:

###配置HAPROXY 若同时启动haproxy,一边没有IP资源的会提示

 Starting proxy admin_stats: cannot bind socket导致服务无法启动,修改:

修改内核参数: /etc/sysctl.conf

net.ipv4.ip_nonlocal_bind=1

保存结果,使结果生效

sysctl  –p



#useradd haproxy

#tar -zxvf haproxy-1.4.20.tar.gz

#cd haproxy-1.4.20 && makeTARGET=linux26 PREFIX=/usr/local/haproxy ARCH=X86_64 && make installPREFIX=/usr/local/haproxy

若出现此问题,则需要安装gcc

wKiom1ggLHmiVDO2AABBRDITmI4735.png-wh_50

Yum –y install gcc

#chown -R haproxy.haproxy /usr/local/haproxy

2、添加修改配置文件,部分解释参数配置意义(具体看haproxy.cfg)

   #cd /usr/local/haproxy && make conf&&cdconf && touch haproxy.cfg


###注意前段页使面用的端口48800和前端提供服务的端口,开通IPTABLES访问权限,

端口不能有冲突

3、启动haproxy,启动的时候若还没有VIP地址 这里会有提示无法绑定SOCKET。不打紧。

#/usr/local/haproxy/sbin/haproxy–f /usr/local/haproxy/conf/haproxy.cfg

4、增加集群状态检查进程用mysql用户权限

MariaDB [(none)]> grantprocess on *.* to chk_dlan@'localhost' identified by 'root123'

    -> ;

Query OK, 0 rows affected(0.07 sec)

 

MariaDB [(none)]> flushprivileges;

    2、修改检测脚本,由于默认的用户名和密码为其他,可以自己定义,并且添加执行的权限:判断是否为read_only=on 同步状态是否为synced 节点状态是否为primary

#chmod +x/usr/bin/clustercheck

####此脚本结合xinetd使用。在WORD末尾介绍

5、安装keepalived服务:

#cd keepalived-1.2.12

#./configure--prefix=/usr/local/keepalived

若报错:

configure:error:

  !!! OpenSSL is not properly installed on yoursystem. !!!

  !!! Can not include OpenSSL headers files.           !!!


yuminstall  openssl* check* -y

#make &&  make install

#cp/usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/

#cp /usr/local/keepalived/etc/sysconfig/keepalived/etc/sysconfig/

#mkdir /etc/keepalived

#cp/usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

#cp /usr/local/keepalived/sbin/keepalived/usr/sbin/



补充点:

默认情况下haproxy是不记录日志的,可以使用rsync本例LINUX服务记录日志。

1、linux下是rsyslogd服务,

#yum –y installrsyslog先安装rsyslog

一般安装好rsyslog会自动生成rsyslog.d这个目录,若无自己创建

 #cd /etc/rsyslog.d/ && touch haproxy.conf

#vim /etc/rsyslog.d/haproxy.conf

$ModLoad imudp

$UDPServerRun 514

 local0.* /var/log/haproxy.log ###这个必须和haproxy.cfg的配置文件一致。

#vim /etc/rsyslog.conf

wKioL1ggLcPxOZfMAACm-0gvnoM735.png-wh_50

1、重启服务

#service rsyslogrestart

现在你就可以看到日志(/var/log/haproxy.log)了


配置集群每个一个节点的存活状态,在DB每个

    节点安装XINETD服务

1、若无xinetd服务,则安装

#yum -y install xinetd

检查/etc/xined.conf是否有:

  1. a)      检查/etc/xined.conf是否有:

wKioL1ggLh_TjHMJAAAqpjTs5v8383.png-wh_50
  添加/etc/xinetd.d/mysql_status,此目录安装后默认存在。把mysql_status添加到/etc/services服务中去##脚本要有X权限,不然启动会有问题Error parsing attributeserver - DISABLING SERVICE [file=/etc/xinetd.d/mysql_status] [line=9]

wKiom1ggMc2TytllAAFbpStpG0M935.png-wh_50

###

故障haproxy切换需要在keepalived里定义好,才可以生效,或者keepalived停止服务后,停止haproxy服务,脚本已经提供 check_haproxy_master.sh

###############

启动报错:

19:26:49 [Note] WSREP:Running: 'wsrep_sst_rsync --role 'joiner' --address '127.0.0.1' --auth'sst:sstpass123' --datadir '/data/my3308/' --defaults-file'/data/cnf/my3308.cnf' --parent '3073' --binlog 'mysqld3308-bin' '

which: no rsync in(/usr/sbin:/sbin:/usr/local/mysql//bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/java/jdk1.7.0_51/bin:/usr/java/jdk1.7.0_51/jre/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin)

 19:26:49 [ERROR]WSREP: Failed to read 'ready ' from: wsrep_sst_rsync --role 'joiner' --address'127.0.0.1' --auth 'sst:sstpass123' --datadir '/data/my3308/' --defaults-file'/data/cnf/my3308.cnf' --parent '3073' --binlog 'mysqld3308-bin'

 Read: ''rsync' not found in PATH'

从错误知道是找不到rsync命令路径,怀疑没有安装rsync

yum search rsync

============================================================N/S Matched: rsync=============================================================

rsync.x86_64 : A program forsynchronizing files over a network

yum install rsync.x86_64

再次启动NODE2:

报错,

which: no lsof in(/usr/sbin:/sbin:/usr/local/mysql//bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/java/jdk1.7.0_51/bin:/usr/java/jdk1.7.0_51/jre/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin)

140723 22:07:05 [ERROR]WSREP: Failed to read 'ready ' from: wsrep_sst_rsync --role 'joiner' --address'127.0.0.1' --auth 'sst:sstpass123' --datadir '/data/my3307/' --defaults-file'/data/cnf/my3307.cnf' --parent '6898' --binlog 'mysqld3307-bin'

Read: ''lsof' not found inPATH'

没有报rsync路径找不到,看来rsync问题已经解决,再解决lsof

yum search lsof

=============================================================N/S Matched: lsof =============================================================

lsof.x86_64 : A utility whichlists open files on a Linux/UNIX system

yum install lsof.x86_64

再启动,启动成功。问题解决