mysql基于RHCS、Gtid主从复制的高性能、LB、HA集群架构

mysql基于RHCS、Gtid主从复制的高性能、LB、HA集群架构


本文基于2个角度进行

1:mysql主从复制,读写分离部分

2:RHCS实现mysql-proxy、mysql-master、lvs高可用

架构图

可能会用到的yum源

http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

http://elrepo.org/elrepo-release-6-5.el6.elrepo.noarch.rpm

系统环境:

CentOS release 6.4 (Final)  2.6.32-358.el6.x86_64
地址分配

mysql-proxy-fip:10.0.0.100

mysql-master-fip:10.0.0.101

lvs-vip:10.0.0.15

ha1:10.0.0.11

ha2:10.0.0.12

ha3:10.0.0.13

ha4:10.0.0.14

real1:10.0.0.15

real2:10.0.0.16

背景:


   在数据库服务器非常繁忙的情况下,实现mysql读离分离是扩展性能的一个不错的方案,理由为以下几点

1:考虑在mysql双主中,很难保证数据一致性(mysql-mmm可以实现,但有待生产环境的考验),而且并不能提高写性能

2:在从服务器中,使用lvs为从进行负载分摊,在mysql-proxy上将读操作都指向lvs的集群地址上,能大大提高读性能

3:在这中场景中,有3个单点故障,mysql-proxy,mysql主服务器,和从服务器集群的lvs负载均衡器,这里RHCS的高可用方案解决单点故障

        a:使用drbd镜像解决mysql-master的单点故障

        b:使用keepalived解决lvs的单点故障

        c:使用RHCS自带的L实现mysql-proxy故障的自动切换

此套方案中,将mysql-proxy 、mysql-master、lvs分别以ha4节点作为各自的故障转移域,出现服务中断后自动转移到备份主机上。

具体部署

Mysql主从部分

安装mysql-5.6.10-linux-glibc2.5-x86_64.tar.gz


在mysql-5.6版本引进了Gtid的机制,使得其复制功能的配置、监控及管理变得更加易于实现,且更加健壮。

简单说明Gtid的功能,主要实现了以下2个作用

1:从服务器到主服务器复制数据后,应用数据的时候可以启用多线程,加快复制的速度,降低主从之间的延迟。

2:通过全局事务 ID,可以自动识别上次同步的点,可以非常简单的追踪比较复制事务信息,能够实现主服务器down掉后快速恢复,甚至自动讲从服务器提升为主服务器并能保持各从服务器数据一致,可以实现mysql复制自身的ha(此文的ha基于RHCS而不使用Gtid的方式)。

配置DRBD

首先安装drbd,使用elrepo提供的yum扩展包,直接yum安装drbd

rpm -ivh http://elrepo.org/elrepo-release-6-5.el6.elrepo.noarch.rpm

在ha2,ha4上安装drbd工具包和drbd的内核模块

yum install drbd84-utils kmod-drbd84 –y

drbd全局配置


[root@ha4 ~]# grep '[[:space:]]*#.*$' -v  /etc/drbd.d/global_common.conf

global {

        usage-countno;

}

common {

        handlers{

                  pri-on-incon-degr"/usr/lib/drbd/notify-pri-on-incon-degr.sh;/usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ;reboot -f";

                  pri-lost-after-sb"/usr/lib/drbd/notify-pri-lost-after-sb.sh;/usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ;reboot -f";

                  local-io-error"/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh;echo o > /proc/sysrq-trigger ; halt -f";

        }

        startup{

        }

        options{

        }

        disk {

                  on-io-errordetach;

        }

        net {

                  cram-hmac-alg"sha1";

                  shared-secret"lust"

        }

        syncer{

                  rate1000M;

        }

}

drbd资源配置,使用双主模型,由RHCS控制哪个节点挂载


[root@ha4 ~]# cat /etc/drbd.d/mysql.res

resource mysql {

net{

      protocol C;

      allow-two-primaries yes;

   }

startup{

      become-primary-on both;

   }

disk {

      fencing resource-and-stonith;

  }

handlers {

      # Make sure the other node is confirmed

      # dead after this!

      outdate-peer "/sbin/kill-other-node.sh";

 }

 on ha2 {

   device    /dev/drbd0;

   disk      /dev/sda5;

   address   10.0.0.12:7789;

   meta-diskinternal;

 }

 on ha4 {

   device    /dev/drbd0;

   disk      /dev/sda5;

   address   10.0.0.14:7789;

   meta-diskinternal;

 }

}

