使用rpm包安装zabbix监控软件

一.zabbix特点及功能:
1.zabbix的主要特点:
   (1).安装与配置简单
   (2).支持多语言(包括中文)
   (3).免费开源
   (4).自动发现服务器与网络设备
   (5).分布式监视以及WEB集中管理功能
   (6).可以无agent监视
   (7).用户安全认证和柔软的授权方式
   (8).通过WEB界面设置或查看监视结果
   (9).email等通知功能
   (10).可以自定义配置模板
2.zabbix主要功能:
   (1).CPU负荷
   (2).内存使用
   (3).磁盘使用
   (4).网络状况
   (5).端口监视
   (6).日志监视
二.zabbix服务端安装:

1.安装zabbix需要的相关依赖包[主要依赖包如下,以下依赖包为系统镜像提供的]

  1. [root@client126 ~]#  yum -y install httpd php mysql mysql-server php-mysql php-gd php-xml  php-ldap php-pear php-xmlrpc  mysql-connector-odbc mysql-devel libdbi-dbd-mysql net-snmp-devel curl-devel mod_ssl mod_perl mod_auth_mysql net-snmp  

2.依赖包:php-bcmath/php-mbstring/fping/OpenIPMI-libs/iksemel,这几个包需要另行下载安装

  1. [root@client126 ~]# yum -y install php-bcmath-5.3.3-3.el6_2.8.x86_64.rpm php-mbstring-5.3.3-3.el6_2.8.x86_64.rpm fping-3.8-1.el6.rf.x86_64.rpm OpenIPMI-libs-2.0.16-14.el6.x86_64.rpm  iksemel-1.4-2.el6.x86_64.rpm   

3.设置mysql和apache开机启动

  1. [root@client126 ~]# chkconfig mysqld on  
  2. [root@client126 ~]# chkconfig httpd on  
  3. [root@client126 ~]# /etc/init.d/httpd start  
  4. [root@client126 ~]# /etc/init.d/mysqld start  

4.安装zabbix相关软件:zabbix-server/zabbix/zabbix-web/zabbix-mysql

  1. [root@client126 tmp]# yum -y install zabbix-2.2.1-1.el6.x86_64.rpm  zabbix-server-2.2.1-1.el6.x86_64.rpm zabbix-server-mysql-2.2.1-1.el6.x86_64.rpm  zabbix-web-2.2.1-1.el6.noarch.rpm zabbix-web-mysql-2.2.1-1.el6.noarch.rpm  

5.为zabbix准备相应用户、数据

  1. [root@client126 tmp]# mysql -uroot -pkongzhong  
  2. mysql> create database zabbix;  
  3. mysql> grant all privileges on zabbix.* to ‘zabbix’@’localhost’ identified by ‘zabbix’;  
  4. mysql> flush privileges;  
  5. [root@client126 tmp]# cd /usr/share/doc/zabbix-server-mysql-2.2.1/create/  
  6. # 将相应sql脚本导入数据库,导入顺序不要出错  
  7. [root@client126 create]#  mysql  -uzabbix -pzabbix zabbix<schema.sql  
  8. [root@client126 create]#  mysql  -uzabbix -pzabbix zabbix<images.sql   
  9. [root@client126 create]#  mysql  -uzabbix -pzabbix zabbix<data.sql    

6.修改zabbix-server的配置文件

  1. [root@client126 create]# vim /etc/zabbix/zabbix_server.conf  
  2. # 主要修改如下几个参数:  
  3. DBHost=localhost  # 指定zabbix-server的机器  
  4. DBName=zabbix    # 指定zabbix存储数据的数据库   
  5. DBUser=zabbix      # 指定用户  
  6. DBPassword=zabbix  # 指定密码  
  7. # 启动zabbix-server,并设置开机启动  
  8. [root@client126 create]# /etc/init.d/zabbix-server start  
  9. [root@client126 create]# chkconfig zabbix-server on  
  10. # 修改zabbix.conf配置文件,修改相关的php参数  
  11. [root@client126 tmp]# vim /etc/httpd/conf.d/zabbix.conf  
  12. # 具体修改参数如下   
  13.     php_value max_execution_time 300  
  14.     php_value memory_limit 128M  
  15.     php_value post_max_size 16M  
  16.     php_value upload_max_filesize 2M  
  17.     php_value max_input_time 300  
  18.     php_value date.timezone  Asia/Shanghai  
  19. # apache服务重新启动  
  20. [root@client126 tmp]# /etc/init.d/httpd restart  

