MariaDB 10 多源复制特性

mariadb multi-source replication(mariadb多主复制),在mariadb-10.0里面加入了多主复制功能。

修改过的语法:
     针对每个复制线程会有一个对应的connection_name
     而connection_name是default_master_connection变量的值;
     如果你要操作对应的复制线程,需要将这个变量设置为对应的复制线程的名字。
connection_name的值是长度小于64的任何字符串,并且对大小写不敏感
     你需要尽量让连接名固定,因为它会被作为文件名的一部分。

以下是新增加的一些语法:
     关注点主要在connection_name,也就是在以前的语法上增加了connection_name,如果没加connection_name,那么默认的就是空(”).
CHANGE MASTER [‘connection_name’] …
FLUSH RELAY LOGS [‘connection_name’]
MASTER_POS_WAIT(….,[‘connection_name’])
RESET SLAVE [‘connection_name’]
SHOW RELAYLOG [‘connection_name’] EVENTS
SHOW SLAVE [‘connection_name’] STATUS
SHOW ALL SLAVES STATUS
START SLAVE [‘connection_name’…]]
START ALL SLAVES …
STOP SLAVE [‘connection_name’] …
STOP ALL SLAVES …

原来的老式的连接是一个空字符串 ”,如果你不想用的话可以不用这个连接。
你可以使用change master创建一个新的master 连接。
你可以使用reset slave ‘connect_name’ ALL;完全的删除一个连接。

多源复制的变量
     新复制变量 @@default_master_connection 指定了;
     如果你不指定一个连接的话那个链接将会被命令和变量使用。默认这个值是 ” (默认连接名)。
     下面的复制变量是针对局部的连接的(换句话说,他们显示了 @@default_master_connection 的值)。
我们正致力于将重要的对于连接局部化。
类型                      名称                                                                   描述
变量           Max_relay_log_size                      relay log的最大值. 如果是0的话,那么在启动的时候就会被设置成 max_binlog_size 的大小
状态           Slave_heartbeat_period               多久从master请求一个心跳包 (以秒计算).
状态           Slave_received_heartbeats          我们从master收到了多少个心跳包.
状态           Slave_running                             显示slave是否正在运行。YESS表示 sql 和 IO 线程是活动的。
                                                                    No表示其中任意一个没在运行中。
                                                                    ””表示 @@default_master_connection 不存在。
变量           Sql_slave_skip_counter                复制日志要忽略多少个条目(主要用在日志中有错误的情况下)。
     你可以用 SESSION 或者是 GLOBAL 访问以上所有的变量。
注意,和MySQL形成对比的是,所有的变量总是显示正确的有效的值!
例如:
set @@default_master_connection=”;
show status like ‘Slave_running’;
set @@default_master_connection=’other_connection’;
show status like ‘Slave_running’;

如果 @@default_master_connection 包含一个不存在的名称,你将收到一个警告.
所有其他的master相关的变量都是全局的,并且影响 “” 连接或者是所有的连接。例如, Slave_retried_transactions 现在显示所有的slave的重试事务次数。

新添加的状态变量:
               名称                                     描述
Com_start_all_slaves                执行 START ALL SLAVES 命令的次数。
Com_start_slave                      执行 START SLAVE 命令的次数。取代了 Com_slave_start.
Com_stop_slave                      执行 STOP SLAVE 命令的次数。取代了 Com_slave_stop.
Com_stop_all_slaves                执行 STOP ALL SLAVES 命令的次数

SHOW ALL SLAVES STATUS 有以下的新的列:

               名称                                     描述

     Connection_name                 master的连接名。 这是第一个变量
Slave_SQL_State                    SQL 线程的状态
Retried_transactions              这个连接重试事务的次数。
Max_relay_log_size                这个连接的最大的relay日志的大小。
Executed_log_entries             slave已经指向了多少个日志条目。
Slave_received_heartbeats     从master获得了多少个心跳。
Slave_heartbeat_period          多久从master请求一个心跳包(以秒计算)。

新文件
     被多源复制使用的新文件的基本准则是:他们有在扩展名前被冠以 连接名 前缀的和原来的中继日志文件类似的名字。
主要的例外是,保存所有连接名字的 文件master-info-file 被简单的命名为带有 multi- 前缀的 master-info-file 。

当你使用多源复制的时候,下面的文件将被创建:

               名称                                                                   描述

     multi-master-info-file                                          master-info-file (一般是 master.info) 带上了 multi- 前缀。这里面是所有使用中的master连接信息。
master-info-file-connection_name.extension       包含了当前master应用到slave的位置。扩展名一般是 .info
relay-log-connection_name.xxxxx relay-log         有了一个 connection_name 的前缀. xxxxx 是 relay log 的编号。这里面保存的是从master读取的复制数据。
relay-log-index-connection_name.extension        包含可用的 relay-log-connection_name.xxxxx 文件的名字。扩展名一般是 .index
relay-log-info-file-connection_name.extension    包含relay日志中的当前master的位置。扩展名一般是 .info

当创建这些文件的时候,连接名被转化成小写的,并且其中所有的特殊字符都被转化了,就和mysql表名中的特殊字符被转化一样。
这样做是为了方便文件名可以在不同系统上移植。
提示:
你只需要指定 –log-base-name ,所有的其他变量将会使用这个作为前缀;
     而不用为mysqld指定 –relay-log, –relay-log-index,–general-log, –slow-log, –log-bin, –log-bin-index 这些的名字。

其他事项
     所有slave的错误信息都会加上connection name,然后被写入到error log.
ER_MASTER_INFO和WARN_NO_MASTER_INFO现在会加上connection_name
这里没有冲突的解决方案,我们假设所有的master之间没有冲突.
所有执行的命令都被存储在正常的binary log里面。
如果你server variable log_warnings>1,那么你就会收到一些multi-master-info文件更新的信息
show slave status;看见的第一行是增加的,叫做connection_name.
reset slave命令现在会删除所有的relay-log文件。

典型的使用案例
     将多个master的数据整合到一个slave上,方面查询分析。
将多个mariadb/mysql服务器的数据整合到一个slave,方便备份。

受限的事项
     一个slave最多可以有64个master
每个活跃的连接会创建两个线程(和mariadb复制相同)
你需要确认所有的master需要有不同的server-id。
max_relay_log_size 在启动后修改是不能生效的。
innodb-recovery-update-relay-log 值对默认的复制连接生效,这个参数是xtradb的特新用来存储relay log的位置号。但是这个方案存在安全隐患,我们不推荐使用
Slave_net_timeout 对所有参数有效,我们不检查它是否小于Slave_heartbeat_period,因为对多主复制来说没有特别意义。

将要完成的功能
multi-source现在还不支持semisync,我们将在下个release版本中解决。
所有关于multi-source的bugs可以在这里找到https://mariadb.atlassian.net/secure/IssueNavigator.jspa?mode=hide&requestId=11400
允许多线程复制