将配置文件复制一份到ha2,保持相同即可

ha2,ha4上分别依次执行

初始化资源

drbdadm create-md web

启动服务

service drbd start

格式化磁盘

mkfs.ext4 /dev/drbd0

安装好drbd后安装mysql数据库,并初始化mysql的时候将datadir目录指向将要挂载drbd的目录

先挂载drbd设备

mkdir /mysql/data

mount /dev/drbd0 /mysql/data/

配置mysql复制

安装mysql,具体安装过程不再列出,这里列出2个注意点

注意点1:

在ha4测试安装mysql的时候,只能在一个节点上挂载drbd设备,否则会引起文件系统崩溃

注意点2:

一定要将mysql设置为开机不启动,让RHCS来管理mysql的start和stop,这对于配置其它节点的资源也是一样的,这点下面将不再说明

master:[mysqld](ha2和ha4保持一致,需要改动的部分看配置的中注释)


sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

binlog-format=ROW

log-bin=master-bin

log-slave-updates=true

gtid-mode=on

enforce-gtid-consistency=true

master-info-repository=TABLE

relay-log-info-repository=TABLE

sync-master-info=1

slave-parallel-workers=2

binlog-checksum=CRC32

master-verify-checksum=1

slave-sql-verify-checksum=1

binlog-rows-query-log_events=1

server-id=1

report-port=3306

port=3306

datadir=/mysql/data

socket=/tmp/mysql.sock

report-host=ha2

real1:[mysqld]的配置


binlog-format=ROW

log-slave-updates=true

gtid-mode=on

enforce-gtid-consistency=true

master-info-repository=TABLE

relay-log-info-repository=TABLE

sync-master-info=1

slave-parallel-workers=2

binlog-checksum=CRC32

master-verify-checksum=1

slave-sql-verify-checksum=1

binlog-rows-query-log_events=1

server-id=11 #在real2上配置为12

report-port=3306

port=3306

log-bin=mysql-bin.log

datadir=/mysql/data

socket=/tmp/mysql.sock

report-host=slave1 #在real2上配置为slave2

在master上创建复制用户

mysql> GRANT REPLICATION SLAVEON *.* TO "repluser"@"10.0.0.%"
IDENTIFIED BY '123456';

在slave上指定master

mysql>CHANGE MASTER TOMASTER_HOST='10.0.0.101', MASTER_USER='repluser', MASTER_PASSWORD='123456',MASTER_AUTO_POSITION=1;

启动复制进程

mysql>START SLAVE;

查看复制状态

配置mysql-proxy

先安装EPEL源,此源包含mysql-proxy的rpm包

rpm –ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

安装mysql-proxy

yum install mysql-proxy –y

配置mysql-proxy

/etc/init.d/mysql-proxy启动脚本


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

#!/bin/bash

#

#
mysql-proxy This script starts and stopsthe mysql-proxy daemon

#

#
chkconfig: - 78 30

#
processname: mysql-proxy

#
description: mysql-proxy is a proxydaemon for mysql

#
Source function library.

/etc/rc.d/init.d/functions

prog="/usr/bin/mysql-proxy"

#
Source networking configuration.

if [
-f 
/etc/sysconfig/network ]; then

    ./etc/sysconfig/network

fi

#
Check that networking is up.

[
${NETWORKING} = 
"no" ]&& exit 0

#
Set default mysql-proxy configuration.

ADMIN_USER="admin"

ADMIN_PASSWD="admin"

ADMIN_LUA_SCRIPT="/usr/lib64/mysql-proxy/lua/admin.lua"

PROXY_OPTIONS="--daemon"

PROXY_PID=/var/run/mysql-proxy.pid

PROXY_USER="mysql-proxy"

#
Source mysql-proxy configuration.

if [
-f 
/etc/sysconfig/mysql-proxy ]; then

    ./etc/sysconfig/mysql-proxy

fi

RETVAL=0

