• 实践:搭建基于Load Balancer的MySql Cluster


    服务器规划: 整套系统全部在rhel5u1 server 64位版本下,由基于xen的虚拟机搭建,其中集群管理节点*2、SQL节点*2、数据节点*4、Web服务节点*2组成,其中数据节点做成2个组,每组两台的形式:

    1. 虚拟机mysql_mgm-1, 192.168.20.5:集群管理节点,id=1
    2. 虚拟机mysql_mgm-2, 192.168.20.6:集群管理节点,id=2
    3. 虚拟机mysql_sql-1,192.168.20.7:SQL节点,mysql服务器节点,id=3
    4. 虚拟机mysql_sql-2,192.168.20.8:SQL节点,mysql服务器节点,id=4
    5. 虚拟机mysql_ndb-1:192.168.20.9:ndb数据节点,id=5
    6. 虚拟机mysql_ndb-2:192.168.20.10:ndb数据节点,id=6
    7. 虚拟机mysql_ndb-3:192.168.20.11:ndb数据节点,id=7
    8. 虚拟机mysql_ndb-4:192.168.20.12:ndb数据节点,id=8
    9. 虚拟机mysql_lb-1:192.168.20.15:LVS负载均衡节点1
    10. 虚拟机mysql_lb-2:192.168.20.16:LVS负载均衡节点2
    11. 集群的虚拟IP是:192.168.20.17
    12. 负载均衡使用rhel自带的软件做。

    -----------------------------------------------------------------------------------------------------------
    安装过程:
    1. 在所有节点上安装mysql: 我没有下载mysql源代码再编译安装,感觉机器太多编译太麻烦。我去mysql.com上下载社区版本,并且是针对我的rhel 5.1 server 64位版本的mysql软件,下载地址是: http://dev.mysql.com/downloads/m ... hel5-x86-64bit-rpms 下载这下面所有rpm包并安装,其中Shared libraries和Shared compatibility libraries只能二选一安装,装好以后mysql服务、集群相关工具等都有了,很方便。
    2. (1) 在所有管理 Node上建立配置文件/etc/config.ini(注:这个文件只有管理节点上需要,其它节点上是不需要的):

    1. [NDBD DEFAULT]
    2. NoOfReplicas=2
    3. DataMemory=600M
    4. IndexMemory=100M
    5. [NDB_MGMD]
    6. id=1
    7. hostname=192.168.20.5
    8. DataDir=/var/lib/mysql-cluster
    9. [NDB_MGMD]
    10. id=2
    11. hostname=192.168.20.6
    12. DataDir=/var/lib/mysql-cluster
    13. [MYSQLD]
    14. id=3
    15. HostName=192.168.20.7
    16. [MYSQLD]
    17. id=4
    18. HostName=192.168.20.8
    19. [NDBD]
    20. id=5
    21. HostName=192.168.20.9
    22. [NDBD]
    23. id=6
    24. HostName=192.168.20.10
    25. [NDBD]
    26. id=7
    27. HostName=192.168.20.11
    28. [NDBD]
    29. id=8
    30. HostName=192.168.20.12

    -----------------------------------------------------------------------------------------------------------

    (2) 分别开启管理node上的管理程序ndb_mgmd(本地监听1186端口),先启动id=1的节点,再启动id=2的节点,整个集群以id=2的节点为主要管理节点(谁后启动谁就是主要管理节点,关于这一点我还需要论证一下): ndb_mgmd -f  /etc/config.ini 注:本server上不需要启动mysql服务(所以不需要配置/etc/my.cnf文件)。必须在在开启ndb node和sql node上的服务以前开启ndb_mgmd。
    3.(1) 在所有ndb node上原有的/etc/my.cnf文件里增加以下内容:

    1. [mysqld]
    2. ndbcluster
    3. # IP address of the cluster management node
    4. ndb-connectstring=192.168.20.5
    5. ndb-connectstring=192.168.20.6
    6. [mysql_cluster]
    7. # IP address of the cluster management node
    8. ndb-connectstring=192.168.20.5
    9. ndb-connectstring=192.168.20.6

    -----------------------------------------------------------------------------------------------------------

    注:ndb节点上不需要/etc/config.ini文件。
    (2) 在所有ndb node上第一次执行命令: mkdir /var/lib/mysql-cluster cd /var/lib/mysql-cluster ndbd --initial
    注:ndb node上不启动mysql服务。正常情况下使用“ndbd”命令启动ndb node,只有节点发生改变或者其它情况才需要带--initial参数。
    4. (1)在sql node上建立新的my.cnf文件:

    1. [mysqld]
    2. port=3306
    3. ndbcluster
    4. ndb-connectstring=192.168.20.5
    5. ndb-connectstring=192.168.20.6
    6. [ndbd]
    7. connect-string=192.168.20.9
    8. [ndbd]
    9. connect-string=192.168.20.10
    10. [ndbd]
    11. connect-string=192.168.20.11
    12. [ndbd]
    13. connect-string=192.168.20.12
    14. [ndbd_mgm]
    15. connect-string=192.168.20.5
    16. connect-string=192.168.20.6
    17. [ndbd_mgmd]
    18. config-file=/etc/config.ini
    19. [mysql_cluster]
    20. ndb-connectstring=192.168.20.5
    21. ndb-connectstring=192.168.20.6

    -----------------------------------------------------------------------------------------------------------

    注:sql node上只需要启动Mysql服务:/etc/init.d/mysql start,不需要配置/etc/my.cnf文件。
    5. (1) 在所有管理 node上运行集群管理程序: ndb_mgm
    在提示符这里输入命令“show”,命令的输出结果中可以看到四个ndb node全部连到管理节点,两个管理节点上的输出是一样的:

    1. Connected to Management Server at: 192.168.20.5:1186
    2. Cluster Configuration
    3. ---------------------
    4. [ndbd(NDB)]     4 node(s)
    5. id=5    @192.168.20.9  (Version: 5.1.22, Nodegroup: 0, Master)
    6. id=6    @192.168.20.10  (Version: 5.1.22, Nodegroup: 0)
    7. id=7    @192.168.20.11  (Version: 5.1.22, Nodegroup: 1)
    8. id=8    @192.168.20.12  (Version: 5.1.22, Nodegroup: 1)
    9. [ndb_mgmd(MGM)] 2 node(s)
    10. id=1    @192.168.20.5  (Version: 5.1.22)
    11. id=2    @192.168.20.6  (Version: 5.1.22)
    12. [mysqld(API)]   2 node(s)
    13. id=3    @192.168.20.7  (Version: 5.1.22)
    14. id=4    @192.168.20.8  (Version: 5.1.22)

    可以看到,所有节点都已连接到管理节点上。如果出现“not connected, accepting connect from any host)”,表示某个节点还没有连到管理节点上。
    从netstat命令的输出结果也可以看出所有节点都连到管理节点上:

    1. tcp        0      0 192.168.20.5:1186           192.168.20.7:48066          ESTABLISHED
    2. tcp        0      0 192.168.20.5:1186           192.168.20.7:48065          ESTABLISHED
    3. tcp        0      0 192.168.20.5:1186           192.168.20.12:48677         ESTABLISHED
    4. tcp        0      0 192.168.20.5:1186           192.168.20.9:37060          ESTABLISHED
    5. tcp        0      0 192.168.20.5:1186           192.168.20.9:37061          ESTABLISHED
    6. tcp        0      0 192.168.20.5:1186           192.168.20.9:37062          ESTABLISHED
    7. tcp        0      0 192.168.20.5:1186           192.168.20.9:50631          ESTABLISHED
    8. tcp        0      0 192.168.20.5:1186           192.168.20.11:33977         ESTABLISHED
    9. tcp        0      0 192.168.20.5:1186           192.168.20.10:55260         ESTABLISHED

    (2) 在任一ndb node上看连接(以20.9为例),都可以看到本node和其他3个ndb node(10/11/12)、管理node(5/6)、sql node(7/8)都有连接,除了和管理node的连接是到1186端口,其它连接都是随机端口。

    1. tcp        0      0 192.168.20.9:59318          192.168.20.11:49124         ESTABLISHED
    2. tcp        0      0 192.168.20.9:37593          192.168.20.7:33593          ESTABLISHED
    3. tcp        0      0 192.168.20.9:55146          192.168.20.10:46643         ESTABLISHED
    4. tcp        0      0 192.168.20.9:48657          192.168.20.12:46097         ESTABLISHED
    5. tcp        0      0 192.168.20.9:55780          192.168.20.8:41428          ESTABLISHED
    6. tcp        0      0 192.168.20.9:58185          192.168.20.5:1186           ESTABLISHED
    7. tcp        0      0 192.168.20.9:54535          192.168.20.6:1186           ESTABLISHED

    (3) 在任一sql node上看连接(以20.7为例),可以看到两个sql node都连接到管理node 20.6上(管理node中20.5先启动,20.6后启动):

    1. tcp        0      0 192.168.20.7:49726          192.168.20.6:1186           ESTABLISHED
    2. tcp        0      0 192.168.20.7:38498          192.168.20.10:58390         ESTABLISHED
    3. tcp        0      0 192.168.20.7:54636          192.168.20.12:40206         ESTABLISHED
    4. tcp        0      0 192.168.20.7:33593          192.168.20.9:37593          ESTABLISHED
    5. tcp        0      0 192.168.20.7:57676          192.168.20.11:37717         ESTABLISHED

    7. mysql高可用性集群搭建完成,接下来用ipvs搭建负载均衡。
    在所有mysql_sql节点上建立空库: create database loadbalancing;
    设置权限,允许所有mysql_lb节点有select权限(用于心跳测试): grant select on loadbalancing.* to loadbalancing@192.168.20.15 identified by 'abcdefg'; grant select on loadbalancing.* to loadbalancing@192.168.20.16 identified by 'abcdefg';
    8.(1) 在管理节点上加载IPVS模块:

    1. modprobe ip_vs_dh
    2. modprobe ip_vs_ftp
    3. modprobe ip_vs
    4. modprobe ip_vs_lblc
    5. modprobe ip_vs_lblcr
    6. modprobe ip_vs_lc
    7. modprobe ip_vs_nq
    8. modprobe ip_vs_rr
    9. modprobe ip_vs_sed
    10. modprobe ip_vs_sh
    11. modprobe ip_vs_wlc
    12. modprobe ip_vs_wrr

    (2) 在管理节点上配置LVS(20.15和20.16是两个负载均衡的节点,realserver是20.7和20.8,虚拟IP是20.17,端口是 3306)。可以启动/etc/init.d/piranha-gui,然后在http://localhost:3636里设置集群,最终生成配置文件 /etc/sysconfig/ha/lvs.cf,也可以直接生成这个文件/etc/sysconfig/ha/lvs.cf:

    1. serial_no = 37
    2. primary = 192.168.20.15
    3. service = lvs
    4. backup_active = 1
    5. backup = 192.168.20.16
    6. heartbeat = 1
    7. heartbeat_port = 539
    8. keepalive = 6
    9. deadtime = 18
    10. network = direct
    11. debug_level = NONE
    12. monitor_links = 1
    13. virtual MySql {
    14.      active = 1
    15.      address = 192.168.20.17 eth0:1
    16.      vip_nmask = 255.255.255.0
    17.      port = 3306
    18.      expect = "OK"
    19.      use_regex = 0
    20.      send_program = "/usr/local/bin/mysql_running_test %h"
    21.      load_monitor = none
    22.      scheduler = wlc
    23.      protocol = tcp
    24.      timeout = 6
    25.      reentry = 15
    26.      quiesce_server = 0
    27.      server mysql_sql-1 {
    28.          address = 192.168.20.7
    29.          active = 1
    30.          weight = 1
    31.      }
    32.      server mysql_sql-2 {
    33.          address = 192.168.20.8
    34.          active = 1
    35.          weight = 1
    36.      }
    37. }

    必须确保lvs.cf文件在两个负载均衡节点上都有,并且内容完全相同。
    两个负载均衡节点上的探测脚本/usr/local/bin/mysql_running_test:

    1. #!/bin/sh
    2. # We use $1 as the argument in the TEST which will be the various IP's
    3. # of the real servers in the cluster.
    4. # Check for mysql service
    5. TEST=`echo 'select "" as abcdefg' | mysql -uloadbalancing -pabcdefg -h $1 | grep abcdefg`
    6. if [ $TEST != '1' ]; then
    7.         echo "OK"
    8. else
    9.         echo "FAIL"
    10.         # /bin/echo | mail [email]pager@failure.company.com[/email] -s "NOTICE: $1 failed to provide email service"
    11. fi

    注:两个探测节点上需要装mysql client。 原理说明:lvs.cf里指定这个脚本,其实是给负载均衡节点上的nanny程序调用,lvs.cf里的%h参数表示调用这个脚本的时候加上hostname/ip地址的参数。 这个脚本的作用是连接到mysql server上执行select语句回显一个字符串abcdefg,通过判断回显是否正确来确认real server是否运行正常。
    (3) 启动LVS服务: /etc/init.d/pulse start
    其中一个节点上的/var/log/messages里的内容:

    1. Dec 27 14:57:15 mysql_lb-1 pulse[8606]: STARTING PULSE AS MASTER
    2. Dec 27 14:59:29 mysql_lb-1 pulse[8606]: Terminating due to signal 15
    3. Dec 27 14:59:30 mysql_lb-1 pulse: SIOCGIFADDR failed: Cannot assign requested address
    4. Dec 27 14:59:30 mysql_lb-1 pulse[8659]: STARTING PULSE AS MASTER

    另一节点上/var/log/messages里的内容:

    1. Dec 27 14:59:06 mysql_lb-2 pulse[16729]: STARTING PULSE AS BACKUP
    2. Dec 27 14:59:08 mysql_lb-2 pulse[16729]: primary inactive (link failure?): activating lvs
    3. Dec 27 14:59:08 mysql_lb-2 lvs[16731]: starting virtual service MySql active: 3306
    4. Dec 27 14:59:08 mysql_lb-2 nanny[16734]: starting LVS client monitor for 192.168.20.17:3306
    5. Dec 27 14:59:08 mysql_lb-2 lvs[16731]: create_monitor for MySql/mysql_sql-1 running as pid 16734
    6. Dec 27 14:59:08 mysql_lb-2 nanny[16737]: starting LVS client monitor for 192.168.20.17:3306
    7. Dec 27 14:59:08 mysql_lb-2 lvs[16731]: create_monitor for MySql/mysql_sql-2 running as pid 16737
    8. Dec 27 14:59:08 mysql_lb-2 nanny[16737]: making 192.168.20.8:3306 available
    9. Dec 27 14:59:08 mysql_lb-2 nanny[16734]: making 192.168.20.7:3306 available
    10. Dec 27 14:59:13 mysql_lb-2 pulse[16740]: gratuitous lvs arps finished

     

     

    mysql cluster.png

  • 相关阅读:
    wpf之文件浏览上传
    通过UM用例来图示化系统
    C# System.IO.FileStream 文件正由另一进程使用,因此该进程无法访问该文件
    WPF控件内容模型
    Panel Decorator TextBlock内容模型
    winForm 读取pdf文件并,转换成图片
    wpf之TreeView绑定
    角色权限设计解决方案
    .NET客户端js调用服务器端控件的方法
    快速排序算法
  • 原文地址:https://www.cnblogs.com/corsacsherry/p/4589182.html
Copyright © 2020-2023  润新知