TIPS:
mysql库需要过滤掉,不能复制.
半同步(Semi-sync)暂时无法使用。
如果需要sql_slave_skip_counter,需要先制定一个通道 set @@default_master_connection=’connection_name’

mysql 审计插件的安装和使用


很多人都一直在寻找mysql的审计插件,目前,mariadb 官方已经提供了审计功能,并且含有审计插件,可以在mysql使用
具体方式:
       就是先下载安装一个mriadb ,安装完成后,按如下方式操作:
1. 在mariadb 里执行:SHOW VARIABLES LIKE ‘plugin_dir’;
    查找插件目录,进入插件目录,将名称为:server_audit.so 复制到 mysql  的插件目录(mysql插件目录查询方式,同mariadb)
2.mysql 和 mariadb 中,审计插件的安装方式:
(1).mysql 的安装方式
     INSTALL PLUGIN server_audit SONAME ‘server_audit.so’;
 
(2).mariadb的安装方式:
     INSTALL PLUGIN server_audit SONAME ‘server_audit’;
(3).卸载插件:
     uninstall plugin server_sudit
 
3.审计插件相关状态参数的查看命令
状态参数查看:
mysql> SHOW global VARIABLES LIKE ‘%audit%’;
mysql> SHOW global status LIKE ‘%audit%’;
 
4.启用审计插件:
mysql> set global server_audit_logging=1;
5.设置记录的内容:
mysql> set global  server_audit_events =’connect,query,TABLE’;
注:
       永久生效的话,写入到my.cnf文件里:
[mysqld]
server_audit_events=connect,query,table
6.其它相关说明
mysql>  SET GLOBAL server_audit_excl_users=’confluence,hoss_user,jira,nagios,sonar,test,tm_jdbc,tmp_test,mpm,repl,cacti,dba_test’;
mysql>  set global server_audit_incl_users=’haowu_dev,haowu_test,root,dev_debug’;
 

参数说明:
server_audit_output_type:指定日志输出类型,可为SYSLOG或FILE
server_audit_logging:启动或关闭审计
server_audit_events:指定记录事件的类型,可以用逗号分隔的多个值(connect,query,table),如果开启了查询缓存(query cache),查询直接从查询缓存返回数据,将没有table记录
server_audit_file_path:如server_audit_output_type为FILE,使用该变量设置存储日志的文件,可以指定目录,默认存放在数据目录的server_audit.log文件中
server_audit_file_rotate_size:限制日志文件的大小
server_audit_file_rotations:指定日志文件的数量,如果为0日志将从不轮转
server_audit_file_rotate_now:强制日志文件轮转
server_audit_incl_users:指定哪些用户的活动将记录,connect将不受此变量影响,该变量比server_audit_excl_users优先级高
server_audit_syslog_facility:默认为LOG_USER,指定facility
server_audit_syslog_ident:设置ident,作为每个syslog记录的一部分
server_audit_syslog_info:指定的info字符串将添加到syslog记录
server_audit_syslog_priority:定义记录日志的syslogd priority
server_audit_excl_users:该列表的用户行为将不记录,connect将不受该设置影响
server_audit_mode:标识版本,用于开发测试
7.日志样式:
Image
 

使用haproxy+keepalived来实现mariadb galera cluster的高可用架构

        在上篇mariadb galera cluster博文中,实现了数据库之间的多主复制,数据库对外提供了好几个IP地址,我们在这里通过haproxy的虚拟IP(就如mysql-proxy一样),来对外提供一个IP地址来实现数据库的负载均衡,通过keepalived来判断haproxy的存活情况。

一.Haproxy和keepalived的概述:
    haproxy是一款免费的提供高可用性,负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,借助haproxy可以快速并且可靠的提供基于TCP和HTTP应用的代理解决方案.
    keepalived主要作用是LoadBalance master和LoadBalance backup之间的健康检查,实现故障转换.
    haproxy官方网站:http://haproxy.1wt.eu/
    keepalived官方网站:http://www.keepalived.org/
二.haproxy的特点和算法:
1.haproxy的特点是:
   (1).免费开源,稳定性也是非常好
   (2).能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作
   (3).支持虚拟主机
   (4).是一款负载均衡软件,单纯从效率上来讲HAProxy比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的
   (5).可以对Mysql读进行负载均衡,对后端的MySQL节点进行检测和负载均衡[这点是我门dba需要关注的重点]
2.haproxy的算法现在也越来越多了,具体有如下8种:
   (1).roundrobin:表示简单的轮询[数据库负载的话,建议使用此方式,使用source的话,后端数据库宕掉的话,会有一个连接出错]
   (2).static-rr:表示根据权重
   (3).leastconn:表示最少连接者先处理
   (4).source:表示根据请求源IP,这个跟Nginx的IP_hash机制类似,我们用其作为解决session问题的一种方法[此方法针对数据库待定]
   (5).ri:表示根据请求的URI
   (6).rl_param:表示根据请求的URl参数’balance url_param’ requires an URL parameter name
   (7).hdr(name):表示根据HTTP请求头来锁定每一次HTTP请求
   (8).rdp-cookie(name):表示根据cookie(name)来锁定并哈希每一次TCP请求
三.haproxy+keepalived+mariadb galera cluster高可用负载搭建演示:
# 这里配置的主要目的其实是针对mariadb galera cluster来实现数据库的负载均衡,但这里为了方便演示,使用mysql数据库来替代galera cluster(mysql数据库不配置主从,方便显示效果)
# 再次声明:如果仅仅是mysql数据库读写负载,是不需要此架构的,这个架构仅针对mariadb galera cluster
1.环境:
    os:red hat linux 6(64位,2.6内核)
    haproxy1/keepalived1:192.168.1.100 (master)
    haproxy2/keepalived2:192.168.1.101 (backup)
    mysql1:192.168.1.102
    mysql2:192.168.1.103
    haproxy vip:192.168.1.220
2.配置实现图:
haproxy+keepalived+galera cluster
3.详细配置步骤如下:

(1).在192.168.1.100上安装配置haproxy

  1. [root@client100 ~]# tar -xf haproxy-1.4.24.tar.gz  
  2. [root@client100 ~]# cd haproxy-1.4.24  
  3. # 注意下面的TARGET必须大写,不然会报错(如果报gcc错误,安装gcc软件)  
  4. [root@client100 haproxy-1.4.24]# make TARGET=linux26 prefix=/usr/local/haproxy  
  5. [root@client100 haproxy-1.4.24]# make install PREFIX=/usr/local/haproxy  
  6. [root@client100 haproxy-1.4.24]# cd /usr/local/haproxy/  
  7. # conf目录如果不存在,请先建立该目录[下面这步复制配置的模板文件可以忽略]  
  8. [root@client100 haproxy-1.4.24]# cp examples/haproxy.cfg  /usr/local/haproxy/conf/haproxy.conf   
  9. # 在当前目录下,建立两个目录conf logs(分别存放HAproxy的配置文件,PID文件和日志文件)  
  10. [root@client100 haproxy]# mkdir conf logs  
  11. [root@client100 haproxy]# vim conf/haproxy.conf  
  12. # 以下有部分参数其实是不需要设置的  
  13. global  
  14.         log 127.0.0.1   local0  
  15.         maxconn 4096                   # 最大连接数  
  16.         chroot /usr/local/haproxy    # 安装路径  
  17.         uid 99                               # 所属用户id  
  18.         gid 99                               # 所属用户组id[用户和组可以自己创建的]  
  19.         daemon                            # 后台运行  
  20.         quiet  
  21.         nbproc 1                           # 进程数,可以同时开启多个  
  22.         pidfile /usr/local/haproxy/logs/haproxy.pid  
  23.   
  24. defaults  
  25.         log global  
  26.         mode http                        # 所处理的类别[7层:http;4层:tcp]  
  27.         retries 3                          # 3次连接失败就认为服务不可用  
  28.         option httplog                  # 日志类别http日志格式  
  29.         option dontlognull            # 不记录健康检查的日志信息  
  30.         option redispatch            # serverid对应服务器宕掉后,强制定向到其他健康的服务器  
  31.         option abortonclose         #当服务器负载很高的话,自动结束到当前处理比较久的连接  
  32.         maxconn 4096                # 最大连接数  
  33.         contimeout 50000           # 连接超时  
  34.         clitimeout 50000             # 客户端连接超时  
  35.         srvtimeout 50000            # 心跳检测超时  
  36.   
  37. listen mysql_proxy 0.0.0.0:3306  
  38.         mode tcp                       # 监听4层 模式   
  39.         balance roundrobin        # 负载均衡方式为轮询  
  40.     #  balance source              # 此负载方式数据库负载不建议使用,http可以使用   
  41.         option tcpka  
  42.         option httpchk               # 心跳检测  
  43.     #  option mysql-check user haproxy  
  44.         server mysql1 192.168.1.102:3306 weight 1    # 后端真是数据库ip地址和端口,权重  
  45.         server mysql2 192.168.1.103:3306 weight 1    # 后端真是数据库ip地址和端口,权重  
  46. # 启动测试,看haproxy启动是否正常  
  47. [root@client100 haproxy]# /usr/local/haproxy/sbin/haproxy -f haproxy.conf  
  48. [root@client100 haproxy]# ps -ef |grep haproxy  
  49. # 编写haproxy启动脚本[可编写也可以不编写,建议编写]  
  50. [root@client100 haproxy]# vim /etc/init.d/haproxy   
  51. #!/bin/bash  
  52. BASE_DIR=”/usr/local/haproxy”  
  53. ARGV=”$@”  
  54. start()  
  55. {  
  56. echo “START HAPoxy SERVERS”  
  57. $BASE_DIR/sbin/haproxy -f $BASE_DIR/conf/haproxy.conf  
  58. }  
  59. stop()  
  60. {  
  61. echo “STOP HAPoxy Listen”  
  62. kill -TTOU $(cat $BASE_DIR/logs/haproxy.pid)  
  63. echo “STOP HAPoxy process”  
  64. kill -USR1 $(cat $BASE_DIR/logs/haproxy.pid)  
  65. }  
  66. case $ARGV in  
  67. start)  
  68. start  
  69. ERROR=$?  
  70. ;;  
  71. stop)  
  72. stop  
  73. ERROR=$?  
  74. ;;  
  75. restart)  
  76. stop  
  77. start  
  78. ERROR=$?  
  79. ;;  
  80. *)  
  81. echo “hactl.sh [start|restart|stop]”  
  82. esac  
  83. exit $ERROR  
  84. # 赋予脚本可执行权限  
  85. [root@client100 haproxy]# chmod +x /etc/init.d/haproxy  

(2).在192.168.1.101上安装配置haproxy

  1. [root@client101 ~]# tar -xf haproxy-1.4.24.tar.gz  
  2. [root@client101 ~]# cd haproxy-1.4.24  
  3. [root@client101 haproxy-1.4.24]# make TARGET=linux26 prefix=/usr/local/haproxy  
  4. [root@client101 haproxy-1.4.24]# make install PREFIX=/usr/local/haproxy  
  5. [root@client101 haproxy-1.4.24]# cd /usr/local/haproxy/  
  6. [root@client101 haproxy]# mkdir conf logs  
  7. [root@client101 haproxy]# vim conf/haproxy.conf  
  8. global  
  9.         log 127.0.0.1   local0  
  10.         maxconn 4096  
  11.         chroot /usr/local/haproxy  
  12.         uid 99  
  13.         gid 99  
  14.         daemon  
  15.         quiet  
  16.         nbproc 1  
  17.         pidfile /usr/local/haproxy/logs/haproxy.pid  
  18.   
  19. defaults  
  20.         log global  
  21.         mode http  
  22.         retries 3  
  23.         option httplog  
  24.         option dontlognull  
  25.         option redispatch  
  26.         option abortonclose  
  27.         maxconn 4096  
  28.         contimeout 50000  
  29.         clitimeout 50000  
  30.         srvtimeout 50000  
  31.   
  32. listen mysql_proxy 0.0.0.0:3306  
  33.         mode tcp  
  34.         balance roundrobin  
  35.     #  balance source  
  36.         option tcpka  
  37.         option httpchk  
  38.     #  option mysql-check user haproxy  
  39.         server mysql1 192.168.1.102:3306 weight 1  
  40.         server mysql2 192.168.1.103:3306 weight 1  
  41. [root@client100 haproxy]# /usr/local/haproxy/sbin/haproxy -f haproxy.conf  
  42. [root@client100 haproxy]# ps -ef |grep haproxy  
  43. # 编写haproxy启动脚本[可编写也可以不编写,建议编写]  
  44. [root@client100 haproxy]# vim /etc/init.d/haproxy   
  45. #!/bin/bash  
  46. BASE_DIR=”/usr/local/haproxy”  
  47. ARGV=”$@”  
  48. start()  
  49. {  
  50. echo “START HAPoxy SERVERS”  
  51. $BASE_DIR/sbin/haproxy -f $BASE_DIR/conf/haproxy.conf  
  52. }  
  53. stop()  
  54. {  
  55. echo “STOP HAPoxy Listen”  
  56. kill -TTOU $(cat $BASE_DIR/logs/haproxy.pid)  
  57. echo “STOP HAPoxy process”  
  58. kill -USR1 $(cat $BASE_DIR/logs/haproxy.pid)  
  59. }  
  60. case $ARGV in  
  61. start)  
  62. start  
  63. ERROR=$?  
  64. ;;  
  65. stop)  
  66. stop  
  67. ERROR=$?  
  68. ;;  
  69. restart)  
  70. stop  
  71. start  
  72. ERROR=$?  
  73. ;;  
  74. *)  
  75. echo “hactl.sh [start|restart|stop]”  
  76. esac  
  77. exit $ERROR  
  78. # 赋予脚本可执行权限  
  79. [root@client100 haproxy]# chmod +x /etc/init.d/haproxy  

