1、卸载mysql

查找本机安装的mysql
rpm -qa | grep -i mysql

--nodeps --force

rpm -ev MySQL-server-5.6.15-1.el6.x86_64
rpm -ev --nodeps mysql-libs-5.1.71-1.el6.x86_64 (强制卸载)

查找之前老版本mysql的目录、并且删除老版本mysql的文件和库

find / -name mysql

rm -rf /usr/lib64/mysql

卸载后/etc/my.cnf不会删除,需要进行手工删除
rm -rf /etc/my.cnf

2、安装mysql
rpm -ivh libaio-0.3.107-10.el6.x86_64.rpm
rpm -ivh MySQL-server-5.6.38-1.el6.x86_64.rpm
rpm -ivh MySQL-client-5.6.38-1.el6.x86_64.rpm
rpm -ivh MySQL-shared-5.6.38-1.el6.x86_64.rpm
rpm -ivh MySQL-shared-compat-5.6.38-1.el6.x86_64.rpm

配置selinux
gedit /etc/sysconfig/selinux
SELINUX=permissive

shell终端执行
setenforce permissive

打开端口
/sbin/iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
/sbin/iptables -I INPUT -p tcp --dport 4444 -j ACCEPT
/sbin/iptables -I INPUT -p tcp --dport 4567 -j ACCEPT
/sbin/iptables -I INPUT -p tcp --dport 4568 -j ACCEPT

/etc/rc.d/init.d/iptables save

/etc/init.d/iptables status

3、安装Galera补丁

rpm -qa|grep galera(模糊查找安装程序)
rpm -e --nodeps openssl-1.0.1e-42.el6.x86_64 (卸载)

rpm -ivh openssl-1.0.1e-57.el6.x86_64.rpm

rpm -ivh lsof-4.82-5.el6.x86_64.rpm --force
rpm -ivh boost-program-options-1.41.0-28.el6.x86_64.rpm --force
rpm -ivh rsync-3.0.6-12.el6.x86_64.rpm --force

rpm -ivh galera-3-25.3.22-2.el6.x86_64.rpm
rpm -ivh mysql-wsrep-server-5.6-5.6.38-25.21.el6.x86_64.rpm --force
rpm -ivh mysql-wsrep-client-5.6-5.6.38-25.21.el6.x86_64.rpm --force
rpm -ivh mysql-wsrep-5.6-5.6.38-25.21.el6.x86_64.rpm
rpm -ivh mysql-wsrep-libs-compat-5.6-5.6.38-25.21.el6.x86_64.rpm
rpm -ivh mysql-wsrep-shared-5.6-5.6.38-25.21.el6.x86_64.rpm --force

配置/etc/my.cnf
[mysqld]
server_id = 1
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
port=3306
user=mysql
binlog_format=ROW
log_bin = /var/lib/mysql/logs/mysql-bin
log_slave_updates=1
#expire_logs_days=7
max_binlog_size=64M
log_bin_trust_function_creators=1
bind-address=0.0.0.0
default_storage_engine=innodb
innodb_autoinc_lock_mode=2
innodb_flush_log_at_trx_commit=2
innodb_buffer_pool_size=2048M
innodb_log_buffer_size=16M
innodb_log_file_size=128M
innodb_log_files_in_group=3
innodb_max_dirty_pages_pct=90
innodb_lock_wait_timeout=120
innodb_use_sys_malloc=1
lower_case_table_names=1
explicit_defaults_for_timestamp=true
character-set-server=utf8
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
symbolic-links=0
wsrep_provider=/usr/lib64/galera-3/libgalera_smm.so
wsrep_provider_options="gcache.dir=/var/lib/mysql/galera/;gcache.name=galera.cache;gcache.size=3G;gcache.page_size=3G"
wsrep_cluster_name="mysql_cluster"
wsrep_cluster_address="gcomm://192.168.40.20,192.168.40.21,192.168.40.22"
wsrep_sst_method=rsync
wsrep_node_name="node1"
wsrep_node_address="192.168.40.20"
wsrep_slave_threads=4
wsrep_log_conflicts=ON
max_connections=200
log-error=/var/lib/mysql/mysqld.log
skip-name-resolve
local-infile=1
[mysql_safe]
!includedir /etc/my.cnf.d/
#sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

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

