要点概括
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-Server打wsrep补丁。可以直接使用官方提供的已经打好补丁的MySQL安装包,如果服务器上已经安装了标准版MYSQL,需要先卸载再重新安装。卸载前注意备份数据。
2、MySQL/Galera集群只支持InnoDB存储引擎。如果你的数据表使用的MyISAM,需要转换为InnoDB,否则记录不会在多台复制。可以在备份老数据时,为mysqldump命令添加–skip-create-options参数,这样会去掉表结构的声明信息,再导入集群时自动使用InnoDB引擎。不过这样会将AUTO_INCREMENT一并去掉,已有AUTO_INCREMENT列的表,必须在导入后重新定义。
3、MySQL 5.5及以下的InnoDB引擎不支持全文索引(FULLTEXT indexes),如果之前使用MyISAM并建了全文索引字段的话,只能安装MySQL 5.6 with wsrep patch。
4、所有数据表必须要有主键(PRIMARY),如果没有主键可以建一条AUTO_INCREMENT列。
5、MySQL/Galera集群不支持下面的查询:LOCK/UNLOCK TABLES,不支持下面的系统变量:character_set_server、utf16、utf32及ucs2。
6、数据库日志不支持保存到表,只能输出到文件(log_output = FILE),不能设置binlog-do-db、binlog-ignore-db。
7、跟其他集群一样,为了避免节点出现脑裂而破坏数据,建议Galera集群最低添加3个节点。
8、在高并发的情况下,多主同时写入时可能会发生事务冲突,此时只有一个事务请求会成功,其他的全部失败。可以在写入/更新失败时,自动重试一次,再返回结果。
9、节点中每个节点的地位是平等的,没有主次,向任何一个节点读写效果都是一样的。实际可以配合VIP/LVS或HA使用,实现高可用性。
10、如果集群中的机器全部重启,如机房断电,第一台启动的服务器必须以空地址启动:mysqld_safe –wsrep_cluster_address=gcomm:// >/dev/null&
安装前的建议:
1、需要至少3台的服务器,如果只有两台做CLUSTER的话,一旦出现数据不一致的情况下,就可能发生闹裂,需要一台仲裁服务器,如果是3台服务器的话,就不需要仲裁
2、CLUSTER需要用到3306,4444,4567,4568端口,在IPTABLES 中开通对这些ACCEPT
3、如果是对现有环境做GALERA集群,需要对DB现有的表做检查,包括表、表引擎,是否无主键,需要安装scons
######开始..............
一、设置防火墙:
或者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
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:
四、添加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 指定正常节点即可
#######有些参数还需要具体调整
若集群其他节点连接第一节点出现:
说明配置问题,其他节点可以根据第一节点的启动,重新初始化实例,然后连接第一节点
次坑花了2天时间,原来是配置文件问题………………………..
到此集群搭建完毕,可以测试在任意一个节点写入数据,都可以同步,
###集群使用的默认端口:3306数据实例
4444
4567
4568 貌似IST和SST 使用的
普及知识点: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_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这两个值最高.这两个值较低的话,相对更好.
5、检测慢网络问题:
wsrep_local_send_queue_avg:网络瓶颈的预兆.如果这个值比较高的话,可能存在网络瓶
5)冲突或死锁的数目:
wsrep_last_committed:最后提交的事务数目
wsrep_local_cert_failures和wsrep_local_bf_aborts:回滚,检测到的冲突数目
Galera的状态快照转移(SST)
SST允许新接入的节点使用定制的方法来获取最初的数据,当前mysql支持三种SST方法:
1、mysqldump
这需要接收服务器在转移前完全初始化和准备接收连接。此方法是通过定义阻塞,阻止修改自身状态转移的持续时间。这也是最慢的方式,可能会带来高负载的问题。
2、rsync
最快的方式,也是galera默认使用的方式。rsync脚本运行在发送和接收端上。在接收端,开启rsync服务模式,等待发送端连接。在发送端,开启rsync客户端模式,发送mysql数据目录内容到连接节点。这种方法也会阻塞,但是比mysqldump快。
3、xtrabackup
也很快,但需要额外安装。
####搭建集群注意几个参数:
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(最快,需要表锁),MYSQLDUMP和XTRABACKUP
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
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
1、重启服务
#service rsyslogrestart
现在你就可以看到日志(/var/log/haproxy.log)了
配置集群每个一个节点的存活状态,在DB每个
节点安装XINETD服务
1、若无xinetd服务,则安装
#yum -y install xinetd
检查/etc/xined.conf是否有:
a) 检查/etc/xined.conf是否有:
添加/etc/xinetd.d/mysql_status,此目录安装后默认存在。把mysql_status添加到/etc/services服务中去##脚本要有X权限,不然启动会有问题Error parsing attributeserver - DISABLING SERVICE [file=/etc/xinetd.d/mysql_status] [line=9]
###
故障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
再启动,启动成功。问题解决