(3).在192.168.1.100上安装配置keepalived

  1. # keepalived需要openssl依赖包  
  2. [root@client100 ~]# yum -y install openssl* gcc make  
  3. # 建立keepalived安装目录  
  4. [root@client100 ~]# mkdir /usr/local/keepalived  
  5. [root@client100 ~]# tar -xf keepalived-1.2.9.tar.gz   
  6. [root@client100 ~]# cd keepalived-1.2.9  
  7. [root@client100 keepalived-1.2.9]#  ./configure  –prefix=/usr/local/keepalived && make && make install  
  8. # 复制相应文件到指定目录  
  9. [root@client100 keepalived-1.2.9]# cp /usr/local/keepalived/sbin/keepalived  /usr/sbin/  
  10. [root@client100 keepalived-1.2.9]# cp /usr/local/keepalived/etc/sysconfig/keepalived  /etc/sysconfig/  
  11. [root@client100 keepalived-1.2.9]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived  /etc/init.d/  
  12. [root@client100 keepalived-1.2.9]# mkdir /etc/keepalived  
  13. [root@client100 keepalived-1.2.9]# cd /etc/keepalived/  
  14. # 编辑配置文件  
  15. [root@client100 keepalived]# vim keepalived.conf  
  16. global_defs {  
  17.     notification_email {  
  18.     cloud_data@163.com            # e-mail地址  
  19.     }  
  20.     notification_email_from cloud_data@163.com  
  21.     smtp_server smtp.163.com   # 邮件服务器地址  
  22.     smtp_connect_timeout 30     # 连接超时时间  
  23.     router_id LVS_Master  
  24. }  
  25. vrrp_script chk_http_port {  
  26.     script  “/etc/keepalived/check_haproxy.sh”    # haproxy运行检测脚本[haproxy宕掉重启haproxy服务]  
  27.     interval        5                     # 脚本执行间隔  
  28.     weight         -5                    # 执行脚本后优先级变更:5表示优先级+5;-5则表示优先级-5  
  29. }  
  30. vrrp_instance VI_A {  
  31.     state MASTER                    # 主上此值为MASTER,从上为BACKUP  
  32.     interface eth0  
  33.     virtual_router_id 50            # 此值主从必须一致  
  34.     priority 100  
  35.     advert_int 1  
  36.     authentication {                  # authentication两个参数值,主从也必须一致  
  37.         auth_type PASS  
  38.         auth_pass kongzhong  
  39.     }  
  40. track_script {  
  41.     chk_http_port  
  42.     }  
  43.     virtual_ipaddress {  
  44.         192.168.1.220                # haproxy提供的虚拟IP地址  
  45.     }  
  46. }  
  47. #启动keepalived服务  
  48. [root@client100 keepalived]# /etc/init.d/keepalived start  
  49. # 编辑check_haproxy.sh脚本  
  50. [root@client100 keepalived]# vim /etc/keepalived/check_haproxy.sh  
  51. # 此脚本用来检测haproxy是否正常,不正常启动  
  52. #!/bin/bash  
  53. A=`ps -C haproxy –no-header |wc -l`  
  54. if [ $A -eq 0 ];then  
  55. /etc/init.d/haproxy restart  
  56. echo “Start haproxy” &> /dev/null  
  57. sleep 3  
  58. if [ `ps -C haproxy –no-header |wc -l` -eq 0 ];then  
  59. /etc/init.d/keepalived stop  
  60. echo “Stop keepalived” &> /dev/null  
  61. fi  
  62. fi  
  63. # 赋予脚本可执行权限  
  64. [root@client100 keepalived]#chmod +x /etc/keepalived/check_haproxy.sh  

(4).在192.168.1.101上安装配置keepalived

  1. # keepalived需要openssl依赖包  
  2. [root@client101 ~]# yum -y install openssl* gcc make  
  3. # 建立keepalived安装目录  
  4. [root@client101 ~]# mkdir /usr/local/keepalived  
  5. [root@client101 ~]# cd keepalived-1.2.9  
  6. [root@client101 keepalived-1.2.9]# ./configure  –prefix=/usr/local/keepalived && make && make install  
  7. # 复制相应文件到指定目录  
  8. [root@client101 keepalived-1.2.9]# cp /usr/local/keepalived/sbin/keepalived  /usr/sbin/  
  9. [root@client101 keepalived-1.2.9]# cp /usr/local/keepalived/etc/sysconfig/keepalived  /etc/sysconfig/  
  10. [root@client101 keepalived-1.2.9]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived  /etc/init.d/  
  11. [root@client101 keepalived-1.2.9]# mkdir /etc/keepalived  
  12. [root@client101 keepalived-1.2.9]# cd /etc/keepalived/  
  13. # 编辑配置文件  
  14. [root@client101 keepalived]# vim keepalived.conf  
  15. global_defs {  
  16.     notification_email {  
  17.     cloud_data@163.com   
  18.     }  
  19.     notification_email_from cloud_data@163.com  
  20.     smtp_server smtp.163.com  
  21.     smtp_connect_timeout 30  
  22.     router_id LVS_Master  
  23. }  
  24. vrrp_script chk_http_port {  
  25.     script  “/etc/keepalived/check_haproxy.sh”  
  26.     interval        5  
  27.     weight         -5  
  28. }  
  29. vrrp_instance VI_A {  
  30.     state BACKUP  
  31.     interface eth0  
  32.     virtual_router_id 50  
  33.     priority 80  
  34.     advert_int 1  
  35.     authentication {  
  36.         auth_type PASS  
  37.         auth_pass kongzhong  
  38.     }  
  39. track_script {  
  40.     chk_http_port  
  41.     }  
  42.     virtual_ipaddress {  
  43.         192.168.1.220  
  44.     }  
  45. }  
  46. #启动keepalived服务  
  47. [root@client101 keepalived]# /etc/init.d/keepalived start  
  48. # 编辑check_haproxy.sh脚本  
  49. [root@client101 keepalived]# vim /etc/keepalived/check_haproxy.sh  
  50. # 此脚本用来检测haproxy是否正常,不正常启动  
  51. #!/bin/bash  
  52. A=`ps -C haproxy –no-header |wc -l`  
  53. if [ $A -eq 0 ];then  
  54. /etc/init.d/haproxy restart  
  55. echo “Start haproxy” &> /dev/null  
  56. sleep 3  
  57. if [ `ps -C haproxy –no-header |wc -l` -eq 0 ];then  
  58. /etc/init.d/keepalived stop  
  59. echo “Stop keepalived” &> /dev/null  
  60. fi  
  61. fi  
  62. # 赋予脚本可执行权限  
  63. [root@client101 keepalived]#chmod +x /etc/keepalived/check_haproxy.sh  