4、启动集群
所有节点配置完毕后,在主节点执行

mkdir /var/lib/mysql/logs
mkdir /var/lib/mysql/galera

chown -R mysql.mysql /var/lib/mysql/logs
chown -R mysql.mysql /var/lib/mysql/galera

service mysql start --wsrep-new-cluster

5、查看mysql默认密码,并登陆修改密码

cat /root/.mysql_secret

mysql -uroot -p默认密码

mysql> SET PASSWORD = PASSWORD('root');

执行完毕后,登录mysql,执行

mysql>show global status like ‘wsrep_cluster_size’;
mysql>show global status like ‘wsrep_ready’;

正常的话返回size为1,wsrep_ready为on。

其他节点执行
mysql>service mysql start

正常的话返回size为3。

6、keepalived的安装

rpm -qa|grep libnl(模糊查找安装程序)

rpm -ivh keepalived-1.2.13-5.el6_6.x86_64.rpm

rpm -ivh net-snmp-libs-5.5-60.el6.x86_64.rpm
rpm -ivh lm_sensors-3.1.1-17.el6.x86_64.rpm
rpm -ivh libnl-1.1.4-2.el6.x86_64.rpm

7、配置keepalived文件

gedit /etc/keepalived/keepalived.conf

##########################################
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_script chk {
script "/etc/keepalived/checkmysql.sh"
interval 2
weight -50
}
vrrp_script chk2 {
script "/etc/keepalived/icmp.sh"
interval 15
weight -50
}
vrrp_instance VI_1 {
state MASTER #其他两台配置为BACKUP
interface eth0
virtual_router_id 60
priority 150 #其他两台的优先级分别为140、130
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk
chk2
}
virtual_ipaddress {
192.168.40.51/24
}
notify_master "/root/master.sh"
}
#####################################################
创建用户
mysql>create user ‘keepalived’@’localhost’;

配置checkmysql.sh文件
gedit /etc/keepalived/checkmysql.sh
##########################################
#!/bin/sh
mysql -ukeepalived -e "select VARIABLE_VALUE from information_schema.GLOBAL_STATUS where VARIABLE_NAME='WSREP_READY'\G"|grep -c "ON" 1> /dev/null 2&>1
if [ $? -ne 0 ];then
service keepalived stop;
#curl 执行post请求,通知告警平台mysql异常 ,实施时定义
exit 1;
fi
exit 0;
###############################################

配置master.sh文件
gedit /etc/keepalived/master.sh
##########################################
#!/bin/sh
#curl 通知告警平台虚拟地址完成切换
###############################################

配置icmp.sh文件
gedit /etc/keepalived/icmp.sh
##########################################
#!/bin/sh
host='192.168.40.254';
temp='/etc/keepalived/ping.temp';
if [ -f ${temp} ];then
rm -f ${temp};
fi
ping ${host} -c 5 -W 1 > ${temp};
loss=`grep -i "packet loss" ${temp} |grep -o -e '[0-9]\{0,3\}%'|sed 's/%//g'`;
if [ ${loss} -gt 50 ];then
exit 1;
fi
exit 0;
###############################################

8、导入生产环境数据结构
galera cluster for mysql以及keepalived都部署完成且启动完成之后,将准备好的生产环境表结构struct.sql导入到新的数据库中。
mysql>source struct.sql
导入成功后,再执行sql脚本,检查数据库结构是否满足以下要求:
 存储引擎都为InnoDB;
 所有表都含有主键;
 不能有有全文索引以及空间索引。
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;
上述脚本会将不满足要求的表列举出来,根据结果进行修改即可。