7.登陆zabbix的web端,进行相关配置:
http://192.168.1.126/zabbix/setup.php
默认用户名为 Admin,密码为 zabbix

zabbix1         下图如果有相关failed,可以根据提示修改相关参数或安装相关软件:

zabbix2        下面指定数据库名称,数据库用户,数据库密码,数据库主机

zabbix3zabbix4 zabbix5 zabbix6        下面可以使用默认用户为admin,密码为zabbix ,登陆zabbix网页端进行监控配置了zabbix7

三.zabbix客户端安装:

1.客户端安装zabbix、zabbix-agent

  1. [root@client100 tmp]# yum -y install zabbix-2.2.1-1.el6.x86_64.rpm zabbix-agent-2.2.1-1.el6.x86_64.rpm   

2.修改配置文件:zabbix-agentd.conf

  1. [root@client100 tmp]# vim /etc/zabbix/zabbix_agentd.conf   
  2. # 具体修改参数如下  
  3. Server=192.168.1.126  
  4. ServerActive= 192.168.1.126  
  5. Hostname=client100.kongzhong.com  
  6. UnsafeUserParameters=1    
  7. 注:  
  8. Server=Zabbix Server             # 端主机名或 IP 地址  
  9. ServerActive= Zabbix Server   # 端主机名或 IP 地址  
  10. Hostname=Agent                   # 端的主机名   
  11. UnsafeUserParameters=1  # 是否限制用户自定义 keys 使用特殊字符  
  12. # 启动并开机启动  
  13. [root@client100 tmp]# /etc/init.d/zabbix-agent start  
  14. [root@client100 tmp]# chkconfig zabbix-agent on  

四.现在可以根据自己的要求来配置监控的相关参数等

mysql监控模板:mysql-performance-monitor:简称MPM

下载地址:http://www.fromdual.com/mysql-performance-monitor

 

存储过程或数据查询中,用到的函数:截断函数:left,right,substring,trunc;连接函数:concat

1.Mysql字符串截取函数:substring,left,right,substring_index
用法说明:
(1).left:从左开始截取字符串
left(str, length)
说明:left(被截取字段,截取长度)
Ex:select left(time,10) from login_log;
注:这里截取时间长度(从左往右截取)为10:结果会是:2014-01-13
(2).right:从右开始截取字符串
right(str, length)
说明:right(被截取字段,截取长度)
Ex:select right(time,8) from login_log;
注:这里截取时间长度(从右往左截取)为8:结果会是:23:22:10
(3).substring:截取字符串
substring(str, pos)
substring(str, pos, length)
说明:substring(被截取字段,从第几位开始截取)
substring(被截取字段,从第几位开始截取,截取长度)
Ex:select substring(time,6) from login_log;
注:结果为:01-13 23:25:10
select substring(time,6,5) from login_log;
注:结果为:01-13
(4).substring_index:按关键字截取字符串
    substring_index(str,delim,count)
说明:substring_index(被截取字段,关键字,关键字出现的次数)
Ex: select substring_index(“blog@123@acv”,”@”,2) from account
注:结果为:blog@123
2.Mysql 日期增加函数:adddate
ADDDATE(时间,INTERVAL 月份或天数)
ADDDATE(时间,天数)
Ex: select adddate(‘2014-01-13’,interval 31 day);
注:结果为:2014-02-13
select adddate(‘2014-01-13’,2);
注:结果为:2014-01-15
select adddate(‘2014-01-13’,-2);
注:结果为:2014-01-11
3.Mysql字符串连接函数:concat
concat(str1,str2,…)
注:返回结果为连接参数产生的字符串.如有任何一个参数为NULL,则返回值为 NULL.
Ex: select concat(‘kong’,’zhong’);
注:结果为:kongzhong
4.Oracle trunc()函数的用法
**************日期********************
(1).select trunc(sysdate) from dual
结果为:2014-1-13  今天的日期为2014-1-13
(2).select trunc(sysdate, ‘mm’)   from   dual
结果为:2014-1-1    返回当月第一天
(3).select trunc(sysdate,’yy’) from dual
结果为:2014-1-1    返回当年第一天
(4).select trunc(sysdate,’dd’) from dual
结果为:2014-1-13      返回当前年月日
(5).select trunc(sysdate,’yyyy’) from dual
结果为:2014-1-1    返回当年第一天
(6).select trunc(sysdate,’d’) from dual
结果为:2014-1-12  返回当前星期的第一天(默认星期日开始算)
(7).select trunc(sysdate, ‘hh’) from dual
结果为:2014-1-13 23:00:00   当前时间为 2014-1-13 23:50:00
(8).select trunc(sysdate, ‘mi’) from dual
结果为:2014-1-13 23:50:00   当前时间为 2014-1-13 23:50:00
注:TRUNC()函数没有秒的精确
***************数字********************
用法:
TRUNC(number,num_digits)
注解:
Number 需要截尾取整的数字
Num_digits 用于指定取整精度的数字,Num_digits 的默认值为 0
TRUNC()函数截取时不进行四舍五入
(1).select trunc(123.458) from dual
结果为:123
(2).select trunc(123.458,0) from dual
结果为:123
(3).select trunc(123.458,1) from dual
结果为:123.4
(4).select trunc(123.458,-1) from dual
结果为:120
(5).select trunc(123.458,-4) from dual
结果为:0
(6).select trunc(123.458,4) from dual
结果为:123.458
(7).select trunc(123) from dual
结果为:123
(8).select trunc(123,1) from dual
结果为:123
(9).select trunc(123,-1) from dual
结果为:120