(5).192.168.1.102,192.168.1.103两台数据库启动

  1. [root@client102 ~]# /etc/init.d/mysqld start  
  2. [root@client103 ~]# /etc/init.d/mysqld start  
  3. # 两台数据库上分别建立kz数据库,创建允许登陆的用户  
  4. mysql> create database kz;  
  5. mysql> grant all privileges on kz.* to ‘kz’@’192.168.1.%’ identified by ‘kz’;  
  6. mysql> flush privileges  
  7. # 下面为了测试登陆到那台数据库服务器上  
  8. # 我们在192.168.1.102上建立kz102这张表  
  9. mysql> use kz  
  10. mysql> create table kz102(a int);  
  11. # 我们在192.168.1.103上建立kz103这张表  
  12. mysql> use kz  
  13. mysql> create table kz103(a int);  
4.下面就可以测试,这里就不演示详细内容,简要说明一下大概步骤
   (1).haproxy是否正常启动:ps -ef |grep haproxy
   (2).keepalived是否启动正常/IP是否可以正常切换:ip add|grep 192.168.1.220
   (3).使用kz登陆数据库,是否能正常登陆,登陆的是那一台数据库服务器
       mysql -ukz -pkz -h192.168.1.220
       use kz
       show tables
   (4).后端数据库宕掉1台,再次登陆看是否能正常登陆
到此,测试完毕,有问题欢迎反馈,拍砖.

 

使用Xtrabackup来实现mysql数据库的备份和恢复

一.Xtrabackup概述:
      Xtrabackup是由percona提供的mysql数据库备份工具,支持在线热备份.据官方介绍,这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备的工具,同时也支持mariadb.下载Xtrabackup,需要下载相应数据库版本和相应系统的rpm包或源代码,个人认为,rpm包安装完全可以解决问题,就没必要用源码编译安装了.
      Xtrabackup有两个主要的工具:xtrabackup、innobackupex[个人推荐使用此方式]
   注解:
    (1).xtrabackup只能备份InnoDB和XtraDB 两种数据表
    (2).innobackupex则封装了xtrabackup,同时可以备份MyISAM数据表
    Innobackupex完整备份后生成了几个重要的文件:
     xtrabackup_binlog_info:记录当前最新的LOG Position
     xtrabackup_binlog_pos_innodb:innodb log postion
     xtrabackup_checkpoints: 存放备份的起始位置beginlsn和结束位置endlsn,增量备份需要这个lsn[增量备份可以在这里面看from和to两个值的变化]
二.Xtrabackup特点:
    (1)备份过程快速、可靠
    (2)备份过程不会打断正在执行的事务
    (3)能够基于压缩等功能节约磁盘空间和流量
    (4)自动实现备份检验
    (5)还原速度快
三.Xtrabackup的安装:
    percona官方网站:http://www.percona.com/downloads/   请到此网站下载对应数据库版本的源码包或RPM包
   [root@client103 ~]# rpm -ivh percona-xtrabackup-20-2.0.8-587.rhel6.x86_64.rpm
四.innobackupex相关参数说明:
   注:xtrabackup命令只备份数据文件,并不备份数据表结构(.frm),所以使用xtrabackup恢复的时候,你必须有对应表结构文件(.frm),所以,个人推荐采用innobackupex命令[此命令相当于冷备份,复制数据目录的索引,数据,结构文件,但会有短暂的锁表(时间依赖于MyISAM大小)]
参数说明如下:
    –defaults-file:指定my.cnf参数文件的位置[此配置文件里必须指定datadir]
    –apply-log:同xtrabackup的–prepare参数,一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据 文件仍处理不一致状态。–apply-log的作用是通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态。
    –copy-back:做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir
    –remote-host=HOSTNAME: 通过ssh将备份数据存储到进程服务器上
    –stream=[tar]:备份文件输出格式, 该文件可在XtarBackup binary文件中获得. 在使用参数stream=tar备份的时候,你的xtrabackup_logfile可能会临时放在/tmp目录下,如果你备份的时候并发写入较大的话,xtrabackup_logfile可能会很大(5G+),很可能会撑满你的/tmp目录,可以通过参数–tmpdir指定目录来解决这个问题.
    –tmpdir=DIRECTORY:当有指定–remote-host or –stream时, 事务日志临时存储的目录, 默认采用MySQL配置文件中所指定的临时目录tmpdir
    –redo-only –apply-log:强制备份日志时只redo,跳过rollback,这在做增量备份时非常必要
    –use-memory=*:该参数在prepare的时候使用,控制prepare时innodb实例使用的内存
    –databases=LIST:列出需要备份的databases,如果没有指定该参数,所有包含MyISAM和InnoDB表的database都会被备份
    –slave-info:备份从库, 加上–slave-info备份目录下会多生成一个xtrabackup_slave_info 文件, 这里会保存主日志文件以及偏移, 文件内容类似于:CHANGE MASTER TO MASTER_LOG_FILE=”, MASTER_LOG_POS=0
    –socket=SOCKET:指定mysql.sock所在位置,以便备份进程登录mysql.
五.使用innobackupex命令来实现数据库备份:

1.完全备份与恢复:

  1. # 指定备份某一数据库  
  2. [root@client103 ~]# innobackupex –user=root –password=kongzhong –defaults-file=/etc/my.cnf –port=3306 –databases=a /tmp/backup/ >/tmp/backup/innoback.log 2>&1  
  3. # 备份所有的数据库  
  4. [root@client103 backup]# innobackupex –user=root –password=kongzhong –defaults-file=/etc/my.cnf –port=3306  /tmp/backup/ >/tmp/backup/innoback.log 2>&1  
  5. # 注:还原时,需要清空数据目录,所以建议备份的话,执行全库备份  
  6. # 备份完成后,应用日志,是备份的数据保持一致[ /tmp/backup/2014-01-11_14-46-21/:为备份存放的位置]  
  7. [root@client103 ~]# innobackupex –apply-log /tmp/backup/2014-01-11_14-46-21/   
  8. # 利用刚才的备份进行数据库还原  
  9. [root@client103 ~]# innobackupex –copy-back /tmp/backup/2014-01-11_14-46-21/   
  10. ### 备份到远程机器上[这里的ssh的话,需要实现两边的key同步,不需要输入密码,否则无法实现,此方法一般应该不用,待检验] ###  
  11. [root@client103 ~]# innobackupex –user=root –password=kongzhong –defaults-file=/etc/my.cnf –port=3306  –databases=a –stream=tar /tmp/backup/ |ssh root@192.168.1.100 cat “>”/tmp/backup  