9、 Galera Cluster维护
重启Cluster
1. 集群正常重启
重启整个Cluster之前,最好先停掉keepalived服务,使外部应用程序无法继续访问mysql
#service keepalived stop
这样做的好处是可以保证集群中的数据在重启前后是一致的,不会存在差异,可以避免重启时需要进行数据同步而耗费大量时间。
关闭keepalived服务后,依次在所有服务器上执行
#service mysql stop
关闭mysql后,检查三台服务器上#vi /var/lib/mysql/grastate.dat文件,此文件包含集群uuid以及sequence number。我们需要找参数seqno值最大的节点。
在所有服务器是正常关闭的情况下,我们看到的grastate.dat文件应该是类似下面的内容
# GALERA saved state
version: 2.1
uuid: d7b6d215-d935-11e5-bd08-36ff08c40499
seqno: 361475525
cert_index:
我们需要将seqno值最大的节点作为集群第一个节点启动
#service mysql start --wsrep-new-cluster
#service keepalived start
其他节点执行
#service mysql start #service keepalived start
2. 集群异常重启
如果遇到机房断点等异常情况导致所有节点同时crashed,我们重启集群的步骤就稍微复杂点。
这种情况下,集群中所有节点的#vi /var/lib/mysql/grastate.dat文件的通常与以下内容类似
# GALERA saved state
version: 2.1
uuid: d7b6d215-d935-11e5-bd08-36ff08c40499
seqno: -1
cert_index:
文件中seqno值为-1,此时,为了保险起见,我们首先将某一节点做为一个普通mysql服务启动,即将my.cnf文件中关于wsrep的内容注释,然后执行
#service mysql start
#service keepalived start
执行完毕后,然后以恢复二进制日志记录的,恢复所有日志记录操作
#mysqlbinlog --server-id=## mysql-bin.000### |mysql -uroot -p
server-id为my.cnf文件中配置中server_id,mysql-bin.000###为二进制日志文件。
节点数据恢复成功后,恢复my.cnf关于wsrep的配置项,然后将此节点以集群中第一个节点启动方式进行启动
#service mysql start --wsrep-new-cluster
#service keepalived start
其他节点执行
#service mysql start
#service keepalived start

(三) 删除与添加节点
可能存在某台服务器硬件发生故障,需要将其移出机房的情况,这时需要用新的设备替代被移除的设备。
此种情况下,我们仅需要在故障设备移出后再到新设备上按照galera cluster for mysql部署流程重新安装一遍,包括安装mysql、安装galera补丁,安装keepalived服务。
此时存在两种情况,一种是新设备IP地址不变,另外一种是新设备IP地址改变。
对于IP地址不变的情况,我们仅需要在完成配置后执行如下语句即可让新设备加入集群并自动完成数据同步。
#service mysql start
#service keepalived start
对于IP地址改变的情况,首先需要修改mysql.cnf的几项配置。
安装部署结构图,假设node1节点192.168.40.20故障,新的设备ip为192.168.40.24则新的my.cnf配置文件下列参数值为:
wsrep_cluster_address="gcomm://192.168.40.21,192.168.40.22,192.168.40.24"
wsrep_node_name="node1"
wsrep_node_address="192.168.40.24"
server_id = 1
其他节点node2与node3的mysql.cnf文件wsrep_cluster_address参数也需要按照新的集群环境修改
#wsrep_cluster_address="gcomm://192.168.40.21,192.168.40.22,192.168.40.24"
当然,node2与node3修改配置后并不能立即生效,我们分别登录node2与node3,然后执行
mysql>set global wsrep_cluster_address='gcomm://192.168.40.21,192.168.40.22,192.168.40.24';
然后在新的node1节点执
#service mysql start
#service keepalived start
node1将自动加入集群并完成数据同步。
关于 Unknown Command Errors
当集群网络故障时可能会在执行query时出现Unknown command 的错误。但是如果在节点故障时我们可以做到及时告警以及处理,就可以有效的避免这个错误。
当然如果出现了这个错误,也可以很快的处理。
登录数据库后再节点上执行
SHOW STATUS LIKE 'wsrep_last_committed';
查询会返回last committed的值,在返回值最大的节点上执行
SET GLOBAL wsrep_provider_options='pc.bootstrap=YES';
执行完毕后,其他节点会自动加入并进行数据同步。