使用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服务

服装电商该怎样选工厂和下单

如何选择工厂

服装供应链是很复杂的。本身是非标的产品,加上电商的销售特点,导致服装电商构建供应链很难,这里分享一些找工厂的心得体会。

第一,工厂在哪里。最近两三年,长三角和珠三角的工厂正在微型化。服装工厂逐步向安徽丶江西等地迁移。下一步向河南丶湖北丶四川等地扩散。如果你正处在扩散区域内的,那你不怕没有服装工厂。如果你是长三角的,很抱歉,工厂资源将一天比一天少。

第二,哪些工厂是你的菜。供 应链最讲究门当户对。你年销售额才1000万,你找1000人的大工厂做货,纯属不智。因为你的单量,在他的客户里面,是最小的,他根本不会重视你。怎么 才算门当户对?给大家一个公式参考:订单数量/10=工厂人数。也就是说:如果你平均单量是300件,你找30人的小厂是最合适的。10个人或者100个 人,就叫不合适

第三,给工厂做什么。每家服装工厂都有自己的优势品类。而且,现在产业聚集带的趋势很明 显。比如你要做毛衫,最好去桐乡,你要做衬衫,最好去绍兴宁波,你要做羽绒,最好去吴江,你要做床单,最好去南通等等。给工厂优势品类,才能在价格和质量 之间取得平衡。但是这样,对服装电商而言是很大的问题,因为很多服装电商不是工厂圈子里的人,所以你也不认识这么多工厂。建议是招一个以前在工厂圈子里混 的人来做采购。如果想方便,找自己周围的工厂,那就要看他是不是专门作你这个品类的衣服。

第四,工厂好多,选哪一个。3 点经验供参考:1、选择有打版能力的。2、选择前后道齐全的。很多小工厂没有版师和后道,这样的工厂,在交货速度和质量上,都可能存在风险。3、最好实际 看一下工厂的卫生状况。如果卫生环境很好,说明这个工厂是有一定管理能力的,问题也少(问题多的工厂,根本没精力抓卫生这样的“小事”)。

第五,我怎么能信任这个工厂。 注意以下3点:1、工厂历史,能存活5年以上的服装工厂,都不会差到哪里去。2、老工人比例。做电商订单,因为量小,要不停的换款翻单。工厂的稳定程度相 当重要,老工人多,代表这个工厂人员稳定。3、工厂曾经做过哪些客户,如果做过一线品牌,那恭喜你了,质量上面基本没有什么问题了。当然,加入是3年前做 过的一线品牌,其工人流动率又很高的话,你也要当心。也许当初那批工人都走光了。

第六,我怎么知道工厂配合好不好呢?这 个问题最难。依我的经验,工厂老板的意识非常关键。如果他意识到电商订单是工厂未来的主要订单来源,那其配合上就不会太离谱。如果他意识不到,那这个工厂 就很危险了,未来在合作上会有非常多的麻烦。找到合适的工厂后,建议服装电商的负责人和工厂老板进行一次坦诚的沟通,把电商订单的形态告知,如果工厂老板 态度很鲜明,那就差不多了。至于说是否进行战略合作,那是后话,不配合三五个月,谁会脑袋一热就跟你战略合作。

如何下单?

其实找工厂,对服装圈子里的人,并不难。工厂找到之后,下单才是真正的难点。根据我自身的经验,我觉得,下单模式是电商建立服装供应链最核心的环节。没有之一,就是最核心的。

现象一:电商给工厂打样,听到工厂报价。直接反应:怎么你们工厂报价比批发市场还贵。那我还干嘛自己做,直接批发就好了。