2.增量备份与恢复:

  1. # 全备  
  2. [root@client103 ~]# innobackupex –user=root –password=kongzhong –defaults-file=/etc/my.cnf –port=3306  /tmp/backup/ >/tmp/backup/innoback.log 2>&1  
  3. # 基于全备的增量备份  
  4. [root@client103 ~]# innobackupex –user=root –password=kongzhong –defaults-file=/etc/my.cnf –port=3306 –incremental –incremental-basedir=/tmp/backup/全备的文件名/ /tmp/backup/  
  5. # 基于增量备份的增量备份  
  6. [root@client103 ~]# innobackupex –user=root –password=kongzhong –defaults-file=/etc/my.cnf –port=3306 –incremental –incremental-basedir=/tmp/backup/增量备份的文件名/ /tmp/backup/  
  7. # 备份应用日志,保证数据一致  
  8. # 全备应用日志  
  9. [root@client103 ~]# innobackupex  –apply-log /tmp/backup/2014-01-11_15-37-31/  
  10. # 第一次的增量备份应用日志,应用完日志后,将合并到全备上,恢复使用全备恢复  
  11. [root@client103 ~]# innobackupex  –apply-log /tmp/backup/2014-01-11_15-37-31/ –incremental-dir=/tmp/backup/2014-01-11_15-45-06/  
  12. # 将第二次增量备份应用日志并合并到全备上  
  13. [root@client103 ~]# innobackupex  –apply-log /tmp/backup/2014-01-11_15-37-31/ –incremental-dir=/tmp/backup/2014-01-11_15-46-33/  
  14. # 此时两次增量备份其实都合并到全备上了,恢复是只需要使用全备进行恢复就可以了  
  15. # 模拟数据故障[删除数据库的数据目录,执行如下命令还原]  
  16. [root@client103 ~]# innobackupex –copy-back /tmp/backup/2014-01-11_15-37-31/  
  17. # 恢复后的数据默认权限是有问题的,所以需要修改数据目录权限,如下  
  18. [root@client103 ~]# chown -R mysql:mysql /var/lib/mysql/  
  19. # 此时数据恢复完成,重启数据库服务,进行测试就可以了。大家自行测试,有问题留言反馈!  
3.简述备份和恢复的步骤:
(1).备份:
    a.全备
    b.基于全备的多次增量备份
(2).恢复:
    a.全备
    b.基于全备的多次增量备份
    c.全备应用日志,保证数据一致
    d.合并多次增量备份到全备上
    e.利用全备恢复数据
    f.恢复完成后,修改数据目录的权限
    g.重启mysql服务

利用MariaDB Galera Cluster实现mariadb的多主复制

一、MariaDB Galera Cluster概要:
1.简述:
      MariaDB Galera Cluster 是一套在mysql innodb存储引擎上面实现multi-master及数据实时同步的系统架构,业务层面无需做读写分离工作,数据库读写压力都能按照既定的规则分发到各个节点上去。在数据方面完全兼容 MariaDB 和 MySQL。
2.特性:
      (1).同步复制 Synchronous replication
      (2).Active-active multi-master 拓扑逻辑
      (3).可对集群中任一节点进行数据读写
      (4).自动成员控制,故障节点自动从集群中移除
      (5).自动节点加入
      (6).真正并行的复制,基于行级
      (7).直接客户端连接,原生的 MySQL 接口
      (8).每个节点都包含完整的数据副本
      (9).多台数据库中数据同步由 wsrep 接口实现
3.局限性
      (1).目前的复制仅仅支持InnoDB存储引擎,任何写入其他引擎的表,包括mysql.*表将不会复制,但是DDL语句会被复制的,因此创建用户将会被复制,但是insert into mysql.user…将不会被复制的.
      (2).DELETE操作不支持没有主键的表,没有主键的表在不同的节点顺序将不同,如果执行SELECT…LIMIT… 将出现不同的结果集.
      (3).在多主环境下LOCK/UNLOCK TABLES不支持,以及锁函数GET_LOCK(), RELEASE_LOCK()…
      (4).查询日志不能保存在表中。如果开启查询日志,只能保存到文件中。
      (5).允许最大的事务大小由wsrep_max_ws_rows和wsrep_max_ws_size定义。任何大型操作将被拒绝。如大型的LOAD DATA操作。
      (6).由于集群是乐观的并发控制,事务commit可能在该阶段中止。如果有两个事务向在集群中不同的节点向同一行写入并提交,失败的节点将中止。对 于集群级别的中止,集群返回死锁错误代码(Error: 1213 SQLSTATE: 40001 (ER_LOCK_DEADLOCK)).
      (7).XA事务不支持,由于在提交上可能回滚。
      (8).整个集群的写入吞吐量是由最弱的节点限制,如果有一个节点变得缓慢,那么整个集群将是缓慢的。为了稳定的高性能要求,所有的节点应使用统一的硬件。
      (9).集群节点建议最少3个。
      (10).如果DDL语句有问题将破坏集群。
二、MariaDB Galera Cluster搭建演示
1.环境描述

OS: red hat linux 6.0 64bit

MariaDB server1: 192.168.1.137
MariaDB server2: 192.168.1.138
MariaDB server3: 192.168.1.139
Galera SST user: sst
Galera SST password: sstpass123
MySQL root password: kongzhong
2. 配置mariadb的yum源
[root@client137 ~]#  vim /etc/yum.repos.d/mariadb.repo
[root@client138 ~]#  vim /etc/yum.repos.d/mariadb.repo
[root@client139 ~]#  vim /etc/yum.repos.d/mariadb.repo
# yum源的内容如下:
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/5.5/rhel6-amd64
enabled = 1
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
[root@client137 ~]#  yum makecache
[root@client138 ~]#  yum makecache
[root@client139 ~]#  yum makecache
3.安装 MariaDB-Galera-server galera MariaDB-client
[root@client137 ~]# yum -y install MariaDB-Galera-server galera MariaDB-client
[root@client138 ~]# yum -y install MariaDB-Galera-server galera MariaDB-client
[root@client139 ~]# yum -y install MariaDB-Galera-server galera MariaDB-client
4.编辑每台机器的hosts文件,添加如下内容
[root@client137 ~]# vim /etc/hosts
192.168.1.137 client137.kongzhong.com  client137
192.168.1.138 client138.kongzhong.com  client138
192.168.1.139 client139.kongzhong.com  client139
# 启动测试一下
[root@client137 ~]# /etc/init.d/mysql start
Starting MySQL…. SUCCESS!
[root@client137 ~]# chkconfig mysql on
5.设置MariaDB的root密码,并做安全加固
[root@client137 ~]#  /usr/bin/mysql_secure_installation
[root@client137 ~]#  /usr/bin/mysql_secure_installation
# 登陆数据库,授权用于集群同步的用户和密码
[root@client137 ~]# mysql -uroot -pkongzhong