start()
{

   echo -n
$
"Starting
$prog: "

   daemon
$prog $PROXY_OPTIONS --pid-
file=$PROXY_PID--proxy-address="$PROXY_ADDRESS" --user=$PROXY_USER--admin-username="$ADMIN_USER"--admin-lua-script="$ADMIN_LUA_SCRIPT"--admin-password="$ADMIN_PASSWORD"

   RETVAL=$?

   echo

   if [
$RETVAL -
eq 0
]; 
then

       touch /var/lock/subsys/mysql-proxy

   fi

}

stop()
{

   echo -n
$
"Stopping
$prog: "

   killproc
-p $PROXY_PID -d 3 $prog

   RETVAL=$?

   echo

   if [
$RETVAL -
eq 0
]; 
then

       rm -f /var/lock/subsys/mysql-proxy

       rm -f
$PROXY_PID

   fi

}

#
See how we were called.

case "$1" in

   start)

        start

       ;;

   stop)

       stop

       ;;

   restart)

       stop

       start

       ;;

   condrestart|try-restart)

       if status
-p $PROXY_PIDFILE $prog >&
/dev/nullthen

           stop

           start

       fi

       ;;

   status)

       status
-p $PROXY_PID $prog

       ;;

   *)

       echo "Usage:
$0{start|stop|restart|reload|status|condrestart|try-restart}"

       RETVAL=1

       ;;

esac

exit $RETVAL

配置参数


cat /etc/sysconfig/mysql-proxy

ADMIN_USER="admin"

ADMIN_PASSWORD="admin"

ADMIN_ADDRESS=""

ADMIN_LUA_SCRIPT="/usr/lib64/mysql-proxy/lua/admin.lua"

PROXY_ADDRESS=""

PROXY_USER="mysql-proxy"

PROXY_OPTIONS="--daemon --log-level=info--log-use-syslog --plugins=proxy --plugins=admin--proxy-backend-addresses=10.0.0.101:3306--proxy-read-only-backend-addresses=10.0.0.15:3306--proxy-lua-script=/usr/lib64/mysql-proxy/lua/proxy/balance.lua"

在ha4上也用相同的方式部署mysql-proxy

LVS的安装

LVS对mysql从服务器进行读操作的负载均衡,对于lvs的高可用,由于keepalived比较轻量级,所以直接使用keepalived来实现,这里keepalived只是为了方便通过启动keepalived应用ipvs规则,所以并直接配置一个keepalived主,然后用RHCS实现keepalived的高可用,而不是keepalived自身的vrrp实现高可用

安装keepalived

yum install keepalived –y

配置文件


cat /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

 notification_email {

    root@localhost

  }

 notification_email_from root

  smtp_server127.0.0.1

 smtp_connect_timeout 30

  router_idLVS_DEVEL

}

vrrp_instance VI_1 {

   stateMASTER

   interfaceeth0

  virtual_router_id 51

   priority100

   advert_int1

   authentication{

      auth_type PASS

      auth_pass lust

   }

  virtual_ipaddress {

      10.0.0.15

   }

}

virtual_server 10.0.0.15 443 {

   delay_loop6

   lb_algo wlc

   lb_kind DR

   nat_mask255.255.255.0

  persistence_timeout 50

   protocolTCP

   real_server10.0.0.21 3306 {

       weight1

      TCP_CHECK {

          connect_timeout 3

          nb_get_retry 3

          delay_before_retry 3

            connect_port 3306

       }

   }

   real_server10.0.0.22 3306 {

       weight 1

      TCP_CHECK {

          connect_timeout 3

          nb_get_retry 3

          delay_before_retry 3

          connect_port 3306

       }

   }

}

在每个mysql-slave的real服务器创建tc/init.d/rs,内容如下


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

#!/bin/bash

#

#
Script to start LVS DR real server.

#
description: LVS DR real server

#

/etc/rc.d/init.d/functions

VIP=10.0.0.15

host=`/bin/hostname`

case "$1" in

start)

       #
StartLVS-DR real server on this machine.

       /sbin/ifconfig lo
down

       /sbin/ifconfig lo
up

        echo 1> /proc/sys/net/ipv4/conf/lo/arp_ignore

        echo 2> /proc/sys/net/ipv4/conf/lo/arp_announce

        echo 1> /proc/sys/net/ipv4/conf/all/arp_ignore

        echo 2> /proc/sys/net/ipv4/conf/all/arp_announce

       /sbin/ifconfig lo:0
