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 ".";(开放数据库操作权限)