解释:批发也是工厂做出来的,因为一次生产的量比较大,所以单价就下来了。即使加上批发档口的利润,也比直接找工厂做小批量订单的价格要低。

解 决方案:浮动价格制。在合同上约定好,随着补单数量,逐步降低单价。比如首单100件,成衣价100元/件。翻单到500件,价格成为80元/件。翻单到 1000件,价格70元/件。翻单到2000件,价格65元/件等等。电商可以根据这个成本比例,核算自己的售价和推广折扣。如果遇到开始价格很低,你要 小心了,这种工厂往往比较坑人。坑法:等你卖火了,开始翻单,他就开始涨价

现象二:双方谈订单,工厂问你们总量多少,电商回答:不确定。工厂开始摇头,心里在打退堂鼓。

解释:工厂最需要的不是利润最高的订单,而是最稳定的订单。如果你只有一单两单,你就算给翻倍的利润,工厂也要考虑机会成本的问题。如果你能长期提供一定量的订单,即使利润微薄,工厂也愿意承接。

解决方案:电商订单平准化=新款+翻单款+常青款提前下单。这一点是目前很多电商做不到位的地方。供应链的建设,其实应该是电商为主导,而不是工厂主导(订单在你手上,工厂怎么主导?)。

为 了打造良好的稳定的供应链,电商自己必须先把订单平准化。也就是每周每月的订单总量是基本差不多的。服装供应链能够接受的订单弹性大概在+/-30%左 右。做到这一点并不难。首先,上新频率几乎是固定的,也就是新款量每月都差不多。其次,翻单总会有,只不过季初和季中的翻单相差比较大,这个差异要靠常青 款提前下单弥补。现在能在淘宝天猫活的比较好的电商,基本上都有自己的基础销量比较好的基本款式(即便是走设计师风格,也有一些基本的款式是一直在销售 的)。有了平准化订单,你跟工厂谈,10家有9家愿意做你的长期供应商。

现象三:电商忽然发现某款爆起来了,然后需要紧急追加。于是一个电话打给工厂:**款我要再加300件,很急很急,一定要帮忙啊。工厂苦笑:单子都排好了,没办法插单进去。

解释:工厂的订单前期准备大概需要3-5天,不同的订单,其生产线人员的排序是不同的。因此,插单的事情,并不是像电商想象的那么容易,一句话就能搞定。

解 决方案:电商自己协调订单,新款押后。遇到紧急订单,如果工厂有难处(肯定有难处,只是工厂愿不愿意告诉你),电商必须自己决定把某几个款押后,一般都是 新款往后排。因为新款的销售是未知的,而这个紧急订单,是能够迅速带来销量的。举例:下周生产的有ABCD四个款式,其中B和D是新款,要新插入一个 300件的E款,就可以把BD拉下来,变成下周生产ACE。至于新款怎么办?如果你只是要拍照的,用样衣即可拍照。如果你是实际要售卖的,可以暂缓3天发 货,这个跟买家解释一下,一般都没有太大问题。况且,新款刚上来,真正购买的并不会太多,影响也不大。

现象四:电商要报活动,但是不知道能否批下来。提前跟工厂打个招呼说要准备2000件的货。等到活动批下来了,一问,工厂根本没有准备。电商急了,只剩下3天了,哪里变出2000件货来。

解释:以后不用有这个指望了,除非你付钱了,否则工厂不会给你准备上活动的货的,工厂通常都是保守主义者(如果太激进的,这家工厂大概早就倒闭了),他们不可能去做冒险的事情,即使你说有80%可能通过,也没用的。

解 决方案:无。我个人是不赞同报活动的。虽然这已经成为电商的常态。从供应链角度来看,做活动的款式,匆匆忙忙的赶货出来,品质都是很糟糕的。为何活动之后 DSR很低,退货率很高?固然有一方面是买家冲动购物的缘故,但活动款的品质差也是很大的因素。我自己做过聚划算的5000件连衣裙,5天赶出来的,那品 质差的都没脸见人,可是电商客户还是一下子都卖掉了。我都不知道售后要花多少精力。关键还在于,这么差的货,要损失多少口碑。

关于这件事情,我有一个想法,未经电商朋友验证,仅供大家参考。电商可以确认要用哪个款做活动,做多少件。即使这个活动报不上,也要做其他活动。总之,就是把活动款式事先计划好,而不是因为某个活动临时准备。这样做的话,供应链就没有问题了。

利用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数据库集群之间的负载
这里就不演示,可以自己配置试试!