$VIP broadcast $VIP netmask 255.255.255.255 up

        /sbin/route add
-host $VIP dev lo:0

;;

stop)

        #
StopLVS-DR real server loopback device(s).

       /sbin/ifconfig lo:0
down

        echo 0> /proc/sys/net/ipv4/conf/lo/arp_ignore

        echo 0> /proc/sys/net/ipv4/conf/lo/arp_announce

        echo 0> /proc/sys/net/ipv4/conf/all/arp_ignore

        echo 0> /proc/sys/net/ipv4/conf/all/arp_announce

;;

status)

        #Status
of LVS-DR real server.

       islothere=`/sbin/ifconfig lo:0
grep $VIP`

       isrothere=`netstat -rn
grep "lo:0" grep $VIP`

        if [
!
"$islothere" -o
"isrothere" ];then

            #Either
the route or the lo:0 device

            #not
found.

           echo "LVS-DR
real server Stopped."

        else

           echo "LVS-DR
real server Running."

        fi

;;

*)

            #Invalid
entry.

           echo "$0:
Usage: $0 {start|status|stop}"

           exit 1

;;

esac

提供执行权限

chmod +x /etc/init.d/rs

在2台realserver中启动rs

service rs start

至此所有关于RHCS集群的前期工作都准备完毕,接下来开始配置基于RHCS的高可用

RHCS-cluster


在RedHat最新版本的RHCS集群套件中,采用了corosync为底层信息的传递,但cman的机制依然存在,cman现在是以corosync的插件运行,所以service
cman start也是可以启动的

编辑ha1-ha4的/etc/hosts文件

ha4主机同时作为luci的跳板机,在ha4上安装luci

yum install luci -y

在ha1,ha2,ha3,ha4三台主机上分别执行

yum install ricci –y

为各节点创建密码

echo 123456 | passwd ricci --stdin

在ha4上启动luci

service luci start

在ha1-4节点上启动ricci

service ricci start

打开luci的管理页面创建mysql集群(帐号为系统root帐号)

https://10.0.0.14:8084

将各个节点加入一个新的集群

创建3个故障转移域(注意点:在故障转移域中,prioritized为1的优先级最高,其次优先级数值越高,优先级越高)

添加2个ip资源,分别为10.0.0.100和10.0.0.101,lvs的ip由keepalived进行自我控制,这里提供一个样例

创建挂载资源

创建mysqld资源

创建mysql-proxy资源

创建lvs资源

创建3个service
group


mysql-proxy-ha 包含的资源

ip地址:10.0.0.11

mysql-proxy服务


mysql-m-ha包含的资源

ip地址10.0.0.12

drbd-mount

mysql


mysql-lvs-ha包含的资源

lvs-keepalived

至此配置完成

时间: 2024-08-31 21:16:16

mysql基于RHCS、Gtid主从复制的高性能、LB、HA集群架构的相关文章

Galera Cluster:一种新型的高一致性MySQL集群架构

1. 何谓Galera Cluster 何谓Galera Cluster?就是集成了Galera插件的MySQL集群,是一种新型的,数据不共享的,高度冗余的高可用方案,目前Galera Cluster有两个版本,分别是Percona Xtradb Cluster及MariaDB Cluster,都是基于Galera的,所以这里都统称为Galera Cluster了,因为Galera本身是具有多主特性的,所以Galera Cluster也就是multi-master的集群架构,如图1所示: 图1

高性能的Linux集群监控之道

  监控是集群管理的核心任务.监控数据可用于调度任务.负载平衡.向管理员报告软硬件故障,并广泛地控制系统使用情况.监控信息必须在不影响集群性能的情况下获得.本文将讨论使用/proc文件系统和Java来获得监控数据的方法. Java在Linux集群中的应用 Java技术为集群管理开发者提供了许多解决问题的办法.Java是动态.灵活.可移植的,这些不寻常的特征使得它成为了在异构网络及平台上构造集群管理的理想基础. Java具有广泛的例程库,很容易处理IP协议,如TCP.UDP,并可在multi-ho

高性能linux web集群搭建详细步骤 可达每秒百万请求