mysql> GRANT USAGE ON *.* to sst@’%’ IDENTIFIED BY ‘sstpass123’;

mysql> GRANT ALL PRIVILEGES on *.* to sst@’%’;

mysql> FLUSH PRIVILEGES;

mysql> quit

# 创建并配置wsrep.cnf文件
[root@client137 ~]# cp /usr/share/mysql/wsrep.cnf  /etc/my.cnf.d/
[root@client137 ~]# vim /etc/my.cnf.d/wsrep.cnf

# 只需要修改如下4行:

wsrep_provider=/usr/lib64/galera/libgalera_smm.so

wsrep_cluster_address=”gcomm://”

wsrep_sst_auth=sst:sstpass123

wsrep_sst_method=rsync

# 注意:

#    “gcomm://” 是特殊的地址,仅仅是Galera cluster初始化启动时候使用。

#    如果集群启动以后,我们关闭了第一个节点,那么再次启动的时候必须先修改,”gcomm://”为其他节点的集群地址,例如wsrep_cluster_address=”gcomm://192.168.1.138:4567″

6.确认本机防火墙上开放了所需TCP 3306和TCP 4567的端口[也可以关闭防火墙]
[root@client137 ~]# iptables -A INPUT -i eth0 -p tcp –dport 3306 -j ACCEPT
[root@client137 ~]# iptables -A INPUT -i eth0 -p tcp –dport 4567 -j ACCEPT
# 启动mariadb,查看3306和4567端口是否被监听
[root@client137 ~]# /etc/init.d/mysql restart
[root@client137 ~]# netstat -tulpn |grep -e 4567 -e 3306
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      32363/mysqld
tcp        0      0 0.0.0.0:4567                0.0.0.0:*                   LISTEN      32363/mysqld
# 这样一个节点就已经配置完成,其他节点的配置先给个思路,如下注释部分:
# ********************* #

构造新节点的操作步骤如下:

1.按照上述1-6的步骤安装MariaDB和Galera library

2.除了第5步wsrep_cluster_address的配置稍有不同:

wsrep_cluster_address=”gcomm://Node-A-IP:4567″  # 这里指向是指上一层的集群地址

3.重起MariaDB

# ********************* #
7.新添加节点的配置如下:
# 构建192.168.1.138节点
[root@client138 ~]# /etc/init.d/mysql start
Starting MySQL…. SUCCESS!
[root@client138 ~]#   /usr/bin/mysql_secure_installation
[root@client138 ~]# mysql -uroot -pkongzhong

mysql> GRANT USAGE ON *.* to sst@’%’ IDENTIFIED BY ‘sstpass123’;

mysql> GRANT ALL PRIVILEGES on *.* to sst@’%’;

mysql> FLUSH PRIVILEGES;

mysql> quit

[root@client138 ~]# cp /usr/share/mysql/wsrep.cnf  /etc/my.cnf.d/
[root@client138 ~]# vim /etc/my.cnf.d/wsrep.cnf

# 只需要修改如下4行:

wsrep_provider=/usr/lib64/galera/libgalera_smm.so

# 这里指定上一个集群节点的IP地址

wsrep_cluster_address=”gcomm://192.168.1.137:4567″

# 指定用于同步的账号和密码

wsrep_sst_auth=sst:sstpass123

wsrep_sst_method=rsync

# 确认本机防火墙上开放了所需TCP 3306和TCP 4567的端口
[root@client138 ~]# iptables -A INPUT -i eth0 -p tcp –dport 3306 -j ACCEPT
[root@client138 ~]# iptables -A INPUT -i eth0 -p tcp –dport 4567 -j ACCEPT
# 启动,监听
[root@client138 ~]# /etc/init.d/mysql restart
[root@client138 ~]# netstat -tulpn |grep -e 4567 -e 3306
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      32363/mysqld
tcp        0      0 0.0.0.0:4567                0.0.0.0:*                   LISTEN      32363/mysqld
# 构建192.168.1.139节点
[root@client139 ~]# /etc/init.d/mysql start
Starting MySQL…. SUCCESS!
[root@client139 ~]#   /usr/bin/mysql_secure_installation
[root@client139 ~]# mysql -uroot -pkongzhong

mysql> GRANT USAGE ON *.* to sst@’%’ IDENTIFIED BY ‘sstpass123’;

mysql> GRANT ALL PRIVILEGES on *.* to sst@’%’;

mysql> FLUSH PRIVILEGES;

mysql> quit

[root@client139 ~]# cp /usr/share/mysql/wsrep.cnf  /etc/my.cnf.d/
[root@client139 ~]# vim /etc/my.cnf.d/wsrep.cnf

# 只需要修改如下4行:

wsrep_provider=/usr/lib64/galera/libgalera_smm.so

# 这里指定上一个集群节点的IP地址

wsrep_cluster_address=”gcomm://192.168.1.138:4567″

# 指定用于同步的账号和密码

wsrep_sst_method=rsync

# 确认本机防火墙上开放了所需TCP 3306和TCP 4567的端口

[root@client139 ~]# iptables -A INPUT -i eth0 -p tcp –dport 3306 -j ACCEPT
[root@client139 ~]# iptables -A INPUT -i eth0 -p tcp –dport 4567 -j ACCEPT
# 启动,并查看监听
[root@client139 ~]# /etc/init.d/mysql restart
[root@client139 ~]# netstat -tulpn |grep -e 4567 -e 3306
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      32363/mysqld
tcp        0      0 0.0.0.0:4567                0.0.0.0:*                   LISTEN      32363/mysqld
8.以上配置完成后,

对于只有2个节点的Galera Cluster和其他集群软件一样,需要面对极端情况下的”脑裂”状态。

为了避免这种问题,Galera引入了”arbitrator(仲裁人)”。

“仲裁人”节点上没有数据,它在集群中的作用就是在集群发生分裂时进行仲裁,集群中可以有多个”仲裁人”节点。

“仲裁人”节点加入集群的方法如下:

[root@client137 ~]# garbd -a gcomm://192.168.1.137:4567 -g my_wsrep_cluster -d

# 注释:参数说明 :
   -d:以daemon模式运行
   -a:集群地址
   -g: 集群名称