10、 备份与恢复
一、备份
数据库的备份采用二进制日志的方式进行备份,可以定期将二进制日志文件备份到指定服务器的路径下。
在我们的my.cnf配置文件中,日志选项有如下几个
binlog_format=ROW
log_bin = /var/lib/mysql/logs/mysql-bin
log-bin-index= /var/lib/mysql/logs/mysql-bin.index
log_slave_updates=1
max_binlog_size=64M
二进制日志格式为ROW,保存路径为#vi /var/lib/mysql/logs目录,日志以mysql-bin开头,索引文件为mysql-bin.index,并且保存slave操作日志,为避免日志文件过大,我们设置日志文件最大为64M。
这样,我们就可以保存数据操作日志,在发生意外情况时,我们可以根据我们备份的数据库日志对数据库进行恢复操作。
为安全起见,我们可以将#vi /var/lib/mysql/logs里面保存的二进制日志增量备份到本地目录或者保存到远程nfs服务器上。
比如,本地挂的nfs路径为/mnt/nfs,则我们同步/var/lib/mysql/logs至/mnt/nfs的方式为:
#rsync -avzP /var/lib/mysql/logs /mnt/nfs
将此命令配置为定时任务,每隔5分钟同步一次
*/5 * * * * /usr/bin/rsync -avzP /var/lib/mysql/logs /mnt/nfs 1>/dev/null 2&>1
对于二进制日志,需要特别注意的是,不要轻易执行以下语句:

mysql>reset master;
这个命令会清空并重置所有已生成的日志记录。除非做好了完全备份,否则请不要执行。
二、恢复
当发生意外情况时,我们可能需要根据二进制日志记录恢复数据库系统。
二进制日志文件格式为row,因此如果我们需要查看日志文件,可以执行以下命令
mysqlbinlog --base64-output=decode-row -v mysql-bin.00000#
使用二进制日志进行恢复时,请先关闭mysql集群中其他节点,将数据库已普通的独立数据库方式启动,即先注释掉my.cnf中关于wsrep的配置项,然后启动数据库。
#service mysql start
启动后,我们根据找到的需要恢复的start dataetime、stop datetime或者start position 、stop position进行恢复
比如要恢复mysql-bin.00003开始位置为25845之后的记录,则执行
mysqlbinlog --server-id=2 -j 25845 mysql-bin.00003 |mysql -uroot -p
恢复数据以后,恢复配置文件wsrep的配置项,再将此节点作为集群中第一个节点启动
#service mysql start --wsrep-new-cluster
#service keepalived start
其他节点执行
#service mysql start
#service keepalived start

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:回滚,检测到的冲突数目

11、补充
mysqlbinlog --server-id=1 /var/lib/mysql/logs/mysql-bin.000010 |mysql -uroot -proot

ip add ls dev eth5

GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.40.51' IDENTIFIED BY 'root' WITH GRANT OPTION;

grant all privileges on *.* to root@"%" identified by ".";(开放数据库操作权限)