本文教程比较详细,可以说是手把手,所以如果你有这个需求而无从下手,请放点耐心阅读 如何生成每秒百万级别的 HTTP 请求? 负载生成工具(Load-Generating Tools) 在进行负责测试时要牢记一件重要的事:你能在 Linux 上建立多少个 socket 连接.这个限制是硬编码在内核里的,最典型的就是临时 W 端口的限制.(在某种程度上)你可以在 /etc/sysctl.conf 里扩展它.但是基本上,一台 Linux 机器只能同时打开大约 64,000 个 socket .因此在负

CentOS7+MySQL/MariaDB+Galera+HAProxy+Keepalived构建高可用数据库集群

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dgd2010.blog.51cto.com/1539422/1603972 方案优势: Galera能够实现MySQL/MariaDB数据库的主主复制和多主复制等模式,这些复制模式都是同步进行的,同步时间非常短 每一个节点都可以同时写入和读取,当某一节点发生故障时,可自动从集群中自动剔除 HAProxy能提供负载均衡和故障判断等功能解决服务器系统存在的单点故障 Keepaliv

《高性能Linux服务器构建实战:系统安全、故障排查、自动化运维与集群架构》——第1章 Linux服务器安全运维 1.1 账户和登录安全

第1章 Linux服务器安全运维 1.1 账户和登录安全 安全是IT行业一个老生常谈的话题了,最近的"棱镜门"事件折射出了很多安全问题,处理好信息安全问题已变得刻不容缓.因此作为一名运维人员,必须了解一些安全运维准则,同时,要保护自己所负责的业务,首先要站在攻击者的角度思考问题,才能修补任何潜在的威胁和漏洞. 账户安全是系统安全的第一道屏障,也是系统安全的核心,保障登录账户的安全,在一定程度上可以提高服务器的安全级别,本节重点介绍Linux系统登录账户的安全设置方法.1.1.1 删除特

基于corosync+pacemaker的nginx高可用集群安装配置

  一.corosync.pacemaker介绍 corosync是用于高可用环境中的提供通讯服务的,它位于高可用集群架构中的底层(Message Layer),扮演着为各节点(node)之间提供心跳信息传递这样的一个角色; pacemaker是一个开源的高可用资源管理器(CRM),位于HA集群架构中资源管理.资源代理(RA)这个层次,它不能提供底层心跳信息传递的功能,它要想与对方节点通信需要借助底层的心跳传递服务,将信息通告给对方.通常它与corosync的结合方式有两种: pacemaker

基于MySQL的数据库集群系统的实现

mysql|数据|数据库 您的WebApp系统是否正在使用一个MySQL的数据库系统?您的客户是不是总是抱怨页面结果反馈的非常慢?您的MySQL系统的负载是不是总是维持在一个非常高的状态下?本文将为您提供一个分担MySQL系统的负载的方法,以及由此派生出来的一个MySQL-HA-Proxy的开发项目.使用本文提供的方法,您将以最小的源代码改动,获得MySQL系统的高效运转. 第一节 数据库集群技术的现状 目前数据库集群系统应用得比较成功,应用范围比较广泛的是:Oracle公司的Oracle9与I

Linux下搭建MySQL集群

一.MySQL集群简介 1.什么是MySQL集群 MySQL集群是一个无共享的(shared-nothing).分布式节点架构的存储方案,其目的是提供容错性和高性能. 数据更新使用读已提交隔离级别(read-committedisolation)来保证所有节点数据的一致性,使用两阶段提交机制(two-phasedcommit)保证所有节点都有相同的数据(如果任何一个写操作失败,则更新失败). 无共享的对等节点使得某台服务器上的更新操作在其他服务器上立即可见.传播更新使用一种复杂的通信机制,这一机

MySQL 集群服务简介

MySQL Cluster.me 开始提供基于 Galera Replication 技术的 MySQL 和 MariaDB 集群服务. 在本文中我们将会讨论 MySQL 和 MariaDB 集群服务的主要特性. MySQL 集群服务 什么是 MySQL 集群 如果你曾经疑惑过如何提升 MySQL 数据库的可靠性和可扩展性,或许你会发现其中一个解决办法就是通过基于Galera Cluster 技术的 MySQL 集群解决方案. 这项技术使得你可以在一个或者多个数据中心的多个服务器上获得经过同步的