9.测试集群是否配置好参数:
登陆数据库:
查看如下几个参数:
# 下面这个参数的显示是初始化数据库显示的情况
MariaDB [(none)]> SHOW VARIABLES LIKE ‘wsrep_cluster_address’;
+———————–+———-+
| Variable_name         | Value    |
+———————–+———-+
| wsrep_cluster_address | gcomm:// |
+———————–+———-+
1 row in set (0.00 sec)
# 如果配置了指向集群地址,上面那个参数值,应该是你指定集群的IP地址
MariaDB [kz]> SHOW VARIABLES LIKE ‘wsrep_cluster_address’;
+———————–+—————————-+
| Variable_name         | Value                      |
+———————–+—————————-+
| wsrep_cluster_address | gcomm://192.168.1.139:4567 |
+———————–+—————————-+
1 row in set (0.00 sec)
# 此参数查看是否开启
MariaDB [kz]> show status like ‘wsrep_ready’;
+—————+——-+
| Variable_name | Value |
+—————+——-+
| wsrep_ready   | ON    |
+—————+——-+
1 row in set (0.00 sec)
# 这个查看wsrep的相关参数
MariaDB [terry]> show status like ‘wsrep%’;
+—————————-+————————————–+
| Variable_name              | Value                                |
+—————————-+————————————–+
| wsrep_local_state_uuid     | bb5b9e17-66c8-11e3-86ba-96854521d205 | uuid 集群唯一标记
| wsrep_protocol_version     | 4                                    |
| wsrep_last_committed       | 16                                   | sql 提交记录
| wsrep_replicated               | 4                                     | 随着复制发出的次数
| wsrep_replicated_bytes      | 692                                  | 数据复制发出的字节数
| wsrep_received                 | 18                                    | 数据复制接收次数
| wsrep_received_bytes        | 3070                                 | 数据复制接收的字节数
| wsrep_local_commits         | 4                                      | 本地执行的 sql
| wsrep_local_cert_failures    | 0                                      | 本地失败事务
| wsrep_local_bf_aborts        | 0                                      |从执行事务过程被本地中断
| wsrep_local_replays           | 0                                      |
| wsrep_local_send_queue     | 0                                     | 本地发出的队列
| wsrep_local_send_queue_avg | 0.142857                       | 队列平均时间间隔
| wsrep_local_recv_queue     | 0                                      | 本地接收队列
| wsrep_local_recv_queue_avg | 0.000000                        | 本地接收时间间隔
| wsrep_flow_control_paused  | 0.000000                         |
| wsrep_flow_control_sent    | 0                                      |
| wsrep_flow_control_recv    | 0                                    |
| wsrep_cert_deps_distance   | 0.000000                          | 并发数量
| wsrep_apply_oooe           | 0.000000                             |
| wsrep_apply_oool           | 0.000000                             |
| wsrep_apply_window         | 1.000000                             |
| wsrep_commit_oooe          | 0.000000                             |
| wsrep_commit_oool          | 0.000000                             |
| wsrep_commit_window        | 1.000000                             |
| wsrep_local_state          | 4                                    |
| wsrep_local_state_comment  | Synced                               |
| wsrep_cert_index_size      | 0                                    |
| wsrep_causal_reads         | 0                                    |
| wsrep_incoming_addresses   | 192.168.1.137:3306    | 连接中的数据库
| wsrep_cluster_conf_id      | 18                                   |
| wsrep_cluster_size         | 2                                    | 集群成员个数
| wsrep_cluster_state_uuid   | bb5b9e17-66c8-11e3-86ba-96854521d205 | 集群 ID
| wsrep_cluster_status       | Primary                              | 主服务器
| wsrep_connected            | ON                                   | 当前是否连接中
| wsrep_local_index          | 1                                    |
| wsrep_provider_name        | Galera                               |
| wsrep_provider_vendor      | Codership Oy <info@codership.com>    |
| wsrep_provider_version     | 2.7(rXXXX)                           |
| wsrep_ready                | ON                                   | 插件是否应用中
+—————————-+————————————–+
40 rows in set (0.05 sec)
#以上详细参数注释:

监控状态参数说明:

(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_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:回滚,检测到的冲突数目
10.测试数据同步,一致等问题,这个测试不演示,概述一下大概思路:
     (1).创建一个数据库,看是否同步
     (2).数据库里分别创建一个innodb和myisam引擎的表,看是否同步
     (3).分别往这两张表里插入数据,看是否同步,除innodb引擎数据可以同步,其余引擎是不同步
     (4).在任意一节点插入,删除数据,看是否同步
11.在上面galera集群搭建完成后,我们可以借助于haproxy和lvs来实现mysql数据库集群之间的负载
这里就不演示,可以自己配置试试!

关于mysql升级为mariadb

随着mysql的逐渐闭源,mysql的迁移势在必行,google、维基等公司都大力推行mariadb

下面做一个简单的mysql升级,将mysql 5.1升级到mariadb 5.5

1.配置mariadb的yum源

  1. [root@stu91 ~]# vim /etc/yum.repos.d/mariadb.repo  
  2. # yum源的内容如下:  
  3. [mariadb]  
  4. name = MariaDB  
  5. baseurl = http://yum.mariadb.org/5.5/rhel6-amd64  
  6. enabled = 1  
  7. gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB  
  8. gpgcheck=1  

2.停止mysql 服务

  1. [root@stu91 ~]# /etc/init.d/mysqld stop  

3.卸载mysql(这个之前最好备份数据库)

  1. [root@stu91 ~]# yum remove mysql mysql-server mysql-libs  

4.安装mariadb5.5【关于maridb的yum源,相信大家都配置好了】

  1. [root@stu91 ~]# yum -y install MariaDB-server MariaDB-client  

5.安装完成后,启动mariadb

  1. [root@stu91 ~]# /etc/init.d/mysql start  

6.登陆mariadb数据库

  1. [root@stu91 ~]# mysql  
  2. Welcome to the MariaDB monitor. Commands end with ; or \g.  
  3. Your MariaDB connection id is 8  
  4. Server version: 5.5.34-MariaDB MariaDB Server  
  5.   
  6. Copyright (c) 2000, 2013, Oracle, Monty Program Ab and others.  
  7. Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.  
  8.   
  9. MariaDB [(none)]> show databases;  

7.升级mariadb【此步必须做,网上有人说此步不需要做,那是因为他们没有遇到问题,这步不做,你的授权会有问题】

  1. [root@stu91 ~]# mysql_upgrade -p  

# 注:

到这里mysql就升级为mariadb了,但是,卸载mysql再升级总觉得不好,于是尝试网上方法不卸载mysql升级,但总是报错,提示有冲突,下面把网上的方法贴上,但是我是没升级上,各位如果有升级上的可以给予指导。

mysql 5.5版本升级为mariadb 5.5,使用下面方法,报同样的错[mariadb 5.1才出来时,我记得是可以直接升级的]

  1. [root@stu91 ~]# yum update –skip-broken  
  2. # MariaDB 相关安装包会被安装,不需要的 MySQL 包将被卸载,并且升级之后不需要对系统进行修补了。  

报错:

error