Galera Cluster mysql+keepalived集群部署的更多相关文章

  1. PXC5.7(Percona XtraDB Cluster)+HAproxy+Keepalived 集群部署

    Percona-XtraDB-Cluster+Haproxy 搭建集群环境 环境准备及服务器信息: 配置防火墙 firewall-cmd --add-port=3306/tcp --permanent ...

  2. 构建 MariaDB Galera Cluster 分布式数据库集群(一)

    MariaDB Galera Cluster 介绍 简介 MariaDB集群是MariaDB同步多主机集群,仅支持XtraDB(详见本文结尾注释)/InnoDB存储引擎(虽然有对MyISAM实验支持 ...

  3. 构建 MariaDB Galera Cluster 分布式数据库集群(二)

    MariaDB的安装 构建 MariaDB Galera Cluster之前,首先安装MariaDB,本文使用的版本是10.1 1.环境准备 主机: MariaDB01(192.168.56.102) ...

  4. galera+mycat高可用集群部署

    环境描述 10.30.162.29  client 环境描述 10.30.162.29 client 10.30.162.72 mysql1 10.30.162.73 mysql2 10.30.162 ...

  5. MySQL PXC集群部署

    安装 Percona-XtraDB-Cluster 架构: 三个节点: pxc_node_0 30.0.0.196 pxc_node_1 30.0.0.198 pxc_node_2 30.0.0.19 ...

  6. Mysql基于Mysql Cluster+MysqlRouter的集群部署方案

    http://note.youdao.com/noteshare?id=a61c4a6ff2b76e5305430eb66eb116e2&sub=4B4B6E8D0E2849F9B0DFB67 ...

  7. mysql innodb cluster 无感知集群

    MySQL 8.0.12 innodb cluster 高可用集群部署运维管理手册 Innodb cluster 原理介绍 Innodb cluster  利用组复制的 pxos 协议,保障数据一致性 ...

  8. openstack高可用集群21-生产环境高可用openstack集群部署记录

    第一篇 集群概述 keepalived + haproxy +Rabbitmq集群+MariaDB Galera高可用集群   部署openstack时使用单个控制节点是非常危险的,这样就意味着单个节 ...

  9. Centos 7 下 Mysql 5.7 Galera Cluster 集群部署

     一.介绍 传统架构的使用,一直被人们所诟病,因为MySQL的主从模式,天生的不能完全保证数据一致,很多大公司会花很大人力物力去解决这个问题,而效果却一般,可以说,只能是通过牺牲性能,来获得数据一致性 ...

随机推荐

  1. pygame 笔记-2 模仿超级玛丽的弹跳

    在上一节的基础上,结合高中物理中的匀加速直线运动位移公式 ,就能做出类似超级玛丽的弹跳效果. import pygame pygame.init() win = pygame.display.set_ ...

  2. 01、Spar内核架构原理

        附件列表

  3. 转: 关于linux用户时间与系统时间的说明

    写的很不错的一篇. https://blog.csdn.net/mmshixing/article/details/51307853

  4. .Net混淆工具和反混淆工具

    一.简介 本文给大家列举一些常用的.net程序反破解代码混淆工具.同时也列取一些反混淆工具. 二.混淆工具 Agile.NET (aka CliSecure) Babel.NET CodeFort C ...

  5. 使用Guava的RateLimiter完成简单的大流量限流

    限流的一般思路: 1.随机丢弃一定规则的用户(迅速过滤掉90%的用户): 2.MQ削峰(比如设一个MQ可以容纳的最大消息量,达到这个量后MQ给予reject): 3.业务逻辑层使用RateLimite ...

  6. oracle无效索引重建

    问题描述: 执行失败!错误信息[Exception message:无效的列索引 解决思路: 分析是表索引,大部分都是表索引失效导致的,只需要花重建表索引即可! 00.查看此表归属账户select * ...

  7. phpBB3导入用户的Python脚本

    关联的数据表 在phpBB3中导入用户时, 需要处理的有两张表, 一个是 users, 一个是 user_group. 如果是新安装的论坛, 在每次导入之前, 用以下语句初始化: DELETE FRO ...

  8. Asp.net的HttpContext.Current.Items详解

    之前asp.net只是在使用Session来进行用户会话时的信息存储,甚至很少留意Session完整的类调用是HttpContext.Current.Sessoin.... 好吧,我还是处于只会固定写 ...

  9. phpexcel 导入超过26列、处理时间格式

    见地址:http://www.thinkphp.cn/topic/33376.html excel处理时间: https://blog.csdn.net/xqd890608/article/detai ...

  10. APP微信支付Java后台的实现(springmvc)

    第一次做微信支付,阅读完开发文档后,下了个官方demo,摸索了好久,期间也出现了好多问题,终于是实现生成预支付订单以及支付成功后接收微信服务器通知,不多说了,直接上代码: 一.工具类 Constant ...